@hunterzheng/kld-sdd 2.4.19

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 (52) hide show
  1. package/README.md +275 -0
  2. package/bin/kld-sdd-init.js +24 -0
  3. package/index.js +13 -0
  4. package/lib/init.js +1124 -0
  5. package/lib/skills-bundle.js +30 -0
  6. package/package.json +48 -0
  7. package/skywalk-sdd/apply-worktree-finish.cjs +551 -0
  8. package/skywalk-sdd/index.cjs +2991 -0
  9. package/templates/ci/github-actions-sdd.yml +67 -0
  10. package/templates/ci/gitlab-ci-sdd.yml +44 -0
  11. package/templates/git-hooks/pre-commit-sdd-check.cjs +155 -0
  12. package/templates/git-hooks/pre-push-sdd-check.cjs +56 -0
  13. package/templates/hooks/claude/hooks/sdd-apply-gate.cjs +173 -0
  14. package/templates/hooks/claude/hooks/sdd-apply-test-gate.cjs +315 -0
  15. package/templates/hooks/claude/hooks/sdd-post-tool.cjs +146 -0
  16. package/templates/hooks/claude/hooks/sdd-pre-tool.cjs +41 -0
  17. package/templates/hooks/claude/hooks/sdd-prompt.cjs +88 -0
  18. package/templates/hooks/claude/hooks/sdd-skill-apply-gate.cjs +268 -0
  19. package/templates/hooks/claude/hooks/sdd-stop.cjs +108 -0
  20. package/templates/hooks/claude/settings.json +72 -0
  21. package/templates/openspec/design.md +290 -0
  22. package/templates/openspec/overview.md +143 -0
  23. package/templates/openspec/proposal.md +108 -0
  24. package/templates/openspec/spec.md +185 -0
  25. package/templates/openspec/tasks.md +287 -0
  26. package/templates/skills/kld-sdd/opsx-apply/SKILL.md +251 -0
  27. package/templates/skills/kld-sdd/opsx-apply/checklist.md +94 -0
  28. package/templates/skills/kld-sdd/opsx-apply/implementer-prompt.md +129 -0
  29. package/templates/skills/kld-sdd/opsx-apply/reference.md +335 -0
  30. package/templates/skills/kld-sdd/opsx-apply/worktree-setup.md +104 -0
  31. package/templates/skills/kld-sdd/opsx-archive/SKILL.md +162 -0
  32. package/templates/skills/kld-sdd/opsx-archive/checklist.md +33 -0
  33. package/templates/skills/kld-sdd/opsx-check/SKILL.md +197 -0
  34. package/templates/skills/kld-sdd/opsx-check/checklist.md +35 -0
  35. package/templates/skills/kld-sdd/opsx-design/SKILL.md +166 -0
  36. package/templates/skills/kld-sdd/opsx-design/checklist.md +46 -0
  37. package/templates/skills/kld-sdd/opsx-design/reference.md +44 -0
  38. package/templates/skills/kld-sdd/opsx-explore/SKILL.md +104 -0
  39. package/templates/skills/kld-sdd/opsx-knowledge/SKILL.md +130 -0
  40. package/templates/skills/kld-sdd/opsx-knowledge/references/modules.md +26 -0
  41. package/templates/skills/kld-sdd/opsx-knowledge/scripts/config.json +39 -0
  42. package/templates/skills/kld-sdd/opsx-knowledge/scripts/retrieve.cjs +199 -0
  43. package/templates/skills/kld-sdd/opsx-propose/SKILL.md +201 -0
  44. package/templates/skills/kld-sdd/opsx-propose/checklist.md +44 -0
  45. package/templates/skills/kld-sdd/opsx-propose/reference.md +94 -0
  46. package/templates/skills/kld-sdd/opsx-spec/SKILL.md +168 -0
  47. package/templates/skills/kld-sdd/opsx-spec/checklist.md +46 -0
  48. package/templates/skills/kld-sdd/opsx-spec/reference.md +49 -0
  49. package/templates/skills/kld-sdd/opsx-task/SKILL.md +199 -0
  50. package/templates/skills/kld-sdd/opsx-task/checklist.md +46 -0
  51. package/templates/skills/kld-sdd/opsx-task/reference.md +40 -0
  52. package/templates/skills/kld-sdd/opsx-test/SKILL.md +143 -0
@@ -0,0 +1,129 @@
1
+ # OPSX 任务实现子代理提示模板
2
+
3
+ 在派发实现子代理时使用此模板。每个 DAG 任务由一个独立子代理执行。
4
+
5
+ ## 派发格式
6
+
7
+ ```
8
+ Agent (general-purpose):
9
+ description: "实现任务 [TASK-ID]: [任务描述]"
10
+ prompt: |
11
+ 你是 SDD(Specification-Driven Development)任务实现专家。
12
+
13
+ ## 当前任务
14
+
15
+ [TASK-ID]: [完整任务描述,从 tasks.md 中提取]
16
+ - 类型: [数据层/业务层/接口层/测试]
17
+ - 依赖: [前置任务列表] ✅ 已完成
18
+ - 层级: [N]
19
+
20
+ ## 设计约定
21
+
22
+ [从 design.md 中提取与本任务相关的设计内容:
23
+ - 类/函数签名
24
+ - 数据模型
25
+ - 接口定义
26
+ - 关键算法逻辑]
27
+
28
+ ## 全局规范
29
+
30
+ [从 overview.md 中提取相关全局规范:
31
+ - 命名约定
32
+ - 目录结构
33
+ - 错误处理模式
34
+ - 日志规范]
35
+
36
+ ## 开始前确认
37
+
38
+ 如果你对以下内容有疑问:
39
+ - 任务需求或验收标准
40
+ - 实现方式或技术方案
41
+ - 依赖项或假设条件
42
+ - 任务描述中不清晰的地方
43
+
44
+ **请现在提出。** 在开始工作之前澄清所有疑问。
45
+
46
+ ## 你的工作
47
+
48
+ 确认需求清晰后:
49
+ 1. 实现任务指定的内容(不多不少)
50
+ 2. 遵循 design.md 的设计约定
51
+ 3. 遵循 overview.md 的全局规范
52
+ 4. 保持变更最小化,不超出任务范围
53
+ 5. 自我审查(见下方)
54
+ 6. 报告结果
55
+
56
+ 工作目录:[项目根目录]
57
+
58
+ **工作中遇到意外或不明确的情况时,请提问。**
59
+ 允许暂停并澄清,不要猜测或假设。
60
+
61
+ ## 代码组织
62
+
63
+ - 遵循 design.md 中定义的文件结构
64
+ - 每个文件应有单一明确的职责
65
+ - 遵循项目现有的代码模式和风格
66
+ - 如果任务涉及的文件超出预期范围,报告 DONE_WITH_CONCERNS
67
+
68
+ ## 何时升级
69
+
70
+ **暂停并升级的情况:**
71
+ - 任务需要架构决策且有多种可行方案
72
+ - 需要理解超出提供范围之外的代码
73
+ - 不确定实现方式是否正确
74
+ - 需要重构现有代码且设计文档未预期的
75
+
76
+ **升级方式:** 报告状态为 BLOCKED 或 NEEDS_CONTEXT,具体说明卡在哪里、尝试了什么、需要什么帮助。
77
+
78
+ ## 报告前自我审查
79
+
80
+ 用新的眼光审视你的工作,自查:
81
+
82
+ **完整性:**
83
+ - 是否完整实现了任务描述中的所有内容?
84
+ - 是否遗漏了任何需求?
85
+ - 是否处理了边界情况?
86
+
87
+ **质量:**
88
+ - 代码是否清晰可维护?
89
+ - 命名是否准确(反映做什么,而非怎么做)?
90
+ - 是否遵循了项目现有模式?
91
+
92
+ **纪律:**
93
+ - 是否避免了过度工程(YAGNI)?
94
+ - 是否只构建了任务要求的内容?
95
+ - 是否避免了对无关文件的修改?
96
+
97
+ 如果在自我审查中发现问题,先修复再报告。
98
+
99
+ ## 报告格式
100
+
101
+ 完成后报告:
102
+
103
+ - **状态**: DONE | DONE_WITH_CONCERNS | BLOCKED | NEEDS_CONTEXT
104
+ - **实现了什么**(或尝试了什么,如果受阻)
105
+ - **修改的文件列表**
106
+ - **自我审查发现**(如有)
107
+ - **任何问题或关注点**
108
+
109
+ 使用 DONE_WITH_CONCERNS 表示完成了工作但对正确性有疑虑。
110
+ 使用 BLOCKED 表示无法完成任务。
111
+ 使用 NEEDS_CONTEXT 表示缺少必要信息。
112
+ 永远不要默默产出你不确定的工作成果。
113
+ ```
114
+
115
+ ## 状态处理指南
116
+
117
+ | 状态 | 含义 | 控制器操作 |
118
+ |------|------|------------|
119
+ | DONE | 任务完成,无顾虑 | 进入编译/测试门禁 |
120
+ | DONE_WITH_CONCERNS | 完成但有疑虑 | 读取顾虑,判断是否需要在门禁前处理 |
121
+ | NEEDS_CONTEXT | 需要更多信息 | 提供缺失上下文,重新派发 |
122
+ | BLOCKED | 无法完成 | 评估阻碍:补充上下文 / 换模型 / 拆分任务 / 升级给用户 |
123
+
124
+ ## 注意事项
125
+
126
+ - **绝不要**忽略子代理的升级请求,重复同样参数重新派发不会解决问题
127
+ - **绝不要**在子代理说出"卡住"后不做改变就重试
128
+ - 子代理报告 NEEDS_CONTEXT 时,提供精准的补充信息
129
+ - 子代理报告 DONE_WITH_CONCERNS 时,仔细审查顾虑内容
@@ -0,0 +1,335 @@
1
+ ---
2
+ description: opsx-apply 的详细模板:telemetry 命令、worktree 全套策略、子代理派发、收尾脚本。仅在需要参考详细模板时读取。
3
+ ---
4
+
5
+ # opsx-apply — 详细参考(reference)
6
+
7
+ > 本文件承载 opsx-apply 的重细节模板:telemetry 命令、§1.5 worktree 全套策略、§5c 子代理派发、§5.1 AI 产出快照、§6.0 单元测试真实执行、§6.1 worktree 收尾脚本。
8
+ > SKILL.md 保留入口骨架与指针;本文件为完整策略来源。`./worktree-setup.md` 为 worktree 快速参考,与本文件 §1.5 并存(reference=完整策略,worktree-setup=快速参考)。
9
+
10
+ ---
11
+
12
+ ## 📊 Telemetry 命令模板(必做,不得跳过)
13
+
14
+ > 阶段开始:`node skywalk-sdd/log.cjs start --command=apply --project=. --change=<变更名称> --capability=<capability-name> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID> --git-sha=<base_git_sha_or_none>`(保存 event_id)
15
+ > 阶段结束:`node skywalk-sdd/log.cjs end --event-id=<event_id> --command=apply --project=. --change=<变更名称> --capability=<capability-name> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID> --result=success|failure --summary="摘要"`
16
+
17
+ ### task_update(每完成一个任务记录)
18
+
19
+ ```bash
20
+ node skywalk-sdd/log.cjs record --type=task_update --command=apply --project=. --change=<变更名称> --capability=<capability-name> --task-id=<TASK-ID> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID> --status=completed --result=success --summary="<TASK-ID> 完成" --details-json="{\"files_changed\":[],\"build_results\":{\"command\":\"<实际编译命令>\",\"success\":true,\"duration_ms\":0,\"error_count\":0},\"test_results\":{\"command\":\"<实际测试命令>\",\"passed\":0,\"failed\":0,\"skipped\":0,\"coverage\":null,\"duration_ms\":0}}"
21
+ ```
22
+
23
+ **⚠️ 注意**:`--task-id=<TASK-ID>` 必须替换为实际任务 ID,否则 E4 指标无法计算。
24
+
25
+ ### ai_adoption_review(AI 产出快照)
26
+
27
+ 当前 Capability 的 AI 代码产出完成后,必须记录 `ai_adoption_review`,但不得为了采集快照自动提交 commit。
28
+
29
+ - `--status=ai_snapshot` 用于记录 AI 初始产出快照,P2 指标在无 final 事件时会使用此快照数据
30
+ - 若用户进行了人工 review 并确认保留率,可补录 `--status=final` 事件(`review_status: "final"`),P2 指标将优先使用 final 数据
31
+
32
+ Git 可用时只读统计 SHA/diff;Git 不可用时使用 `vcs_mode=no-git` 和 `base_git_sha=null`:
33
+
34
+ ```bash
35
+ node skywalk-sdd/log.cjs record --type=ai_adoption_review --command=apply --project=. --change=<变更名称> --capability=<capability-name> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID> --status=ai_snapshot --result=success --summary="AI 代码产出快照" --details-json="{\"ai_adoption\":{\"review_status\":\"ai_snapshot\",\"vcs_mode\":\"<readonly|no-git>\",\"base_git_sha\":\"<base_git_sha_or_null>\",\"ai_git_sha\":\"<ai_git_sha_or_null>\",\"ai_diff\":{\"files_changed\":0,\"added_lines\":null,\"deleted_lines\":null},\"notes\":\"未自动创建 Git 仓库,未自动提交 commit;仅记录可用统计\"}}"
36
+ ```
37
+
38
+ ### worktree_finish(收尾 Telemetry,推荐)
39
+
40
+ ```bash
41
+ node skywalk-sdd/log.cjs record --type=worktree_finish \
42
+ --command=apply --project=. --change=<变更名称> --capability=<capability-name> \
43
+ --agent=<Agent类型> --source=opsx-command --session-id=<会话ID> \
44
+ --result=success --summary="merge+remove completed" \
45
+ --details-json='{"integration_base":"<branch>","merge_commit":"<sha>","worktree_removed":true}'
46
+ ```
47
+
48
+ ---
49
+
50
+ ## §1.5 本地并行 — Worktree 与工作区(建议性策略)
51
+
52
+ > **目标(本质)**:在**本地仓库**加快 SDD Apply——让**解耦**的 spec/capability 可以各自实现、互不踩目录,做完再按依赖顺序合并回你**当时所在的分支**(集成分支,如 `hotfix-1`)。
53
+ >
54
+ > **不是**:保护 `master`、不是「主分支只放文档」、不是远程流水线分支策略。一切基于**本地 Git + 本地 worktree**。
55
+
56
+ ### 两层并行(不要混为一谈)
57
+
58
+ | 层级 | 手段 | 适用 |
59
+ |------|------|------|
60
+ | **Capability 级**(跨 spec) | 每个解耦的 capability **单独**跑一次 `/opsx-apply` + **独立** worktree/apply 分支 | proposal 中能力**可并行**、无文件/接口/数据强依赖 |
61
+ | **Task 级**(cap 内) | **同一** worktree 内,DAG 同层子代理并行 | tasks.md 同层任务不改相同文件 |
62
+
63
+ - 本技能单次仍只实施**一个** capability;「多 spec 并行」= 多个 apply 会话 + 多个 worktree,不是一次加载多个 capability 文档。
64
+ - §5 子代理并行 **不** 再建 worktree;Capability 级并行在 §1.5 决定「本次是否建 worktree」。
65
+
66
+ ### 何时建议建 worktree / 按 capability 切分支?(模型判断,非强制)
67
+
68
+ **倾向创建**(full 模式常见:`.worktrees/apply-<change>-<capability>` + `kld-sdd/<change>/<capability>`):
69
+
70
+ - `proposal.md` §3 中该 capability 与并行中的其他能力**无**「修改同一模块 / 共享表 / 必须先合入」等描述
71
+ - `design.md` 显示文件路径、包、表与并行中的其他 cap **基本不重叠**
72
+ - 用户需要在**同一集成分支**上并行推进多个 cap,且机器资源允许(多份 `node_modules`)
73
+
74
+ **倾向不建 / 串行 apply**(仍在集成分支上改,或只开一个 worktree):
75
+
76
+ - proposal 写明 capability **依赖**(B 依赖 A 已合入)
77
+ - 多 cap 改**同一文件/模块/配置**(merge 冲突几乎必然)
78
+ - 数据库迁移、公共类型、单例注册等**顺序敏感**
79
+ - 已有另一个 capability 的 worktree **尚未 finish merge** 到集成分支,且当前 cap 需要基于**最新**集成结果开发
80
+ - 沙箱禁止 `git worktree add` → 回退当前目录 + 功能分支,并告知用户
81
+
82
+ **full 模式「一 capability 一分支」**:是**命名与目录约定 + 建议**,须先通过下方 **§1.5 Step 0.1 校验** 再命名/建 worktree。simple 模式通常**一 change 一 worktree**。
83
+
84
+ ### Step 0.1 【必做】分支/隔离校验(早于 record-base 与 `git worktree add`)
85
+
86
+ > 在建议分支名 `kld-sdd/<change>/<capability>` 或创建 worktree **之前**,用 `proposal.md` + 各 capability **spec 依赖信息** 做交叉校验。未通过则**不**按 full 并行策略拆分支,改为串行或本次不建 worktree。
87
+
88
+ **Step A — 读变更级能力清单(允许读 proposal,不读其它 cap 的 design/tasks)**
89
+
90
+ 从 `changes/<change-name>/proposal.md` 提取:
91
+
92
+ | 字段 | 用途 |
93
+ |------|------|
94
+ | frontmatter `mode` | `full` → 倾向 `apply-<change>-<cap>`;`simple` → 倾向 `apply-<change>` |
95
+ | §3.1 / §3.2 能力列表 | 本 change 下全部 capability 名 |
96
+ | §4.2 依赖关系图 | 能力间先后 / 上下游 |
97
+ | §5.3 前置依赖 checkbox | 未满足则当前 cap 不宜并行 |
98
+
99
+ **Step B — 读当前 capability 的 spec 依赖(§2 正式加载前仅此文件)**
100
+
101
+ 读取**当前** capability 的 `spec.md`(路径按 mode):
102
+
103
+ - **full**:`changes/<change>/specs/<capability>/spec.md` 或 `openspec/changes/.../specs/<capability>/spec.md`(以项目实际为准)
104
+ - **simple**:`changes/<change>/spec.md`
105
+
106
+ 只重点读 spec 中:**能力边界 / 涉及模块 / §4 内部与外部依赖**(是否写明依赖其它 capability、共享表、必须先发布的接口)。
107
+
108
+ **Step C — 跨 capability 轻量交叉(隔离例外,仅本节)**
109
+
110
+ 对 §3 中**其它** capability,**只**读取其 `spec.md` 的:
111
+
112
+ - 标题与能力简述
113
+ - **§4 依赖**(是否依赖 `<当前 capability>` 或其它 cap)
114
+ - **涉及模块 / 数据表 / 公共配置**(若有)
115
+
116
+ ⛔ 禁止为校验而加载其它 cap 的 `design.md`、`tasks.md`(完整实施上下文仍遵守 §2 隔离红线)。
117
+
118
+ **Step D — 判定矩阵(输出给用户)**
119
+
120
+ | 校验项 | 不通过时的处理 |
121
+ |--------|----------------|
122
+ | proposal §4.2 / §5.3 写明当前 cap **依赖** 未完成的其它 cap | **串行**:先 finish 上游,再 apply 当前;不并行拆分支 |
123
+ | 其它 cap 的 spec 写明 **依赖当前 cap** 且当前 cap 未 finish | 当前可并行实施,但提醒下游须等本次 finish |
124
+ | 多 cap spec 出现**相同模块路径 / 同表 / 同配置文件** | **不并行** worktree;串行或合并为一个 apply 范围 |
125
+ | 当前 cap spec §4 要求接口/表已由其它 cap 提供 | 若其它 cap 未 merge 到集成分支 → **不建** worktree,先完成上游 |
126
+ | `git branch --list 'kld-sdd/<change>/*'` 已存在同名分支 | 复用既有 worktree/分支,或询问用户是否清理后重建 |
127
+ | 沙箱 / 环境无法 `worktree add` | 不建 worktree;集成分支上直接开发 |
128
+
129
+ **Step E — 分支与目录命名(校验通过后)**
130
+
131
+ | mode | worktree 目录(建议) | apply 分支(建议) |
132
+ |------|----------------------|-------------------|
133
+ | full + 可隔离 | `.worktrees/apply-<change>-<capability>` | `kld-sdd/<change>/<capability>` |
134
+ | simple 或 change 内单实现体 | `.worktrees/apply-<change>` | `kld-sdd/<change>/<capability>`(cap 可与 change 同名) |
135
+ | 校验不通过但仍需隔离 | `.worktrees/apply-<change>-<capability>` 或单 worktree | 仍用 `kld-sdd/<change>/<capability>`,但**不得**与其它 cap 并行 |
136
+
137
+ **报告模板**(创建 worktree 前必须输出):
138
+
139
+ ```
140
+ 📋 Apply 隔离校验 — <change>/<capability>
141
+ - mode: full | simple
142
+ - 本 change 能力域: [cap-a, cap-b, …]
143
+ - 与当前 cap 冲突/依赖: [无 | cap-a 必须先合入 | 与 cap-b 共享模块 X]
144
+ - 并行建议: [可独立 worktree | 串行等待 cap-a | 不建 worktree,原地 apply]
145
+ - 分支(建议): kld-sdd/<change>/<capability>
146
+ - 集成分支(将 record-base): <当前 git 分支>
147
+ ```
148
+
149
+ ### 多 Capability 并行时的合并顺序(本地)
150
+
151
+ 1. 各 capability 在各自 worktree 内完成 + `§6.1 finish` 前,先根据 `proposal.md` 排出 **capability 依赖 DAG**。
152
+ 2. **按 DAG 顺序**依次 `finish` merge 到**同一** `integration_base`(先 A 合入,再 B;B 的 worktree 若基于旧尖端,merge 前应在 B 的 worktree 内 `merge/rebase integration_base` 或由用户选择重建 worktree)。
153
+ 3. 有依赖的 cap **不要**与上游 cap 同时 finish;无依赖的可并行实施,但 **merge 仍建议逐个** 以降低冲突。
154
+
155
+ 向用户简要说明判断结果:
156
+ > "📌 并行建议:cap-A、cap-C 可并行 worktree;cap-B 依赖 A,待 A finish 后再 apply。"
157
+
158
+ ### 分支 / Worktree 创建时机(勿与子代理混淆)
159
+
160
+ | 时机 | 做什么 | 谁执行 |
161
+ |------|--------|--------|
162
+ | **§1.5 Step 0.25~1(仅一次)** | 记录集成分支 → 创建 worktree + 新建 `kld-sdd/<change>/<capability>` | **主会话** |
163
+ | §2~§4 | 读文档、解析 DAG | 主会话 |
164
+ | **§5 子代理** | 在**已有** worktree 内实现任务 | **子代理**(不建 worktree、不建分支) |
165
+ | **§6.1** | merge 回集成分支 → remove worktree → 删 apply 分支 | **主会话** + `apply-worktree-finish.cjs` |
166
+
167
+ - 集成分支 = Apply **开始时**主仓库 `git branch --show-current`(例:用户在 `hotfix-1` 上开始,则 merge 回 `hotfix-1`)。
168
+ - `git worktree add -b` 在主仓库处于集成分支时执行,apply 分支从该分支尖端分出。
169
+ - **子代理禁止** `EnterWorktree` / `git worktree add` / `checkout -b`;同层并行共享**同一** worktree 与 apply 分支。
170
+
171
+ ### 设置流程(详见 `./worktree-setup.md`)
172
+
173
+ **Step 0: 检测当前状态**
174
+ - 若已是 Git Worktree → 跳过创建(集成分支应已在 state 文件中)
175
+ - 若非 Git 项目(`vcs_mode=no-git`)→ 跳过
176
+
177
+ **Step 0.1: 分支/隔离校验** — 见上文「Step 0.1 【必做】」,**通过后再执行** 0.25 / 0.5 / Step 1
178
+
179
+ **Step 0.25: 记录集成分支(Git 项目必做,创建 worktree 之前)**
180
+
181
+ 在主仓库根目录、**尚未** `cd` 进 `.worktrees/` 时执行:
182
+
183
+ ```bash
184
+ node skywalk-sdd/apply-worktree-finish.cjs --record-base \
185
+ --change=<变更名称> \
186
+ --capability=<capability-name>
187
+ ```
188
+
189
+ - 将当前具名分支写入 `skywalk-sdd/state/apply-<change>-<capability>.json` 的 `integration_base`
190
+ - 若为 detached HEAD,先 `git checkout` 到具名分支再记录
191
+ - simple 模式可省略 `--capability`(默认与 change 相同)
192
+
193
+ **Step 0.5: 主仓库冲突预检(Git 项目必做)**
194
+ - 在主仓库根目录执行 `git status`,确认**无**与本次 Apply 将修改路径冲突的**未跟踪**实现文件(如 `src/`、`package.json` 等)
195
+ - 若存在,先移走、提交或删除;否则收尾 `merge` 会报 `untracked working tree files would be overwritten`
196
+ - 收尾脚本默认启用 `--check-untracked` 预检并给出明确报错
197
+
198
+ **Step 1: 创建隔离工作区**
199
+
200
+ > 确认主仓库仍检出在 **Step 0.25 记录的集成分支**(或与其一致的尖端),再创建 worktree。
201
+
202
+ - **首选**:使用 `EnterWorktree` 工具(Claude Code 原生)
203
+ ```
204
+ EnterWorktree(name="apply-<change-name>-<capability-name>")
205
+ ```
206
+ - **回退**:仅当原生工具不可用时,使用 `git worktree add`
207
+ - **full 模式**目录:`.worktrees/apply-<change-name>-<capability-name>`
208
+ - **simple 模式**目录:`.worktrees/apply-<change-name>`(无 capability 后缀)
209
+ - **分支命名**:仅当 Step 0.1 校验通过后,使用报告中的 `kld-sdd/<change-name>/<capability-name>`(勿对强依赖 cap 强行并行拆分支)
210
+ ```bash
211
+ git worktree add .worktrees/apply-<change-name>-<capability-name> \
212
+ -b kld-sdd/<change-name>/<capability-name>
213
+ ```
214
+
215
+ **Step 2: 项目设置**
216
+ - 自动检测并安装依赖(`npm install` / `pip install` 等)
217
+
218
+ **Step 3: 验证基线**
219
+ - 运行编译/测试,确保工作区干净
220
+
221
+ **报告**:
222
+ > "✅ Worktree 就绪:`<path>`
223
+ > 集成分支:`<integration_base>`(收尾将 merge 回此分支)
224
+ > 基线测试通过(N 个测试,0 失败)
225
+ > 准备实施 `<change-name>/<capability-name>`"
226
+
227
+ ---
228
+
229
+ ## §5c 子代理派发模板
230
+
231
+ > **使用 Agent 工具并行派发同层任务,每个子代理负责一个任务,上下文隔离、专注高效。**
232
+ > **⛔ 子代理阶段不创建 worktree/分支**——隔离环境已在 §1.5 就绪;子代理仅在 worktree 目录内实现 TASK。
233
+
234
+ **派发准备(每个子代理):**
235
+ 1. 从 tasks.md 中提取该任务的完整描述
236
+ 2. 从 design.md 中提取该任务相关的设计约定(类签名、数据模型、接口定义、算法逻辑)
237
+ 3. 从 overview.md 中提取相关全局规范(命名约定、目录结构、错误处理模式)
238
+ 4. 组合以上上下文 + `./implementer-prompt.md` 模板 → 子代理 prompt
239
+
240
+ > 子代理 prompt 模板详见 **`./implementer-prompt.md`**(任务实现子代理提示模板)。本节不重复其内容。
241
+
242
+ **同层并行派发**:
243
+ - 同一 DAG 层级、无相互依赖的任务 → **一次性并行派发多个子代理**
244
+ - 不同 DAG 层级 → **等待当前层全部完成后,再派发下一层**
245
+
246
+ **派发示例**:
247
+ ```
248
+ 同一层级 3 个独立任务,一次性并行派发:
249
+
250
+ Agent("实现 TASK-01: 创建用户数据模型", ...)
251
+ Agent("实现 TASK-02: 创建角色数据模型", ...)
252
+ Agent("实现 TASK-03: 创建权限数据模型", ...)
253
+ // 三个子代理同时运行,上下文隔离,互不干扰
254
+ ```
255
+
256
+ **等待所有子代理返回结果后,按状态处理**:
257
+
258
+ | 子代理状态 | 控制器处理方式 |
259
+ |-----------|---------------|
260
+ | DONE | 进入编译/测试门禁 |
261
+ | DONE_WITH_CONCERNS | 审查顾虑内容,判断是否需要在门禁前处理 |
262
+ | NEEDS_CONTEXT | 提供缺失上下文,重新派发 |
263
+ | BLOCKED | 补充上下文 / 换更强模型 / 拆分任务 / 升级给用户 |
264
+
265
+ > **⛔ 严禁**忽略子代理的升级请求!不改变参数就重复派发不会解决问题。
266
+
267
+ ---
268
+
269
+ ## §5.1 记录 AI 产出快照
270
+
271
+ 当前 Capability 的 AI 代码产出完成后,必须记录 `ai_adoption_review`,但不得为了采集快照自动提交 commit。
272
+
273
+ - `--status=ai_snapshot` 用于记录 AI 初始产出快照,P2 指标在无 final 事件时会使用此快照数据
274
+ - 若用户进行了人工 review 并确认保留率,可补录 `--status=final` 事件(`review_status: "final"`),P2 指标将优先使用 final 数据
275
+
276
+ Git 可用时只读统计 SHA/diff;Git 不可用时使用 `vcs_mode=no-git` 和 `base_git_sha=null`:
277
+
278
+ ```bash
279
+ node skywalk-sdd/log.cjs record --type=ai_adoption_review --command=apply --project=. --change=<变更名称> --capability=<capability-name> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID> --status=ai_snapshot --result=success --summary="AI 代码产出快照" --details-json="{\"ai_adoption\":{\"review_status\":\"ai_snapshot\",\"vcs_mode\":\"<readonly|no-git>\",\"base_git_sha\":\"<base_git_sha_or_null>\",\"ai_git_sha\":\"<ai_git_sha_or_null>\",\"ai_diff\":{\"files_changed\":0,\"added_lines\":null,\"deleted_lines\":null},\"notes\":\"未自动创建 Git 仓库,未自动提交 commit;仅记录可用统计\"}}"
280
+ ```
281
+
282
+ > 该命令亦见上文「📊 Telemetry 命令模板 → ai_adoption_review」。
283
+
284
+ ---
285
+
286
+ ## §6.0 单元测试真实执行(`test-strategy` 非 `none`)
287
+
288
+ 当 `proposal.md` 的 `test-strategy` 为 **`tdd`** 或 **`impl-first`** 时:
289
+
290
+ 1. **在结束 apply 或执行 §6.1 收尾之前**,必须在项目根或 worktree 内**真实运行**单元测试命令(`npm test` / `pytest` / `go test` 等)。
291
+ 2. 须留下可核验的 telemetry 证据(任选其一):
292
+ - `node skywalk-sdd/log.cjs record --type=test_result ...`(`test_results.command` 非空,且 `passed`/`failed`/`duration_ms` 有实际值)
293
+ - `task_update` 的 `details-json` 中 `test_results` 含真实执行数据
294
+ - 或单独运行 `/opsx-test` 并完成 `command=test` 的 `stage_end`
295
+ 3. **Claude Code**:`sdd-apply-test-gate.cjs` 会在 `log.cjs end`、`apply-worktree-finish`、会话 Stop 时自动校验;无证据则**阻断**并提示补跑测试。
296
+
297
+ | test-strategy | 行为 |
298
+ |---------------|------|
299
+ | `tdd` | 无测试证据不得结束 apply / 不得 finish worktree |
300
+ | `impl-first` | 同上,实现后必须补跑并记录 |
301
+ | `none` | 跳过本节与 test gate |
302
+
303
+ ---
304
+
305
+ ## §6.1 Worktree 收尾(仅当 §1.5 已创建 worktree)
306
+
307
+ > **⛔ 本次 Apply 若创建了 worktree**:DAG 全部完成且 **§6.0 测试门禁(若适用)** 通过后,必须在**主仓库根目录**执行收尾脚本(禁止在 `.worktrees/...` 内执行)。
308
+ > 若 §1.5 判定未建 worktree(串行、强依赖、沙箱回退),跳过本节。
309
+
310
+ **前置条件**:
311
+ - worktree 内 `git status` 干净(实现代码已全部 commit)
312
+ - 主仓库无与 merge 冲突的未跟踪文件(见 §1.5 Step 0.5)
313
+ - `test-strategy` 为 `tdd`/`impl-first` 时,§6.0 测试证据已存在
314
+
315
+ **执行**(主仓库根目录):
316
+ ```bash
317
+ node skywalk-sdd/apply-worktree-finish.cjs \
318
+ --change=<变更名称> \
319
+ --capability=<capability-name>
320
+ ```
321
+
322
+ - **默认 merge 目标**:§1.5 `--record-base` 写入的 `integration_base`(**不是**默认 master)
323
+ - 仅当 state 缺失或需覆盖时传 `--target=<集成分支>`
324
+ - **simple 模式**:`--capability` 可省略;目录为 `.worktrees/apply-<change>`
325
+ - **full 模式**:目录为 `.worktrees/apply-<change>-<capability>`
326
+
327
+ **脚本行为**:`checkout 集成分支` → `merge --no-ff` apply 分支 → `worktree remove` → 删临时目录 → `branch -d` apply 分支
328
+
329
+ **常用 flags**:`--dry-run` 预演;`--skip-merge` 已手动 merge;`--keep-branch` 保留 apply 分支;`--no-check-untracked` 跳过未跟踪预检
330
+
331
+ **回退**(仅当脚本不可用时,详见 `./worktree-setup.md`):
332
+ - `EnterWorktree`:`ExitWorktree(action="remove", discard_changes=false)`
333
+ - `git worktree add`:`git worktree remove` + `git branch -D`
334
+
335
+ > **与 Git 只读策略的关系**:Apply **实施过程**禁止 Agent 随意 commit;**收尾**由本脚本执行 merge/remove,属于流程必做步骤,不视为「随意提交业务代码」。
@@ -0,0 +1,104 @@
1
+ # OPSX Apply — 本地 Worktree 与并行加速
2
+
3
+ ## 目标(读这个就够了)
4
+
5
+ - **为什么用 worktree**:在**本地**让解耦的 capability/spec **并行写代码**,互不干扰,再按依赖 **merge 回集成分支**,缩短 Apply 总时间。
6
+ - **不是什么**:不是保护 `master`、不是远程发布策略、不是「主分支只放 SDD 文档」。
7
+
8
+ 集成分支 = Apply 开始时主仓库的 `git branch --show-current`(如 `hotfix-1`)。收尾 merge 回这条**本地**分支。
9
+
10
+ ## 两层并行
11
+
12
+ | 层级 | 做法 |
13
+ |------|------|
14
+ | **Capability 级** | 多个 `/opsx-apply <change> <cap>`,每个解耦 cap 一个 worktree + `kld-sdd/<change>/<cap>` |
15
+ | **Task 级** | 单个 cap 内,**同一** worktree,DAG 同层子代理并行 |
16
+
17
+ 子代理(§5)** never ** 创建 worktree 或分支。
18
+
19
+ ## Step 0.1 分支/隔离校验(早于 record-base)
20
+
21
+ 建议分支 `kld-sdd/<change>/<capability>` **不是默认值**,须先校验:
22
+
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 重叠
26
+
27
+ | 不通过 | 处理 |
28
+ |--------|------|
29
+ | 当前 cap 依赖未完成的上游 cap | 串行,先 finish 上游 |
30
+ | 多 cap 改同一模块/表/配置 | 不并行 worktree |
31
+ | 已有同名 `kld-sdd/<change>/<cap>` 分支 | 复用或问用户清理 |
32
+
33
+ 校验通过后输出报告(见 SKILL.md 模板),再 `record-base` / `worktree add`。
34
+
35
+ ## 是否建 worktree?(建议,非强制)
36
+
37
+ ### 建议建(常对应 full 目录 `apply-<change>-<capability>`)
38
+
39
+ - proposal §3 / design 显示该 cap 与其它并行 cap **无强依赖**
40
+ - 修改的文件/模块/表 **基本不重叠**
41
+ - 需要与其它 cap **同时** 本地实施
42
+
43
+ ### 建议不建 / 串行
44
+
45
+ - cap B **依赖** cap A(先 finish A 再开 B)
46
+ - 多 cap 改 **同一文件、共享配置、顺序迁移**
47
+ - 其它 cap 的 worktree 尚未 merge,当前 cap 需要 **最新** 集成分支尖端
48
+ - `git worktree add` 被沙箱拒绝 → 当前目录 + 功能分支,并说明原因
49
+
50
+ ### full 模式「一 cap 一分支」
51
+
52
+ - **约定 + 建议**,不是铁律
53
+ - simple:通常 **一 change 一 worktree**(`apply-<change>`)
54
+
55
+ ## 多 Capability 并行 merge 顺序
56
+
57
+ 1. 从 `proposal.md` 排出 capability 依赖。
58
+ 2. **无依赖**:可同时开多个 worktree 实施;**finish merge 仍逐个** 到同一 `integration_base`。
59
+ 3. **有依赖**:上游 cap 先 `finish`,下游 cap 在 merge 前应对集成分支 `rebase/merge`,或从更新后的尖端重建 worktree。
60
+
61
+ ## 流程(单次 apply)
62
+
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
70
+ ```
71
+
72
+ ### record-base
73
+
74
+ ```bash
75
+ node skywalk-sdd/apply-worktree-finish.cjs --record-base \
76
+ --change=<change> --capability=<capability>
77
+ ```
78
+
79
+ ### 创建(git 回退)
80
+
81
+ ```bash
82
+ git check-ignore -q .worktrees || echo ".worktrees/" >> .gitignore
83
+ git worktree add .worktrees/apply-<change>-<capability> -b kld-sdd/<change>/<capability>
84
+ ```
85
+
86
+ 须在**集成分支**上执行,apply 分支从该尖端分出。
87
+
88
+ ### finish
89
+
90
+ ```bash
91
+ node skywalk-sdd/apply-worktree-finish.cjs --change=<change> --capability=<capability>
92
+ ```
93
+
94
+ 状态文件:`skywalk-sdd/state/apply-<change>-<capability>.json`
95
+
96
+ ## 快速参考
97
+
98
+ | 问题 | 答案 |
99
+ |------|------|
100
+ | 为了加速本地 apply? | 是 |
101
+ | 必须 master? | 否,用 record-base 的集成分支 |
102
+ | full 必须一 cap 一分支? | 建议,解耦才可并行 |
103
+ | 有依赖怎么办? | 串行 apply + 按序 finish |
104
+ | 子代理能建 worktree 吗? | 不能 |