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,195 @@
1
+ /**
2
+ * 验证 spec 正文的必填段,**只返回 warning,不 throw**。
3
+ * 这是 MCP 版 doc_update 的 validateSpecSections 行为的直接复刻。
4
+ *
5
+ * 必填段定义:
6
+ * L1: 背景 / 用户故事 / 验收标准 / 范围边界
7
+ * L2: 方案概述 / 技术决策 / 受影响模块 / 接口契约 / L3 裂变计划
8
+ * L3: 目标 / 实施步骤 / 验证命令
9
+ *
10
+ * 同时校验 RFC 2119 关键字(如果 L1/L2 内容包含"验收标准"段,则该段每条 AC 应含
11
+ * SHALL/MUST/SHOULD 之一)。这是 OpenSpec 风格的强化。
12
+ */
13
+ const SPEC_CODE_INLINE_RE = /\b[a-z0-9][a-z0-9-]*-L[0-3](?:\.\d+)*(?:-(?!\d{8}\b)[a-z0-9][a-z0-9-]*)?\b/;
14
+ const REQUIRED_SECTIONS = {
15
+ L0: ['愿景', '路线图'],
16
+ L1: ['背景', '用户故事', '验收标准', '范围边界'],
17
+ L2: ['方案概述', '技术决策', '受影响模块', '接口契约', 'L3 裂变计划'],
18
+ L3: ['目标', '实施步骤', '验证命令'],
19
+ };
20
+ const RFC_2119_KEYWORDS = ['SHALL', 'MUST', 'SHOULD', 'MAY'];
21
+ export function validateSpecContent(level, content) {
22
+ const warnings = [];
23
+ const required = REQUIRED_SECTIONS[level] ?? [];
24
+ const sections = parseSections(content);
25
+ for (const r of required) {
26
+ if (!sections.some(s => s.heading === r)) {
27
+ warnings.push({
28
+ rule: 'missing_section',
29
+ level: 'warn',
30
+ message: `[${level}] 缺少必填段:## ${r}`,
31
+ section: r,
32
+ });
33
+ }
34
+ }
35
+ // RFC 2119 校验:L1 验收标准段每条 AC 应含 SHALL/MUST/SHOULD
36
+ if (level === 'L1') {
37
+ const ac = sections.find(s => s.heading === '验收标准');
38
+ if (ac) {
39
+ const acLines = ac.body.split('\n').map(l => l.trim()).filter(l => /^\d+\.\s*\*\*AC-/.test(l));
40
+ if (acLines.length === 0) {
41
+ warnings.push({
42
+ rule: 'no_ac_items',
43
+ level: 'warn',
44
+ message: '验收标准段未发现 AC 编号条目(应为 "1. **AC-1**: ..." 格式)',
45
+ section: '验收标准',
46
+ });
47
+ }
48
+ else {
49
+ const without = acLines.filter(l => !RFC_2119_KEYWORDS.some(k => l.includes(k)));
50
+ if (without.length > 0) {
51
+ warnings.push({
52
+ rule: 'rfc2119_missing',
53
+ level: 'info',
54
+ message: `${without.length}/${acLines.length} 条 AC 未使用 RFC 2119 关键字(SHALL/MUST/SHOULD/MAY)。建议标注约束级别。`,
55
+ section: '验收标准',
56
+ });
57
+ }
58
+ }
59
+ }
60
+ }
61
+ // R17: L2 是架构拆解,不是任务清单。这里做 warning-only 的结构味道检查。
62
+ if (level === 'L2') {
63
+ const checklistLines = content.split('\n').filter(l => /^\s*[-*]\s+\[[ xX]\]/.test(l)).length;
64
+ const todoLines = content.split('\n').filter(l => /\b(TODO|todo)\b|待办|任务清单/.test(l)).length;
65
+ if (checklistLines + todoLines >= 3) {
66
+ warnings.push({
67
+ rule: 'R17',
68
+ level: 'warn',
69
+ message: 'R17: L2 应描述架构拆解、技术决策和接口契约,不应退化为 todolist',
70
+ });
71
+ }
72
+ if (/scope-split|scope split|范围拆分/.test(content)) {
73
+ const splitPlan = sections.find(s => s.heading === 'L3 裂变计划');
74
+ const plannedChildren = splitPlan?.body.match(/\bL3[-\s.]\d*/g)?.length ?? 0;
75
+ if (plannedChildren < 2) {
76
+ warnings.push({
77
+ rule: 'R20',
78
+ level: 'warn',
79
+ message: 'R20: scope-split L2 必须在 L3 裂变计划中批量列出子 L3',
80
+ section: 'L3 裂变计划',
81
+ });
82
+ }
83
+ }
84
+ }
85
+ const crossLayerLines = content.split('\n').filter(l => /(父\s*L[0-3]|父级|上层|下层|based_on|implements|references|supersedes)/i.test(l));
86
+ const crossLayerWithoutCode = crossLayerLines.filter(l => !SPEC_CODE_INLINE_RE.test(l));
87
+ if (crossLayerWithoutCode.length > 0) {
88
+ warnings.push({
89
+ rule: 'R14',
90
+ level: 'warn',
91
+ message: `R14: ${crossLayerWithoutCode.length} 行跨层引用未使用 spec code,跨层引用只写 code 不复述正文`,
92
+ });
93
+ }
94
+ if (level === 'L2' || level === 'L3') {
95
+ const hasCodeEvidence = /`(?:src|app|lib|frontend|backend|tests?|specs?)\/[^`]+`|(?:src|app|lib|frontend|backend|tests?|specs?)\/[\w./-]+|代码调查|实际代码|现有代码|复用清单/.test(content);
96
+ if (!hasCodeEvidence) {
97
+ warnings.push({
98
+ rule: 'R23',
99
+ level: 'warn',
100
+ message: 'R23: Spec 写作前必须基于实际代码;正文应包含代码调查、现有代码路径或复用清单',
101
+ });
102
+ }
103
+ }
104
+ return warnings;
105
+ }
106
+ export function validatePlanJson(plan) {
107
+ const warnings = [];
108
+ if (!plan || typeof plan !== 'object') {
109
+ warnings.push({ rule: 'plan_invalid', level: 'warn', message: 'planJson 不是对象' });
110
+ return warnings;
111
+ }
112
+ const p = plan;
113
+ if (!Array.isArray(p.steps)) {
114
+ warnings.push({ rule: 'plan_no_steps', level: 'warn', message: 'planJson.steps 不是数组' });
115
+ return warnings;
116
+ }
117
+ const steps = p.steps;
118
+ if (steps.length === 0) {
119
+ warnings.push({ rule: 'plan_empty', level: 'warn', message: 'planJson.steps 为空' });
120
+ }
121
+ if (steps.length > 20) {
122
+ warnings.push({
123
+ rule: 'R11',
124
+ level: 'warn',
125
+ message: `R11: planJson 步骤数 ${steps.length} 超过上限 20,需拆分 L3`,
126
+ });
127
+ }
128
+ for (const [i, s] of steps.entries()) {
129
+ if (!('stepNo' in s)) {
130
+ warnings.push({ rule: 'plan_field', level: 'warn', message: `steps[${i}] 缺 stepNo(INC-005: 禁止用 no)` });
131
+ }
132
+ if (!('stepType' in s)) {
133
+ warnings.push({ rule: 'plan_field', level: 'warn', message: `steps[${i}] 缺 stepType(INC-005: 禁止用 type)` });
134
+ }
135
+ else {
136
+ const t = String(s.stepType);
137
+ if (!['llm_call', 'mcp_tool', 'human_gate'].includes(t)) {
138
+ warnings.push({ rule: 'plan_field', level: 'warn', message: `steps[${i}].stepType="${t}" 不在 [llm_call, mcp_tool, human_gate]` });
139
+ }
140
+ }
141
+ if (!('name' in s)) {
142
+ warnings.push({ rule: 'plan_field', level: 'warn', message: `steps[${i}] 缺 name(INC-005: 禁止用 desc)` });
143
+ }
144
+ else {
145
+ const n = String(s.name);
146
+ if (n.length < 5) {
147
+ warnings.push({ rule: 'plan_field', level: 'warn', message: `steps[${i}].name 长度 <5,建议含 verb+object+file` });
148
+ }
149
+ }
150
+ }
151
+ const mutatingStep = steps.find(s => /(edit|write|create|modify|implement|fix|patch|修改|创建|实现|修复|写入|编辑)/i.test(String(s.name ?? '')));
152
+ if (mutatingStep) {
153
+ const firstTwo = steps.slice(0, 2).map(s => String(s.name ?? '')).join(' ');
154
+ if (!/(read|inspect|research|survey|grep|rg|调研|读取|走读|检查|搜索)/i.test(firstTwo)) {
155
+ warnings.push({
156
+ rule: 'R8',
157
+ level: 'warn',
158
+ message: 'R8: 改代码前必须调研;含修改类步骤的 planJson 前两步应包含读取/搜索/调研',
159
+ });
160
+ }
161
+ }
162
+ // R10: 末步建议是验证
163
+ if (steps.length > 0) {
164
+ const last = steps[steps.length - 1];
165
+ const lastName = String(last.name ?? '').toLowerCase();
166
+ if (!/(验证|verify|test|check|curl|gradle|mvn|pytest|vitest)/.test(lastName)) {
167
+ warnings.push({
168
+ rule: 'R10',
169
+ level: 'info',
170
+ message: 'R10: planJson 末步建议含 "验证" 字样或等价验证命令',
171
+ });
172
+ }
173
+ }
174
+ return warnings;
175
+ }
176
+ function parseSections(content) {
177
+ const lines = content.split('\n');
178
+ const sections = [];
179
+ let current = null;
180
+ for (const line of lines) {
181
+ const m = line.match(/^#{2,3}\s+(.+?)\s*$/);
182
+ if (m) {
183
+ if (current)
184
+ sections.push(current);
185
+ current = { heading: m[1], body: '' };
186
+ }
187
+ else if (current) {
188
+ current.body += line + '\n';
189
+ }
190
+ }
191
+ if (current)
192
+ sections.push(current);
193
+ return sections;
194
+ }
195
+ //# sourceMappingURL=validate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/core/validate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export * from './core/paths.js';
2
+ export * from './core/frontmatter.js';
3
+ export * from './core/status.js';
4
+ export * from './core/validate.js';
5
+ export * from './core/spec-io.js';
6
+ export * from './core/agents.js';
7
+ export * from './core/audit-events.js';
8
+ export * from './core/repository.js';
9
+ export * from './core/usability.js';
10
+ export * from './schemas/spec.js';
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC;AACtC,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,12 @@
1
+ // 公共 API 入口(供测试 / 第三方使用)
2
+ export * from './core/paths.js';
3
+ export * from './core/frontmatter.js';
4
+ export * from './core/status.js';
5
+ export * from './core/validate.js';
6
+ export * from './core/spec-io.js';
7
+ export * from './core/agents.js';
8
+ export * from './core/audit-events.js';
9
+ export * from './core/repository.js';
10
+ export * from './core/usability.js';
11
+ export * from './schemas/spec.js';
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,yBAAyB;AACzB,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC;AACtC,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC"}
@@ -0,0 +1,138 @@
1
+ import { z } from 'zod';
2
+ /**
3
+ * Delta spec 中每个 change 段的 schema。
4
+ * 必填字段:op(操作类型)、code(spec code)。
5
+ * 其它字段根据 op 不同而不同:
6
+ * ADDED: needs [parentCode, level, title, content]
7
+ * MODIFIED: needs [content] 或 [frontmatter patch]
8
+ * REMOVED: 无额外必填
9
+ * RENAMED: needs [newCode]
10
+ */
11
+ export declare const ChangeOpSchema: z.ZodEnum<["ADDED", "MODIFIED", "REMOVED", "RENAMED"]>;
12
+ export type ChangeOpT = z.infer<typeof ChangeOpSchema>;
13
+ export declare const ChangeEntrySchema: z.ZodObject<{
14
+ op: z.ZodEnum<["ADDED", "MODIFIED", "REMOVED", "RENAMED"]>;
15
+ code: z.ZodString;
16
+ parentCode: z.ZodOptional<z.ZodNullable<z.ZodString>>;
17
+ level: z.ZodOptional<z.ZodEnum<["L0", "L1", "L2", "L3"]>>;
18
+ title: z.ZodOptional<z.ZodString>;
19
+ content: z.ZodOptional<z.ZodString>;
20
+ newCode: z.ZodOptional<z.ZodString>;
21
+ changeSummary: z.ZodOptional<z.ZodString>;
22
+ affectedCriteria: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
23
+ }, "strip", z.ZodTypeAny, {
24
+ code: string;
25
+ op: "ADDED" | "MODIFIED" | "REMOVED" | "RENAMED";
26
+ content?: string | undefined;
27
+ level?: "L0" | "L1" | "L2" | "L3" | undefined;
28
+ title?: string | undefined;
29
+ parentCode?: string | null | undefined;
30
+ changeSummary?: string | undefined;
31
+ affectedCriteria?: string[] | undefined;
32
+ newCode?: string | undefined;
33
+ }, {
34
+ code: string;
35
+ op: "ADDED" | "MODIFIED" | "REMOVED" | "RENAMED";
36
+ content?: string | undefined;
37
+ level?: "L0" | "L1" | "L2" | "L3" | undefined;
38
+ title?: string | undefined;
39
+ parentCode?: string | null | undefined;
40
+ changeSummary?: string | undefined;
41
+ affectedCriteria?: string[] | undefined;
42
+ newCode?: string | undefined;
43
+ }>;
44
+ export declare const DeltaSpecSchema: z.ZodObject<{
45
+ name: z.ZodString;
46
+ created: z.ZodOptional<z.ZodString>;
47
+ description: z.ZodOptional<z.ZodString>;
48
+ changes: z.ZodArray<z.ZodObject<{
49
+ op: z.ZodEnum<["ADDED", "MODIFIED", "REMOVED", "RENAMED"]>;
50
+ code: z.ZodString;
51
+ parentCode: z.ZodOptional<z.ZodNullable<z.ZodString>>;
52
+ level: z.ZodOptional<z.ZodEnum<["L0", "L1", "L2", "L3"]>>;
53
+ title: z.ZodOptional<z.ZodString>;
54
+ content: z.ZodOptional<z.ZodString>;
55
+ newCode: z.ZodOptional<z.ZodString>;
56
+ changeSummary: z.ZodOptional<z.ZodString>;
57
+ affectedCriteria: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
58
+ }, "strip", z.ZodTypeAny, {
59
+ code: string;
60
+ op: "ADDED" | "MODIFIED" | "REMOVED" | "RENAMED";
61
+ content?: string | undefined;
62
+ level?: "L0" | "L1" | "L2" | "L3" | undefined;
63
+ title?: string | undefined;
64
+ parentCode?: string | null | undefined;
65
+ changeSummary?: string | undefined;
66
+ affectedCriteria?: string[] | undefined;
67
+ newCode?: string | undefined;
68
+ }, {
69
+ code: string;
70
+ op: "ADDED" | "MODIFIED" | "REMOVED" | "RENAMED";
71
+ content?: string | undefined;
72
+ level?: "L0" | "L1" | "L2" | "L3" | undefined;
73
+ title?: string | undefined;
74
+ parentCode?: string | null | undefined;
75
+ changeSummary?: string | undefined;
76
+ affectedCriteria?: string[] | undefined;
77
+ newCode?: string | undefined;
78
+ }>, "many">;
79
+ }, "strip", z.ZodTypeAny, {
80
+ changes: {
81
+ code: string;
82
+ op: "ADDED" | "MODIFIED" | "REMOVED" | "RENAMED";
83
+ content?: string | undefined;
84
+ level?: "L0" | "L1" | "L2" | "L3" | undefined;
85
+ title?: string | undefined;
86
+ parentCode?: string | null | undefined;
87
+ changeSummary?: string | undefined;
88
+ affectedCriteria?: string[] | undefined;
89
+ newCode?: string | undefined;
90
+ }[];
91
+ name: string;
92
+ created?: string | undefined;
93
+ description?: string | undefined;
94
+ }, {
95
+ changes: {
96
+ code: string;
97
+ op: "ADDED" | "MODIFIED" | "REMOVED" | "RENAMED";
98
+ content?: string | undefined;
99
+ level?: "L0" | "L1" | "L2" | "L3" | undefined;
100
+ title?: string | undefined;
101
+ parentCode?: string | null | undefined;
102
+ changeSummary?: string | undefined;
103
+ affectedCriteria?: string[] | undefined;
104
+ newCode?: string | undefined;
105
+ }[];
106
+ name: string;
107
+ created?: string | undefined;
108
+ description?: string | undefined;
109
+ }>;
110
+ export declare const ProposalSchema: z.ZodObject<{
111
+ name: z.ZodString;
112
+ why: z.ZodString;
113
+ scope: z.ZodString;
114
+ risk: z.ZodOptional<z.ZodString>;
115
+ rollback: z.ZodOptional<z.ZodString>;
116
+ affectedCriteria: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
117
+ created: z.ZodOptional<z.ZodString>;
118
+ }, "strip", z.ZodTypeAny, {
119
+ name: string;
120
+ why: string;
121
+ scope: string;
122
+ created?: string | undefined;
123
+ affectedCriteria?: string[] | undefined;
124
+ risk?: string | undefined;
125
+ rollback?: string | undefined;
126
+ }, {
127
+ name: string;
128
+ why: string;
129
+ scope: string;
130
+ created?: string | undefined;
131
+ affectedCriteria?: string[] | undefined;
132
+ risk?: string | undefined;
133
+ rollback?: string | undefined;
134
+ }>;
135
+ export type ChangeEntry = z.infer<typeof ChangeEntrySchema>;
136
+ export type DeltaSpec = z.infer<typeof DeltaSpecSchema>;
137
+ export type Proposal = z.infer<typeof ProposalSchema>;
138
+ //# sourceMappingURL=change.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"change.d.ts","sourceRoot":"","sources":["../../src/schemas/change.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;;;;;;GAQG;AAEH,eAAO,MAAM,cAAc,wDAAsD,CAAC;AAClF,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAEvD,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAU5B,CAAC;AAEH,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAK1B,CAAC;AAEH,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;EAQzB,CAAC;AAEH,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAC5D,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AACxD,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC"}
@@ -0,0 +1,38 @@
1
+ import { z } from 'zod';
2
+ /**
3
+ * Delta spec 中每个 change 段的 schema。
4
+ * 必填字段:op(操作类型)、code(spec code)。
5
+ * 其它字段根据 op 不同而不同:
6
+ * ADDED: needs [parentCode, level, title, content]
7
+ * MODIFIED: needs [content] 或 [frontmatter patch]
8
+ * REMOVED: 无额外必填
9
+ * RENAMED: needs [newCode]
10
+ */
11
+ export const ChangeOpSchema = z.enum(['ADDED', 'MODIFIED', 'REMOVED', 'RENAMED']);
12
+ export const ChangeEntrySchema = z.object({
13
+ op: ChangeOpSchema,
14
+ code: z.string().min(1),
15
+ parentCode: z.string().nullable().optional(),
16
+ level: z.enum(['L0', 'L1', 'L2', 'L3']).optional(),
17
+ title: z.string().optional(),
18
+ content: z.string().optional(),
19
+ newCode: z.string().optional(),
20
+ changeSummary: z.string().optional(),
21
+ affectedCriteria: z.array(z.string()).optional(),
22
+ });
23
+ export const DeltaSpecSchema = z.object({
24
+ name: z.string().regex(/^[a-z0-9-]+$/, 'change name 必须小写字母/数字/短横线'),
25
+ created: z.string().optional(),
26
+ description: z.string().optional(),
27
+ changes: z.array(ChangeEntrySchema).min(1),
28
+ });
29
+ export const ProposalSchema = z.object({
30
+ name: z.string().regex(/^[a-z0-9-]+$/),
31
+ why: z.string().min(1, 'proposal.why 必填(说明动机)'),
32
+ scope: z.string().min(1, 'proposal.scope 必填(说明影响范围)'),
33
+ risk: z.string().optional(),
34
+ rollback: z.string().optional(),
35
+ affectedCriteria: z.array(z.string()).optional(),
36
+ created: z.string().optional(),
37
+ });
38
+ //# sourceMappingURL=change.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"change.js","sourceRoot":"","sources":["../../src/schemas/change.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;;;;;;GAQG;AAEH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;AAGlF,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC;IACxC,EAAE,EAAE,cAAc;IAClB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACvB,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IAC5C,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,QAAQ,EAAE;IAClD,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC5B,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC9B,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC9B,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACpC,gBAAgB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;CACjD,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC;IACtC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,cAAc,EAAE,2BAA2B,CAAC;IACnE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC9B,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAClC,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;CAC3C,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,CAAC;IACrC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,cAAc,CAAC;IACtC,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,uBAAuB,CAAC;IAC/C,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,2BAA2B,CAAC;IACrD,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC3B,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC/B,gBAAgB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IAChD,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAC/B,CAAC,CAAC"}
@@ -0,0 +1,233 @@
1
+ import { z } from 'zod';
2
+ export declare const SpecLevelSchema: z.ZodEnum<["L0", "L1", "L2", "L3"]>;
3
+ export type SpecLevelT = z.infer<typeof SpecLevelSchema>;
4
+ export declare const SpecStatusSchema: z.ZodEnum<["draft", "confirmed", "frozen", "implemented", "archived"]>;
5
+ export type SpecStatusT = z.infer<typeof SpecStatusSchema>;
6
+ export declare const StepStatusSchema: z.ZodEnum<["pending", "running", "succeeded", "failed", "skipped"]>;
7
+ export type StepStatusT = z.infer<typeof StepStatusSchema>;
8
+ export declare const StepTypeSchema: z.ZodEnum<["llm_call", "mcp_tool", "human_gate"]>;
9
+ export type StepTypeT = z.infer<typeof StepTypeSchema>;
10
+ export declare const StepFrontmatterSchema: z.ZodObject<{
11
+ stepNo: z.ZodUnion<[z.ZodNumber, z.ZodString]>;
12
+ stepType: z.ZodEnum<["llm_call", "mcp_tool", "human_gate"]>;
13
+ name: z.ZodString;
14
+ status: z.ZodDefault<z.ZodEnum<["pending", "running", "succeeded", "failed", "skipped"]>>;
15
+ toolName: z.ZodOptional<z.ZodString>;
16
+ inputJson: z.ZodOptional<z.ZodString>;
17
+ outputJson: z.ZodOptional<z.ZodString>;
18
+ errorCode: z.ZodOptional<z.ZodString>;
19
+ errorMessage: z.ZodOptional<z.ZodString>;
20
+ latencyMs: z.ZodOptional<z.ZodNumber>;
21
+ reportedAt: z.ZodOptional<z.ZodString>;
22
+ }, "strip", z.ZodTypeAny, {
23
+ stepNo: string | number;
24
+ stepType: "llm_call" | "mcp_tool" | "human_gate";
25
+ name: string;
26
+ status: "running" | "failed" | "pending" | "succeeded" | "skipped";
27
+ toolName?: string | undefined;
28
+ inputJson?: string | undefined;
29
+ outputJson?: string | undefined;
30
+ errorCode?: string | undefined;
31
+ errorMessage?: string | undefined;
32
+ latencyMs?: number | undefined;
33
+ reportedAt?: string | undefined;
34
+ }, {
35
+ stepNo: string | number;
36
+ stepType: "llm_call" | "mcp_tool" | "human_gate";
37
+ name: string;
38
+ status?: "running" | "failed" | "pending" | "succeeded" | "skipped" | undefined;
39
+ toolName?: string | undefined;
40
+ inputJson?: string | undefined;
41
+ outputJson?: string | undefined;
42
+ errorCode?: string | undefined;
43
+ errorMessage?: string | undefined;
44
+ latencyMs?: number | undefined;
45
+ reportedAt?: string | undefined;
46
+ }>;
47
+ export declare const SpecFrontmatterSchema: z.ZodObject<{
48
+ id: z.ZodOptional<z.ZodString>;
49
+ code: z.ZodString;
50
+ level: z.ZodEnum<["L0", "L1", "L2", "L3"]>;
51
+ title: z.ZodString;
52
+ topic: z.ZodString;
53
+ parentCode: z.ZodNullable<z.ZodString>;
54
+ status: z.ZodEnum<["draft", "confirmed", "frozen", "implemented", "archived"]>;
55
+ project: z.ZodDefault<z.ZodNumber>;
56
+ milestone: z.ZodOptional<z.ZodString>;
57
+ aiSummary: z.ZodDefault<z.ZodString>;
58
+ coveredTasks: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
59
+ steps: z.ZodOptional<z.ZodArray<z.ZodObject<{
60
+ stepNo: z.ZodUnion<[z.ZodNumber, z.ZodString]>;
61
+ stepType: z.ZodEnum<["llm_call", "mcp_tool", "human_gate"]>;
62
+ name: z.ZodString;
63
+ status: z.ZodDefault<z.ZodEnum<["pending", "running", "succeeded", "failed", "skipped"]>>;
64
+ toolName: z.ZodOptional<z.ZodString>;
65
+ inputJson: z.ZodOptional<z.ZodString>;
66
+ outputJson: z.ZodOptional<z.ZodString>;
67
+ errorCode: z.ZodOptional<z.ZodString>;
68
+ errorMessage: z.ZodOptional<z.ZodString>;
69
+ latencyMs: z.ZodOptional<z.ZodNumber>;
70
+ reportedAt: z.ZodOptional<z.ZodString>;
71
+ }, "strip", z.ZodTypeAny, {
72
+ stepNo: string | number;
73
+ stepType: "llm_call" | "mcp_tool" | "human_gate";
74
+ name: string;
75
+ status: "running" | "failed" | "pending" | "succeeded" | "skipped";
76
+ toolName?: string | undefined;
77
+ inputJson?: string | undefined;
78
+ outputJson?: string | undefined;
79
+ errorCode?: string | undefined;
80
+ errorMessage?: string | undefined;
81
+ latencyMs?: number | undefined;
82
+ reportedAt?: string | undefined;
83
+ }, {
84
+ stepNo: string | number;
85
+ stepType: "llm_call" | "mcp_tool" | "human_gate";
86
+ name: string;
87
+ status?: "running" | "failed" | "pending" | "succeeded" | "skipped" | undefined;
88
+ toolName?: string | undefined;
89
+ inputJson?: string | undefined;
90
+ outputJson?: string | undefined;
91
+ errorCode?: string | undefined;
92
+ errorMessage?: string | undefined;
93
+ latencyMs?: number | undefined;
94
+ reportedAt?: string | undefined;
95
+ }>, "many">>;
96
+ relations: z.ZodDefault<z.ZodArray<z.ZodObject<{
97
+ type: z.ZodEnum<["based_on", "supersedes", "implements", "references"]>;
98
+ target: z.ZodString;
99
+ }, "strip", z.ZodTypeAny, {
100
+ type: "based_on" | "supersedes" | "implements" | "references";
101
+ target: string;
102
+ }, {
103
+ type: "based_on" | "supersedes" | "implements" | "references";
104
+ target: string;
105
+ }>, "many">>;
106
+ created: z.ZodOptional<z.ZodString>;
107
+ updated: z.ZodOptional<z.ZodString>;
108
+ changeSummary: z.ZodOptional<z.ZodString>;
109
+ }, "strip", z.ZodTypeAny, {
110
+ project: number;
111
+ status: "draft" | "confirmed" | "frozen" | "implemented" | "archived";
112
+ topic: string;
113
+ code: string;
114
+ level: "L0" | "L1" | "L2" | "L3";
115
+ title: string;
116
+ parentCode: string | null;
117
+ aiSummary: string;
118
+ coveredTasks: string[];
119
+ relations: {
120
+ type: "based_on" | "supersedes" | "implements" | "references";
121
+ target: string;
122
+ }[];
123
+ steps?: {
124
+ stepNo: string | number;
125
+ stepType: "llm_call" | "mcp_tool" | "human_gate";
126
+ name: string;
127
+ status: "running" | "failed" | "pending" | "succeeded" | "skipped";
128
+ toolName?: string | undefined;
129
+ inputJson?: string | undefined;
130
+ outputJson?: string | undefined;
131
+ errorCode?: string | undefined;
132
+ errorMessage?: string | undefined;
133
+ latencyMs?: number | undefined;
134
+ reportedAt?: string | undefined;
135
+ }[] | undefined;
136
+ id?: string | undefined;
137
+ milestone?: string | undefined;
138
+ created?: string | undefined;
139
+ updated?: string | undefined;
140
+ changeSummary?: string | undefined;
141
+ }, {
142
+ status: "draft" | "confirmed" | "frozen" | "implemented" | "archived";
143
+ topic: string;
144
+ code: string;
145
+ level: "L0" | "L1" | "L2" | "L3";
146
+ title: string;
147
+ parentCode: string | null;
148
+ project?: number | undefined;
149
+ steps?: {
150
+ stepNo: string | number;
151
+ stepType: "llm_call" | "mcp_tool" | "human_gate";
152
+ name: string;
153
+ status?: "running" | "failed" | "pending" | "succeeded" | "skipped" | undefined;
154
+ toolName?: string | undefined;
155
+ inputJson?: string | undefined;
156
+ outputJson?: string | undefined;
157
+ errorCode?: string | undefined;
158
+ errorMessage?: string | undefined;
159
+ latencyMs?: number | undefined;
160
+ reportedAt?: string | undefined;
161
+ }[] | undefined;
162
+ id?: string | undefined;
163
+ milestone?: string | undefined;
164
+ aiSummary?: string | undefined;
165
+ coveredTasks?: string[] | undefined;
166
+ relations?: {
167
+ type: "based_on" | "supersedes" | "implements" | "references";
168
+ target: string;
169
+ }[] | undefined;
170
+ created?: string | undefined;
171
+ updated?: string | undefined;
172
+ changeSummary?: string | undefined;
173
+ }>;
174
+ export declare const PlanStepSchema: z.ZodObject<{
175
+ stepNo: z.ZodUnion<[z.ZodNumber, z.ZodString]>;
176
+ stepType: z.ZodEnum<["llm_call", "mcp_tool", "human_gate"]>;
177
+ name: z.ZodString;
178
+ }, "strip", z.ZodTypeAny, {
179
+ stepNo: string | number;
180
+ stepType: "llm_call" | "mcp_tool" | "human_gate";
181
+ name: string;
182
+ }, {
183
+ stepNo: string | number;
184
+ stepType: "llm_call" | "mcp_tool" | "human_gate";
185
+ name: string;
186
+ }>;
187
+ export declare const PlanJsonSchema: z.ZodObject<{
188
+ coveredSpecs: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
189
+ steps: z.ZodArray<z.ZodObject<{
190
+ stepNo: z.ZodUnion<[z.ZodNumber, z.ZodString]>;
191
+ stepType: z.ZodEnum<["llm_call", "mcp_tool", "human_gate"]>;
192
+ name: z.ZodString;
193
+ }, "strip", z.ZodTypeAny, {
194
+ stepNo: string | number;
195
+ stepType: "llm_call" | "mcp_tool" | "human_gate";
196
+ name: string;
197
+ }, {
198
+ stepNo: string | number;
199
+ stepType: "llm_call" | "mcp_tool" | "human_gate";
200
+ name: string;
201
+ }>, "many">;
202
+ }, "strip", z.ZodTypeAny, {
203
+ steps: {
204
+ stepNo: string | number;
205
+ stepType: "llm_call" | "mcp_tool" | "human_gate";
206
+ name: string;
207
+ }[];
208
+ coveredSpecs?: string[] | undefined;
209
+ }, {
210
+ steps: {
211
+ stepNo: string | number;
212
+ stepType: "llm_call" | "mcp_tool" | "human_gate";
213
+ name: string;
214
+ }[];
215
+ coveredSpecs?: string[] | undefined;
216
+ }>;
217
+ export declare const DecisionInputSchema: z.ZodObject<{
218
+ topic: z.ZodString;
219
+ what: z.ZodString;
220
+ why: z.ZodOptional<z.ZodString>;
221
+ affectedCriteria: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
222
+ }, "strip", z.ZodTypeAny, {
223
+ topic: string;
224
+ what: string;
225
+ why?: string | undefined;
226
+ affectedCriteria?: string[] | undefined;
227
+ }, {
228
+ topic: string;
229
+ what: string;
230
+ why?: string | undefined;
231
+ affectedCriteria?: string[] | undefined;
232
+ }>;
233
+ //# sourceMappingURL=spec.d.ts.map