@shirlytaylor73/superharness 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (99) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +202 -0
  3. package/bin/lib/codex-installer.js +228 -0
  4. package/bin/lib/interactive-select.js +96 -0
  5. package/bin/superharness.js +67 -0
  6. package/package.json +52 -0
  7. package/plugins/superharness/.claude-plugin/plugin.json +19 -0
  8. package/plugins/superharness/.codex-plugin/plugin.json +31 -0
  9. package/plugins/superharness/.mcp.json +9 -0
  10. package/plugins/superharness/CODE_OF_CONDUCT.md +79 -0
  11. package/plugins/superharness/LICENSE +21 -0
  12. package/plugins/superharness/README.md +57 -0
  13. package/plugins/superharness/agents/code-reviewer.md +48 -0
  14. package/plugins/superharness/archived-skills/using-superpowers/SKILL.md +140 -0
  15. package/plugins/superharness/archived-skills/using-superpowers/references/codex-tools.md +25 -0
  16. package/plugins/superharness/archived-skills/using-superpowers/references/copilot-tools.md +52 -0
  17. package/plugins/superharness/archived-skills/using-superpowers/references/gemini-tools.md +33 -0
  18. package/plugins/superharness/archived-skills/using-superpowers/references/hermes-tools.md +44 -0
  19. package/plugins/superharness/commands/free.md +6 -0
  20. package/plugins/superharness/commands/rollback.md +30 -0
  21. package/plugins/superharness/commands-codex/free.md +29 -0
  22. package/plugins/superharness/commands-codex/rollback.md +33 -0
  23. package/plugins/superharness/hooks/hooks-codex.json +50 -0
  24. package/plugins/superharness/hooks/hooks.json +50 -0
  25. package/plugins/superharness/hooks/lib/free-mode-check.mjs +27 -0
  26. package/plugins/superharness/hooks/run-hook.cmd +58 -0
  27. package/plugins/superharness/hooks/workflow-context +4 -0
  28. package/plugins/superharness/hooks/workflow-context.mjs +184 -0
  29. package/plugins/superharness/hooks/workflow-post-transition +4 -0
  30. package/plugins/superharness/hooks/workflow-post-transition.mjs +89 -0
  31. package/plugins/superharness/hooks/workflow-pre-tool-use +4 -0
  32. package/plugins/superharness/hooks/workflow-pre-tool-use.mjs +97 -0
  33. package/plugins/superharness/hooks/workflow-stop +4 -0
  34. package/plugins/superharness/hooks/workflow-stop.mjs +136 -0
  35. package/plugins/superharness/scripts/rollback.mjs +86 -0
  36. package/plugins/superharness/scripts/set-free-mode.mjs +77 -0
  37. package/plugins/superharness/skills/brainstorming/SKILL.md +182 -0
  38. package/plugins/superharness/skills/brainstorming/scripts/frame-template.html +214 -0
  39. package/plugins/superharness/skills/brainstorming/scripts/helper.js +88 -0
  40. package/plugins/superharness/skills/brainstorming/scripts/server.cjs +338 -0
  41. package/plugins/superharness/skills/brainstorming/scripts/start-server.sh +153 -0
  42. package/plugins/superharness/skills/brainstorming/scripts/stop-server.sh +55 -0
  43. package/plugins/superharness/skills/brainstorming/spec-document-reviewer-prompt.md +49 -0
  44. package/plugins/superharness/skills/brainstorming/visual-companion.md +286 -0
  45. package/plugins/superharness/skills/chinese-code-review/SKILL.md +277 -0
  46. package/plugins/superharness/skills/chinese-commit-conventions/SKILL.md +364 -0
  47. package/plugins/superharness/skills/chinese-documentation/SKILL.md +448 -0
  48. package/plugins/superharness/skills/chinese-git-workflow/SKILL.md +547 -0
  49. package/plugins/superharness/skills/dispatching-parallel-agents/SKILL.md +186 -0
  50. package/plugins/superharness/skills/exploration/SKILL.md +197 -0
  51. package/plugins/superharness/skills/finishing/SKILL.md +200 -0
  52. package/plugins/superharness/skills/intake/SKILL.md +134 -0
  53. package/plugins/superharness/skills/mcp-builder/SKILL.md +255 -0
  54. package/plugins/superharness/skills/parallel-execution/SKILL.md +368 -0
  55. package/plugins/superharness/skills/parallel-execution/implementer-prompt.md +144 -0
  56. package/plugins/superharness/skills/parallel-execution/spec-reviewer-prompt.md +84 -0
  57. package/plugins/superharness/skills/parallel-execution/wave-final-manual-qa-prompt.md +61 -0
  58. package/plugins/superharness/skills/parallel-execution/wave-final-quality-prompt.md +59 -0
  59. package/plugins/superharness/skills/parallel-execution/wave-final-scope-fidelity-prompt.md +69 -0
  60. package/plugins/superharness/skills/parallel-execution/wave-final-spec-prompt.md +56 -0
  61. package/plugins/superharness/skills/planning/SKILL.md +265 -0
  62. package/plugins/superharness/skills/planning/plan-document-reviewer-prompt.md +80 -0
  63. package/plugins/superharness/skills/receiving-code-review/SKILL.md +213 -0
  64. package/plugins/superharness/skills/requesting-code-review/SKILL.md +107 -0
  65. package/plugins/superharness/skills/requesting-code-review/code-reviewer.md +146 -0
  66. package/plugins/superharness/skills/serial-execution/SKILL.md +183 -0
  67. package/plugins/superharness/skills/systematic-debugging/CREATION-LOG.md +119 -0
  68. package/plugins/superharness/skills/systematic-debugging/SKILL.md +320 -0
  69. package/plugins/superharness/skills/systematic-debugging/condition-based-waiting-example.ts +158 -0
  70. package/plugins/superharness/skills/systematic-debugging/condition-based-waiting.md +115 -0
  71. package/plugins/superharness/skills/systematic-debugging/defense-in-depth.md +122 -0
  72. package/plugins/superharness/skills/systematic-debugging/find-polluter.sh +63 -0
  73. package/plugins/superharness/skills/systematic-debugging/root-cause-tracing.md +169 -0
  74. package/plugins/superharness/skills/systematic-debugging/test-academic.md +14 -0
  75. package/plugins/superharness/skills/systematic-debugging/test-pressure-1.md +58 -0
  76. package/plugins/superharness/skills/systematic-debugging/test-pressure-2.md +68 -0
  77. package/plugins/superharness/skills/systematic-debugging/test-pressure-3.md +69 -0
  78. package/plugins/superharness/skills/test-driven-development/SKILL.md +371 -0
  79. package/plugins/superharness/skills/test-driven-development/testing-anti-patterns.md +299 -0
  80. package/plugins/superharness/skills/trivial/SKILL.md +118 -0
  81. package/plugins/superharness/skills/using-git-worktrees/SKILL.md +218 -0
  82. package/plugins/superharness/skills/verification/SKILL.md +139 -0
  83. package/plugins/superharness/skills/workflow-runner/SKILL.md +172 -0
  84. package/plugins/superharness/skills/writing-skills/SKILL.md +655 -0
  85. package/plugins/superharness/skills/writing-skills/anthropic-best-practices.md +1149 -0
  86. package/plugins/superharness/skills/writing-skills/examples/CLAUDE_MD_TESTING.md +189 -0
  87. package/plugins/superharness/skills/writing-skills/graphviz-conventions.dot +172 -0
  88. package/plugins/superharness/skills/writing-skills/persuasion-principles.md +187 -0
  89. package/plugins/superharness/skills/writing-skills/render-graphs.js +168 -0
  90. package/plugins/superharness/skills/writing-skills/testing-skills-with-subagents.md +385 -0
  91. package/plugins/superharness/workflow/default-workflow.yaml +84 -0
  92. package/plugins/superharness/workflow-state-server/bootstrap.js +44 -0
  93. package/plugins/superharness/workflow-state-server/package-lock.json +2853 -0
  94. package/plugins/superharness/workflow-state-server/package.json +22 -0
  95. package/plugins/superharness/workflow-state-server/render-context.js +124 -0
  96. package/plugins/superharness/workflow-state-server/schema.sql +39 -0
  97. package/plugins/superharness/workflow-state-server/server.js +290 -0
  98. package/plugins/superharness/workflow-state-server/state.js +424 -0
  99. package/plugins/superharness/workflow-state-server/validate-workflow.js +165 -0
@@ -0,0 +1,186 @@
1
+ ---
2
+ name: dispatching-parallel-agents
3
+ description: 非 plan 场景下,2+ 个独立任务需要并行派发时使用(典型:多个独立 bug 排查、多文件并行验证、多分支批量重试)。Plan 驱动场景请使用 parallel-execution。
4
+ ---
5
+
6
+ # 并行分派智能体
7
+
8
+ > **如果你正在执行一个 plan(来自 planning),不要用本 skill。**
9
+ > `parallel-execution` 已经原生包含 wave 化并行调度(wave 内并发实现 + wave 间阻塞 gate + Wave FINAL 四审)。
10
+ > 本 skill 用于 plan 之外的临时并行派发场景(多 bug 排查、多文件验证、多分支批量重试等)。
11
+
12
+ ## 概述
13
+
14
+ 你将任务委派给具有隔离上下文的专用智能体。通过精心设计它们的指令和上下文,确保它们专注并成功完成任务。它们不应继承你的会话上下文或历史记录——你要精确构造它们所需的一切。这样也能为你自己保留用于协调工作的上下文。
15
+
16
+ 当你遇到多个不相关的失败(不同的测试文件、不同的子系统、不同的 bug),逐一排查会浪费时间。每个排查都是独立的,可以并行进行。
17
+
18
+ **核心原则:** 每个独立问题域分派一个智能体,让它们并发工作。
19
+
20
+ ## 何时使用
21
+
22
+ ```dot
23
+ digraph when_to_use {
24
+ "存在多个失败?" [shape=diamond];
25
+ "它们是否独立?" [shape=diamond];
26
+ "单个智能体排查所有问题" [shape=box];
27
+ "每个问题域一个智能体" [shape=box];
28
+ "能否并行工作?" [shape=diamond];
29
+ "顺序执行智能体" [shape=box];
30
+ "并行分派" [shape=box];
31
+
32
+ "存在多个失败?" -> "它们是否独立?" [label="是"];
33
+ "它们是否独立?" -> "单个智能体排查所有问题" [label="否 - 有关联"];
34
+ "它们是否独立?" -> "能否并行工作?" [label="是"];
35
+ "能否并行工作?" -> "并行分派" [label="是"];
36
+ "能否并行工作?" -> "顺序执行智能体" [label="否 - 有共享状态"];
37
+ }
38
+ ```
39
+
40
+ **适用场景:**
41
+ - 3 个以上测试文件因不同根因失败
42
+ - 多个子系统独立出现故障
43
+ - 每个问题无需其他问题的上下文即可理解
44
+ - 排查之间无共享状态
45
+
46
+ **不适用场景:**
47
+ - 失败是相关的(修复一个可能修复其他的)
48
+ - 需要理解完整的系统状态
49
+ - 智能体之间会互相干扰
50
+
51
+ ## 模式
52
+
53
+ ### 1. 识别独立的问题域
54
+
55
+ 按故障分组:
56
+ - 文件 A 测试:工具审批流程
57
+ - 文件 B 测试:批量完成行为
58
+ - 文件 C 测试:中止功能
59
+
60
+ 每个问题域是独立的——修复工具审批不会影响中止测试。
61
+
62
+ ### 2. 创建聚焦的智能体任务
63
+
64
+ 每个智能体获得:
65
+ - **明确范围:** 一个测试文件或子系统
66
+ - **清晰目标:** 让这些测试通过
67
+ - **约束条件:** 不修改其他代码
68
+ - **预期输出:** 你发现和修复内容的总结
69
+
70
+ ### 3. 并行分派
71
+
72
+ ```typescript
73
+ // 在 Claude Code / AI 环境中
74
+ Task("修复 agent-tool-abort.test.ts 的失败")
75
+ Task("修复 batch-completion-behavior.test.ts 的失败")
76
+ Task("修复 tool-approval-race-conditions.test.ts 的失败")
77
+ // 三个任务并发运行
78
+ ```
79
+
80
+ ### 4. 审查与集成
81
+
82
+ 当智能体返回时:
83
+ - 阅读每个总结
84
+ - 验证修复之间没有冲突
85
+ - 运行完整测试套件
86
+ - 集成所有更改
87
+
88
+ ## 智能体提示词结构
89
+
90
+ 好的智能体提示词应该是:
91
+ 1. **聚焦的** - 一个清晰的问题域
92
+ 2. **自包含的** - 包含理解问题所需的所有上下文
93
+ 3. **明确输出要求** - 智能体应该返回什么?
94
+
95
+ ```markdown
96
+ 修复 src/agents/agent-tool-abort.test.ts 中 3 个失败的测试:
97
+
98
+ 1. "should abort tool with partial output capture" - 期望消息中包含 'interrupted at'
99
+ 2. "should handle mixed completed and aborted tools" - 快速工具被中止而非完成
100
+ 3. "should properly track pendingToolCount" - 期望 3 个结果但得到 0 个
101
+
102
+ 这些是时序/竞态条件问题。你的任务:
103
+
104
+ 1. 阅读测试文件,理解每个测试验证的内容
105
+ 2. 找到根因——是时序问题还是实际 bug?
106
+ 3. 修复方式:
107
+ - 用基于事件的等待替换任意超时
108
+ - 如果发现中止实现中的 bug 则修复
109
+ - 如果测试的是已变更的行为则调整测试期望
110
+
111
+ 不要只是增加超时时间——找到真正的问题。
112
+
113
+ 返回:你发现了什么以及修复了什么的总结。
114
+ ```
115
+
116
+ ## 常见错误
117
+
118
+ **错误做法:太宽泛:** "修复所有测试" - 智能体会迷失方向
119
+ **正确做法:具体明确:** "修复 agent-tool-abort.test.ts" - 聚焦的范围
120
+
121
+ **错误做法:无上下文:** "修复竞态条件" - 智能体不知道在哪里
122
+ **正确做法:提供上下文:** 粘贴错误信息和测试名称
123
+
124
+ **错误做法:无约束:** 智能体可能会重构所有代码
125
+ **正确做法:设置约束:** "不要修改生产代码" 或 "只修复测试"
126
+
127
+ **错误做法:模糊的输出要求:** "修好它" - 你不知道改了什么
128
+ **正确做法:明确要求:** "返回根因和修改内容的总结"
129
+
130
+ ## 不适用的场景
131
+
132
+ **关联性失败:** 修复一个可能修复其他的——先一起排查
133
+ **需要完整上下文:** 理解问题需要看到整个系统
134
+ **探索性调试:** 你还不知道什么坏了
135
+ **共享状态:** 智能体会互相干扰(编辑同一文件、使用同一资源)
136
+
137
+ ## 实际案例
138
+
139
+ **场景:** 大规模重构后,3 个文件中出现 6 个测试失败
140
+
141
+ **失败情况:**
142
+ - agent-tool-abort.test.ts:3 个失败(时序问题)
143
+ - batch-completion-behavior.test.ts:2 个失败(工具未执行)
144
+ - tool-approval-race-conditions.test.ts:1 个失败(执行计数 = 0)
145
+
146
+ **决策:** 独立的问题域——中止逻辑、批量完成、竞态条件各自独立
147
+
148
+ **分派:**
149
+ ```
150
+ 智能体 1 → 修复 agent-tool-abort.test.ts
151
+ 智能体 2 → 修复 batch-completion-behavior.test.ts
152
+ 智能体 3 → 修复 tool-approval-race-conditions.test.ts
153
+ ```
154
+
155
+ **结果:**
156
+ - 智能体 1:用基于事件的等待替换了超时
157
+ - 智能体 2:修复了事件结构 bug(threadId 位置不对)
158
+ - 智能体 3:添加了等待异步工具执行完成的逻辑
159
+
160
+ **集成:** 所有修复互相独立,无冲突,完整测试套件全部通过
161
+
162
+ **节省的时间:** 3 个问题并行解决 vs 顺序解决
163
+
164
+ ## 核心优势
165
+
166
+ 1. **并行化** - 多个排查同时进行
167
+ 2. **聚焦** - 每个智能体范围窄,需要跟踪的上下文少
168
+ 3. **独立性** - 智能体之间互不干扰
169
+ 4. **速度** - 3 个问题在 1 个问题的时间内解决
170
+
171
+ ## 验证
172
+
173
+ 智能体返回后:
174
+ 1. **审查每个总结** - 理解改了什么
175
+ 2. **检查冲突** - 智能体是否编辑了同一段代码?
176
+ 3. **运行完整套件** - 验证所有修复协同工作
177
+ 4. **抽查** - 智能体可能犯系统性错误
178
+
179
+ ## 实际效果
180
+
181
+ 来自调试会话(2025-10-03):
182
+ - 3 个文件中 6 个失败
183
+ - 并行分派 3 个智能体
184
+ - 所有排查并发完成
185
+ - 所有修复成功集成
186
+ - 智能体之间的更改零冲突
@@ -0,0 +1,197 @@
1
+ ---
2
+ name: exploration
3
+ description: 用于只读深度探索——用户想理解代码是怎么实现的、对比多个方案/库/技术、做技术调研、看 API 用法、追溯一段历史、画依赖图、读源码、看实现细节、回答 "X 是怎么工作的"、"我们能不能用 Y" 这类问题时使用;本状态严格只读,不写代码、不改文件、不跑写命令;产出结构化分析报告,每个结论都引用 file_path:line_number
4
+ metadata:
5
+ type: workflow-state
6
+ ---
7
+
8
+ # Exploration —— 只读深度探索
9
+
10
+ ## 角色
11
+
12
+ 你处于只读探索态。三件事:
13
+
14
+ 1. **读代码、读文档、查外部资料**——回答用户的"是什么 / 怎么实现的 / 能不能 / 区别在哪"
15
+ 2. **结构化输出**——把发现整理成有断言、有证据、有引用的分析报告,而不是流水账
16
+ 3. **守住边界**——一发现需要改代码,立刻 transition 回 intake,**绝不**自己开始改
17
+
18
+ **核心原则:** 探索就是探索。看清楚再下结论,下了结论给证据,**不写代码**。
19
+
20
+ ## 铁律
21
+
22
+ ```
23
+ 不写代码、不改文件、不跑任何会修改状态的命令
24
+ ```
25
+
26
+ 只要你的下一步是 Edit / Write / NotebookEdit / git commit / git push / 任何会落盘或改变外部状态的操作——**停下来**,先 transition_state 回 intake,让 intake 重新路由。
27
+
28
+ **违反铁律的字面意思就是违反铁律的精神。** "我就改一行试试" / "我顺手把 typo 修了" / "我只是验证一下假设所以跑一下" 都不行。
29
+
30
+ ## 何时使用
31
+
32
+ **典型触发场景:**
33
+
34
+ - "X 是怎么实现的?" / "X 是什么?"
35
+ - "我们能不能用 Y 库 / Y 方案?"
36
+ - "A 和 B 的区别 / 取舍是什么?"
37
+ - "这段代码为什么这么写?" / "为什么不这样做?"
38
+ - "找出所有用到 X 的地方"
39
+ - "画一下 X 模块的依赖关系"
40
+ - "查一下 API Z 的用法 / 行为"
41
+ - "调研一下 N 个方案"
42
+
43
+ **不适用的场景:**
44
+
45
+ - 用户明确说"改一下" / "修个 bug" / "加个功能"——回 intake,让 intake 路由到 trivial 或 brainstorming
46
+ - 用户只是问一句话的概念问题("什么是 SQLite WAL 模式")——在 intake 里直接回答即可,不必切到 exploration
47
+ - 探索做完了想顺便改——回 intake,**不要**在 exploration 里改
48
+
49
+ ## 工具白名单
50
+
51
+ **允许:**
52
+
53
+ - `Read`(读任意文件)
54
+ - `Grep` / `Glob`(搜代码)
55
+ - `WebFetch` / `WebSearch`(查外部文档、对比方案、找参考实现)
56
+ - `Bash` **只读子集**:`ls`、`cat`、`head`、`tail`、`wc`、`stat`、`file`、`tree`、`pwd`
57
+ - `Bash` **只读 git**:`git log`、`git show`、`git diff`(不带 `--apply`)、`git blame`、`git status`、`git rev-parse`、`git ls-files`、`git branch --list`、`git tag --list`
58
+ - 同理只读 sqlite:`sqlite3 <db> .schema` / `sqlite3 <db> "SELECT ..."`
59
+
60
+ **禁止:**
61
+
62
+ - `Edit` / `Write` / `NotebookEdit`——任何写文件
63
+ - 任何形式的 `git commit` / `git add` / `git push` / `git checkout <branch>` / `git merge` / `git rebase` / `git stash` / `git reset`
64
+ - `Bash` 写命令:`>`、`>>`、`tee`、`rm`、`mv`、`cp`(目标侧写)、`mkdir`、`touch`、`chmod`、`chown`、`sed -i`、任何 `--write` / `--fix` / `--apply` 类参数
65
+ - 任何 `npm install` / `pip install` / `cargo build` / `make` 等会产生构建产物或修改 lockfile 的命令
66
+ - 调用 superharness MCP 的 `transition_state` 以外的写工具?**没有这类工具**——你只在转出的时候用 `transition_state`,其余时间不调用任何修改 superharness 状态的工具
67
+
68
+ **判断规则:** 不确定一条命令属于读还是写?把它当成写,停下来想清楚。如果一条命令既能读也能写(如 `git checkout <file>` 会还原文件),它就是写命令。
69
+
70
+ ## 输出规范
71
+
72
+ **最终交付物是一份结构化分析报告**,不是聊天流水。
73
+
74
+ ### 结构
75
+
76
+ ```markdown
77
+ ## 结论 / 摘要
78
+ (2-5 句话,直接答用户的问题)
79
+
80
+ ## 证据
81
+ (按发现的子主题分段,每段都有引用)
82
+
83
+ ### 子主题 1: <名字>
84
+ - 观察 1:<断言> —— `plugins/superharness/workflow-state-server/state.js:42-58`
85
+ - 观察 2:<断言> —— `docs/superharness/specs/2026-05-19-state-machine-v3-design.md:62`
86
+ - 引用外部文档:<断言> —— [vitest run modes](https://vitest.dev/guide/cli.html)(WebFetch 摘录)
87
+
88
+ ### 子主题 2: <名字>
89
+ ...
90
+
91
+ ## 反驳 / 边界条件
92
+ (哪些场景下结论不成立,或者你看不到证据的死角)
93
+
94
+ ## 建议下一步
95
+ (如果用户接下来要做什么,应该 transition 到哪个状态——但你不替用户做决定,由 intake 路由)
96
+ ```
97
+
98
+ ### 引用规范
99
+
100
+ - **每个断言都要有证据**。证据 = 代码引用 `file_path:line_number` 或 `file_path:line_start-line_end`,或外部链接 + 摘录
101
+ - **断言和证据明确分开**:先说结论,再贴引用;不要把"我打开了 X 文件,看到 Y,然后我又..."这种叙事当报告
102
+ - **不知道就说不知道**:找不到证据 → 写"未找到 / 推测,未验证",不要硬编
103
+
104
+ ### 反模式(不要这样)
105
+
106
+ ```
107
+ 我看了一下 state.js,发现里面有一个 openWorkflowStateStore 函数,然后我又看了一下
108
+ schema.sql,里面有两张表。然后 init.js 里调用了 openWorkflowStateStore。然后我觉得...
109
+ ```
110
+
111
+ ```markdown
112
+ ## 结论
113
+ workflow-state DB 由 `openWorkflowStateStore` 单点初始化,schema 写死两张表。
114
+
115
+ ## 证据
116
+ - `state.js:openWorkflowStateStore` 通过 `bun:sqlite` / `better-sqlite3` 二选一打开数据库 —— `plugins/superharness/workflow-state-server/state.js:88-104`
117
+ - Schema 文件定义两张表:`workflow_state` 和 `workflow_transition_log` —— `plugins/superharness/workflow-state-server/schema.sql:1-30`
118
+ - MCP server 启动时调用一次 `openWorkflowStateStore` —— `plugins/superharness/workflow-state-server/server.js:55`
119
+ ```
120
+
121
+ ## 完成后路径
122
+
123
+ **唯一的出口是 transition 回 `intake`。** exploration 没有"直接跳别处"这条边。
124
+
125
+ | 触发条件 | 行动 |
126
+ |---|---|
127
+ | 用户表示问题答完 / 满足 | `transition_state` → `intake`,reason 写"探索完成 + 主要结论 1 句话" |
128
+ | 用户改主意要写代码 | `transition_state` → `intake`,reason 写"探索中用户要求改代码,回 intake 重新路由"。**不要**自己跳 trivial 或 brainstorming |
129
+ | 探索过程中发现必须改代码才能继续验证假设 | `transition_state` → `intake`,reason 写"探索遇阻,需写代码验证,回 intake" |
130
+ | 用户问了新问题但还是只读 | 留在 exploration 继续 |
131
+
132
+ **为什么不能从 exploration 直接跳 trivial / brainstorming?** intake 是单一路由器。让 intake 重新判断范围(这次的需求是小改还是新功能),避免 exploration 里塞一份并行的"是否升级"判断逻辑,保持路由集中。
133
+
134
+ ## 边界守护:守住"只读"
135
+
136
+ ### 红线 —— 出现以下任一念头立刻停下
137
+
138
+ - "让我改一下 X 看看效果"
139
+ - "我先把这个 typo 顺手修了"
140
+ - "我加个 console.log 试试"(这也是写)
141
+ - "我跑一下 `npm install` 看看依赖能不能装"(修改 lockfile)
142
+ - "我 checkout 一下别的分支看看"(动了 working tree)
143
+ - "我建个临时文件存一下笔记"(写文件)
144
+ - "反正就跑一次,影响小"
145
+
146
+ **以上每一条都意味着:你即将违反铁律。** 处理方式:
147
+
148
+ 1. 停下当前操作
149
+ 2. `transition_state` → `intake`
150
+ 3. 在 reason 里说明"探索中需要执行 <某动作>,已超出只读范围,回 intake 重新路由"
151
+
152
+ ### 常见合理化借口
153
+
154
+ | 借口 | 现实 |
155
+ |---|---|
156
+ | "只是改一行,不算改代码" | 一行也是改。回 intake 让 trivial 接手才有审计。 |
157
+ | "我先在沙盒里试试" | 沙盒 = 写文件。不允许。用 Read + WebFetch 查文档替代。 |
158
+ | "用户没说不让我改" | 用户进 exploration 就是要求你只读。默认禁止 = 显式禁止。 |
159
+ | "改完马上还原,不会留痕" | git 历史会留痕。working tree 状态会变。不允许。 |
160
+ | "这是为用户好——少切一次态" | 路由集中的价值高于省一次切态。回 intake。 |
161
+ | "我就 commit 个 WIP 防止丢" | exploration 不应该有 "WIP" ——你没写东西。报告写在响应里,不写文件。 |
162
+
163
+ ### 探索笔记往哪写?
164
+
165
+ **写在你给用户的响应里**,不写本地文件。如果报告很长,分段输出在对话里。
166
+
167
+ 需要长期保留分析结果?那是另一个任务——回 intake,让 intake 路由到 trivial(创建一份 `docs/.../<topic>.md`)。在 exploration 内部不允许落盘。
168
+
169
+ ## 速查表
170
+
171
+ | 我想做的事 | 在 exploration 允许吗? | 不允许的话怎么办 |
172
+ |---|---|---|
173
+ | 读源码、文档 | ✓ | —— |
174
+ | Grep / Glob 搜代码 | ✓ | —— |
175
+ | WebFetch / WebSearch 查外部资料 | ✓ | —— |
176
+ | `git log` / `git show` / `git diff` | ✓ | —— |
177
+ | `sqlite3 <db> .schema` 看 schema | ✓ | —— |
178
+ | `sqlite3 <db> "SELECT ..."` 只读查询 | ✓ | —— |
179
+ | 改一行代码 | ✗ | transition 回 intake |
180
+ | 加 console.log 调试 | ✗ | transition 回 intake,让 intake 路由 trivial |
181
+ | `npm install` 装依赖 | ✗ | transition 回 intake |
182
+ | `git checkout <分支>` | ✗ | transition 回 intake |
183
+ | 写笔记到 .md 文件 | ✗ | 写在对话响应里 |
184
+ | 报告分析结论给用户 | ✓ | —— |
185
+ | 在报告里建议下一步 | ✓ | —— |
186
+ | 在报告里替用户决定要不要改 | ✗ | 让 intake 路由 |
187
+
188
+ ## 常见错误
189
+
190
+ | 错误 | 修复 |
191
+ |---|---|
192
+ | 报告写成 "我看了 A,又看了 B" 流水账 | 改成 "结论 X,证据:A:line / B:line" |
193
+ | 断言没有 `file_path:line_number` | 补上引用;找不到证据就标"未验证" |
194
+ | 一边探索一边偷偷改了一个 typo | 立刻 transition 回 intake,在 reason 里如实记录"已修改 <文件>,请 intake 路由 trivial 继续" |
195
+ | 探索完毕直接跳 brainstorming | 错。回 intake。 |
196
+ | 在 exploration 里 commit 笔记 | 错。把笔记放在响应里。 |
197
+ | 跑了 `npm test`(会落盘 coverage 报告) | 边界 case。如果你启用了 coverage 写出,就算写。优先看 CI 历史 / 读 test 文件本身。 |
@@ -0,0 +1,200 @@
1
+ ---
2
+ name: finishing
3
+ description: 当实现完成、所有测试通过、需要决定如何集成工作时使用——通过提供合并、PR 或清理等结构化选项来引导开发工作的收尾
4
+ ---
5
+
6
+ # 完成开发分支
7
+
8
+ ## 概述
9
+
10
+ 通过提供清晰的选项并执行所选工作流来引导开发工作的收尾。
11
+
12
+ **核心原则:** 验证测试 → 展示选项 → 执行选择 → 清理。
13
+
14
+ **开始时宣布:** "我正在使用 finishing 技能来完成这项工作。"
15
+
16
+ ## 流程
17
+
18
+ ### 步骤 1:验证测试
19
+
20
+ **在展示选项之前,验证测试通过:**
21
+
22
+ ```bash
23
+ # 运行项目的测试套件
24
+ npm test / cargo test / pytest / go test ./...
25
+ ```
26
+
27
+ **如果测试失败:**
28
+ ```
29
+ 测试失败(<N> 个失败)。必须先修复才能继续:
30
+
31
+ [显示失败信息]
32
+
33
+ 在测试通过之前无法进行合并/PR。
34
+ ```
35
+
36
+ 停止。不要继续到步骤 2。
37
+
38
+ **如果测试通过:** 继续步骤 2。
39
+
40
+ ### 步骤 2:确定基础分支
41
+
42
+ ```bash
43
+ # 尝试常见的基础分支
44
+ git merge-base HEAD main 2>/dev/null || git merge-base HEAD master 2>/dev/null
45
+ ```
46
+
47
+ 或者询问:"这个分支是从 main 分出来的——对吗?"
48
+
49
+ ### 步骤 3:展示选项
50
+
51
+ 展示以下 4 个选项:
52
+
53
+ ```
54
+ 实现已完成。你想怎么做?
55
+
56
+ 1. 在本地合并回 <base-branch>
57
+ 2. 推送并创建 Pull Request
58
+ 3. 保持分支现状(我稍后处理)
59
+ 4. 丢弃这项工作
60
+
61
+ 选哪个?
62
+ ```
63
+
64
+ **不要添加解释** - 保持选项简洁。
65
+
66
+ ### 步骤 4:执行选择
67
+
68
+ #### 选项 1:本地合并
69
+
70
+ ```bash
71
+ # 切换到基础分支
72
+ git checkout <base-branch>
73
+
74
+ # 拉取最新代码
75
+ git pull
76
+
77
+ # 合并功能分支
78
+ git merge <feature-branch>
79
+
80
+ # 在合并结果上验证测试
81
+ <test command>
82
+
83
+ # 如果测试通过
84
+ git branch -d <feature-branch>
85
+ ```
86
+
87
+ 然后:清理工作树(步骤 5)
88
+
89
+ #### 选项 2:推送并创建 PR
90
+
91
+ ```bash
92
+ # 推送分支
93
+ git push -u origin <feature-branch>
94
+
95
+ # 创建 PR
96
+ gh pr create --title "<title>" --body "$(cat <<'EOF'
97
+ ## 摘要
98
+ <2-3 条变更要点>
99
+
100
+ ## 测试计划
101
+ - [ ] <验证步骤>
102
+ EOF
103
+ )"
104
+ ```
105
+
106
+ 然后:清理工作树(步骤 5)
107
+
108
+ #### 选项 3:保持现状
109
+
110
+ 报告:"保留分支 <name>。工作树保留在 <path>。"
111
+
112
+ **不要清理工作树。**
113
+
114
+ #### 选项 4:丢弃
115
+
116
+ **先确认:**
117
+ ```
118
+ 这将永久删除:
119
+ - 分支 <name>
120
+ - 所有提交:<commit-list>
121
+ - 工作树 <path>
122
+
123
+ 输入 'discard' 确认。
124
+ ```
125
+
126
+ 等待精确的确认。
127
+
128
+ 确认后:
129
+ ```bash
130
+ git checkout <base-branch>
131
+ git branch -D <feature-branch>
132
+ ```
133
+
134
+ 然后:清理工作树(步骤 5)
135
+
136
+ ### 步骤 5:清理工作树
137
+
138
+ **对于选项 1、2、4:**
139
+
140
+ 检查是否在工作树中:
141
+ ```bash
142
+ git worktree list | grep $(git branch --show-current)
143
+ ```
144
+
145
+ 如果是:
146
+ ```bash
147
+ git worktree remove <worktree-path>
148
+ ```
149
+
150
+ **对于选项 3:** 保留工作树。
151
+
152
+ ## 快速参考
153
+
154
+ | 选项 | 合并 | 推送 | 保留工作树 | 清理分支 |
155
+ |------|------|------|-----------|---------|
156
+ | 1. 本地合并 | ✓ | - | - | ✓ |
157
+ | 2. 创建 PR | - | ✓ | ✓ | - |
158
+ | 3. 保持现状 | - | - | ✓ | - |
159
+ | 4. 丢弃 | - | - | - | ✓(强制) |
160
+
161
+ ## 常见错误
162
+
163
+ **跳过测试验证**
164
+ - **问题:** 合并损坏的代码、创建失败的 PR
165
+ - **修复:** 在提供选项前始终验证测试
166
+
167
+ **开放式问题**
168
+ - **问题:** "接下来该做什么?" → 含糊不清
169
+ - **修复:** 准确展示 4 个结构化选项
170
+
171
+ **自动清理工作树**
172
+ - **问题:** 在可能还需要工作树时就删除了(选项 2、3)
173
+ - **修复:** 只在选项 1 和 4 时清理
174
+
175
+ **丢弃时不确认**
176
+ - **问题:** 意外删除工作成果
177
+ - **修复:** 要求输入 "discard" 确认
178
+
179
+ ## 红线
180
+
181
+ **绝不:**
182
+ - 在测试失败时继续
183
+ - 合并前不验证测试结果
184
+ - 不确认就删除工作成果
185
+ - 未经明确请求就强制推送
186
+
187
+ **始终:**
188
+ - 在提供选项前验证测试
189
+ - 准确展示 4 个选项
190
+ - 选项 4 要求输入确认
191
+ - 只在选项 1 和 4 时清理工作树
192
+
193
+ ## 集成
194
+
195
+ **被以下技能调用:**
196
+ - **parallel-execution**(步骤 7)- 所有任务完成后
197
+ - **serial-execution**(步骤 5)- 所有批次完成后
198
+
199
+ **配合使用:**
200
+ - **using-git-worktrees** - 清理由该技能创建的工作树