CLI 自动化:构建知识管理流水线 本文面向希望用脚本把 ChatCrystal CLI 串成自动化流程的开发者。预计阅读时间10 分钟最终效果掌握用 shell 脚本组合crystal命令实现每日导入、批量摘要、备份、搜索报告等自动化流水线的方法。为什么需要自动化ChatCrystal 的 CLI 工具crystal提供了完整的命令行接口导入对话、生成摘要、语义搜索、配置管理。这些命令单独使用很方便但真正的威力在于把它们串成流水线。几个典型场景每天早上自动导入新对话生成摘要推送关键发现批量为所有未总结的对话生成摘要定期备份数据库和向量索引在 CI/CD 中集成知识库搜索辅助代码审查这篇文章展示如何用 shell 脚本把这些操作串联起来。CLI 命令速查先梳理一下 ChatCrystal CLI 的核心命令# 状态检查crystal status# 服务器状态、数据库统计、队列状态# 导入crystalimport# 扫描并导入所有数据源的新对话crystalimport--sourceclaude-code# 只导入特定数据源# 摘要crystal summarizeid# 为单条对话生成摘要crystal summarize--all# 为所有未摘要的对话生成摘要# 搜索crystal searchquery# 语义搜索crystal searchquery--limit5# 限制返回数量crystal searchquery--json# JSON 格式输出适合脚本处理# 笔记crystal notes list# 列出所有笔记crystal notes list--tagsqlite# 按标签过滤crystal notes getid# 查看笔记详情crystal notes relationsid# 查看笔记关联# 标签crystal tags# 列出所有标签及数量# 配置crystal config get# 查看当前配置crystal configsetllm.provider openai# 更新配置crystal configtest# 测试 LLM 连接# 服务器crystal serve# 启动服务器前台crystal serve-d# 启动服务器后台守护crystal serve stop# 停止守护进程crystal serve status# 检查服务器是否运行所有命令都支持--base-url参数指定服务器地址和--json参数强制 JSON 输出。--json是脚本化的关键——它让输出格式稳定、可解析。流水线一每日自动导入 摘要最基础的自动化每天导入新对话然后为它们生成摘要。#!/bin/bash# daily-import.sh — 每日自动导入和摘要set-euopipefailLOG_FILE$HOME/.chatcrystal/daily-import.logTIMESTAMP$(date%Y-%m-%d %H:%M:%S)echo[$TIMESTAMP] 开始每日导入$LOG_FILE# 确保服务器在运行if!crystal serve status/dev/null21;thenecho[$TIMESTAMP] 启动服务器...$LOG_FILEcrystal serve-dsleep3fi# 导入新对话echo[$TIMESTAMP] 执行导入...$LOG_FILEIMPORT_OUTPUT$(crystalimport--json21||true)IMPORTED$(echo$IMPORT_OUTPUT|jq-r.imported // 0)SKIPPED$(echo$IMPORT_OUTPUT|jq-r.skipped // 0)echo[$TIMESTAMP] 导入完成: 新增$IMPORTED条, 跳过$SKIPPED条$LOG_FILE# 如果有新导入的对话触发摘要if[$IMPORTED-gt0];thenecho[$TIMESTAMP] 触发摘要生成...$LOG_FILEcrystal summarize--all# 等待摘要队列处理完轮询「未摘要数量」降到 0# 说明crystal status 不暴露队列计数crystal summarize不带参数的# --json 输出里的 .total 就是当前未摘要statusimported的对话数。whiletrue;doREMAINING$(crystal summarize--json2/dev/null|jq-r.total // 0)if[$REMAINING-eq0];thenbreakfiecho[$TIMESTAMP] 队列处理中: 剩余$REMAINING条未摘要$LOG_FILEsleep10doneecho[$TIMESTAMP] 摘要生成完成$LOG_FILEfiecho[$TIMESTAMP] 每日导入流程结束$LOG_FILE配合 cron 定时执行# 每天早上 9 点执行09* * * /path/to/daily-import.sh流水线二批量摘要 进度监控当你积累了几百条未摘要的对话crystal summarize --all会把它们全部加入队列。但队列是串行的concurrency1几百条对话可能需要几个小时。这个脚本提供进度监控#!/bin/bash# batch-summarize.sh — 批量摘要 进度显示set-euopipefail# 触发全部摘要echo正在将所有未摘要的对话加入队列...crystal summarize--all# 监控进度轮询「剩余未摘要数量」# crystal status 不返回队列计数这里用 crystal summarize --json 的 .totalecho等待摘要完成...INITIAL$(crystal summarize--json2/dev/null|jq-r.total // 0)whiletrue;doREMAINING$(crystal summarize--json2/dev/null|jq-r.total // 0)if[$REMAINING-eq0];thenecho全部完成共处理$INITIAL条breakfiDONE$((INITIAL-REMAINING))echo进度: 已处理$DONE/$INITIAL| 剩余$REMAININGsleep5done流水线三知识库备份数据库和向量索引是 ChatCrystal 的核心资产。定期备份很重要#!/bin/bash# backup.sh — 备份 ChatCrystal 数据set-euopipefailBACKUP_DIR$HOME/chatcrystal-backupsTIMESTAMP$(date%Y%m%d_%H%M%S)BACKUP_NAMEchatcrystal-backup-$TIMESTAMP# 数据目录根据实际配置调整DATA_DIR${DATA_DIR:-$HOME/.chatcrystal/data}mkdir-p$BACKUP_DIR/$BACKUP_NAME# 停止自动保存确保数据一致性echo正在备份...# 复制数据库文件cp$DATA_DIR/chatcrystal.db$BACKUP_DIR/$BACKUP_NAME/# 复制向量索引if[-d$DATA_DIR/vectra-index];thencp-r$DATA_DIR/vectra-index$BACKUP_DIR/$BACKUP_NAME/fi# 复制配置文件if[-f$DATA_DIR/config.json];thencp$DATA_DIR/config.json$BACKUP_DIR/$BACKUP_NAME/fi# 压缩cd$BACKUP_DIRtar-czf$BACKUP_NAME.tar.gz$BACKUP_NAMErm-rf$BACKUP_NAME# 只保留最近 7 个备份ls-t$BACKUP_DIR/chatcrystal-backup-*.tar.gz|tail-n8|xargs-rrmecho备份完成:$BACKUP_DIR/$BACKUP_NAME.tar.gzls-lh$BACKUP_DIR/$BACKUP_NAME.tar.gz流水线四知识库健康检查定期检查知识库的健康状态发现问题及时处理#!/bin/bash# health-check.sh — 知识库健康检查set-euopipefailecho ChatCrystal 健康检查 echo# 1. 服务器状态echo--- 服务器状态 ---ifcrystal serve status/dev/null21;thenecho服务器: 运行中elseecho服务器: 未运行crystal serve-dsleep3fi# 2. 数据库统计echoecho--- 数据库统计 ---STATUS$(crystal status--json2/dev/null)echo对话数:$(echo$STATUS|jq-r.stats.totalConversations // N/A)echo笔记数:$(echo$STATUS|jq-r.stats.totalNotes // N/A)echo标签数:$(echo$STATUS|jq-r.stats.totalTags // N/A)# 3. 待处理对话未摘要数量echoecho--- 待处理对话 ---# crystal status 不暴露队列计数用 summarize 的 .total 反映待摘要数量PENDING$(crystal summarize--json2/dev/null|jq-r.total // 0)echo未摘要:$PENDINGif[$PENDING-gt100];thenecho提示: 待摘要对话较多建议运行 crystal summarize --allfi# 4. LLM 连接测试echoecho--- LLM 连接测试 ---ifcrystal configtest/dev/null21;thenechoLLM: 连接正常elseechoLLM: 连接失败fi# 5. 磁盘空间echoecho--- 磁盘空间 ---DATA_DIR${DATA_DIR:-$HOME/.chatcrystal/data}DB_SIZE$(du-sh$DATA_DIR/chatcrystal.db2/dev/null|cut-f1||echoN/A)INDEX_SIZE$(du-sh$DATA_DIR/vectra-index2/dev/null|cut-f1||echoN/A)echo数据库:$DB_SIZEecho向量索引:$INDEX_SIZEechoecho 检查完成 流水线五搜索 格式化输出把语义搜索的结果格式化成报告#!/bin/bash# search-report.sh — 搜索知识库并生成报告set-euopipefailQUERY${1:?用法:$0 搜索关键词}LIMIT${2:-10}echo搜索:$QUERY(返回$LIMIT条)echoechoRESULTS$(crystal search$QUERY--limit$LIMIT--json2/dev/null)echo$RESULTS|jq-r.[] | 【\(.score | . * 100 | round / 100)】\(.title // 无标题)\n 项目: \(.project_name // 未知)\n 标签: \((.tags // []) | join(, ))\n使用方式# 搜索 SQLite 相关知识./search-report.shSQLite 性能优化# 搜索并发问题返回 5 条./search-report.sh并发死锁5流水线六标签统计 知识分布分析了解你的知识库中哪些领域的知识最丰富#!/bin/bash# tag-stats.sh — 标签统计和知识分布分析set-euopipefailecho 知识库标签分布 echocrystal tags--json2/dev/null|jq-r sort_by(-.count) | .[:20][] | \(.count)\t\(.name) |whileIFS$\tread-rcount name;do# 简单的柱状图BAR$(printf%*s$count|tr █)printf%-20s %s %d\n$name$BAR$countdoneechoecho 分析完成 实际部署建议1. 用 systemd 或 Windows 任务计划程序管理定时任务。Windows 示例PowerShell# 创建每日定时任务$actionNew-ScheduledTaskAction-Executebash-Argument/path/to/daily-import.sh$triggerNew-ScheduledTaskTrigger-Daily-At9:00AMRegister-ScheduledTask-TaskNameChatCrystal-Import-Action$action-Trigger$trigger2. 错误通知。在脚本末尾加入通知逻辑失败时发送消息if[$?-ne0];then# 发送通知根据你的环境选择方式curl-s-XPOSThttps://your-webhook-url\-d{text: ChatCrystal 每日导入失败请检查日志}fi3. 日志轮转。定期清理日志文件避免磁盘占满# 只保留最近 30 天的日志find~/.chatcrystal/-name*.log-mtime30-deleteCLI 设计哲学ChatCrystal 的 CLI 遵循了几个 Unix 哲学原则每个命令做一件事。import只管导入summarize只管摘要search只管搜索。--json让输出可编程。任何命令加--json就能输出结构化数据供 jq 等工具解析。全局选项统一。--base-url让你可以远程操作另一个 ChatCrystal 实例。静默模式。配合 /dev/null 21可以完全静默执行适合 cron 场景。这些设计让crystal不只是一个交互式工具更是自动化的构建块。项目地址github.com/ZengLiangYi/ChatCrystal如有疑问欢迎在 GitHub Issues 或私信交流很乐意解答。