ワンクリックで
weekly-reflection
周日回顾——帮用户看见这周的全貌。周日 20:00 Heartbeat 触发,读本周 diary/ + memory/ check-in 数据,发现重复主题和成长信号。无发现不发。
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
メニュー
周日回顾——帮用户看见这周的全貌。周日 20:00 Heartbeat 触发,读本周 diary/ + memory/ check-in 数据,发现重复主题和成长信号。无发现不发。
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
SOC 職業分類に基づく
一般心理支持中的贯穿式微技能。作为全局常驻层使用,用 OARS、反映、总结、开放式提问维持低控制、可继续的合作感。
即时身体稳定化。适合恐慌、高唤醒、脑子空白、心慌、发抖、睡不着、濒临失控等情况。
即时安全风险处理。出现自伤、自杀、他伤、持续暴力、严重失控、急性身体危险、无法自我照料或现实检验受损时必须优先调用。
价值澄清与协作式决策支持。适合“每个选项都难受”“我怕选错”“我知道要选但下不了决心”的状态。
共情倾听与情绪承接。用户明显带着委屈、愤怒、失落、羞耻、害怕、无力进入对话,或明确说“不想听建议”时优先调用。
澄清、拆解与结构化聚焦。适合“脑子很乱”“好多事搅在一起”“讲不清”的情况,把事件、人物、情绪、解释、需求拆开。
| name | weekly-reflection |
| description | 周日回顾——帮用户看见这周的全貌。周日 20:00 Heartbeat 触发,读本周 diary/ + memory/ check-in 数据,发现重复主题和成长信号。无发现不发。 |
每周日晚上,帮用户看一眼这周过得怎么样。用对话方式呈现,不是图表报告。
全部满足才触发:
周回顾偏好: 不喜欢不满足任一条件 → 不触发周回顾。Heartbeat 在周日降级为常规关怀(如满足常规关怀条件)。
与其他触发的互斥:
调用 exec 运行两个脚本:
python3 backend/skills/weekly-reflection/scripts/weekly_review.py diary/ --format json --people-dir people/ --memory-dir memory/
python3 backend/skills/diary/scripts/growth_tracker.py diary/
weekly_review.py 输出本周情绪统计(按簇聚合)、人物频次、触发因素和每日明细。growth_tracker.py 输出成长节点(仅在有 ≥2 周数据时做跨周对比)。
同时由 AI 直接读取本周 memory/ 中的 check-in 数据作为补充。
数据来源:
## check-in 块)重复主题检测规则:
| 重复类型 | 判定条件 |
|---|---|
| 同一情绪 ≥3 次 | 先精确匹配(情绪词完全相同),再语义分组匹配 |
| 同一人物 ≥3 天出现 | 匹配 people/ 目录下已有的 *.md 文件名 |
| 同一触发因素 ≥2 次 | 从 diary 条目的触发字段检测 |
情绪语义分组(同族内视为"同一情绪",定义在 config/emotion_groups.json):
| 情绪族 | 包含词汇 |
|---|---|
| 焦虑族 | 焦虑、紧张、担心、不安、慌 |
| 悲伤族 | 难过、伤心、低落、沮丧、失落、委屈 |
| 愤怒族 | 生气、烦、烦躁、愤怒、恼火、不爽 |
| 开心族 | 开心、高兴、还不错、愉快、满足 |
| 疲惫族 | 累、疲惫、有点累、倦、心累 |
| 平静族 | 平静、一般、还行、中性、无感 |
语义分组后同一族内情绪词总计 ≥3 次,纳入重复主题。weekly_review.py 启动时从 skills/weekly-reflection/config/emotion_groups.json 加载分组表。
成长信号检测(轻量级,仅比较相邻两周):
| 信号类型 | 检测规则 |
|---|---|
| emotion_shift | 上周某情绪族 ≥3 次,本周同族 ≤1 次(或反之) |
| topic_fade | 上周某人物/话题 ≥3 次,本周 0 次 |
| new_positive | 本周 ≥2 次新的正面情绪词(上月未出现过) |
| consistency | 连续 ≥5 天有 diary 或 check-in 记录 |
成长信号数据依赖上周的缓存(memory/weekly_cache/YYYY-WNN.json),首次执行时无缓存则不检测 emotion_shift 和 topic_fade。
纯对话方式(默认):
这周你记了 5 天:
· 周一 😊 还不错
· 周二 😐 一般
· 周三 😢 跟小凯吵架
· 周五 😊 和朋友吃饭
· 周日 😌 平静
这周小凯出现了 3 次。周三是情绪最低的一天。
Canvas 方式(macOS 桌面端可用时):
调用 exec 生成 Canvas HTML:
python3 backend/skills/weekly-reflection/scripts/weekly_review.py diary/ --format html --people-dir people/
生成周情绪地图卡片——7 天色块(暖色=正面,冷色=负面,灰色=无记录),每天标注情绪词和关键事件。
通过 openclaw nodes canvas present 展示。
非 macOS 渠道 → 使用 --format json 获取数据,agent 生成纯文字版本(见 AGENTS.md 交互增强 §Canvas 降级规则)。
根据检测结果选择引导方向:
| 发现 | 可可怎么说 |
|---|---|
| 重复人物 | "{人名}这周出现了{N}次。你觉得是巧合还是有什么你在意的?" |
| 重复情绪 | "{情绪}这周出现了{N}次,你自己有感觉到吗?" |
| 重复触发因素 | "这周有两次都是因为'{触发}'——你觉得这是巧合吗?" |
| 成长信号 | 随口提一句变化,不展开完整的成长叙事(那是 growth-story 的事) |
| 没有特别发现 | "这周还算平稳。有什么你想聊聊的吗?" |
语气:像朋友随口提起,不是周报汇报。把判断权给用户。
{
"tool": "message",
"action": "poll",
"pollQuestion": "要聊聊这周的事吗?",
"pollOption": ["想聊聊", "看看就好", "下周再说"],
"pollMulti": false
}
不支持 Poll 的渠道 → 纯对话询问。
Poll 后分流:
| 用户选择 | 走向 |
|---|---|
| "想聊聊" | 围绕本周高频情绪/人物展开正常对话,可自然进入 AGENTS.md 四步框架 |
| "看看就好" | "好,那就这样。这周辛苦了。" → 收尾 |
| "下周再说" | "好的,下周见。" → 收尾 |
| 用户不回复 | 不追问,等同于"看看就好" |
每次执行后,将本周的 emotion_summary 和 repeated_themes 写入缓存:
周回顾中如果发现成长信号,可可只随口提一句,不做完整的成长叙事展示:
| 成长种子做的 | 成长种子不做的 |
|---|---|
| 随口提一句观察 | 展开完整的成长叙事 |
| 用 1 句话引发觉察 | 用 Canvas 展示纵向对比 |
| 等用户自己回应 | 调用 growth_tracker.py 做系统分析 |
| 用户不接就算了 | 坚持让用户"看到变化" |
每周最多 1 次成长种子,语气像朋友随口一提。
| 场景 | 处理方式 |
|---|---|
| 本周 diary < 3 条 | 不触发周回顾,Heartbeat 改为常规关怀,不说"这周你只写了 2 篇日记" |
| 本周 diary = 0 但 check-in ≥ 3 条 | 不触发完整周回顾(数据太薄),可发轻量总结:"这周你签到了几次,看起来整体还行。有什么想补充的?" |
| growth_tracker.py 执行失败 | 降级为纯 AI 推理:直接读 diary/ + memory/ 做手动总结,纯对话版精简回顾 |
| 用户看到重复主题后情绪变很重 | 周回顾变成情绪事件——无缝切换到 AGENTS.md 四步框架,不说"我们继续看回顾吧" |
| 用户对周回顾反感("别搞这种总结") | "好,不总结了。" → USER.md 标记 周回顾偏好: 不喜欢,后续周日降级为常规关怀 |
当用户连续 3 次拒绝周回顾的"想聊聊" Poll(选择"看看就好"或"下周再说"或不回复),自动降为隔周触发。
执行流程:
weekly_review_refusal_count: 1weekly_review_refusal_count: 2weekly_review_refusal_count: 3weekly_review_downgrade_active: true降频后的行为:
last_weekly_reflection < 14 天前则不触发)复苏条件(回到每周):
weekly_review_refusal_count: 0,weekly_review_downgrade_active: false计数规则: