Chronicle Remote Summarizer
这个技能自动化了跨系统汇总Chronicle会议的工作流程(例如,FreeBSD开发机 → 装有Gemini API的Mac)。
自动激活
这个技能自动激活! (里程碑 #13)
提示如“在远程总结会议”或“从FreeBSD导入会议”会自动触发这个技能!
触发模式: 远程,freebsd,导入会议,远程总结 查看:
docs/HOOKS.md了解完整详情
何时使用这个技能
当:
- 你在没有配置Gemini API的远程系统上有Chronicle会议
- 你想在你的本地机器上总结这些会议(该机器有Gemini API)
- 你需要将摘要传回原始系统
- 你在多个开发环境(FreeBSD,Linux,macOS)中工作
常见场景:FreeBSD开发服务器(无Gemini API)→ 装有Gemini API密钥的macOS笔记本电脑
工作原理
Chronicle提供import-and-summarize --quiet,它:
- 创建临时会议,带有负ID(例如,
-3) - 使用Gemini生成AI摘要
- 自动清理:删除临时会议和文件
- 输出干净的JSON到stdout(使用
--quiet时没有状态消息)
系统间无污染 - 远程会议保留在远程系统上,只有摘要被传输。
推荐工作流程:一键命令
先决条件:
- 本地机器到远程机器的SSH访问权限
- 两个系统上都安装了Chronicle
- 本地机器上配置了Gemini API密钥(
chronicle config ai.gemini_api_key YOUR_KEY) - 可选:Chronicle配置中的远程系统(自动主机名/路径)
步骤1:配置远程系统(一次性设置)
# 配置FreeBSD远程系统
chronicle config remote_systems.freebsd.hostname "chandlerhardy-dev.aws0.pla-net.cc"
chronicle config remote_systems.freebsd.chronicle_path "/home/chandlerhardy/.local/bin/chronicle"
# 验证配置
chronicle config --list | grep freebsd
步骤2:使用技能
当Claude使用这个技能并找到远程系统配置时,它会自动构建命令:
ssh chandlerhardy-dev.aws0.pla-net.cc "/home/chandlerhardy/.local/bin/chronicle export-session 7" | chronicle import-and-summarize --quiet 2>&1 | grep -A 999999 '^{$' | ssh chandlerhardy-dev.aws0.pla-net.cc "/home/chandlerhardy/.local/bin/chronicle import-summary"
如果没有找到配置,Claude会询问主机名,并交互式地构建命令:
命令(手动):
ssh <remote-host> "chronicle export-session <id>" | chronicle import-and-summarize --quiet 2>&1 | grep -A 999999 '^{$' | ssh <remote-host> "chronicle import-summary"
示例:
ssh freebsd "chronicle export-session 7" | chronicle import-and-summarize --quiet 2>&1 | grep -A 999999 '^{$' | ssh freebsd "chronicle import-summary"
注意: grep -A 999999 '^{$' 过滤掉了即使使用--quiet和2>/dev/null也可能泄露的Google库警告。
这是做什么的:
- 远程 → 本地:将会议7导出为JSON
- 本地:导入,使用Gemini总结,自动清理临时会议
- 本地 → 远程:将摘要JSON发送回去
- 远程:用摘要更新会议7
为什么--quiet有效:
- 抑制来自汇总器的所有状态消息
- 只输出到stdout的干净JSON(对管道传输至关重要)
- 无需手动从详细输出中提取JSON
2>/dev/null抑制Google库警告(无害)
时间: 大型会议通常需要30-60秒(取决于记录大小)
替代方案:手动3步工作流程
如果SSH管道挂起或你需要检查中间文件:
步骤1:从远程导出会议
ssh <remote-host> "chronicle export-session <id>" > /tmp/session_<id>.json
示例:
ssh freebsd "chronicle export-session 7" > /tmp/session_7.json
步骤2:在本地总结(临时)
cat /tmp/session_<id>.json | chronicle import-and-summarize --quiet 2>/dev/null > /tmp/summary.json
示例:
cat /tmp/session_7.json | chronicicle import-and-summarize --quiet 2>/dev/null > /tmp/summary.json
会发生什么:
- 创建临时会议(负ID,如
-3) - 使用Gemini生成摘要
- 自动清理:删除临时会议和记录文件
- 输出摘要JSON到
/tmp/summary.json
步骤3:将摘要传回远程
cat /tmp/summary.json | ssh <remote-host> "chronicle import-summary"
示例:
cat /tmp/summary.json | ssh freebsd "chronicle import-summary"
结果:
- ✅ 摘要存储在与原始会议链接的远程数据库中
- ✅ 本地系统保持清洁(临时会议自动删除)
- ✅ 系统间无数据污染
实际上发生了什么(幕后)
在import-and-summarize --quiet上:
- 导入:从stdin读取会议JSON
- 创建临时会议:
- 分配负ID(例如,
-1,-2,-3) - 在
~/.ai-session/sessions/session_-3.cleaned中存储记录 - 创建数据库条目,
is_session=True
- 分配负ID(例如,
- 总结:
- 使用Gemini API运行
summarize_session_chunked() - 以块(每块10,000行)处理大型记录
- 使用AI生成的摘要更新会议
- 使用Gemini API运行
- 输出JSON:
{ "version": "1.0", "original_id": 7, "summary": "AI-generated summary...", "summary_generated": true, "keywords": ["feature", "implementation", "testing"] } - 自动清理:
- 删除记录文件(
session_-3.cleaned) - 删除数据库条目(临时会议)
- 只有摘要JSON保留(管道传输到stdout)
- 删除记录文件(
在import-summary(远程端)上:
- 读取JSON:从stdin读取摘要
- 查找会议:通过
original_id查找会议(例如,7) - 更新:设置
response_summary,summary_generated=True,keywords - 完成:会议7现在有了AI摘要
会议示例
测试过:
- 会议1:16.3分钟,系统测试
- 会议2:66.7分钟,大型会议
- 会议4:23KB JSON导出
所有会议都完美地适用于这个工作流程。
故障排除
SSH管道挂起
症状: 命令无限期挂起
解决方案: 使用手动3步工作流程代替:
# 步骤1:导出到文件
ssh freebsd "chronicle export-session 7" > /tmp/session.json
# 步骤2:在本地处理
cat /tmp/session.json | chronicle import-and-summarize --quiet > /tmp/summary.json
# 步骤3:传回
cat /tmp/summary.json | ssh freebsd "chronicle import-summary"
Gemini API未配置
症状: ImportError: google-generativeai package not installed
解决方案: 在本地机器上配置Gemini API密钥:
chronicle config ai.gemini_api_key YOUR_API_KEY_HERE
获取免费API密钥:https://ai.google.dev/
会议未找到
症状: 会议7未找到
解决方案: 检查远程端会议是否存在:
ssh freebsd "chronicle sessions --limit 20"
摘要已存在
行为: import-and-summarize将覆盖现有摘要
注意: 这是设计如此 - 如有需要,你可以重新总结会议。
提示
- 使用
--quiet标志:对于管道传输至关重要 - 抑制状态消息 - 抑制stderr:添加
2>/dev/null以隐藏Google库警告 - 检查SSH路径:远程Chronicle可能在
~/.local/bin/chronicle - 检查文件:使用3步工作流程保存中间JSON以进行调试
- 大型会议:10K+行记录自动分块(无需操作)
- 网络故障:对于不稳定的连接使用3步工作流程
- 批量处理:你可以编写脚本来处理多个会议
Claude如何使用这个技能
当被调用时,Claude应该:
-
检查远程系统配置:
chronicle config --list | grep remote_systems -
如果配置存在(例如,
remote_systems.freebsd.hostname):- 读取主机名:
chronicle config remote_systems.freebsd.hostname - 读取Chronicle路径:
chronicle config remote_systems.freebsd.chronicle_path - 自动构建命令
- 宣布:“找到FreeBSD配置,使用:
<hostname>”
- 读取主机名:
-
如果没有配置存在:
- 询问用户:“你的远程系统主机名是什么?”
- 询问:“FreeBSD上的Chronicle路径是什么?(默认:Chronicle)”
- 可选建议:“我可以将其保存到配置中以供将来使用”
- 使用用户提供的值构建命令
-
运行命令并监控输出
-
确认成功或处理错误
示例用法
用户: “我在FreeBSD开发机上有会议7需要总结,但FreeBSD没有Gemini API。你能在我的Mac上总结它吗?”
助手(有配置):
- 检查配置:
chronicle config remote_systems.freebsd.hostname - 找到:
chandlerhardy-dev.aws0.pla-net.cc - 宣布:“找到FreeBSD配置,使用chandlerhardy-dev.aws0.pla-net.cc”
- 运行命令:
ssh chandlerhardy-dev.aws0.pla-net.cc "/home/chandlerhardy/.local/bin/chronicle export-session 7" | chronicle import-and-summarize --quiet 2>&1 | grep -A 999999 '^{$' | ssh chandlerhardy-dev.aws0.pla-net.cc "/home/chandlerhardy/.local/bin/chronicle import-summary" - 确认:“会议7已成功总结,摘要已导入回FreeBSD”
助手(无配置):
- 检查配置:
chronicle config --list | grep remote_systems - 未找到FreeBSD配置
- 询问:“你的FreeBSD主机名是什么?”
- 用户提供:
chandlerhardy-dev.aws0.pla-net.cc - 询问:“FreeBSD上的Chronicle路径是什么?(按Enter为默认’Chronicle’)”
- 用户提供:
/home/chandlerhardy/.local/bin/chronicle - 建议:“我可以将其保存到配置中以供将来使用。你想让我这样做吗?”
- 使用提供的值运行命令
- 如果用户同意,下次保存配置
如果一键命令挂起:
- 退回到3步工作流程
- 导出到
/tmp/session_7.json - 在本地处理 →
/tmp/summary.json - 将摘要导入回远程
- 确认成功
高级用法
批量总结多个会议
# 在远程列出未总结的会议
ssh freebsd "chronicle sessions --limit 50" | grep "No summary"
# 对每个会议ID(7, 8, 9):
for id in 7 8 9; do
echo "Summarizing session $id..."
ssh freebsd "chronicle export-session $id" | \
chronicle import-and-summarize --quiet 2>/dev/null | \
ssh freebsd "chronicle import-summary"
done
在导入前检查摘要
# 导出并总结
ssh freebsd "chronicle export-session 7" | \
chronicle import-and-summarize --quiet 2>/dev/null > /tmp/summary.json
# 查看摘要
cat /tmp/summary.json | jq '.summary'
# 如果满意,导入
cat /tmp/summary.json | ssh freebsd "chronicle import-summary"
调试详细输出
如果你需要看到发生了什么,去掉--quiet:
ssh freebsd "chronicle export-session 7" | chronicle import-and-summarize
# 显示:"导入会议...","总结...","清理...",然后是JSON
注意: 没有--quiet,JSON不在第一行,所以它不会干净地管道传输到import-summary。
相关命令
chronicle export-session <id>- 导出会议为JSONchronicle import-session- 导入会议(永久的,获得新ID)chronicle import-and-summarize- 导入 + 总结 + 自动清理(临时的)chronicle import-summary- 使用摘要更新现有会议chronicle session <id>- 查看会议详情和摘要
另见
- REMOTE_SUMMARIZE_WORKFLOW.md - 完整的工作流程文档和示例
- tests/test_import_export.py - 17个测试涵盖所有导入/导出场景
- chronicle-session-documenter - 在总结后将会议记录到Obsidian库