specdo 1.0.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.
Files changed (161) hide show
  1. package/CHANGELOG.md +139 -0
  2. package/README.md +308 -0
  3. package/README.zh-CN.md +306 -0
  4. package/bin/specdo.js +3 -0
  5. package/dist/cli/index.d.ts +15 -0
  6. package/dist/cli/index.d.ts.map +1 -0
  7. package/dist/cli/index.js +297 -0
  8. package/dist/cli/index.js.map +1 -0
  9. package/dist/commands/_shared.d.ts +45 -0
  10. package/dist/commands/_shared.d.ts.map +1 -0
  11. package/dist/commands/_shared.js +124 -0
  12. package/dist/commands/_shared.js.map +1 -0
  13. package/dist/commands/apply.d.ts +30 -0
  14. package/dist/commands/apply.d.ts.map +1 -0
  15. package/dist/commands/apply.js +393 -0
  16. package/dist/commands/apply.js.map +1 -0
  17. package/dist/commands/archive.d.ts +25 -0
  18. package/dist/commands/archive.d.ts.map +1 -0
  19. package/dist/commands/archive.js +362 -0
  20. package/dist/commands/archive.js.map +1 -0
  21. package/dist/commands/doctor.d.ts +21 -0
  22. package/dist/commands/doctor.d.ts.map +1 -0
  23. package/dist/commands/doctor.js +180 -0
  24. package/dist/commands/doctor.js.map +1 -0
  25. package/dist/commands/domains.d.ts +14 -0
  26. package/dist/commands/domains.d.ts.map +1 -0
  27. package/dist/commands/domains.js +107 -0
  28. package/dist/commands/domains.js.map +1 -0
  29. package/dist/commands/explore.d.ts +48 -0
  30. package/dist/commands/explore.d.ts.map +1 -0
  31. package/dist/commands/explore.js +378 -0
  32. package/dist/commands/explore.js.map +1 -0
  33. package/dist/commands/init.d.ts +45 -0
  34. package/dist/commands/init.d.ts.map +1 -0
  35. package/dist/commands/init.js +243 -0
  36. package/dist/commands/init.js.map +1 -0
  37. package/dist/commands/list.d.ts +23 -0
  38. package/dist/commands/list.d.ts.map +1 -0
  39. package/dist/commands/list.js +135 -0
  40. package/dist/commands/list.js.map +1 -0
  41. package/dist/commands/propose.d.ts +22 -0
  42. package/dist/commands/propose.d.ts.map +1 -0
  43. package/dist/commands/propose.js +316 -0
  44. package/dist/commands/propose.js.map +1 -0
  45. package/dist/commands/show.d.ts +15 -0
  46. package/dist/commands/show.d.ts.map +1 -0
  47. package/dist/commands/show.js +214 -0
  48. package/dist/commands/show.js.map +1 -0
  49. package/dist/commands/status.d.ts +17 -0
  50. package/dist/commands/status.d.ts.map +1 -0
  51. package/dist/commands/status.js +146 -0
  52. package/dist/commands/status.js.map +1 -0
  53. package/dist/commands/sync.d.ts +21 -0
  54. package/dist/commands/sync.d.ts.map +1 -0
  55. package/dist/commands/sync.js +113 -0
  56. package/dist/commands/sync.js.map +1 -0
  57. package/dist/commands/validate.d.ts +117 -0
  58. package/dist/commands/validate.d.ts.map +1 -0
  59. package/dist/commands/validate.js +446 -0
  60. package/dist/commands/validate.js.map +1 -0
  61. package/dist/core/apply-brief-renderer.d.ts +35 -0
  62. package/dist/core/apply-brief-renderer.d.ts.map +1 -0
  63. package/dist/core/apply-brief-renderer.js +242 -0
  64. package/dist/core/apply-brief-renderer.js.map +1 -0
  65. package/dist/core/config-store.d.ts +190 -0
  66. package/dist/core/config-store.d.ts.map +1 -0
  67. package/dist/core/config-store.js +280 -0
  68. package/dist/core/config-store.js.map +1 -0
  69. package/dist/core/context-store.d.ts +96 -0
  70. package/dist/core/context-store.d.ts.map +1 -0
  71. package/dist/core/context-store.js +426 -0
  72. package/dist/core/context-store.js.map +1 -0
  73. package/dist/core/json-schemas.d.ts +349 -0
  74. package/dist/core/json-schemas.d.ts.map +1 -0
  75. package/dist/core/json-schemas.js +125 -0
  76. package/dist/core/json-schemas.js.map +1 -0
  77. package/dist/core/skill-content/cross-domain.d.ts +12 -0
  78. package/dist/core/skill-content/cross-domain.d.ts.map +1 -0
  79. package/dist/core/skill-content/cross-domain.js +291 -0
  80. package/dist/core/skill-content/cross-domain.js.map +1 -0
  81. package/dist/core/skill-content/protocol-examples.d.ts +13 -0
  82. package/dist/core/skill-content/protocol-examples.d.ts.map +1 -0
  83. package/dist/core/skill-content/protocol-examples.js +190 -0
  84. package/dist/core/skill-content/protocol-examples.js.map +1 -0
  85. package/dist/core/skill-content/workflow-content.d.ts +25 -0
  86. package/dist/core/skill-content/workflow-content.d.ts.map +1 -0
  87. package/dist/core/skill-content/workflow-content.js +1572 -0
  88. package/dist/core/skill-content/workflow-content.js.map +1 -0
  89. package/dist/core/skill-exporter.d.ts +186 -0
  90. package/dist/core/skill-exporter.d.ts.map +1 -0
  91. package/dist/core/skill-exporter.js +922 -0
  92. package/dist/core/skill-exporter.js.map +1 -0
  93. package/dist/core/spec-sync.d.ts +65 -0
  94. package/dist/core/spec-sync.d.ts.map +1 -0
  95. package/dist/core/spec-sync.js +226 -0
  96. package/dist/core/spec-sync.js.map +1 -0
  97. package/dist/core/task-parser.d.ts +58 -0
  98. package/dist/core/task-parser.d.ts.map +1 -0
  99. package/dist/core/task-parser.js +244 -0
  100. package/dist/core/task-parser.js.map +1 -0
  101. package/dist/core/template-renderer.d.ts +51 -0
  102. package/dist/core/template-renderer.d.ts.map +1 -0
  103. package/dist/core/template-renderer.js +362 -0
  104. package/dist/core/template-renderer.js.map +1 -0
  105. package/dist/domains/architecture.d.ts +34 -0
  106. package/dist/domains/architecture.d.ts.map +1 -0
  107. package/dist/domains/architecture.js +341 -0
  108. package/dist/domains/architecture.js.map +1 -0
  109. package/dist/domains/backend.d.ts +35 -0
  110. package/dist/domains/backend.d.ts.map +1 -0
  111. package/dist/domains/backend.js +367 -0
  112. package/dist/domains/backend.js.map +1 -0
  113. package/dist/domains/frontend.d.ts +36 -0
  114. package/dist/domains/frontend.d.ts.map +1 -0
  115. package/dist/domains/frontend.js +373 -0
  116. package/dist/domains/frontend.js.map +1 -0
  117. package/dist/domains/index.d.ts +49 -0
  118. package/dist/domains/index.d.ts.map +1 -0
  119. package/dist/domains/index.js +255 -0
  120. package/dist/domains/index.js.map +1 -0
  121. package/dist/domains/operations.d.ts +37 -0
  122. package/dist/domains/operations.d.ts.map +1 -0
  123. package/dist/domains/operations.js +344 -0
  124. package/dist/domains/operations.js.map +1 -0
  125. package/dist/domains/pool-ranking.d.ts +43 -0
  126. package/dist/domains/pool-ranking.d.ts.map +1 -0
  127. package/dist/domains/pool-ranking.js +153 -0
  128. package/dist/domains/pool-ranking.js.map +1 -0
  129. package/dist/domains/quality.d.ts +45 -0
  130. package/dist/domains/quality.d.ts.map +1 -0
  131. package/dist/domains/quality.js +368 -0
  132. package/dist/domains/quality.js.map +1 -0
  133. package/dist/domains/security.d.ts +19 -0
  134. package/dist/domains/security.d.ts.map +1 -0
  135. package/dist/domains/security.js +364 -0
  136. package/dist/domains/security.js.map +1 -0
  137. package/dist/domains/signal-match.d.ts +25 -0
  138. package/dist/domains/signal-match.d.ts.map +1 -0
  139. package/dist/domains/signal-match.js +67 -0
  140. package/dist/domains/signal-match.js.map +1 -0
  141. package/dist/domains/types.d.ts +354 -0
  142. package/dist/domains/types.d.ts.map +1 -0
  143. package/dist/domains/types.js +12 -0
  144. package/dist/domains/types.js.map +1 -0
  145. package/dist/index.d.ts +9 -0
  146. package/dist/index.d.ts.map +1 -0
  147. package/dist/index.js +9 -0
  148. package/dist/index.js.map +1 -0
  149. package/dist/protocols/index.d.ts +36 -0
  150. package/dist/protocols/index.d.ts.map +1 -0
  151. package/dist/protocols/index.js +85 -0
  152. package/dist/protocols/index.js.map +1 -0
  153. package/dist/protocols/review-to-solid.d.ts +32 -0
  154. package/dist/protocols/review-to-solid.d.ts.map +1 -0
  155. package/dist/protocols/review-to-solid.js +309 -0
  156. package/dist/protocols/review-to-solid.js.map +1 -0
  157. package/dist/utils/prompt.d.ts +37 -0
  158. package/dist/utils/prompt.d.ts.map +1 -0
  159. package/dist/utils/prompt.js +81 -0
  160. package/dist/utils/prompt.js.map +1 -0
  161. package/package.json +80 -0
@@ -0,0 +1,242 @@
1
+ /**
2
+ * apply-brief-renderer — apply-brief.md 渲染器
3
+ *
4
+ * 渲染顺序遵循 phases/03-phase2-commands.md §`apply-brief.md 内容模板`:
5
+ *
6
+ * 1. 标题 + 进度(completed/total)
7
+ * 2. 当前任务(基于 tasks.md 第一个未完成任务)
8
+ * 3. Domain Focus(聚合所有命中领域的 implement.focusAreas)
9
+ * 4. Execution Discipline (TDD)
10
+ * - 默认:3 步红绿重构
11
+ * - 若 quality protocol 命中:替换为 review-to-solid 顺序工作流
12
+ * 5. Verification Gates(test/lint/manual)
13
+ * 6. Guardrails(领域 antiPatterns)
14
+ * 7. Evidence 提示
15
+ *
16
+ * 设计要点:
17
+ * - 命令层负责选择哪些 domain / protocol 注入;本模块仅做无状态渲染
18
+ * - 输出确定性:相同输入相同字符串(顺序、空行、分隔符);测试必须可
19
+ * 断言完整字符串
20
+ * - 完成态(all-done)展示祝贺 + 下一步指引(sync / archive)
21
+ */
22
+ export function renderApplyBrief(input) {
23
+ const total = input.tasks.length;
24
+ const completed = input.tasks.filter((t) => t.completed).length;
25
+ const lines = [];
26
+ lines.push(`# Apply Brief: ${input.changeName}`);
27
+ lines.push('');
28
+ lines.push(`**Progress**: ${completed}/${total} tasks complete`);
29
+ lines.push('');
30
+ lines.push(`<!-- generatedAt: ${input.generatedAt} -->`);
31
+ lines.push('');
32
+ if (total === 0) {
33
+ lines.push('> No tasks defined yet. Edit tasks.md to add `- [ ] 1.1 <title>` entries.');
34
+ lines.push('');
35
+ return lines.join('\n');
36
+ }
37
+ if (completed === total) {
38
+ lines.push('## ✅ All tasks complete');
39
+ lines.push('');
40
+ lines.push('Run the following to finalize:');
41
+ lines.push('');
42
+ lines.push('```');
43
+ lines.push(`specdo sync --change ${input.changeName}`);
44
+ lines.push(`specdo archive --change ${input.changeName}`);
45
+ lines.push('```');
46
+ lines.push('');
47
+ return lines.join('\n');
48
+ }
49
+ const currentNumber = input.currentTaskNumber ?? input.tasks.find((t) => !t.completed)?.number ?? null;
50
+ const currentTask = currentNumber !== null ? input.tasks.find((t) => t.number === currentNumber) : null;
51
+ lines.push(`## Current Task: ${currentTask ? `${currentTask.number} ${currentTask.title}` : '(none selected)'}`);
52
+ lines.push('');
53
+ // ─── Domain Focus ───
54
+ lines.push('### Domain Focus');
55
+ lines.push('');
56
+ const focusAreas = aggregateFocusAreas(input.domains);
57
+ if (focusAreas.length === 0) {
58
+ lines.push('_No focus areas injected from domains._');
59
+ }
60
+ else {
61
+ for (const item of focusAreas) {
62
+ lines.push(`- ${item}`);
63
+ }
64
+ }
65
+ lines.push('');
66
+ // ─── Patterns ───
67
+ lines.push('### Patterns');
68
+ lines.push('');
69
+ const patterns = aggregatePatterns(input.domains);
70
+ if (patterns.length === 0) {
71
+ lines.push('_No patterns injected from domains._');
72
+ }
73
+ else {
74
+ for (const item of patterns) {
75
+ lines.push(`- **${item.name}** (${item.domain}): ${item.description}`);
76
+ }
77
+ }
78
+ lines.push('');
79
+ // ─── Execution Discipline ───
80
+ lines.push('### Execution Discipline');
81
+ lines.push('');
82
+ if (input.protocol) {
83
+ lines.push(`> Driven by protocol: **${input.protocol.name}** — ${input.protocol.goal}`);
84
+ lines.push('');
85
+ for (const step of input.protocol.workflow) {
86
+ lines.push(`${step.step}. **${step.title}** — ${step.goal}`);
87
+ for (const action of step.actions) {
88
+ lines.push(` - ${action}`);
89
+ }
90
+ if (step.exitCriteria && step.exitCriteria.length > 0) {
91
+ lines.push(` - _Exit when_: ${step.exitCriteria.join('; ')}`);
92
+ }
93
+ if (step.loopBackTo && step.loopBackTo.length > 0) {
94
+ lines.push(` - _Loop back to_: ${step.loopBackTo.join(', ')} until convergence`);
95
+ }
96
+ }
97
+ appendProtocolContract(lines, input.protocol);
98
+ }
99
+ else {
100
+ lines.push('1. [ ] **Write failing test** — confirm it fails for the right reason');
101
+ lines.push('2. [ ] **Minimal implementation** — make the test pass');
102
+ lines.push('3. [ ] **Refactor** — improve design while keeping tests green');
103
+ }
104
+ lines.push('');
105
+ // ─── Verification Gates ───
106
+ lines.push('### Verification Gates');
107
+ lines.push('');
108
+ lines.push('- [ ] `pnpm test` passes (or workspace equivalent)');
109
+ lines.push('- [ ] `pnpm lint` passes');
110
+ const verifyItems = aggregateVerifyChecklist(input.domains);
111
+ for (const item of verifyItems) {
112
+ lines.push(`- [ ] ${item}`);
113
+ }
114
+ lines.push('');
115
+ // ─── Guardrails ───
116
+ lines.push('### Guardrails');
117
+ lines.push('');
118
+ const guardrails = aggregateAntiPatterns(input.domains);
119
+ if (input.protocol?.prohibitions && input.protocol.prohibitions.length > 0) {
120
+ for (const item of input.protocol.prohibitions) {
121
+ guardrails.push(`(${input.protocol.name}) ${item}`);
122
+ }
123
+ }
124
+ if (guardrails.length === 0) {
125
+ lines.push('_No guardrails injected from domains or protocols._');
126
+ }
127
+ else {
128
+ for (const item of guardrails) {
129
+ lines.push(`- ⚠️ ${item}`);
130
+ }
131
+ }
132
+ lines.push('');
133
+ // ─── Evidence reminder ───
134
+ lines.push('### Evidence');
135
+ lines.push('');
136
+ if (currentTask) {
137
+ lines.push('To mark this task complete:');
138
+ lines.push('');
139
+ lines.push('```');
140
+ lines.push(`specdo apply --change ${input.changeName} --done ${currentTask.number} --evidence "<test output / lint result / manual check>"`);
141
+ lines.push('```');
142
+ }
143
+ else {
144
+ lines.push('Use `specdo apply --done N --evidence "<...>"` for each task.');
145
+ }
146
+ lines.push('');
147
+ return lines.join('\n');
148
+ }
149
+ // ─── helpers ────────────────────────────────────────────────────
150
+ function aggregateFocusAreas(domains) {
151
+ const out = [];
152
+ const seen = new Set();
153
+ for (const domain of domains) {
154
+ for (const item of domain.implement?.focusAreas ?? []) {
155
+ if (seen.has(item))
156
+ continue;
157
+ seen.add(item);
158
+ out.push(`(${domain.name}) ${item}`);
159
+ }
160
+ }
161
+ return out;
162
+ }
163
+ function aggregateVerifyChecklist(domains) {
164
+ const out = [];
165
+ const seen = new Set();
166
+ for (const domain of domains) {
167
+ for (const item of domain.verify?.checklist ?? []) {
168
+ if (seen.has(item))
169
+ continue;
170
+ seen.add(item);
171
+ out.push(`(${domain.name}) ${item}`);
172
+ }
173
+ }
174
+ return out;
175
+ }
176
+ function aggregateAntiPatterns(domains) {
177
+ const out = [];
178
+ const seen = new Set();
179
+ for (const domain of domains) {
180
+ const all = [...(domain.design?.antiPatterns ?? []), ...(domain.implement?.antiPatterns ?? [])];
181
+ for (const item of all) {
182
+ if (seen.has(item))
183
+ continue;
184
+ seen.add(item);
185
+ out.push(`(${domain.name}) ${item}`);
186
+ }
187
+ }
188
+ return out;
189
+ }
190
+ function aggregatePatterns(domains) {
191
+ const out = [];
192
+ const seen = new Set();
193
+ for (const domain of domains) {
194
+ const patterns = domain.implement?.patterns;
195
+ if (!patterns)
196
+ continue;
197
+ for (const [name, description] of Object.entries(patterns)) {
198
+ if (seen.has(name))
199
+ continue;
200
+ seen.add(name);
201
+ out.push({ name, domain: domain.name, description });
202
+ }
203
+ }
204
+ return out;
205
+ }
206
+ function appendProtocolContract(lines, protocol) {
207
+ if (protocol.severityLevels && Object.keys(protocol.severityLevels).length > 0) {
208
+ lines.push('');
209
+ lines.push('#### Protocol Severity Levels');
210
+ for (const [level, description] of Object.entries(protocol.severityLevels)) {
211
+ lines.push(`- **${level}**: ${description}`);
212
+ }
213
+ }
214
+ if (protocol.stopConditions.length > 0) {
215
+ lines.push('');
216
+ lines.push('#### Protocol Stop Conditions');
217
+ for (const condition of protocol.stopConditions) {
218
+ lines.push(`- ${condition}`);
219
+ }
220
+ }
221
+ if (protocol.outputContract.length > 0) {
222
+ lines.push('');
223
+ lines.push('#### Protocol Output Contract');
224
+ for (const section of protocol.outputContract) {
225
+ const required = section.required ? 'required' : 'conditional';
226
+ lines.push(`- **${section.name}** (${required}, ${section.format}): ${section.description}`);
227
+ }
228
+ }
229
+ if (protocol.generalConstraints && protocol.generalConstraints.length > 0) {
230
+ lines.push('');
231
+ lines.push('#### Protocol General Constraints');
232
+ for (const constraint of protocol.generalConstraints) {
233
+ lines.push(`- ${constraint}`);
234
+ }
235
+ }
236
+ if (protocol.artifactChecklists && Object.keys(protocol.artifactChecklists).length > 0) {
237
+ lines.push('');
238
+ lines.push('#### Protocol Artifact Checklists Available');
239
+ lines.push(`- ${Object.keys(protocol.artifactChecklists).join(', ')}`);
240
+ }
241
+ }
242
+ //# sourceMappingURL=apply-brief-renderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apply-brief-renderer.js","sourceRoot":"","sources":["../../src/core/apply-brief-renderer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,190 @@
1
+ /**
2
+ * ConfigStore — `specdo/config.yaml` 唯一读写入口
3
+ *
4
+ * 设计要点(与 phases/03-phase2-commands.md §`config.overrides 最低契约` 完全对齐):
5
+ *
6
+ * 1. **Schema 定义**:使用 Zod 描述当前 config 顶层结构与 overrides 树
7
+ * 2. **`enabled: false`**:禁用指定 stage(不是删整个 domain),renderer 跳过注入
8
+ * 3. **override action 三选一**:同一 item 必须且只能包含 prepend / append / replace 之一
9
+ * 4. **未知 domain / stage / field**:必须由 validate 报错(friendly path)
10
+ * 5. **优先级**:内置 domain → config.overrides 深合并;CLI 参数不得临时改写 domain
11
+ *
12
+ * 模块只读,写入由 init 命令处理。
13
+ */
14
+ import { z } from 'zod';
15
+ import type { DomainModule } from '../domains/types.js';
16
+ declare const stageOverridesSchema: z.ZodObject<{
17
+ enabled: z.ZodOptional<z.ZodBoolean>;
18
+ questions: z.ZodOptional<z.ZodArray<z.ZodObject<{
19
+ prepend: z.ZodOptional<z.ZodString>;
20
+ append: z.ZodOptional<z.ZodString>;
21
+ replace: z.ZodOptional<z.ZodString>;
22
+ }, z.core.$strict>>>;
23
+ checklist: z.ZodOptional<z.ZodArray<z.ZodObject<{
24
+ prepend: z.ZodOptional<z.ZodString>;
25
+ append: z.ZodOptional<z.ZodString>;
26
+ replace: z.ZodOptional<z.ZodString>;
27
+ }, z.core.$strict>>>;
28
+ focusAreas: z.ZodOptional<z.ZodArray<z.ZodObject<{
29
+ prepend: z.ZodOptional<z.ZodString>;
30
+ append: z.ZodOptional<z.ZodString>;
31
+ replace: z.ZodOptional<z.ZodString>;
32
+ }, z.core.$strict>>>;
33
+ antiPatterns: z.ZodOptional<z.ZodArray<z.ZodObject<{
34
+ prepend: z.ZodOptional<z.ZodString>;
35
+ append: z.ZodOptional<z.ZodString>;
36
+ replace: z.ZodOptional<z.ZodString>;
37
+ }, z.core.$strict>>>;
38
+ patterns: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
39
+ }, z.core.$strict>;
40
+ declare const configSchema: z.ZodObject<{
41
+ domainVersion: z.ZodString;
42
+ overrides: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
43
+ explore: z.ZodOptional<z.ZodObject<{
44
+ enabled: z.ZodOptional<z.ZodBoolean>;
45
+ questions: z.ZodOptional<z.ZodArray<z.ZodObject<{
46
+ prepend: z.ZodOptional<z.ZodString>;
47
+ append: z.ZodOptional<z.ZodString>;
48
+ replace: z.ZodOptional<z.ZodString>;
49
+ }, z.core.$strict>>>;
50
+ checklist: z.ZodOptional<z.ZodArray<z.ZodObject<{
51
+ prepend: z.ZodOptional<z.ZodString>;
52
+ append: z.ZodOptional<z.ZodString>;
53
+ replace: z.ZodOptional<z.ZodString>;
54
+ }, z.core.$strict>>>;
55
+ focusAreas: z.ZodOptional<z.ZodArray<z.ZodObject<{
56
+ prepend: z.ZodOptional<z.ZodString>;
57
+ append: z.ZodOptional<z.ZodString>;
58
+ replace: z.ZodOptional<z.ZodString>;
59
+ }, z.core.$strict>>>;
60
+ antiPatterns: z.ZodOptional<z.ZodArray<z.ZodObject<{
61
+ prepend: z.ZodOptional<z.ZodString>;
62
+ append: z.ZodOptional<z.ZodString>;
63
+ replace: z.ZodOptional<z.ZodString>;
64
+ }, z.core.$strict>>>;
65
+ patterns: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
66
+ }, z.core.$strict>>;
67
+ design: z.ZodOptional<z.ZodObject<{
68
+ enabled: z.ZodOptional<z.ZodBoolean>;
69
+ questions: z.ZodOptional<z.ZodArray<z.ZodObject<{
70
+ prepend: z.ZodOptional<z.ZodString>;
71
+ append: z.ZodOptional<z.ZodString>;
72
+ replace: z.ZodOptional<z.ZodString>;
73
+ }, z.core.$strict>>>;
74
+ checklist: z.ZodOptional<z.ZodArray<z.ZodObject<{
75
+ prepend: z.ZodOptional<z.ZodString>;
76
+ append: z.ZodOptional<z.ZodString>;
77
+ replace: z.ZodOptional<z.ZodString>;
78
+ }, z.core.$strict>>>;
79
+ focusAreas: z.ZodOptional<z.ZodArray<z.ZodObject<{
80
+ prepend: z.ZodOptional<z.ZodString>;
81
+ append: z.ZodOptional<z.ZodString>;
82
+ replace: z.ZodOptional<z.ZodString>;
83
+ }, z.core.$strict>>>;
84
+ antiPatterns: z.ZodOptional<z.ZodArray<z.ZodObject<{
85
+ prepend: z.ZodOptional<z.ZodString>;
86
+ append: z.ZodOptional<z.ZodString>;
87
+ replace: z.ZodOptional<z.ZodString>;
88
+ }, z.core.$strict>>>;
89
+ patterns: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
90
+ }, z.core.$strict>>;
91
+ implement: z.ZodOptional<z.ZodObject<{
92
+ enabled: z.ZodOptional<z.ZodBoolean>;
93
+ questions: z.ZodOptional<z.ZodArray<z.ZodObject<{
94
+ prepend: z.ZodOptional<z.ZodString>;
95
+ append: z.ZodOptional<z.ZodString>;
96
+ replace: z.ZodOptional<z.ZodString>;
97
+ }, z.core.$strict>>>;
98
+ checklist: z.ZodOptional<z.ZodArray<z.ZodObject<{
99
+ prepend: z.ZodOptional<z.ZodString>;
100
+ append: z.ZodOptional<z.ZodString>;
101
+ replace: z.ZodOptional<z.ZodString>;
102
+ }, z.core.$strict>>>;
103
+ focusAreas: z.ZodOptional<z.ZodArray<z.ZodObject<{
104
+ prepend: z.ZodOptional<z.ZodString>;
105
+ append: z.ZodOptional<z.ZodString>;
106
+ replace: z.ZodOptional<z.ZodString>;
107
+ }, z.core.$strict>>>;
108
+ antiPatterns: z.ZodOptional<z.ZodArray<z.ZodObject<{
109
+ prepend: z.ZodOptional<z.ZodString>;
110
+ append: z.ZodOptional<z.ZodString>;
111
+ replace: z.ZodOptional<z.ZodString>;
112
+ }, z.core.$strict>>>;
113
+ patterns: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
114
+ }, z.core.$strict>>;
115
+ verify: z.ZodOptional<z.ZodObject<{
116
+ enabled: z.ZodOptional<z.ZodBoolean>;
117
+ questions: z.ZodOptional<z.ZodArray<z.ZodObject<{
118
+ prepend: z.ZodOptional<z.ZodString>;
119
+ append: z.ZodOptional<z.ZodString>;
120
+ replace: z.ZodOptional<z.ZodString>;
121
+ }, z.core.$strict>>>;
122
+ checklist: z.ZodOptional<z.ZodArray<z.ZodObject<{
123
+ prepend: z.ZodOptional<z.ZodString>;
124
+ append: z.ZodOptional<z.ZodString>;
125
+ replace: z.ZodOptional<z.ZodString>;
126
+ }, z.core.$strict>>>;
127
+ focusAreas: z.ZodOptional<z.ZodArray<z.ZodObject<{
128
+ prepend: z.ZodOptional<z.ZodString>;
129
+ append: z.ZodOptional<z.ZodString>;
130
+ replace: z.ZodOptional<z.ZodString>;
131
+ }, z.core.$strict>>>;
132
+ antiPatterns: z.ZodOptional<z.ZodArray<z.ZodObject<{
133
+ prepend: z.ZodOptional<z.ZodString>;
134
+ append: z.ZodOptional<z.ZodString>;
135
+ replace: z.ZodOptional<z.ZodString>;
136
+ }, z.core.$strict>>>;
137
+ patterns: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
138
+ }, z.core.$strict>>;
139
+ }, z.core.$strict>>>;
140
+ }, z.core.$strict>;
141
+ export type SpecdoConfig = z.infer<typeof configSchema>;
142
+ export type StageOverridesParsed = z.infer<typeof stageOverridesSchema>;
143
+ export interface ConfigIssue {
144
+ /** human-readable JSON path, e.g. `overrides.security.design.checklist[0]` */
145
+ path: string;
146
+ message: string;
147
+ }
148
+ export interface ConfigLoadResult {
149
+ /** 原始 YAML 解析结果(用于 doctor 等需要查看原文的命令) */
150
+ raw: unknown;
151
+ /** 校验通过的 typed config;schema 错误时为 null */
152
+ config: SpecdoConfig | null;
153
+ /** 校验问题列表;为空表示 config 完全合法 */
154
+ issues: ConfigIssue[];
155
+ }
156
+ export interface ResolvedDomain {
157
+ /** override 应用后的 DomainModule */
158
+ domain: DomainModule;
159
+ /** 是否有任意 stage 被 enabled=false 禁用 */
160
+ hasDisabledStages: boolean;
161
+ /** 各 stage 的 override 统计 */
162
+ overrideCounts: {
163
+ stage: 'explore' | 'design' | 'implement' | 'verify';
164
+ appended: number;
165
+ prepended: number;
166
+ replaced: number;
167
+ patternsAdded: number;
168
+ enabled: boolean;
169
+ }[];
170
+ }
171
+ /**
172
+ * 加载并校验 specdo/config.yaml。
173
+ *
174
+ * - 文件不存在 → issues=[NOT_FOUND],config=null
175
+ * - YAML parse 失败 → issues=[YAML],config=null
176
+ * - Zod schema 失败 → issues=[zod paths],config=null
177
+ * - 未知 domain / stage / field → 由 strict() + 自定义校验产出 friendly path
178
+ */
179
+ export declare function loadConfig(cwd: string): ConfigLoadResult;
180
+ /**
181
+ * 应用项目级 overrides,返回所有可用领域(按 ALL_DOMAINS 顺序),含统计信息。
182
+ *
183
+ * 即使有 issues 也尽量产出可用 ResolvedDomain(issues 由调用方 validate 报告)。
184
+ */
185
+ export declare function resolveDomains(config: SpecdoConfig | null | undefined): ResolvedDomain[];
186
+ export declare function getResolvedDomain(config: SpecdoConfig | null | undefined, name: string): ResolvedDomain | undefined;
187
+ /** locate specdo/config.{yaml,yml}; null if neither exists */
188
+ export declare function locateConfigPath(cwd: string): string | null;
189
+ export {};
190
+ //# sourceMappingURL=config-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-store.d.ts","sourceRoot":"","sources":["../../src/core/config-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAKH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAMxB,OAAO,KAAK,EAAE,YAAY,EAAiC,MAAM,qBAAqB,CAAC;AAsBvF,QAAA,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;kBA2Bf,CAAC;AAWZ,QAAA,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAKP,CAAC;AAEZ,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AACxD,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAIxE,MAAM,WAAW,WAAW;IAC1B,8EAA8E;IAC9E,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,yCAAyC;IACzC,GAAG,EAAE,OAAO,CAAC;IACb,0CAA0C;IAC1C,MAAM,EAAE,YAAY,GAAG,IAAI,CAAC;IAC5B,8BAA8B;IAC9B,MAAM,EAAE,WAAW,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,cAAc;IAC7B,iCAAiC;IACjC,MAAM,EAAE,YAAY,CAAC;IACrB,qCAAqC;IACrC,iBAAiB,EAAE,OAAO,CAAC;IAC3B,4BAA4B;IAC5B,cAAc,EAAE;QACd,KAAK,EAAE,SAAS,GAAG,QAAQ,GAAG,WAAW,GAAG,QAAQ,CAAC;QACrD,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,MAAM,CAAC;QAClB,QAAQ,EAAE,MAAM,CAAC;QACjB,aAAa,EAAE,MAAM,CAAC;QACtB,OAAO,EAAE,OAAO,CAAC;KAClB,EAAE,CAAC;CACL;AAKD;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,gBAAgB,CAmDxD;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,GAAG,SAAS,GAAG,cAAc,EAAE,CA2CxF;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,GAAG,SAAS,EAAE,IAAI,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAGnH;AAED,8DAA8D;AAC9D,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAM3D"}