Skill: vlarkspur/daily-learning-cards (version 2.0.0)

# daily-learning-cards v2.0.0 每日学习卡片自动生成 - 从会话记录中提炼知识，生成结构化学习卡片。 --- ## 📑 快速导航 | 章节 | 内容 | |------|------| | [它到底能干嘛](#它到底能干嘛) | 功能概览：每日卡片 + 每周周报 + 每周测试 | | [适用人群](#适用人群) | 检查你是否适合使用 | | [快速开始](#快速开始) | 3 步上手 | | [配置说明](#配置说明) | config.json 各字段详解 | | [常见问题](#常见问题) | FAQ 和故障排查 | | [更新日志](#更新日志) | 版本历史 | --- --- ## 它到底能干嘛？ 这是一套完整的**学习闭环系统**，不是单一定时任务： | 产出 | 频率 | 内容 | |------|------|------| | 📝 **每日学习卡片** | 每天 | 提取当日对话中的主题、决策、踩坑、新概念、金句 | | 📊 **每周学习周报** | 每周一 | 汇总上周学习概览，Elon 经理点评 + 下周建议 | | 📋 **每周测试题** | 每周一 | AI 基于上周学习卡片出 20 道独立设计的题，内容不足时自动补充 AI 扩展题 | 三项自动串联：每日卡片 → 周报 → 测试 → 错题本，形成"输入 → 沉淀 → 检验"的闭环。 --- ## 适用人群 **正在用 OpenClaw 的人。** 需要满足： - ✅ 有 OpenClaw 运行环境 - ✅ 日常通过飞书、WebUI、钉钉、微信、QQ 等渠道与 AI 对话 - ✅ 想把每天的对话沉淀为结构化知识 > ⚠️ **对话渠道自动识别（5 种）：** session 文件会自动检测消息来源渠道（Feishu / WebUI / DingTalk / WeCom / QQBot），无需手动配置。如需开启或关闭特定渠道的学习卡片生成，在 `config.json` 的 `channels.sources` 中添加或移除渠道名即可。全部渠道代码：`feishu`、`webui`、`dingtalk`、`weixin`、`qqbot`。 不是 OpenClaw 用户？这套 Skill 你用不了——定时任务和消息投递依赖 OpenClaw 基础设施。 --- ## 为什么选它 | 对比项 | daily-learning-cards | 手动记录 | |--------|---------------------|---------| | 自动提取 | ✅ 从会话记录自动抓取 | ❌ 靠记忆回顾 | | 结构化输出 | ✅ 主题/决策/踩坑/概念/金句 | ❌ 碎片化笔记 | | 多渠道支持 | ✅ 飞书/WebUI/钉钉/微信/QQ 自动合并 | ❌ 需要手动整理 | | 每日自动推送 | ✅ 定时投递到消息渠道 | ❌ 需要自己提醒 | | AI 排序 | ✅ 按内容丰富度排序 | ❌ 按时间线堆叠 | | 自动测试 | ✅ 每周出题检验吸收率 | ❌ 无法自动生成 | --- ## 功能特性 - 📚 **智能提取**：自动从多渠道对话记录中提取学习内容 - 🧠 **AI 整合**：基于内容丰富度进行重要性排序，提炼核心知识 - 📝 **结构化输出**：自动生成包含主题、决策、踩坑、新概念、金句的学习卡片 - 📤 **自动投递**：通过 OpenClaw 自动投递到配置好的消息渠道 - ⚙️ **高度可配置**：支持用户自定义提取规则、数量限制、输出格式 --- ## 快速开始 ### 1. 安装 ```bash clawhub install daily-learning-cards ``` ### 2. 回答几个问题 装完第一次对话，我会检测到这是新装的，然后问你几个问题： - 你用哪些对话渠道？（飞书、WebUI、钉钉、微信、QQ） - 每天几点生成学习卡片？周报和测试在哪天什么时间？ - 推送发到哪个渠道？ 你回答完，我帮你：① 写配置 ② 配好定时任务。你什么都不用动。以后想改设置，直接告诉我。 --- ## 第一次运行 — 配置向导（Agent 执行） **执行条件：** 检测到 `~/.daily-learning-cards/config.json` 不存在，或存在但没有 `channels.sources` 字段。 **执行步骤：** ### Step 1: 告知用户 "检测到你刚安装了每日学习卡片技能，需要先做一次配置。我会问你几个问题，你回答完就行。" ### Step 2: 询问配置项 依次问（但一次只问 1-2 个问题，别列清单）： 1. **对话渠道：** "你现在用哪些对话渠道？飞书、WebUI、钉钉、微信、QQ？多选哦" - 写入 `config.json` → `channels.sources` 2. **生成时间：** "每天几点生成学习卡片？比如 10:00？" - 写入 `config.json` → `schedule.hour` / `schedule.minute` 3. **周报/测试：** "周报和测试大概什么时间生成？默认周一 11:00 和 11:30" - 周报：`weekly-summary-cron.sh` 的 cron 时间 - 测试：`weekly-exam.sh` 的 cron 时间 4. **推送渠道：** "学习卡片发到你哪个渠道？飞书？还是微信/钉钉？" - 写入 `config.json` → `channels.delivery` - 如果选飞书，再问飞书群 ID 或私聊 ID → `feishu.target` ### Step 3: 写入配置 写入 `~/.daily-learning-cards/config.json`： ```json { "channels": { "sources": ["feishu", "webui"], "delivery": "feishu" }, "schedule": { "hour": 10, "minute": 0, "timezone": "Asia/Shanghai" }, "feishu": { "target": "用户给的 ID" } } ``` ### Step 4: 配置定时任务 使用 `openclaw cron add` 创建三个定时任务： - 每日学习卡片 → 每天 - 每周周报 → 每周一 - 每周测试 → 每周一（紧接周报后，留 30 分钟间隔） **注意：** 路径用 `\$SKILL_DIR`（OpenClaw 自动注入的环境变量，指向 skill 安装目录），而不是硬编码路径。 ### Step 5: 确认 "配置完成！以后每天 10:00 学习卡片会自动发到你的 XX 渠道。如果想改，直接告诉我就行。" --- ## 架构设计 ``` ┌─────────────────┐ ┌─────────────┐ ┌─────────────┐ │ memory/feishu/ │ │ extract.js │ │ generate- │ │ memory/webui/ │ ──▶ │ (数据提取) │ ──▶ │ card.js │ │ memory/dingtalk/│ │ 5种渠道 │ │ (AI整合) │ │ memory/weixin/ │ │ 自动识别 │ │ │ │ memory/qqbot/ │ │ │ │ │ │ ...可扩展... │ │ │ │ │ └─────────────────┘ └─────────────┘ └──────┬──────┘ │ ▼ ┌─────────────────┐ ┌─────────────┐ ┌─────────────┐ │ OpenClaw cron │ │ stdout │ │ learning- │ │ --announce │ ◀── │ (摘要输出) │ ◀── │ cards/ │ │ │ │ │ │ YYYY-MM-DD.md └─────────────────┘ └─────────────┘ └─────────────┘ ``` **设计原则：** - **数据提取**（脚本）：确定性的结构化提取 - **内容整合**（AI）：理解性的重要性排序和提炼 - **消息投递**（OpenClaw）：平台无关的自动投递 --- ## 配置文件 ### 用户配置 位置：`~/.daily-learning-cards/config.json` ```json { "extract": { "maxTopics": 20, "maxPitfalls": 6, "maxConcepts": 6, "maxInsights": 6, "minInsightLength": 10 }, "summary": { "includeTopics": true, "includeDecisions": true, "includePitfalls": true, "includeConcepts": true, "includeInsights": true, "emojiStyle": "unicode" }, "schedule": { "hour": 10, "minute": 0, "timezone": "Asia/Shanghai" }, "channels": { "sources": ["webui", "feishu"], "delivery": "feishu" }, "feishu": { "target": "oc_xxxxx" }, "language": "zh" } ``` ### 配置项说明 | 配置项 | 类型 | 默认值 | 说明 | |--------|------|--------|------| | `extract.maxTopics` | number | 20 | 最大主题数 | | `extract.maxPitfalls` | number | 6 | 最大踩坑记录数 | | `extract.maxConcepts` | number | 6 | 最大新概念数 | | `extract.maxInsights` | number | 6 | 最大金句数 | | `extract.minInsightLength` | number | 10 | 金句/洞见的最小字符长度 | | `summary.emojiStyle` | string | "unicode" | Emoji 样式：unicode/text | | `schedule.hour` | number | 10 | 定时小时 | | `schedule.minute` | number | 00 | 定时分钟 | | `language` | string | "zh" | 语言：zh/en/bilingual | | `channels.sources` | string[] | ["webui","feishu"] | 收集渠道（从哪些 memory/ 子目录读取，可扩展如 dingtalk/weixin）| | `channels.delivery` | string | "feishu" | 推送渠道（投递到哪个消息渠道）| | `feishu.target` | string | — | 飞书推送目标（群/私聊 ID），仅 `channels.delivery=feishu` 时生效 | --- ## 提取规则 ### 自动提取的字段 **1. 主题（Topics）** - 识别：`## 新主题：{主题名}` 或 `### 时间：{时间}` - 提取：主题名称、来源渠道 **2. 决策（Decisions）** - 识别：`| 选项 | 考虑因素 | 结果 |` 表格 - 提取：选项、考虑因素、结果 **3. 踩坑记录（Pitfalls）** - 识别：`**踩坑记录：**` + `- **问题：** {描述}` - 提取：问题、解决方案、教训 **4. 新概念（Concepts）** - 识别：`**新概念：**` + `- **术语：** {术语}` - 提取：术语、定义、应用场景 **5. 金句/洞见（Insights）** - 识别：`> "{金句}"` 或 `> {金句}` - 提取：金句内容 ### 自动过滤的内容 以下系统噪音会被自动过滤： - "morning" - "两件事都已完成" - "心跳检查" - "启动检查" - "HEARTBEAT_OK" --- ## 输出格式 ### 摘要（stdout） 每日推送到消息渠道的摘要格式： 保存到 `memory/learning-cards/YYYY-MM-DD.md` 的完整格式： ```markdown # 学习卡片 - 2026-04-18 ## 基本信息 - **日期：** 2026-04-18 - **渠道：** 飞书 + WebUI（多渠道合并） - **主题数：** 12 个 - **决策数：** 12 个 - **踩坑数：** 7 个 - **新概念：** 5 个 --- ## 核心主题 ### 1. 落款格式问题 **来源：** 飞书 ### 2. 今日记忆文件检查 **来源：** 飞书 ... --- ## 重要决策 | 选项 | 考虑因素 | 结果 | 来源 | |------|---------|------|------| | 统一超时时间 | 提高系统稳定性 | 采纳 | 飞书 | ... --- ## 踩坑记录 ### 1. follow-builders脚本使用openclaw message send发送命令无法执行 **来源：** 飞书 - **解决方案：** 修改脚本直接调用技能的JS文件 - **教训：** 命令需要在正确的环境中执行 ... --- ## 新概念 ### 1. 定时任务超时控制 **来源：** 飞书 - **定义：** 为定时任务设置最大执行时间限制 - **应用场景：** 防止任务无限期运行 ... --- ## 金句 / 洞见 1. > "超时控制是系统稳定性的关键要素" > —— 飞书 ... --- ## 数据来源 - **飞书：** memory/feishu/2026-04-18.md - **WebUI：** memory/webui/2026-04-18.md - 更多渠道同理（如钉钉 → `memory/dingtalk/`） --- *💃 金银 Planet · 自我提升部* ``` --- ## 故障排除 ### 问题 1：卡片未生成 **症状：** 定时任务运行但无卡片生成 **检查：** ```bash # 1. 检查昨日是否有会话记录 ls -la memory/*/ # 2. 检查日志 tail -20 /tmp/daily-learning-cards.log # 3. 手动运行查看输出 bash daily-learning-cards.sh ``` **解决：** - 确保昨日有对话记录 - 检查 `extract.js` 是否正常输出 JSON --- ### 问题 2：内容提取不完整 **症状：** 踩坑记录/新概念/金句未提取 **检查：** ```bash # 检查记忆文件格式 ls memory/*/2026-04-18.md 2>/dev/null cat memory/feishu/2026-04-18.md 2>/dev/null | grep -A3 "踩坑记录" ``` **解决：** - 确保使用标准格式：`- **问题：** {描述}` - 检查 `extract-rules.md` 中的识别规则 --- ### 问题 3：主题数量不对 **症状：** 提取的主题数与预期不符 **检查：** ```bash # 查看配置 cat ~/.daily-learning-cards/config.json | grep maxTopics # 测试提取 node scripts/extract.js 2026-04-18 | grep -c '"title"' ``` **解决：** - 修改 `~/.daily-learning-cards/config.json` 中的 `maxTopics` - 主题按内容丰富度排序，不是按时间顺序 --- ### 问题 4：定时任务未触发 **症状：** 到时间了没有收到学习卡片 **检查：** ```bash # 查看 cron 任务 openclaw cron list | grep "学习卡片" # 检查任务状态 openclaw cron info <任务ID> ``` **解决：** - 重新创建 cron 任务 - 检查 `--announce` 参数是否正确配置 --- ## 高级用法 ### 自定义提取规则 编辑 `prompts/extract-rules.md`： ```markdown # 自定义提取规则 ## 新增提取字段 ### 6. 关键数据（KeyData） **识别方式：** - 表格格式：`| 数据 | 数值 | 意义 |` **提取内容：** - name: 数据名称 - value: 数值 - meaning: 意义 ``` ### 自定义摘要模板 编辑 `prompts/summary-template.md`： ```markdown # 我的自定义摘要模板 ## 输出格式 ``` 📚 今日学习总结 · {日期} 🎯 核心收获：{主题数} 个主题 💡 关键洞见：{金句数} 条 {主题列表} --- 💪 继续加油！ ``` ``` --- ## 与其他技能协作 ``` ┌─────────────────┐ │ learning-cards │ 每日生成学习卡片 │ (本技能) │ └────────┬────────┘ │ ▼ ┌─────────────────┐ │ learning-examiner│ 基于卡片出题测试 │ (学习考官) │ └────────┬────────┘ │ ▼ ┌─────────────────┐ │ learning-manager│ 生成周报汇总 │ (Elon) │ └─────────────────┘ ``` --- ## 技术细节 ### 文件结构 ``` daily-learning-cards/ ├── _meta.json # Skill 元数据 ├── SKILL.md # 本文件 ├── daily-learning-cards.sh # 主脚本（每日卡片入口） ├── weekly-summary-cron.sh # 周报脚本（每周一 11:00） ├── weekly-exam.sh # 测试脚本（每周一 11:30） ├── refine-memory.sh # 记忆文件精炼脚本 ├── prompts/ # Prompts 目录 │ ├── summary-template.md # 摘要模板 │ └── extract-rules.md # 提取规则 ├── scripts/ # 脚本目录 │ ├── extract.js # 数据提取 │ ├── generate-card.js # 学习卡片生成 │ ├── generate-exam.js # 考题生成 V1（模板，保留作 fallback） │ ├── generate-exam-v2.js # 考题生成 V2（AI 智能出题）🆕 │ ├── generate-summary-v2.js # 周报生成 V2（AI 智能生成）🆕 │ ├── extract-exam-data.js # 考题数据提取器 🆕 │ ├── extract-insights.js # 金句提取 │ ├── extract-pitfalls.js # 踩坑提取 │ ├── extract-concepts.js # 新概念提取 │ └── load-config.js # 配置加载（含初始化向导） ├── config.json # 用户配置 └── README.md # 简要说明 ``` ### 依赖 - **Node.js** ≥ 16.0 - **Bash** ≥ 4.0 - **OpenClaw**（用于定时任务和消息投递） --- ## 更新日志 ### v2.0.0 (2026-05-28) - 🚀 **AI 智能出题**：考题生成从模板引擎改为 AI 直接生成，每道题独立设计，杜绝"20道题套同一模板" - 🚀 **AI 智能周报**：周报从 shell 模板拼接改为 AI 生成，Elon 经理点评更有深度 - 🆕 **数据提取器**：`extract-exam-data.js` 从学习卡片 + 原始记忆文件双源提取结构化 JSON - 🆕 **内容稀疏处理**：学习内容不足时自动补充 AI 扩展题（提示词工程/Agent架构/AI安全） - 🔧 **JSON 多层容错**：考题 JSON 解析支持 markdown 代码块、裸文本等多层回退 - 🔧 **API 超时优化**：出题 timeout 3min→5min，max_tokens 8K→16K - 📝 新增脚本：`extract-exam-data.js`、`generate-exam-v2.js`、`generate-summary-v2.js` - ⚡ 保留旧版 `generate-exam.js` 作为 fallback ### v1.1.0 (2026-05-19) - 🎉 初始版本 - ✅ 多渠道合并（飞书/WebUI/钉钉/微信/QQ 等可扩展） - ✅ 自动飞书推送 - ✅ 智能内容过滤 - ✅ AI 整合生成（重要性排序） - ✅ 用户配置文件支持 - ✅ Prompts 外置 - ✅ 踩坑/新概念/金句列表化 - ✅ 统计概览优化 _更多更新即将到来_ --- ## 许可证 MIT-0 - 自由使用，无需署名。 --- ## 反馈与支持 如有问题或建议，请： 1. 检查本 SKILL.md 的故障排除章节 2. 查看日志文件：`/tmp/daily-learning-cards.log` 3. 联系开发者 💃 金银 Planet · 自我提升部

path: README.md
content: # daily-learning-cards

> 一个自动化的"学习秘书"，帮你把零散对话变成可复习的知识卡片。

---

## 💡 总结

**这个 Skill 做了 4 件核心事：**

1. **记录** → 把我们的对话写成结构化记忆
2. **提炼** → 从记忆中提取有价值的学习内容
3. **推送** → 每天自动生成昨天学习卡片并发送给你
4. **复盘** → 每周自动生成上周学习周报和考题并发送给你

---

## 🎯 核心功能（5 个）

| 功能 | 说明 | 状态 |
|------|------|------|
| **1. 双渠道记忆读取** | 自动合并飞书 + WebUI 的每日记忆文件 | ✅ 已实现 |
| **2. 结构化数据提取** | 从记忆文件中提取主题/决策/踩坑/概念/金句 | ✅ 已实现 |
| **3. 学习卡片生成** | 生成 Markdown 格式的学习卡片（含进度条可视化） | ✅ 已实现 |
| **4. 自动定时推送** | 每天 10:00 自动生成并发送到飞书 | ✅ 已启用 |
| **5. 防重复机制** | 检查已发送标记，避免重复生成 | ✅ 已实现 |

---

## 📁 文件结构（14 个文件）

```
daily-learning-cards/
├── 主脚本
│   ├── daily-learning-cards.sh      # 主入口（Bash 脚本）
│   ├── weekly-exam.sh               # 每周考试题生成
│   └── refine-memory.sh             # 日终 AI 整理
│
├── 核心脚本（scripts/）
│   ├── extract.js                   # 数据提取（记忆文件→JSON）
│   ├── generate-card.js             # 卡片生成（JSON→Markdown，含重要性排序）
│   ├── refine-memory.sh             # 日终 AI 整理
│   ├── extract-insights.js          # 金句提取
│   ├── extract-pitfalls.js          # 踩坑提取
│   ├── extract-concepts.js          # 新概念提取
│   ├── parse-session.js             # 会话解析
│   ├── daily-memory.js              # 每日记忆管理
│   ├── generate-exam.js             # 考试题生成
│   └── load-config.js               # 配置加载器
│
├── 配置文件（prompts/）
│   ├── extract-rules.md             # 提取规则
│   ├── summary-template.md          # 摘要模板
│   └── i18n.json                    # 国际化配置
│
└── 文档
    ├── SKILL.md                     # 完整技能文档
    ├── README.md                    # 本文件（快速入门）
    └── _meta.json                   # 元数据
```

---

## 🔧 提取的数据类型（5 类）

| 类型 | 识别规则 | 输出字段 |
|------|---------|---------|
| **📚 主题** | `## 新主题：{名称}` | 标题、来源渠道 |
| **📋 决策** | `| 选项 | 考虑因素 | 结果 |` 表格 | 选项、因素、结果 |
| **⚠️ 踩坑** | `- **问题：**` + `解决方案` + `教训` | 问题、方案、教训 |
| **🧠 概念** | `- **术语：**` + `定义` + `应用场景` | 术语、定义、场景 |
| **💬 金句** | `> "内容"` 引用格式 | 金句原文 |

---

## 📤 输出产物（2 种）

### 1. 摘要（推送到飞书）

```
📝 昨日学习卡片 · 2026-04-21

╔════════════════════════════════════╗
║  📊 学习概览                        ║
╠════════════════════════════════════╣
║  📚 主题：[████████░░] 4/5 个      ║
║  📋 决策：[██████░░░] 2/3 个       ║
║  ⚠️ 踩坑：[████░░░░░░] 2/5 个      ║
║  🧠 概念：[██████░░░] 2/3 个       ║
╚════════════════════════════════════╝

📚 核心主题（4 个）
   ├─ 主题 1：...
   └─ 主题 4：...

💬 金句摘录（2 条）
   └─ "..."

⚠️ 踩坑记录（2 个）
   └─ 问题：...

🧠 新概念（2 个）
   └─ 术语：...

📎 完整卡片：memory/learning-cards/2026-04-21.md
```

### 2. 完整卡片（Markdown 文件）

- **路径：** `memory/learning-cards/YYYY-MM-DD.md`
- **内容：** 详细的结构化学习笔记（含所有提取内容）

---

## ⚙️ 配置项（用户可定制）

**配置文件：** `~/.daily-learning-cards/config.json`

| 配置项 | 默认值 | 说明 |
|--------|--------|------|
| `extract.maxTopics` | 20 | 最大主题数 |
| `extract.maxPitfalls` | 6 | 最大踩坑数 |
| `extract.maxConcepts` | 6 | 最大概念数 |
| `extract.maxInsights` | 6 | 最大金句数 |
| `extract.minInsightLength` | 10 | 金句/洞见的最小字符长度 |
| `schedule.hour` | 10 | 定时小时 |
| `schedule.minute` | 30 | 定时分钟 |
| `language` | zh | 语言（zh/en/bilingual） |

---

## 🔄 完整工作流

```
┌─────────────────┐
│ 你和我对话      │
│ (飞书/WebUI)    │
└────────┬────────┘
         │
         ▼
┌─────────────────┐
│ 写入每日记忆    │
│ memory/feishu/  │
│ YYYY-MM-DD.md   │
└────────┬────────┘
         │
         ▼ (次日 10:00)
┌─────────────────┐
│ Cron 触发       │
│ daily-learning- │
│ cards.sh        │
└────────┬────────┘
         │
         ▼
┌─────────────────┐
│ extract.js      │
│ 读取记忆文件    │
│ 提取结构化数据  │
└────────┬────────┘
         │
         ▼
┌─────────────────┐
│ generate-card.js│
│ 生成学习卡片    │
│ (Markdown 文件)  │
└────────┬────────┘
         │
         ▼
┌─────────────────┐
│ 输出摘要到 stdout│
│ OpenClaw 自动投递│
└────────┬────────┘
         │
         ▼
┌─────────────────┐
│ 你收到飞书消息  │
│ (学习卡片摘要)  │
└─────────────────┘
```

---

## 🚀 扩展功能

| 功能 | 脚本 | 状态 |
|------|------|------|
| **每周考试** | `weekly-exam.sh` | ✅ 已启用（每周一 11:30） |
| **重要性排序** | `generate-card.js` | ✅ 已集成（踩坑 +3/ 概念 +3/ 金句 +2） |
| **日终 AI 整理** | `refine-memory.sh` | ✅ 已启用（每天 23:59） |
| **会话解析** | `parse-session.js` | ⚠️ 备用工具（手动运行） |

---

## 📊 当前配置状态

| 项目 | 配置 | 状态 |
|------|------|------|
| **每日卡片 Cron** | `0 10 * * *` | ✅ 已启用 |
| **每周考试 Cron** | `30 11 * * 0` | ✅ 已启用（每周一 11:30） |
| **日终 AI 整理 Cron** | `59 23 * * *` | ✅ 已启用 |
| **重要性排序** | 踩坑 +3/ 概念 +3/ 金句 +2 | ✅ 已启用 |
| **日志文件** | `/tmp/daily-learning-cards.log` | ✅ 正常 |
| **卡片目录** | `memory/learning-cards/` | ✅ 正常 |
| **备份目录** | `memory/raw-backup/` | ✅ 已创建 |
| **最后生成** | 2026-04-21 | ✅ 成功 |

---



*💃 金银 Planet · 自我提升部*


path: _meta.json
content: {
  "name": "daily-learning-cards",
  "version": "2.0.0",
  "description": "V2: AI 智能出题 & 周报生成，消除模板化，支持学习内容稀疏时 AI 扩展补充",
  "author": "金银 Planet · 后勤保障部",
  "license": "MIT",
  "keywords": ["learning", "cards", "daily", "feishu", "webui", "dingtalk", "automation"],
  "type": "cron",
  "entry": "daily-learning-cards.sh",
  "schedule": "0 10 * * *",
  "config": {
    "extract": {
      "type": "object",
      "description": "内容提取配置",
      "properties": {
        "maxTopics": { "type": "number", "default": 20 },
        "maxPitfalls": { "type": "number", "default": 6 },
        "maxConcepts": { "type": "number", "default": 6 },
        "maxInsights": { "type": "number", "default": 6 },
        "minInsightLength": { "type": "number", "default": 10 }
      }
    },
    "summary": {
      "type": "object",
      "description": "摘要生成配置",
      "properties": {
        "includeTopics": { "type": "boolean", "default": true },
        "includeDecisions": { "type": "boolean", "default": true },
        "includePitfalls": { "type": "boolean", "default": true },
        "includeConcepts": { "type": "boolean", "default": true },
        "includeInsights": { "type": "boolean", "default": true },
        "emojiStyle": { "type": "string", "default": "unicode" }
      }
    },
    "schedule": {
      "type": "object",
      "description": "定时任务配置",
      "properties": {
        "hour": { "type": "number", "default": 10 },
        "minute": { "type": "number", "default": 0 },
        "timezone": { "type": "string", "default": "Asia/Shanghai" }
      }
    },
    "channels": {
      "type": "object",
      "description": "渠道配置",
      "properties": {
        "sources": { "type": "array", "default": ["webui", "feishu"] },
        "delivery": { "type": "string", "default": "feishu" }
      }
    },
    "feishu": {
      "type": "object",
      "description": "飞书推送配置",
      "properties": {
        "target": { "type": "string", "default": "", "description": "飞书群ID或私聊ID" }
      }
    },
    "language": {
      "type": "string",
      "default": "zh",
      "description": "输出语言（zh/en）"
    }
  }
}

path: config.json
content: {
  "extract": {
    "maxTopics": 20,
    "maxPitfalls": 6,
    "maxConcepts": 6,
    "maxInsights": 6,
    "minInsightLength": 10
  },
  "summary": {
    "includeTopics": true,
    "includeDecisions": true,
    "includePitfalls": true,
    "includeConcepts": true,
    "includeInsights": true,
    "emojiStyle": "unicode"
  },
  "schedule": {
    "hour": 10,
    "minute": 0,
    "timezone": "Asia/Shanghai"
  },
  "channels": {
    "sources": ["webui", "feishu"],
    "delivery": "feishu"
  },
  "feishu": {
    "target": "oc_961ed2e84e1c196a9598dc6414d92ea6"
  },
  "language": "zh"
}


path: prompts/extract-rules.md
content: # 记忆文件提取规则

## 提取目标

从每日记忆文件（Markdown 格式）中提取结构化数据。

## 提取字段

### 1. 主题（topics）

**识别方式：**
- 标题：`## 新主题：{主题名}`
- 或：`### 时间：{时间}` 后的第一个标题

**提取内容：**
- title: 主题名称
- channel: 来源渠道（飞书/WebUI）

### 2. 决策（decisions）

**识别方式：**
- 表格格式：`| 选项 | 考虑因素 | 结果 |`
- 排除表头行

**提取内容：**
- option: 选项名称
- factors: 考虑因素
- result: 结果（采纳/不选）
- channel: 来源渠道

### 3. 踩坑记录（pitfalls）

**识别方式：**
- 标题：`**踩坑记录：**`
- 列表项：`- **问题：** {问题描述}`
- 后续：`- **解决方案：** {方案}`
- 后续：`- **教训：** {教训}`

**提取内容：**
- problem: 问题描述
- solution: 解决方案（可选）
- lesson: 教训（可选）
- channel: 来源渠道

### 4. 新概念（concepts）

**识别方式：**
- 标题：`**新概念：**`
- 列表项：`- **术语：** {术语名}`
- 后续：`- **定义：** {定义}`
- 后续：`- **应用场景：** {场景}`

**提取内容：**
- term: 术语名称
- definition: 定义（可选）
- scenario: 应用场景（可选）
- channel: 来源渠道

### 5. 金句/洞见（insights）

**识别方式：**
- 引用格式：`> "{金句内容}"`
- 或：`> {金句内容}`

**提取内容：**
- text: 金句内容
- channel: 来源渠道

## 过滤规则

1. **排除系统噪音：**
   - "morning"
   - "两件事都已完成"
   - "心跳检查"
   - "启动检查"
   - "HEARTBEAT_OK"

2. **去重：**
   - 相同内容只保留一条
   - 优先保留飞书渠道（如有重复）

3. **长度限制：**
   - 金句：至少 10 个字符
   - 主题：不为空


path: prompts/summary-template.md
content: # 学习卡片摘要模板

## 输出格式

```
📝 昨日学习卡片 · {日期}

📊 **统计概览**
├─ 📚 核心主题：{主题数} 个
├─ 📋 重要决策：{决策数} 个
├─ 🐛 踩坑记录：{踩坑数} 个
└─ 🧠 新概念：{新概念数} 个

📚 **核心主题：**
{主题列表}

💭 **金句摘录：**
{金句列表}

🐛 **踩坑记录：**
{踩坑列表}

🧠 **新概念：**
{新概念列表}

📎 **完整卡片：** {卡片路径}

---
💃 金银 Planet · 自我提升部
```

## 列表格式

- 主题：📌 {主题名称}
- 金句：💭 {金句内容}
- 踩坑：🐛 {问题描述}
- 新概念：🧠 {术语}：{定义}

## 数量限制

- 主题：最多 5 个
- 金句：最多 3 条
- 踩坑：最多 3 条
- 新概念：最多 3 个


Security scan verdicts — ClawScan: suspicious | static analysis: suspicious | VirusTotal: clean | SkillSpector: suspicious (CRITICAL)