新手 30 秒上手
新会话开头说「工作台,接着干」,我会先读状态目录恢复上下文,再按待办继续。别靠记忆——记忆会丢,状态文件不会。
这是什么(解决什么痛)
模型跑着跑着会忘:跨会话丢上下文、重复搜同一路径、改着改着回不了头、重复造轮子。本 skill 给一套持久化工作台:
- 今日完成 / 待办:进度不丢
- 关键路径:skill 在哪、重要目录,固化一次,之后只查不搜
- 回退点:大操作前留安全状态,失败能回
- 工具箱:可复用命令/代码片段,免得重造
铁则(5 条,每次都用)
- 启动先读 state:新会话/新轮次先读状态目录(INDEX + 各文件),恢复上下文,不靠对话记忆。
- 关键路径一次固化:路径写进
paths.md,环境事实 / 故障 / 共性约定写进env.md,之后只查不搜;共性坑记env.md,只在本 skill 流程里会犯的才记 anti-patterns(判据见 env.md「记到哪一层」)。 - 大操作前留回退点:改文件/有副作用命令前,先往
rollback.md记回退点(git / 备份副本),失败回退——「回不了头」的解药。 - 工具箱沉淀:可复用命令/片段写进
toolbox.md;超过 3 行 / 带参数 / 含非 ASCII 路径 → 落scripts/成真脚本,toolbox 只留一行调用,避免重复造。 - 操作后写回:每完成一步,
today/<今天>.md追加 + todos.md 更新(完成即删、新任务插入)+ 刷新 rollback.md。
状态目录结构(多文件,方便资源管理器直读)
状态是目录不是单文件——每个文件管一件事,INDEX.md 是入口(代码块内 ## 是字段名,不计逻辑章节):
$HOME/.codebuddy/workbench/ # 默认位置(可用 $WORKBENCH_HOME 覆盖)
INDEX.md # 索引:导航 + 怎么用(最先读)
today/ # 今日完成:按日期一个文件(today/YYYY-MM-DD.md)
todos.md # 待办(P0/P1/P2)
paths.md # 路径(在哪):真实目录 / 工具位置,固化一次
env.md # 环境(什么情况):环境事实 + 故障档案 + 共性约定,持续增长
toolbox.md # 工具箱(可复用命令/代码片段)
rollback.md # 回退点(最近安全状态 + 恢复方式)
scripts/ # 可复用脚本(toolbox.md 只留一行调用,脚本本体在这)
目标环境差异(路径可移植·硬约束)
> 不许在 SKILL.md 写死绝对路径(如 C:\Users\...)——换环境即挂,还会传染子 skill。真实路径只放 paths.md(运行时地图),本文件只用符号。
| 场景 | 状态目录 | 解析 |
|---|---|---|
| 默认(用户级) | $HOME/.codebuddy/workbench/ |
$HOME = 用户主目录 |
| 显式覆盖 | $WORKBENCH_HOME(环境变量) |
设了就优先 |
| 项目级 | <workspace>/.codebuddy/workbench/ |
单项目私有 |
探测链(找不到存档时):① $WORKBENCH_HOME ② 当前环境标准路径 ③ 其余候选(~/.copilot/memories、~/.codebuddy/memories)④ 都没有 → 明说「按 X 没找到」+ 问,不静默当新项目。
流程
- 接活 → 读状态目录(无则建,填 paths.md 初值)
- 干之前 → 有大操作就先写 rollback.md 回退点;改动较大时(新增一节 / 改文件名 / 发版前)做轻量自查(死链 / 编号 / 标题数),不引用外部脚本
- 干 → 执行
- 干之后 →
today/<今天>.md追加、todos.md 更新(完成即删)、刷新 rollback.md、新片段进 toolbox.md(新脚本落scripts/) - 收尾 → 更新 INDEX.md 时间戳
怎么开始
三类开口(都能接):① 「工作台,接着干」② 「记一下:今天做了 X / 加个待办 Y」③ 「上次那个命令 / 路径在哪」
触发词:工作台、工作记忆、记录今天、待办、上次做到哪、别又忘了、回退点、固化路径、工具箱、避免重复探索
开局第一句怎么回(读完状态目录后固定这么说):
> 「已恢复:今日 N 项完成,P0 待办 M 项,上次停在 X。这次继续 X,还是先处理 Y?」
> 并附一句全局预告:动手前我会先往 rollback.md 记回退点。
对话示例(开口 → 定位 → 追问 → 产出)
> 用户(开口):「工作台,接着干」
> skill(定位):读 INDEX + today/todos → 「已恢复:今日 3 项完成,P0 待办 2 项,上次停在 workbench 补齐。」
> 用户:「先补 workbench」
> skill(追问根因):「补哪几项?评审报告点的是异常编号 / 对话示例 / 能力边界,还是全补?」
> 用户:「全补,另外 faq 和 anti-patterns 的文件名改英文」
> skill(给产出):先记回退点 → 改名 + 全量同步引用 → 补三项 → today/todos/rollback 写回 → 报改了哪些文件
异常编号
- #1 状态目录不可写/找不到:症状=读写
$HOME/.codebuddy/workbench/报权限拒绝或不存在;原因=沙箱只读/未初始化;治法=降级到项目级<workspace>/.codebuddy/workbench/或提示设$WORKBENCH_HOME,仍无则走探测链明说;引用:目标环境差异。 - #2 状态写进 skill 目录:症状=试图把状态放
skills/workbench/;原因=位置选错(硬约束:状态严禁进 skill 目录——发版后只读、跨项目污染);治法=移到$HOME/.codebuddy/workbench/;引用:anti-patterns #2。 - #3 改崩回不去:症状=改文件/发版后错误且无备份;原因=操作前没记回退点;治法=查 rollback.md 按回退方式恢复(git checkout / 副本),无则回最后已确认产出交接处;引用:铁则 3。
- #4 引用/链接断裂:症状=SKILL.md 里的 references 链接打不开、或改名后旧文件名仍有残留;原因=改了文件名没同步引用(本次
faq/anti-patterns改名踩过);治法=先Get-ChildItem <dir> -Recurse -Filter *.md | Select-String "旧名"全局搜(本机没装 rg,见 env F4)→ 把 SKILL.md / INDEX.md / rollback.md 的引用一并改完 → 复核目录列表;搜不到内容则按标题从状态目录 rollback.md 重建该节;引用:anti-patterns #6、toolbox.md「改名后必搜旧名」。 - #5 状态文件互相打架:症状=
today/某天文件与 todos.md 对不上(today 记了、todos 还留着;或反过来已完成项没删)、或某文件被覆盖成空;原因=「操作后写回」只更新了部分文件(漏 today 或漏 todos);治法=以 rollback.md「当前安全状态」为准,按 INDEX 逐文件重建 → 先补 todos(决定下一步)再补today/<今天>.md(补记录);不确定就以用户口述为准并标注「据你描述补」;引用:铁则 5、状态规范「六、今日完成/待办」。
默认分支(表外兜底):情况不在上表 → ① 定位(第几步 + 观察到什么,不猜原因)② 保守动作(回最后一份已确认产出的交接处)③ 标注未知(明说「不在已知清单,我按 X 处理」)。
能力边界
- 不触发:纯业务内容生成(那是其他 skill 的活)、改单个 YAML(agent-customization 直接改)、替用户拍板「该不该做」。
- 反触发词:写小说 / 报价单 / 诊断卡 / 具体业务 → 别往这塞。
- 量:一次聚焦 1 个工作台(当前项目);单文件建议 ≤ 200 行,超则拆;一轮只推进 1 个 P0,写完立即写回,不攒着批量补。
- 输入形式兜底(主输入之外的形式怎么接,不拒绝):① 只给一句「记一下 X」→ 直接追加到
today/<今天>.md,不追问细节;② 丢来一段命令 / 日志 / 报错 → 判断是否可复用,是则进 toolbox.md 并附一句用途;③ 只喊「工作台」没说事 → 走「怎么开始」第 ① 类开口(报恢复状态 + 问下一步);④ 明显是别的 skill 的活(写小说 / 报价 / 诊断卡)→ 明说不接 + 指路,不硬套本 skill。
输入 schema(G4)
| 开口类型 | 必填 | 范围 / 格式 | 非法兜底 |
|---|---|---|---|
| 续做型:「工作台,接着干」 | 无参数 | 靠状态目录恢复 | 无存档 → 走探测链、明说没找到 + 问,不静默新建(异常 #1) |
| 记录型:「记一下 X / 加个待办 Y」 | X 或 Y 至少一条 | 一句话文本,日期缺省 = 今天 | 内容空 → 回「要记什么?」;一次多条 → 拆开逐条写,先确认拆分 |
| 查询型:「上次那个命令 / 路径在哪」 | 关键词 ≥1 | 关键词文本 | 查不到 → 明说「paths/toolbox 里没有」,顺手把答案补进 toolbox(不让同一问题问第二次) |
| 操作型:「改文件名 / 建 scripts」 | 目标 + 动作 | 目标路径 + 动作动词 | 目标在工作区外 → 先记回退点 + 走 scripts/(异常 #4 同款) |
输出 schema:状态目录 6 文件 + scripts/,字段见状态规范「一、目录结构」;写回必须 today + todos + rollback 三件一起(异常 #5)。
卡住速查
- 忘了上次干到哪 → 读 INDEX.md +
today/最近日期文件 + todos.md - 找不到某 skill → 查 paths.md,不重新搜全盘
- 状态目录不可写/找不到 → 异常 #1(降级项目级 / 设
$WORKBENCH_HOME) - 状态写进 skill 目录了 → 异常 #2(移回
$HOME/.codebuddy/workbench/) - 改崩回不去 → 异常 #3(查 rollback.md 按回退方式恢复)
- references 链接打不开 / 改名后旧名残留 → 异常 #4(rg 搜旧名,一并改完)
- today 与 todos 对不上 / 文件被覆盖 → 异常 #5(以 rollback.md 安全状态为准重建)
- 又要写一遍某命令 → 查 toolbox.md(有一行调用就直接用
scripts/),没有就干完补 - 表外情况 → 走上方「默认分支」三步
易错点预警(触发时机:每次写回前 + 每次大操作前,各扫一遍)
| 信号(一出现就停) | 一步纠错 | 反模式 |
|---|---|---|
正要往 SKILL.md 写 C:\... 绝对路径 |
改 $HOME / $WORKBENCH_HOME,真实路径只进 paths.md |
#1 |
| 正要记一个踩过的坑 | 先问「换个 skill 还踩吗」——共性进 env.md,个性才进 anti-patterns |
#9 |
| 正要往文档里记一条命令 | 先 Get-Command <工具> 确认本机装了;优先内置命令(本机没 rg → 用 Select-String,已踩 3 处) |
env F4 |
| 正要把 today/todos 写进 skill 目录 | 改写到 $HOME/.codebuddy/workbench/ |
#2 |
| 准备直接删 / 覆盖 / 发版 | 先写 rollback.md 回退点 | #4 |
| 找不到存档,手已经要点「新建」 | 先报 → 再扫候选 → 还找不到就问 | #5 |
| 刚改完某个文件名 | 全量搜旧名并改完:Get-ChildItem <dir> -Recurse -Filter *.md \| Select-String "旧名"(别用 rg) |
#6 |
| 只更新了 today,todos 还没动 | today + todos + rollback 三件一起收尾 | #7 |
术语速查
- 回退点:操作前记的安全状态 + 恢复方式,防「回不了头」
- 关键路径:固化的一次性环境信息(paths.md),避免重复探索
- env(环境档案):环境事实 / 故障档案 / 共性约定的落点(会持续增长)
- 工具箱:可复用命令/片段库(toolbox.md)
- state / 状态目录:本 skill 的运行时数据目录(INDEX + 分文件)
- INDEX:状态目录入口,指引各文件与代码片段
文档关系
- 索引入口(状态目录):
$HOME/.codebuddy/workbench/INDEX.md(运行时由铁则 1 先读;不在 skill 目录内,故不链) - 维护规范(随 skill 分发):references/状态规范.md(多文件结构 + 回退点 + 探测链,纯方法论、不含个人数据)
- 常见问题(随 skill 分发):references/faq.md(高频问答,纯方法论、不含个人数据)
- 反模式(随 skill 分发):references/anti-patterns.md(与异常编号互引,纯方法论、不含个人数据)