solution-capture
解决非平凡问题后评估是否值得沉淀为可复用的解决方案 skill,值得则按 skill 标准格式写入 .solutions/ 并更新索引。触发:"记录这个解决方案"、"沉淀一下"、"保存解决方案"、"这个值得记录"、"solution capture",或 AI 经多步推理/调试试错解决问题后自动触发。
SKILL.mdskills/solution-capture/SKILL.md
GitHub解决方案捕获
概述
目的:让 AI 在解决非平凡问题后,自动将"问题→解决步骤"沉淀为可复用的 skill,下次遇到类似问题可直接加载执行,避免重复踩坑。
功能:评估问题是否值得记录 → 提炼为标准 skill 格式 → 写入 .solutions/ 目录 → 更新 INDEX.md 索引。
使用场景:
- AI 解决了一个需要多步调试的问题后
- AI 完成了一套复杂配置后
- AI 解决了一个反复出现的问题后
- 用户说"记录这个解决方案"、"沉淀一下"、"这个值得记录"时
核心原则
- 只记录非平凡的:一行能说完的不记,常规操作不记,只有"花了不少步骤才搞定"的才记
- skill 格式:每个解决方案就是一个标准 skill 目录(含 SKILL.md),可直接被加载执行
- 双存储层:项目级(
.solutions/)优先,用户级(~/.solutions/)兜底 - 索引同步:写入解决方案后必须更新 INDEX.md
- 去重:记录前先查 INDEX.md,避免重复记录相同问题
- 路由优先:若
loop-discoveryskill 可用且本次沉淀未经过路由,先走它做证据门与载体检查;其结论为"新建 solution"时跳过下方 Step 1(评估已由路由完成),直接从 Step 2 开始
存储结构
# 项目级(跟项目走,版本控制)
.solutions/
├── INDEX.md # 索引文件
├── debugging/
│ ├── jwt-token-expiry/ # 解决方案 = skill 目录
│ │ ├── SKILL.md # 主体(标准 skill 格式)
│ │ ├── scripts/ # 可选脚本
│ │ │ └── fix_jwt.py
│ │ └── reference.md # 可选参考资料
│ └── cors-policy-fix/
│ └── SKILL.md
├── configuration/
│ └── nginx-reverse-proxy/
│ └── SKILL.md
└── deployment/
└── docker-multi-stage/
└── SKILL.md
# 用户级(跨项目共享)
~/.solutions/
├── INDEX.md
└── general/
└── git-force-push-recovery/
└── SKILL.md
分类目录
使用以下标准分类,不确定时归入 general:
| 分类 | 说明 | 典型场景 |
|---|---|---|
debugging |
调试问题 | bug 排查、错误修复、异常定位 |
configuration |
配置问题 | 环境配置、中间件配置、CI/CD 配置 |
deployment |
部署问题 | Docker、K8s、服务器部署 |
integration |
集成问题 | 第三方 API 对接、SDK 集成 |
architecture |
架构问题 | 设计模式、技术选型、重构 |
performance |
性能问题 | 性能优化、内存泄漏、慢查询 |
general |
通用问题 | 不属于上述分类的 |
执行流程
Step 1:评估是否值得记录
解决问题后,对照以下标准判断:
值得记录(满足任一即可):
- 解决过程涉及 3 个以上步骤
- 需要查找文档、试错、调试才能解决
- 问题具有复现性,可能再次遇到
- 解决方案包含非显而易见的技巧或注意事项
- 涉及特定工具/框架的坑或最佳实践
不值得记录:
- 一行命令就能解决
- 常规 CRUD 操作
- 一次性、不会再现的问题
- AI 自身知识库中已覆盖的标准操作
Step 2:确定存储位置
按以下优先级确定存储层和分类:
存储层选择:
- 与当前项目强相关(如项目特定配置、项目代码 bug)→ 项目级
.solutions/ - 跨项目通用(如通用工具使用、语言级问题)→ 用户级
~/.solutions/ - 不确定 → 默认项目级
- 与当前项目强相关(如项目特定配置、项目代码 bug)→ 项目级
分类选择:参照上方分类表
Step 3:去重检查
读取目标存储层的 INDEX.md,检查是否已有类似解决方案:
- 关键词重叠:INDEX.md 中的触发关键词与当前问题高度重合
- 标题相似:已有标题描述的是同一个问题
如果已存在:
- 若新方案更优 → 更新已有解决方案(覆盖 SKILL.md + 更新 INDEX.md 条目)
- 若已有方案足够 → 跳过记录,告知用户已存在
Step 4:确定解决方案 ID 和目录名
- ID 命名规则:小写字母 + 连字符,简洁描述问题,如
jwt-token-expiry、cors-policy-fix - 目录结构:
{分类}/{ID}/SKILL.md
Step 5:编写 SKILL.md
按标准 skill 格式编写,必须包含:
---
name: {solution-id}
description: {一句话描述问题+解决方案,包含触发关键词}
category: {分类}
tags: [{逗号分隔标签}]
created: {YYYY-MM-DD}
updated: {YYYY-MM-DD}
---
# {解决方案标题}
## 场景
{什么情况下会遇到这个问题,描述触发条件和症状}
## 问题
{问题的详细描述,包括错误信息、现象等}
## 解决方案
{分步骤的解决方法,清晰可执行}
## 关键代码
\`\`\`{语言}
{代码片段或命令}
\`\`\`
## 注意事项
{需要避开的坑、前置条件、副作用等}
编写要求:
description必须包含触发关键词,便于查找时匹配- 解决方案步骤必须具体可执行,不要泛泛而谈
- 如有脚本辅助,放入
scripts/子目录并在 SKILL.md 中引用
Step 6:创建目录和文件
1. 创建目录:{存储层}/{分类}/{ID}/
2. 写入 SKILL.md
3. 如有脚本,创建 scripts/ 子目录并写入
4. 如有参考资料,写入 reference.md
Step 7:更新 INDEX.md
读取现有 INDEX.md(不存在则创建),在对应分类下追加条目(列表式格式,参考 expert-team 的索引风格,不用表格以免拥挤):
# 解决方案索引
> 由 solution-capture 自动维护
## debugging
### jwt-token-expiry:JWT Token 过期时间设置
- **描述**:解决 JWT Token 过期时间设置不当导致登录态提前失效的问题
- **触发关键词**:jwt, token, 过期, 登出, expiry
- **目录**:debugging/jwt-token-expiry/
### cors-policy-fix:CORS 跨域策略修复
- **描述**:解决跨域请求被浏览器拦截、CORS 配置不生效的问题
- **触发关键词**:cors, 跨域, cross-origin
- **目录**:debugging/cors-policy-fix/
## configuration
### nginx-reverse-proxy:Nginx 反向代理配置
- **描述**:解决 Nginx 反向代理配置错误导致服务不可访问的问题
- **触发关键词**:nginx, 反向代理, proxy, reverse
- **目录**:configuration/nginx-reverse-proxy/
INDEX.md 更新规则:
- 描述字段必填:一句话说明该方案用于解决什么问题(触发查找时帮助快速判断是否相关)
- 新增解决方案:在对应分类下追加一条记录(
### {ID}:{标题}+ 描述/触发关键词/目录三行) - 更新解决方案:修改对应记录的标题、描述或触发关键词(目录名不变)
- 分类不存在:新增
## {分类}标题,再追加记录 - 触发关键词:从问题的描述、症状、技术栈中提取 3-6 个关键词
Step 7.5:同步写入 ki 错误库
INDEX.md 更新完成后,调用 use_skill("ki-memory-write") 的错误库策略写一条原子(报错原文片段 / 现象 / 根因 / 解法 / 验证方式 / 关联方案)。
- 内容从已写好的 SKILL.md 提炼,不重复劳动
- 只存路标 + 指向:错误库存"报错 → 根因/解法"入口,关联方案指向
.solutions/{分类}/{ID}/,不复制.solutions/方案正文——完整方案仍留在.solutions/,二者不互相复制 - 查重前置:写入前先查重,命中则更新不新建,避免重复爆炸
- ki 不可用则跳过,不阻塞主流程
Step 8:验证
1. 确认目录结构正确:{存储层}/{分类}/{ID}/SKILL.md 存在
2. 确认 INDEX.md 已更新,新条目可见
3. 确认 SKILL.md 的 frontmatter 格式正确
更新已有解决方案
当发现已有解决方案需要更新时:
- 读取现有 SKILL.md
- 合并新信息(补充步骤、修正错误、添加注意事项)
- 更新
updated日期 - 如分类或触发关键词需要调整,同步更新 INDEX.md
- 版本号递增(在 frontmatter 中添加
version字段,初始为 1,每次更新 +1)
行为边界
- 不记录平凡问题:一行能解决的不记,常规操作不记
- 不替代 memory:简单事实用
update_memory,代码级知识用 ki 知识库,完整解决方案才用本 skill - 不自动触发落盘:必须评估通过后才写入,避免污染解决方案库
- 必须更新索引:写入解决方案后必须更新 INDEX.md,否则查找时无法发现
- 目录名即 ID:目录名就是解决方案的唯一标识,不可改名(改名需删除重建)