name: 复合学习 description: 将会话学习转化为永久能力(技能、规则、代理)。当被要求“改进设置”、“从会话中学习”、“复合学习”或“哪些模式应成为技能”时使用。 allowed-tools: [读取, 全局, 搜索, 写入, 编辑, Bash, 询问用户问题]
复合学习
将临时的会话学习转化为永久、复合的能力。
何时使用
- “我应该从最近的会话中学到什么?”
- “基于最近的工作改进我的设置”
- “将学习转化为技能/规则”
- “哪些模式应成为永久性的?”
- “复合我的学习”
过程
步骤 1:收集学习
# 列出学习(按时间倒序)
ls -t $CLAUDE_PROJECT_DIR/.claude/cache/learnings/*.md | head -20
# 计数总数
ls $CLAUDE_PROJECT_DIR/.claude/cache/learnings/*.md | wc -l
读取最近的 5-10 个文件(或指定日期范围)。
步骤 2:提取模式(结构化)
对于每个学习文件,从以下特定部分提取条目:
| 部分标题 | 提取内容 |
|---|---|
## Patterns 或 可重用技术 |
规则的直接候选 |
**要点:** 或 **可操作要点:** |
决策启发式 |
## 有效的方法 |
成功模式 |
## 失败的方法 |
反模式(转化为规则) |
## 关键决策 |
设计原则 |
在过程中构建频率表:
| 模式 | 会话 | 类别 |
|---------|----------|----------|
| “编辑前检查工件” | abc, def, ghi | 调试 |
| “显式传递 ID” | abc, def, ghi, jkl | 可靠性 |
步骤 2b:合并相似模式
在计数之前,合并表达相同原则的模式:
合并示例:
- “工件优先调试”
- “通过检查文件验证钩子输出”
- “文件系统优先调试” → 所有表达:“编辑代码前观察输出”
使用最通用的表述。更新频率表。
步骤 3:检测元模式
关键步骤: 查看学习聚集在哪些主题周围。
如果超过 50% 的模式与一个主题相关(例如,“钩子”、“追踪”、“异步”): → 该主题可能需要 专用技能 而不是多个规则 → 一个技能比五个规则复合得更好
问自己:“是否有一个技能可以使所有这些规则变得不必要?”
步骤 4:分类(决策树)
对于每个模式,确定工件类型:
它是一个命令/步骤序列吗?
→ 是 → 技能(可执行 > 声明性)
→ 否 ↓
它应该在事件上自动运行吗(SessionEnd、PostToolUse 等)?
→ 是 → 钩子(自动 > 手动)
→ 否 ↓
它是“当 X 时,做 Y”或“永远不要做 X”吗?
→ 是 → 规则
→ 否 ↓
它是否增强现有的代理工作流?
→ 是 → 代理更新
→ 否 → 跳过(不值得捕获)
工件类型示例:
| 模式 | 类型 | 为什么 |
|---|---|---|
| “提交前运行 linting” | 钩子 (PreToolUse) | 自动门控 |
| “会话结束时提取学习” | 钩子 (SessionEnd) | 自动触发 |
| “逐步调试钩子” | 技能 | 手动序列 |
| “总是显式传递 ID” | 规则 | 启发式 |
步骤 5:应用信号阈值
| 出现次数 | 行动 |
|---|---|
| 1 | 注意但跳过(除非关键失败) |
| 2 | 考虑 - 呈现给用户 |
| 3+ | 强信号 - 推荐创建 |
| 4+ | 肯定创建 |
步骤 6:提出工件
以这种格式呈现每个提议:
---
## 模式: [通用名称]
**信号:** [N] 会话 ([列出会话 ID])
**类别:** [调试 / 可靠性 / 工作流 / 等]
**工件类型:** 规则 / 技能 / 代理更新
**理由:** [为什么选择这种工件类型,为什么值得创建]
**草稿内容:**
\`\`\`markdown
[实际将写入文件的内容]
\`\`\`
**文件:** `.claude/rules/[名称].md` 或 `.claude/skills/[名称]/SKILL.md`
---
使用 AskUserQuestion 获取每个工件的批准(或批量批准)。
步骤 7:创建批准的工件
对于规则:
# 写入规则目录
cat > $CLAUDE_PROJECT_DIR/.claude/rules/<name>.md << 'EOF'
# 规则名称
[上下文:为什么这条规则存在,基于 N 个会话]
## 模式
[可重用原则]
## 做
- [具体行动]
## 不要做
- [反模式]
## 源会话
- [session-id-1]: [发生了什么]
- [session-id-2]: [发生了什么]
EOF
对于技能:
创建 .claude/skills/<name>/SKILL.md 包含:
- 前言(名称、描述、允许工具)
- 何时使用
- 分步说明(可执行)
- 来自学习的示例
如果适当,添加到 skill-rules.json 的触发器。
对于钩子:
创建 Shell 包装器 + TypeScript 处理程序:
# Shell 包装器
cat > $CLAUDE_PROJECT_DIR/.claude/hooks/<name>.sh << 'EOF'
#!/bin/bash
set -e
cd "$CLAUDE_PROJECT_DIR/.claude/hooks"
cat | node dist/<name>.mjs
EOF
chmod +x $CLAUDE_PROJECT_DIR/.claude/hooks/<name>.sh
然后创建 src/<name>.ts,用 esbuild 构建,并在 settings.json 中注册:
{
"hooks": {
"EventName": [{
"hooks": [{
"type": "command",
"command": "$CLAUDE_PROJECT_DIR/.claude/hooks/<name>.sh"
}]
}]
}
}
对于代理更新:
编辑 .claude/agents/<name>.md 中的现有代理以添加学习到的能力。
步骤 8:总结报告
## 复合完成
**分析的学习:** [N] 会话
**找到的模式:** [M]
**创建的工件:** [K]
### 已创建:
- 规则: `explicit-identity.md` - 跨边界显式传递 ID
- 技能: `debug-hooks` - 钩子调试工作流
### 跳过(信号不足):
- “模式 X” (1 次出现)
**您的设置现在已永久改进。**
质量检查
在创建任何工件之前:
- 它是否足够通用? 是否适用于其他项目?
- 它是否足够具体? 是否提供具体指导?
- 是否已经存在? 首先检查
.claude/rules/和.claude/skills/ - 类型是否正确? 序列 → 技能,启发式 → 规则
文件参考
- 学习:
.claude/cache/learnings/*.md - 技能:
.claude/skills/<name>/SKILL.md - 规则:
.claude/rules/<name>.md - 钩子:
.claude/hooks/<name>.sh+src/<name>.ts+dist/<name>.mjs - 代理:
.claude/agents/<name>.md - 技能触发器:
.claude/skills/skill-rules.json - 钩子注册:
.claude/settings.json→hooks部分