@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.
- package/README.md +28 -90
- package/commands/alloy/apply.md +274 -119
- package/commands/alloy/archive.md +116 -60
- package/commands/alloy/discard.md +57 -15
- package/commands/alloy/finish.md +92 -70
- package/commands/alloy/fix.md +282 -53
- package/commands/alloy/plan.md +125 -63
- package/commands/alloy/references/interaction-style.md +82 -0
- package/commands/alloy/references/main-branch-detection.md +32 -0
- package/commands/alloy/references/phase-routing.md +21 -0
- package/commands/alloy/references/skill-precheck.md +46 -0
- package/commands/alloy/start.md +167 -64
- package/commands/alloy/status.md +1 -1
- package/dist/cli/commands/doctor.d.ts +1 -0
- package/dist/cli/commands/doctor.js +28 -6
- package/dist/cli/commands/doctor.js.map +1 -1
- package/dist/cli/commands/init.js +40 -37
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/internal/config.d.ts +1 -0
- package/dist/cli/commands/internal/config.js +45 -0
- package/dist/cli/commands/internal/config.js.map +1 -0
- package/dist/cli/commands/internal/guard.js +2 -41
- package/dist/cli/commands/internal/guard.js.map +1 -1
- package/dist/cli/commands/internal/record.js +10 -47
- package/dist/cli/commands/internal/record.js.map +1 -1
- package/dist/cli/commands/internal/skill-usage.d.ts +1 -0
- package/dist/cli/commands/internal/skill-usage.js +78 -0
- package/dist/cli/commands/internal/skill-usage.js.map +1 -0
- package/dist/cli/commands/internal/state.js +105 -6
- package/dist/cli/commands/internal/state.js.map +1 -1
- package/dist/cli/commands/status.d.ts +1 -0
- package/dist/cli/commands/status.js +50 -11
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/cli/commands/update.js +20 -17
- package/dist/cli/commands/update.js.map +1 -1
- package/dist/cli/index.js +73 -31
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/utils/hash.d.ts +3 -0
- package/dist/cli/utils/hash.js +42 -0
- package/dist/cli/utils/hash.js.map +1 -0
- package/dist/cli/utils/state.d.ts +4 -2
- package/dist/cli/utils/state.js +34 -2
- package/dist/cli/utils/state.js.map +1 -1
- package/dist/core/artifacts.d.ts +3 -0
- package/dist/core/artifacts.js +45 -0
- package/dist/core/artifacts.js.map +1 -0
- package/dist/core/detect-installations.d.ts +19 -0
- package/dist/core/detect-installations.js +65 -0
- package/dist/core/detect-installations.js.map +1 -0
- package/dist/core/openspec.d.ts +2 -1
- package/dist/core/openspec.js +30 -12
- package/dist/core/openspec.js.map +1 -1
- package/dist/core/skills.js +16 -0
- package/dist/core/skills.js.map +1 -1
- package/dist/core/superpowers.d.ts +8 -1
- package/dist/core/superpowers.js +60 -13
- package/dist/core/superpowers.js.map +1 -1
- package/dist/core/types.d.ts +20 -0
- package/dist/utils/format.d.ts +31 -0
- package/dist/utils/format.js +101 -0
- package/dist/utils/format.js.map +1 -0
- package/dist/utils/output.d.ts +16 -0
- package/dist/utils/output.js +38 -0
- package/dist/utils/output.js.map +1 -0
- package/dist/utils/prompt.d.ts +0 -1
- package/dist/utils/prompt.js +11 -83
- package/dist/utils/prompt.js.map +1 -1
- package/openspec/schemas/alloy/instructions/retrospective.md +17 -35
- package/openspec/schemas/alloy/templates/design.md +2 -0
- package/openspec/schemas/alloy/templates/draft.md +2 -0
- package/openspec/schemas/alloy/templates/plans.md +2 -0
- package/openspec/schemas/alloy/templates/proposal.md +2 -0
- package/openspec/schemas/alloy/templates/retrospective.md +39 -19
- package/openspec/schemas/alloy/templates/specs.md +2 -0
- package/openspec/schemas/alloy/templates/tasks.md +2 -0
- package/package.json +10 -3
- package/vendor/superpowers/skills/brainstorming/SKILL.md +164 -0
- package/vendor/superpowers/skills/brainstorming/scripts/frame-template.html +214 -0
- package/vendor/superpowers/skills/brainstorming/scripts/helper.js +88 -0
- package/vendor/superpowers/skills/brainstorming/scripts/server.cjs +354 -0
- package/vendor/superpowers/skills/brainstorming/scripts/start-server.sh +148 -0
- package/vendor/superpowers/skills/brainstorming/scripts/stop-server.sh +56 -0
- package/vendor/superpowers/skills/brainstorming/spec-document-reviewer-prompt.md +49 -0
- package/vendor/superpowers/skills/brainstorming/visual-companion.md +287 -0
- package/vendor/superpowers/skills/dispatching-parallel-agents/SKILL.md +182 -0
- package/vendor/superpowers/skills/executing-plans/SKILL.md +70 -0
- package/vendor/superpowers/skills/finishing-a-development-branch/SKILL.md +251 -0
- package/vendor/superpowers/skills/receiving-code-review/SKILL.md +213 -0
- package/vendor/superpowers/skills/requesting-code-review/SKILL.md +103 -0
- package/vendor/superpowers/skills/requesting-code-review/code-reviewer.md +168 -0
- package/vendor/superpowers/skills/subagent-driven-development/SKILL.md +279 -0
- package/vendor/superpowers/skills/subagent-driven-development/code-quality-reviewer-prompt.md +25 -0
- package/vendor/superpowers/skills/subagent-driven-development/implementer-prompt.md +113 -0
- package/vendor/superpowers/skills/subagent-driven-development/spec-reviewer-prompt.md +61 -0
- package/vendor/superpowers/skills/systematic-debugging/CREATION-LOG.md +119 -0
- package/vendor/superpowers/skills/systematic-debugging/SKILL.md +296 -0
- package/vendor/superpowers/skills/systematic-debugging/condition-based-waiting-example.ts +158 -0
- package/vendor/superpowers/skills/systematic-debugging/condition-based-waiting.md +115 -0
- package/vendor/superpowers/skills/systematic-debugging/defense-in-depth.md +122 -0
- package/vendor/superpowers/skills/systematic-debugging/find-polluter.sh +63 -0
- package/vendor/superpowers/skills/systematic-debugging/root-cause-tracing.md +169 -0
- package/vendor/superpowers/skills/systematic-debugging/test-academic.md +14 -0
- package/vendor/superpowers/skills/systematic-debugging/test-pressure-1.md +58 -0
- package/vendor/superpowers/skills/systematic-debugging/test-pressure-2.md +68 -0
- package/vendor/superpowers/skills/systematic-debugging/test-pressure-3.md +69 -0
- package/vendor/superpowers/skills/test-driven-development/SKILL.md +371 -0
- package/vendor/superpowers/skills/test-driven-development/testing-anti-patterns.md +299 -0
- package/vendor/superpowers/skills/using-git-worktrees/SKILL.md +215 -0
- package/vendor/superpowers/skills/using-superpowers/SKILL.md +117 -0
- package/vendor/superpowers/skills/using-superpowers/references/codex-tools.md +59 -0
- package/vendor/superpowers/skills/using-superpowers/references/copilot-tools.md +42 -0
- package/vendor/superpowers/skills/using-superpowers/references/gemini-tools.md +51 -0
- package/vendor/superpowers/skills/verification-before-completion/SKILL.md +139 -0
- package/vendor/superpowers/skills/writing-plans/SKILL.md +152 -0
- package/vendor/superpowers/skills/writing-plans/plan-document-reviewer-prompt.md +49 -0
- package/vendor/superpowers/skills/writing-skills/SKILL.md +655 -0
- package/vendor/superpowers/skills/writing-skills/anthropic-best-practices.md +1150 -0
- package/vendor/superpowers/skills/writing-skills/examples/CLAUDE_MD_TESTING.md +189 -0
- package/vendor/superpowers/skills/writing-skills/graphviz-conventions.dot +172 -0
- package/vendor/superpowers/skills/writing-skills/persuasion-principles.md +187 -0
- package/vendor/superpowers/skills/writing-skills/render-graphs.js +168 -0
- package/vendor/superpowers/skills/writing-skills/testing-skills-with-subagents.md +384 -0
package/commands/alloy/fix.md
CHANGED
|
@@ -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
|
-
-
|
|
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 预检:**
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
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
|
-
|
|
51
|
+
**2. Phase 校验与场景标记:** 若检测到活跃 change 的 `.alloy.yaml`,读取 phase 并标记修复场景:
|
|
31
52
|
|
|
32
|
-
|
|
33
|
-
- phase = `
|
|
34
|
-
- phase = `
|
|
35
|
-
-
|
|
53
|
+
- phase = `applied` 且 worktree 存在 → 标记"场景 1:worktree 内修复"
|
|
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
|
-
|
|
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
|
-
|
|
54
|
-
|
|
84
|
+
# 检测活跃 change
|
|
85
|
+
alloy status --json 2>/dev/null
|
|
55
86
|
|
|
56
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
126
|
+
展示诊断结论,使用 `AskUserQuestion` 让用户确认(非 Claude Code 平台降级为文本选项):
|
|
78
127
|
|
|
79
|
-
|
|
128
|
+
> 诊断结论:
|
|
129
|
+
> - 根因:<根因描述>
|
|
130
|
+
> - 涉及文件:<文件列表>
|
|
131
|
+
> - 是否偏离 spec:<是 / 否>
|
|
80
132
|
|
|
81
|
-
|
|
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
|
-
|
|
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
|
-
**什么算"
|
|
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]
|
|
186
|
+
[Step 3/3] 修复 · worktree 内修复
|
|
92
187
|
──────────────────────────────────────
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
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
|
-
|
|
196
|
+
**技能加载后立即记录:**
|
|
197
|
+
```bash
|
|
198
|
+
alloy _skill log openspec/changes/<name> fix superpowers:test-driven-development
|
|
199
|
+
```
|
|
104
200
|
|
|
105
|
-
|
|
201
|
+
2. 使用 Skill 工具加载 `superpowers:verification-before-completion` 技能 —— 验证修复
|
|
106
202
|
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
203
|
+
**技能加载后立即记录:**
|
|
204
|
+
```bash
|
|
205
|
+
alloy _skill log openspec/changes/<name> fix superpowers:verification-before-completion
|
|
206
|
+
```
|
|
111
207
|
|
|
112
|
-
|
|
208
|
+
3. 精确提交到 worktree 分支:
|
|
209
|
+
```bash
|
|
210
|
+
git add <精确路径>
|
|
211
|
+
git commit -m "fix: <描述>"
|
|
212
|
+
```
|
|
113
213
|
|
|
114
|
-
|
|
214
|
+
### 场景 2:有归属 change + worktree 已清理
|
|
215
|
+
|
|
216
|
+
**适用条件:** phase = `applied`(worktree 已清理)或 phase = `planned`
|
|
115
217
|
|
|
116
218
|
```
|
|
117
|
-
[Step 3/3]
|
|
219
|
+
[Step 3/3] 修复 · feature 分支修复
|
|
118
220
|
──────────────────────────────────────
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
221
|
+
归属 change: <name>(phase: <phase>)
|
|
222
|
+
Feature 分支: <branch>
|
|
223
|
+
在 feature 分支修复并提交
|
|
122
224
|
```
|
|
123
225
|
|
|
124
|
-
|
|
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
|
-
|
|
247
|
+
### 场景 3:无归属 change / change 已 finish
|
|
248
|
+
|
|
249
|
+
**适用条件:** 无活跃 change,或 phase = `archived` / `finished`
|
|
127
250
|
|
|
128
251
|
```
|
|
129
|
-
[Step 3/3]
|
|
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
|
-
|
|
133
|
-
|
|
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
|
-
|
|
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
|
-
|
|
375
|
+
修复路径:<场景 1 / 场景 2 / 场景 3>
|
|
147
376
|
诊断结论:<根因摘要>
|
|
148
|
-
|
|
377
|
+
结果:<修复结果>
|
|
149
378
|
```
|