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,280 @@
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 * as fs from 'node:fs';
15
+ import * as path from 'node:path';
16
+ import * as YAML from 'yaml';
17
+ import { z } from 'zod';
18
+ import { ALL_DOMAINS, applyOverrides as applyDomainOverrides, getDomainByName, } from '../domains/index.js';
19
+ // ─── Schema ─────────────────────────────────────────────────────
20
+ const overrideItemSchema = z
21
+ .object({
22
+ prepend: z.string().optional(),
23
+ append: z.string().optional(),
24
+ replace: z.string().optional(),
25
+ })
26
+ .strict()
27
+ .superRefine((obj, ctx) => {
28
+ const keys = ['prepend', 'append', 'replace'].filter((k) => obj[k] !== undefined);
29
+ if (keys.length !== 1) {
30
+ const message = keys.length === 0
31
+ ? 'override item must contain exactly one action: prepend / append / replace'
32
+ : 'prepend, append, and replace are mutually exclusive; choose exactly one action per override item';
33
+ ctx.addIssue({ code: 'custom', message });
34
+ }
35
+ });
36
+ const stageOverridesSchema = z
37
+ .object({
38
+ enabled: z.boolean().optional(),
39
+ questions: z.array(overrideItemSchema).optional(),
40
+ checklist: z.array(overrideItemSchema).optional(),
41
+ focusAreas: z.array(overrideItemSchema).optional(),
42
+ antiPatterns: z.array(overrideItemSchema).optional(),
43
+ patterns: z.record(z.string(), z.string()).optional(),
44
+ })
45
+ .superRefine((stage, ctx) => {
46
+ for (const field of ['questions', 'checklist', 'focusAreas', 'antiPatterns']) {
47
+ const items = stage[field];
48
+ if (!items || items.length === 0)
49
+ continue;
50
+ const hasReplace = items.some((item) => item.replace !== undefined);
51
+ const hasPrependOrAppend = items.some((item) => item.prepend !== undefined || item.append !== undefined);
52
+ if (hasReplace && hasPrependOrAppend) {
53
+ ctx.addIssue({
54
+ code: 'custom',
55
+ path: [field],
56
+ message: 'replace cannot be combined with prepend/append in the same override field; choose replace-only or prepend/append-only',
57
+ });
58
+ }
59
+ }
60
+ })
61
+ .strict();
62
+ const domainOverridesSchema = z
63
+ .object({
64
+ explore: stageOverridesSchema.optional(),
65
+ design: stageOverridesSchema.optional(),
66
+ implement: stageOverridesSchema.optional(),
67
+ verify: stageOverridesSchema.optional(),
68
+ })
69
+ .strict();
70
+ const configSchema = z
71
+ .object({
72
+ domainVersion: z.string().regex(/^1(\.\d+)?$/, "domainVersion must start with '1'"),
73
+ overrides: z.record(z.string(), domainOverridesSchema).optional(),
74
+ })
75
+ .strict();
76
+ const KNOWN_DOMAIN_NAMES = new Set(ALL_DOMAINS.map((d) => d.name));
77
+ const KNOWN_STAGES = ['explore', 'design', 'implement', 'verify'];
78
+ /**
79
+ * 加载并校验 specdo/config.yaml。
80
+ *
81
+ * - 文件不存在 → issues=[NOT_FOUND],config=null
82
+ * - YAML parse 失败 → issues=[YAML],config=null
83
+ * - Zod schema 失败 → issues=[zod paths],config=null
84
+ * - 未知 domain / stage / field → 由 strict() + 自定义校验产出 friendly path
85
+ */
86
+ export function loadConfig(cwd) {
87
+ const cfgPath = locateConfigPath(cwd);
88
+ if (!cfgPath) {
89
+ return {
90
+ raw: null,
91
+ config: null,
92
+ issues: [{ path: 'specdo/config.yaml', message: "Not initialized. Run 'specdo init' first." }],
93
+ };
94
+ }
95
+ let raw;
96
+ try {
97
+ raw = YAML.parse(fs.readFileSync(cfgPath, 'utf-8'));
98
+ }
99
+ catch (err) {
100
+ return {
101
+ raw: null,
102
+ config: null,
103
+ issues: [{ path: 'specdo/config.yaml', message: `YAML parse failed: ${err.message}` }],
104
+ };
105
+ }
106
+ if (raw === null || raw === undefined) {
107
+ return {
108
+ raw,
109
+ config: null,
110
+ issues: [{ path: 'specdo/config.yaml', message: 'config is empty' }],
111
+ };
112
+ }
113
+ const parsed = configSchema.safeParse(raw);
114
+ if (!parsed.success) {
115
+ const issues = parsed.error.issues.map((i) => ({
116
+ path: formatZodPath(i.path),
117
+ message: i.message,
118
+ }));
119
+ return { raw, config: null, issues };
120
+ }
121
+ // 自定义层校验:unknown domain name
122
+ const config = parsed.data;
123
+ const issues = [];
124
+ if (config.overrides) {
125
+ for (const domainName of Object.keys(config.overrides)) {
126
+ if (!KNOWN_DOMAIN_NAMES.has(domainName)) {
127
+ issues.push({
128
+ path: `overrides.${domainName}`,
129
+ message: `Unknown domain "${domainName}". Known: ${[...KNOWN_DOMAIN_NAMES].join(', ')}.`,
130
+ });
131
+ }
132
+ }
133
+ }
134
+ return { raw, config, issues };
135
+ }
136
+ /**
137
+ * 应用项目级 overrides,返回所有可用领域(按 ALL_DOMAINS 顺序),含统计信息。
138
+ *
139
+ * 即使有 issues 也尽量产出可用 ResolvedDomain(issues 由调用方 validate 报告)。
140
+ */
141
+ export function resolveDomains(config) {
142
+ const overridesMap = config?.overrides ?? {};
143
+ return ALL_DOMAINS.map((domain) => {
144
+ const rawOverride = overridesMap[domain.name];
145
+ if (!rawOverride) {
146
+ return {
147
+ domain,
148
+ hasDisabledStages: false,
149
+ overrideCounts: KNOWN_STAGES.map((stage) => ({
150
+ stage,
151
+ appended: 0,
152
+ prepended: 0,
153
+ replaced: 0,
154
+ patternsAdded: 0,
155
+ enabled: domain[stage] !== undefined,
156
+ })),
157
+ };
158
+ }
159
+ // 转换为 DomainOverrides;每个 item 必须恰好一个 action,
160
+ // applyOverrides 负责实际深合并 + 整段替换。
161
+ const compiled = compileOverrides(rawOverride);
162
+ const overridden = applyDomainOverrides(domain, compiled.overrides);
163
+ const hasDisabled = rawOverride.explore?.enabled === false ||
164
+ rawOverride.design?.enabled === false ||
165
+ rawOverride.implement?.enabled === false ||
166
+ rawOverride.verify?.enabled === false;
167
+ return {
168
+ domain: overridden,
169
+ hasDisabledStages: hasDisabled,
170
+ overrideCounts: KNOWN_STAGES.map((stage) => {
171
+ const cnt = compiled.counts[stage];
172
+ return {
173
+ stage,
174
+ appended: cnt.appended,
175
+ prepended: cnt.prepended,
176
+ replaced: cnt.replaced,
177
+ patternsAdded: cnt.patternsAdded,
178
+ enabled: overridden[stage] !== undefined,
179
+ };
180
+ }),
181
+ };
182
+ });
183
+ }
184
+ export function getResolvedDomain(config, name) {
185
+ if (!getDomainByName(name))
186
+ return undefined;
187
+ return resolveDomains(config).find((r) => r.domain.name === name);
188
+ }
189
+ /** locate specdo/config.{yaml,yml}; null if neither exists */
190
+ export function locateConfigPath(cwd) {
191
+ for (const candidate of ['specdo/config.yaml', 'specdo/config.yml']) {
192
+ const abs = path.join(cwd, candidate);
193
+ if (safeIsFile(abs))
194
+ return abs;
195
+ }
196
+ return null;
197
+ }
198
+ function compileOverrides(raw) {
199
+ const counts = {
200
+ explore: { appended: 0, prepended: 0, replaced: 0, patternsAdded: 0 },
201
+ design: { appended: 0, prepended: 0, replaced: 0, patternsAdded: 0 },
202
+ implement: { appended: 0, prepended: 0, replaced: 0, patternsAdded: 0 },
203
+ verify: { appended: 0, prepended: 0, replaced: 0, patternsAdded: 0 },
204
+ };
205
+ const overrides = {};
206
+ for (const stage of KNOWN_STAGES) {
207
+ const stageRaw = raw[stage];
208
+ if (!stageRaw)
209
+ continue;
210
+ const compiledStage = {};
211
+ if (stageRaw.enabled !== undefined)
212
+ compiledStage.enabled = stageRaw.enabled;
213
+ for (const field of ['questions', 'checklist', 'focusAreas', 'antiPatterns']) {
214
+ const items = stageRaw[field];
215
+ if (!items)
216
+ continue;
217
+ const hasReplace = items.some((item) => item.replace !== undefined);
218
+ const hasPrependOrAppend = items.some((item) => item.prepend !== undefined || item.append !== undefined);
219
+ if (hasReplace && hasPrependOrAppend) {
220
+ throw new Error(`Invalid override field ${stage}.${field}: replace cannot be combined with prepend/append`);
221
+ }
222
+ const compiled = [];
223
+ for (const item of items) {
224
+ const actionKeys = ['prepend', 'append', 'replace'].filter((key) => item[key] !== undefined);
225
+ if (actionKeys.length !== 1) {
226
+ throw new Error(`Invalid override item for ${stage}.${field}: choose exactly one of prepend / append / replace`);
227
+ }
228
+ const action = actionKeys[0];
229
+ if (action === 'prepend') {
230
+ if (item.prepend === undefined) {
231
+ throw new Error(`Invalid override item for ${stage}.${field}: prepend value is missing`);
232
+ }
233
+ compiled.push({ prepend: item.prepend });
234
+ counts[stage].prepended += 1;
235
+ }
236
+ else if (action === 'append') {
237
+ if (item.append === undefined) {
238
+ throw new Error(`Invalid override item for ${stage}.${field}: append value is missing`);
239
+ }
240
+ compiled.push({ append: item.append });
241
+ counts[stage].appended += 1;
242
+ }
243
+ else {
244
+ if (item.replace === undefined) {
245
+ throw new Error(`Invalid override item for ${stage}.${field}: replace value is missing`);
246
+ }
247
+ compiled.push({ replace: item.replace });
248
+ counts[stage].replaced += 1;
249
+ }
250
+ }
251
+ // 把 compiled 写到对应字段
252
+ compiledStage[field] = compiled;
253
+ }
254
+ if (stageRaw.patterns) {
255
+ compiledStage.patterns = { ...stageRaw.patterns };
256
+ counts[stage].patternsAdded = Object.keys(stageRaw.patterns).length;
257
+ }
258
+ overrides[stage] = compiledStage;
259
+ }
260
+ return { overrides, counts };
261
+ }
262
+ function formatZodPath(p) {
263
+ return p
264
+ .map((seg, idx) => {
265
+ if (typeof seg === 'number')
266
+ return `[${seg}]`;
267
+ const str = String(seg);
268
+ return idx === 0 ? str : `.${str}`;
269
+ })
270
+ .join('');
271
+ }
272
+ function safeIsFile(p) {
273
+ try {
274
+ return fs.statSync(p).isFile();
275
+ }
276
+ catch {
277
+ return false;
278
+ }
279
+ }
280
+ //# sourceMappingURL=config-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-store.js","sourceRoot":"","sources":["../../src/core/config-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,96 @@
1
+ /**
2
+ * ContextStore — `context.json` 唯一读写入口
3
+ *
4
+ * 设计要点(与 phases/03-phase2-commands.md §ContextStore 完全对齐):
5
+ *
6
+ * 1. **原子写入**:write-then-rename + fsync 数据 + best-effort fsync
7
+ * 目录;崩溃恢复必须可读
8
+ * 2. **.bak 快照**:每次写入前先把当前 context.json 复制到
9
+ * context.json.bak,作为 last-good 快照
10
+ * 3. **损坏恢复**:read() 解析失败时尝试 .bak;.bak 也损坏则重建为空
11
+ * context 并附带显式 warning
12
+ * 4. **临时锁**:使用 Node 原生 `fs.open(lockPath, 'wx')` 获取互斥;
13
+ * 冲突时按 50/100/200ms 重试,3 次仍失败则检查死锁(锁文件年龄 >30s
14
+ * 或无效内容视为 stale,强制删除并重试一次)。锁文件内容为
15
+ * `{ pid, timestamp }` 用于死锁检测。不引入 proper-lockfile 等运行时依赖
16
+ * 5. **深合并**:stage 对象内深合并;数组字段整段替换;tasksEvidence
17
+ * 按 key 合并;--undo 必须显式删除 String(N)
18
+ */
19
+ import type { ChangeContext, ApplyStageState, ArchiveStageState, ExploreStageState, ProposeStageState, SyncStageState } from '../domains/types.js';
20
+ export type StageKey = 'explore' | 'propose' | 'apply' | 'sync' | 'archive';
21
+ export interface ContextStoreOptions {
22
+ /** specdo/changes/<name>/ 路径 */
23
+ changeDir: string;
24
+ /**
25
+ * 时间源(测试可注入);返回 ISO 字符串。默认 `() => new Date().toISOString()`
26
+ */
27
+ now?: () => string;
28
+ }
29
+ export declare class ContextLockError extends Error {
30
+ readonly exitCode = 3;
31
+ constructor(message: string);
32
+ }
33
+ export declare class ContextStore {
34
+ private readonly contextPath;
35
+ private readonly backupPath;
36
+ private readonly lockPath;
37
+ private readonly changeDir;
38
+ private readonly now;
39
+ /** read() 时累积的 warning,调用方可选择性展示 */
40
+ lastReadWarnings: string[];
41
+ constructor(options: ContextStoreOptions);
42
+ /**
43
+ * 读取 context.json;不存在时返回带必填字段的默认空 context(不写盘)。
44
+ *
45
+ * 损坏处理:
46
+ * - 主文件 JSON 解析失败 → 尝试 .bak → 仍失败 → 重建空 context 并 warn
47
+ * - 类型不匹配(version != 2 等)→ warn 但保留尽可能多字段
48
+ */
49
+ read(): ChangeContext;
50
+ /**
51
+ * 深合并写入:仅替换调用方传入的字段,保留磁盘上未提及的字段。
52
+ *
53
+ * 规则:
54
+ * - 顶层 stage 对象使用深合并(per stage 单独合并)
55
+ * - 数组字段整段替换
56
+ * - tasksEvidence 按 key 合并;如果调用方显式给出 tasksEvidence 整段
57
+ * 替换,调用方必须自行包含完整 map(用于 --undo 删除 key 场景)
58
+ * - 总是更新 change.updatedAt
59
+ */
60
+ writeDeep(partial: DeepPartialContext): void;
61
+ /** 整段替换;调用方需保证传入完整 ChangeContext */
62
+ writeFull(next: ChangeContext): void;
63
+ getStage<T = unknown>(stage: StageKey): T | null;
64
+ /** 暴露给测试 / doctor 读取 path 信息 */
65
+ describe(): {
66
+ contextPath: string;
67
+ backupPath: string;
68
+ lockPath: string;
69
+ };
70
+ private defaultContext;
71
+ private tryLoadJson;
72
+ /**
73
+ * 将原始 JSON 强转为 ChangeContext。容错处理:
74
+ * - 缺失 version → 默认 2 并 warn
75
+ * - 缺失 change 元数据 → 用默认填充并 warn
76
+ * - 未知顶层字段 → 保留(架构 §3.3)
77
+ */
78
+ private coerceContext;
79
+ private persist;
80
+ private withLock;
81
+ }
82
+ /** apply stage 的 partial 写入类型,tasksEvidence 允许 null 值(表示删除对应 key) */
83
+ export type ApplyStagePatch = Partial<Omit<ApplyStageState, 'tasksEvidence'>> & {
84
+ tasksEvidence?: Record<string, string | null>;
85
+ };
86
+ export interface DeepPartialContext {
87
+ change?: Partial<ChangeContext['change']>;
88
+ explore?: Partial<ExploreStageState> | null;
89
+ propose?: Partial<ProposeStageState> | null;
90
+ apply?: ApplyStagePatch | null;
91
+ sync?: Partial<SyncStageState> | null;
92
+ archive?: Partial<ArchiveStageState> | null;
93
+ /** 用于完全删除某个 stage(e.g. apply --undo 后清空 apply key) */
94
+ resetStages?: StageKey[];
95
+ }
96
+ //# sourceMappingURL=context-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-store.d.ts","sourceRoot":"","sources":["../../src/core/context-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAKH,OAAO,KAAK,EACV,aAAa,EACb,eAAe,EACf,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,EACjB,cAAc,EACf,MAAM,qBAAqB,CAAC;AAE7B,MAAM,MAAM,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,GAAG,MAAM,GAAG,SAAS,CAAC;AAE5E,MAAM,WAAW,mBAAmB;IAClC,gCAAgC;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB;;OAEG;IACH,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAED,qBAAa,gBAAiB,SAAQ,KAAK;IACzC,SAAgB,QAAQ,KAAK;gBACjB,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;IACnC,oCAAoC;IAC7B,gBAAgB,EAAE,MAAM,EAAE,CAAM;gBAE3B,OAAO,EAAE,mBAAmB;IAQxC;;;;;;OAMG;IACH,IAAI,IAAI,aAAa;IA6BrB;;;;;;;;;OASG;IACH,SAAS,CAAC,OAAO,EAAE,kBAAkB,GAAG,IAAI;IAQ5C,oCAAoC;IACpC,SAAS,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI;IAMpC,QAAQ,CAAC,CAAC,GAAG,OAAO,EAAE,KAAK,EAAE,QAAQ,GAAG,CAAC,GAAG,IAAI;IAMhD,gCAAgC;IAChC,QAAQ,IAAI;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE;IAMzE,OAAO,CAAC,cAAc;IAYtB,OAAO,CAAC,WAAW;IAoBnB;;;;;OAKG;IACH,OAAO,CAAC,aAAa;IA+CrB,OAAO,CAAC,OAAO;IAyCf,OAAO,CAAC,QAAQ;CA0FjB;AAID,qEAAqE;AACrE,MAAM,MAAM,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,eAAe,EAAE,eAAe,CAAC,CAAC,GAAG;IAC9E,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC;CAC/C,CAAC;AAEF,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC1C,OAAO,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,GAAG,IAAI,CAAC;IAC5C,OAAO,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,GAAG,IAAI,CAAC;IAC5C,KAAK,CAAC,EAAE,eAAe,GAAG,IAAI,CAAC;IAC/B,IAAI,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,IAAI,CAAC;IACtC,OAAO,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,GAAG,IAAI,CAAC;IAC5C,sDAAsD;IACtD,WAAW,CAAC,EAAE,QAAQ,EAAE,CAAC;CAC1B"}