用途
Learner 用于从当前对话中提取一个可复用的技能(learned skill)。它属于 oh-my-claudecode 项目,被定义为一个 Level 7(自我改进型)技能。根据其说明,该技能已被废弃,作为兼容性别名保留,仅用于内部实现/历史与兼容目的;官方建议新的技能提取工作流改用 /oh-my-claudecode:skillify。
主要能力
Learner 包含两个明显的部分:
- Expertise(领域知识):关于什么构成一个好技能的领域知识,会随着发现的模式自动更新。在改进周期中,只有 Expertise 部分应被更新。
- Workflow(工作流):稳定的提取流程,极少变化,在改进周期中不应被更新。
其核心原则是:可复用的技能不是可复制粘贴的代码片段,而是教导 Claude 如何思考某一类问题的原则和决策启发式。资料中给出的对比例子:坏的做法(模仿)是“当看到 ConnectionResetError 时,加上这个 try/except 块”;好的做法(可复用技能)是“在异步网络代码中,任何 I/O 操作都可能因客户端/服务器生命周期不匹配而独立失败。原则是:单独包裹每个 I/O 操作,因为操作之间失败是常见情况,而不是例外”。
使用方式
提取前的质量门
在提取技能之前,以下三项必须全部为真:
- “有人能 5 分钟内在谷歌上搜到吗?” → 否
- “这是否特定于当前这个代码库?” → 是
- “发现它是否花了真实的调试功夫?” → 是
识别信号
只有在以下情况后才提取:
- 解决了一个需要深入调查的棘手 bug
- 发现了特定于该代码库的非显而易见的 workaround
- 找到了遗忘后会浪费时间的隐藏陷阱(gotcha)
- 发现了影响该项目的未记录行为
有用技能的特征
- 不可搜索:无法轻易通过搜索找到。坏的例子是“如何在 TypeScript 中读取文件”;好的例子是“该代码库在 ESM 中使用自定义路径解析,需要 fileURLToPath 加特定相对路径”。
- 上下文特定:引用该代码库中实际的 文件、错误消息或模式。坏的例子是“用 try/catch 做错误处理”;好的例子是“server.py:42 中的 aiohttp 代理在 ClientDisconnectedError 时崩溃——把 StreamResponse 包在 try/except 里”。
- 精确可操作:明确告诉你做什么、在哪里做。坏的例子是“处理边界情况”;好的例子是“在 dist/ 中看到 ‘Cannot find module’ 时,检查 tsconfig.json 的 moduleResolution 是否与 package.json 的 type 字段匹配”。
- 来之不易:需要大量调试才能发现。坏的例子是通用编程模式;好的例子是“worker.ts 中的竞态条件——第 89 行的 Promise.all 需要在 map 回调返回前 await”。
反模式(不要提取)
- 通用编程模式(改用文档)
- 重构技巧(这些是通用的)
- 库的使用示例(改用库文档)
- 类型定义或样板代码
- 任何初级开发者能在 5 分钟内在谷歌上搜到的东西
Workflow 步骤
Step 1:收集所需信息
- 问题陈述:发生的具体错误、症状或困惑。包含实际错误消息、文件路径、行号。示例:“src/hooks/session.ts:45 中 sessionId 在重启后为 undefined 时的 TypeError”。
- 解决方案:确切的修复方法,而不是通用建议。包含代码片段、文件路径、配置更改。示例:“在访问 session.user 前加 null 检查,在 401 时重新生成 session”。
- 触发器:再次遇到该问题时会出现的关键词。使用错误消息片段、文件名、症状描述。示例:["sessionId undefined", "session.ts TypeError", "401 session"]。
- 范围:几乎总是项目级,除非是真正通用的洞见。
Step 2:质量验证。系统会拒绝以下技能:过于通用(没有文件路径、行号或具体错误消息)、容易谷歌到(标准模式、库用法)、解决方案模糊(没有代码片段或精确指令)、触发器糟糕(匹配一切的通用词)。
Step 3:分类为 Expertise 或 Workflow。保存前判断该学习内容属于:Expertise(领域知识、模式、陷阱)→ 保存为 {topic}-expertise.md;Workflow(操作流程、步骤序列)→ 保存为 {topic}-workflow.md。此分类确保 expertise 可独立更新,而不会破坏 workflow 的稳定性。
Step 4:保存位置。
- 用户级:${CLAUDE_CONFIG_DIR:-~/.claude}/skills/omc-learned/<skill-name>.md —— 少见,仅用于真正可移植的洞见。
- 项目级:.omc/skills/<skill-name>.md —— 默认。当希望团队保留该技能时,意图是随仓库一起提交。在 linked worktrees 中,未提交的技能仍是 worktree 本地的,如果该 worktree 被删除就会消失。
必需的文件格式
每个学到的技能文件必须以 YAML frontmatter 开头,以便 learned-skill 扁平文件发现机制能加载它。不要写没有 frontmatter 的纯 markdown。
最小必需 frontmatter:
---
name: <skill-name>
description: <one-line description>
triggers:
- <trigger-1>
- <trigger-2>
---
技能正文模板
---
name: <skill-name>
description: <one-line description>
triggers:
- <trigger-1>
- <trigger-2>
---
# [Skill Name]
## The Insight
What is the underlying PRINCIPLE you discovered? Not the code, but the mental model.
## Why This Matters
What goes wrong if you don't know this? What symptom led you here?
## Recognition Pattern
How do you know when this skill applies? What are the signs?
## The Approach
The decision-making heuristic, not just code. How should Claude THINK about this?
## Example (Optional)
If code helps, show it - but as illustration of the principle, not copy-paste material.
关键:如果一个技能能让 Claude 将它应用到新的情境,而不仅仅是完全相同的情境,那么它就是可复用的。
相关命令
- /oh-my-claudecode:note —— 保存能经受压缩的快速笔记(比技能更非正式)
- /oh-my-claudecode:ralph —— 启动带学习捕获的开发循环
限制
资料明确标明 Learner 已被废弃,仅作为兼容性别名保留;新的技能提取工作流应使用 /oh-my-claudecode:skillify。资料未提供收费、价格或其他相关信息。