kld-sdd 2.4.16 → 2.4.18
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/lib/init.js +15 -3
- package/package.json +2 -1
- package/skywalk-sdd/apply-worktree-finish.cjs +551 -0
- package/skywalk-sdd/index.cjs +6 -0
- package/templates/hooks/claude/hooks/sdd-apply-gate.cjs +11 -9
- package/templates/hooks/claude/hooks/sdd-apply-test-gate.cjs +315 -0
- package/templates/hooks/claude/hooks/sdd-skill-apply-gate.cjs +268 -0
- package/templates/hooks/claude/settings.json +17 -0
- package/templates/skills/kld-sdd/opsx-apply/SKILL.md +224 -16
- package/templates/skills/kld-sdd/opsx-apply/worktree-setup.md +64 -101
- package/templates/skills/kld-sdd/opsx-archive/SKILL.md +10 -0
- package/templates/skills/kld-sdd/opsx-check/SKILL.md +5 -5
- package/templates/skills/kld-sdd/opsx-design/SKILL.md +3 -3
- package/templates/skills/kld-sdd/opsx-explore/SKILL.md +7 -7
- package/templates/skills/kld-sdd/opsx-propose/SKILL.md +5 -5
- package/templates/skills/kld-sdd/opsx-spec/SKILL.md +4 -4
- package/templates/skills/kld-sdd/opsx-task/SKILL.md +3 -3
- package/templates/skills/kld-sdd/opsx-test/SKILL.md +2 -2
|
@@ -129,42 +129,187 @@ openspec list --json
|
|
|
129
129
|
> **必须先执行质量门禁检查,再开始代码实施:**
|
|
130
130
|
>
|
|
131
131
|
> ```
|
|
132
|
-
> /opsx
|
|
132
|
+
> /opsx-check <change-name>
|
|
133
133
|
> ```
|
|
134
134
|
>
|
|
135
135
|
> **原因**:check 阶段验证文档完整性、一致性、可执行性,跳过 check 直接 apply 可能导致需求误解或设计缺陷。
|
|
136
136
|
>
|
|
137
|
-
> **操作顺序**:`/opsx
|
|
137
|
+
> **操作顺序**:`/opsx-check → /opsx-apply`
|
|
138
138
|
>
|
|
139
139
|
> 是否要现在执行 check?"
|
|
140
140
|
|
|
141
|
-
- 若用户确认执行 check → 引导执行 `/opsx
|
|
141
|
+
- 若用户确认执行 check → 引导执行 `/opsx-check`
|
|
142
142
|
- 若用户坚持跳过 → **强制拒绝**,不得跳过 check 直接 apply
|
|
143
143
|
|
|
144
144
|
4. **若 telemetry 数据缺失**(如新项目无历史数据):
|
|
145
|
-
> "⚠️ 未找到 check 阶段记录。如果这是首次执行,请先运行 `/opsx
|
|
145
|
+
> "⚠️ 未找到 check 阶段记录。如果这是首次执行,请先运行 `/opsx-check <change-name>` 完成质量门禁。
|
|
146
146
|
>
|
|
147
147
|
> 是否要现在执行 check?"
|
|
148
148
|
|
|
149
|
-
> **🔗
|
|
149
|
+
> **🔗 门禁体系**:
|
|
150
|
+
> - Check:`sdd-skill-apply-gate` + `sdd-apply-gate` + 本技能 §1.2
|
|
151
|
+
> - 单元测试(`test-strategy: tdd | impl-first`):`sdd-apply-test-gate` 在 `log.cjs end` / `apply-worktree-finish` / Stop 时校验是否**真实执行**过测试
|
|
150
152
|
|
|
151
|
-
### 1.5
|
|
153
|
+
### 1.5 【本地并行】Worktree 与工作区(建议性策略)
|
|
152
154
|
|
|
153
|
-
>
|
|
154
|
-
>
|
|
155
|
+
> **目标(本质)**:在**本地仓库**加快 SDD Apply——让**解耦**的 spec/capability 可以各自实现、互不踩目录,做完再按依赖顺序合并回你**当时所在的分支**(集成分支,如 `hotfix-1`)。
|
|
156
|
+
>
|
|
157
|
+
> **不是**:保护 `master`、不是「主分支只放文档」、不是远程流水线分支策略。一切基于**本地 Git + 本地 worktree**。
|
|
158
|
+
|
|
159
|
+
#### 两层并行(不要混为一谈)
|
|
160
|
+
|
|
161
|
+
| 层级 | 手段 | 适用 |
|
|
162
|
+
|------|------|------|
|
|
163
|
+
| **Capability 级**(跨 spec) | 每个解耦的 capability **单独**跑一次 `/opsx-apply` + **独立** worktree/apply 分支 | proposal 中能力**可并行**、无文件/接口/数据强依赖 |
|
|
164
|
+
| **Task 级**(cap 内) | **同一** worktree 内,DAG 同层子代理并行 | tasks.md 同层任务不改相同文件 |
|
|
165
|
+
|
|
166
|
+
- 本技能单次仍只实施**一个** capability;「多 spec 并行」= 多个 apply 会话 + 多个 worktree,不是一次加载多个 capability 文档。
|
|
167
|
+
- §5 子代理并行 **不** 再建 worktree;Capability 级并行在 §1.5 决定「本次是否建 worktree」。
|
|
168
|
+
|
|
169
|
+
#### 何时建议建 worktree / 按 capability 切分支?(模型判断,非强制)
|
|
170
|
+
|
|
171
|
+
**倾向创建**(full 模式常见:`.worktrees/apply-<change>-<capability>` + `kld-sdd/<change>/<capability>`):
|
|
172
|
+
|
|
173
|
+
- `proposal.md` §3 中该 capability 与并行中的其他能力**无**「修改同一模块 / 共享表 / 必须先合入」等描述
|
|
174
|
+
- `design.md` 显示文件路径、包、表与并行中的其他 cap **基本不重叠**
|
|
175
|
+
- 用户需要在**同一集成分支**上并行推进多个 cap,且机器资源允许(多份 `node_modules`)
|
|
176
|
+
|
|
177
|
+
**倾向不建 / 串行 apply**(仍在集成分支上改,或只开一个 worktree):
|
|
178
|
+
|
|
179
|
+
- proposal 写明 capability **依赖**(B 依赖 A 已合入)
|
|
180
|
+
- 多 cap 改**同一文件/模块/配置**(merge 冲突几乎必然)
|
|
181
|
+
- 数据库迁移、公共类型、单例注册等**顺序敏感**
|
|
182
|
+
- 已有另一个 capability 的 worktree **尚未 finish merge** 到集成分支,且当前 cap 需要基于**最新**集成结果开发
|
|
183
|
+
- 沙箱禁止 `git worktree add` → 回退当前目录 + 功能分支,并告知用户
|
|
184
|
+
|
|
185
|
+
**full 模式「一 capability 一分支」**:是**命名与目录约定 + 建议**,须先通过下方 **§1.5 Step 0.1 校验** 再命名/建 worktree。simple 模式通常**一 change 一 worktree**。
|
|
186
|
+
|
|
187
|
+
#### Step 0.1 【必做】分支/隔离校验(早于 record-base 与 `git worktree add`)
|
|
188
|
+
|
|
189
|
+
> 在建议分支名 `kld-sdd/<change>/<capability>` 或创建 worktree **之前**,用 `proposal.md` + 各 capability **spec 依赖信息** 做交叉校验。未通过则**不**按 full 并行策略拆分支,改为串行或本次不建 worktree。
|
|
190
|
+
|
|
191
|
+
**Step A — 读变更级能力清单(允许读 proposal,不读其它 cap 的 design/tasks)**
|
|
192
|
+
|
|
193
|
+
从 `changes/<change-name>/proposal.md` 提取:
|
|
194
|
+
|
|
195
|
+
| 字段 | 用途 |
|
|
196
|
+
|------|------|
|
|
197
|
+
| frontmatter `mode` | `full` → 倾向 `apply-<change>-<cap>`;`simple` → 倾向 `apply-<change>` |
|
|
198
|
+
| §3.1 / §3.2 能力列表 | 本 change 下全部 capability 名 |
|
|
199
|
+
| §4.2 依赖关系图 | 能力间先后 / 上下游 |
|
|
200
|
+
| §5.3 前置依赖 checkbox | 未满足则当前 cap 不宜并行 |
|
|
201
|
+
|
|
202
|
+
**Step B — 读当前 capability 的 spec 依赖(§2 正式加载前仅此文件)**
|
|
203
|
+
|
|
204
|
+
读取**当前** capability 的 `spec.md`(路径按 mode):
|
|
205
|
+
|
|
206
|
+
- **full**:`changes/<change>/specs/<capability>/spec.md` 或 `openspec/changes/.../specs/<capability>/spec.md`(以项目实际为准)
|
|
207
|
+
- **simple**:`changes/<change>/spec.md`
|
|
208
|
+
|
|
209
|
+
只重点读 spec 中:**能力边界 / 涉及模块 / §4 内部与外部依赖**(是否写明依赖其它 capability、共享表、必须先发布的接口)。
|
|
210
|
+
|
|
211
|
+
**Step C — 跨 capability 轻量交叉(隔离例外,仅本节)**
|
|
212
|
+
|
|
213
|
+
对 §3 中**其它** capability,**只**读取其 `spec.md` 的:
|
|
214
|
+
|
|
215
|
+
- 标题与能力简述
|
|
216
|
+
- **§4 依赖**(是否依赖 `<当前 capability>` 或其它 cap)
|
|
217
|
+
- **涉及模块 / 数据表 / 公共配置**(若有)
|
|
218
|
+
|
|
219
|
+
⛔ 禁止为校验而加载其它 cap 的 `design.md`、`tasks.md`(完整实施上下文仍遵守 §2 隔离红线)。
|
|
220
|
+
|
|
221
|
+
**Step D — 判定矩阵(输出给用户)**
|
|
222
|
+
|
|
223
|
+
| 校验项 | 不通过时的处理 |
|
|
224
|
+
|--------|----------------|
|
|
225
|
+
| proposal §4.2 / §5.3 写明当前 cap **依赖** 未完成的其它 cap | **串行**:先 finish 上游,再 apply 当前;不并行拆分支 |
|
|
226
|
+
| 其它 cap 的 spec 写明 **依赖当前 cap** 且当前 cap 未 finish | 当前可并行实施,但提醒下游须等本次 finish |
|
|
227
|
+
| 多 cap spec 出现**相同模块路径 / 同表 / 同配置文件** | **不并行** worktree;串行或合并为一个 apply 范围 |
|
|
228
|
+
| 当前 cap spec §4 要求接口/表已由其它 cap 提供 | 若其它 cap 未 merge 到集成分支 → **不建** worktree,先完成上游 |
|
|
229
|
+
| `git branch --list 'kld-sdd/<change>/*'` 已存在同名分支 | 复用既有 worktree/分支,或询问用户是否清理后重建 |
|
|
230
|
+
| 沙箱 / 环境无法 `worktree add` | 不建 worktree;集成分支上直接开发 |
|
|
231
|
+
|
|
232
|
+
**Step E — 分支与目录命名(校验通过后)**
|
|
233
|
+
|
|
234
|
+
| mode | worktree 目录(建议) | apply 分支(建议) |
|
|
235
|
+
|------|----------------------|-------------------|
|
|
236
|
+
| full + 可隔离 | `.worktrees/apply-<change>-<capability>` | `kld-sdd/<change>/<capability>` |
|
|
237
|
+
| simple 或 change 内单实现体 | `.worktrees/apply-<change>` | `kld-sdd/<change>/<capability>`(cap 可与 change 同名) |
|
|
238
|
+
| 校验不通过但仍需隔离 | `.worktrees/apply-<change>-<capability>` 或单 worktree | 仍用 `kld-sdd/<change>/<capability>`,但**不得**与其它 cap 并行 |
|
|
239
|
+
|
|
240
|
+
**报告模板**(创建 worktree 前必须输出):
|
|
241
|
+
|
|
242
|
+
```
|
|
243
|
+
📋 Apply 隔离校验 — <change>/<capability>
|
|
244
|
+
- mode: full | simple
|
|
245
|
+
- 本 change 能力域: [cap-a, cap-b, …]
|
|
246
|
+
- 与当前 cap 冲突/依赖: [无 | cap-a 必须先合入 | 与 cap-b 共享模块 X]
|
|
247
|
+
- 并行建议: [可独立 worktree | 串行等待 cap-a | 不建 worktree,原地 apply]
|
|
248
|
+
- 分支(建议): kld-sdd/<change>/<capability>
|
|
249
|
+
- 集成分支(将 record-base): <当前 git 分支>
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
#### 多 Capability 并行时的合并顺序(本地)
|
|
253
|
+
|
|
254
|
+
1. 各 capability 在各自 worktree 内完成 + `§6.1 finish` 前,先根据 `proposal.md` 排出 **capability 依赖 DAG**。
|
|
255
|
+
2. **按 DAG 顺序**依次 `finish` merge 到**同一** `integration_base`(先 A 合入,再 B;B 的 worktree 若基于旧尖端,merge 前应在 B 的 worktree 内 `merge/rebase integration_base` 或由用户选择重建 worktree)。
|
|
256
|
+
3. 有依赖的 cap **不要**与上游 cap 同时 finish;无依赖的可并行实施,但 **merge 仍建议逐个** 以降低冲突。
|
|
257
|
+
|
|
258
|
+
向用户简要说明判断结果:
|
|
259
|
+
> "📌 并行建议:cap-A、cap-C 可并行 worktree;cap-B 依赖 A,待 A finish 后再 apply。"
|
|
260
|
+
|
|
261
|
+
#### 分支 / Worktree 创建时机(勿与子代理混淆)
|
|
262
|
+
|
|
263
|
+
| 时机 | 做什么 | 谁执行 |
|
|
264
|
+
|------|--------|--------|
|
|
265
|
+
| **§1.5 Step 0.25~1(仅一次)** | 记录集成分支 → 创建 worktree + 新建 `kld-sdd/<change>/<capability>` | **主会话** |
|
|
266
|
+
| §2~§4 | 读文档、解析 DAG | 主会话 |
|
|
267
|
+
| **§5 子代理** | 在**已有** worktree 内实现任务 | **子代理**(不建 worktree、不建分支) |
|
|
268
|
+
| **§6.1** | merge 回集成分支 → remove worktree → 删 apply 分支 | **主会话** + `apply-worktree-finish.cjs` |
|
|
269
|
+
|
|
270
|
+
- 集成分支 = Apply **开始时**主仓库 `git branch --show-current`(例:用户在 `hotfix-1` 上开始,则 merge 回 `hotfix-1`)。
|
|
271
|
+
- `git worktree add -b` 在主仓库处于集成分支时执行,apply 分支从该分支尖端分出。
|
|
272
|
+
- **子代理禁止** `EnterWorktree` / `git worktree add` / `checkout -b`;同层并行共享**同一** worktree 与 apply 分支。
|
|
155
273
|
|
|
156
274
|
**设置流程**(详见 `./worktree-setup.md`):
|
|
157
275
|
|
|
158
276
|
**Step 0: 检测当前状态**
|
|
159
|
-
- 若已是 Git Worktree →
|
|
277
|
+
- 若已是 Git Worktree → 跳过创建(集成分支应已在 state 文件中)
|
|
160
278
|
- 若非 Git 项目(`vcs_mode=no-git`)→ 跳过
|
|
161
279
|
|
|
280
|
+
**Step 0.1: 分支/隔离校验** — 见上文「Step 0.1 【必做】」,**通过后再执行** 0.25 / 0.5 / Step 1
|
|
281
|
+
|
|
282
|
+
**Step 0.25: 记录集成分支(Git 项目必做,创建 worktree 之前)**
|
|
283
|
+
|
|
284
|
+
在主仓库根目录、**尚未** `cd` 进 `.worktrees/` 时执行:
|
|
285
|
+
|
|
286
|
+
```bash
|
|
287
|
+
node skywalk-sdd/apply-worktree-finish.cjs --record-base \
|
|
288
|
+
--change=<变更名称> \
|
|
289
|
+
--capability=<capability-name>
|
|
290
|
+
```
|
|
291
|
+
|
|
292
|
+
- 将当前具名分支写入 `skywalk-sdd/state/apply-<change>-<capability>.json` 的 `integration_base`
|
|
293
|
+
- 若为 detached HEAD,先 `git checkout` 到具名分支再记录
|
|
294
|
+
- simple 模式可省略 `--capability`(默认与 change 相同)
|
|
295
|
+
|
|
296
|
+
**Step 0.5: 主仓库冲突预检(Git 项目必做)**
|
|
297
|
+
- 在主仓库根目录执行 `git status`,确认**无**与本次 Apply 将修改路径冲突的**未跟踪**实现文件(如 `src/`、`package.json` 等)
|
|
298
|
+
- 若存在,先移走、提交或删除;否则收尾 `merge` 会报 `untracked working tree files would be overwritten`
|
|
299
|
+
- 收尾脚本默认启用 `--check-untracked` 预检并给出明确报错
|
|
300
|
+
|
|
162
301
|
**Step 1: 创建隔离工作区**
|
|
302
|
+
|
|
303
|
+
> 确认主仓库仍检出在 **Step 0.25 记录的集成分支**(或与其一致的尖端),再创建 worktree。
|
|
304
|
+
|
|
163
305
|
- **首选**:使用 `EnterWorktree` 工具(Claude Code 原生)
|
|
164
306
|
```
|
|
165
307
|
EnterWorktree(name="apply-<change-name>-<capability-name>")
|
|
166
308
|
```
|
|
167
309
|
- **回退**:仅当原生工具不可用时,使用 `git worktree add`
|
|
310
|
+
- **full 模式**目录:`.worktrees/apply-<change-name>-<capability-name>`
|
|
311
|
+
- **simple 模式**目录:`.worktrees/apply-<change-name>`(无 capability 后缀)
|
|
312
|
+
- **分支命名**:仅当 Step 0.1 校验通过后,使用报告中的 `kld-sdd/<change-name>/<capability-name>`(勿对强依赖 cap 强行并行拆分支)
|
|
168
313
|
```bash
|
|
169
314
|
git worktree add .worktrees/apply-<change-name>-<capability-name> \
|
|
170
315
|
-b kld-sdd/<change-name>/<capability-name>
|
|
@@ -178,6 +323,7 @@ openspec list --json
|
|
|
178
323
|
|
|
179
324
|
**报告**:
|
|
180
325
|
> "✅ Worktree 就绪:`<path>`
|
|
326
|
+
> 集成分支:`<integration_base>`(收尾将 merge 回此分支)
|
|
181
327
|
> 基线测试通过(N 个测试,0 失败)
|
|
182
328
|
> 准备实施 `<change-name>/<capability-name>`"
|
|
183
329
|
|
|
@@ -243,6 +389,7 @@ b. **显示当前层级任务**
|
|
|
243
389
|
c. **🤖 派发子代理实现代码**
|
|
244
390
|
|
|
245
391
|
> **使用 Agent 工具并行派发同层任务,每个子代理负责一个任务,上下文隔离、专注高效。**
|
|
392
|
+
> **⛔ 子代理阶段不创建 worktree/分支**——隔离环境已在 §1.5 就绪;子代理仅在 worktree 目录内实现 TASK。
|
|
246
393
|
|
|
247
394
|
**派发准备(每个子代理):**
|
|
248
395
|
1. 从 tasks.md 中提取该任务的完整描述
|
|
@@ -333,24 +480,85 @@ node skywalk-sdd/log.cjs record --type=ai_adoption_review --command=apply --proj
|
|
|
333
480
|
> 建议执行 `/kld-review --local` 对本次变更的代码进行评审。
|
|
334
481
|
> 该技能可在公司内部 SkillHub 下载安装。
|
|
335
482
|
>
|
|
336
|
-
> **🧹 Worktree
|
|
337
|
-
>
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
483
|
+
> **🧹 Worktree 收尾**:若本次使用了 worktree,见 **§6.1**;若判定未建 worktree,跳过 §6.1。
|
|
484
|
+
> **其他 capability**:若并行 apply 中仍有未 finish 的 worktree,提示按 proposal 依赖顺序继续 `finish`。
|
|
485
|
+
|
|
486
|
+
### 6.0 【条件必做】单元测试真实执行(`test-strategy` 非 `none`)
|
|
487
|
+
|
|
488
|
+
当 `proposal.md` 的 `test-strategy` 为 **`tdd`** 或 **`impl-first`** 时:
|
|
489
|
+
|
|
490
|
+
1. **在结束 apply 或执行 §6.1 收尾之前**,必须在项目根或 worktree 内**真实运行**单元测试命令(`npm test` / `pytest` / `go test` 等)。
|
|
491
|
+
2. 须留下可核验的 telemetry 证据(任选其一):
|
|
492
|
+
- `node skywalk-sdd/log.cjs record --type=test_result ...`(`test_results.command` 非空,且 `passed`/`failed`/`duration_ms` 有实际值)
|
|
493
|
+
- `task_update` 的 `details-json` 中 `test_results` 含真实执行数据
|
|
494
|
+
- 或单独运行 `/opsx-test` 并完成 `command=test` 的 `stage_end`
|
|
495
|
+
3. **Claude Code**:`sdd-apply-test-gate.cjs` 会在 `log.cjs end`、`apply-worktree-finish`、会话 Stop 时自动校验;无证据则**阻断**并提示补跑测试。
|
|
496
|
+
|
|
497
|
+
| test-strategy | 行为 |
|
|
498
|
+
|---------------|------|
|
|
499
|
+
| `tdd` | 无测试证据不得结束 apply / 不得 finish worktree |
|
|
500
|
+
| `impl-first` | 同上,实现后必须补跑并记录 |
|
|
501
|
+
| `none` | 跳过本节与 test gate |
|
|
502
|
+
|
|
503
|
+
### 6.1 【条件必做】Worktree 收尾(仅当 §1.5 已创建 worktree)
|
|
504
|
+
|
|
505
|
+
> **⛔ 本次 Apply 若创建了 worktree**:DAG 全部完成且 **§6.0 测试门禁(若适用)** 通过后,必须在**主仓库根目录**执行收尾脚本(禁止在 `.worktrees/...` 内执行)。
|
|
506
|
+
> 若 §1.5 判定未建 worktree(串行、强依赖、沙箱回退),跳过本节。
|
|
507
|
+
|
|
508
|
+
**前置条件**:
|
|
509
|
+
- worktree 内 `git status` 干净(实现代码已全部 commit)
|
|
510
|
+
- 主仓库无与 merge 冲突的未跟踪文件(见 §1.5 Step 0.5)
|
|
511
|
+
- `test-strategy` 为 `tdd`/`impl-first` 时,§6.0 测试证据已存在
|
|
512
|
+
|
|
513
|
+
**执行**(主仓库根目录):
|
|
514
|
+
```bash
|
|
515
|
+
node skywalk-sdd/apply-worktree-finish.cjs \
|
|
516
|
+
--change=<变更名称> \
|
|
517
|
+
--capability=<capability-name>
|
|
518
|
+
```
|
|
519
|
+
|
|
520
|
+
- **默认 merge 目标**:§1.5 `--record-base` 写入的 `integration_base`(**不是**默认 master)
|
|
521
|
+
- 仅当 state 缺失或需覆盖时传 `--target=<集成分支>`
|
|
522
|
+
- **simple 模式**:`--capability` 可省略;目录为 `.worktrees/apply-<change>`
|
|
523
|
+
- **full 模式**:目录为 `.worktrees/apply-<change>-<capability>`
|
|
524
|
+
|
|
525
|
+
**脚本行为**:`checkout 集成分支` → `merge --no-ff` apply 分支 → `worktree remove` → 删临时目录 → `branch -d` apply 分支
|
|
526
|
+
|
|
527
|
+
**常用 flags**:`--dry-run` 预演;`--skip-merge` 已手动 merge;`--keep-branch` 保留 apply 分支;`--no-check-untracked` 跳过未跟踪预检
|
|
528
|
+
|
|
529
|
+
**收尾 Telemetry(推荐)**:
|
|
530
|
+
```bash
|
|
531
|
+
node skywalk-sdd/log.cjs record --type=worktree_finish \
|
|
532
|
+
--command=apply --project=. --change=<变更名称> --capability=<capability-name> \
|
|
533
|
+
--agent=<Agent类型> --source=opsx-command --session-id=<会话ID> \
|
|
534
|
+
--result=success --summary="merge+remove completed" \
|
|
535
|
+
--details-json='{"integration_base":"<branch>","merge_commit":"<sha>","worktree_removed":true}'
|
|
536
|
+
```
|
|
537
|
+
|
|
538
|
+
**回退**(仅当脚本不可用时,详见 `./worktree-setup.md`):
|
|
539
|
+
- `EnterWorktree`:`ExitWorktree(action="remove", discard_changes=false)`
|
|
540
|
+
- `git worktree add`:`git worktree remove` + `git branch -D`
|
|
541
|
+
|
|
542
|
+
> **与 Git 只读策略的关系**:Apply **实施过程**禁止 Agent 随意 commit;**收尾**由本脚本执行 merge/remove,属于流程必做步骤,不视为「随意提交业务代码」。
|
|
341
543
|
|
|
342
544
|
---
|
|
343
545
|
|
|
344
546
|
## Guardrails
|
|
345
547
|
|
|
346
|
-
- **⛔ Check 门禁检查**:apply 阶段开始前,必须确认 check 阶段已完成。若 check 未完成,**强制拒绝** apply,引导用户先执行 `/opsx
|
|
548
|
+
- **⛔ Check 门禁检查**:apply 阶段开始前,必须确认 check 阶段已完成。若 check 未完成,**强制拒绝** apply,引导用户先执行 `/opsx-check`。与 `sdd-apply-gate.cjs` Hook 形成双重保障。
|
|
347
549
|
- **⛔ 渐进式加载**:只加载当前 Capability 的四文档链
|
|
348
550
|
- **⛔ 隔离红线**:绝对禁止加载同级其他 Capability 的文档
|
|
349
551
|
- **⛔ DAG 依赖拦截**:执行任务前必须检查依赖,前置未完成必须拦截
|
|
350
552
|
- **⛔ 编译检查门禁**:每完成一个任务后,**必须运行编译检查**,编译失败禁止标记已完成
|
|
351
|
-
- **⛔ 测试执行门禁**:根据 `test-strategy` 决定测试门禁行为(tdd=强制, impl-first
|
|
553
|
+
- **⛔ 测试执行门禁**:根据 `test-strategy` 决定测试门禁行为(tdd=强制, impl-first=强制补跑, none=跳过);须真实执行并留 telemetry,`sdd-apply-test-gate` 会校验非占位数据
|
|
352
554
|
- **⛔ 必须实时更新任务状态**:每完成一个任务,**立即**修改 tasks.md 中的 `- [ ]` 为 `- [x]`,**同时修改** `**状态**: [ ] 未完成` 为 `**状态**: [x] 已完成`,两种格式不可遗漏
|
|
353
555
|
- **Git 只读策略**:禁止为了度量自动初始化 Git、创建分支或提交 commit;非 Git 项目使用 `vcs_mode=no-git` 继续执行
|
|
556
|
+
- **⛔ Step 0.1 隔离校验必做**:建 worktree / 建议分支名前,必须完成 proposal + 跨 cap spec 依赖校验并输出报告;未通过不得按 full 并行策略拆 `kld-sdd/<change>/<cap>`
|
|
557
|
+
- **Worktree 为加速手段,非必选项**:校验通过且解耦方可多 worktree;有依赖或共享修改面则串行
|
|
558
|
+
- **本地集成分支**:使用 worktree 时,`--record-base` 记录用户**当前本地分支**为 merge 目标,禁止默认写死 `master`
|
|
559
|
+
- **⛔ 已建 worktree 则收尾必做**:`apply-worktree-finish.cjs` merge 回 `integration_base`;多 cap 并行时按依赖顺序逐个 finish
|
|
560
|
+
- **⛔ 子代理不建分支**:worktree/apply 分支仅在 §1.5(主会话)创建一次,§5 子代理不得再建
|
|
561
|
+
- **Capability 级并行**:多个 `/opsx-apply` 会话 = 多个 worktree;禁止为未解耦的 cap 仅因 full 模式而拆分支
|
|
354
562
|
- **显示进度反馈**:每完成一个任务,显示「✅ [TASK-ID] 已完成 [N/M]」
|
|
355
563
|
- **保持任务聚焦**:每次只处理一个任务
|
|
356
564
|
- **遇到问题时暂停**:任务描述模糊、编译失败、测试失败或发现设计问题时暂停询问
|
|
@@ -1,141 +1,104 @@
|
|
|
1
|
-
# OPSX Apply
|
|
1
|
+
# OPSX Apply — 本地 Worktree 与并行加速
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
## 目标(读这个就够了)
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
- **为什么用 worktree**:在**本地**让解耦的 capability/spec **并行写代码**,互不干扰,再按依赖 **merge 回集成分支**,缩短 Apply 总时间。
|
|
6
|
+
- **不是什么**:不是保护 `master`、不是远程发布策略、不是「主分支只放 SDD 文档」。
|
|
6
7
|
|
|
7
|
-
|
|
8
|
-
- **回退到 git 命令**:仅当原生工具不可用时
|
|
9
|
-
- **所有子代理共享同一 Worktree**:DAG 分析确保同层任务不冲突
|
|
10
|
-
- **非 Git 项目跳过**:`vcs_mode=no-git` 时无需隔离
|
|
8
|
+
集成分支 = Apply 开始时主仓库的 `git branch --show-current`(如 `hotfix-1`)。收尾 merge 回这条**本地**分支。
|
|
11
9
|
|
|
12
|
-
##
|
|
10
|
+
## 两层并行
|
|
13
11
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
```bash
|
|
19
|
-
git rev-parse --is-inside-work-tree 2>/dev/null && git rev-parse --git-common-dir 2>/dev/null
|
|
20
|
-
```
|
|
21
|
-
|
|
22
|
-
**已在 Worktree 中**(`GIT_DIR != GIT_COMMON_DIR` 且非 submodule):
|
|
23
|
-
→ 跳过创建,直接进入上下文加载阶段。
|
|
24
|
-
> "📍 已在隔离工作区 `<path>` 中,跳过 Worktree 创建。"
|
|
25
|
-
|
|
26
|
-
**在主仓库中**(`GIT_DIR == GIT_COMMON_DIR` 或非 Git 项目):
|
|
27
|
-
→ 继续 Step 1(非 Git 项目跳过)。
|
|
28
|
-
|
|
29
|
-
### Step 1: 创建隔离工作区
|
|
12
|
+
| 层级 | 做法 |
|
|
13
|
+
|------|------|
|
|
14
|
+
| **Capability 级** | 多个 `/opsx-apply <change> <cap>`,每个解耦 cap 一个 worktree + `kld-sdd/<change>/<cap>` |
|
|
15
|
+
| **Task 级** | 单个 cap 内,**同一** worktree,DAG 同层子代理并行 |
|
|
30
16
|
|
|
31
|
-
|
|
17
|
+
子代理(§5)** never ** 创建 worktree 或分支。
|
|
32
18
|
|
|
33
|
-
|
|
19
|
+
## Step 0.1 分支/隔离校验(早于 record-base)
|
|
34
20
|
|
|
35
|
-
|
|
36
|
-
EnterWorktree(name="apply-<change-name>-<capability-name>")
|
|
37
|
-
```
|
|
21
|
+
建议分支 `kld-sdd/<change>/<capability>` **不是默认值**,须先校验:
|
|
38
22
|
|
|
39
|
-
|
|
23
|
+
1. **proposal.md**:§3 能力列表、§4.2 依赖图、§5.3 前置依赖、`mode`(full/simple)
|
|
24
|
+
2. **当前 cap 的 spec.md**:§4 依赖、涉及模块/表/接口
|
|
25
|
+
3. **其它 cap 的 spec.md(仅节选)**:§4 依赖、模块/表是否与当前 cap 重叠
|
|
40
26
|
|
|
41
|
-
|
|
27
|
+
| 不通过 | 处理 |
|
|
28
|
+
|--------|------|
|
|
29
|
+
| 当前 cap 依赖未完成的上游 cap | 串行,先 finish 上游 |
|
|
30
|
+
| 多 cap 改同一模块/表/配置 | 不并行 worktree |
|
|
31
|
+
| 已有同名 `kld-sdd/<change>/<cap>` 分支 | 复用或问用户清理 |
|
|
42
32
|
|
|
43
|
-
|
|
33
|
+
校验通过后输出报告(见 SKILL.md 模板),再 `record-base` / `worktree add`。
|
|
44
34
|
|
|
45
|
-
|
|
35
|
+
## 是否建 worktree?(建议,非强制)
|
|
46
36
|
|
|
47
|
-
|
|
48
|
-
# 1. 确定 Worktree 目录
|
|
49
|
-
WORKTREE_DIR=".worktrees/apply-<change-name>-<capability-name>"
|
|
37
|
+
### 建议建(常对应 full 目录 `apply-<change>-<capability>`)
|
|
50
38
|
|
|
51
|
-
|
|
52
|
-
|
|
39
|
+
- proposal §3 / design 显示该 cap 与其它并行 cap **无强依赖**
|
|
40
|
+
- 修改的文件/模块/表 **基本不重叠**
|
|
41
|
+
- 需要与其它 cap **同时** 本地实施
|
|
53
42
|
|
|
54
|
-
|
|
55
|
-
BRANCH="kld-sdd/<change-name>/<capability-name>"
|
|
56
|
-
git worktree add "$WORKTREE_DIR" -b "$BRANCH"
|
|
57
|
-
cd "$WORKTREE_DIR"
|
|
58
|
-
```
|
|
43
|
+
### 建议不建 / 串行
|
|
59
44
|
|
|
60
|
-
|
|
45
|
+
- cap B **依赖** cap A(先 finish A 再开 B)
|
|
46
|
+
- 多 cap 改 **同一文件、共享配置、顺序迁移**
|
|
47
|
+
- 其它 cap 的 worktree 尚未 merge,当前 cap 需要 **最新** 集成分支尖端
|
|
48
|
+
- `git worktree add` 被沙箱拒绝 → 当前目录 + 功能分支,并说明原因
|
|
61
49
|
|
|
62
|
-
###
|
|
50
|
+
### full 模式「一 cap 一分支」
|
|
63
51
|
|
|
64
|
-
|
|
52
|
+
- **约定 + 建议**,不是铁律
|
|
53
|
+
- simple:通常 **一 change 一 worktree**(`apply-<change>`)
|
|
65
54
|
|
|
66
|
-
|
|
67
|
-
# Node.js
|
|
68
|
-
[ -f package.json ] && npm install
|
|
55
|
+
## 多 Capability 并行 merge 顺序
|
|
69
56
|
|
|
70
|
-
|
|
71
|
-
|
|
57
|
+
1. 从 `proposal.md` 排出 capability 依赖。
|
|
58
|
+
2. **无依赖**:可同时开多个 worktree 实施;**finish merge 仍逐个** 到同一 `integration_base`。
|
|
59
|
+
3. **有依赖**:上游 cap 先 `finish`,下游 cap 在 merge 前应对集成分支 `rebase/merge`,或从更新后的尖端重建 worktree。
|
|
72
60
|
|
|
73
|
-
|
|
74
|
-
[ -f requirements.txt ] && pip install -r requirements.txt
|
|
75
|
-
[ -f pyproject.toml ] && poetry install
|
|
61
|
+
## 流程(单次 apply)
|
|
76
62
|
|
|
77
|
-
|
|
78
|
-
|
|
63
|
+
```
|
|
64
|
+
§1.2 check
|
|
65
|
+
§1.5 Step 0.1 proposal + spec 跨 cap 依赖校验 → 输出报告
|
|
66
|
+
§1.5 判断是否建 worktree(见上)
|
|
67
|
+
→ 若建:record-base → worktree add -b kld-sdd/<change>/<cap>
|
|
68
|
+
§2~§5 实施(子代理不建分支)
|
|
69
|
+
§6.1 若建了 worktree:finish → merge 回 integration_base
|
|
79
70
|
```
|
|
80
71
|
|
|
81
|
-
###
|
|
82
|
-
|
|
83
|
-
运行测试确保 Worktree 从干净状态开始:
|
|
72
|
+
### record-base
|
|
84
73
|
|
|
85
74
|
```bash
|
|
86
|
-
|
|
87
|
-
|
|
75
|
+
node skywalk-sdd/apply-worktree-finish.cjs --record-base \
|
|
76
|
+
--change=<change> --capability=<capability>
|
|
88
77
|
```
|
|
89
78
|
|
|
90
|
-
|
|
91
|
-
**测试通过**:报告就绪。
|
|
79
|
+
### 创建(git 回退)
|
|
92
80
|
|
|
93
|
-
```
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
准备实施 <change-name>/<capability-name>
|
|
81
|
+
```bash
|
|
82
|
+
git check-ignore -q .worktrees || echo ".worktrees/" >> .gitignore
|
|
83
|
+
git worktree add .worktrees/apply-<change>-<capability> -b kld-sdd/<change>/<capability>
|
|
97
84
|
```
|
|
98
85
|
|
|
99
|
-
|
|
86
|
+
须在**集成分支**上执行,apply 分支从该尖端分出。
|
|
100
87
|
|
|
101
|
-
###
|
|
88
|
+
### finish
|
|
102
89
|
|
|
103
|
-
**使用原生工具时**:
|
|
104
|
-
```
|
|
105
|
-
ExitWorktree(action="remove", discard_changes=false)
|
|
106
|
-
```
|
|
107
|
-
|
|
108
|
-
**使用 git 命令时**:
|
|
109
90
|
```bash
|
|
110
|
-
|
|
111
|
-
cd "$MAIN_REPO"
|
|
112
|
-
|
|
113
|
-
# 移除 Worktree
|
|
114
|
-
git worktree remove "$WORKTREE_DIR"
|
|
115
|
-
|
|
116
|
-
# 删除分支
|
|
117
|
-
git branch -D "kld-sdd/<change-name>/<capability-name>"
|
|
91
|
+
node skywalk-sdd/apply-worktree-finish.cjs --change=<change> --capability=<capability>
|
|
118
92
|
```
|
|
119
93
|
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
## 与子代理的配合
|
|
123
|
-
|
|
124
|
-
- **所有子代理共享同一 Worktree**
|
|
125
|
-
- DAG 分析确保同层任务不修改相同文件
|
|
126
|
-
- 子代理无需关心 Worktree 存在(透明隔离)
|
|
127
|
-
- 控制器(主会话)负责 Worktree 的创建和清理
|
|
94
|
+
状态文件:`skywalk-sdd/state/apply-<change>-<capability>.json`
|
|
128
95
|
|
|
129
96
|
## 快速参考
|
|
130
97
|
|
|
131
|
-
|
|
|
98
|
+
| 问题 | 答案 |
|
|
132
99
|
|------|------|
|
|
133
|
-
|
|
|
134
|
-
|
|
|
135
|
-
|
|
|
136
|
-
|
|
|
137
|
-
|
|
|
138
|
-
| `.worktrees/` 不存在 | 创建并验证 gitignore |
|
|
139
|
-
| 权限错误 | 在当前目录继续工作 |
|
|
140
|
-
| 基线测试失败 | 报告 + 询问用户 |
|
|
141
|
-
| 完成 | `ExitWorktree(action="remove")` |
|
|
100
|
+
| 为了加速本地 apply? | 是 |
|
|
101
|
+
| 必须 master? | 否,用 record-base 的集成分支 |
|
|
102
|
+
| full 必须一 cap 一分支? | 建议,解耦才可并行 |
|
|
103
|
+
| 有依赖怎么办? | 串行 apply + 按序 finish |
|
|
104
|
+
| 子代理能建 worktree 吗? | 不能 |
|
|
@@ -65,6 +65,16 @@ node skywalk-sdd/log.cjs start --command=archive --project=. --change=<变更名
|
|
|
65
65
|
|
|
66
66
|
记录为 `<归档原因>`,它会进入 `archive-manifest.json`、archive telemetry 和最终报告。
|
|
67
67
|
|
|
68
|
+
### 2.5 确认无残留 Apply Worktree(Git 项目)
|
|
69
|
+
|
|
70
|
+
若项目使用 Apply worktree 隔离,归档前确认:
|
|
71
|
+
|
|
72
|
+
```bash
|
|
73
|
+
git worktree list
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
应仅剩主工作区;或 telemetry 中存在 `worktree_finish` + `result=success` 事件。若仍有 `.worktrees/apply-*`,先执行 `node skywalk-sdd/apply-worktree-finish.cjs` 或手工清理。
|
|
77
|
+
|
|
68
78
|
### 3. 运行 telemetry doctor
|
|
69
79
|
|
|
70
80
|
```bash
|
|
@@ -23,7 +23,7 @@ allowed-tools:
|
|
|
23
23
|
> - ❌ **禁止**:创建/修改任何代码文件、执行代码生成、运行测试
|
|
24
24
|
>
|
|
25
25
|
> 即使检查发现代码相关问题,也只记录在检查报告中,**不自动修复代码**。
|
|
26
|
-
> 代码修复将在 `/opsx
|
|
26
|
+
> 代码修复将在 `/opsx-apply` 阶段进行。
|
|
27
27
|
|
|
28
28
|
|
|
29
29
|
> **🖥️ 跨平台执行规则**
|
|
@@ -58,7 +58,7 @@ allowed-tools:
|
|
|
58
58
|
openspec list
|
|
59
59
|
```
|
|
60
60
|
|
|
61
|
-
若变更不存在,提示用户先运行 `/opsx
|
|
61
|
+
若变更不存在,提示用户先运行 `/opsx-propose <name>` 创建变更。
|
|
62
62
|
|
|
63
63
|
### 2. 读取完整文档链
|
|
64
64
|
|
|
@@ -168,13 +168,13 @@ node skywalk-sdd/log.cjs record --type=conformance_review --command=check --proj
|
|
|
168
168
|
|
|
169
169
|
**全部通过**:
|
|
170
170
|
> "✅ 质量检查通过!建议下一步:
|
|
171
|
-
> - A. 运行 `/opsx
|
|
171
|
+
> - A. 运行 `/opsx-apply` 开始实施
|
|
172
172
|
> - B. 再次确认某个文档细节"
|
|
173
173
|
|
|
174
174
|
**有问题**:
|
|
175
175
|
> "❌ 发现 [N] 个问题需要修复:
|
|
176
|
-
> - 问题 1:[描述] → 建议运行 `/opsx
|
|
177
|
-
> - 问题 2:[描述] → 建议运行 `/opsx
|
|
176
|
+
> - 问题 1:[描述] → 建议运行 `/opsx-spec` 修复
|
|
177
|
+
> - 问题 2:[描述] → 建议运行 `/opsx-design` 修复
|
|
178
178
|
>
|
|
179
179
|
> 请选择:
|
|
180
180
|
> - A. 逐个修复(引导到对应命令)
|
|
@@ -23,7 +23,7 @@ allowed-tools:
|
|
|
23
23
|
> - ❌ **禁止**:创建/修改任何代码文件、执行代码生成、运行测试
|
|
24
24
|
> - ⛔ **单阶段原则**:完成 design.md 后**必须立即停止**,等待用户主动触发下一阶段
|
|
25
25
|
>
|
|
26
|
-
> 代码实现将在 `/opsx
|
|
26
|
+
> 代码实现将在 `/opsx-apply` 阶段进行。
|
|
27
27
|
> **完成本阶段后,绝对禁止自动继续执行 task 等后续阶段。**
|
|
28
28
|
|
|
29
29
|
> **⚠️ 渐进式上下文加载原则**
|
|
@@ -172,7 +172,7 @@ openspec list
|
|
|
172
172
|
|
|
173
173
|
最终输出:
|
|
174
174
|
- 文档路径
|
|
175
|
-
- 下一步提示:"运行 `/opsx
|
|
175
|
+
- 下一步提示:"运行 `/opsx-task <name> <capability>` 创建任务拆解文档"
|
|
176
176
|
|
|
177
177
|
---
|
|
178
178
|
|
|
@@ -185,4 +185,4 @@ openspec list
|
|
|
185
185
|
- 必须 100% 覆盖 spec.md 定义的需求项
|
|
186
186
|
- 代码锚点必须具体到类/方法级别
|
|
187
187
|
- **⛔ 阶段边界**:禁止执行任何代码创建/修改操作
|
|
188
|
-
- **⛔ 单阶段原则:完成 design.md 后必须立即停止**。仅提示用户下一步可运行 `/opsx
|
|
188
|
+
- **⛔ 单阶段原则:完成 design.md 后必须立即停止**。仅提示用户下一步可运行 `/opsx-task`,**绝对禁止自动执行 task 等后续阶段**。每个阶段必须由用户主动触发。
|
|
@@ -47,7 +47,7 @@ openspec list
|
|
|
47
47
|
```
|
|
48
48
|
|
|
49
49
|
若没有任何变更,提示:
|
|
50
|
-
> "当前项目还没有任何变更。运行 `/opsx
|
|
50
|
+
> "当前项目还没有任何变更。运行 `/opsx-propose <变更描述>` 开始第一个变更。"
|
|
51
51
|
|
|
52
52
|
### 2. 检查每个变更的 SDD 文档完整性
|
|
53
53
|
|
|
@@ -68,18 +68,18 @@ openspec status --change "<name>" --json
|
|
|
68
68
|
>
|
|
69
69
|
> | 变更名称 | P | S | D | T | openspec状态 | 建议下一步 |
|
|
70
70
|
> |---------|---|---|---|---|------------|---------|
|
|
71
|
-
> | add-user-auth | ✅ | ✅ | ✅ | ❌ | PENDING | `/opsx
|
|
72
|
-
> | payment-refund | ✅ | ❌ | ❌ | ❌ | PENDING | `/opsx
|
|
73
|
-
> | points-exchange | ✅ | ✅ | ✅ | ✅ | IMPLEMENTING | `/opsx
|
|
71
|
+
> | add-user-auth | ✅ | ✅ | ✅ | ❌ | PENDING | `/opsx-task add-user-auth` |
|
|
72
|
+
> | payment-refund | ✅ | ❌ | ❌ | ❌ | PENDING | `/opsx-spec payment-refund` |
|
|
73
|
+
> | points-exchange | ✅ | ✅ | ✅ | ✅ | IMPLEMENTING | `/opsx-check points-exchange` |"
|
|
74
74
|
|
|
75
75
|
### 4. 【交互引导】选择操作
|
|
76
76
|
|
|
77
77
|
使用 **AskUserQuestion** 让用户选择:
|
|
78
78
|
> "请选择操作:
|
|
79
79
|
> - A. 查看变更详情:输入变更名称
|
|
80
|
-
> - B. 创建新变更:运行 `/opsx
|
|
81
|
-
> - C. 执行质量检查:运行 `/opsx
|
|
82
|
-
> - D. 申请实施:运行 `/opsx
|
|
80
|
+
> - B. 创建新变更:运行 `/opsx-propose`
|
|
81
|
+
> - C. 执行质量检查:运行 `/opsx-check <name>`
|
|
82
|
+
> - D. 申请实施:运行 `/opsx-apply <name>`
|
|
83
83
|
> - E. 退出浏览"
|
|
84
84
|
|
|
85
85
|
### 5. 若用户选择查看详情
|