@namewta/speculo 0.2.6 → 0.2.9
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 +9 -9
- package/dist/src/cli.js +1 -1
- package/dist/src/cli.js.map +1 -1
- package/dist/src/index.js +0 -32
- package/dist/src/index.js.map +1 -1
- package/dist/src/migrate.js +0 -4
- package/dist/src/migrate.js.map +1 -1
- package/package.json +1 -1
- package/template/.speculo/README.md +0 -1
- package/template/.speculo/workspace.json +1 -2
- package/template/canonical/README.md +44 -70
- package/template/canonical/canonical-specdev-grill-with-docs.md +475 -0
- package/template/canonical/canonical-specdev-spec.md +82 -0
- package/template/canonical/canonical-specdev-tickets.md +232 -0
- package/template/canonical/canonical-specdev-wayfinder.md +200 -0
- package/template/canonical/canonical-teach.md +70 -65
- package/template/workflows/specdev/A-archive-and-consolidate/A-archive-and-consolidate.md +73 -0
- package/template/workflows/specdev/A-archive-and-consolidate/archive-rules.md +49 -0
- package/template/workflows/specdev/A-archive-and-consolidate/cleanup-rules.md +80 -0
- package/template/workflows/specdev/A-archive-and-consolidate/consolidation-rules.md +120 -0
- package/template/workflows/specdev/A-archive-and-consolidate/discrimination-guide.md +96 -0
- package/template/workflows/specdev/A-archive-and-consolidate/knowledge-graduation.md +51 -0
- package/template/workflows/specdev/D-diagnose-bugs/D-diagnose-bugs.md +2 -0
- package/template/workflows/specdev/D-diagnose-bugs/feedback-loop-techniques.md +1 -1
- package/template/workflows/specdev/G-grill-with-docs/G-grill-with-docs.md +8 -0
- package/template/workflows/specdev/G-grill-with-docs/grilling-protocol.md +12 -4
- package/template/workflows/specdev/G-grill-with-docs/log-format.md +8 -7
- package/template/workflows/specdev/I-implement/I-implement.md +9 -4
- package/template/workflows/specdev/I-init-setup/domain-layout.md +1 -1
- package/template/workflows/specdev/INDEX.md +9 -0
- package/template/workflows/specdev/P-goal-plan/P-goal-plan.md +84 -0
- package/template/workflows/specdev/P-goal-plan/execution-sections.md +103 -0
- package/template/workflows/specdev/P-goal-plan/governance-sections.md +103 -0
- package/template/workflows/specdev/P-goal-plan/input-validation.md +94 -0
- package/template/workflows/specdev/P-goal-plan/lead-orchestration-protocol.md +159 -0
- package/template/workflows/specdev/P-goal-plan/quick-reference-table.md +60 -0
- package/template/workflows/specdev/P-goal-plan/vision-sections.md +80 -0
- package/template/workflows/specdev/S-spec/S-spec.md +2 -0
- package/template/workflows/specdev/T-tickets/T-tickets.md +20 -53
- package/template/workflows/specdev/T-tickets/tickets-map-template.md +70 -0
- package/template/workflows/specdev/W-wayfinder/W-wayfinder.md +2 -2
- package/template/workflows/specdev/_state/research/.gitkeep +0 -0
- package/template/workflows/specdev/common/dev-worktree/SKILL.md +138 -0
- package/template/workflows/specdev/common/dev-worktree/references/create.md +63 -0
- package/template/workflows/specdev/common/dev-worktree/references/finalize.md +102 -0
- package/template/workflows/specdev/common/research/SKILL.md +54 -0
- package/template/canonical/canonical-domain-modeling.md +0 -289
- package/template/canonical/canonical-skill-example.md +0 -608
- package/template/skills/worktree-isolation/SKILL.md +0 -23
- package/template/skills/worktree-isolation/references/audit-branch-tree.md +0 -32
- package/template/skills/worktree-isolation/references/create-worktree.md +0 -39
- package/template/skills/worktree-isolation/references/merge-and-cleanup.md +0 -43
- package/template/vendor/README.md +0 -35
- package/template/vendor/matt-pocock/README.md +0 -41
- package/template/vendor/matt-pocock/engineering/README.md +0 -28
- package/template/vendor/matt-pocock/engineering/ask-matt/SKILL.md +0 -76
- package/template/vendor/matt-pocock/engineering/code-review/SKILL.md +0 -89
- package/template/vendor/matt-pocock/engineering/codebase-design/DEEPENING.md +0 -37
- package/template/vendor/matt-pocock/engineering/codebase-design/DESIGN-IT-TWICE.md +0 -44
- package/template/vendor/matt-pocock/engineering/codebase-design/SKILL.md +0 -114
- package/template/vendor/matt-pocock/engineering/diagnosing-bugs/SKILL.md +0 -134
- package/template/vendor/matt-pocock/engineering/domain-modeling/ADR-FORMAT.md +0 -47
- package/template/vendor/matt-pocock/engineering/domain-modeling/CONTEXT-FORMAT.md +0 -60
- package/template/vendor/matt-pocock/engineering/domain-modeling/SKILL.md +0 -74
- package/template/vendor/matt-pocock/engineering/grill-with-docs/SKILL.md +0 -7
- package/template/vendor/matt-pocock/engineering/implement/SKILL.md +0 -15
- package/template/vendor/matt-pocock/engineering/prototype/LOGIC.md +0 -79
- package/template/vendor/matt-pocock/engineering/prototype/SKILL.md +0 -30
- package/template/vendor/matt-pocock/engineering/prototype/UI.md +0 -112
- package/template/vendor/matt-pocock/engineering/research/SKILL.md +0 -12
- package/template/vendor/matt-pocock/engineering/setup-matt-pocock-skills/SKILL.md +0 -156
- package/template/vendor/matt-pocock/engineering/setup-matt-pocock-skills/domain.md +0 -40
- package/template/vendor/matt-pocock/engineering/setup-matt-pocock-skills/issue-tracker-github.md +0 -45
- package/template/vendor/matt-pocock/engineering/setup-matt-pocock-skills/issue-tracker-gitlab.md +0 -46
- package/template/vendor/matt-pocock/engineering/setup-matt-pocock-skills/issue-tracker-local.md +0 -30
- package/template/vendor/matt-pocock/engineering/setup-matt-pocock-skills/triage-labels.md +0 -15
- package/template/vendor/matt-pocock/engineering/tdd/SKILL.md +0 -36
- package/template/vendor/matt-pocock/engineering/tdd/mocking.md +0 -59
- package/template/vendor/matt-pocock/engineering/tdd/tests.md +0 -77
- package/template/vendor/matt-pocock/engineering/to-spec/SKILL.md +0 -75
- package/template/vendor/matt-pocock/engineering/to-tickets/SKILL.md +0 -113
- package/template/vendor/matt-pocock/engineering/wayfinder/SKILL.md +0 -127
- package/template/vendor/matt-pocock/in-progress/README.md +0 -10
- package/template/vendor/matt-pocock/in-progress/claude-handoff/SKILL.md +0 -18
- package/template/vendor/matt-pocock/in-progress/loop-me/SKILL.md +0 -32
- package/template/vendor/matt-pocock/in-progress/wizard/SKILL.md +0 -45
- package/template/vendor/matt-pocock/in-progress/wizard/template.sh +0 -211
- package/template/vendor/matt-pocock/in-progress/writing-beats/SKILL.md +0 -67
- package/template/vendor/matt-pocock/in-progress/writing-fragments/SKILL.md +0 -78
- package/template/vendor/matt-pocock/in-progress/writing-shape/SKILL.md +0 -79
- package/template/vendor/matt-pocock/productivity/README.md +0 -18
- package/template/vendor/matt-pocock/productivity/grill-me/SKILL.md +0 -7
- package/template/vendor/matt-pocock/productivity/grilling/SKILL.md +0 -12
- package/template/vendor/matt-pocock/productivity/teach/GLOSSARY-FORMAT.md +0 -35
- package/template/vendor/matt-pocock/productivity/teach/LEARNING-RECORD-FORMAT.md +0 -46
- package/template/vendor/matt-pocock/productivity/teach/MISSION-FORMAT.md +0 -31
- package/template/vendor/matt-pocock/productivity/teach/RESOURCES-FORMAT.md +0 -32
- package/template/vendor/matt-pocock/productivity/teach/SKILL.md +0 -140
- /package/template/{vendor/matt-pocock/productivity → skills}/writing-great-skills/GLOSSARY.md +0 -0
- /package/template/{vendor/matt-pocock/productivity → skills}/writing-great-skills/SKILL.md +0 -0
- /package/template/{vendor/matt-pocock/productivity → workflows/specdev/common}/handoff/SKILL.md +0 -0
- /package/template/{vendor/matt-pocock/engineering → workflows/specdev/common}/improve-codebase-architecture/HTML-REPORT.md +0 -0
- /package/template/{vendor/matt-pocock/engineering → workflows/specdev/common}/improve-codebase-architecture/SKILL.md +0 -0
- /package/template/{vendor/khazix-skills → workflows/specdev/common}/neat-freak/SKILL.md +0 -0
- /package/template/{vendor/khazix-skills → workflows/specdev/common}/neat-freak/references/agent-paths.md +0 -0
- /package/template/{vendor/khazix-skills → workflows/specdev/common}/neat-freak/references/governance.md +0 -0
- /package/template/{vendor/khazix-skills → workflows/specdev/common}/neat-freak/references/sync-matrix.md +0 -0
- /package/template/{vendor/khazix-skills → workflows/specdev/common}/neat-freak/references/verification.md +0 -0
- /package/template/{vendor/khazix-skills → workflows/specdev/common}/neat-freak/scripts/audit-inventory.sh +0 -0
- /package/template/{vendor/matt-pocock/engineering → workflows/specdev/common}/resolving-merge-conflicts/SKILL.md +0 -0
- /package/template/{vendor/matt-pocock/engineering/diagnosing-bugs → workflows/specdev/common}/scripts/hitl-loop.template.sh +0 -0
- /package/template/{vendor/matt-pocock/engineering → workflows/specdev/common}/triage/AGENT-BRIEF.md +0 -0
- /package/template/{vendor/matt-pocock/engineering → workflows/specdev/common}/triage/OUT-OF-SCOPE.md +0 -0
- /package/template/{vendor/matt-pocock/engineering → workflows/specdev/common}/triage/SKILL.md +0 -0
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
# 远景章节 §1-3 编写规程
|
|
2
|
+
|
|
3
|
+
编写 goal-plan 的前三个章节——定义"做什么"和"怎么算做完"。逐节草拟,每节经用户确认后再进入下一节。不一口气抛出全部三节。
|
|
4
|
+
|
|
5
|
+
## §1 — Goal
|
|
6
|
+
|
|
7
|
+
### 五要素公式
|
|
8
|
+
|
|
9
|
+
从 spec.md 的 Problem Statement 和 Solution 段落提取,合成一段密集声明,包含五个要素:
|
|
10
|
+
|
|
11
|
+
1. **构建什么**(what)——从 spec.md Solution 的第一句提炼
|
|
12
|
+
2. **不可协商的约束**(constraints)——从 ADR.md 架构决策中提取,至少一条
|
|
13
|
+
3. **具体交付物**(deliverable)——ticket 数量 + issue 范围(如 "#18-#38,共 21 个 issues")
|
|
14
|
+
4. **质量标杆**(quality bar)——如果激活参考权威模式,声明与参考权威的对应关系(如"与 openhanako 手感一致");否则从 spec.md 的 Test Decisions 提取
|
|
15
|
+
5. **反模式**(anti-pattern)——声明禁止的伪完成(如"能力存在但手感不像 X")
|
|
16
|
+
|
|
17
|
+
### 编写规则
|
|
18
|
+
|
|
19
|
+
- 一段写到底,不分点、不用列表
|
|
20
|
+
- 每个要素是可检查的声明,不是模糊愿望
|
|
21
|
+
- 反模式必须具体到可识别——禁止"代码写完但交互细节不匹配"
|
|
22
|
+
|
|
23
|
+
### 草拟与确认
|
|
24
|
+
|
|
25
|
+
先输出 §1 草案,等待用户确认。确认后进入 §2。
|
|
26
|
+
|
|
27
|
+
## §2 — Authoritative Inputs
|
|
28
|
+
|
|
29
|
+
### 优先级表
|
|
30
|
+
|
|
31
|
+
构建一张三列表格:优先级 | 文件路径 | 角色说明。行按优先级降序排列。
|
|
32
|
+
|
|
33
|
+
按检测到的模式逐行添加:
|
|
34
|
+
|
|
35
|
+
1. **合同行**(如激活合同模式)——优先级 1,路径指向合同文档,角色:"冻结合同——含编号验收条目,先于所有其他参考"
|
|
36
|
+
2. **参考权威行**(如激活参考权威模式)——优先级 2,路径指向参考快照,角色:"UX 真理——冻结快照,不随上游漂移。手感比对基准"
|
|
37
|
+
3. **ADR 行**——从 ADR.md 和永久 ADR 目录(`<Path>{roots.state}/specdev/adr/</Path>`)提取,每份一个行,优先级按 ADR 编号
|
|
38
|
+
4. **领域文档行**——从 CONTEXT.md 提取,每份一个行,角色:"领域词汇表——术语定义和弃用同义词的权威来源"
|
|
39
|
+
5. **Spec/Ticket 行**——spec.md 和 tickets-map.md,优先级最低
|
|
40
|
+
|
|
41
|
+
### 冲突裁决顺序
|
|
42
|
+
|
|
43
|
+
从 input-validation.md 的推导结果复制,写为编号列表。
|
|
44
|
+
|
|
45
|
+
### 锁定产品裁定
|
|
46
|
+
|
|
47
|
+
从 ADR.md 的架构决策和 spec.md 的 Implementation Decisions 中提取不可推翻的裁定。每条裁定写为一句声明,标注来源(ADR 编号或 Issue 编号)。
|
|
48
|
+
|
|
49
|
+
- 裁定必须是已做出且不可推翻的——只提取 ADR 中标记为"决定"状态的条目
|
|
50
|
+
- 如果激活偏差模式,在此声明偏差编号和每条偏差的理由
|
|
51
|
+
|
|
52
|
+
### 草拟与确认
|
|
53
|
+
|
|
54
|
+
先输出 §2 完整草案(优先级表 + 冲突顺序 + 锁定裁定),等待用户确认。确认后进入 §3。
|
|
55
|
+
|
|
56
|
+
## §3 — Definition of Done
|
|
57
|
+
|
|
58
|
+
### 六道门禁骨架
|
|
59
|
+
|
|
60
|
+
逐道门禁填空,每道门禁写为一条可客观验证的全部或无声明:
|
|
61
|
+
|
|
62
|
+
1. **Issue 全绿**——填写 ticket 数量和仓库引用。格式:「所有 <N> 个 issues 全部关闭,每个 issue 的 checklist 全部勾选为 [x]」
|
|
63
|
+
2. **合同/ADR 状态收敛**——如果激活合同模式:填写合同文档名和待验收条目数。格式:「`<合同>` 中所有 <P0|P1|P2> 条目状态非 `todo`——`done` 或 `deviate`(有记录理由)」;如果无合同:填写 ADR 编号。格式:「ADR-<NNNN> 状态保持 `accepted`,偏差表条目已解决或明确记录为 `deviate`」
|
|
64
|
+
3. **验证门禁绿**——从 spec.md 的 Test Decisions 提取验证命令。格式:「`<verify_cmd>` 全绿」
|
|
65
|
+
4. **架构不回退**——填写 lint 和类型检查。格式:「无架构退化——<lint rules>」
|
|
66
|
+
5. **已锁裁定不松动**——引用 §2 的锁定产品裁定。格式:「§2 的 <N> 条锁定产品裁定全部满足,无静默推翻」
|
|
67
|
+
6. **可追溯**——填写 commit 到 issue 的链接要求。格式:「每个关闭的 issue 包含实现 commit 引用和验证截图/日志」
|
|
68
|
+
|
|
69
|
+
### 填充规则
|
|
70
|
+
|
|
71
|
+
- ticket 数量从 tickets-map.md 统计
|
|
72
|
+
- 合同条目从合同文档的表格行计数
|
|
73
|
+
- verify 命令从 spec.md Test Decisions 提取,如无则使用 `pnpm verify`
|
|
74
|
+
- 锁定裁定数量从 §2 提取
|
|
75
|
+
|
|
76
|
+
### 草拟与确认
|
|
77
|
+
|
|
78
|
+
输出 §3 完整草案,等待用户确认。
|
|
79
|
+
|
|
80
|
+
**完成标准**:§1 目标声明五要素齐全且经用户确认;§2 优先级表、冲突裁决顺序、锁定裁定完整且经用户确认;§3 六道门禁全部填充为可客观验证的声明且经用户确认。
|
|
@@ -23,6 +23,8 @@ keywords: [spec, 规范, 需求, PRD, 用户故事]
|
|
|
23
23
|
|
|
24
24
|
`{change}` 为当前活跃变更的目录名,格式为 `<YYYY-MM-DD>-<topic>`。如果尚未创建变更目录,先运行 `<Path>{roots.workflows}/specdev/G-grill-with-docs/G-grill-with-docs.md</Path>` 的启动变更阶段初始化 CONTEXT.md 和 ADR.md。
|
|
25
25
|
|
|
26
|
+
若代码库探索中遇到不熟悉的模块、外部依赖、第三方 SDK 或技术领域,调用 `<Path>{roots.workflows}/specdev/common/research/SKILL.md</Path>` 进行针对性调查——了解其设计意图、API 契约和行为特征——再基于完整理解撰写 spec。
|
|
27
|
+
|
|
26
28
|
**完成标准**:代码库当前状态已理解,领域词汇表和 ADR 已纳入考量。
|
|
27
29
|
|
|
28
30
|
### 2. 草拟接缝
|
|
@@ -39,6 +39,8 @@ keywords: [tickets, 拆分, 任务, 垂直切片, 阻塞, 曳光弹]
|
|
|
39
39
|
- 如果某个模块的当前结构会使后续实现变得复杂,先提出一个重构 ticket,放在功能 tickets 之前。
|
|
40
40
|
- 预重构必须独立有价值——不是为了"更干净"而重构,而是为了"让后续变更更安全/更简单"。
|
|
41
41
|
|
|
42
|
+
若探索中遇到不熟悉的模块、外部依赖或第三方库——其接口设计意图和行为特征尚不明确——调用 `<Path>{roots.workflows}/specdev/common/research/SKILL.md</Path>` 完成探查后再继续识别预重构机会。
|
|
43
|
+
|
|
42
44
|
**完成标准**:代码库已探索,预重构机会已识别,领域词汇表和 ADR 已纳入考量。
|
|
43
45
|
|
|
44
46
|
### 3. 草拟垂直切片
|
|
@@ -170,72 +172,37 @@ keywords: [tickets, 拆分, 任务, 垂直切片, 阻塞, 曳光弹]
|
|
|
170
172
|
|
|
171
173
|
**5c. 写入 tickets-map.md**
|
|
172
174
|
|
|
173
|
-
创建 `<Path>{roots.state}/specdev/changes/{change}/tickets-map.md</Path>`,作为所有 ticket
|
|
174
|
-
|
|
175
|
-
```markdown
|
|
176
|
-
# Tickets Map: <工作简短名称>
|
|
177
|
-
|
|
178
|
-
<一段话总结所有 ticket 共同构建的内容。如果拆分依据是 spec,引用 spec.md。如果基于对话或计划,说明来源。>
|
|
179
|
-
|
|
180
|
-
## 执行清单
|
|
181
|
-
|
|
182
|
-
| 编号 | Ticket | 被阻塞于 | 状态 |
|
|
183
|
-
|------|--------|----------|------|
|
|
184
|
-
| #01 | [ticket-name](./ticket/#01-ticket-name.md) | 无 | 未开始 |
|
|
185
|
-
| #02 | [ticket-name](./ticket/#02-ticket-name.md) | #01 | 未开始 |
|
|
186
|
-
| #10 | [ticket-name](./ticket/#10-ticket-name.md) | #02, #05 | 未开始 |
|
|
187
|
-
|
|
188
|
-
> 状态枚举:未开始 / 进行中 / 已完成。所有 ticket 发布时初始状态为"未开始",随实现进度手动更新。
|
|
189
|
-
> **被阻塞于**列填写阻塞本 ticket 的 ticket 编号(如 `#01`、`#02, #05`),执行者需自行打开对应 ticket 文件查看其状态。不可仅凭此表判断——始终以对应 ticket 文件中的状态字段为准。
|
|
190
|
-
|
|
191
|
-
## 依赖关系
|
|
192
|
-
|
|
193
|
-
<!-- 用 ASCII 树形图展示 ticket 之间的阻塞关系。 -->
|
|
194
|
-
|
|
195
|
-
```
|
|
196
|
-
#01-<name> ← 无阻塞,可立即开始
|
|
197
|
-
├── #02-<name> ← 阻塞于 #01
|
|
198
|
-
└── #03-<name> ← 阻塞于 #01
|
|
199
|
-
└── #04-<name> ← 阻塞于 #03
|
|
200
|
-
```
|
|
175
|
+
创建 `<Path>{roots.state}/specdev/changes/{change}/tickets-map.md</Path>`,作为所有 ticket 的总体地图和执行看板。格式遵循权威模板 `<Path>{roots.workflows}/specdev/T-tickets/tickets-map-template.md</Path>`——加载该模板获取完整的节结构、表格列定义和填写约定。
|
|
201
176
|
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
<!-- 跨多个 ticket 的规则与约束。仅在有实际内容时填写,无则省略整个小节。 -->
|
|
205
|
-
|
|
206
|
-
- **数据安全铁律**:<冻结的常量、不可改的 wire-format、持久化格式>
|
|
207
|
-
- **契约先行**:<跨 ticket 的 schema/API 变更顺序约束>
|
|
208
|
-
- **行号现场核对**:所有文件路径和行号为近似,实施时以现场代码为准。
|
|
209
|
-
|
|
210
|
-
## 阻塞关系说明
|
|
211
|
-
|
|
212
|
-
<!-- 依赖图的文字说明。简单线性链可省略整个小节。对于扩展-收缩模式,解释三阶段。 -->
|
|
213
|
-
|
|
214
|
-
<描述为何 ticket #B 被 ticket #A 阻塞。扩展-收缩模式:扩展阶段创建新形式 → 迁移批次逐步切换调用点 → 收缩阶段删除旧形式。>
|
|
215
|
-
|
|
216
|
-
## 风险与注意事项
|
|
217
|
-
|
|
218
|
-
<!-- 跨 ticket 的风险、回滚考虑。无可省略整个小节。 -->
|
|
219
|
-
```
|
|
177
|
+
T-tickets 阶段填写的列:**编号**、**Ticket**、**被阻塞于**、**状态**(初始"未开始")。**Gate** 和 **Contract ID** 列暂留空或标注 `[待标注]`——由后续 P-goal-plan 在标注门禁层级时填充。**依赖关系**节写入基础 ASCII 树形图(阻塞链),后续 P-goal-plan 在此基础上叠加门禁边界(`--- P0 gate ---`)、就绪标记 `[READY]` 和扇出标记 `[FAN-OUT: N路并行]`。**并行规则**节按模板保留——T-tickets 阶段写入规则文本,P-goal-plan 阶段可调整并发数。
|
|
220
178
|
|
|
221
179
|
**tickets-map.md 填写说明:**
|
|
222
180
|
|
|
223
|
-
- **执行清单**的 Ticket 列使用指向 `./ticket/` 目录的相对链接(含 `#`
|
|
181
|
+
- **执行清单**的 Ticket 列使用指向 `./ticket/` 目录的相对链接(含 `#` 编号前缀)
|
|
224
182
|
- **编号**列使用 `#01`、`#02`、`#10` 格式(`#` + 零填充序号),代表依赖顺序
|
|
225
|
-
- **被阻塞于**列填写阻塞者的编号(如 `#01`、`#02, #05
|
|
183
|
+
- **被阻塞于**列填写阻塞者的编号(如 `#01`、`#02, #05`)
|
|
226
184
|
- **状态**列由 T-tickets 初始化为"未开始",后续由实现者手动更新——始终以对应 ticket 文件中的状态字段为权威来源
|
|
227
|
-
-
|
|
185
|
+
- **Gate** 列(P0/P1/P2)和 **Contract ID** 列由 P-goal-plan 填充;T-tickets 阶段留空或标 `[待标注]`
|
|
186
|
+
- **依赖关系**用 ASCII 树形图展示阻塞链——T-tickets 写入基础结构,P-goal-plan 叠加门禁标注
|
|
228
187
|
- **横切关注点**只放跨 ticket 的规则——单 ticket 的规则留在该 ticket 文件内
|
|
229
|
-
-
|
|
188
|
+
- **阻塞关系说明**在依赖图非平凡时补充文字解释
|
|
230
189
|
|
|
231
|
-
**完成标准**:`ticket/` 目录已创建,所有 ticket 独立文件已按依赖顺序写入(命名为 `#NN-<ticket-name>.md`);`tickets-map.md`
|
|
190
|
+
**完成标准**:`ticket/` 目录已创建,所有 ticket 独立文件已按依赖顺序写入(命名为 `#NN-<ticket-name>.md`);`tickets-map.md` 已按 `<Path>{roots.workflows}/specdev/T-tickets/tickets-map-template.md</Path>` 格式写入——包含总体摘要、六列执行清单(Gate 和 Contract ID 列为 `[待标注]`)、基础依赖关系 ASCII 树形图、并行规则和横切关注点;每个 ticket 声明阻塞边、战略与背景、范围边界、交付物、保留/不动和验收标准。
|
|
232
191
|
|
|
233
192
|
## 子文件引用
|
|
234
193
|
|
|
235
|
-
|
|
194
|
+
| 文件 | 内容 | 触发条件 |
|
|
195
|
+
|------|------|----------|
|
|
196
|
+
| `<Path>{roots.workflows}/specdev/T-tickets/tickets-map-template.md</Path>` | tickets-map.md 权威模板——执行清单六列表格、门禁标注 DAG、并行规则、横切关注点 | 进入步骤 5c「写入 tickets-map.md」时加载——T-tickets 按此模板输出基础结构,P-goal-plan 随后标注 Gate、Contract ID 和门禁 DAG |
|
|
197
|
+
|
|
198
|
+
本入口为单文件 work,所有 ticket 拆分流程内容均已内联。以下引用供其他 work 读取产物:
|
|
236
199
|
|
|
237
|
-
- `<Path>{roots.state}/specdev/changes/{change}/tickets-map.md</Path>` —— 总体地图与执行清单(编号 | Ticket | 被阻塞于 |
|
|
200
|
+
- `<Path>{roots.state}/specdev/changes/{change}/tickets-map.md</Path>` —— 总体地图与执行清单(编号 | Ticket | 被阻塞于 | Gate | Contract ID | 状态),格式遵循 `<Path>{roots.workflows}/specdev/T-tickets/tickets-map-template.md</Path>`
|
|
238
201
|
- `<Path>{roots.state}/specdev/changes/{change}/ticket/</Path>` —— 独立 ticket 文件目录,每个文件命名为 `#NN-<ticket-name>.md`(`#NN` = `#01`, `#02`, ..., `#10`, ...)
|
|
239
202
|
- `<Path>{roots.state}/specdev/changes/{change}/spec.md</Path>` —— 上游 spec(拆分依据)
|
|
240
203
|
- `<Path>{roots.state}/specdev/adr/</Path>` —— 永久架构决策目录(已确认并提升的 ADR)
|
|
241
204
|
- `<Path>{roots.state}/specdev/context/</Path>` —— 永久领域词汇表目录(已确认并提升的 CONTEXT)
|
|
205
|
+
|
|
206
|
+
## 下一步
|
|
207
|
+
|
|
208
|
+
如果 ticket 数量超过 10 个,建议运行 `<Path>{roots.workflows}/specdev/P-goal-plan/P-goal-plan.md</Path>` 产出目标规划文档,定义里程碑级约束、质量门禁和执行协议,为大规模协调执行做准备。
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
# Tickets Map: <工作简短名称>
|
|
2
|
+
|
|
3
|
+
<一段话总结所有 ticket 共同构建的内容。如果拆分依据是 spec,引用 spec.md。如果基于对话或计划,说明来源。>
|
|
4
|
+
|
|
5
|
+
## 执行清单
|
|
6
|
+
|
|
7
|
+
| 编号 | Ticket | 被阻塞于 | Gate | Contract ID | 状态 |
|
|
8
|
+
|------|--------|----------|------|-------------|------|
|
|
9
|
+
| #01 | [ticket-name](./ticket/#01-ticket-name.md) | 无 | P0 | — | 未开始 |
|
|
10
|
+
| #02 | [ticket-name](./ticket/#02-ticket-name.md) | #01 | P1 | P1-03 | 未开始 |
|
|
11
|
+
| #10 | [ticket-name](./ticket/#10-ticket-name.md) | #02, #05 | P2 | — | 未开始 |
|
|
12
|
+
|
|
13
|
+
> **状态枚举**:未开始 / 进行中 / 已完成。所有 ticket 初始均为"未开始"。
|
|
14
|
+
> **被阻塞于**列填写阻塞本 ticket 的 ticket 编号(如 `#01`、`#02, #05`),执行者需自行打开对应 ticket 文件查看其状态。不可仅凭此表判断——始终以对应 ticket 文件中的状态字段为准。
|
|
15
|
+
> **Gate 列**:P0 = 核心基础设施(阻塞所有后续工作)/ P1 = 主要功能切片 / P2 = 增强和边界情况。由 P-goal-plan 填充,T-tickets 阶段留空或标注 `[待标注]`。
|
|
16
|
+
> **Contract ID 列**:如有冻结合同/验收文档,填写本 ticket 覆盖的验收条目 ID(如 `P0-01, P1-03`);无合同则填 `—`。由 P-goal-plan 填充。
|
|
17
|
+
|
|
18
|
+
## 依赖关系(门禁标注 DAG)
|
|
19
|
+
|
|
20
|
+
<!-- 用 ASCII DAG 展示 ticket 之间的阻塞关系和门禁边界。
|
|
21
|
+
由 T-tickets 写入基础树形结构,由 P-goal-plan 标注门禁层级(P0/P1/P2)、
|
|
22
|
+
就绪标记 [READY] 和扇出标记 [FAN-OUT: N路并行]。
|
|
23
|
+
|
|
24
|
+
绘制约定:
|
|
25
|
+
- 每行一个 ticket,缩进表示依赖深度
|
|
26
|
+
- → 表示依赖关系(A → B 表示 B 依赖 A)
|
|
27
|
+
- 用注释标注门禁边界:--- P0 gate ---
|
|
28
|
+
- 可立即开始的 ticket 标注 [READY]
|
|
29
|
+
- 扇出点标注 [FAN-OUT: N路并行]
|
|
30
|
+
|
|
31
|
+
示例格式:
|
|
32
|
+
#01 [READY] → #02 [FAN-OUT: 3路并行]
|
|
33
|
+
├→ #03 [P0]
|
|
34
|
+
├→ #04 [P1]
|
|
35
|
+
└→ #05 [P1]
|
|
36
|
+
--- P0 gate ---
|
|
37
|
+
#03 → #06 [P1] → #07 [P2]
|
|
38
|
+
-->
|
|
39
|
+
|
|
40
|
+
```
|
|
41
|
+
#01-<name> ← 无阻塞,可立即开始
|
|
42
|
+
├── #02-<name> ← 阻塞于 #01
|
|
43
|
+
└── #03-<name> ← 阻塞于 #01
|
|
44
|
+
└── #04-<name> ← 阻塞于 #03
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
## 并行规则
|
|
48
|
+
|
|
49
|
+
- 最大 **3** 个并发实现者(ticket 数 > 20 时可调至 4)
|
|
50
|
+
- 并发 ticket 的 file allowlist 必须互不重叠——两两之间无可写文件交集
|
|
51
|
+
- 共享文件(package.json、lockfile、合同文档、IPC 根导出、领域词汇表)仅由 Lead 修改
|
|
52
|
+
- 共享文件修改后,所有并发子代理需在继续前同步
|
|
53
|
+
|
|
54
|
+
## 横切关注点
|
|
55
|
+
|
|
56
|
+
<!-- 跨多个 ticket 的规则与约束。仅在有实际内容时填写,无则省略整个小节。 -->
|
|
57
|
+
|
|
58
|
+
- **数据安全铁律**:<冻结的常量、不可改的 wire-format、持久化格式>
|
|
59
|
+
- **契约先行**:<跨 ticket 的 schema/API 变更顺序约束>
|
|
60
|
+
- **行号现场核对**:所有文件路径和行号为近似,实施时以现场代码为准。
|
|
61
|
+
|
|
62
|
+
## 阻塞关系说明
|
|
63
|
+
|
|
64
|
+
<!-- 依赖图的文字说明。简单线性链可省略整个小节。对于扩展-收缩模式,解释三阶段。 -->
|
|
65
|
+
|
|
66
|
+
<描述为何 ticket #B 被 ticket #A 阻塞。扩展-收缩模式:扩展阶段创建新形式 → 迁移批次逐步切换调用点 → 收缩阶段删除旧形式。>
|
|
67
|
+
|
|
68
|
+
## 风险与注意事项
|
|
69
|
+
|
|
70
|
+
<!-- 跨 ticket 的风险、回滚考虑。无可省略整个小节。 -->
|
|
@@ -103,7 +103,7 @@ Wayfinder 默认进行**规划**:每个 ticket 解决一个决策,当地图
|
|
|
103
103
|
|
|
104
104
|
每个 ticket 要么是 **HITL** —— 人在回路中,与一个代表自己发言的人类*一起*工作 —— 要么是 **AFK**,由 agent 独立驱动。HITL ticket 只能通过实时交流来解决;agent 绝不代替人类一方发言(一个自问自答的质询 agent 已经破坏了这一点)。
|
|
105
105
|
|
|
106
|
-
- **Research**(AFK
|
|
106
|
+
- **Research**(AFK):调用 `<Path>{roots.workflows}/specdev/common/research/SKILL.md</Path>` 启动后台 Agent 针对一手来源调查问题,在 ticket 的答案中链接研究产出文件。当需要当前工作目录之外的知识时使用。
|
|
107
107
|
- **Prototype**(HITL):通过制作一个廉价、粗糙、具体的产物来提高讨论的保真度 —— 大纲、粗略尝试、桩代码、或 UI/逻辑代码。将原型链接为资产。当"它应该是什么样子"或"它应该怎样表现"是关键问题时使用。
|
|
108
108
|
- **Grilling**(HITL):通过 `<Path>{roots.workflows}/specdev/G-grill-with-docs/grilling-protocol.md</Path>` 访谈协议逐个问题进行对话。同时使用 `<Path>{roots.workflows}/specdev/G-grill-with-docs/domain-modeling-rules.md</Path>` 维护领域模型。默认情况 —— 当不确定类型时选此。
|
|
109
109
|
- **Task**(HITL 或 AFK):在*决策*能够做出之前必须完成的手动工作 —— 没有需要决定、原型化或研究的内容,但讨论被阻塞直到完成。注册服务以便判断其 API、开通访问权限、移动数据以便看到其形态。这是唯一一个*执行*而非决策的类型 —— 它通过为决策解除阻塞来赢得其位置,而非通过交付目标。Agent 在可能的情况下独立驱动(AFK);否则它交给人类一份精确的清单(HITL)。当工作完成时解决;答案记录已完成的工作以及后续 tickets 依赖的任何结果性事实(凭据位置、新 URL、行数)。
|
|
@@ -167,7 +167,7 @@ Wayfinder 默认进行**规划**:每个 ticket 解决一个决策,当地图
|
|
|
167
167
|
|
|
168
168
|
**完成标准**:一个前沿 ticket 已被选中并领取。
|
|
169
169
|
|
|
170
|
-
3. **解决它** —— **按需缩放**:按需拉取任何相关或已关闭 ticket 的完整正文;调用 Notes
|
|
170
|
+
3. **解决它** —— **按需缩放**:按需拉取任何相关或已关闭 ticket 的完整正文;调用 Notes 块中指定的技能。根据 ticket 类型选择解决方式:**research** ticket 调用 `<Path>{roots.workflows}/specdev/common/research/SKILL.md</Path>`;**grilling** ticket 使用 `<Path>{roots.workflows}/specdev/G-grill-with-docs/G-grill-with-docs.md</Path>` 进行访谈;**prototype** 和 **task** 按各自问题描述执行。查阅 `<Path>{roots.workflows}/specdev/G-grill-with-docs/domain-modeling-rules.md</Path>` 维护领域模型的一致性。
|
|
171
171
|
|
|
172
172
|
**完成标准**:ticket 的问题已解决,答案已记录。
|
|
173
173
|
|
|
File without changes
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: dev-worktree
|
|
3
|
+
description: 在 Speculo workflow change 内创建隔离 git worktree 进行开发,完成后验证测试并合回基础分支。当用户要求隔离开发、开始实现、或实现完成后需要合并/清理时使用。与 specdev workflow 深度集成,worktree 持久化在 change 目录下的 .worktree/ 中。
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Dev Worktree
|
|
7
|
+
|
|
8
|
+
为当前 workflow change 创建独立 worktree,实现「隔离开发 → 验证 → 合并 → 清理」闭环。
|
|
9
|
+
|
|
10
|
+
**启动时宣布:** 「正在使用 dev-worktree 技能。」
|
|
11
|
+
|
|
12
|
+
## 决策树
|
|
13
|
+
|
|
14
|
+
| 场景 | 入口 |
|
|
15
|
+
|------|------|
|
|
16
|
+
| 要开始实现 / 用户要求隔离 | **阶段 A:创建 worktree** |
|
|
17
|
+
| 已在 worktree 中,开发完成 | **阶段 B:收尾合并** |
|
|
18
|
+
| 已在 worktree 中,未完成 | 继续开发,不重复创建 |
|
|
19
|
+
| 用户要求 PR / 暂存 / 丢弃 | 阶段 B 按对应选项执行 |
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## 阶段 A:创建 Worktree
|
|
24
|
+
|
|
25
|
+
详细步骤见 [references/create.md](references/create.md)。核心流程:
|
|
26
|
+
|
|
27
|
+
### A0. 检测现有隔离
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
GIT_DIR=$(cd "$(git rev-parse --git-dir)" 2>/dev/null && pwd -P)
|
|
31
|
+
GIT_COMMON=$(cd "$(git rev-parse --git-common-dir)" 2>/dev/null && pwd -P)
|
|
32
|
+
SUPER=$(git rev-parse --show-superproject-working-tree 2>/dev/null)
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
- `SUPER` 有值 → submodule 内,按普通仓库处理,不误判
|
|
36
|
+
- `GIT_DIR != GIT_COMMON` 且非 submodule → 已在 worktree,跳到 A3 设置
|
|
37
|
+
- `GIT_DIR == GIT_COMMON` → 主工作区,继续
|
|
38
|
+
|
|
39
|
+
### A1. 命名与路径
|
|
40
|
+
|
|
41
|
+
| 要素 | 值 |
|
|
42
|
+
|------|-----|
|
|
43
|
+
| 基础分支 | 当前分支(`git rev-parse --abbrev-ref HEAD`) |
|
|
44
|
+
| change 分支 | `speculo/<workflow>/<change>` |
|
|
45
|
+
| worktree 路径 | `{state-root}/<workflow>/changes/<change>/.worktree/` |
|
|
46
|
+
|
|
47
|
+
分支或路径已存在 → 停止,不覆盖不复用。
|
|
48
|
+
|
|
49
|
+
**前置检查:** `speculo/.speculo/` 必须被 git 跟踪——产物需随分支合并。若被忽略则降级为非 worktree 模式。
|
|
50
|
+
|
|
51
|
+
### A2. 创建
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
git worktree add -b speculo/<workflow>/<change> {state-root}/<workflow>/changes/<change>/.worktree
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
确保 `.gitignore` 含 `.worktree/`;缺失则追加并提交。
|
|
58
|
+
|
|
59
|
+
### A3. 项目设置与基线
|
|
60
|
+
|
|
61
|
+
自动检测并安装依赖、运行基线测试:
|
|
62
|
+
|
|
63
|
+
```bash
|
|
64
|
+
[ -f package.json ] && (npm install 2>/dev/null || true)
|
|
65
|
+
[ -f Cargo.toml ] && cargo build
|
|
66
|
+
[ -f requirements.txt ] && pip install -r requirements.txt
|
|
67
|
+
[ -f go.mod ] && go mod download
|
|
68
|
+
# 跑基线测试
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
基线测试失败 → 报告并询问,未获许可不开始实现。
|
|
72
|
+
|
|
73
|
+
### A4. 写回状态
|
|
74
|
+
|
|
75
|
+
将 `base_branch`、`change_branch`、`worktree_path`、`worktree_status: active` 写入 change 的 `.status.json`。
|
|
76
|
+
|
|
77
|
+
---
|
|
78
|
+
|
|
79
|
+
## 阶段 B:收尾合并
|
|
80
|
+
|
|
81
|
+
详细步骤见 [references/finalize.md](references/finalize.md)。
|
|
82
|
+
|
|
83
|
+
### B1. 验证测试
|
|
84
|
+
|
|
85
|
+
跑项目测试套件。失败 → 停止,禁止合并/PR。
|
|
86
|
+
|
|
87
|
+
### B2. 展示选项
|
|
88
|
+
|
|
89
|
+
```
|
|
90
|
+
实现已完成。你想怎么做?
|
|
91
|
+
|
|
92
|
+
1. 本地合并回 <base-branch>(推荐,默认)
|
|
93
|
+
2. 推送并创建 Pull Request
|
|
94
|
+
3. 保持现状(稍后处理)
|
|
95
|
+
4. 丢弃
|
|
96
|
+
|
|
97
|
+
选哪个?
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
分离 HEAD 时移除选项 1。用户未指定时默认选项 1。
|
|
101
|
+
|
|
102
|
+
### B3. 执行 —— 顺序不可变
|
|
103
|
+
|
|
104
|
+
**选项 1(本地合并):**
|
|
105
|
+
1. 合并到 base:`git checkout <base> && git pull && git merge --no-ff <change_branch>`
|
|
106
|
+
2. 在合并结果上再跑测试
|
|
107
|
+
3. 测试通过 → 从主仓库根删除 worktree:`git worktree remove <path>`
|
|
108
|
+
4. 删除分支:`git branch -d <change_branch>`
|
|
109
|
+
5. `git worktree prune`
|
|
110
|
+
6. 更新 `.status.json`:`worktree_status: removed`
|
|
111
|
+
|
|
112
|
+
**选项 2(PR):** 推送分支、创建 PR,保留 worktree。
|
|
113
|
+
**选项 3(保持):** 不动,报告状态。
|
|
114
|
+
**选项 4(丢弃):** 确认后删除 worktree 和分支。
|
|
115
|
+
|
|
116
|
+
合并冲突或测试失败 → 停止,保留现场,报告原因,不强推。
|
|
117
|
+
|
|
118
|
+
---
|
|
119
|
+
|
|
120
|
+
## 红线
|
|
121
|
+
|
|
122
|
+
**绝不:**
|
|
123
|
+
- 已在 worktree 时嵌套创建
|
|
124
|
+
- 覆盖已有分支或路径
|
|
125
|
+
- 测试失败时继续合并/PR
|
|
126
|
+
- 合并结果未验证就删 worktree
|
|
127
|
+
- 先删分支再 worktree remove(顺序:merge → remove worktree → delete branch)
|
|
128
|
+
- 在 worktree 内部执行 `git worktree remove`
|
|
129
|
+
- 未经确认执行破坏性操作
|
|
130
|
+
- 强制推送
|
|
131
|
+
|
|
132
|
+
**始终:**
|
|
133
|
+
- 分支名:`speculo/<workflow>/<change>`
|
|
134
|
+
- worktree 路径:change 目录下的 `.worktree/`
|
|
135
|
+
- 创建后装依赖 + 基线测试
|
|
136
|
+
- 收尾前验证测试
|
|
137
|
+
- 合并成功后再清理
|
|
138
|
+
- 清理后 `git worktree prune`
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
# 创建 Worktree
|
|
2
|
+
|
|
3
|
+
为当前 workflow change 建立独立 worktree。由 SKILL.md 阶段 A 调用。
|
|
4
|
+
|
|
5
|
+
## 前置
|
|
6
|
+
|
|
7
|
+
1. git 仓库内,工作区干净或可接受
|
|
8
|
+
2. `speculo/.speculo/` 被 git 跟踪(change 产物随分支合并回 base);若被忽略则降级非 worktree 模式
|
|
9
|
+
3. `.gitignore` 含 `.worktree/`;缺失则追加并提交
|
|
10
|
+
|
|
11
|
+
## 检测已有隔离
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
GIT_DIR=$(cd "$(git rev-parse --git-dir)" 2>/dev/null && pwd -P)
|
|
15
|
+
GIT_COMMON=$(cd "$(git rev-parse --git-common-dir)" 2>/dev/null && pwd -P)
|
|
16
|
+
SUPER=$(git rev-parse --show-superproject-working-tree 2>/dev/null)
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
| 条件 | 判断 |
|
|
20
|
+
|------|------|
|
|
21
|
+
| `SUPER` 有值 | submodule,按普通仓库 |
|
|
22
|
+
| `GIT_DIR != GIT_COMMON` 且非 submodule | 已在 worktree |
|
|
23
|
+
| `GIT_DIR == GIT_COMMON` | 主工作区,继续创建 |
|
|
24
|
+
|
|
25
|
+
已在 worktree → 报告路径与分支,跳到设置步骤,不重复创建。
|
|
26
|
+
|
|
27
|
+
## 命名
|
|
28
|
+
|
|
29
|
+
| 要素 | 值 |
|
|
30
|
+
|------|-----|
|
|
31
|
+
| base 分支 | `git rev-parse --abbrev-ref HEAD` |
|
|
32
|
+
| change 分支 | `speculo/<workflow>/<change>` |
|
|
33
|
+
| worktree 路径 | `{state-root}/<workflow>/changes/<change>/.worktree/` |
|
|
34
|
+
|
|
35
|
+
分支或路径已存在 → 停止报告,不覆盖、不复用。
|
|
36
|
+
|
|
37
|
+
## 创建
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
mkdir -p {state-root}/<workflow>/changes/<change>
|
|
41
|
+
git worktree add -b speculo/<workflow>/<change> {state-root}/<workflow>/changes/<change>/.worktree
|
|
42
|
+
cd {state-root}/<workflow>/changes/<change>/.worktree
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
> 若平台有原生 worktree 工具(如 `EnterWorktree`)且用户要求使用:用原生工具,但目标路径对齐 change 目录下 `.worktree/` 约定。无法指定路径时注明实际路径,收尾时按真实路径清理。
|
|
46
|
+
|
|
47
|
+
## 项目设置与基线
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
[ -f package.json ] && (npm install 2>/dev/null || true)
|
|
51
|
+
[ -f Cargo.toml ] && cargo build
|
|
52
|
+
[ -f requirements.txt ] && pip install -r requirements.txt
|
|
53
|
+
[ -f go.mod ] && go mod download
|
|
54
|
+
# 跑项目基线测试
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
基线失败 → 报告询问,未获许可不开始实现。
|
|
58
|
+
|
|
59
|
+
## 返回
|
|
60
|
+
|
|
61
|
+
- `base_branch`、`change_branch`、`worktree_path`(绝对路径)
|
|
62
|
+
- `worktree_status: active`
|
|
63
|
+
- 由调用方写入 change `.status.json`
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
# 收尾合并与清理
|
|
2
|
+
|
|
3
|
+
实现完成后合并回 base、清理 worktree 与分支。由 SKILL.md 阶段 B 调用。**破坏性操作须先确认。**
|
|
4
|
+
|
|
5
|
+
## 前置
|
|
6
|
+
|
|
7
|
+
- 测试通过(未通过不得合并)
|
|
8
|
+
- 产物已在 `change_branch` 上提交
|
|
9
|
+
- 已有 `base_branch`、`change_branch`、`worktree_path`
|
|
10
|
+
|
|
11
|
+
## 检测环境
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
GIT_DIR=$(cd "$(git rev-parse --git-dir)" 2>/dev/null && pwd -P)
|
|
15
|
+
GIT_COMMON=$(cd "$(git rev-parse --git-common-dir)" 2>/dev/null && pwd -P)
|
|
16
|
+
WORKTREE_PATH=$(git rev-parse --show-toplevel)
|
|
17
|
+
FEATURE_BRANCH=$(git branch --show-current)
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
确定 base 分支:
|
|
21
|
+
```bash
|
|
22
|
+
BASE=$(git merge-base HEAD main 2>/dev/null || git merge-base HEAD master 2>/dev/null || echo "")
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## 展示选项
|
|
26
|
+
|
|
27
|
+
展示前先验测试。**命名分支:**
|
|
28
|
+
|
|
29
|
+
```
|
|
30
|
+
实现已完成。你想怎么做?
|
|
31
|
+
|
|
32
|
+
1. 本地合并回 <base-branch>(推荐,默认)
|
|
33
|
+
2. 推送并创建 Pull Request
|
|
34
|
+
3. 保持现状(稍后处理)
|
|
35
|
+
4. 丢弃
|
|
36
|
+
|
|
37
|
+
选哪个?
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
**分离 HEAD:** 移除选项 1,仅提供 2/3/4。用户未指定时默认推荐选项 1。
|
|
41
|
+
|
|
42
|
+
## 选项 1:本地合并
|
|
43
|
+
|
|
44
|
+
顺序固定——**先合并验证 → 再删 worktree → 最后删分支**:
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
MAIN_ROOT=$(git rev-parse --show-toplevel)
|
|
48
|
+
cd "$MAIN_ROOT"
|
|
49
|
+
|
|
50
|
+
git checkout <base-branch>
|
|
51
|
+
git pull # 仅远程存在且用户未禁止时
|
|
52
|
+
git merge --no-ff <change_branch>
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
合并后跑测试。**失败 → 停止,保留现场,报告原因。**
|
|
56
|
+
|
|
57
|
+
测试通过后:
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
# 必须在主仓库根执行,不能在 worktree 内部
|
|
61
|
+
git worktree remove {worktree_path}
|
|
62
|
+
git worktree prune
|
|
63
|
+
git branch -d <change_branch>
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
更新 `.status.json`:`worktree_status: removed`。
|
|
67
|
+
|
|
68
|
+
报告:已合并到 `<base-branch>`,worktree 与分支已清理。
|
|
69
|
+
|
|
70
|
+
## 选项 2:PR
|
|
71
|
+
|
|
72
|
+
推送分支,创建 PR,保留 worktree。若需指定远程或目标分支,先确认。
|
|
73
|
+
|
|
74
|
+
## 选项 3:保持
|
|
75
|
+
|
|
76
|
+
不动 worktree 和分支。报告当前状态,以便后续继续。
|
|
77
|
+
|
|
78
|
+
## 选项 4:丢弃
|
|
79
|
+
|
|
80
|
+
确认后删除 worktree 和分支(不合并):
|
|
81
|
+
|
|
82
|
+
```bash
|
|
83
|
+
cd "$MAIN_ROOT"
|
|
84
|
+
git worktree remove {worktree_path}
|
|
85
|
+
git worktree prune
|
|
86
|
+
git branch -D <change_branch>
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
## 失败处理
|
|
90
|
+
|
|
91
|
+
| 情况 | 处理 |
|
|
92
|
+
|------|------|
|
|
93
|
+
| 合并冲突 | 停止,报告冲突文件,保留 worktree/分支,不强推 |
|
|
94
|
+
| worktree remove 失败 | 停止报告,不 `--force`(用户明确要求除外) |
|
|
95
|
+
| 已合并不回滚 | 除非用户明确要求 |
|
|
96
|
+
|
|
97
|
+
## 清理规则
|
|
98
|
+
|
|
99
|
+
- **只清理约定路径下的 worktree**(change 目录下 `.worktree/`)
|
|
100
|
+
- 路径不匹配 → 不删(可能由 harness 管理)
|
|
101
|
+
- 永远在主仓库根执行 `git worktree remove`
|
|
102
|
+
- 顺序不可颠倒:merge → remove worktree → delete branch
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: research
|
|
3
|
+
description: "针对高可信度一手来源调查问题,并将发现结果以 Markdown 文件持久化到变更目录的 research/ 子目录中。适用于需要研究某个主题、收集文档或 API 信息、或委托阅读工作给后台 Agent 的场景。"
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
启动一个**后台 Agent** 来进行研究,这样你可以在它阅读时继续工作。
|
|
7
|
+
|
|
8
|
+
其工作内容:
|
|
9
|
+
|
|
10
|
+
1. 针对**一手来源**调查问题 —— 官方文档、源代码、规范、第一方 API —— 而不是基于这些来源的二次编写材料。将每个声明追溯到拥有该声明的来源。
|
|
11
|
+
2. 将发现结果写入单个 Markdown 文件,为每个声明标注来源。
|
|
12
|
+
3. 将文件持久化到当前变更目录的 `research/` 子目录中,并维护同目录下的 `index.md` 索引。
|
|
13
|
+
|
|
14
|
+
## 持久化约定
|
|
15
|
+
|
|
16
|
+
### 产物位置
|
|
17
|
+
|
|
18
|
+
研究产物写入当前 change 目录下的 `research/` 子目录:
|
|
19
|
+
|
|
20
|
+
```
|
|
21
|
+
<Path>{roots.state}/<workflow>/changes/{change}/research/<research_topic_name>.md</Path>
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
- `<research_topic_name>` 为 kebab-case,如 `react-19-upgrade-guide.md`、`prisma-v6-migration.md`
|
|
25
|
+
- `<workflow>` 为当前 workflow 目录名(如 `specdev`)
|
|
26
|
+
- `<change>` 为当前活跃变更目录名(格式 `<YYYY-MM-DD>-<topic>`,从 `<Path>{roots.state}/<workflow>/status.json</Path>` 的 `active` 数组中获取)
|
|
27
|
+
|
|
28
|
+
### 维护 research/index.md
|
|
29
|
+
|
|
30
|
+
在 `research/` 目录下维护一个索引文件 `<Path>{roots.state}/<workflow>/changes/{change}/research/index.md</Path>`,仅包含一张表格:
|
|
31
|
+
|
|
32
|
+
| 文件 | 概述 |
|
|
33
|
+
|------|------|
|
|
34
|
+
| `react-19-upgrade-guide.md` | React 19 升级要点、breaking changes、迁移路径 |
|
|
35
|
+
| `prisma-v6-changes.md` | Prisma v6 新增 API、废弃项、性能改进 |
|
|
36
|
+
|
|
37
|
+
- 表格两列:文件(`research/` 下的相对路径)、概述(一句话概括研究主题和关键发现)
|
|
38
|
+
- 每次新增 research 文件后,向表格追加一行
|
|
39
|
+
- 每次修改 research 文件后,检查对应概述是否仍准确,必要时更新
|
|
40
|
+
- `index.md` 除表格外无需其它内容
|
|
41
|
+
|
|
42
|
+
### 去重与增量更新
|
|
43
|
+
|
|
44
|
+
在开始新研究之前:
|
|
45
|
+
|
|
46
|
+
1. 先读取 `<Path>{roots.state}/<workflow>/changes/{change}/research/index.md</Path>`,检查是否已有同名或高度相关的 research topic
|
|
47
|
+
2. 如已存在对应 `.md` 文件,先读取其完整内容
|
|
48
|
+
3. 如现有内容已满足当前需求,直接引用,无需重新研究
|
|
49
|
+
4. 如现有内容不满足需求(信息过时、覆盖不全、结论有误),在原文件基础上进行增删改:
|
|
50
|
+
- **增**:补充新的发现、新增来源、追加未覆盖的子主题
|
|
51
|
+
- **删**:删除已被证伪的结论、过时的信息
|
|
52
|
+
- **改**:修正错误结论、更新版本号/API 签名
|
|
53
|
+
- 修改后同步更新 `index.md` 中对应行的概述
|
|
54
|
+
5. 如需研究的是全新 topic,创建新文件并追加到 `index.md` 表格
|