关于 learner
learner 是已弃用的兼容技能,用于从调试和调查中提取可复用的项目专属经验。它会筛选并验证经验、区分专业知识与流程,再保存为技能文件。
主要功能
- 01识别项目专属的难得经验
- 02排除通用或易于搜索的建议
- 03将知识归类为专业知识或流程
- 04以必需的 YAML frontmatter 保存技能
适用场景
- 01记录非显而易见的修复以供后续使用
- 02保存未记录的项目行为
- 03与团队共享经过验证的项目知识
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ yeachan-heo/ oh-my-claudecode --skill learner安装后在 Claude Code 中输入/learner确认已加载。
详细介绍
Learner Skill
已弃用的兼容别名:新的技能提取工作流请使用
/oh-my-claudecode:skillify。此文件仅为内部实现、历史记录和兼容性而保留。
这是一项 Level 7(自我改进)技能。它包含两个不同的部分:
- 专业知识:关于优秀技能要素的领域知识。发现新模式后会自动更新。
- 工作流:稳定的提取流程。很少变更。
改进周期中只能更新「专业知识」部分。
专业知识
本部分包含会随着时间推移而完善的领域知识。 发现新模式时,学习者本身可以更新此部分。
核心原则
可复用的技能不是可复制粘贴的代码片段,而是原则和决策启发式,用于教会 Claude 如何思考某一类问题。
区别如下:
- 不佳(模仿):“看到 ConnectionResetError 时,添加这个 try/except 块”
- 良好(可复用技能):“在异步网络代码中,由于客户端/服务器生命周期不匹配,任何 I/O 操作都可能独立失败。原则:分别封装每个 I/O 操作,因为操作之间发生故障才是常见情况,而不是例外。”
质量门槛
提取技能前,以下三项必须全部成立:
- “有人能在 5 分钟内通过 Google 找到这个信息吗?”→ 否
- “这是此代码库特有的吗?”→ 是
- “发现它是否付出了实际的调试努力?”→ 是
识别信号
仅在以下情况后提取:
- 解决了需要深入调查的棘手 Bug
- 发现了此代码库特有、且不明显的变通方法
- 找到了容易被遗忘、忘记后会浪费时间的隐藏陷阱
- 揭示了会影响此项目的未文档化行为
有用技能的要素
-
无法通过 Google 轻易找到:搜索也很难轻易找到的信息
- 不佳:“如何在 TypeScript 中读取文件” ❌
- 良好:“此代码库在 ESM 中使用自定义路径解析,需要使用 fileURLToPath 和特定相对路径” ✓
-
上下文专属:引用此代码库中的实际文件、错误消息或模式
- 不佳:“使用 try/catch 处理错误” ❌
- 良好:“server.py:42 中的 aiohttp 代理会因 ClientDisconnectedError 崩溃——请用 try/except 封装 StreamResponse” ✓
-
精准且可执行:准确说明要做什么以及在哪里做
- 不佳:“处理边界情况” ❌
- 良好:“在 dist/ 中遇到 ‘Cannot find module’ 时,检查 tsconfig.json 中的 moduleResolution 是否与 package.json 的 type 字段匹配” ✓
-
来之不易:需要投入大量调试精力才能发现
- 不佳:通用编程模式 ❌
- 良好:“worker.ts 中的竞争条件——第 89 行的 Promise.all 需要在 map 回调返回前等待” ✓
反模式(请勿提取)
- 通用编程模式(请改用文档)
- 重构技术(这些是通用的)
- 库的用法示例(请使用库文档)
- 类型定义或样板代码
- 初级开发者能在 5 分钟内通过 Google 找到的任何内容
工作流
本部分包含稳定的提取流程。 改进周期中不得更新此部分。
第 1 步:收集必需信息
-
问题描述:实际发生的具体错误、症状或疑惑
- 包含实际错误消息、文件路径和行号
- 示例:“重启后 sessionId 未定义时,src/hooks/session.ts:45 出现 TypeError”
-
解决方案:准确的修复方法,而非一般性建议
- 包含代码片段、文件路径和配置更改
- 示例:“访问 session.user 前添加空值检查;遇到 401 时重新生成会话”
-
触发条件:再次遇到此问题时可能出现的关键词
- 使用错误消息片段、文件名和症状描述
- 示例:["sessionId undefined", "session.ts TypeError", "401 session"]
-
范围:几乎总是项目级,除非确实是普遍适用的见解
步骤 2:质量验证
系统会拒绝以下技能:
- 过于笼统(没有文件路径、行号或具体错误消息)
- 轻易就能通过 Google 搜到(标准模式、库的用法)
- 解决方案含糊(没有代码片段或精确说明)
- 触发条件不佳(泛泛的词语,什么内容都会匹配)
步骤 3:分类为专业知识或工作流
保存前,确定所学内容属于:
- 专业知识(领域知识、模式、易踩的坑)→ 保存为
{topic}-expertise.md - 工作流(操作流程、步骤顺序)→ 保存为
{topic}-workflow.md
此分类可确保专业知识能够独立更新,而不影响工作流的稳定性。
步骤 4:保存位置
- 用户级:
${CLAUDE_CONFIG_DIR:-~/.claude}/skills/omc-learned/<skill-name>.md- 少见。仅用于真正可移植的经验。 - 项目级:
.omc/skills/<skill-name>.md- 默认。若希望团队保留此技能,可将其与代码仓库一同提交。在关联的工作树中,未提交的技能仍仅存在于该工作树中,删除该工作树后也会消失。
必需的文件格式
每个学习到的技能文件都必须以 YAML frontmatter 开头,以便学习技能的扁平文件发现机制能够加载它。 不要编写没有 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 - 启动开发循环并捕获经验