ClawSkills logoClawSkills

phoenixclaw

被动日记技能,通过 cron 扫描日常对话,利用语义理解生成 Markdown 日记。适用于:- 用户请求日记...

介绍

# PhoenixClaw: Zero-Tag Passive Journaling

PhoenixClaw 利用语义智能,自动将日常对话提炼为有意义的反思。

自动识别值得记录的时刻、模式和成长机会。

## 🛠️ 核心工作流

> [!critical] **强制:完整执行工作流** > 必须完整执行此 9 步工作流,无论调用方式为何: > - **Cron 执行**(每晚 10 点) > - **手动调用**(“Show me my journal”、“Generate today's journal” 等) > - **重新生成请求**(“Regenerate my journal”、“Update today's entry”) > > **切勿跳过步骤。** 部分执行会导致: > - 缺少图片(未扫描会话日志) > - 缺少财务数据(未触发 Ledger 插件) > - 日记不完整(未执行插件)

PhoenixClaw 遵循结构化流程以确保一致性和深度:

1. **用户配置:** 检查 `~/.phoenixclaw/config.yaml`。如果缺失,启动 `references/user-config.md` 中定义的入门流程。 2. **上下文检索:** - **扫描记忆文件(新增):** 读取 `memory/YYYY-MM-DD.md` 和 `memory/YYYY-MM-DD-*.md` 文件中手动记录的每日反思。这些文件包含用户通过“记一下”等命令明确要求 AI 记住的个人想法、情绪和上下文。**关键**:不要跳过这些文件——它们包含会话日志可能遗漏的显式用户反思。 - **扫描会话日志:** 调用当天的 `memory_get`,然后**关键:扫描所有原始会话日志并按消息时间戳过滤**。会话文件通常分散在多个文件中。不要按会话文件的 `mtime` 对图片进行分类: ```bash # Read all session logs from both OpenClaw locations, then filter by per-message timestamp # Use timezone-aware epoch range to avoid UTC/local-day mismatches. TARGET_DAY="$(date +%Y-%m-%d)" TARGET_TZ="${TARGET_TZ:-Asia/Shanghai}" read START_EPOCH END_EPOCH < <( python3 - <<'PY' "$TARGET_DAY" "$TARGET_TZ" from datetime import datetime, timedelta from zoneinfo import ZoneInfo import sys

day, tz = sys.argv[1], sys.argv[2] start = datetime.strptime(day, "%Y-%m-%d").replace(tzinfo=ZoneInfo(tz)) end = start + timedelta(days=1) print(int(start.timestamp()), int(end.timestamp())) PY )

for dir in "$HOME/.openclaw/sessions" "$HOME/.agent/sessions"; do [ -d "$dir" ] || continue find "$dir" -name "*.jsonl" -print0 done | xargs -0 jq -cr --argjson start "$START_EPOCH" --argjson end "$END_EPOCH" ' (.timestamp // .created_at // empty) as $ts | ($ts | fromdateiso8601?) as $epoch | select($epoch != null and $epoch >= $start and $epoch < $end) ' ``` 读取**所有匹配的文件**,无论其数字命名为何(例如,file_22、file_23 的名称可能靠前,但仍包含今天的消息)。 - **从会话日志中提取图片**:会话日志包含带有文件路径的 `type: "image"` 条目。你必须: 1. 找到所有图片条目(例如 `"type":"image"`) 2. 仅保留消息 `timestamp` 在目标日期范围内的条目 3. 提取 `file_path` 或 `url` 字段 4. 将文件复制到 `assets/YYYY-MM-DD/` 5. 尽可能重命名为描述性名称 - **为何会话日志是强制性的**:`memory_get` 仅返回**文本**。图片元数据、照片引用和媒体附件**仅在会话日志中可用**。跳过会话日志 = 丢失所有照片。 - **活动信号质量**:不要将心跳/cron 系统噪音视为用户活动。首先提取用户/助手的对话内容和媒体事件,然后对时刻进行分类。 - **过滤心跳消息(关键)**:会话日志包含必须从日记中排除的系统心跳消息。扫描消息时,跳过符合以下条件的任何消息: 1. **用户心跳提示**:包含 "Read HEARTBEAT.md" 且包含 "reply HEARTBEAT_OK" 的消息 2. **助手心跳响应**:仅包含 "HEARTBEAT_OK" 的消息(可选前导/尾随空格) 3. **Cron 系统消息**:角色为 "system" 或 "cron" 且包含作业执行摘要的消息(例如 "Cron job completed"、"A cron job") 用于排除心跳的示例 jq 过滤器: ```jq # Exclude heartbeat messages | select( (.message.content? | type == "array" and (.message.content | map(.text?) | join("") | test("Read HEARTBEAT\.md"; "i") | not)) and (.message.content? | type == "array" and (.message.content | map(.text?) | join("") | test("^\\s*HEARTBEAT_OK\\s*$"; "i") | not)) ) ``` - **边界情况 - 午夜边界**:对于跨越午夜的深夜活动,扩大**时间戳**范围以包括溢出窗口(例如,前一天 23:00-24:00),但仍按 `timestamp` 逐条过滤消息。 - **合并来源**:合并来自记忆文件和会话日志的内容。记忆文件捕获显式用户反思;会话日志捕获对话流程和媒体。结合两者以构建完整的上下文。 - **后备方案**:如果记忆稀疏,则从会话日志重建上下文,然后更新记忆以便未来运行使用丰富的记忆。通过 `memory_search` 融入历史上下文(如果嵌入不可用则跳过)

3. **时刻识别**:识别“值得记录”的内容:关键决策、情绪转变、里程碑或共享媒体。有关照片处理,请参阅 `references/media-handling.md`。此步骤生成插件所依赖的 `moments` 数据结构。 **图片处理(关键)**: - 对于每张提取的图片,通过视觉分析生成描述性 alt-text - 对图片进行分类(食物、自拍、截图、文档等) **过滤财务截图(新增)**: 支付截图(微信支付、支付宝等)不应包含在日记叙述中。这些是工具图片,不是生活时刻。 检测标准(检查任一项): 1. **OCR 关键词**:“支付成功”、“支付完成”、“微信支付”、“支付宝”、“订单号”、“交易单号”、“¥” + 金额 2. **上下文线索**:发送图片时,附近文本包含“记账”、“支付”、“付款”、“转账” 3. **视觉模式**:标准支付应用 UI 布局(绿色微信、蓝色支付宝) 处理规则: - 标记为 `finance_screenshot` 类型 - 路由到 Ledger 插件(如果启用)以进行交易记录 - **从日记主要叙述中排除**,除非被明确描述为生活时刻的一部分(例如“今天请朋友吃饭”并附有支付截图) - 切勿在每日日记图片部分包含原始支付截图 - 将图片与时刻匹配(例如,早餐照片 → 早餐时刻) - 将图片元数据与时刻一起存储,以便嵌入日记 4. **模式识别**:检测反复出现的主题、情绪波动和能量水平。使用 `references/skill-recommendations.md` 将这些映射到成长机会。

5. **插件执行**:在其声明的挂钩点执行所有已注册的插件。有关完整的插件生命周期,请参阅 `references/plugin-protocol.md`: - `pre-analysis` → 会话分析之前 - `post-moment-analysis` → **Ledger 和其他主要插件在此执行** - `post-pattern-analysis` → 检测到模式之后 - `journal-generation` → 插件注入自定义部分 - `post-journal` → 日记完成之后

6. **日记生成**:使用 `assets/daily-template.md` 将当天的事件综合成一篇精美的 Markdown 文件。遵循 `references/visual-design.md` 中的视觉指南。**在其声明的 `section_order` 位置包含所有插件生成的部分**。 - **仅嵌入精选图片**,而非每张图片。优先考虑高光和时刻。 - **将财务截图路由到 Ledger** 部分(收据、发票、交易证明)。 - 使用来自 `references/media-handling.md` 的 Obsidian 格式,并配上描述性标题。 - **从文件系统事实生成图片链接**:计算相对于当前日记文件目录的图片路径。切勿输出绝对路径。 - **不要硬编码路径深度**(`../` 或 `../../`):根据 `daily_file_path` 和 `image_path` 动态计算。 - **使用复制的文件名作为事实来源**:如果素材文件是 `image_124917_2.jpg`,则链接必须引用该确切文件名。

7. **时间线集成**:如果发生了重大事件,使用 `assets/timeline-template.md` 和 `references/obsidian-format.md` 中的格式将其附加到 `timeline.md` 的主索引中。

8. **成长映射**:如果检测到新的行为模式或技能兴趣,更新 `growth-map.md`(基于 `assets/growth-map-template.md`)。

9. **用户画像演变**:更新长期用户画像(`profile.md`)以反映对价值观、目标和性格特征的最新观察。请参阅 `references/profile-evolution.md` 和 `assets/profile-template.md`。

## ⏰ Cron 与被动操作

PhoenixClaw 旨在无需用户干预即可运行。它利用 OpenClaw 内置的 cron 系统在当地时间每天晚上 10:00 触发分析(0 22 * * *)。 - 设置细节可在 `references/cron-setup.md` 中找到。 - **模式:** 主要是被动模式。AI 会在未被询问的情况下主动总结当天的活动。

### 滚动日记窗口(新增)

为了解决 22:00-24:00 内容丢失的问题,PhoenixClaw 现在支持**滚动日记窗口**机制:

**问题**:固定的 24 小时窗口(00:00-22:00)在 22:00 生成日记时会遗漏 22:00-24:00 之间的内容。

**解决方案**:`scripts/rolling-journal.js` 从**上次日记时间 → 现在**进行扫描,而不是固定的每日边界。

**功能**: - 可配置的调度时间(默认:22:00,可通过 `~/.phoenixclaw/config.yaml` 自定义) - 滚动窗口:即使生成时间变化也不会丢失内容 - 与现有的 `late-night-supplement.js` 向后兼容

**配置**(`~/.phoenixclaw/config.yaml`): ```yaml schedule: hour: 22 # Journal generation time minute: 0 rolling_window: true # Enable rolling window (recommended) ```

**用法**: ```bash # Default: generate from last journal to now node scripts/rolling-journal.js

# Specific date node scripts/rolling-journal.js 2026-02-12 ```

## 💬 显式触发

虽然设计为被动运行,但用户可以直接使用以下短语与 PhoenixClaw 交互: - *“Show me my journal for today/yesterday.”*(“显示我今天/昨天的日记。”) - *“What did I accomplish today?”*(“我今天完成了什么?”) - *“Analyze my mood patterns over the last week.”*(“分析我上周的情绪模式。”) - *“Generate my weekly/monthly summary.”*(“生成我的周报/月报。”) - *“How am I doing on my personal goals?”*(“我的个人目标进展如何?”) - *“Regenerate my journal.”* / *“重新生成日记”*

> [!warning] **手动调用 = 完整流程** > 当用户请求生成/重新生成日记时,你必须执行上述**完整的 9 步核心工作流**。这确保: > - **包含照片**(通过会话日志扫描) > - **运行 Ledger 插件**(通过 `post-moment-analysis` 挂钩) > - **所有插件执行**(在各自的挂钩点) > > **避免常见错误:** > - ❌ 仅调用 `memory_get`(遗漏照片) > - ❌ 跳过时刻识别(插件永远不会触发) > - ❌ 生成日记时不包含插件部分

## 📚 文档参考 ### 参考资料 (`references/`) - `user-config.md`:初始引导和持久化设置。 - `cron-setup.md`:针对夜间自动化任务的技术配置。 - `plugin-protocol.md`:插件架构、钩子点和集成协议。 - `media-handling.md`:从照片和富媒体中提取信息的策略。 - `session-day-audit.js`:用于验证会话日志中目标日期消息覆盖范围的诊断工具。 - `visual-design.md`:针对可读性和美学的布局原则。 - `obsidian-format.md`:确保与 Obsidian 及其他 PKM 工具的兼容性。 - `profile-evolution.md`:系统如何维护长期用户身份。 - `skill-recommendations.md`:基于日记洞察推荐新技能的逻辑。

### 资源 (`assets/`) - `daily-template.md`:日记条目的模板。 - `weekly-template.md`:高层级每周摘要的模板。 - `profile-template.md`:`profile.md` 持久化身份文件的结构。 - `timeline-template.md`:`timeline.md` 按时间顺序索引的结构。 - `growth-map-template.md`:`growth-map.md` 主题索引的结构。

---

更多产品