@flyin-ai/alloy 0.1.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 +151 -0
- package/commands/alloy/apply.md +485 -0
- package/commands/alloy/archive.md +170 -0
- package/commands/alloy/discard.md +80 -0
- package/commands/alloy/finish.md +204 -0
- package/commands/alloy/fix.md +149 -0
- package/commands/alloy/plan.md +360 -0
- package/commands/alloy/start.md +314 -0
- package/commands/alloy/status.md +79 -0
- package/compat.yaml +10 -0
- package/dist/cli/commands/completion.d.ts +1 -0
- package/dist/cli/commands/completion.js +155 -0
- package/dist/cli/commands/completion.js.map +1 -0
- package/dist/cli/commands/doctor.d.ts +7 -0
- package/dist/cli/commands/doctor.js +93 -0
- package/dist/cli/commands/doctor.js.map +1 -0
- package/dist/cli/commands/init.d.ts +6 -0
- package/dist/cli/commands/init.js +168 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/internal/archive.d.ts +1 -0
- package/dist/cli/commands/internal/archive.js +91 -0
- package/dist/cli/commands/internal/archive.js.map +1 -0
- package/dist/cli/commands/internal/guard.d.ts +1 -0
- package/dist/cli/commands/internal/guard.js +135 -0
- package/dist/cli/commands/internal/guard.js.map +1 -0
- package/dist/cli/commands/internal/record.d.ts +1 -0
- package/dist/cli/commands/internal/record.js +144 -0
- package/dist/cli/commands/internal/record.js.map +1 -0
- package/dist/cli/commands/internal/state.d.ts +1 -0
- package/dist/cli/commands/internal/state.js +99 -0
- package/dist/cli/commands/internal/state.js.map +1 -0
- package/dist/cli/commands/status.d.ts +1 -0
- package/dist/cli/commands/status.js +112 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/commands/update.d.ts +1 -0
- package/dist/cli/commands/update.js +162 -0
- package/dist/cli/commands/update.js.map +1 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.js +291 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/utils/state.d.ts +6 -0
- package/dist/cli/utils/state.js +64 -0
- package/dist/cli/utils/state.js.map +1 -0
- package/dist/core/agents.d.ts +8 -0
- package/dist/core/agents.js +85 -0
- package/dist/core/agents.js.map +1 -0
- package/dist/core/claude-md.d.ts +4 -0
- package/dist/core/claude-md.js +47 -0
- package/dist/core/claude-md.js.map +1 -0
- package/dist/core/compat.d.ts +2 -0
- package/dist/core/compat.js +8 -0
- package/dist/core/compat.js.map +1 -0
- package/dist/core/detect.d.ts +2 -0
- package/dist/core/detect.js +22 -0
- package/dist/core/detect.js.map +1 -0
- package/dist/core/health.d.ts +22 -0
- package/dist/core/health.js +283 -0
- package/dist/core/health.js.map +1 -0
- package/dist/core/openspec.d.ts +2 -0
- package/dist/core/openspec.js +79 -0
- package/dist/core/openspec.js.map +1 -0
- package/dist/core/skills.d.ts +3 -0
- package/dist/core/skills.js +68 -0
- package/dist/core/skills.js.map +1 -0
- package/dist/core/superpowers.d.ts +1 -0
- package/dist/core/superpowers.js +31 -0
- package/dist/core/superpowers.js.map +1 -0
- package/dist/core/types.d.ts +76 -0
- package/dist/core/types.js +2 -0
- package/dist/core/types.js.map +1 -0
- package/dist/utils/fs.d.ts +1 -0
- package/dist/utils/fs.js +7 -0
- package/dist/utils/fs.js.map +1 -0
- package/dist/utils/prompt.d.ts +10 -0
- package/dist/utils/prompt.js +90 -0
- package/dist/utils/prompt.js.map +1 -0
- package/openspec/schemas/alloy/instructions/design.md +46 -0
- package/openspec/schemas/alloy/instructions/draft.md +39 -0
- package/openspec/schemas/alloy/instructions/plans.md +59 -0
- package/openspec/schemas/alloy/instructions/proposal.md +34 -0
- package/openspec/schemas/alloy/instructions/retrospective.md +157 -0
- package/openspec/schemas/alloy/instructions/specs.md +53 -0
- package/openspec/schemas/alloy/instructions/tasks.md +40 -0
- package/openspec/schemas/alloy/instructions/verify.md +90 -0
- package/openspec/schemas/alloy/schema.yaml +100 -0
- package/openspec/schemas/alloy/templates/design.md +15 -0
- package/openspec/schemas/alloy/templates/draft.md +17 -0
- package/openspec/schemas/alloy/templates/plans.md +28 -0
- package/openspec/schemas/alloy/templates/proposal.md +22 -0
- package/openspec/schemas/alloy/templates/retrospective.md +163 -0
- package/openspec/schemas/alloy/templates/specs.md +54 -0
- package/openspec/schemas/alloy/templates/tasks.md +8 -0
- package/openspec/schemas/alloy/templates/verify.md +55 -0
- package/package.json +43 -0
package/README.md
ADDED
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
# Alloy
|
|
2
|
+
|
|
3
|
+
**Alloy 是 AI 编码 Agent 的驾驶舱。** 它不写代码,而是告诉 Agent **何时写、怎么写、写完谁来把关**。
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 为什么不直接用 AI Agent 裸写?
|
|
8
|
+
|
|
9
|
+
1. **需求漂移** — Agent 理解的"要做的东西"和你想要的不一样,聊着聊着范围就跑了
|
|
10
|
+
2. **质量靠自觉** — TDD、代码审查、分支隔离全看 Agent 当天心情,前脚记得后脚忘
|
|
11
|
+
3. **改完不留痕** — 代码改了,但"为什么这么改"、"变了哪些 spec"没记录,换人就断片
|
|
12
|
+
|
|
13
|
+
| | Alloy | 裸用 AI Agent |
|
|
14
|
+
|------|------|------|
|
|
15
|
+
| 需求管理 | brainstorming → draft → proposal → specs,完整审计链 | "帮我加个功能"——需求在聊天里 |
|
|
16
|
+
| 流程闸门 | 5 阶段 hard gate,每阶段脚本校验 | 无闸门,Agent 自由发挥 |
|
|
17
|
+
| 制品追踪 | 8 制品 DAG + hash 锁定 + 每制品独立 commit,精准回溯 | 改了什么都记不住 |
|
|
18
|
+
| 隔离环境 | 可选 worktree,自动管理 | 直接在主分支上改 |
|
|
19
|
+
| 质量保证 | TDD + code review + 双层验证 | 靠 Agent 自觉 |
|
|
20
|
+
| 掉线恢复 | 任意阶段退出,回来随便打哪个命令,自动接续 | 掉线从头开始 |
|
|
21
|
+
| 事后复盘 | evidence-driven retrospective,教训跨周期传递 | 无 |
|
|
22
|
+
| 自我优化 | 复盘数据自动反哺下一个 change | 每次都从零开始 |
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
## Alloy 是什么?
|
|
27
|
+
|
|
28
|
+
Alloy 把两个工具缝合到一起:
|
|
29
|
+
|
|
30
|
+
| 工具 | 管什么 | 各自缺的 |
|
|
31
|
+
|------|--------|---------|
|
|
32
|
+
| [OpenSpec](https://github.com/Fission-AI/OpenSpec) | "做成什么样" — 需求追踪、Delta Spec、归档审计 | 有文档没纪律:不强 TDD、不强审查、不强隔离 |
|
|
33
|
+
| [Superpowers](https://github.com/obra/superpowers) | "怎么做" — 流程闸门、TDD、系统化调试、验证 | 有纪律没档案:改了代码但没记录"变了什么 spec" |
|
|
34
|
+
| **Alloy** | **编排两者** — 规格管理 + 流程纪律 = 完整且不可跳步的工作流 | — |
|
|
35
|
+
|
|
36
|
+
不是什么新框架(不引入新 DSL),也不以"快"为卖点——审查窗口和闸门让流程比一把梭更慢。慢是故意的:省下的时间是拿质量换的。
|
|
37
|
+
|
|
38
|
+
适合:用 Claude Code 等 AI Agent 做日常开发、对代码质量有要求、需要需求追踪和审计归档的团队。
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
## 安装
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
npm install -g @flyin-ai/alloy
|
|
46
|
+
cd your-project
|
|
47
|
+
alloy init
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
`alloy init` 自动完成:检测环境(Node.js ≥ 18 + git)→ 安装 OpenSpec + Superpowers → 部署命令和 schema → 兼容性检查。
|
|
51
|
+
|
|
52
|
+
---
|
|
53
|
+
|
|
54
|
+
## 工作流
|
|
55
|
+
|
|
56
|
+
```
|
|
57
|
+
/alloy:start [1/5] 智能入口 — 状态检测 → 上下文探查 → 需求设计 → draft.md
|
|
58
|
+
/alloy:plan [2/5] 制品生成 — proposal → design → specs → tasks → plan(每步审查)
|
|
59
|
+
/alloy:apply [3/5] 隔离执行 — worktree(可选) + SDD/串行(可选) + 双层验证 + 复盘
|
|
60
|
+
/alloy:archive [4/5] 归档 — Delta Spec 合并主 spec → 移入 archive/ → 提交
|
|
61
|
+
/alloy:finish [5/5] 收尾 — merge / PR / keep(人工闸门)
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
| 制品 | 阶段 | 说明 |
|
|
65
|
+
|------|------|------|
|
|
66
|
+
| `draft.md` | start | 需求探索 + 设计决策 |
|
|
67
|
+
| `proposal.md` | plan | 变更提案,创建 specs 的合约 |
|
|
68
|
+
| `design.md` | plan | 技术决策、架构、数据流 |
|
|
69
|
+
| `specs/*.md` | plan | 行为契约(Delta Spec) |
|
|
70
|
+
| `tasks.md` | plan | 实现任务清单 |
|
|
71
|
+
| `plan.md` | plan | 执行剧本(含代码片段) |
|
|
72
|
+
| `verify.md` | apply | 7 项结构化检查结果 |
|
|
73
|
+
| `retrospective.md` | apply | 证据驱动复盘(§0-§6) |
|
|
74
|
+
|
|
75
|
+
---
|
|
76
|
+
|
|
77
|
+
## 命令速查
|
|
78
|
+
|
|
79
|
+
### Slash Command(AI Agent 内使用)
|
|
80
|
+
|
|
81
|
+
| 命令 | 用途 |
|
|
82
|
+
|------|------|
|
|
83
|
+
| `/alloy:start [topic]` | 智能入口:状态检测 → 需求设计 |
|
|
84
|
+
| `/alloy:plan [name]` | 规划:proposal → design → specs → tasks → plan |
|
|
85
|
+
| `/alloy:apply [name]` | 执行:worktree + 实现 + 验证 + 复盘 |
|
|
86
|
+
| `/alloy:archive [name]` | 归档:Delta Spec 合并 + 提交 |
|
|
87
|
+
| `/alloy:finish [name]` | 收尾:merge / PR / keep |
|
|
88
|
+
| `/alloy:fix` | Bug 修复:诊断 → 分流 |
|
|
89
|
+
| `/alloy:discard [name]` | 放弃 change,清理现场 |
|
|
90
|
+
| `/alloy:status [name]` | 查看阶段、制品、下一步 |
|
|
91
|
+
|
|
92
|
+
> **命名约定:** 命令以冒号为主格式(`alloy:start`)——冒号在 Claude Code 等平台提供命名空间分组,输入 `/alloy:` 即可看到全部子命令。冒号改横线是单向派生(→ `alloy-start`),因此选冒号做主格式。不支持冒号的 Agent(Cursor、OpenCode、Codex 等)自动获得横线版。
|
|
93
|
+
|
|
94
|
+
### CLI 命令(终端使用)
|
|
95
|
+
|
|
96
|
+
| 命令 | 用途 |
|
|
97
|
+
|------|------|
|
|
98
|
+
| `alloy init [path]` | 项目初始化 |
|
|
99
|
+
| `alloy status [path]` | 活跃 change 总览(支持 `--json`) |
|
|
100
|
+
| `alloy doctor [path]` | 诊断:版本兼容、文件一致性(支持 `--json`) |
|
|
101
|
+
| `alloy update [path]` | 更新命令和 schema 到最新版 |
|
|
102
|
+
|
|
103
|
+
---
|
|
104
|
+
|
|
105
|
+
## 核心特点
|
|
106
|
+
|
|
107
|
+
**三层防线,Agent 想跳也跳不过去:**
|
|
108
|
+
|
|
109
|
+
| 防线 | 机制 | 作用 |
|
|
110
|
+
|------|------|------|
|
|
111
|
+
| 指令层 | SKILL.md 硬约束 + 反例定义 | 引导 Agent 行为 |
|
|
112
|
+
| 脚本层 | `alloy _guard` + `alloy _record check` | 硬阻断非法操作:phase 校验、hash 校验、制品完整性 |
|
|
113
|
+
| 审查层 | 每制品人工确认(不提供"跳过") | 人类最终决策 |
|
|
114
|
+
|
|
115
|
+
**每一步都有明确决策点:** start 选分支 → plan 每制品审查 → apply 选隔离方式和执行策略 → archive 确认归档 → finish 明确合入方式。每个阶段转换前有闸门脚本校验。
|
|
116
|
+
|
|
117
|
+
**掉线零负担:** 任何时候退出,回来随便打 `/alloy:start`、`/alloy:plan`、`/alloy:apply` 任意一个命令——自动检测进度,从断点继续。不需要记住"上次做到哪了"。
|
|
118
|
+
|
|
119
|
+
**越用越聪明:** 每次 change 的 retrospective 复盘数据自动反哺后续 change——上次踩的坑、跳过的技能、未完成的改进项,都带回新一轮 start,不会每次都从零开始。
|
|
120
|
+
|
|
121
|
+
> 完整设计细节见 [alloy-design.md](docs/alloy-design.md)。
|
|
122
|
+
|
|
123
|
+
---
|
|
124
|
+
|
|
125
|
+
## 文档导航
|
|
126
|
+
|
|
127
|
+
| 我想… | 读这个 |
|
|
128
|
+
|-------|------|
|
|
129
|
+
| 看完整产品规格 | [alloy-design.md](docs/alloy-design.md) |
|
|
130
|
+
| 构建、测试、调试 Alloy | [alloy-dev-guide.md](docs/alloy-dev-guide.md) |
|
|
131
|
+
| 写或改 Alloy Skill | [skill-writing-guide.md](docs/skill-writing-guide.md) |
|
|
132
|
+
| 理解为什么这么设计 | [workflow-design.md](docs/workflow-design.md) |
|
|
133
|
+
| 看 OpenSpec vs Superpowers 对比 | [openspec-vs-superpowers.md](docs/openspec-vs-superpowers.md) |
|
|
134
|
+
| 了解项目起源 | [project-background.md](docs/project-background.md) |
|
|
135
|
+
|
|
136
|
+
---
|
|
137
|
+
|
|
138
|
+
## 依赖
|
|
139
|
+
|
|
140
|
+
| 依赖 | 版本 | 说明 |
|
|
141
|
+
|------|------|------|
|
|
142
|
+
| [OpenSpec CLI](https://github.com/Fission-AI/OpenSpec) | `>=1.3.0 <2.0.0` | 需求管理和 Delta Spec 追踪 |
|
|
143
|
+
| [Superpowers](https://github.com/obra/superpowers) | `>=5.0.0 <6.0.0` | 流程闸门技能 |
|
|
144
|
+
| Node.js | ≥ 18 | 运行时 |
|
|
145
|
+
| git | — | 版本控制 |
|
|
146
|
+
|
|
147
|
+
---
|
|
148
|
+
|
|
149
|
+
## 许可
|
|
150
|
+
|
|
151
|
+
MIT
|
|
@@ -0,0 +1,485 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: "Alloy: Apply"
|
|
3
|
+
description: Alloy 执行阶段——当 plan.md 完成后,在隔离环境中实现代码并通过双层验证
|
|
4
|
+
category: Workflow
|
|
5
|
+
tags: [alloy, workflow]
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# alloy-apply
|
|
9
|
+
|
|
10
|
+
你是 Alloy 的执行阶段编排器。按 plan.md 任务实现,内部遵循 TDD,执行完毕自动验证和复盘。
|
|
11
|
+
|
|
12
|
+
**状态标签约定(ANSI 颜色输出):**
|
|
13
|
+
- `[PASS]` 绿色 — 检查通过
|
|
14
|
+
- `[FAIL]` 红色 — 检查失败
|
|
15
|
+
- `[HALT]` 红色 — 硬阻断,不可继续
|
|
16
|
+
- `[WARN]` 黄色 — 警告,可继续但需关注
|
|
17
|
+
- `[DONE]` 绿色 — 阶段完成
|
|
18
|
+
|
|
19
|
+
**调用外部命令或技能前,先输出标题和状态描述,再执行操作。不要只出标题然后沉默。**
|
|
20
|
+
|
|
21
|
+
**什么算"apply 执行不到位"(反例):**
|
|
22
|
+
- precheck 发现技能缺失但继续执行——"先跑着,后面可能用不到"——后面会静默丢失 TDD 或 code review
|
|
23
|
+
- 验证失败后直接改代码跳回验证,不经过 SDD——丢失了 TDD 安全网
|
|
24
|
+
- retrospective 在没有 verify.md 的情况下生成——复盘建立在不可靠的基础上
|
|
25
|
+
|
|
26
|
+
## 前置检查
|
|
27
|
+
|
|
28
|
+
1. 确认 `plans.md` 存在于 change 目录,不存在则报错
|
|
29
|
+
2. 通过 `alloy _guard` 确认 change 的 phase:
|
|
30
|
+
```bash
|
|
31
|
+
alloy _guard openspec/changes/<name> applied
|
|
32
|
+
```
|
|
33
|
+
若 guard 报错说明 phase 转换不合法——检查当前 phase:
|
|
34
|
+
|
|
35
|
+
| 当前 phase | 行为 |
|
|
36
|
+
|-----------|------|
|
|
37
|
+
| started | "plan 尚未完成,自动进入 /alloy:plan" → 加载 alloy-plan 指令 |
|
|
38
|
+
| planned | precheck 通过,继续执行 |
|
|
39
|
+
| applied | precheck 通过(重入),步骤幂等处理断点 |
|
|
40
|
+
| archived | "已归档,自动进入 /alloy:finish" → 加载 alloy-finish 指令 |
|
|
41
|
+
| finished | "工作流已完成" → STOP |
|
|
42
|
+
|
|
43
|
+
**实现方式:** 输出对应命令文件的完整指令,将 change name 和当前进度信息作为上下文传入。
|
|
44
|
+
3. 确认当前目录在 git 仓库内:
|
|
45
|
+
```bash
|
|
46
|
+
git rev-parse --git-dir
|
|
47
|
+
```
|
|
48
|
+
若命令成功 → 继续。
|
|
49
|
+
若命令失败 → 项目还不是 git 仓库,worktree 隔离和版本追踪需要 git。展示选项:
|
|
50
|
+
> Git 仓库检测
|
|
51
|
+
> ──────────────────────────────────────
|
|
52
|
+
>
|
|
53
|
+
> 检测到项目还不是 git 仓库。worktree 隔离和版本追踪依赖 git。
|
|
54
|
+
>
|
|
55
|
+
> 1. 立即初始化 —— 执行 git init 并做一次初始提交(推荐)
|
|
56
|
+
> 2. 稍后自行处理 —— 手动初始化后再运行 /alloy:apply
|
|
57
|
+
|
|
58
|
+
选 1:Agent 执行 `git init && git add -A && git commit -m "chore: 初始提交"`,完成后继续
|
|
59
|
+
选 2:STOP,"请手动初始化 git 仓库后重新运行 `/alloy:apply`"
|
|
60
|
+
|
|
61
|
+
**记录阶段开始时间:**
|
|
62
|
+
|
|
63
|
+
```bash
|
|
64
|
+
COMPLETED_AT=$(date "+%Y-%m-%d %H:%M:%S")
|
|
65
|
+
TIMINGS=$(alloy _state read openspec/changes/<name> phase_timings 2>/dev/null || echo "{}")
|
|
66
|
+
echo "$TIMINGS" | python3 -c "
|
|
67
|
+
import sys,json
|
|
68
|
+
content = sys.stdin.read()
|
|
69
|
+
d = json.loads(content) if content.strip() else {}
|
|
70
|
+
p = d.setdefault('apply',{})
|
|
71
|
+
if 'started_at' not in p:
|
|
72
|
+
p['started_at']='$COMPLETED_AT'
|
|
73
|
+
print(json.dumps(d))
|
|
74
|
+
" | while read -r val; do alloy _state write openspec/changes/<name> phase_timings "$val"; done
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
读取启动时间用于展示:
|
|
78
|
+
```bash
|
|
79
|
+
alloy _state read openspec/changes/<name> phase_timings | python3 -c "
|
|
80
|
+
import sys,json
|
|
81
|
+
print(json.loads(sys.stdin.read() or '{}').get('apply',{}).get('started_at',''))
|
|
82
|
+
"
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
```
|
|
86
|
+
┌──────────────────────────────────────┐
|
|
87
|
+
│ Alloy [3/5] · Phase: Apply │
|
|
88
|
+
│ 启动时间: <上面命令输出的 started_at 值> │
|
|
89
|
+
└──────────────────────────────────────┘
|
|
90
|
+
|
|
91
|
+
**提交前置状态(worktree 创建前确保 .alloy.yaml 变更已落地):**
|
|
92
|
+
|
|
93
|
+
```bash
|
|
94
|
+
git add openspec/changes/<name>/.alloy.yaml
|
|
95
|
+
git diff --cached --quiet || git commit -m "chore(<name>): apply 阶段开始前状态快照"
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
`git diff --cached --quiet` 接续时无变更则跳过,不会产生空 commit。
|
|
99
|
+
|
|
100
|
+
[Step 0/5] 技能可用性预检(precheck)
|
|
101
|
+
──────────────────────────────────────
|
|
102
|
+
|
|
103
|
+
前置检查通过:plan.md ✓ phase=planned ✓ git仓库 ✓
|
|
104
|
+
|
|
105
|
+
检查以下 6 个 Superpowers 技能是否可用(缺一 STOP,不静默降级):
|
|
106
|
+
- [ ] superpowers:using-git-worktrees
|
|
107
|
+
- [ ] superpowers:subagent-driven-development
|
|
108
|
+
- [ ] superpowers:executing-plans
|
|
109
|
+
- [ ] superpowers:test-driven-development
|
|
110
|
+
- [ ] superpowers:requesting-code-review
|
|
111
|
+
- [ ] superpowers:verification-before-completion
|
|
112
|
+
|
|
113
|
+
任一缺失 → 输出缺失列表 → 引导 `alloy init` 重新安装 → STOP
|
|
114
|
+
|
|
115
|
+
全部通过后:
|
|
116
|
+
> precheck 通过:6/6 技能可用 ✓
|
|
117
|
+
> 共 5 个步骤:隔离 → 任务实现 → 代码验证 → 制品验证 → 复盘
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
---
|
|
121
|
+
|
|
122
|
+
---
|
|
123
|
+
|
|
124
|
+
## 需求变更处理(Apply 阶段回溯闸门)
|
|
125
|
+
|
|
126
|
+
apply 阶段用户提出需求/设计变更时,以"编码是否已开始"为分界线:
|
|
127
|
+
|
|
128
|
+
**检查 tasks.md checkbox 状态:**
|
|
129
|
+
```bash
|
|
130
|
+
grep -c '\[x\]' openspec/changes/<name>/tasks.md
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
- 返回 0(全部 unchecked)→ 尚未开始编码,允许回溯
|
|
134
|
+
- 返回 > 0(有已勾选任务)→ 编码已开始,拒绝回溯
|
|
135
|
+
|
|
136
|
+
**未开始编码(全部 unchecked):**
|
|
137
|
+
|
|
138
|
+
> → (a) 确认变更,回到 brainstorming(清理 plan 制品,在当前 change 内修正)
|
|
139
|
+
> → (b) 取消,继续 apply
|
|
140
|
+
|
|
141
|
+
用户选 (a) → 执行 plan.md 的"回溯清理步骤"(删除 proposal/design/tasks/plans/specs,重置 records/phase_timings),回到 brainstorming。
|
|
142
|
+
|
|
143
|
+
**编码已开始(有 [x]):**
|
|
144
|
+
|
|
145
|
+
> 编码已开始(<N> 个任务已完成),需求变更应开新 change:
|
|
146
|
+
> /alloy:start <建议名称>
|
|
147
|
+
>
|
|
148
|
+
> 当前 change 继续执行,或 /alloy:discard 放弃。
|
|
149
|
+
|
|
150
|
+
不允许在当前 change 内回溯——已有代码落地,规格和代码不能分叉。
|
|
151
|
+
|
|
152
|
+
## 执行步骤
|
|
153
|
+
|
|
154
|
+
### [Step 1/5] 隔离环境设置
|
|
155
|
+
|
|
156
|
+
**幂等检查:** 先读取 worktree 状态:
|
|
157
|
+
```bash
|
|
158
|
+
alloy _state read openspec/changes/<name> worktree
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
```
|
|
162
|
+
Step 1/5 进度检测:
|
|
163
|
+
worktree 值: ".worktrees/<name>/" → 路径存在 → ✓ 已完成,跳过此步骤
|
|
164
|
+
worktree 值: ".worktrees/<name>/" → 路径不存在 → ⚠️ 残留记录,重新处理
|
|
165
|
+
worktree 值: "skipped" → ✓ 用户选择不创建,跳过此步骤
|
|
166
|
+
worktree 值: null(从未写入) → ⚠️ 尚未决定,加载 using-git-worktrees
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
路径存在、"skipped" 时,直接跳过 Step 1,进入 Step 2。
|
|
170
|
+
|
|
171
|
+
null 时,先展示摘要,再加载技能:
|
|
172
|
+
|
|
173
|
+
```
|
|
174
|
+
> [Step 1/5] 隔离环境设置
|
|
175
|
+
>
|
|
176
|
+
> 源分支: <当前 git branch>
|
|
177
|
+
> Worktree 分支: worktree-<change-name>
|
|
178
|
+
> Worktree 路径: .claude/worktrees/<change-name>
|
|
179
|
+
>
|
|
180
|
+
> 加载 superpowers:using-git-worktrees...
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
使用 Skill 工具加载 `superpowers:using-git-worktrees` 技能。该技能内置了完整的决策流程,Agent 按其内部指引执行即可。
|
|
184
|
+
|
|
185
|
+
**when 用户选择不创建 worktree:** 写入 `skipped`(非 null):
|
|
186
|
+
```bash
|
|
187
|
+
alloy _state write openspec/changes/<name> worktree skipped
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
技能执行完成后,将结果写入状态文件——这是断点恢复的关键数据:
|
|
191
|
+
- 已创建 worktree → `alloy _state write openspec/changes/<name> worktree "<path>"`
|
|
192
|
+
- 用户拒绝或已在隔离环境 → `alloy _state write openspec/changes/<name> worktree skipped`
|
|
193
|
+
|
|
194
|
+
**Step 1/5 完成汇总:**
|
|
195
|
+
|
|
196
|
+
```
|
|
197
|
+
> [Step 1/5] 隔离环境 — 已跳过(用户选择不创建)
|
|
198
|
+
|
|
199
|
+
或
|
|
200
|
+
|
|
201
|
+
> [Step 1/5] 隔离环境 — 就绪
|
|
202
|
+
>
|
|
203
|
+
> 源分支: feature/<name>
|
|
204
|
+
> Worktree 分支: worktree-<name>
|
|
205
|
+
> Worktree 路径: .claude/worktrees/<name>
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
### [Step 2/5] 任务实现
|
|
209
|
+
|
|
210
|
+
**幂等检查:** 读取 `tasks.md`,扫描 checkbox 状态:
|
|
211
|
+
|
|
212
|
+
```
|
|
213
|
+
Step 2/5 进度检测:
|
|
214
|
+
tasks.md: 3/7 已勾选 → 已完成的 task TDD 测试仍通过,自然跳过
|
|
215
|
+
→ 从第一个未勾选的 task 开始执行
|
|
216
|
+
tasks.md: 7/7 已勾选 → ✓ 已完成,跳过此步骤
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
TDD 机制天然保证幂等——已实现的 task 对应测试已通过,重跑时自动跳过。无需额外检测。
|
|
220
|
+
|
|
221
|
+
> 按 plans.md 微步骤执行实现...
|
|
222
|
+
|
|
223
|
+
**先分析,再展示推荐方案:**
|
|
224
|
+
|
|
225
|
+
1. 读取 `plans.md` 的 YAML frontmatter,提取 `strategy` 和 `reason`
|
|
226
|
+
2. 读取 `tasks.md`,分析任务特征——任务数、独立性、耦合度、并行潜力
|
|
227
|
+
3. 展示推荐方案(来自 plans.md header),用户可覆写:
|
|
228
|
+
|
|
229
|
+
```
|
|
230
|
+
[Step 2/5] 执行策略选择
|
|
231
|
+
──────────────────────────────────────
|
|
232
|
+
|
|
233
|
+
任务分析:<N 个任务,哪些独立/哪些耦合>
|
|
234
|
+
|
|
235
|
+
推荐方案:<superpowers:subagent-driven-development / superpowers:executing-plans>(规划阶段建议)
|
|
236
|
+
理由:<来自 plans.md reason>
|
|
237
|
+
|
|
238
|
+
1. superpowers:subagent-driven-development — 派发子 agent 并行执行(推荐)
|
|
239
|
+
2. superpowers:executing-plans — 当前 session 逐步实现
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
**如果 plans.md 有 strategy header:**
|
|
243
|
+
- 对应选项标记为"(推荐)"
|
|
244
|
+
- 用户不明确选择时,默认采用推荐方案
|
|
245
|
+
- 展示推荐时,一起展示 writing-plans 给出的 `reason`(策略背后的分析理由)
|
|
246
|
+
|
|
247
|
+
**如果 plans.md 无 strategy header(兼容旧 change):**
|
|
248
|
+
- 分析任务特征后给出推荐
|
|
249
|
+
- 两个选项不标记推荐,等用户明确选择
|
|
250
|
+
- **策略决定后,将 strategy 回写到 plans.md YAML frontmatter**,补充 `strategy` 和 `reason` 字段,然后重新 hash 锁定。这确保后续 apply(如断线重连)不会重复分析。
|
|
251
|
+
|
|
252
|
+
**必须等待用户明确选择后才能继续。**
|
|
253
|
+
|
|
254
|
+
4. 用户选择后,加载对应技能,**按其内部指引执行**,alloy 不重复建造选择闸门
|
|
255
|
+
|
|
256
|
+
Superpowers 技能内部行为(alloy 仅编排,不替代):
|
|
257
|
+
|
|
258
|
+
**superpowers:subagent-driven-development 路径:** 加载 `superpowers:subagent-driven-development` 技能,由其内部驱动:
|
|
259
|
+
- 读取 plan → 分派子 agent → 每个子 agent 独立执行 TDD + code review(transitive 激活)
|
|
260
|
+
- 子 agent 各自勾选 tasks.md 中对应任务的 checkbox
|
|
261
|
+
|
|
262
|
+
**superpowers:executing-plans 路径:** 分三步执行,确保不丢 TDD 和 code review 闸门:
|
|
263
|
+
|
|
264
|
+
**1. 先加载 `superpowers:test-driven-development` 技能设定 TDD 预期:**
|
|
265
|
+
- 加载后,TDD 纪律(RED→GREEN→REFACTOR)成为本次执行的硬约束
|
|
266
|
+
- 不在 executing-plans 内部"顺便做"——先设定预期,再执行
|
|
267
|
+
|
|
268
|
+
**2. 加载 `superpowers:executing-plans` 技能执行 plans.md 微步骤:**
|
|
269
|
+
- executing-plans 按 plans.md 逐步执行,每步完成后暂停审查
|
|
270
|
+
- 执行过程中遵循 TDD 流程(先写测试→确认失败→实现→确认通过)
|
|
271
|
+
|
|
272
|
+
**3. executing-plans 完成后,加载 `superpowers:requesting-code-review` 技能:**
|
|
273
|
+
- 代码审查闸门——所有代码变更必须经过审查才能进入 Step 3 验证
|
|
274
|
+
|
|
275
|
+
> superpowers:executing-plans 路径不会 transitive 激活 TDD 或 code review。以上三步通过**显式加载**来补偿——先设定 TDD 预期,再执行,最后审查。
|
|
276
|
+
|
|
277
|
+
### Step 3/5:代码层验证
|
|
278
|
+
|
|
279
|
+
> [Step 3/5] superpowers:verification-before-completion
|
|
280
|
+
> 正在验证代码行为——测试通过、功能正确...
|
|
281
|
+
|
|
282
|
+
使用 Skill 工具加载 `superpowers:verification-before-completion` 技能 —— 代码行为验证。
|
|
283
|
+
|
|
284
|
+
验证失败 → 修复代码 → 回到 Step 2/5(SDD),确保修复也有 TDD + code review 安全网。
|
|
285
|
+
|
|
286
|
+
### Step 4/5:制品层验证
|
|
287
|
+
|
|
288
|
+
**幂等检查:** 检查 verify.md 是否存在且 hash 有效:
|
|
289
|
+
```bash
|
|
290
|
+
alloy _record check openspec/changes/<name> verify 2>/dev/null && echo "VERIFY_DONE" || echo "VERIFY_NEEDED"
|
|
291
|
+
```
|
|
292
|
+
|
|
293
|
+
```
|
|
294
|
+
Step 4/5 进度检测:
|
|
295
|
+
verify.md 存在 + hash 有效 → ✓ 已完成,跳过此步骤
|
|
296
|
+
verify.md 缺失或 hash 无效 → 执行制品验证
|
|
297
|
+
```
|
|
298
|
+
|
|
299
|
+
verify.md 已完成时,跳过 Step 4,直接进入 Step 5。
|
|
300
|
+
|
|
301
|
+
> [Step 4/5] 制品层验证
|
|
302
|
+
> 正在验证制品结构——7 项结构化检查 → verify.md...
|
|
303
|
+
|
|
304
|
+
**生成 verify 前,校验上游 plans 的 hash:**
|
|
305
|
+
```bash
|
|
306
|
+
alloy _record check openspec/changes/<name> plans
|
|
307
|
+
```
|
|
308
|
+
若 check 失败 → HARD STOP,plans 可能被未审批修改。
|
|
309
|
+
|
|
310
|
+
1. 调用 `/opsx:verify` 执行结构化的 7 项检查
|
|
311
|
+
2. `/opsx:verify` 的输出由 OpenSpec CLI 生成,其语言不由 Agent 控制。Agent 拿到输出后,**必须将 verify.md 重写为与 `instructions/verify.md` 和 `templates/verify.md` 一致的语言**,不得直接透传 CLI 输出
|
|
312
|
+
3. 检查结果(PASS/FAIL/WARNING)保留作为事实依据
|
|
313
|
+
|
|
314
|
+
7 项检查:结构校验 → 任务完成 → Delta Spec 同步 → Design/Specs 一致性 → 实现信号 → 路由泄漏检测 → 延期任务对照。
|
|
315
|
+
|
|
316
|
+
验证失败 → 修复 → 回到 Step 2/5(SDD)。verify 不通过不结束 apply。
|
|
317
|
+
|
|
318
|
+
**tasks.md checkbox 已更新,重录 hash:**
|
|
319
|
+
```bash
|
|
320
|
+
HASH=$(alloy _record compute openspec/changes/<name> tasks)
|
|
321
|
+
alloy _record write openspec/changes/<name> tasks "$HASH" "$(date "+%Y-%m-%d %H:%M:%S")" "$(alloy _record approver openspec/changes/<name>)"
|
|
322
|
+
```
|
|
323
|
+
|
|
324
|
+
**verify.md 生成后,展示审查窗口:**
|
|
325
|
+
|
|
326
|
+
> 制品 [1/2] verify ✓ 完成
|
|
327
|
+
>
|
|
328
|
+
> [展示 verify.md 完整内容]
|
|
329
|
+
>
|
|
330
|
+
> → 下一个:retrospective
|
|
331
|
+
> → (a) 确认,锁定 verify 并继续 retrospective
|
|
332
|
+
> → (b) 需要调整 — 说明修改点,修改后重新展示
|
|
333
|
+
|
|
334
|
+
选 (a):hash 锁定 verify 并 commit:
|
|
335
|
+
```bash
|
|
336
|
+
HASH=$(alloy _record compute openspec/changes/<name> verify)
|
|
337
|
+
APPROVED_AT=$(date "+%Y-%m-%d %H:%M:%S")
|
|
338
|
+
APPROVER=$(alloy _record approver openspec/changes/<name>)
|
|
339
|
+
alloy _record write openspec/changes/<name> verify "$HASH" "$APPROVED_AT" "$APPROVER"
|
|
340
|
+
git add openspec/changes/<name>/verify.md
|
|
341
|
+
git commit -m "docs(<name>): verify 已确认"
|
|
342
|
+
```
|
|
343
|
+
|
|
344
|
+
选 (b):调整 verify 内容后重新展示审查窗口。
|
|
345
|
+
|
|
346
|
+
### Step 5/5:复盘
|
|
347
|
+
|
|
348
|
+
**幂等检查:** 检查 retrospective.md 是否存在且 hash 有效:
|
|
349
|
+
```bash
|
|
350
|
+
alloy _record check openspec/changes/<name> retrospective 2>/dev/null && echo "RETRO_DONE" || echo "RETRO_NEEDED"
|
|
351
|
+
```
|
|
352
|
+
|
|
353
|
+
```
|
|
354
|
+
Step 5/5 进度检测:
|
|
355
|
+
retrospective.md 存在 + hash 有效 → ✓ 已完成,跳过此步骤
|
|
356
|
+
retrospective.md 缺失或 hash 无效 → 执行复盘
|
|
357
|
+
```
|
|
358
|
+
|
|
359
|
+
retrospective.md 已完成时,跳过 Step 5,直接进入完成阶段。
|
|
360
|
+
|
|
361
|
+
> [Step 5/5] retrospective
|
|
362
|
+
> 正在生成全周期复盘报告(§0-§6)...
|
|
363
|
+
|
|
364
|
+
读取 `instructions/retrospective.md`,按模板 `templates/retrospective.md` 生成 `openspec/changes/<name>/retrospective.md`。
|
|
365
|
+
|
|
366
|
+
**输出语言与 `instructions/retrospective.md` 和 `templates/retrospective.md` 保持一致。** 代码标识符、commit hash、文件名保持原始语言。
|
|
367
|
+
|
|
368
|
+
**生成 retrospective 前,校验上游 verify 的 hash:**
|
|
369
|
+
```bash
|
|
370
|
+
alloy _record check openspec/changes/<name> verify
|
|
371
|
+
```
|
|
372
|
+
若 check 失败 → HARD STOP。
|
|
373
|
+
|
|
374
|
+
**PRECHECK:** verify.md 存在且 Overall Decision 不是 FAIL,否则 STOP。
|
|
375
|
+
|
|
376
|
+
**§0 量化全景:** 三来源自动收集——`.alloy.yaml` records(制品审批链)+ `git log`(全周期 commit,按 type 和阶段分组)+ 文件系统(任务完成比、变更规模、测试覆盖信号)。
|
|
377
|
+
|
|
378
|
+
**§1 Wins:** `[evidence: ...]` 格式,聚焦可复现的成功模式。
|
|
379
|
+
|
|
380
|
+
**§2 Misses:** 🔴 blocking / 🟡 painful / 📌 nit 三级严重度。
|
|
381
|
+
|
|
382
|
+
**§3 Plan Deviations:** 计划 vs 实际变更表格,含 strategy 偏差说明。
|
|
383
|
+
|
|
384
|
+
**§4 全周期技能审计:** Agent 自报 start/plan/apply 三阶段 11 项技能/命令使用情况(✓/✗)。同一 session 亲历,无需推断。跳过的技能填三问(跳过什么/为什么/如何防复发)。
|
|
385
|
+
|
|
386
|
+
**§5 Surprises:** 被推翻的假设。
|
|
387
|
+
|
|
388
|
+
**§6 Promote Candidates:** `- [ ]` checklist + Why/How to apply,跨周期 carry-forward。标记 `Promote to: memory` 的条目在 archive 阶段由 Agent 写入 memory。
|
|
389
|
+
|
|
390
|
+
复盘是证据驱动的——每条结论都引用具体 commit 或文件。
|
|
391
|
+
跳过策略:单 commit 小修可跳过,写 "Skipped: single-commit fix, no insights"。
|
|
392
|
+
|
|
393
|
+
**retrospective.md 生成后,展示审查窗口:**
|
|
394
|
+
|
|
395
|
+
> 制品 [2/2] retrospective ✓ 完成
|
|
396
|
+
>
|
|
397
|
+
> [展示 retrospective.md 完整内容]
|
|
398
|
+
>
|
|
399
|
+
> → 下一个:完成 apply 阶段
|
|
400
|
+
> → (a) 确认,锁定 retrospective 并完成 apply
|
|
401
|
+
> → (b) 需要调整 — 说明修改点,修改后重新展示
|
|
402
|
+
|
|
403
|
+
选 (a):hash 锁定 retrospective 并 commit:
|
|
404
|
+
```bash
|
|
405
|
+
HASH=$(alloy _record compute openspec/changes/<name> retrospective)
|
|
406
|
+
alloy _record write openspec/changes/<name> retrospective "$HASH" "$(date "+%Y-%m-%d %H:%M:%S")" "$(alloy _record approver openspec/changes/<name>)"
|
|
407
|
+
git add openspec/changes/<name>/retrospective.md
|
|
408
|
+
git commit -m "docs(<name>): retrospective 已确认"
|
|
409
|
+
```
|
|
410
|
+
|
|
411
|
+
选 (b):调整 retrospective 内容后重新展示审查窗口。
|
|
412
|
+
|
|
413
|
+
---
|
|
414
|
+
|
|
415
|
+
### 完成
|
|
416
|
+
|
|
417
|
+
**记录阶段完成时间:**
|
|
418
|
+
|
|
419
|
+
```bash
|
|
420
|
+
COMPLETED_AT=$(date "+%Y-%m-%d %H:%M:%S")
|
|
421
|
+
TIMINGS=$(alloy _state read openspec/changes/<name> phase_timings 2>/dev/null || echo "{}")
|
|
422
|
+
echo "$TIMINGS" | python3 -c "
|
|
423
|
+
import sys,json
|
|
424
|
+
content = sys.stdin.read()
|
|
425
|
+
d = json.loads(content) if content.strip() else {}
|
|
426
|
+
p = d.setdefault('apply',{})
|
|
427
|
+
if 'completed_at' not in p:
|
|
428
|
+
p['completed_at']='$COMPLETED_AT'
|
|
429
|
+
print(json.dumps(d))
|
|
430
|
+
" | while read -r val; do alloy _state write openspec/changes/<name> phase_timings "$val"; done
|
|
431
|
+
git add openspec/changes/<name>/
|
|
432
|
+
git commit -m "chore(<name>): 记录 apply 阶段完成时间"
|
|
433
|
+
```
|
|
434
|
+
|
|
435
|
+
```
|
|
436
|
+
┌──────────────────────────────────────┐
|
|
437
|
+
│ Alloy [3/5] · Phase: Apply — DONE │
|
|
438
|
+
│ 启动时间: 从 phase_timings.apply.started_at 读取 │
|
|
439
|
+
│ 完成时间: 从 phase_timings.apply.completed_at 读取 │
|
|
440
|
+
│ 耗时: completed_at - started_at 计算 │
|
|
441
|
+
└──────────────────────────────────────┘
|
|
442
|
+
|
|
443
|
+
→ Change: <name>
|
|
444
|
+
→ Phase: applied
|
|
445
|
+
→ Worktree: <path 或 当前分支>
|
|
446
|
+
|
|
447
|
+
所有制品已生成并锁定:
|
|
448
|
+
|
|
449
|
+
制品 状态 Hash 创建时间
|
|
450
|
+
────────────── ──── ──────────── ───────────────────
|
|
451
|
+
plans ✓ <hash> <timestamp>
|
|
452
|
+
verify ✓ <hash> <timestamp>
|
|
453
|
+
retrospective ✓ <hash> <timestamp>
|
|
454
|
+
|
|
455
|
+
→ 代码变更已提交
|
|
456
|
+
→ 验证: <PASS 或 存在 N 个 WARN>
|
|
457
|
+
```
|
|
458
|
+
|
|
459
|
+
**apply 阶段 commit 规则:**
|
|
460
|
+
- 代码变更:SDD 过程中每次成功验证后立即 commit
|
|
461
|
+
- verify.md / retrospective.md:用户通过审查窗口选 (a) 确认后,hash 锁定 + commit(具体命令已内联在上方各审查窗口中)
|
|
462
|
+
|
|
463
|
+
**通过 `alloy _guard` 校验并更新 phase:**
|
|
464
|
+
```bash
|
|
465
|
+
alloy _guard openspec/changes/<name> applied --apply
|
|
466
|
+
```
|
|
467
|
+
guard 自动校验 hash 一致性后推进 phase。
|
|
468
|
+
|
|
469
|
+
```
|
|
470
|
+
💡 建议:可以执行 QA 测试或浏览器测试等质量检查,确认后再进入 archive。
|
|
471
|
+
|
|
472
|
+
准备好后,运行 `/alloy:archive` 进入归档阶段。
|
|
473
|
+
```
|
|
474
|
+
|
|
475
|
+
---
|
|
476
|
+
|
|
477
|
+
## 闸门规则
|
|
478
|
+
|
|
479
|
+
- **git add 只用精确路径** — 永远不用 `-A`、`-a`、`.`。
|
|
480
|
+
代码变更只 add 本次改动的具体文件;反例:`git add .` 会把第三方依赖、临时文件一起提交
|
|
481
|
+
- **precheck 不过不执行** —— 6 个技能任一缺失即 STOP,不静默降级
|
|
482
|
+
- **verify 不通过不结束 apply** —— 两层验证(代码层 + 制品层),任意 FAIL 回到 SDD
|
|
483
|
+
- **retrospective PRECHECK** —— verify.md 不存在或 Overall Decision 是 FAIL 时 STOP
|
|
484
|
+
- **apply 完成后不要自动进入 archive** —— archive 是人工闸门,留给用户空间做 QA
|
|
485
|
+
- **每制品独立 commit** — verify 和 retrospective 单独 hash 锁定并 commit
|