spec-manager 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (159) hide show
  1. package/AGENTS.md +27 -0
  2. package/CODEBUDDY.md +19 -0
  3. package/LICENSE +21 -0
  4. package/README.md +531 -0
  5. package/dist/cli/audit.d.ts +10 -0
  6. package/dist/cli/audit.d.ts.map +1 -0
  7. package/dist/cli/audit.js +62 -0
  8. package/dist/cli/audit.js.map +1 -0
  9. package/dist/cli/change.d.ts +10 -0
  10. package/dist/cli/change.d.ts.map +1 -0
  11. package/dist/cli/change.js +103 -0
  12. package/dist/cli/change.js.map +1 -0
  13. package/dist/cli/common.d.ts +5 -0
  14. package/dist/cli/common.d.ts.map +1 -0
  15. package/dist/cli/common.js +17 -0
  16. package/dist/cli/common.js.map +1 -0
  17. package/dist/cli/decision.d.ts +13 -0
  18. package/dist/cli/decision.d.ts.map +1 -0
  19. package/dist/cli/decision.js +185 -0
  20. package/dist/cli/decision.js.map +1 -0
  21. package/dist/cli/dict.d.ts +10 -0
  22. package/dist/cli/dict.d.ts.map +1 -0
  23. package/dist/cli/dict.js +73 -0
  24. package/dist/cli/dict.js.map +1 -0
  25. package/dist/cli/incident.d.ts +10 -0
  26. package/dist/cli/incident.d.ts.map +1 -0
  27. package/dist/cli/incident.js +119 -0
  28. package/dist/cli/incident.js.map +1 -0
  29. package/dist/cli/index.d.ts +3 -0
  30. package/dist/cli/index.d.ts.map +1 -0
  31. package/dist/cli/index.js +30 -0
  32. package/dist/cli/index.js.map +1 -0
  33. package/dist/cli/project.d.ts +3 -0
  34. package/dist/cli/project.d.ts.map +1 -0
  35. package/dist/cli/project.js +144 -0
  36. package/dist/cli/project.js.map +1 -0
  37. package/dist/cli/spec.d.ts +3 -0
  38. package/dist/cli/spec.d.ts.map +1 -0
  39. package/dist/cli/spec.js +289 -0
  40. package/dist/cli/spec.js.map +1 -0
  41. package/dist/cli/task.d.ts +14 -0
  42. package/dist/cli/task.d.ts.map +1 -0
  43. package/dist/cli/task.js +287 -0
  44. package/dist/cli/task.js.map +1 -0
  45. package/dist/cli/usability.d.ts +3 -0
  46. package/dist/cli/usability.d.ts.map +1 -0
  47. package/dist/cli/usability.js +153 -0
  48. package/dist/cli/usability.js.map +1 -0
  49. package/dist/core/agents.d.ts +43 -0
  50. package/dist/core/agents.d.ts.map +1 -0
  51. package/dist/core/agents.js +194 -0
  52. package/dist/core/agents.js.map +1 -0
  53. package/dist/core/archive.d.ts +35 -0
  54. package/dist/core/archive.d.ts.map +1 -0
  55. package/dist/core/archive.js +360 -0
  56. package/dist/core/archive.js.map +1 -0
  57. package/dist/core/audit-events.d.ts +12 -0
  58. package/dist/core/audit-events.d.ts.map +1 -0
  59. package/dist/core/audit-events.js +16 -0
  60. package/dist/core/audit-events.js.map +1 -0
  61. package/dist/core/audit.d.ts +78 -0
  62. package/dist/core/audit.d.ts.map +1 -0
  63. package/dist/core/audit.js +157 -0
  64. package/dist/core/audit.js.map +1 -0
  65. package/dist/core/constants.d.ts +28 -0
  66. package/dist/core/constants.d.ts.map +1 -0
  67. package/dist/core/constants.js +30 -0
  68. package/dist/core/constants.js.map +1 -0
  69. package/dist/core/decision.d.ts +69 -0
  70. package/dist/core/decision.d.ts.map +1 -0
  71. package/dist/core/decision.js +210 -0
  72. package/dist/core/decision.js.map +1 -0
  73. package/dist/core/delta.d.ts +85 -0
  74. package/dist/core/delta.d.ts.map +1 -0
  75. package/dist/core/delta.js +264 -0
  76. package/dist/core/delta.js.map +1 -0
  77. package/dist/core/dict.d.ts +28 -0
  78. package/dist/core/dict.d.ts.map +1 -0
  79. package/dist/core/dict.js +57 -0
  80. package/dist/core/dict.js.map +1 -0
  81. package/dist/core/frontmatter.d.ts +19 -0
  82. package/dist/core/frontmatter.d.ts.map +1 -0
  83. package/dist/core/frontmatter.js +57 -0
  84. package/dist/core/frontmatter.js.map +1 -0
  85. package/dist/core/incident.d.ts +45 -0
  86. package/dist/core/incident.d.ts.map +1 -0
  87. package/dist/core/incident.js +128 -0
  88. package/dist/core/incident.js.map +1 -0
  89. package/dist/core/paths.d.ts +68 -0
  90. package/dist/core/paths.d.ts.map +1 -0
  91. package/dist/core/paths.js +162 -0
  92. package/dist/core/paths.js.map +1 -0
  93. package/dist/core/repository.d.ts +13 -0
  94. package/dist/core/repository.d.ts.map +1 -0
  95. package/dist/core/repository.js +29 -0
  96. package/dist/core/repository.js.map +1 -0
  97. package/dist/core/spec-io.d.ts +125 -0
  98. package/dist/core/spec-io.d.ts.map +1 -0
  99. package/dist/core/spec-io.js +260 -0
  100. package/dist/core/spec-io.js.map +1 -0
  101. package/dist/core/status.d.ts +22 -0
  102. package/dist/core/status.d.ts.map +1 -0
  103. package/dist/core/status.js +54 -0
  104. package/dist/core/status.js.map +1 -0
  105. package/dist/core/task.d.ts +118 -0
  106. package/dist/core/task.d.ts.map +1 -0
  107. package/dist/core/task.js +340 -0
  108. package/dist/core/task.js.map +1 -0
  109. package/dist/core/usability.d.ts +25 -0
  110. package/dist/core/usability.d.ts.map +1 -0
  111. package/dist/core/usability.js +136 -0
  112. package/dist/core/usability.js.map +1 -0
  113. package/dist/core/validate.d.ts +34 -0
  114. package/dist/core/validate.d.ts.map +1 -0
  115. package/dist/core/validate.js +195 -0
  116. package/dist/core/validate.js.map +1 -0
  117. package/dist/index.d.ts +11 -0
  118. package/dist/index.d.ts.map +1 -0
  119. package/dist/index.js +12 -0
  120. package/dist/index.js.map +1 -0
  121. package/dist/schemas/change.d.ts +138 -0
  122. package/dist/schemas/change.d.ts.map +1 -0
  123. package/dist/schemas/change.js +38 -0
  124. package/dist/schemas/change.js.map +1 -0
  125. package/dist/schemas/spec.d.ts +233 -0
  126. package/dist/schemas/spec.d.ts.map +1 -0
  127. package/dist/schemas/spec.js +56 -0
  128. package/dist/schemas/spec.js.map +1 -0
  129. package/package.json +66 -0
  130. package/rules/_TEMPLATE.md +20 -0
  131. package/rules/code-discipline.md +47 -0
  132. package/rules/codebase-survey.md +37 -0
  133. package/rules/delta.md +42 -0
  134. package/rules/doc-governance.md +195 -0
  135. package/rules/flow-control.md +65 -0
  136. package/rules/quality-gate.md +73 -0
  137. package/skill/SKILL.md +90 -0
  138. package/skill/subskills/adr.md +73 -0
  139. package/skill/subskills/change.md +118 -0
  140. package/skill/subskills/design.md +53 -0
  141. package/skill/subskills/impl.md +100 -0
  142. package/skill/subskills/plan.md +46 -0
  143. package/skill/subskills/postmortem.md +77 -0
  144. package/skill/subskills/prd.md +72 -0
  145. package/skill/subskills/quick.md +25 -0
  146. package/skill/subskills/release.md +50 -0
  147. package/skill/subskills/research.md +35 -0
  148. package/skill/subskills/runbook.md +44 -0
  149. package/skill/subskills/testplan.md +48 -0
  150. package/templates/L0-prd.md +43 -0
  151. package/templates/L1-prd.md +130 -0
  152. package/templates/L2-design.md +135 -0
  153. package/templates/L3-impl.md +125 -0
  154. package/templates/agent-plan.json +17 -0
  155. package/templates/agents/AGENTS.md +27 -0
  156. package/templates/agents/CLAUDE.md +11 -0
  157. package/templates/agents/CODEBUDDY.md +23 -0
  158. package/templates/agents/codebuddy-skill/SKILL.md +46 -0
  159. package/templates/decision.md +42 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spec.d.ts","sourceRoot":"","sources":["../../src/schemas/spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,eAAO,MAAM,eAAe,qCAAmC,CAAC;AAChE,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAEzD,eAAO,MAAM,gBAAgB,wEAAsE,CAAC;AACpG,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAE3D,eAAO,MAAM,gBAAgB,qEAAmE,CAAC;AACjG,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAC3D,eAAO,MAAM,cAAc,mDAAiD,CAAC;AAC7E,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAEvD,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAYhC,CAAC;AAEH,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAoBhC,CAAC;AAEH,eAAO,MAAM,cAAc;;;;;;;;;;;;EAIzB,CAAC;AAEH,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAGzB,CAAC;AAEH,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;EAK9B,CAAC"}
@@ -0,0 +1,56 @@
1
+ import { z } from 'zod';
2
+ import { PLAN_STEPS_MAX, SPEC_CODE_RE } from '../core/constants.js';
3
+ export const SpecLevelSchema = z.enum(['L0', 'L1', 'L2', 'L3']);
4
+ export const SpecStatusSchema = z.enum(['draft', 'confirmed', 'frozen', 'implemented', 'archived']);
5
+ export const StepStatusSchema = z.enum(['pending', 'running', 'succeeded', 'failed', 'skipped']);
6
+ export const StepTypeSchema = z.enum(['llm_call', 'mcp_tool', 'human_gate']);
7
+ export const StepFrontmatterSchema = z.object({
8
+ stepNo: z.union([z.number(), z.string()]),
9
+ stepType: StepTypeSchema,
10
+ name: z.string().min(1),
11
+ status: StepStatusSchema.default('pending'),
12
+ toolName: z.string().optional(),
13
+ inputJson: z.string().optional(),
14
+ outputJson: z.string().optional(),
15
+ errorCode: z.string().optional(),
16
+ errorMessage: z.string().optional(),
17
+ latencyMs: z.number().optional(),
18
+ reportedAt: z.string().optional(),
19
+ });
20
+ export const SpecFrontmatterSchema = z.object({
21
+ id: z.string().optional(),
22
+ code: z.string().regex(SPEC_CODE_RE, 'code 必须是 <topic>-L<level>[.<n>...][-desc] 格式'),
23
+ level: SpecLevelSchema,
24
+ title: z.string().min(1),
25
+ topic: z.string().min(1),
26
+ parentCode: z.string().nullable(),
27
+ status: SpecStatusSchema,
28
+ project: z.number().int().positive().default(1),
29
+ milestone: z.string().regex(/^v\d+(\.\d+)*(-[a-z0-9]+)?$/i, 'milestone 格式: v1.0 / v1.0.1 / v2.0-beta').optional(),
30
+ aiSummary: z.string().max(300, 'aiSummary 必须 ≤300 字符').default(''),
31
+ coveredTasks: z.array(z.string()).default([]),
32
+ steps: z.array(StepFrontmatterSchema).optional(),
33
+ relations: z.array(z.object({
34
+ type: z.enum(['based_on', 'supersedes', 'implements', 'references']),
35
+ target: z.string(),
36
+ })).default([]),
37
+ created: z.string().optional(),
38
+ updated: z.string().optional(),
39
+ changeSummary: z.string().optional(),
40
+ });
41
+ export const PlanStepSchema = z.object({
42
+ stepNo: z.union([z.number().int().positive(), z.string()]),
43
+ stepType: StepTypeSchema,
44
+ name: z.string().min(1),
45
+ });
46
+ export const PlanJsonSchema = z.object({
47
+ coveredSpecs: z.array(z.string()).optional(),
48
+ steps: z.array(PlanStepSchema).min(1).max(PLAN_STEPS_MAX, `R11: 步骤数 ≤${PLAN_STEPS_MAX}`),
49
+ });
50
+ export const DecisionInputSchema = z.object({
51
+ topic: z.string().min(1),
52
+ what: z.string().min(1).max(500),
53
+ why: z.string().max(500).optional(),
54
+ affectedCriteria: z.array(z.string()).optional(),
55
+ });
56
+ //# sourceMappingURL=spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spec.js","sourceRoot":"","sources":["../../src/schemas/spec.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,66 @@
1
+ {
2
+ "name": "spec-manager",
3
+ "version": "0.1.0",
4
+ "description": "spec-manager: local-first spec-driven development platform. Pure markdown storage, no network, no MCP. Portable CLI + multi-agent instructions.",
5
+ "type": "module",
6
+ "license": "MIT",
7
+ "engines": {
8
+ "node": ">=18"
9
+ },
10
+ "bin": {
11
+ "spec-manager": "dist/cli/index.js"
12
+ },
13
+ "main": "./dist/index.js",
14
+ "types": "./dist/index.d.ts",
15
+ "files": [
16
+ "dist",
17
+ "skill",
18
+ "templates",
19
+ "rules",
20
+ "AGENTS.md",
21
+ "CODEBUDDY.md",
22
+ "README.md",
23
+ "LICENSE"
24
+ ],
25
+ "scripts": {
26
+ "build": "tsc",
27
+ "test": "vitest run",
28
+ "test:watch": "vitest",
29
+ "dev": "tsc --watch",
30
+ "lint": "tsc --noEmit"
31
+ },
32
+ "keywords": [
33
+ "spec-driven",
34
+ "spec",
35
+ "methodology",
36
+ "claude-code",
37
+ "codex",
38
+ "opencode",
39
+ "codebuddy",
40
+ "agents-md",
41
+ "skill",
42
+ "ai-coding",
43
+ "agent",
44
+ "delta-spec"
45
+ ],
46
+ "dependencies": {
47
+ "commander": "^12.0.0",
48
+ "gray-matter": "^4.0.3",
49
+ "yaml": "^2.4.0",
50
+ "zod": "^3.23.0"
51
+ },
52
+ "devDependencies": {
53
+ "@types/node": "^20.12.0",
54
+ "typescript": "^5.4.0",
55
+ "vitest": "^1.6.0"
56
+ },
57
+ "repository": {
58
+ "type": "git",
59
+ "url": "git+https://github.com/loki-ai-ch/spec-manager.git"
60
+ },
61
+ "bugs": {
62
+ "url": "https://github.com/loki-ai-ch/spec-manager/issues"
63
+ },
64
+ "author": "loki",
65
+ "homepage": "https://github.com/loki-ai-ch/spec-manager"
66
+ }
@@ -0,0 +1,20 @@
1
+ # 规则 frontmatter 模板
2
+
3
+ > 复制本文件改 ID 即可。所有规则统一格式,便于 applies_to 过滤。
4
+
5
+ ```markdown
6
+ ---
7
+ id: R<N>
8
+ title: 一句话标题
9
+ added: 0.1.0
10
+ applies_to: [action_1, action_2, ...]
11
+ ---
12
+
13
+ ## 正文
14
+
15
+ 详细规则 + 判定标准 + 违反示例 + 豁免 + 关联。
16
+ ```
17
+
18
+ 字段说明:
19
+ - `applies_to` — 该规则被检查的 action 名。CLI 和 skill 都通过 `applies_to` 过滤当前操作要加载哪些规则(人工筛选)。
20
+ - 其它字段(`trigger_count` / `last_triggered` / `health` / `reason_inc` / `audit_type`)已废弃:触发次数看 `spec-manager audit show`,incident 关联看 incident 文件 frontmatter。
@@ -0,0 +1,47 @@
1
+ # 代码纪律规则
2
+
3
+ > 本文件管辖:R8 R9 R12
4
+ > 主题:改代码前自检、批准必须走 spec-manager 入口、禁凭记忆
5
+
6
+ ## R8 — 改代码前必须调研
7
+
8
+ ---
9
+ id: R8
10
+ title: 改代码前必须调研
11
+ added: 0.1.0
12
+ applies_to: [pre_code_change, L3_write]
13
+ ---
14
+
15
+ 改代码前必须先:
16
+ 1. `spec-manager spec show <相关 spec code>` 确认 spec 已 frozen
17
+ 2. Read 相关源文件确认路径存在(R12)
18
+ 3. grep/Read 了解调用链
19
+ 4. 识别测试文件
20
+
21
+ **禁止**:凭记忆写文件路径 / 函数名。
22
+
23
+ ## R9 — 批准必须走 spec-manager 入口,不能凭上下文
24
+
25
+ ---
26
+ id: R9
27
+ title: 批准必须走 spec-manager 入口,不能凭上下文
28
+ added: 0.1.0
29
+ applies_to: [user_approve]
30
+ ---
31
+
32
+ 当用户在迭代上下文中说出"批准"/"已确认"/"通过"等信号时,AI agent **必须**重新进入 spec-manager workflow(skill、`AGENTS.md` 指令入口或同等项目指令),由该入口触发后续状态推进。
33
+
34
+ **禁止**:凭上下文理解直接调用 `spec-manager spec confirm` / `freeze` / `implement`。
35
+
36
+ ## R12 — 禁止凭记忆写 planJson,必须从模板读
37
+
38
+ ---
39
+ id: R12
40
+ title: 禁止凭记忆写 planJson,必须从模板读
41
+ added: 0.1.0
42
+ applies_to: [doc_write, task_write, L3_write]
43
+ ---
44
+
45
+ 写 L3 spec 的 planJson 前,**必须**先 Read 本仓库 `templates/agent-plan.json` 确认字段名(`stepNo` / `stepType` / `name`)。
46
+
47
+ **禁止字段名**:`no` / `type` / `desc` / `description`(INC-005 教训)。
@@ -0,0 +1,37 @@
1
+ # 代码调查规则
2
+
3
+ > 本文件管辖:R23
4
+ > 主题:Spec 写作前必须基于实际代码(不靠想象)
5
+
6
+ ## R23 — Spec 写作前必须执行三级代码调查
7
+
8
+ ---
9
+ id: R23
10
+ title: Spec 写作前必须执行三级代码调查
11
+ added: 0.1.0
12
+ applies_to: [L1_create, L2_create, L3_create]
13
+ ---
14
+
15
+ | Level | 触发时机 | 内容 | 最低要求 |
16
+ |---|---|---|---|
17
+ | Level 1 架构概览 | 写 L1 前 | 项目结构、技术栈、模块、API 端点、数据模型 | 读 README / 找 architecture-baseline;或 find + grep 补扫 |
18
+ | Level 2 模块深潜 | 写 L2 前 | 受影响模块的 controller / service / entity + 复用工具类 | 至少 Read 3 个源文件 |
19
+ | Level 3 文件级分析 | 写 L3 前 | 精确函数签名 / 插入行号 / 调用链 / 测试文件 | Read 验证每个文件路径存在 |
20
+
21
+ ### 策略
22
+
23
+ - **基线优先**:先查 `spec list --q architecture-baseline` 看是否有基线 spec
24
+ - **基线不足时**:用 `find` / `grep` 实时补扫
25
+ - **Read 一致性**:写完 L1/L2/L3 后再 Read 一次确认字段名/路径未变化
26
+
27
+ ### 违反判定
28
+
29
+ - L2 复用清单无具体路径(只有"用现有的 X")
30
+ - L3 受影响模块未经 Read 验证
31
+ - 有基线 spec 但没读
32
+ - 新项目无基线就开始写 L1
33
+
34
+ ### 关联
35
+
36
+ - R8 改代码前自检
37
+ - R12 planJson 字段名从模板读
package/rules/delta.md ADDED
@@ -0,0 +1,42 @@
1
+ # Delta Spec 规则
2
+
3
+ > 本文件管辖:R24
4
+ > 主题:OpenSpec 风格的增量 spec 提案(change folder)的完整性
5
+
6
+ ## R24 — delta change 必须含 proposal + delta spec
7
+
8
+ ---
9
+ id: R24
10
+ title: delta change 必须含 proposal + delta spec
11
+ added: 0.1.0
12
+ applies_to: [change_new, change_archive]
13
+ ---
14
+
15
+ **核心规则**:`spec-manager change new <name>` 创建的 change 文件夹(`changes/YYYY-MM-DD-<name>/`)必须满足:
16
+
17
+ 1. **proposal.md** 非空 — 至少含 ## 为什么(Why)/ ## 影响范围(Scope)/ ## 验收标准(AC)
18
+ 2. **至少一个 delta spec** — 在 `changes/.../specs/<topic>/<code>/` 下的 `*.md`,使用 ## ADDED Requirements / ## MODIFIED Requirements / ## REMOVED Requirements / ## RENAMED Requirements 四个段之一
19
+
20
+ `spec-manager change archive <name>` 会校验:
21
+ - proposal.md 存在且非空
22
+ - delta spec 文件存在且包含合法 delta 段落
23
+ - ADDED 操作的占位文件位于 `changes/<name>/specs/<topic>/<code>/<code>.md`,archive 时按占位 frontmatter 的 `parentCode` 字段把新 spec 放到主 specs 树的正确嵌套位置
24
+
25
+ 违反任一条件 `change archive` 拒绝执行(exit 2),并打印具体缺什么。
26
+
27
+ ### 为什么
28
+
29
+ - **避免 "delta 半截"**:没 proposal 的 change 是无目的的修改,没 delta spec 的 change 是凭空合并
30
+ - **可审计性**:archive 时机 = 知识合并点,必须有完整变更描述
31
+ - **可回滚**:proposal + delta 是 archive 的"原账本",未来回滚或查询靠它们
32
+
33
+ ### 与 R13/R14 的关系
34
+
35
+ - R13:delta spec 也必须写 aiSummary(`spec-manager spec update --ai-summary`)
36
+ - R14:delta spec 引用主 spec 时用 specCode,不复述原文
37
+
38
+ ### 关联
39
+
40
+ - `templates/proposal.md` — change proposal 模板
41
+ - `templates/delta-spec.md` — delta spec 模板
42
+ - Phase 3 实施:`change new/archive/list` 三个 CLI 命令
@@ -0,0 +1,195 @@
1
+ # 文档治理规则
2
+
3
+ > 本文件管辖:R7 R11 R13 R14 R16 R17 R19 R20 R21 R22
4
+ > 主题:层级绑定、粒度控制、摘要与变更说明、跨层引用、批量建齐、正文非空门禁
5
+
6
+ ## Contents
7
+
8
+ - **R7 层级绑定** — L2/L3 必须有 `parentCode`
9
+ - **R11 粒度控制** — Agent Task ≤20 步
10
+ - **R13 aiSummary 上传** — 写完 contentTemplate 必须给 aiSummary
11
+ - **R14 跨层引用** — 用 specCode 而不是复述上层内容
12
+ - **R16 L1 去重** — 创建前必须搜同 topic
13
+ - **R17 L2 架构拆解** — L2 是架构不是 todolist
14
+ - **R19 研究先看摘要** — 研究期 `spec show` 默认收窄,需 aiSummary;跨层设计必须读父全文
15
+ - **R20 批量建 L3** — scope-split L2 必须 1 次建齐所有子 L3
16
+ - **R21 aiSummary ≤300 字符** — 硬限制
17
+ - **R22 创建即写正文** — 防 contentTemplate 空白进审核
18
+
19
+ ---
20
+
21
+ ## R7 — 层级建模已启用,L2/L3 必须绑定父 Spec
22
+
23
+ ---
24
+ id: R7
25
+ title: 层级建模已启用,L2/L3 必须绑定父 Spec
26
+ added: 0.1.0
27
+ applies_to: [L2_create, L3_create]
28
+ ---
29
+
30
+ `spec-manager spec new L2 --parent <L1 code>` 必须指定 `parentCode`。
31
+ `spec-manager spec new L3 --parent <L2 code>` 必须指定 `parentCode`。
32
+ CLI 在 `L2`/`L3` 缺 `--parent` 时直接拒绝(exit 2),不会创建文件。
33
+
34
+ ## R11 — Agent Task 粒度控制
35
+
36
+ ---
37
+ id: R11
38
+ title: Agent Task 粒度控制
39
+ added: 0.1.0
40
+ applies_to: [agent_task_create]
41
+ ---
42
+
43
+ - 单个 Agent Task = 单个 L3 Spec = **≤ 20 个步骤**(用户授权 ≤10)
44
+ - **单步单责**:每个 planJson step 只做一件事(改一个文件 / 调一个工具 / 运行一次验证)
45
+ - 超过 16 步时,必须拆分为多个 L3 Spec
46
+
47
+ `spec-manager spec validate-plan` 自动检查并 warn。
48
+
49
+ ## R13 — 写完 contentTemplate 后必须上传 aiSummary
50
+
51
+ ---
52
+ id: R13
53
+ title: 写完 contentTemplate 后必须上传 aiSummary
54
+ added: 0.1.0
55
+ applies_to: [doc_update]
56
+ ---
57
+
58
+ 每次 `spec-manager spec update <code> --content <file>` 后,必须紧跟 `--ai-summary "..."`(同一调用或下次调用均可)。
59
+
60
+ **摘要必须遵循** `docs/ai-summary-spec.md` 的写作规范(三秒可读 + 具体到字段/文件/接口路径 + 按层级模板,≤200字)。
61
+
62
+ **同时要求**:每次 `spec-manager spec update` 必须在同一调用中传入 `--change-summary`,描述本次写入的原因。
63
+
64
+ ## R14 — 跨层引用用 specCode,不复述上层内容
65
+
66
+ ---
67
+ id: R14
68
+ title: 跨层引用用 specCode,不复述上层内容
69
+ added: 0.1.0
70
+ applies_to: [L2_write, L3_write]
71
+ ---
72
+
73
+ **核心规则**:L2 Spec 引用 L1 时只写 `parentCode + 一句话定位`,不复制 L1 的用户故事/验收标准。L3 Spec 引用 L2 时只写一句话,不复制 L2 的架构描述。
74
+
75
+ ### 判定
76
+
77
+ ✅ 正确:
78
+
79
+ - L2: `本 L2 实现 2026-06-04-a1b2c3 的目标 3(演进闭环)。L1 的用户故事详见其正文。`
80
+ - L3: `本 L3 对应 2026-06-05-b2c3d4 的 L3 裂变计划,落地 5 份模板文件。`
81
+
82
+ ❌ 错误:
83
+
84
+ - L2 正文大段粘贴 L1 的"用户故事"和"验收标准"章节
85
+ - L3 正文重复 L2 的"方案概述"和"关键技术决策"
86
+ - L3 重新阐述业务背景(应引用 L1 code)
87
+
88
+ ### 为什么
89
+
90
+ - **单一真相源**:同一信息只写一处,修改时不分裂
91
+ - **反向溯源**:未来审计链路 L3→L2→L1 通过 parentCode 一跳一跳走
92
+ - **分层老化**:L3 短期失效(实施完成即历史),L1 长期沉淀
93
+
94
+ ## R16 — L1 创建前必须搜索去重
95
+
96
+ ---
97
+ id: R16
98
+ title: L1 创建前必须搜索去重
99
+ added: 0.1.0
100
+ applies_to: [L1_create]
101
+ ---
102
+
103
+ 创建 L1 Spec 前,必须先执行:
104
+
105
+ ```bash
106
+ spec-manager spec list --level L1 --topic <topic>
107
+ ```
108
+
109
+ 若发现同 topic 的 L1 已存在,应复用现有 L1(追加用户故事/验收标准),而非新建。
110
+
111
+ ## R17 — L2 是架构拆解,不是任务清单
112
+
113
+ ---
114
+ id: R17
115
+ title: L2 是架构拆解,不是任务清单
116
+ added: 0.1.0
117
+ applies_to: [L2_create]
118
+ ---
119
+
120
+ **L1:L2 比例必须控制在 1:1 或 1:2。** L2 的拆分维度是**模块边界 / 系统层**,不是功能点清单。
121
+
122
+ ### 自检
123
+
124
+ 创建 L2 前问自己:
125
+ 1. 这个 L2 和同层其他 L2 是否改的是**不同模块/系统层**?→ 是则合理
126
+ 2. 这些 L2 是否都在改**同一个模块的不同功能点**?→ 是则应合并为一个 L2,功能点下沉到 L3
127
+
128
+ ## R19 — 跨层引用/研究优先读 aiSummary
129
+
130
+ ---
131
+ id: R19
132
+ title: 跨层引用/研究优先读 aiSummary
133
+ added: 0.1.0
134
+ applies_to: [doc_list, spec_show, research, cross_layer_reference, L2_write, L3_write, cross_layer_design]
135
+ ---
136
+
137
+ > 人工审计:本规则靠自律,默认收窄视图,需全文时显式 `--include-content` / `Include-Content`。
138
+
139
+ **核心规则**:研究、扫目录、跨层引用场景,**优先只读 `aiSummary`**(≤300字),不要 `spec show <code> --include-content` 拉全文。
140
+
141
+ ### 何时必须只读 aiSummary
142
+
143
+ - `spec list` 返回结果的初筛(扫 code + aiSummary 判断是否相关)
144
+ - L2/L3 启动时读父层(`spec show <parent>` 只为"知道父层长啥样")
145
+ - 跨 topic 关联时扫 `decision list` 结果
146
+ - L1 去重搜索(R16)的结果比对
147
+
148
+ ### 何时允许读全文
149
+
150
+ 只有以下 3 种场景允许 `--include-content`:
151
+
152
+ 1. **即将写作本层正文** — 需要精确对齐父层的用户故事/接口契约/章节编号
153
+ 2. **执行 Agent Task 步骤** — 需要精确字段名/文件行号(R12 要求凭 Spec 不凭记忆)
154
+ 3. **aiSummary 明显不够** — 读完 aiSummary 仍无法判断是否重复/是否要引用
155
+
156
+ ### 跨层设计必须读父层全文
157
+
158
+ **核心规则**:写 L2 正文前必须读 L1 全文,写 L3 正文前必须读 L2 全文。aiSummary 不能替代全文。这是流程问题,不是优化问题。
159
+
160
+ ## R20 — scope-split L2 必须批量建齐所有子 L3
161
+
162
+ ---
163
+ id: R20
164
+ title: scope-split L2 必须批量建齐所有子 L3
165
+ added: 0.1.0
166
+ applies_to: [L2_scope_split, L3_create]
167
+ ---
168
+
169
+ **核心规则**:当一个 L2 决定拆成 N 个 L3 执行(scope-split)时,必须在第一个 L3 推 `frozen` **之前**,把全部 N 个子 L3 spec 都通过 `spec-manager spec new` 建好(可保持 `draft` 状态)。禁止"先建 L3-A 走 frozen → complete,再回头建 L3-B"的顺序。
170
+
171
+ **重要**:"建齐" = 每个子 L3 都同时满足(1)`spec new` 建立 +(2)`spec update --content` 写入非空正文。
172
+
173
+ ## R21 — aiSummary ≤300 字符
174
+
175
+ ---
176
+ id: R21
177
+ title: aiSummary ≤300 字符
178
+ added: 0.1.0
179
+ applies_to: [doc_update]
180
+ ---
181
+
182
+ `spec-manager spec update --ai-summary` 入参 >300 字符时自动截断并 warn。**不 throw**。
183
+
184
+ **生成摘要时直接控制在 200 字以内即可**(与 R13 写作规范一致)。
185
+
186
+ ## R22 — spec 创建后必须立即写正文,通知用户审核前自检 contentTemplate 非空
187
+
188
+ ---
189
+ id: R22
190
+ title: spec 创建后必须立即写正文,通知用户审核前自检 contentTemplate 非空
191
+ added: 0.1.0
192
+ applies_to: [doc_create_spec, user_review_signal, L1_create, L2_create, L3_create, scope_split_batch_create]
193
+ ---
194
+
195
+ **核心规则**:调用 `spec-manager spec new` 后,**必须紧跟一次** `spec-manager spec update <code> --content <file> --ai-summary "..." --change-summary "..."` 写入非空正文,才能视为该 spec 创建完成。**禁止**只创建空架子(仅 metadata:title/code/level/parentCode/description)就向用户发出"spec 写完了,请审核"信号。
@@ -0,0 +1,65 @@
1
+ # 流程控制规则
2
+
3
+ > 本文件管辖:R1 R2 R3 R4
4
+ > 主题:何时 STOP、何时推进状态、何时建 Task、审核独立性
5
+
6
+ ## R1 — 写内容后必须停下等审核
7
+
8
+ ---
9
+ id: R1
10
+ title: 写内容后必须停下等审核
11
+ added: 0.1.0
12
+ applies_to: [L1_create, L2_create, L3_create]
13
+ ---
14
+
15
+ 每次 `spec-manager spec update <code> --content` 写入后,**必须停下**,告知用户文件路径,等用户明确说"批准"/"已确认"/"继续"/"通过"等。
16
+
17
+ **严禁一口气做**:`new L1 → update --content → confirm → new L2 → update → confirm → new L3 → freeze → task create → start`。
18
+
19
+ ## R2 — 状态推进是用户行为,不是 AI 行为
20
+
21
+ ---
22
+ id: R2
23
+ title: 状态推进是用户行为,不是 AI 行为
24
+ added: 0.1.0
25
+ applies_to: [L1_confirm, L2_confirm, L3_confirm, L3_freeze, user_approve]
26
+ ---
27
+
28
+ `draft → confirmed` 和 `confirmed → frozen` 都是用户审核意见的体现。AI agent **不能**在未获用户明确批准前主动调用 `spec-manager spec confirm` / `freeze`。
29
+
30
+ **唯一例外**:`frozen → implemented` 由 `spec-manager task complete` 自动触发,允许 AI agent 执行。
31
+
32
+ **用户批准信号必须通过 spec-manager 入口响应**:当用户在迭代上下文中说出批准信号("继续"/"已审批"/"通过"/"批准"/"ok"/"确认"等),AI agent **必须重新进入 spec-manager workflow**(Claude/CodeBuddy skill、Codex/OpenCode 的 `AGENTS.md` 指令入口等),不能凭已有上下文自行推进。
33
+
34
+ **原因**:AI 拥有上下文≠有权跳过流程。上下文只是信息,流程管控的是质量和可追溯性。
35
+
36
+ ```
37
+ 正确:用户说"已审批" → AI 进入 spec-manager workflow → 执行下一步状态推进
38
+ 错误:用户说"已审批" → AI 凭上下文直接读文件、建 Task、动代码
39
+ ```
40
+
41
+ ## R3 — 创建 Agent Task 前必须 spec 已 frozen
42
+
43
+ ---
44
+ id: R3
45
+ title: 创建 Agent Task 前必须 spec 已 frozen
46
+ added: 0.1.0
47
+ applies_to: [agent_task_create]
48
+ ---
49
+
50
+ 只有当用户明确批准并且 L3 spec 状态为 `frozen` 时,才能调用 `spec-manager task create`。
51
+
52
+ ## R4 — 每层 Spec 都是独立审核点
53
+
54
+ ---
55
+ id: R4
56
+ title: 每层 Spec 都是独立审核点
57
+ added: 0.1.0
58
+ applies_to: [L1_confirm, L2_confirm, L3_confirm]
59
+ ---
60
+
61
+ > 人工审计:本规则依赖人工判断,无法通过系统强制执行,实际执行由人工审核保障。
62
+
63
+ L1 PRD 审核、L2 Design 审核、L3 Impl 审核是**三个独立的停止点**。不能因为 L1 批准了就连带假设 L2 也批准。
64
+
65
+ **人工审计说明**:本规则依赖人工判断,无法通过系统强制执行。hooks 作为辅助提醒,实际执行由人工审核保障。
@@ -0,0 +1,73 @@
1
+ # 质量门禁规则
2
+
3
+ > 本文件管辖:R5 R6 R10 R15 R18
4
+ > 主题:执行可观测、task 后状态校验、step 必含 summary
5
+
6
+ ## R5 — 执行期间不得跳步
7
+
8
+ ---
9
+ id: R5
10
+ title: 执行期间不得跳步
11
+ added: 0.1.0
12
+ applies_to: [agent_step_report]
13
+ ---
14
+
15
+ 每个 planJson 的 step **必须**通过 `spec-manager task step` 单独上报,禁止跳号。
16
+
17
+ **错误**:planJson 有 10 步但只上报 step 1、5、10,然后调用 `task complete`。
18
+
19
+ ## R6 — task_complete 后校验 implemented
20
+
21
+ ---
22
+ id: R6
23
+ title: task_complete 后校验 implemented
24
+ added: 0.1.0
25
+ applies_to: [agent_task_complete]
26
+ ---
27
+
28
+ 调用 `spec-manager task complete` 后,**必须立即** `spec-manager spec show <L3 code>` 校验 status 是否已自动 cascade 到 `implemented`。未级联则手动 `spec-manager spec implement <L3 code>`。
29
+
30
+ **原因**:避免 INC-20260424-001 — L3-A implemented → 级联误判 L2 完成,而 L3-B 还没建。
31
+
32
+ ## R10 — planJson 最后一步必须是验证
33
+
34
+ ---
35
+ id: R10
36
+ title: planJson 最后一步必须是验证
37
+ added: 0.1.0
38
+ applies_to: [agent_task_create]
39
+ ---
40
+
41
+ `spec-manager spec validate-plan` 校验时,末步 name 应含 "验证"/"verify"/"test"/"check"/"curl"/"gradle"/"mvn"/"pytest"/"vitest" 等关键字。`spec validate-plan` 输出 `R10` warning 需用户确认。
42
+
43
+ **原因**:避免"实施完成但无验证" — 无法证明功能真工作。
44
+
45
+ ## R15 — step_report outputJson 必含 summary
46
+
47
+ ---
48
+ id: R15
49
+ title: step_report outputJson 必含 summary
50
+ added: 0.1.0
51
+ applies_to: [agent_step_report]
52
+ ---
53
+
54
+ 每次 `spec-manager task step` 调用,`--output-json` 必须是合法 JSON 且含 `summary` 字段(≤500 字)。files 字段如有也应给出。
55
+
56
+ **原因**:summary 是步骤可读的"工作内容",无 summary 等于审计不可用。
57
+
58
+ ## R18 — L1 implemented 后必须建决策卡片
59
+
60
+ ---
61
+ id: R18
62
+ title: L1 implemented 后必须建决策卡片
63
+ added: 0.1.0
64
+ applies_to: [L1_implemented]
65
+ ---
66
+
67
+ L1 spec 状态推进到 `implemented`(通常通过 L3 cascade)后,**必须**至少创建 1 张决策卡片:
68
+
69
+ ```bash
70
+ spec-manager decision create <L1 code> --topic <topic> --what "..." --why "..." --criteria AC-1,AC-2
71
+ ```
72
+
73
+ 新 L1 创建前(PRE-WRITE Q4)必须 `spec-manager decision list --topic <topic>` 查询历史决策。