@flyin-ai/alloy 0.1.0 → 0.2.0-beta.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 (122) hide show
  1. package/README.md +28 -90
  2. package/commands/alloy/apply.md +274 -119
  3. package/commands/alloy/archive.md +116 -60
  4. package/commands/alloy/discard.md +57 -15
  5. package/commands/alloy/finish.md +92 -70
  6. package/commands/alloy/fix.md +282 -53
  7. package/commands/alloy/plan.md +125 -63
  8. package/commands/alloy/references/interaction-style.md +82 -0
  9. package/commands/alloy/references/main-branch-detection.md +32 -0
  10. package/commands/alloy/references/phase-routing.md +21 -0
  11. package/commands/alloy/references/skill-precheck.md +46 -0
  12. package/commands/alloy/start.md +167 -64
  13. package/commands/alloy/status.md +1 -1
  14. package/dist/cli/commands/doctor.d.ts +1 -0
  15. package/dist/cli/commands/doctor.js +28 -6
  16. package/dist/cli/commands/doctor.js.map +1 -1
  17. package/dist/cli/commands/init.js +40 -37
  18. package/dist/cli/commands/init.js.map +1 -1
  19. package/dist/cli/commands/internal/config.d.ts +1 -0
  20. package/dist/cli/commands/internal/config.js +45 -0
  21. package/dist/cli/commands/internal/config.js.map +1 -0
  22. package/dist/cli/commands/internal/guard.js +2 -41
  23. package/dist/cli/commands/internal/guard.js.map +1 -1
  24. package/dist/cli/commands/internal/record.js +10 -47
  25. package/dist/cli/commands/internal/record.js.map +1 -1
  26. package/dist/cli/commands/internal/skill-usage.d.ts +1 -0
  27. package/dist/cli/commands/internal/skill-usage.js +78 -0
  28. package/dist/cli/commands/internal/skill-usage.js.map +1 -0
  29. package/dist/cli/commands/internal/state.js +105 -6
  30. package/dist/cli/commands/internal/state.js.map +1 -1
  31. package/dist/cli/commands/status.d.ts +1 -0
  32. package/dist/cli/commands/status.js +50 -11
  33. package/dist/cli/commands/status.js.map +1 -1
  34. package/dist/cli/commands/update.js +20 -17
  35. package/dist/cli/commands/update.js.map +1 -1
  36. package/dist/cli/index.js +73 -31
  37. package/dist/cli/index.js.map +1 -1
  38. package/dist/cli/utils/hash.d.ts +3 -0
  39. package/dist/cli/utils/hash.js +42 -0
  40. package/dist/cli/utils/hash.js.map +1 -0
  41. package/dist/cli/utils/state.d.ts +4 -2
  42. package/dist/cli/utils/state.js +34 -2
  43. package/dist/cli/utils/state.js.map +1 -1
  44. package/dist/core/artifacts.d.ts +3 -0
  45. package/dist/core/artifacts.js +45 -0
  46. package/dist/core/artifacts.js.map +1 -0
  47. package/dist/core/detect-installations.d.ts +19 -0
  48. package/dist/core/detect-installations.js +65 -0
  49. package/dist/core/detect-installations.js.map +1 -0
  50. package/dist/core/openspec.d.ts +2 -1
  51. package/dist/core/openspec.js +30 -12
  52. package/dist/core/openspec.js.map +1 -1
  53. package/dist/core/skills.js +16 -0
  54. package/dist/core/skills.js.map +1 -1
  55. package/dist/core/superpowers.d.ts +8 -1
  56. package/dist/core/superpowers.js +60 -13
  57. package/dist/core/superpowers.js.map +1 -1
  58. package/dist/core/types.d.ts +20 -0
  59. package/dist/utils/format.d.ts +31 -0
  60. package/dist/utils/format.js +101 -0
  61. package/dist/utils/format.js.map +1 -0
  62. package/dist/utils/output.d.ts +16 -0
  63. package/dist/utils/output.js +38 -0
  64. package/dist/utils/output.js.map +1 -0
  65. package/dist/utils/prompt.d.ts +0 -1
  66. package/dist/utils/prompt.js +11 -83
  67. package/dist/utils/prompt.js.map +1 -1
  68. package/openspec/schemas/alloy/instructions/retrospective.md +17 -35
  69. package/openspec/schemas/alloy/templates/design.md +2 -0
  70. package/openspec/schemas/alloy/templates/draft.md +2 -0
  71. package/openspec/schemas/alloy/templates/plans.md +2 -0
  72. package/openspec/schemas/alloy/templates/proposal.md +2 -0
  73. package/openspec/schemas/alloy/templates/retrospective.md +39 -19
  74. package/openspec/schemas/alloy/templates/specs.md +2 -0
  75. package/openspec/schemas/alloy/templates/tasks.md +2 -0
  76. package/package.json +10 -3
  77. package/vendor/superpowers/skills/brainstorming/SKILL.md +164 -0
  78. package/vendor/superpowers/skills/brainstorming/scripts/frame-template.html +214 -0
  79. package/vendor/superpowers/skills/brainstorming/scripts/helper.js +88 -0
  80. package/vendor/superpowers/skills/brainstorming/scripts/server.cjs +354 -0
  81. package/vendor/superpowers/skills/brainstorming/scripts/start-server.sh +148 -0
  82. package/vendor/superpowers/skills/brainstorming/scripts/stop-server.sh +56 -0
  83. package/vendor/superpowers/skills/brainstorming/spec-document-reviewer-prompt.md +49 -0
  84. package/vendor/superpowers/skills/brainstorming/visual-companion.md +287 -0
  85. package/vendor/superpowers/skills/dispatching-parallel-agents/SKILL.md +182 -0
  86. package/vendor/superpowers/skills/executing-plans/SKILL.md +70 -0
  87. package/vendor/superpowers/skills/finishing-a-development-branch/SKILL.md +251 -0
  88. package/vendor/superpowers/skills/receiving-code-review/SKILL.md +213 -0
  89. package/vendor/superpowers/skills/requesting-code-review/SKILL.md +103 -0
  90. package/vendor/superpowers/skills/requesting-code-review/code-reviewer.md +168 -0
  91. package/vendor/superpowers/skills/subagent-driven-development/SKILL.md +279 -0
  92. package/vendor/superpowers/skills/subagent-driven-development/code-quality-reviewer-prompt.md +25 -0
  93. package/vendor/superpowers/skills/subagent-driven-development/implementer-prompt.md +113 -0
  94. package/vendor/superpowers/skills/subagent-driven-development/spec-reviewer-prompt.md +61 -0
  95. package/vendor/superpowers/skills/systematic-debugging/CREATION-LOG.md +119 -0
  96. package/vendor/superpowers/skills/systematic-debugging/SKILL.md +296 -0
  97. package/vendor/superpowers/skills/systematic-debugging/condition-based-waiting-example.ts +158 -0
  98. package/vendor/superpowers/skills/systematic-debugging/condition-based-waiting.md +115 -0
  99. package/vendor/superpowers/skills/systematic-debugging/defense-in-depth.md +122 -0
  100. package/vendor/superpowers/skills/systematic-debugging/find-polluter.sh +63 -0
  101. package/vendor/superpowers/skills/systematic-debugging/root-cause-tracing.md +169 -0
  102. package/vendor/superpowers/skills/systematic-debugging/test-academic.md +14 -0
  103. package/vendor/superpowers/skills/systematic-debugging/test-pressure-1.md +58 -0
  104. package/vendor/superpowers/skills/systematic-debugging/test-pressure-2.md +68 -0
  105. package/vendor/superpowers/skills/systematic-debugging/test-pressure-3.md +69 -0
  106. package/vendor/superpowers/skills/test-driven-development/SKILL.md +371 -0
  107. package/vendor/superpowers/skills/test-driven-development/testing-anti-patterns.md +299 -0
  108. package/vendor/superpowers/skills/using-git-worktrees/SKILL.md +215 -0
  109. package/vendor/superpowers/skills/using-superpowers/SKILL.md +117 -0
  110. package/vendor/superpowers/skills/using-superpowers/references/codex-tools.md +59 -0
  111. package/vendor/superpowers/skills/using-superpowers/references/copilot-tools.md +42 -0
  112. package/vendor/superpowers/skills/using-superpowers/references/gemini-tools.md +51 -0
  113. package/vendor/superpowers/skills/verification-before-completion/SKILL.md +139 -0
  114. package/vendor/superpowers/skills/writing-plans/SKILL.md +152 -0
  115. package/vendor/superpowers/skills/writing-plans/plan-document-reviewer-prompt.md +49 -0
  116. package/vendor/superpowers/skills/writing-skills/SKILL.md +655 -0
  117. package/vendor/superpowers/skills/writing-skills/anthropic-best-practices.md +1150 -0
  118. package/vendor/superpowers/skills/writing-skills/examples/CLAUDE_MD_TESTING.md +189 -0
  119. package/vendor/superpowers/skills/writing-skills/graphviz-conventions.dot +172 -0
  120. package/vendor/superpowers/skills/writing-skills/persuasion-principles.md +187 -0
  121. package/vendor/superpowers/skills/writing-skills/render-graphs.js +168 -0
  122. package/vendor/superpowers/skills/writing-skills/testing-skills-with-subagents.md +384 -0
@@ -1,38 +1,63 @@
1
1
  ---
2
2
  name: "Alloy: Fix"
3
- description: Alloy Bug 修复入口 - 诊断 环境感知 → 分流
3
+ description: Alloy Bug 修复入口 - 发现 bug 时调用
4
4
  category: Workflow
5
5
  tags: [alloy, workflow]
6
6
  ---
7
7
 
8
8
  # alloy-fix
9
9
 
10
- 你是 Alloy 的 Bug 修复入口。你的职责是:感知当前环境、系统化诊断问题根因、根据是否需要变更 spec 进行分流。
10
+ 你是 Alloy 的 Bug 修复入口。你的职责是:感知当前环境、系统化诊断问题根因、根据是否需要变更 spec 进行分流,确认是代码 bug 后按 change 状态选择修复分支。
11
+
12
+ **核心原则:诊断先行——先判断是代码 bug 还是 spec 变更;分支后置——确认是代码 bug 后才选择分支策略。**
13
+
14
+ **交互风格:** 诊断确认、分支选择、合并确认使用 `AskUserQuestion` 工具。详见 `commands/alloy/references/interaction-style.md`。
11
15
 
12
16
  **调用外部命令或技能前,先输出标题和状态描述,再执行操作。**
13
17
 
18
+ ---
19
+
14
20
  **什么算"fix 诊断不到位"(反例):**
15
21
  - 没跑 systematic-debugging 就凭直觉修——"一看就知道是哪的问题"——根因可能完全错误
16
22
  - 诊断出需改 spec 但直接修代码不改 spec——spec 和代码从此分叉,下次换人(换 session)就断片
17
- - 已有代码落地但并入当前 change——混入已有 change,后续 audit 无法追溯"这个 spec 变更是因为修 bug"
23
+ - spec 变更直接硬改代码——需求问题伪装成 bug 修复,后续 audit 无法追溯
18
24
 
19
- ---
25
+ **什么算"分支策略选错"(反例):**
26
+ - 在已 finish 的 change 上继续修——change 已交付,混入新修复破坏审计链
27
+ - 无归属 change 时直接在 main 上修——热修没有隔离分支,出问题无法回滚
28
+ - hotfix 分支不合并就丢弃——修复丢失,线上问题依然存在
29
+
30
+ ### Red Flags——STOP,不要继续
31
+
32
+ 以下任何一个念头出现,都意味着流程正在被绕过:
33
+
34
+ | 借口 | 现实 |
35
+ |------|------|
36
+ | "就在 main 上修吧,反正就改一行" | 一行还是千行,保护等级完全一样。main 被污染 = 所有人受影响。建分支只需 2 秒。 |
37
+ | "我知道 bug 在哪,不用诊断" | "一看就知道"是 bug 修复中最危险的错觉。跳诊的坏账率极高——修错地方 → 引入新 bug → 回滚 → 重新排查。必须跑 systematic-debugging。 |
38
+ | "用户很确定跟我说是 X 的问题" | 没有堆栈和复现步骤的"诊断"只是猜测。证据驱动,不信任任何人的判断(包括自己和用户)。 |
39
+ | "继续在 login-feature 上修就行,代码就在那" | 代码在 main 上,不在 feature 分支上。finished 是终态——已交付的 change 混入新修复破坏审计链。 |
40
+ | "需求不对,我顺便改下 spec" | spec 问题 = 新 change。修复过程中发现 spec 问题 → 不阻断当前修复,完成后提示开新 change。 |
20
41
 
21
42
  ## 前置检查
22
43
 
23
44
  在进入诊断前,先校验环境和权限:
24
45
 
25
- **1. Skill 预检:** 确认以下 3 个技能可用(缺一 STOP):
26
- - `superpowers:systematic-debugging` 根因诊断
27
- - `superpowers:test-driven-development` — 修复流程
28
- - `superpowers:verification-before-completion` 验证修复
46
+ **1. Skill 预检:** 确认以下依赖可用:
47
+ skill: systematic-debugging test-driven-development verification-before-completion
48
+
49
+ 读取 `commands/alloy/references/skill-precheck.md` 了解检测方法。任一缺失 → 输出缺失列表 → 引导 `alloy init` → STOP。
29
50
 
30
- 任一缺失 输出缺失列表 引导 `alloy init` → STOP。
51
+ **2. Phase 校验与场景标记:** 若检测到活跃 change 的 `.alloy.yaml`,读取 phase 并标记修复场景:
31
52
 
32
- **2. Phase 校验:** 若检测到活跃 change `.alloy.yaml`,读取 phase
33
- - phase = `archived` ⚠️ "该 change 已归档,spec 已封存。如果修复需要改 spec,应开新 change。继续修复(不改 spec)?"
34
- - phase = `finished` → ⚠️ " change 已完成。建议开新 change 而非在此 change 上修复。"
35
- - 不阻断——fix 命令的用户可能不在任何 change 上下文中,仅做知情提示。
53
+ - phase = `applied` worktree 存在 → 标记"场景 1worktree 内修复"
54
+ - phase = `applied` worktree 已清理 标记"场景 2:feature 分支修复"
55
+ - phase = `planned` → 标记"场景 2:feature 分支修复"
56
+ - phase = `archived` 且 worktree 已清理 → 标记"场景 3:热修候选"
57
+ - phase = `finished` → 标记"场景 3:热修候选"
58
+ - 无活跃 change → 标记"场景 3:热修候选"
59
+
60
+ 不阻断——fix 命令的用户可能不在任何 change 上下文中,仅做知情提示。
36
61
 
37
62
  ---
38
63
 
@@ -41,23 +66,42 @@ Alloy · Bug 修复
41
66
  ──────────────────────────────────────
42
67
  ```
43
68
 
44
- ## Step 1/3:环境感知
69
+ ### [Step 1/3] 环境感知
45
70
 
46
71
  ```
47
72
  [Step 1/3] 环境感知
48
73
  ──────────────────────────────────────
49
74
  ```
50
75
 
51
- 检测当前工作位置,告知用户操作位置(不自动跳转):
76
+ 检测当前工作环境,供后续步骤使用:
77
+
78
+ ```bash
79
+ # 检测是否在 worktree 中
80
+ GIT_DIR=$(cd "$(git rev-parse --git-dir)" 2>/dev/null && pwd -P)
81
+ GIT_COMMON=$(cd "$(git rev-parse --git-common-dir)" 2>/dev/null && pwd -P)
82
+ IN_WORKTREE=$([ "$GIT_DIR" != "$GIT_COMMON" ] && echo "true" || echo "false")
52
83
 
53
- - **在 worktree 内** → "当前在 worktree `<path>`,在此修复并提交"
54
- - **不在 worktree** → "在当前分支 `<branch>` 修复并提交"
84
+ # 检测活跃 change
85
+ alloy status --json 2>/dev/null
55
86
 
56
- 如果检测到当前目录下有活跃 change 的 `.alloy.yaml`,读取 phase 信息,供 Step 3 分流使用。
87
+ # 读取主分支配置(供场景 3 使用)
88
+ alloy _config read . main_branch 2>/dev/null
89
+ ```
90
+
91
+ 输出环境摘要:
92
+
93
+ ```
94
+ 当前分支: <branch>
95
+ Worktree: <是/否>(<path>)
96
+ 活跃 change: <name>(phase: <phase>)/ 无
97
+ 主分支: <main_branch> / 待确认
98
+ ```
99
+
100
+ 如果检测到活跃 change,结合 Phase 校验的场景标记,在输出中标注场景编号,供 Step 3 使用。
57
101
 
58
102
  ---
59
103
 
60
- ## Step 2/3:根因诊断
104
+ ### [Step 2/3] 根因诊断
61
105
 
62
106
  ```
63
107
  [Step 2/3] 根因诊断 · superpowers:systematic-debugging
@@ -66,74 +110,259 @@ Alloy · Bug 修复
66
110
  正在系统化诊断问题...
67
111
  ```
68
112
 
69
- 使用 Skill 工具加载 `superpowers:systematic-debugging` 技能。禁止跳过此步骤。
113
+ 使用 Skill 工具加载 `superpowers:systematic-debugging` 技能。禁止跳过此步骤——普通对话无法替代系统化调试方法论(复现 → 假设 → 验证 → 定位)。
114
+
115
+ 如果 `superpowers:systematic-debugging` 不可用,引导用户运行 `alloy init` 完成环境初始化。
70
116
 
71
- 如果 `superpowers:systematic-debugging` 不可用,引导用户运行 `alloy init` 完成环境初始化。系统化调试技能有自己的诊断流程(复现 → 假设 → 验证 → 定位),普通对话无法替代这种方法论。
117
+ **技能加载后立即记录:**
118
+ ```bash
119
+ alloy _skill log openspec/changes/<name> fix superpowers:systematic-debugging
120
+ ```
72
121
 
73
122
  诊断必须产出一个明确的结论:**根因是什么、涉及哪些文件、是否偏离了现有 spec。**
74
123
 
75
- ---
124
+ **诊断确认与分流(阻塞点):**
76
125
 
77
- ## Step 3/3:分流修复
126
+ 展示诊断结论,使用 `AskUserQuestion` 让用户确认(非 Claude Code 平台降级为文本选项):
78
127
 
79
- 根据诊断结果走以下两个路径之一。分流的关键问题是:**修复是否需要修改 spec?**
128
+ > 诊断结论:
129
+ > - 根因:<根因描述>
130
+ > - 涉及文件:<文件列表>
131
+ > - 是否偏离 spec:<是 / 否>
80
132
 
81
- ### 路径 A:不改 spec(实现偏离现有 spec)
133
+ **Claude Code:**
134
+ ```
135
+ AskUserQuestion: {
136
+ questions: [{
137
+ question: "确认以上诊断结论?",
138
+ header: "诊断确认",
139
+ options: [
140
+ { label: "(a) 确认,进入修复", description: "根因确认无误,根据分流逻辑进入对应修复路径" },
141
+ { label: "(b) 重新诊断", description: "诊断结论有误,回到 Step 2 重新分析" }
142
+ ],
143
+ multiSelect: false
144
+ }]
145
+ }
146
+ ```
82
147
 
83
- **适用场景:** bug 是代码层面的问题——逻辑错误、边界条件遗漏、性能问题——而现有 spec 的描述是正确的,只是代码没有按 spec 实现。
148
+ **其他平台(降级为文本选项):**
149
+ ```
150
+ > → (a) 确认,进入修复 — 根因确认无误,进入修复路径
151
+ > → (b) 重新诊断 — 回到 Step 2 重新分析
152
+ > 请输入 a 或 b:
153
+ ```
154
+
155
+ 选 (a) → 根据分流逻辑进入 Step 3 或引导 `/alloy:start`。选 (b) → 回到 Step 2 重新诊断。
156
+
157
+ **什么算"需改 spec"(正例):**
158
+ - spec 没有描述这个边界情况,代码行为合理但 spec 需要补充
159
+ - spec 描述的行为本身就是错的(比如业务逻辑变更后 spec 没更新)
160
+ - 修复需要新增一个 spec 中没有的 capability
84
161
 
85
- **什么算"不改 spec"(正例):**
162
+ **什么算"代码 bug"(正例):**
86
163
  - 函数返回值与 spec 描述的行为不一致
87
164
  - spec 说"空数组返回 []"但代码对空数组抛了异常
88
165
  - 性能不达标,但 spec 没有性能要求
89
166
 
167
+ ---
168
+
169
+ ### [Step 3/3] 分支选择 + 修复
170
+
171
+ 确认是代码 bug 后,根据 Step 1 的环境感知结果**显式标记场景编号**再走对应路径。场景标记不可跳过——不标记直接修会走错分支策略,可能导致在主分支上直接 commit 或错误复用已完成 change。
172
+
173
+ **[HARD STOP] 主分支保护:** 如果 Step 1 检测到当前在主分支(`main`/`master` 或用户配置的 `main_branch`)且无活跃 change,**禁止以任何理由直接修改代码**。任何在主分支上的直接 commit 都会污染主分支历史。必须先创建 hotfix 分支再修复。这是硬阻断,不存在例外。
174
+
175
+ > 什么算"在主分支上直接修"(反例):
176
+ > - 诊断完直接改代码,不创建分支——"反正就改一行"
177
+ > - 说"先改了再挪到分支"——commit 已经污染了 main
178
+ > - 用户说"就在 main 上修吧"——仍应明确拒绝并解释风险。一行和千行的保护等级完全一样
179
+ > - "项目没有 alloy init 过的,不用管吧"——主分支保护是工程常识,与是否初始化 alloy 无关
180
+
181
+ ### 场景 1:有归属 change + worktree 存在
182
+
183
+ **适用条件:** phase = `applied` 且 worktree 存在
184
+
90
185
  ```
91
- [Step 3/3] 分流修复 · 不改 spec
186
+ [Step 3/3] 修复 · worktree 内修复
92
187
  ──────────────────────────────────────
93
-
94
- 根因:<诊断结论>
95
- 分流:不改 spec——代码偏离了现有 spec,修复实现即可
188
+ 归属 change: <name>(phase: applied)
189
+ Worktree: <path>
190
+ worktree 内修复并提交
96
191
  ```
97
192
 
98
193
  修复流程:
99
194
  1. 使用 Skill 工具加载 `superpowers:test-driven-development` 技能 —— 先写失败测试,再修代码
100
- 2. 使用 Skill 工具加载 `superpowers:verification-before-completion` 技能 —— 验证修复
101
- 3. 直接提交,或创建 PR 时加载 `superpowers:requesting-code-review` 技能进行审查
102
195
 
103
- ### 路径 B:需改 spec
196
+ **技能加载后立即记录:**
197
+ ```bash
198
+ alloy _skill log openspec/changes/<name> fix superpowers:test-driven-development
199
+ ```
104
200
 
105
- **适用场景:** bug 的根因是 spec 本身不完整或不正确,需要修改规格说明书。
201
+ 2. 使用 Skill 工具加载 `superpowers:verification-before-completion` 技能 —— 验证修复
106
202
 
107
- **什么算"需改 spec"(正例):**
108
- - spec 没有描述这个边界情况,代码的行为其实是合理的,但 spec 需要补充
109
- - spec 描述的行为本身就是错的(比如业务逻辑变更后 spec 没更新)
110
- - 修复需要新增一个 spec 中没有的 capability
203
+ **技能加载后立即记录:**
204
+ ```bash
205
+ alloy _skill log openspec/changes/<name> fix superpowers:verification-before-completion
206
+ ```
111
207
 
112
- 分流后根据是否有代码落地(phase)再拆分:
208
+ 3. 精确提交到 worktree 分支:
209
+ ```bash
210
+ git add <精确路径>
211
+ git commit -m "fix: <描述>"
212
+ ```
113
213
 
114
- **B1 并入当前 change(有活跃 change phase < applied,无代码落地):**
214
+ ### 场景 2:有归属 change + worktree 已清理
215
+
216
+ **适用条件:** phase = `applied`(worktree 已清理)或 phase = `planned`
115
217
 
116
218
  ```
117
- [Step 3/3] 分流修复 · 并入当前 Change
219
+ [Step 3/3] 修复 · feature 分支修复
118
220
  ──────────────────────────────────────
119
-
120
- spec 变更可并入当前 change <name>。
121
- 运行 `/alloy:start <name>` 重新进入 brainstorming 流程——需求/设计调整从 draft 根重新审视。
221
+ 归属 change: <name>(phase: <phase>)
222
+ Feature 分支: <branch>
223
+ feature 分支修复并提交
122
224
  ```
123
225
 
124
- 无需开新 change——规划阶段的制品还没落地代码,回到 brainstorming 重新讨论即可。
226
+ 修复流程:
227
+ 1. 使用 Skill 工具加载 `superpowers:test-driven-development` 技能
228
+
229
+ **技能加载后立即记录:**
230
+ ```bash
231
+ alloy _skill log openspec/changes/<name> fix superpowers:test-driven-development
232
+ ```
233
+
234
+ 2. 使用 Skill 工具加载 `superpowers:verification-before-completion` 技能
235
+
236
+ **技能加载后立即记录:**
237
+ ```bash
238
+ alloy _skill log openspec/changes/<name> fix superpowers:verification-before-completion
239
+ ```
240
+
241
+ 3. 精确提交到 feature 分支:
242
+ ```bash
243
+ git add <精确路径>
244
+ git commit -m "fix: <描述>"
245
+ ```
125
246
 
126
- **B2 新开 change(无活跃 change phase ≥ applied,已有代码落地):**
247
+ ### 场景 3:无归属 change / change finish
248
+
249
+ **适用条件:** 无活跃 change,或 phase = `archived` / `finished`
127
250
 
128
251
  ```
129
- [Step 3/3] 分流修复 · 新开 Change
252
+ [Step 3/3] 修复 · 热修分支
130
253
  ──────────────────────────────────────
254
+ 无活跃归属 change,创建热修分支
255
+ ```
256
+
257
+ **确认主分支(阻塞点):**
258
+
259
+ 读取 `commands/alloy/references/main-branch-detection.md`,检测/确认主分支。优先读 `openspec/config.yaml` 的 `main_branch` 配置,未配置时按 3 级优先级自动检测并让用户确认。
131
260
 
132
- 修复需要变更 spec。已有代码已落地,需要独立追踪。
133
- 请手动发起:/alloy:start <建议名称>
261
+ 使用 `AskUserQuestion` 展示并确认(非 Claude Code 平台降级为文本选项):
262
+
263
+ **Claude Code:**
264
+ ```
265
+ AskUserQuestion: {
266
+ questions: [{
267
+ question: "确认主分支?",
268
+ header: "主分支",
269
+ options: [
270
+ { label: "(a) 确认", description: "<MAIN_BRANCH> 是主分支,写入配置并继续" },
271
+ { label: "(b) 手动指定", description: "输入正确的主分支名" }
272
+ ],
273
+ multiSelect: false
274
+ }]
275
+ }
276
+ ```
277
+
278
+ **其他平台(降级为文本选项):**
279
+ ```
280
+ > → (a) 确认 — <MAIN_BRANCH> 是主分支,写入配置并继续
281
+ > → (b) 手动指定 — 输入正确的主分支名
282
+ > 请输入 a 或 b:
283
+ ```
284
+
285
+ 确认后写入项目级配置:
286
+ ```bash
287
+ alloy _config write . main_branch <确认的主分支名>
288
+ ```
289
+
290
+ 然后创建热修分支:
291
+
292
+ ```bash
293
+ git checkout -b hotfix/<desc> <MAIN_BRANCH>
134
294
  ```
135
295
 
136
- 已有代码落地后,spec 变更应该独立追踪——不混入已有 change,也不跳过 Alloy 流程。
296
+ 分支命名:`hotfix/` 前缀 + 简短描述(kebab-case),用户可修改。
297
+
298
+ 修复流程:
299
+ 1. 使用 Skill 工具加载 `superpowers:test-driven-development` 技能
300
+
301
+ **技能加载后立即记录:**
302
+ ```bash
303
+ alloy _skill log openspec/changes/<name> fix superpowers:test-driven-development
304
+ ```
305
+
306
+ 2. 使用 Skill 工具加载 `superpowers:verification-before-completion` 技能
307
+
308
+ **技能加载后立即记录:**
309
+ ```bash
310
+ alloy _skill log openspec/changes/<name> fix superpowers:verification-before-completion
311
+ ```
312
+
313
+ 3. 精确提交。如果能追溯到原 change,在 commit message 中注明:
314
+ ```bash
315
+ git add <精确路径>
316
+ git commit -m "fix: <描述>
317
+
318
+ fix-from: <原 change 名>"
319
+ ```
320
+ 无法追溯时,普通提交即可:
321
+ ```bash
322
+ git add <精确路径>
323
+ git commit -m "fix: <描述>"
324
+ ```
325
+ 4. 确认合并并合并回主分支:
326
+
327
+ 在执行 merge 之前,先展示合并信息并等待用户确认:
328
+
329
+ > 确认合并
330
+ > ──────────────────────────────────────
331
+ >
332
+ > 即将合并热修分支到主分支:
333
+ >
334
+ > 源分支:`hotfix/<desc>`
335
+ > 目标分支:`<MAIN_BRANCH>`
336
+ >
337
+ > 提交:
338
+ > ```
339
+ > <git log <MAIN_BRANCH>..hotfix/<desc> --oneline 的输出>
340
+ > ```
341
+ >
342
+ > 合并后 hotfix 分支将被删除。
343
+ >
344
+ > 输入 merge hotfix/<desc> into <MAIN_BRANCH> 确认,或输入其他内容取消。
345
+
346
+ **必须等待用户精确输入确认语句。** "好"、"可以"、"y" 都不算确认。
347
+
348
+ 用户确认后执行合并:
349
+ ```bash
350
+ git checkout <MAIN_BRANCH>
351
+ git merge hotfix/<desc> --no-ff
352
+ git branch -d hotfix/<desc>
353
+ ```
354
+ 用户取消则提示:"取消合并。热修分支 hotfix/<desc> 保留,可后续手动合并。"
355
+
356
+ ---
357
+
358
+ ### spec 变更兜底
359
+
360
+ 修复过程中若发现 spec 问题(非根因但影响修复),不阻断当前修复。修复完成后提示:
361
+
362
+ > 修复过程中发现 spec 可能需要变更:<问题描述>
363
+ > 是否需要运行 /alloy:start 开新 change 修正 spec?[Y/n]
364
+
365
+ 正常修复完成(未发现 spec 问题)→ 不提示。
137
366
 
138
367
  ---
139
368
 
@@ -143,7 +372,7 @@ spec 变更可并入当前 change <name>。
143
372
  Alloy · Bug 修复 — DONE
144
373
  ──────────────────────────────────────
145
374
 
146
- 修复路径:<路径 A / B1 / B2>
375
+ 修复路径:<场景 1 / 场景 2 / 场景 3>
147
376
  诊断结论:<根因摘要>
148
- 结果:<修复结果或后续步骤>
377
+ 结果:<修复结果>
149
378
  ```