@namewta/speculo 0.3.0 → 0.3.2
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 +1 -2
- package/dist/src/cli.js +40 -6
- package/dist/src/cli.js.map +1 -1
- package/dist/src/index.js +5 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/skills-mirror.d.ts +38 -0
- package/dist/src/skills-mirror.js +160 -0
- package/dist/src/skills-mirror.js.map +1 -0
- package/package.json +3 -2
- package/template/canonical/README.md +7 -1
- package/template/canonical/canonical-specdev-engineering-cognitive-mentor.md +2040 -0
- package/template/canonical/canonical-specdev-goal-plan.md +1379 -0
- package/template/canonical/canonical-specdev-grill-with-docs.md +848 -285
- package/template/canonical/canonical-specdev-spec.md +1061 -46
- package/template/canonical/canonical-specdev-tickets.md +1529 -175
- package/template/canonical/canonical-specdev-wayfinder.md +677 -107
- package/template/commands/git-repository-audit.md +682 -0
- package/template/workflows/specdev/A-archive-and-consolidate/A-archive-and-consolidate.md +69 -36
- package/template/workflows/specdev/A-archive-and-consolidate/archive-checklist.md +15 -0
- package/template/workflows/specdev/A-archive-and-consolidate/knowledge-promotion-rules.md +32 -0
- package/template/workflows/specdev/D-diagnose-bugs/D-diagnose-bugs.md +51 -51
- package/template/workflows/specdev/D-diagnose-bugs/diagnosis-template.md +64 -0
- package/template/workflows/specdev/E-engineering-cognitive-mentor/E-engineering-cognitive-mentor.md +252 -0
- package/template/workflows/specdev/E-engineering-cognitive-mentor/architecture-guidance.md +90 -0
- package/template/workflows/specdev/E-engineering-cognitive-mentor/bug-guidance.md +80 -0
- package/template/workflows/specdev/E-engineering-cognitive-mentor/codebase-guidance.md +107 -0
- package/template/workflows/specdev/E-engineering-cognitive-mentor/comprehension-and-closure.md +95 -0
- package/template/workflows/specdev/E-engineering-cognitive-mentor/domain-learning-guidance.md +62 -0
- package/template/workflows/specdev/E-engineering-cognitive-mentor/evidence-and-options.md +132 -0
- package/template/workflows/specdev/E-engineering-cognitive-mentor/interaction-protocol.md +116 -0
- package/template/workflows/specdev/E-engineering-cognitive-mentor/mentor-report-template.md +135 -0
- package/template/workflows/specdev/E-engineering-cognitive-mentor/mode-routing.md +47 -0
- package/template/workflows/specdev/E-engineering-cognitive-mentor/persistence-and-resume.md +147 -0
- package/template/workflows/specdev/E-engineering-cognitive-mentor/requirements-guidance.md +92 -0
- package/template/workflows/specdev/G-grill-with-docs/G-grill-with-docs.md +100 -30
- package/template/workflows/specdev/G-grill-with-docs/adr-format.md +22 -77
- package/template/workflows/specdev/G-grill-with-docs/context-format.md +27 -53
- package/template/workflows/specdev/G-grill-with-docs/domain-modeling-rules.md +6 -82
- package/template/workflows/specdev/G-grill-with-docs/grilling-protocol.md +32 -49
- package/template/workflows/specdev/G-grill-with-docs/log-format.md +16 -98
- package/template/workflows/specdev/I-implement/I-implement.md +168 -52
- package/template/workflows/specdev/I-implement/code-review-process.md +10 -76
- package/template/workflows/specdev/I-implement/codebase-design-glossary.md +12 -109
- package/template/workflows/specdev/I-implement/deepening.md +12 -32
- package/template/workflows/specdev/I-implement/design-it-twice.md +6 -41
- package/template/workflows/specdev/I-implement/evidence-template.md +69 -0
- package/template/workflows/specdev/I-implement/execution-preflight.md +20 -0
- package/template/workflows/specdev/I-implement/tdd-examples.md +10 -135
- package/template/workflows/specdev/I-implement/tdd-rules.md +12 -28
- package/template/workflows/specdev/I-init-setup/I-init-setup.md +81 -86
- package/template/workflows/specdev/I-init-setup/change-status-template.json +15 -0
- package/template/workflows/specdev/I-init-setup/config-template.json +26 -0
- package/template/workflows/specdev/I-init-setup/domain-layout-template.md +23 -0
- package/template/workflows/specdev/I-init-setup/status-labels-template.md +55 -0
- package/template/workflows/specdev/I-init-setup/status-template.json +7 -0
- package/template/workflows/specdev/I-init-setup/tracking-template.md +10 -0
- package/template/workflows/specdev/INDEX.md +165 -82
- package/template/workflows/specdev/P-goal-plan/P-goal-plan.md +108 -44
- package/template/workflows/specdev/P-goal-plan/completion-control.md +79 -0
- package/template/workflows/specdev/P-goal-plan/goal-plan-template.md +105 -0
- package/template/workflows/specdev/P-goal-plan/orchestration-protocol.md +115 -0
- package/template/workflows/specdev/P-goal-plan/planning-modes.md +70 -0
- package/template/workflows/specdev/R-review-architecture/R-review-architecture.md +103 -40
- package/template/workflows/specdev/R-review-architecture/architecture-review-report-template.html +58 -0
- package/template/workflows/specdev/R-review-architecture/architecture-review-template.md +68 -0
- package/template/workflows/specdev/R-review-architecture/proposal-to-ticket.md +11 -0
- package/template/workflows/specdev/S-spec/S-spec.md +103 -49
- package/template/workflows/specdev/S-spec/spec-readiness.md +16 -0
- package/template/workflows/specdev/S-spec/spec-template.md +95 -0
- package/template/workflows/specdev/T-tickets/T-tickets.md +146 -133
- package/template/workflows/specdev/T-tickets/decomposition-rules.md +56 -0
- package/template/workflows/specdev/T-tickets/ticket-readiness.md +45 -0
- package/template/workflows/specdev/T-tickets/ticket-template.md +124 -0
- package/template/workflows/specdev/T-tickets/tickets-map-template.md +52 -50
- package/template/workflows/specdev/T-triage/T-triage.md +32 -63
- package/template/workflows/specdev/T-triage/triage-template.md +29 -0
- package/template/workflows/specdev/W-wayfinder/W-wayfinder.md +88 -155
- package/template/workflows/specdev/W-wayfinder/investigation-ticket-template.md +50 -0
- package/template/workflows/specdev/W-wayfinder/wayfinder-map-template.md +46 -0
- package/template/workflows/specdev/_state/status.json +1 -1
- package/template/workflows/specdev/common/README.md +47 -0
- package/template/workflows/specdev/common/rules/artifact-contract.md +57 -0
- package/template/workflows/specdev/common/rules/code-commenting-rule.md +39 -0
- package/template/workflows/specdev/common/rules/deviation-control.md +43 -0
- package/template/workflows/specdev/common/rules/evidence-and-verification.md +57 -0
- package/template/workflows/specdev/common/rules/path-ownership.md +35 -0
- package/template/workflows/specdev/common/rules/path-reference-contract.md +116 -0
- package/template/workflows/specdev/common/rules/planning-principles.md +57 -0
- package/template/workflows/specdev/common/rules/readiness-and-depth.md +51 -0
- package/template/workflows/specdev/common/schemas/change-status.schema.json +170 -0
- package/template/workflows/specdev/common/schemas/config.schema.json +54 -0
- package/template/workflows/specdev/common/schemas/goal-plan.schema.json +21 -0
- package/template/workflows/specdev/common/schemas/spec.schema.json +16 -0
- package/template/workflows/specdev/common/schemas/status.schema.json +149 -0
- package/template/workflows/specdev/common/schemas/ticket.schema.json +130 -0
- package/template/workflows/specdev/common/schemas/tickets-map.schema.json +14 -0
- package/template/workflows/specdev/common/skills/dev-worktree/SKILL.md +28 -0
- package/template/workflows/specdev/common/skills/dev-worktree/references/create.md +30 -0
- package/template/workflows/specdev/common/skills/dev-worktree/references/finalize.md +16 -0
- package/template/workflows/specdev/common/skills/research/SKILL.md +43 -0
- package/template/workflows/specdev/common/tools/README.md +16 -0
- package/template/workflows/specdev/common/tools/validate-specdev.mjs +1155 -0
- package/template/canonical/canonical-teach.md +0 -301
- package/template/workflows/specdev/A-archive-and-consolidate/archive-rules.md +0 -49
- package/template/workflows/specdev/A-archive-and-consolidate/cleanup-rules.md +0 -80
- package/template/workflows/specdev/A-archive-and-consolidate/consolidation-rules.md +0 -122
- package/template/workflows/specdev/A-archive-and-consolidate/discrimination-guide.md +0 -96
- package/template/workflows/specdev/A-archive-and-consolidate/knowledge-graduation.md +0 -51
- package/template/workflows/specdev/D-diagnose-bugs/cleanup-postmortem.md +0 -37
- package/template/workflows/specdev/D-diagnose-bugs/feedback-loop-techniques.md +0 -84
- package/template/workflows/specdev/D-diagnose-bugs/hypothesis-format.md +0 -46
- package/template/workflows/specdev/D-diagnose-bugs/instrumentation-rules.md +0 -51
- package/template/workflows/specdev/I-init-setup/domain-layout.md +0 -55
- package/template/workflows/specdev/I-init-setup/status-labels.md +0 -53
- package/template/workflows/specdev/I-init-setup/tracking-convention.md +0 -52
- package/template/workflows/specdev/P-goal-plan/execution-sections.md +0 -126
- package/template/workflows/specdev/P-goal-plan/governance-sections.md +0 -103
- package/template/workflows/specdev/P-goal-plan/input-validation.md +0 -94
- package/template/workflows/specdev/P-goal-plan/lead-orchestration-protocol.md +0 -158
- package/template/workflows/specdev/P-goal-plan/quick-reference-table.md +0 -60
- package/template/workflows/specdev/P-goal-plan/vision-sections.md +0 -80
- package/template/workflows/specdev/R-review-architecture/exploration-guide.md +0 -103
- package/template/workflows/specdev/R-review-architecture/html-report-template.md +0 -124
- package/template/workflows/specdev/T-triage/artifact-templates.md +0 -122
- package/template/workflows/specdev/T-triage/intake-rules.md +0 -71
- package/template/workflows/specdev/T-triage/routing-rules.md +0 -70
- package/template/workflows/specdev/T-triage/understanding-rules.md +0 -102
- package/template/workflows/specdev/_state/adr/.gitkeep +0 -0
- package/template/workflows/specdev/_state/context/.gitkeep +0 -0
- package/template/workflows/specdev/_state/research/.gitkeep +0 -0
- package/template/workflows/specdev/common/dev-worktree/SKILL.md +0 -48
- package/template/workflows/specdev/common/dev-worktree/references/create.md +0 -63
- package/template/workflows/specdev/common/dev-worktree/references/finalize.md +0 -102
- package/template/workflows/specdev/common/handoff/SKILL.md +0 -42
- package/template/workflows/specdev/common/neat-freak/SKILL.md +0 -210
- package/template/workflows/specdev/common/neat-freak/references/agent-paths.md +0 -72
- package/template/workflows/specdev/common/neat-freak/references/governance.md +0 -88
- package/template/workflows/specdev/common/neat-freak/references/sync-matrix.md +0 -77
- package/template/workflows/specdev/common/neat-freak/references/verification.md +0 -92
- package/template/workflows/specdev/common/neat-freak/scripts/audit-inventory.sh +0 -106
- package/template/workflows/specdev/common/prototype/LOGIC.md +0 -89
- package/template/workflows/specdev/common/prototype/SKILL.md +0 -78
- package/template/workflows/specdev/common/prototype/UI.md +0 -120
- package/template/workflows/specdev/common/research/SKILL.md +0 -54
- package/template/workflows/specdev/common/resolving-merge-conflicts/SKILL.md +0 -14
- package/template/workflows/specdev/common/scripts/hitl-loop.template.sh +0 -41
- package/template/workflows/specdev/common/triage/AGENT-BRIEF.md +0 -204
- package/template/workflows/specdev/common/triage/OUT-OF-SCOPE.md +0 -104
- package/template/workflows/specdev/common/triage/SKILL.md +0 -112
|
@@ -1,37 +1,17 @@
|
|
|
1
|
-
#
|
|
1
|
+
# 深化与依赖策略
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
## 依赖分类
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
1. 进程内稳定依赖:直接调用通常足够。
|
|
6
|
+
2. 本地可替换依赖:在真实替换/测试需要处建立接缝。
|
|
7
|
+
3. 远程但自有:封装协议、超时、重试、幂等和可观测性。
|
|
8
|
+
4. 真正外部:适配器隔离版本、失败、限流和不可控变化。
|
|
6
9
|
|
|
7
|
-
|
|
10
|
+
不要为了“可测试”给每个类加接口。接缝应服务真实变化轴或高价值验证。
|
|
8
11
|
|
|
9
|
-
|
|
12
|
+
## 深化问题
|
|
10
13
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
具有本地测试替代品的依赖(PGLite 替代 Postgres、内存文件系统)。如果存在替代品则可深化。深化后的模块在测试套件中使用运行的替代品进行测试。接缝是内部的;在模块的外部接口处不需要端口。
|
|
16
|
-
|
|
17
|
-
### 3. 远程但自有(端口与适配器)
|
|
18
|
-
|
|
19
|
-
跨网络边界的自有服务(微服务、内部 API)。在接缝处定义一个 **port**(端口,即接口)。深模块拥有逻辑;传输层作为 **adapter**(适配器)注入。测试使用内存适配器。生产环境使用 HTTP/gRPC/队列适配器。
|
|
20
|
-
|
|
21
|
-
建议形式:*"在接缝处定义一个端口,为生产环境实现 HTTP 适配器,为测试实现内存适配器,这样逻辑就驻留在一个深模块中,即使它跨网络部署。"*
|
|
22
|
-
|
|
23
|
-
### 4. 真正的外部依赖(Mock)
|
|
24
|
-
|
|
25
|
-
你无法控制的第三方服务(Stripe、Twilio 等)。深化后的模块将外部依赖作为注入端口;测试提供一个 mock 适配器。
|
|
26
|
-
|
|
27
|
-
## 接缝纪律
|
|
28
|
-
|
|
29
|
-
- **一个适配器意味着假设性接缝。两个适配器意味着真正的接缝。** 除非至少有两个适配器是合理的(通常是生产 + 测试),否则不要引入端口。单一适配器的接缝只是间接层。
|
|
30
|
-
- **内部接缝 vs 外部接缝。** 一个深模块可以既有内部接缝(对其实现私有,供其自身的测试使用),也有其接口处的外部接缝。不要仅仅因为测试使用了内部接缝就通过接口暴露它们。
|
|
31
|
-
|
|
32
|
-
## 测试策略:替换,而非叠加
|
|
33
|
-
|
|
34
|
-
- 一旦深化后模块接口的测试存在,旧有浅模块上的单元测试就变成了废料 — 删除它们。
|
|
35
|
-
- 在深化后模块的接口处编写新测试。**接口就是测试表面**。
|
|
36
|
-
- 测试通过接口断言可观察的结果,而非内部状态。
|
|
37
|
-
- 测试应经受住内部重构 — 它们描述的是行为,而非实现。如果测试在实现改变时必须更改,那它就是在测试接口之后的东西。
|
|
14
|
+
- 能否让调用者少知道一个状态、顺序或错误分支?
|
|
15
|
+
- 能否把重复策略收进单一模块?
|
|
16
|
+
- 是否把外部 SDK 类型泄漏到领域层?
|
|
17
|
+
- 是否有至少两个真实消费者/适配器证明抽象成立?
|
|
@@ -1,44 +1,9 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Design It Twice
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
只在 Ticket 允许局部设计自由、且两个方案会显著影响模块深度或测试接缝时使用。
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
1. 在不改代码的情况下提出两个最小接口草图。
|
|
6
|
+
2. 比较调用者复杂度、信息隐藏、错误语义、迁移成本和测试策略。
|
|
7
|
+
3. 选择更深、更局部、与 Ticket 契约一致的方案,并记录为局部实现决定。
|
|
6
8
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
### 1. 界定问题空间
|
|
10
|
-
|
|
11
|
-
在启动子 Agent 之前,为选定候选编写一份面向用户的问题空间说明:
|
|
12
|
-
|
|
13
|
-
- 任何新接口需要满足的约束条件
|
|
14
|
-
- 它将依赖的依赖项,以及它们属于哪个类别(参见 `<Path>{roots.workflows}/specdev/I-implement/deepening.md</Path>`)
|
|
15
|
-
- 一个粗略的示例代码草图来使约束具体化 — 不是提案,只是让约束变得具体的一种方式
|
|
16
|
-
|
|
17
|
-
将此展示给用户,然后立即进入第 2 步。用户在子 Agent 并行工作时阅读和思考。
|
|
18
|
-
|
|
19
|
-
### 2. 启动子 Agent
|
|
20
|
-
|
|
21
|
-
使用 Agent 工具并行启动 3+ 个子 Agent。每个子 Agent 必须为深化后的模块生成一个**截然不同的**接口。
|
|
22
|
-
|
|
23
|
-
为每个子 Agent 提供一份独立的技术简报(文件路径、耦合细节、来自 `<Path>{roots.workflows}/specdev/I-implement/deepening.md</Path>` 的依赖类别、接缝背后的内容)。简报独立于第 1 步中面向用户的问题空间说明。给每个 Agent 一个不同的设计约束:
|
|
24
|
-
|
|
25
|
-
- Agent 1:"最小化接口 — 目标 1–3 个入口点。最大化每个入口点的杠杆。"
|
|
26
|
-
- Agent 2:"最大化灵活性 — 支持多种用例和扩展。"
|
|
27
|
-
- Agent 3:"为最常见的调用方优化 — 让默认情况变得简单。"
|
|
28
|
-
- Agent 4(如适用):"围绕接缝设计端口与适配器,以处理跨接缝依赖。"
|
|
29
|
-
|
|
30
|
-
在简报中同时包含 `<Path>{roots.workflows}/specdev/I-implement/codebase-design-glossary.md</Path>` 词汇和 CONTEXT.md 词汇,以便每个子 Agent 能使用架构语言和项目的领域语言一致地命名事物。
|
|
31
|
-
|
|
32
|
-
每个子 Agent 输出:
|
|
33
|
-
|
|
34
|
-
1. 接口(类型、方法、参数 — 以及不变量、排序、错误模式)
|
|
35
|
-
2. 使用示例,展示调用方如何使用它
|
|
36
|
-
3. 实现在接缝背后隐藏了什么
|
|
37
|
-
4. 依赖策略和适配器(参见 `<Path>{roots.workflows}/specdev/I-implement/deepening.md</Path>`)
|
|
38
|
-
5. 权衡 — 哪里杠杆高,哪里杠杆薄
|
|
39
|
-
|
|
40
|
-
### 3. 展示和比较
|
|
41
|
-
|
|
42
|
-
按顺序展示各个设计,让用户能够消化每一个,然后用文字进行比较。通过 **depth**(深度,接口处的杠杆)、**locality**(局部性,变更集中的位置)和 **seam placement**(接缝位置)来对比。
|
|
43
|
-
|
|
44
|
-
比较之后,给出你自己的建议:你认为哪个设计最强以及原因。如果不同设计中的元素可以很好地组合,提出一个混合方案。要有主见 — 用户想要的是一个有力的判断,而不是一个菜单。
|
|
9
|
+
若选择会改变公共接口、数据、兼容、范围或验收,停止并升级到 Ticket/ADR,而不是自行选择。
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
# Evidence: <Ticket ID> — <Ticket title>
|
|
2
|
+
|
|
3
|
+
- **Change:** `<change>`
|
|
4
|
+
- **Ticket:** `<Path>{roots.state}/specdev/changes/{change}/ticket/{ticket-file}.md</Path>`
|
|
5
|
+
- **Spec:** `<Path>{roots.state}/specdev/changes/{change}/spec.md</Path>`
|
|
6
|
+
- **Tickets Map:** `<Path>{roots.state}/specdev/changes/{change}/tickets-map.md</Path>`
|
|
7
|
+
- **Goal Plan:** `<Path>{roots.state}/specdev/changes/{change}/goal-plan.md</Path>` / 不适用
|
|
8
|
+
- **基线/分支:**
|
|
9
|
+
- **Worktree 引用:** 不适用 / `<workspace_ref>`
|
|
10
|
+
- **实现者:**
|
|
11
|
+
- **开始/结束:**
|
|
12
|
+
- **状态:** review / done / blocked / deviated
|
|
13
|
+
|
|
14
|
+
## 1. 实现摘要
|
|
15
|
+
|
|
16
|
+
用用户可观察行为和已锁定契约说明实际完成了什么,不复述提交日志。
|
|
17
|
+
|
|
18
|
+
## 2. 修改范围
|
|
19
|
+
|
|
20
|
+
| 路径 | 所有权 | 改动目的 |
|
|
21
|
+
|---|---|---|
|
|
22
|
+
| `<Path>src/example.ts</Path>` | writable / shared:<owner> | ... |
|
|
23
|
+
|
|
24
|
+
## 3. 验收与合同映射
|
|
25
|
+
|
|
26
|
+
| Contract / Acceptance ID | 验证接缝 | 证据 | 结果 |
|
|
27
|
+
|---|---|---|---|
|
|
28
|
+
| AC-... | ... | 测试、截图、日志或人工检查摘要 | pass / fail / not-run |
|
|
29
|
+
|
|
30
|
+
每个 Ticket 验收项必须恰好落到一行;不能用“一般测试已通过”替代逐项证据。
|
|
31
|
+
|
|
32
|
+
## 4. 验证执行
|
|
33
|
+
|
|
34
|
+
| 命令或步骤 | 运行环境 | 结果 | 摘要或附件 |
|
|
35
|
+
|---|---|---|---|
|
|
36
|
+
| ... | ... | pass / fail / not-run | ... |
|
|
37
|
+
|
|
38
|
+
- **失败后修复与重跑:** 无 / ...
|
|
39
|
+
- **未运行检查:** 无 / 原因与风险 ...
|
|
40
|
+
- **Lead E2E:** 不适用 / 待执行:场景与预期 / 通过 / 失败
|
|
41
|
+
|
|
42
|
+
## 5. 路径所有权审计
|
|
43
|
+
|
|
44
|
+
- **writable 内修改:**
|
|
45
|
+
- **shared 修改与 owner 批准:** 无 / ...
|
|
46
|
+
- **read-only 修改:** 无
|
|
47
|
+
- **未声明路径:** 无
|
|
48
|
+
- **生成文件或锁文件:** 无 / 来源与 owner ...
|
|
49
|
+
|
|
50
|
+
## 6. 偏差与决策
|
|
51
|
+
|
|
52
|
+
- **偏差:** 无 / `<deviation-id>`
|
|
53
|
+
- **偏差记录:** `<Path>{roots.state}/specdev/changes/{change}/LOG.md</Path>` / 不适用
|
|
54
|
+
- **批准人或决策来源:**
|
|
55
|
+
- **对范围、契约、依赖或后续 Ticket 的影响:** 无 / ...
|
|
56
|
+
|
|
57
|
+
偏差处理遵守 `<Path>{roots.workflows}/specdev/common/rules/deviation-control.md</Path>`,不得静默修改 Ticket 目标或验收。
|
|
58
|
+
|
|
59
|
+
## 7. 残余风险与后续
|
|
60
|
+
|
|
61
|
+
- **残余风险:** 无 / ...
|
|
62
|
+
- **已知限制:** 无 / ...
|
|
63
|
+
- **后续 Ticket:** 无 / `<ticket-id>`
|
|
64
|
+
- **监控或回滚触发条件:** 不适用 / ...
|
|
65
|
+
|
|
66
|
+
## 8. 交付定位
|
|
67
|
+
|
|
68
|
+
- **Commit / PR:**
|
|
69
|
+
- **Evidence 文件:** `<Path>{roots.state}/specdev/changes/{change}/evidence/{ticket-id}.md</Path>`
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# Execution Preflight
|
|
2
|
+
|
|
3
|
+
## 硬检查
|
|
4
|
+
|
|
5
|
+
- [ ] Ticket frontmatter 可解析,`ready: true`,`status: ready`。
|
|
6
|
+
- [ ] 所有 blocked_by Ticket 为 done 且证据存在。
|
|
7
|
+
- [ ] Spec、ADR、Ticket 和 Goal Plan 无冲突。
|
|
8
|
+
- [ ] 当前代码入口、接口和路径仍与 Ticket 假设一致。
|
|
9
|
+
- [ ] writable_paths 无并发 owner 冲突。
|
|
10
|
+
- [ ] 并行执行时,`<Path>{roots.state}/specdev/changes/{change}/.status.json</Path>` 的 `worktrees` 中本 Ticket 为 `active`,`base_sha`、分支和 `workspace_ref` 与派单一致。
|
|
11
|
+
- [ ] 验证命令/环境可用。
|
|
12
|
+
- [ ] Deep Ticket 的批准点已满足。
|
|
13
|
+
|
|
14
|
+
## 失效分类
|
|
15
|
+
|
|
16
|
+
- **stale-navigation**:仅 expected_changes/行号过时,契约仍有效;更新导航后继续。
|
|
17
|
+
- **local-implementation**:局部实现方式需调整,不改变契约;记录后继续。
|
|
18
|
+
- **ticket-invalid**:范围、接口、依赖、验证或路径契约失效;停止并修 Ticket。
|
|
19
|
+
- **spec-invalid**:外部行为/合同需改变;停止并修 Spec。
|
|
20
|
+
- **adr-conflict**:架构决策冲突;停止并处理 ADR。
|
|
@@ -1,139 +1,14 @@
|
|
|
1
|
-
#
|
|
1
|
+
# TDD 示例原则
|
|
2
2
|
|
|
3
|
-
##
|
|
3
|
+
## 好
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
- 通过 HTTP/CLI/公共函数验证输入、输出、状态和错误。
|
|
6
|
+
- 固定时间、随机、网络等非确定性依赖于真实接缝。
|
|
7
|
+
- 回归测试先复现 diagnosis 的触发机制。
|
|
6
8
|
|
|
7
|
-
|
|
8
|
-
// 好:测试可观察的行为
|
|
9
|
-
test("user can checkout with valid cart", async () => {
|
|
10
|
-
const cart = createCart();
|
|
11
|
-
cart.add(product);
|
|
12
|
-
const result = await checkout(cart, paymentMethod);
|
|
13
|
-
expect(result.status).toBe("confirmed");
|
|
14
|
-
});
|
|
15
|
-
```
|
|
9
|
+
## 坏
|
|
16
10
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
-
|
|
20
|
-
-
|
|
21
|
-
- 经受住内部重构
|
|
22
|
-
- 描述 WHAT(做什么),而非 HOW(怎么做)
|
|
23
|
-
- 每个测试一个逻辑断言
|
|
24
|
-
|
|
25
|
-
## 坏的测试
|
|
26
|
-
|
|
27
|
-
**实现细节测试**:与内部结构耦合。
|
|
28
|
-
|
|
29
|
-
```typescript
|
|
30
|
-
// 坏:测试实现细节
|
|
31
|
-
test("checkout calls paymentService.process", async () => {
|
|
32
|
-
const mockPayment = jest.mock(paymentService);
|
|
33
|
-
await checkout(cart, payment);
|
|
34
|
-
expect(mockPayment.process).toHaveBeenCalledWith(cart.total);
|
|
35
|
-
});
|
|
36
|
-
```
|
|
37
|
-
|
|
38
|
-
危险信号:
|
|
39
|
-
|
|
40
|
-
- Mock 内部协作者
|
|
41
|
-
- 测试私有方法
|
|
42
|
-
- 断言调用次数/顺序
|
|
43
|
-
- 重构时测试失败但没有行为变化
|
|
44
|
-
- 测试名称描述 HOW 而非 WHAT
|
|
45
|
-
- 通过外部手段而非接口进行验证
|
|
46
|
-
|
|
47
|
-
```typescript
|
|
48
|
-
// 坏:绕过接口进行验证
|
|
49
|
-
test("createUser saves to database", async () => {
|
|
50
|
-
await createUser({ name: "Alice" });
|
|
51
|
-
const row = await db.query("SELECT * FROM users WHERE name = ?", ["Alice"]);
|
|
52
|
-
expect(row).toBeDefined();
|
|
53
|
-
});
|
|
54
|
-
|
|
55
|
-
// 好:通过接口进行验证
|
|
56
|
-
test("createUser makes user retrievable", async () => {
|
|
57
|
-
const user = await createUser({ name: "Alice" });
|
|
58
|
-
const retrieved = await getUser(user.id);
|
|
59
|
-
expect(retrieved.name).toBe("Alice");
|
|
60
|
-
});
|
|
61
|
-
```
|
|
62
|
-
|
|
63
|
-
**同义反复测试**:预期值重述了实现,因此测试在构造上就通过了。
|
|
64
|
-
|
|
65
|
-
```typescript
|
|
66
|
-
// 坏:预期值以与代码计算方式相同的方式重新计算
|
|
67
|
-
test("calculateTotal sums line items", () => {
|
|
68
|
-
const items = [{ price: 10 }, { price: 5 }];
|
|
69
|
-
const expected = items.reduce((sum, i) => sum + i.price, 0);
|
|
70
|
-
expect(calculateTotal(items)).toBe(expected);
|
|
71
|
-
});
|
|
72
|
-
|
|
73
|
-
// 好:预期值是独立的、已知的字面量
|
|
74
|
-
test("calculateTotal sums line items", () => {
|
|
75
|
-
expect(calculateTotal([{ price: 10 }, { price: 5 }])).toBe(15);
|
|
76
|
-
});
|
|
77
|
-
```
|
|
78
|
-
|
|
79
|
-
---
|
|
80
|
-
|
|
81
|
-
## 何时使用 Mock
|
|
82
|
-
|
|
83
|
-
仅在**系统边界**处使用 Mock:
|
|
84
|
-
|
|
85
|
-
- 外部 API(支付、邮件等)
|
|
86
|
-
- 数据库(有时 — 优先使用测试数据库)
|
|
87
|
-
- 时间/随机性
|
|
88
|
-
- 文件系统(有时)
|
|
89
|
-
|
|
90
|
-
不要 Mock:
|
|
91
|
-
|
|
92
|
-
- 你自己的类/模块
|
|
93
|
-
- 内部协作者
|
|
94
|
-
- 任何你控制的东西
|
|
95
|
-
|
|
96
|
-
## 为可 Mock 性设计
|
|
97
|
-
|
|
98
|
-
在系统边界处,设计易于 mock 的接口:
|
|
99
|
-
|
|
100
|
-
**1. 使用依赖注入**
|
|
101
|
-
|
|
102
|
-
将外部依赖从外部传入,而不是在内部创建:
|
|
103
|
-
|
|
104
|
-
```typescript
|
|
105
|
-
// 易于 mock
|
|
106
|
-
function processPayment(order, paymentClient) {
|
|
107
|
-
return paymentClient.charge(order.total);
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
// 难以 mock
|
|
111
|
-
function processPayment(order) {
|
|
112
|
-
const client = new StripeClient(process.env.STRIPE_KEY);
|
|
113
|
-
return client.charge(order.total);
|
|
114
|
-
}
|
|
115
|
-
```
|
|
116
|
-
|
|
117
|
-
**2. 偏好 SDK 风格接口而非通用获取器**
|
|
118
|
-
|
|
119
|
-
为每个外部操作创建特定的函数,而不是带有条件逻辑的通用函数:
|
|
120
|
-
|
|
121
|
-
```typescript
|
|
122
|
-
// 好:每个函数可以独立 mock
|
|
123
|
-
const api = {
|
|
124
|
-
getUser: (id) => fetch(`/users/${id}`),
|
|
125
|
-
getOrders: (userId) => fetch(`/users/${userId}/orders`),
|
|
126
|
-
createOrder: (data) => fetch('/orders', { method: 'POST', body: data }),
|
|
127
|
-
};
|
|
128
|
-
|
|
129
|
-
// 坏:mock 需要在 mock 内部编写条件逻辑
|
|
130
|
-
const api = {
|
|
131
|
-
fetch: (endpoint, options) => fetch(endpoint, options),
|
|
132
|
-
};
|
|
133
|
-
```
|
|
134
|
-
|
|
135
|
-
SDK 方式的优点:
|
|
136
|
-
- 每个 mock 返回一个特定的形态
|
|
137
|
-
- 测试设置中无需条件逻辑
|
|
138
|
-
- 更容易看出测试涉及哪些端点
|
|
139
|
-
- 每个端点的类型安全
|
|
11
|
+
- 断言私有辅助函数被调用。
|
|
12
|
+
- 将生产代码逐行翻译成测试。
|
|
13
|
+
- 全部依赖都 Mock,导致协议不兼容仍通过。
|
|
14
|
+
- 只测 happy path,不覆盖 Ticket 明确的失败行为。
|
|
@@ -1,31 +1,15 @@
|
|
|
1
|
-
#
|
|
1
|
+
# TDD 规则
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
1. 从 Ticket 验收或验证矩阵选择下一条最小行为。
|
|
4
|
+
2. 通过稳定接缝写失败测试,并确认失败原因正确。
|
|
5
|
+
3. 只写使该行为通过的最小生产代码。
|
|
6
|
+
4. 运行定向测试;通过后重构,保持绿色。
|
|
7
|
+
5. 周期性运行受影响回归,完成时运行完整要求。
|
|
4
8
|
|
|
5
|
-
|
|
9
|
+
## 禁止
|
|
6
10
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
## 接缝 —— 测试放置的位置
|
|
14
|
-
|
|
15
|
-
**接缝(seam)** 是你进行测试的公共边界:你在该接口处观察行为而不触及内部。测试位于接缝处,绝不针对内部细节。
|
|
16
|
-
|
|
17
|
-
**仅在预先约定的接缝处进行测试。** 在编写任何测试之前,写下要测试的接缝并与用户确认。没有在未确认的接缝处编写测试。你无法测试一切 —— 提前约定接缝可以确保测试工作集中在关键路径和复杂逻辑上,而不是每个边缘情况。
|
|
18
|
-
|
|
19
|
-
问:"公共接口是什么,我们应该在哪些接缝处进行测试?"
|
|
20
|
-
|
|
21
|
-
## 反模式
|
|
22
|
-
|
|
23
|
-
- **与实现耦合** —— mock 内部协作者、测试私有方法、或通过旁路通道验证(查询数据库而不是使用接口)。特征:当重构时代码行为未变但测试却失败了。
|
|
24
|
-
- **同义反复** —— 断言以与代码相同的方式重新计算预期值(`expect(add(a, b)).toBe(a + b)`、以相同方式手动推导的快照、将常量断言为等于自身),因此它在构造上就必然通过,永远不可能与代码产生分歧。预期值必须来自独立的真相来源 —— 已知正确的字面量、手工计算示例、规范。
|
|
25
|
-
- **水平切片** —— 先写所有测试,再写所有实现。批量测试验证的是*想象中*的行为:你测试的是事物的*形态*而非面向用户的行为,测试变得对真实变更不敏感,并且你在理解实现之前就锁定了测试结构。应采用**垂直切片** —— 一个测试 → 一个实现 → 重复,每个测试都是一颗**曳光弹**,响应上一个循环的反馈。
|
|
26
|
-
|
|
27
|
-
## 循环的规则
|
|
28
|
-
|
|
29
|
-
- **先红后绿。** 先写失败的测试,然后只写足以通过测试的代码。不要预测未来的测试或添加推测性功能。
|
|
30
|
-
- **一次一个切片。** 每个循环一个接缝、一个测试、一个最小实现。
|
|
31
|
-
- **重构不属于循环。** 它属于审查阶段(参见 `<Path>{roots.workflows}/specdev/I-implement/code-review-process.md</Path>`),而不是红 → 绿实现循环的一部分。
|
|
11
|
+
- 先写大段实现再补测试;
|
|
12
|
+
- Mock 被测对象内部实现;
|
|
13
|
+
- 断言私有调用次数而非外部效果(除非调用本身是合同);
|
|
14
|
+
- 为通过测试而吞错、降低断言、跳过用例;
|
|
15
|
+
- 把旧失败无证据地归因于环境。
|
|
@@ -3,130 +3,125 @@ id: specdev/init-setup
|
|
|
3
3
|
type: workflow-entry
|
|
4
4
|
workflow: specdev
|
|
5
5
|
name: 初始化设置
|
|
6
|
-
description:
|
|
7
|
-
keywords: [初始化, 配置,
|
|
6
|
+
description: 初始化 SpecDev 的语言、配置、全局状态、追踪约定、领域知识布局、验证命令和并发治理。
|
|
7
|
+
keywords: [初始化, 配置, status, tracking, 验证命令]
|
|
8
8
|
---
|
|
9
9
|
|
|
10
10
|
# 初始化设置
|
|
11
11
|
|
|
12
|
-
|
|
12
|
+
首次使用 SpecDev、状态根不存在或治理契约发生变化后运行。此 work 只初始化 SpecDev 的状态与配置,不修改项目业务代码。
|
|
13
13
|
|
|
14
|
-
|
|
14
|
+
## 规范输入
|
|
15
15
|
|
|
16
|
-
-
|
|
17
|
-
-
|
|
18
|
-
-
|
|
19
|
-
-
|
|
20
|
-
|
|
21
|
-
|
|
16
|
+
- 工作流总览:`<Path>{roots.workflows}/specdev/INDEX.md</Path>`
|
|
17
|
+
- 路径引用契约:`<Path>{roots.workflows}/specdev/common/rules/path-reference-contract.md</Path>`
|
|
18
|
+
- 配置模板:`<Path>{roots.workflows}/specdev/I-init-setup/config-template.json</Path>`
|
|
19
|
+
- 配置 Schema:`<Path>{roots.workflows}/specdev/common/schemas/config.schema.json</Path>`
|
|
20
|
+
- 全局状态模板:`<Path>{roots.workflows}/specdev/I-init-setup/status-template.json</Path>`
|
|
21
|
+
- 全局状态 Schema:`<Path>{roots.workflows}/specdev/common/schemas/status.schema.json</Path>`
|
|
22
|
+
- Change 状态模板:`<Path>{roots.workflows}/specdev/I-init-setup/change-status-template.json</Path>`
|
|
23
|
+
- Change 状态 Schema:`<Path>{roots.workflows}/specdev/common/schemas/change-status.schema.json</Path>`
|
|
22
24
|
|
|
23
25
|
## 流程
|
|
24
26
|
|
|
25
|
-
### 1.
|
|
26
|
-
|
|
27
|
-
查看当前仓库以了解 specdev 的初始配置状态。读取已有内容;不要假设:
|
|
28
|
-
|
|
29
|
-
- `<Path>{roots.state}/specdev/config.json</Path>` —— 全局配置文件是否已存在?若存在,读取其内容
|
|
30
|
-
- `<Path>{roots.state}/specdev/.config/tracking.md</Path>` —— 变更追踪约定是否已配置?
|
|
31
|
-
- `<Path>{roots.state}/specdev/.config/domain-layout.md</Path>` —— 领域文档布局是否已配置?
|
|
32
|
-
- `<Path>{roots.state}/specdev/.config/status-labels.md</Path>` —— 状态标签映射是否已配置?
|
|
33
|
-
- `<Path>{roots.state}/specdev/status.json</Path>` —— 当前是否有活跃变更?
|
|
34
|
-
- `<Path>{roots.state}/specdev/changes/</Path>` —— 已有哪些变更目录?
|
|
35
|
-
- `<Path>{roots.state}/specdev/archive/</Path>` —— 归档了哪些历史变更?
|
|
36
|
-
|
|
37
|
-
总结已存在的和缺失的内容。
|
|
38
|
-
|
|
39
|
-
**完成标准**:当前 `<Path>{roots.state}/specdev/</Path>` 和已有配置已摸底,已存在的和缺失的内容已明确。
|
|
27
|
+
### 1. 解析根目录
|
|
40
28
|
|
|
41
|
-
|
|
29
|
+
确认:
|
|
42
30
|
|
|
43
|
-
|
|
31
|
+
- 工作流根可解析为 `<Path>{roots.workflows}/specdev/</Path>`;
|
|
32
|
+
- 状态根可解析为 `<Path>{roots.state}/specdev/</Path>`;
|
|
33
|
+
- 当前用户允许在状态根创建目录和工件。
|
|
44
34
|
|
|
45
|
-
|
|
35
|
+
不得把真实绝对路径写回模板或治理文档;持久化引用继续使用根变量。
|
|
46
36
|
|
|
47
|
-
|
|
37
|
+
### 2. 探测项目事实
|
|
48
38
|
|
|
49
|
-
|
|
39
|
+
只读检查仓库根、包管理方式、构建脚本、测试脚本、静态检查、CI、默认分支、项目级 Agent 指令与 worktree 约定。能从仓库发现的事实直接记录,不询问用户。
|
|
50
40
|
|
|
51
|
-
|
|
41
|
+
至少探测:
|
|
52
42
|
|
|
53
|
-
|
|
43
|
+
- 项目测试、类型检查、lint 和构建命令;
|
|
44
|
+
- 是否存在多包或多工作区结构;
|
|
45
|
+
- 是否允许并行 worktree;
|
|
46
|
+
- 共享高冲突路径的类型,例如根依赖清单、锁文件、全局导出、共享 schema、迁移索引和全局路由;
|
|
47
|
+
- 项目中已有的提交、分支和发布约定。
|
|
54
48
|
|
|
55
|
-
### 3.
|
|
49
|
+
### 3. 询问不可发现偏好
|
|
56
50
|
|
|
57
|
-
|
|
51
|
+
仅在上下文未提供时询问:
|
|
58
52
|
|
|
59
|
-
-
|
|
60
|
-
-
|
|
61
|
-
-
|
|
53
|
+
- 交互语言与持久化工件语言;
|
|
54
|
+
- 是否允许自动提交;
|
|
55
|
+
- 最大并发数;
|
|
56
|
+
- Deep Ticket 的迁移、发布和不可逆操作是否必须人工批准;
|
|
57
|
+
- 外部任务系统标签是否需要映射。
|
|
62
58
|
|
|
63
|
-
|
|
59
|
+
不询问可由仓库事实回答的文件位置、脚本名或默认分支。
|
|
64
60
|
|
|
65
|
-
|
|
61
|
+
### 4. 写入配置
|
|
66
62
|
|
|
67
|
-
|
|
63
|
+
以 `<Path>{roots.workflows}/specdev/I-init-setup/config-template.json</Path>` 为模板写入 `<Path>{roots.state}/specdev/config.json</Path>`。
|
|
68
64
|
|
|
69
|
-
|
|
65
|
+
要求:
|
|
70
66
|
|
|
71
|
-
|
|
67
|
+
- 字段满足 `<Path>{roots.workflows}/specdev/common/schemas/config.schema.json</Path>`;
|
|
68
|
+
- 验证命令来自仓库事实或显式用户决定;
|
|
69
|
+
- 未确认命令写 `null`,不得虚构;
|
|
70
|
+
- 不写入令牌、凭据、Cookie、个人隐私或敏感环境变量值;
|
|
71
|
+
- 自动提交默认关闭,除非用户明确授权。
|
|
72
72
|
|
|
73
|
-
|
|
73
|
+
### 5. 初始化目录与状态
|
|
74
74
|
|
|
75
|
-
|
|
76
|
-
|------|---------|------|
|
|
77
|
-
| `needs-triage` | `needs-triage` | 需要评估 |
|
|
78
|
-
| `needs-info` | `needs-info` | 等待补充信息 |
|
|
79
|
-
| `ready-for-agent` | `ready-for-agent` | 可执行(agent 无需额外人工上下文即可领取) |
|
|
80
|
-
| `ready-for-human` | `ready-for-human` | 需人工处理 |
|
|
81
|
-
| `wontfix` | `wontfix` | 不处理 |
|
|
75
|
+
创建或确认以下目录和文件:
|
|
82
76
|
|
|
83
|
-
|
|
77
|
+
- 以 `<Path>{roots.workflows}/specdev/I-init-setup/status-template.json</Path>` 生成 `<Path>{roots.state}/specdev/status.json</Path>`
|
|
78
|
+
- `<Path>{roots.state}/specdev/.config/</Path>`
|
|
79
|
+
- `<Path>{roots.state}/specdev/changes/</Path>`
|
|
80
|
+
- `<Path>{roots.state}/specdev/adr/</Path>`
|
|
81
|
+
- `<Path>{roots.state}/specdev/context/</Path>`
|
|
82
|
+
- `<Path>{roots.state}/specdev/research/</Path>`
|
|
83
|
+
- `<Path>{roots.state}/specdev/archive/</Path>`
|
|
84
84
|
|
|
85
|
-
|
|
85
|
+
从模板生成:
|
|
86
86
|
|
|
87
|
-
|
|
87
|
+
- `<Path>{roots.workflows}/specdev/I-init-setup/tracking-template.md</Path>` → `<Path>{roots.state}/specdev/.config/tracking.md</Path>`
|
|
88
|
+
- `<Path>{roots.workflows}/specdev/I-init-setup/domain-layout-template.md</Path>` → `<Path>{roots.state}/specdev/.config/domain-layout.md</Path>`
|
|
89
|
+
- `<Path>{roots.workflows}/specdev/I-init-setup/status-labels-template.md</Path>` → `<Path>{roots.state}/specdev/.config/status-labels.md</Path>`
|
|
88
90
|
|
|
89
|
-
|
|
91
|
+
已有永久知识不得被初始化过程清空。已有配置应先验证和展示差异,再按用户授权更新。
|
|
90
92
|
|
|
91
|
-
###
|
|
93
|
+
### 6. 验证初始化结果
|
|
92
94
|
|
|
93
|
-
|
|
95
|
+
1. 解析 `<Path>{roots.state}/specdev/config.json</Path>` 和 `<Path>{roots.state}/specdev/status.json</Path>`;
|
|
96
|
+
2. 对照 `<Path>{roots.workflows}/specdev/common/schemas/config.schema.json</Path>` 与 `<Path>{roots.workflows}/specdev/common/schemas/status.schema.json</Path>`;
|
|
97
|
+
3. 确认 `<Path>{roots.workflows}/specdev/I-init-setup/change-status-template.json</Path>` 的字段与 `<Path>{roots.workflows}/specdev/common/schemas/change-status.schema.json</Path>` 对齐;实际创建 change 时替换模板占位符后再执行 Schema 验证;
|
|
98
|
+
4. 确认所有必需目录存在;
|
|
99
|
+
5. 确认三个配置文档均已从对应模板生成;
|
|
100
|
+
6. 运行:
|
|
94
101
|
|
|
95
|
-
|
|
96
|
-
-
|
|
97
|
-
|
|
98
|
-
specdev 使用 `<Path>{roots.state}/specdev/config.json</Path>` 存储全局配置。所有 specdev works 在启动时读取此文件以自动选择交互语言和确认策略,无需每次手动指定。
|
|
99
|
-
|
|
100
|
-
将配置写入 `<Path>{roots.state}/specdev/config.json</Path>`:
|
|
101
|
-
|
|
102
|
-
```jsonc
|
|
103
|
-
{
|
|
104
|
-
"schema_version": 1,
|
|
105
|
-
"language": "<用户选择的交互语言>",
|
|
106
|
-
"persistence": {
|
|
107
|
-
"root_override": null
|
|
108
|
-
},
|
|
109
|
-
"defaults": {
|
|
110
|
-
"confirm_before_external_write": true,
|
|
111
|
-
"report_language": "<用户选择的报告语言>"
|
|
112
|
-
}
|
|
113
|
-
}
|
|
102
|
+
```bash
|
|
103
|
+
node <Path>{roots.workflows}/specdev/common/tools/validate-specdev.mjs</Path> --self-check
|
|
114
104
|
```
|
|
115
105
|
|
|
116
|
-
|
|
106
|
+
### 7. 更新状态并汇报
|
|
117
107
|
|
|
118
|
-
|
|
108
|
+
在 `<Path>{roots.state}/specdev/status.json</Path>` 中记录本 work 的开始、完成时间和结果。向用户汇报:状态根、语言、验证命令、并发策略、人工批准策略和任何仍为 `null` 的配置项。
|
|
119
109
|
|
|
120
|
-
|
|
110
|
+
## 完成标准
|
|
121
111
|
|
|
122
|
-
|
|
112
|
+
- `<Path>{roots.state}/specdev/config.json</Path>` 与 `<Path>{roots.state}/specdev/status.json</Path>` 可解析且满足 Schema;
|
|
113
|
+
- 状态目录、永久知识目录和归档目录齐全;
|
|
114
|
+
- 三个配置文档已就位;
|
|
115
|
+
- 验证命令与并发规则有来源;
|
|
116
|
+
- 无敏感值被写入;
|
|
117
|
+
- 包级自检无 error;
|
|
118
|
+
- `<Path>{roots.state}/specdev/status.json</Path>` 已记录本 work 完成。
|
|
123
119
|
|
|
124
120
|
## 子文件引用
|
|
125
121
|
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
| `<Path>{roots.workflows}/specdev/I-init-setup/status-labels.md</Path>` | 五个标准状态角色的标签字符串映射 | 步骤 4「状态标签」进入时 |
|
|
122
|
+
- `<Path>{roots.workflows}/specdev/I-init-setup/config-template.json</Path>`
|
|
123
|
+
- `<Path>{roots.workflows}/specdev/I-init-setup/status-template.json</Path>`
|
|
124
|
+
- `<Path>{roots.workflows}/specdev/I-init-setup/change-status-template.json</Path>`
|
|
125
|
+
- `<Path>{roots.workflows}/specdev/I-init-setup/tracking-template.md</Path>`
|
|
126
|
+
- `<Path>{roots.workflows}/specdev/I-init-setup/domain-layout-template.md</Path>`
|
|
127
|
+
- `<Path>{roots.workflows}/specdev/I-init-setup/status-labels-template.md</Path>`
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema_version": 3,
|
|
3
|
+
"artifact": "change-status",
|
|
4
|
+
"change": "<YYYY-MM-DD-topic>",
|
|
5
|
+
"change_status": "active",
|
|
6
|
+
"current_work": null,
|
|
7
|
+
"created_at": "<ISO-8601>",
|
|
8
|
+
"updated_at": "<ISO-8601>",
|
|
9
|
+
"completed_at": null,
|
|
10
|
+
"archived": false,
|
|
11
|
+
"archive_path": null,
|
|
12
|
+
"blockers": [],
|
|
13
|
+
"deviations": [],
|
|
14
|
+
"worktrees": []
|
|
15
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema_version": 3,
|
|
3
|
+
"interaction_language": "zh-CN",
|
|
4
|
+
"artifact_language": "zh-CN",
|
|
5
|
+
"git": {
|
|
6
|
+
"auto_commit": false,
|
|
7
|
+
"default_branch": null,
|
|
8
|
+
"worktree_for_parallel": true
|
|
9
|
+
},
|
|
10
|
+
"execution": {
|
|
11
|
+
"max_parallel": 3,
|
|
12
|
+
"deep_ticket_human_approval": true,
|
|
13
|
+
"shared_path_owner": "lead"
|
|
14
|
+
},
|
|
15
|
+
"verification": {
|
|
16
|
+
"test": null,
|
|
17
|
+
"typecheck": null,
|
|
18
|
+
"lint": null,
|
|
19
|
+
"build": null
|
|
20
|
+
},
|
|
21
|
+
"planning": {
|
|
22
|
+
"default_depth": "standard",
|
|
23
|
+
"require_ready_gate": true,
|
|
24
|
+
"require_evidence": true
|
|
25
|
+
}
|
|
26
|
+
}
|