@planu/cli 0.42.1 → 0.43.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 (232) hide show
  1. package/dist/config/license-plans.json +2 -1
  2. package/dist/engine/actuals/consolidator.d.ts +3 -3
  3. package/dist/engine/actuals/consolidator.d.ts.map +1 -1
  4. package/dist/engine/actuals/consolidator.js +24 -2
  5. package/dist/engine/actuals/consolidator.js.map +1 -1
  6. package/dist/engine/actuals/index.d.ts +1 -0
  7. package/dist/engine/actuals/index.d.ts.map +1 -1
  8. package/dist/engine/actuals/index.js +1 -0
  9. package/dist/engine/actuals/index.js.map +1 -1
  10. package/dist/engine/actuals/progress-parser.d.ts +11 -0
  11. package/dist/engine/actuals/progress-parser.d.ts.map +1 -0
  12. package/dist/engine/actuals/progress-parser.js +84 -0
  13. package/dist/engine/actuals/progress-parser.js.map +1 -0
  14. package/dist/engine/actuals/wip-tracker.d.ts +2 -2
  15. package/dist/engine/actuals/wip-tracker.d.ts.map +1 -1
  16. package/dist/engine/actuals/wip-tracker.js +5 -6
  17. package/dist/engine/actuals/wip-tracker.js.map +1 -1
  18. package/dist/engine/analytics-detector/events.d.ts.map +1 -1
  19. package/dist/engine/analytics-detector/events.js +3 -4
  20. package/dist/engine/analytics-detector/events.js.map +1 -1
  21. package/dist/engine/ci-generator/planu-steps.js +1 -1
  22. package/dist/engine/ci-generator/planu-steps.js.map +1 -1
  23. package/dist/engine/living-spec-analyzer.d.ts +7 -0
  24. package/dist/engine/living-spec-analyzer.d.ts.map +1 -0
  25. package/dist/engine/living-spec-analyzer.js +362 -0
  26. package/dist/engine/living-spec-analyzer.js.map +1 -0
  27. package/dist/engine/plugins/lifecycle.d.ts.map +1 -1
  28. package/dist/engine/plugins/lifecycle.js +3 -4
  29. package/dist/engine/plugins/lifecycle.js.map +1 -1
  30. package/dist/engine/plugins/sandbox.d.ts.map +1 -1
  31. package/dist/engine/plugins/sandbox.js +3 -3
  32. package/dist/engine/plugins/sandbox.js.map +1 -1
  33. package/dist/engine/registry-updater.d.ts.map +1 -1
  34. package/dist/engine/registry-updater.js +3 -3
  35. package/dist/engine/registry-updater.js.map +1 -1
  36. package/dist/engine/source-resolver.d.ts +38 -0
  37. package/dist/engine/source-resolver.d.ts.map +1 -0
  38. package/dist/engine/source-resolver.js +179 -0
  39. package/dist/engine/source-resolver.js.map +1 -0
  40. package/dist/engine/spec-dependency-graph.d.ts +33 -0
  41. package/dist/engine/spec-dependency-graph.d.ts.map +1 -0
  42. package/dist/engine/spec-dependency-graph.js +243 -0
  43. package/dist/engine/spec-dependency-graph.js.map +1 -0
  44. package/dist/i18n/index.d.ts +1 -1
  45. package/dist/i18n/index.d.ts.map +1 -1
  46. package/dist/i18n/index.js +1 -35
  47. package/dist/i18n/index.js.map +1 -1
  48. package/dist/index.js +6 -4
  49. package/dist/index.js.map +1 -1
  50. package/dist/prompts/index.d.ts +6 -0
  51. package/dist/prompts/index.d.ts.map +1 -0
  52. package/dist/prompts/index.js +121 -0
  53. package/dist/prompts/index.js.map +1 -0
  54. package/dist/resources/specs.d.ts.map +1 -1
  55. package/dist/resources/specs.js +11 -6
  56. package/dist/resources/specs.js.map +1 -1
  57. package/dist/storage/checkpoint-store.d.ts.map +1 -1
  58. package/dist/storage/checkpoint-store.js +3 -2
  59. package/dist/storage/checkpoint-store.js.map +1 -1
  60. package/dist/storage/file-mutex.d.ts +14 -0
  61. package/dist/storage/file-mutex.d.ts.map +1 -0
  62. package/dist/storage/file-mutex.js +39 -0
  63. package/dist/storage/file-mutex.js.map +1 -0
  64. package/dist/storage/spec-store.d.ts.map +1 -1
  65. package/dist/storage/spec-store.js +48 -39
  66. package/dist/storage/spec-store.js.map +1 -1
  67. package/dist/tools/activate-license.d.ts.map +1 -1
  68. package/dist/tools/activate-license.js +27 -18
  69. package/dist/tools/activate-license.js.map +1 -1
  70. package/dist/tools/analyze-spec-dependencies.d.ts +6 -0
  71. package/dist/tools/analyze-spec-dependencies.d.ts.map +1 -0
  72. package/dist/tools/analyze-spec-dependencies.js +72 -0
  73. package/dist/tools/analyze-spec-dependencies.js.map +1 -0
  74. package/dist/tools/check-readiness.d.ts.map +1 -1
  75. package/dist/tools/check-readiness.js +8 -0
  76. package/dist/tools/check-readiness.js.map +1 -1
  77. package/dist/tools/configure-llm-providers-handler.d.ts.map +1 -1
  78. package/dist/tools/configure-llm-providers-handler.js +25 -18
  79. package/dist/tools/configure-llm-providers-handler.js.map +1 -1
  80. package/dist/tools/context-budget.d.ts.map +1 -1
  81. package/dist/tools/context-budget.js +41 -14
  82. package/dist/tools/context-budget.js.map +1 -1
  83. package/dist/tools/create-spec/spec-builder.d.ts.map +1 -1
  84. package/dist/tools/create-spec/spec-builder.js +3 -2
  85. package/dist/tools/create-spec/spec-builder.js.map +1 -1
  86. package/dist/tools/delete-project.d.ts.map +1 -1
  87. package/dist/tools/delete-project.js +4 -3
  88. package/dist/tools/delete-project.js.map +1 -1
  89. package/dist/tools/delete-spec.d.ts.map +1 -1
  90. package/dist/tools/delete-spec.js +4 -3
  91. package/dist/tools/delete-spec.js.map +1 -1
  92. package/dist/tools/estimate.d.ts.map +1 -1
  93. package/dist/tools/estimate.js +1 -0
  94. package/dist/tools/estimate.js.map +1 -1
  95. package/dist/tools/event-contracts/handlers.d.ts.map +1 -1
  96. package/dist/tools/event-contracts/handlers.js +5 -7
  97. package/dist/tools/event-contracts/handlers.js.map +1 -1
  98. package/dist/tools/export-spec.js +1 -1
  99. package/dist/tools/export-spec.js.map +1 -1
  100. package/dist/tools/license-status.d.ts.map +1 -1
  101. package/dist/tools/license-status.js +33 -1
  102. package/dist/tools/license-status.js.map +1 -1
  103. package/dist/tools/list-specs.d.ts.map +1 -1
  104. package/dist/tools/list-specs.js +1 -0
  105. package/dist/tools/list-specs.js.map +1 -1
  106. package/dist/tools/llm-provider-status-handler.d.ts.map +1 -1
  107. package/dist/tools/llm-provider-status-handler.js +13 -8
  108. package/dist/tools/llm-provider-status-handler.js.map +1 -1
  109. package/dist/tools/manage-context/store.d.ts.map +1 -1
  110. package/dist/tools/manage-context/store.js +4 -5
  111. package/dist/tools/manage-context/store.js.map +1 -1
  112. package/dist/tools/manage-plugins-handler.d.ts.map +1 -1
  113. package/dist/tools/manage-plugins-handler.js +38 -12
  114. package/dist/tools/manage-plugins-handler.js.map +1 -1
  115. package/dist/tools/manage-trash.d.ts.map +1 -1
  116. package/dist/tools/manage-trash.js +9 -5
  117. package/dist/tools/manage-trash.js.map +1 -1
  118. package/dist/tools/reconcile-spec.d.ts.map +1 -1
  119. package/dist/tools/reconcile-spec.js +11 -1
  120. package/dist/tools/reconcile-spec.js.map +1 -1
  121. package/dist/tools/register-context-tools.d.ts.map +1 -1
  122. package/dist/tools/register-context-tools.js +2 -0
  123. package/dist/tools/register-context-tools.js.map +1 -1
  124. package/dist/tools/register-event-tools.d.ts.map +1 -1
  125. package/dist/tools/register-event-tools.js +1 -0
  126. package/dist/tools/register-event-tools.js.map +1 -1
  127. package/dist/tools/register-export-tools.d.ts.map +1 -1
  128. package/dist/tools/register-export-tools.js +1 -0
  129. package/dist/tools/register-export-tools.js.map +1 -1
  130. package/dist/tools/register-governance-tools.d.ts.map +1 -1
  131. package/dist/tools/register-governance-tools.js +1 -0
  132. package/dist/tools/register-governance-tools.js.map +1 -1
  133. package/dist/tools/register-learning-tools.d.ts.map +1 -1
  134. package/dist/tools/register-learning-tools.js +1 -0
  135. package/dist/tools/register-learning-tools.js.map +1 -1
  136. package/dist/tools/register-license-tools.d.ts.map +1 -1
  137. package/dist/tools/register-license-tools.js +2 -0
  138. package/dist/tools/register-license-tools.js.map +1 -1
  139. package/dist/tools/register-memory-tools.d.ts.map +1 -1
  140. package/dist/tools/register-memory-tools.js +2 -0
  141. package/dist/tools/register-memory-tools.js.map +1 -1
  142. package/dist/tools/register-migration-tools.d.ts.map +1 -1
  143. package/dist/tools/register-migration-tools.js +1 -0
  144. package/dist/tools/register-migration-tools.js.map +1 -1
  145. package/dist/tools/register-platform-tools/design-stack-tools.d.ts.map +1 -1
  146. package/dist/tools/register-platform-tools/design-stack-tools.js +12 -0
  147. package/dist/tools/register-platform-tools/design-stack-tools.js.map +1 -1
  148. package/dist/tools/register-platform-tools/lifecycle-infra-tools.d.ts.map +1 -1
  149. package/dist/tools/register-platform-tools/lifecycle-infra-tools.js +7 -0
  150. package/dist/tools/register-platform-tools/lifecycle-infra-tools.js.map +1 -1
  151. package/dist/tools/register-readiness-tools.d.ts.map +1 -1
  152. package/dist/tools/register-readiness-tools.js +2 -0
  153. package/dist/tools/register-readiness-tools.js.map +1 -1
  154. package/dist/tools/register-security-tools.d.ts.map +1 -1
  155. package/dist/tools/register-security-tools.js +1 -0
  156. package/dist/tools/register-security-tools.js.map +1 -1
  157. package/dist/tools/register-spec-tools/analysis-tools.d.ts.map +1 -1
  158. package/dist/tools/register-spec-tools/analysis-tools.js +18 -0
  159. package/dist/tools/register-spec-tools/analysis-tools.js.map +1 -1
  160. package/dist/tools/register-spec-tools/core-spec-tools.d.ts.map +1 -1
  161. package/dist/tools/register-spec-tools/core-spec-tools.js +4 -1
  162. package/dist/tools/register-spec-tools/core-spec-tools.js.map +1 -1
  163. package/dist/tools/register-stack-tools.d.ts.map +1 -1
  164. package/dist/tools/register-stack-tools.js +3 -0
  165. package/dist/tools/register-stack-tools.js.map +1 -1
  166. package/dist/tools/safe-handler.d.ts +2 -1
  167. package/dist/tools/safe-handler.d.ts.map +1 -1
  168. package/dist/tools/safe-handler.js +51 -3
  169. package/dist/tools/safe-handler.js.map +1 -1
  170. package/dist/tools/sanitize-path.d.ts +13 -0
  171. package/dist/tools/sanitize-path.d.ts.map +1 -0
  172. package/dist/tools/sanitize-path.js +60 -0
  173. package/dist/tools/sanitize-path.js.map +1 -0
  174. package/dist/tools/schemas/index.d.ts +1 -0
  175. package/dist/tools/schemas/index.d.ts.map +1 -1
  176. package/dist/tools/schemas/index.js +1 -0
  177. package/dist/tools/schemas/index.js.map +1 -1
  178. package/dist/tools/schemas/output-schemas.d.ts +168 -0
  179. package/dist/tools/schemas/output-schemas.d.ts.map +1 -0
  180. package/dist/tools/schemas/output-schemas.js +182 -0
  181. package/dist/tools/schemas/output-schemas.js.map +1 -0
  182. package/dist/tools/schemas/spec.d.ts.map +1 -1
  183. package/dist/tools/schemas/spec.js +9 -1
  184. package/dist/tools/schemas/spec.js.map +1 -1
  185. package/dist/tools/spec-templates.d.ts.map +1 -1
  186. package/dist/tools/spec-templates.js +36 -26
  187. package/dist/tools/spec-templates.js.map +1 -1
  188. package/dist/tools/tool-group-handler.d.ts.map +1 -1
  189. package/dist/tools/tool-group-handler.js +16 -13
  190. package/dist/tools/tool-group-handler.js.map +1 -1
  191. package/dist/tools/tool-registry.d.ts +14 -0
  192. package/dist/tools/tool-registry.d.ts.map +1 -0
  193. package/dist/tools/tool-registry.js +36 -0
  194. package/dist/tools/tool-registry.js.map +1 -0
  195. package/dist/tools/update-status-actions.d.ts +6 -0
  196. package/dist/tools/update-status-actions.d.ts.map +1 -1
  197. package/dist/tools/update-status-actions.js +19 -2
  198. package/dist/tools/update-status-actions.js.map +1 -1
  199. package/dist/tools/update-status.d.ts.map +1 -1
  200. package/dist/tools/update-status.js +6 -1
  201. package/dist/tools/update-status.js.map +1 -1
  202. package/dist/tools/validate.d.ts.map +1 -1
  203. package/dist/tools/validate.js +1 -0
  204. package/dist/tools/validate.js.map +1 -1
  205. package/dist/transports/http-rate-limiter.d.ts +22 -0
  206. package/dist/transports/http-rate-limiter.d.ts.map +1 -0
  207. package/dist/transports/http-rate-limiter.js +42 -0
  208. package/dist/transports/http-rate-limiter.js.map +1 -0
  209. package/dist/transports/http-transport.d.ts.map +1 -1
  210. package/dist/transports/http-transport.js +21 -1
  211. package/dist/transports/http-transport.js.map +1 -1
  212. package/dist/types/actuals-tracking.d.ts +9 -1
  213. package/dist/types/actuals-tracking.d.ts.map +1 -1
  214. package/dist/types/common/primitives.d.ts +1 -0
  215. package/dist/types/common/primitives.d.ts.map +1 -1
  216. package/dist/types/index.d.ts +1 -0
  217. package/dist/types/index.d.ts.map +1 -1
  218. package/dist/types/index.js +1 -0
  219. package/dist/types/index.js.map +1 -1
  220. package/dist/types/source-resolution.d.ts +49 -0
  221. package/dist/types/source-resolution.d.ts.map +1 -0
  222. package/dist/types/source-resolution.js +10 -0
  223. package/dist/types/source-resolution.js.map +1 -0
  224. package/dist/types/spec/core.d.ts +48 -0
  225. package/dist/types/spec/core.d.ts.map +1 -1
  226. package/dist/types/spec/inputs.d.ts +1 -0
  227. package/dist/types/spec/inputs.d.ts.map +1 -1
  228. package/package.json +1 -1
  229. package/src/config/license-plans.json +2 -1
  230. package/src/i18n/messages/en.json +177 -4
  231. package/src/i18n/messages/es.json +177 -4
  232. package/src/i18n/messages/pt.json +177 -4
@@ -0,0 +1,362 @@
1
+ // engine/living-spec-analyzer.ts — Heuristic analysis of spec criteria vs codebase
2
+ // Compares acceptance criteria against actual code to produce a living spec report.
3
+ // No LLM calls — purely file-existence and pattern-matching heuristics.
4
+ import { readFile, writeFile, stat } from 'node:fs/promises';
5
+ import { join } from 'node:path';
6
+ import { glob } from 'glob';
7
+ import { extractCriteria } from './validator/extractors.js';
8
+ const SOURCE_EXTS = '*.{ts,tsx,js,jsx,py,go,rs,java,kt,rb,php,vue,svelte}';
9
+ const IGNORE_DIRS = ['node_modules/**', 'dist/**', 'build/**', '.git/**'];
10
+ const MAX_FILES_TO_SCAN = 80;
11
+ /**
12
+ * Analyze a spec's acceptance criteria against the codebase.
13
+ * Returns a per-criterion assessment and overall completion percentage.
14
+ */
15
+ export async function analyzeLivingSpec(spec, projectPath) {
16
+ const criteria = await extractCriteria(spec);
17
+ const assessments = [];
18
+ // Pre-load file index for the project (cached for all criteria)
19
+ const fileIndex = await buildFileIndex(projectPath);
20
+ for (const criterion of criteria) {
21
+ const assessment = await assessCriterion(criterion, projectPath, fileIndex, spec);
22
+ assessments.push(assessment);
23
+ }
24
+ const metCount = assessments.filter((a) => a.status === 'met').length;
25
+ const pendingCount = assessments.filter((a) => a.status === 'pending').length;
26
+ const driftCount = assessments.filter((a) => a.status === 'drift').length;
27
+ const total = assessments.length;
28
+ const completionPercent = total > 0 ? Math.round((metCount / total) * 100) : 0;
29
+ // Update progress.md if the spec has one
30
+ let progressUpdated = false;
31
+ if (spec.progressPath) {
32
+ progressUpdated = await updateProgressFile(spec.progressPath, assessments, completionPercent);
33
+ }
34
+ return {
35
+ specId: spec.id,
36
+ criteria: assessments,
37
+ completionPercent,
38
+ metCount,
39
+ pendingCount,
40
+ driftCount,
41
+ analyzedAt: new Date().toISOString(),
42
+ progressUpdated,
43
+ };
44
+ }
45
+ /**
46
+ * Build a searchable file index: paths and a sample of file contents.
47
+ */
48
+ async function buildFileIndex(projectPath) {
49
+ const paths = [];
50
+ const contentCache = new Map();
51
+ try {
52
+ const files = await glob(`**/${SOURCE_EXTS}`, {
53
+ cwd: projectPath,
54
+ nodir: true,
55
+ ignore: IGNORE_DIRS,
56
+ maxDepth: 6,
57
+ });
58
+ paths.push(...files);
59
+ // Cache content for a limited number of files
60
+ for (const file of files.slice(0, MAX_FILES_TO_SCAN)) {
61
+ try {
62
+ const content = await readFile(join(projectPath, file), 'utf-8');
63
+ contentCache.set(file, content);
64
+ }
65
+ catch {
66
+ // Skip unreadable files
67
+ }
68
+ }
69
+ }
70
+ catch {
71
+ // Glob error — return empty index
72
+ }
73
+ return { paths, contentCache };
74
+ }
75
+ /**
76
+ * Assess a single criterion using multiple heuristics.
77
+ */
78
+ async function assessCriterion(criterion, projectPath, fileIndex, spec) {
79
+ // Heuristic 1: File existence check
80
+ const fileResult = await checkFileExistence(criterion, projectPath);
81
+ if (fileResult) {
82
+ return fileResult;
83
+ }
84
+ // Heuristic 2: Test file existence (criterion mentions "test" or "spec")
85
+ const testResult = checkTestEvidence(criterion, fileIndex.paths, spec);
86
+ if (testResult) {
87
+ return testResult;
88
+ }
89
+ // Heuristic 3: Pattern matching in code (function/class/component names)
90
+ const patternResult = checkCodePatterns(criterion, fileIndex);
91
+ if (patternResult) {
92
+ return patternResult;
93
+ }
94
+ // Heuristic 4: API endpoint / route detection
95
+ const endpointResult = checkEndpointEvidence(criterion, fileIndex);
96
+ if (endpointResult) {
97
+ return endpointResult;
98
+ }
99
+ // Heuristic 5: Keyword presence in codebase
100
+ const keywordResult = checkKeywordPresence(criterion, fileIndex);
101
+ if (keywordResult) {
102
+ return keywordResult;
103
+ }
104
+ // No evidence found
105
+ return {
106
+ criterion,
107
+ status: 'pending',
108
+ evidence: 'No matching implementation found in codebase',
109
+ };
110
+ }
111
+ /**
112
+ * Check if criterion references a specific file path and whether it exists.
113
+ */
114
+ async function checkFileExistence(criterion, projectPath) {
115
+ // Match explicit file references like "src/foo/bar.ts" or "create file X.ts"
116
+ const filePatterns = [
117
+ /(?:create|add|implement|modify)\s+(?:file\s+)?["']?([^\s"',]+\.\w{1,5})["']?/i,
118
+ /((?:src|lib|app|pages|components|routes|api)\/[\w/.-]+\.\w{1,5})/,
119
+ ];
120
+ for (const pattern of filePatterns) {
121
+ const match = pattern.exec(criterion);
122
+ if (match?.[1]) {
123
+ const filePath = match[1];
124
+ try {
125
+ await stat(join(projectPath, filePath));
126
+ return {
127
+ criterion,
128
+ status: 'met',
129
+ evidence: `File exists: ${filePath}`,
130
+ matchedFile: filePath,
131
+ };
132
+ }
133
+ catch {
134
+ return {
135
+ criterion,
136
+ status: 'pending',
137
+ evidence: `Expected file not found: ${filePath}`,
138
+ };
139
+ }
140
+ }
141
+ }
142
+ return null;
143
+ }
144
+ /**
145
+ * Check if test files exist that correspond to the criterion.
146
+ */
147
+ function checkTestEvidence(criterion, filePaths, spec) {
148
+ const lower = criterion.toLowerCase();
149
+ const isTestCriterion = lower.includes('test') || lower.includes('spec') || lower.includes('coverage');
150
+ if (!isTestCriterion) {
151
+ return null;
152
+ }
153
+ // Look for test files related to the spec slug
154
+ const slugPattern = spec.slug.replace(/-/g, '[-_.]');
155
+ const testRegex = new RegExp(`(?:test|spec).*${slugPattern}|${slugPattern}.*(?:test|spec)`, 'i');
156
+ const matchingTest = filePaths.find((f) => testRegex.test(f));
157
+ if (matchingTest) {
158
+ return {
159
+ criterion,
160
+ status: 'met',
161
+ evidence: `Test file found: ${matchingTest}`,
162
+ matchedFile: matchingTest,
163
+ };
164
+ }
165
+ // Also check for generic test patterns
166
+ const genericTestFiles = filePaths.filter((f) => f.includes('.test.') || f.includes('.spec.') || f.includes('__tests__'));
167
+ if (lower.includes('no regression') && genericTestFiles.length > 0) {
168
+ return {
169
+ criterion,
170
+ status: 'met',
171
+ evidence: `${genericTestFiles.length} test file(s) found in project`,
172
+ };
173
+ }
174
+ return null;
175
+ }
176
+ /**
177
+ * Check if code contains function/class/component names mentioned in the criterion.
178
+ */
179
+ function checkCodePatterns(criterion, fileIndex) {
180
+ const namePatterns = [
181
+ /(?:component|function|class|module|service|handler|controller)\s+["']?(\w{3,})["']?/i,
182
+ /["'`](\w{3,}(?:Component|Service|Handler|Controller|Module|Store|Hook|Provider))["'`]/,
183
+ /implement\s+(?:the\s+)?["']?(\w{3,})["']?/i,
184
+ ];
185
+ for (const pattern of namePatterns) {
186
+ const match = pattern.exec(criterion);
187
+ if (match?.[1]) {
188
+ const name = match[1];
189
+ for (const [file, content] of fileIndex.contentCache) {
190
+ if (content.includes(name)) {
191
+ return {
192
+ criterion,
193
+ status: 'met',
194
+ evidence: `Symbol "${name}" found in ${file}`,
195
+ matchedFile: file,
196
+ };
197
+ }
198
+ }
199
+ // Name not found in any file — this is drift if spec says it should exist
200
+ return {
201
+ criterion,
202
+ status: 'drift',
203
+ evidence: `Symbol "${name}" not found in any scanned file`,
204
+ };
205
+ }
206
+ }
207
+ return null;
208
+ }
209
+ /**
210
+ * Check for API endpoint / route definitions mentioned in the criterion.
211
+ */
212
+ function checkEndpointEvidence(criterion, fileIndex) {
213
+ // Match patterns like "GET /users", "endpoint /api/foo", "route /bar"
214
+ const routeMatch = /(?:endpoint|route|api|path)\s+(?:for\s+)?["']?((?:\/[\w-]+)+)["']?/i.exec(criterion);
215
+ const verbMatch = /(?:GET|POST|PUT|DELETE|PATCH)\s+["']?((?:\/[\w-]+)+)["']?/i.exec(criterion);
216
+ const match = routeMatch ?? verbMatch;
217
+ if (!match?.[1]) {
218
+ return null;
219
+ }
220
+ const routePath = match[1];
221
+ const routeSegments = routePath.split('/').filter(Boolean);
222
+ for (const [file, content] of fileIndex.contentCache) {
223
+ const lower = content.toLowerCase();
224
+ // Check if route path or key segments appear in code
225
+ if (lower.includes(routePath.toLowerCase())) {
226
+ return {
227
+ criterion,
228
+ status: 'met',
229
+ evidence: `Route "${routePath}" found in ${file}`,
230
+ matchedFile: file,
231
+ };
232
+ }
233
+ // Check for route segments (e.g., "users" for "/api/users")
234
+ const lastSegment = routeSegments[routeSegments.length - 1];
235
+ if (lastSegment && lower.includes(lastSegment.toLowerCase())) {
236
+ return {
237
+ criterion,
238
+ status: 'met',
239
+ evidence: `Route segment "${lastSegment}" found in ${file}`,
240
+ matchedFile: file,
241
+ };
242
+ }
243
+ }
244
+ return {
245
+ criterion,
246
+ status: 'pending',
247
+ evidence: `Route "${routePath}" not found in scanned files`,
248
+ };
249
+ }
250
+ /**
251
+ * Extract meaningful keywords from criterion and check if they appear in code.
252
+ */
253
+ function checkKeywordPresence(criterion, fileIndex) {
254
+ // Extract words that look like identifiers (camelCase, PascalCase, snake_case)
255
+ const identifiers = criterion.match(/\b[a-zA-Z_]\w{4,}\b/g) ?? [];
256
+ const STOP_WORDS = new Set([
257
+ 'should',
258
+ 'shall',
259
+ 'given',
260
+ 'when',
261
+ 'then',
262
+ 'must',
263
+ 'have',
264
+ 'been',
265
+ 'that',
266
+ 'this',
267
+ 'with',
268
+ 'from',
269
+ 'which',
270
+ 'there',
271
+ 'their',
272
+ 'about',
273
+ 'after',
274
+ 'before',
275
+ 'correctly',
276
+ 'implemented',
277
+ 'feature',
278
+ 'system',
279
+ 'render',
280
+ 'display',
281
+ 'respond',
282
+ 'return',
283
+ 'include',
284
+ ]);
285
+ const keywords = identifiers.filter((w) => !STOP_WORDS.has(w.toLowerCase())).slice(0, 5);
286
+ if (keywords.length === 0) {
287
+ return null;
288
+ }
289
+ // Check if multiple keywords appear in the same file
290
+ for (const [file, content] of fileIndex.contentCache) {
291
+ const matchCount = keywords.filter((kw) => content.toLowerCase().includes(kw.toLowerCase())).length;
292
+ if (matchCount >= 2 || (keywords.length === 1 && matchCount === 1)) {
293
+ return {
294
+ criterion,
295
+ status: 'met',
296
+ evidence: `Keywords [${keywords.slice(0, 3).join(', ')}] found in ${file}`,
297
+ matchedFile: file,
298
+ };
299
+ }
300
+ }
301
+ return null;
302
+ }
303
+ /**
304
+ * Update the spec's progress.md with living spec analysis results.
305
+ */
306
+ async function updateProgressFile(progressPath, assessments, completionPercent) {
307
+ try {
308
+ let content;
309
+ try {
310
+ content = await readFile(progressPath, 'utf-8');
311
+ }
312
+ catch {
313
+ content = '';
314
+ }
315
+ const timestamp = new Date().toISOString();
316
+ const sectionHeader = '## Living Spec Analysis';
317
+ const newSection = buildProgressSection(assessments, completionPercent, timestamp);
318
+ if (content.includes(sectionHeader)) {
319
+ // Replace existing section (up to next ## or end of file)
320
+ content = content.replace(/## Living Spec Analysis[\s\S]*?(?=\n## |\n---\n|$)/, newSection);
321
+ }
322
+ else {
323
+ // Append new section
324
+ content = content.trimEnd() + '\n\n---\n\n' + newSection + '\n';
325
+ }
326
+ await writeFile(progressPath, content, 'utf-8');
327
+ return true;
328
+ }
329
+ catch {
330
+ return false;
331
+ }
332
+ }
333
+ /**
334
+ * Build the markdown section for living spec progress.
335
+ */
336
+ function buildProgressSection(assessments, completionPercent, timestamp) {
337
+ const met = assessments.filter((a) => a.status === 'met');
338
+ const pending = assessments.filter((a) => a.status === 'pending');
339
+ const drift = assessments.filter((a) => a.status === 'drift');
340
+ const lines = [
341
+ '## Living Spec Analysis',
342
+ '',
343
+ `> Last analyzed: ${timestamp}`,
344
+ `> Completion: **${completionPercent}%** (${met.length}/${assessments.length} criteria met)`,
345
+ '',
346
+ '| Status | Criterion | Evidence |',
347
+ '|--------|-----------|----------|',
348
+ ...met.map((a) => `| MET | ${escapePipe(a.criterion)} | ${escapePipe(a.evidence)} |`),
349
+ ...pending.map((a) => `| PENDING | ${escapePipe(a.criterion)} | ${escapePipe(a.evidence)} |`),
350
+ ...drift.map((a) => `| DRIFT | ${escapePipe(a.criterion)} | ${escapePipe(a.evidence)} |`),
351
+ '',
352
+ ];
353
+ if (drift.length > 0) {
354
+ lines.push(`> **Warning:** ${drift.length} criterion(s) show drift — code diverges from spec.`, '');
355
+ }
356
+ return lines.join('\n');
357
+ }
358
+ /** Escape pipe characters in markdown table cells. */
359
+ function escapePipe(text) {
360
+ return text.replace(/\|/g, '\\|');
361
+ }
362
+ //# sourceMappingURL=living-spec-analyzer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"living-spec-analyzer.js","sourceRoot":"","sources":["../../src/engine/living-spec-analyzer.ts"],"names":[],"mappings":"AAAA,mFAAmF;AACnF,oFAAoF;AACpF,wEAAwE;AAExE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAG5B,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAE5D,MAAM,WAAW,GAAG,sDAAsD,CAAC;AAC3E,MAAM,WAAW,GAAG,CAAC,iBAAiB,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;AAC1E,MAAM,iBAAiB,GAAG,EAAE,CAAC;AAE7B;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,IAAU,EACV,WAAmB;IAEnB,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,IAAI,CAAC,CAAC;IAC7C,MAAM,WAAW,GAA0B,EAAE,CAAC;IAE9C,gEAAgE;IAChE,MAAM,SAAS,GAAG,MAAM,cAAc,CAAC,WAAW,CAAC,CAAC;IAEpD,KAAK,MAAM,SAAS,IAAI,QAAQ,EAAE,CAAC;QACjC,MAAM,UAAU,GAAG,MAAM,eAAe,CAAC,SAAS,EAAE,WAAW,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;QAClF,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC/B,CAAC;IAED,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,KAAK,CAAC,CAAC,MAAM,CAAC;IACtE,MAAM,YAAY,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,MAAM,CAAC;IAC9E,MAAM,UAAU,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,MAAM,CAAC;IAC1E,MAAM,KAAK,GAAG,WAAW,CAAC,MAAM,CAAC;IACjC,MAAM,iBAAiB,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,GAAG,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAE/E,yCAAyC;IACzC,IAAI,eAAe,GAAG,KAAK,CAAC;IAC5B,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;QACtB,eAAe,GAAG,MAAM,kBAAkB,CAAC,IAAI,CAAC,YAAY,EAAE,WAAW,EAAE,iBAAiB,CAAC,CAAC;IAChG,CAAC;IAED,OAAO;QACL,MAAM,EAAE,IAAI,CAAC,EAAE;QACf,QAAQ,EAAE,WAAW;QACrB,iBAAiB;QACjB,QAAQ;QACR,YAAY;QACZ,UAAU;QACV,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACpC,eAAe;KAChB,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,cAAc,CAC3B,WAAmB;IAEnB,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,YAAY,GAAG,IAAI,GAAG,EAAkB,CAAC;IAE/C,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,MAAM,WAAW,EAAE,EAAE;YAC5C,GAAG,EAAE,WAAW;YAChB,KAAK,EAAE,IAAI;YACX,MAAM,EAAE,WAAW;YACnB,QAAQ,EAAE,CAAC;SACZ,CAAC,CAAC;QACH,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC;QAErB,8CAA8C;QAC9C,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,iBAAiB,CAAC,EAAE,CAAC;YACrD,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;gBACjE,YAAY,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YAClC,CAAC;YAAC,MAAM,CAAC;gBACP,wBAAwB;YAC1B,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,kCAAkC;IACpC,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC;AACjC,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,eAAe,CAC5B,SAAiB,EACjB,WAAmB,EACnB,SAAiE,EACjE,IAAU;IAEV,oCAAoC;IACpC,MAAM,UAAU,GAAG,MAAM,kBAAkB,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IACpE,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,yEAAyE;IACzE,MAAM,UAAU,GAAG,iBAAiB,CAAC,SAAS,EAAE,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IACvE,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,yEAAyE;IACzE,MAAM,aAAa,GAAG,iBAAiB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IAC9D,IAAI,aAAa,EAAE,CAAC;QAClB,OAAO,aAAa,CAAC;IACvB,CAAC;IAED,8CAA8C;IAC9C,MAAM,cAAc,GAAG,qBAAqB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IACnE,IAAI,cAAc,EAAE,CAAC;QACnB,OAAO,cAAc,CAAC;IACxB,CAAC;IAED,4CAA4C;IAC5C,MAAM,aAAa,GAAG,oBAAoB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IACjE,IAAI,aAAa,EAAE,CAAC;QAClB,OAAO,aAAa,CAAC;IACvB,CAAC;IAED,oBAAoB;IACpB,OAAO;QACL,SAAS;QACT,MAAM,EAAE,SAAS;QACjB,QAAQ,EAAE,8CAA8C;KACzD,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,kBAAkB,CAC/B,SAAiB,EACjB,WAAmB;IAEnB,6EAA6E;IAC7E,MAAM,YAAY,GAAG;QACnB,+EAA+E;QAC/E,kEAAkE;KACnE,CAAC;IAEF,KAAK,MAAM,OAAO,IAAI,YAAY,EAAE,CAAC;QACnC,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACtC,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACf,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAC1B,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC,CAAC;gBACxC,OAAO;oBACL,SAAS;oBACT,MAAM,EAAE,KAAK;oBACb,QAAQ,EAAE,gBAAgB,QAAQ,EAAE;oBACpC,WAAW,EAAE,QAAQ;iBACtB,CAAC;YACJ,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO;oBACL,SAAS;oBACT,MAAM,EAAE,SAAS;oBACjB,QAAQ,EAAE,4BAA4B,QAAQ,EAAE;iBACjD,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,SAAS,iBAAiB,CACxB,SAAiB,EACjB,SAAmB,EACnB,IAAU;IAEV,MAAM,KAAK,GAAG,SAAS,CAAC,WAAW,EAAE,CAAC;IACtC,MAAM,eAAe,GACnB,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IAEjF,IAAI,CAAC,eAAe,EAAE,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,+CAA+C;IAC/C,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACrD,MAAM,SAAS,GAAG,IAAI,MAAM,CAAC,kBAAkB,WAAW,IAAI,WAAW,iBAAiB,EAAE,GAAG,CAAC,CAAC;IACjG,MAAM,YAAY,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAE9D,IAAI,YAAY,EAAE,CAAC;QACjB,OAAO;YACL,SAAS;YACT,MAAM,EAAE,KAAK;YACb,QAAQ,EAAE,oBAAoB,YAAY,EAAE;YAC5C,WAAW,EAAE,YAAY;SAC1B,CAAC;IACJ,CAAC;IAED,uCAAuC;IACvC,MAAM,gBAAgB,GAAG,SAAS,CAAC,MAAM,CACvC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAC/E,CAAC;IACF,IAAI,KAAK,CAAC,QAAQ,CAAC,eAAe,CAAC,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnE,OAAO;YACL,SAAS;YACT,MAAM,EAAE,KAAK;YACb,QAAQ,EAAE,GAAG,gBAAgB,CAAC,MAAM,gCAAgC;SACrE,CAAC;IACJ,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,SAAS,iBAAiB,CACxB,SAAiB,EACjB,SAAiE;IAEjE,MAAM,YAAY,GAAG;QACnB,sFAAsF;QACtF,uFAAuF;QACvF,4CAA4C;KAC7C,CAAC;IAEF,KAAK,MAAM,OAAO,IAAI,YAAY,EAAE,CAAC;QACnC,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACtC,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACf,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACtB,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,SAAS,CAAC,YAAY,EAAE,CAAC;gBACrD,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC3B,OAAO;wBACL,SAAS;wBACT,MAAM,EAAE,KAAK;wBACb,QAAQ,EAAE,WAAW,IAAI,cAAc,IAAI,EAAE;wBAC7C,WAAW,EAAE,IAAI;qBAClB,CAAC;gBACJ,CAAC;YACH,CAAC;YACD,0EAA0E;YAC1E,OAAO;gBACL,SAAS;gBACT,MAAM,EAAE,OAAO;gBACf,QAAQ,EAAE,WAAW,IAAI,iCAAiC;aAC3D,CAAC;QACJ,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,SAAS,qBAAqB,CAC5B,SAAiB,EACjB,SAAiE;IAEjE,sEAAsE;IACtE,MAAM,UAAU,GAAG,qEAAqE,CAAC,IAAI,CAC3F,SAAS,CACV,CAAC;IACF,MAAM,SAAS,GAAG,4DAA4D,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC/F,MAAM,KAAK,GAAG,UAAU,IAAI,SAAS,CAAC;IAEtC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAChB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IAC3B,MAAM,aAAa,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAE3D,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,SAAS,CAAC,YAAY,EAAE,CAAC;QACrD,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;QACpC,qDAAqD;QACrD,IAAI,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;YAC5C,OAAO;gBACL,SAAS;gBACT,MAAM,EAAE,KAAK;gBACb,QAAQ,EAAE,UAAU,SAAS,cAAc,IAAI,EAAE;gBACjD,WAAW,EAAE,IAAI;aAClB,CAAC;QACJ,CAAC;QACD,4DAA4D;QAC5D,MAAM,WAAW,GAAG,aAAa,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC5D,IAAI,WAAW,IAAI,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;YAC7D,OAAO;gBACL,SAAS;gBACT,MAAM,EAAE,KAAK;gBACb,QAAQ,EAAE,kBAAkB,WAAW,cAAc,IAAI,EAAE;gBAC3D,WAAW,EAAE,IAAI;aAClB,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO;QACL,SAAS;QACT,MAAM,EAAE,SAAS;QACjB,QAAQ,EAAE,UAAU,SAAS,8BAA8B;KAC5D,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,oBAAoB,CAC3B,SAAiB,EACjB,SAAiE;IAEjE,+EAA+E;IAC/E,MAAM,WAAW,GAAG,SAAS,CAAC,KAAK,CAAC,sBAAsB,CAAC,IAAI,EAAE,CAAC;IAClE,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC;QACzB,QAAQ;QACR,OAAO;QACP,OAAO;QACP,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,OAAO;QACP,OAAO;QACP,OAAO;QACP,OAAO;QACP,OAAO;QACP,QAAQ;QACR,WAAW;QACX,aAAa;QACb,SAAS;QACT,QAAQ;QACR,QAAQ;QACR,SAAS;QACT,SAAS;QACT,QAAQ;QACR,SAAS;KACV,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAEzF,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,qDAAqD;IACrD,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,SAAS,CAAC,YAAY,EAAE,CAAC;QACrD,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CACxC,OAAO,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,CACjD,CAAC,MAAM,CAAC;QAET,IAAI,UAAU,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,UAAU,KAAK,CAAC,CAAC,EAAE,CAAC;YACnE,OAAO;gBACL,SAAS;gBACT,MAAM,EAAE,KAAK;gBACb,QAAQ,EAAE,aAAa,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,IAAI,EAAE;gBAC1E,WAAW,EAAE,IAAI;aAClB,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,kBAAkB,CAC/B,YAAoB,EACpB,WAAkC,EAClC,iBAAyB;IAEzB,IAAI,CAAC;QACH,IAAI,OAAe,CAAC;QACpB,IAAI,CAAC;YACH,OAAO,GAAG,MAAM,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QAClD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,GAAG,EAAE,CAAC;QACf,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC3C,MAAM,aAAa,GAAG,yBAAyB,CAAC;QAChD,MAAM,UAAU,GAAG,oBAAoB,CAAC,WAAW,EAAE,iBAAiB,EAAE,SAAS,CAAC,CAAC;QAEnF,IAAI,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;YACpC,0DAA0D;YAC1D,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,oDAAoD,EAAE,UAAU,CAAC,CAAC;QAC9F,CAAC;aAAM,CAAC;YACN,qBAAqB;YACrB,OAAO,GAAG,OAAO,CAAC,OAAO,EAAE,GAAG,aAAa,GAAG,UAAU,GAAG,IAAI,CAAC;QAClE,CAAC;QAED,MAAM,SAAS,CAAC,YAAY,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QAChD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,oBAAoB,CAC3B,WAAkC,EAClC,iBAAyB,EACzB,SAAiB;IAEjB,MAAM,GAAG,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,KAAK,CAAC,CAAC;IAC1D,MAAM,OAAO,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC;IAClE,MAAM,KAAK,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC;IAE9D,MAAM,KAAK,GAAG;QACZ,yBAAyB;QACzB,EAAE;QACF,oBAAoB,SAAS,EAAE;QAC/B,mBAAmB,iBAAiB,QAAQ,GAAG,CAAC,MAAM,IAAI,WAAW,CAAC,MAAM,gBAAgB;QAC5F,EAAE;QACF,mCAAmC;QACnC,mCAAmC;QACnC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;QACrF,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,eAAe,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;QAC7F,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;QACzF,EAAE;KACH,CAAC;IAEF,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrB,KAAK,CAAC,IAAI,CACR,kBAAkB,KAAK,CAAC,MAAM,qDAAqD,EACnF,EAAE,CACH,CAAC;IACJ,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,sDAAsD;AACtD,SAAS,UAAU,CAAC,IAAY;IAC9B,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AACpC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../../../src/engine/plugins/lifecycle.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,kBAAkB,EAAgB,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAqB9F;;GAEG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAO/E;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAI7F;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,kBAAkB,CAAC,CAwC7B;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,WAAW,CAAC,MAAM,CAAC,GAChC,OAAO,CAAC,kBAAkB,CAAC,CAqF7B;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,kBAAkB,CAAC,CA6B7B;AAED;;GAEG;AACH,wBAAsB,eAAe,CACnC,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,CAyBf"}
1
+ {"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../../../src/engine/plugins/lifecycle.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,kBAAkB,EAAgB,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAsB9F;;GAEG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAO/E;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAE7F;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,kBAAkB,CAAC,CAwC7B;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,WAAW,CAAC,MAAM,CAAC,GAChC,OAAO,CAAC,kBAAkB,CAAC,CAqF7B;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,kBAAkB,CAAC,CA6B7B;AAED;;GAEG;AACH,wBAAsB,eAAe,CACnC,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,CAyBf"}
@@ -1,6 +1,7 @@
1
1
  // engine/plugins/lifecycle.ts — Plugin lifecycle management (SPEC-085 AC-03)
2
- import { cp, rm, readFile, writeFile, mkdir } from 'node:fs/promises';
2
+ import { cp, rm, readFile, mkdir } from 'node:fs/promises';
3
3
  import { join } from 'node:path';
4
+ import { writeJsonSafe } from '../safety/atomic-writer.js';
4
5
  import { getPluginsDir, loadPluginModule } from './loader.js';
5
6
  import { validateManifestStructure } from './validator.js';
6
7
  import { withPluginTimeout } from './sandbox.js';
@@ -28,9 +29,7 @@ export async function readPluginState(dataDir) {
28
29
  * Writes plugin state to disk.
29
30
  */
30
31
  export async function writePluginState(dataDir, state) {
31
- const dir = join(dataDir, 'global');
32
- await mkdir(dir, { recursive: true });
33
- await writeFile(stateFilePath(dataDir), JSON.stringify(state, null, 2), 'utf8');
32
+ await writeJsonSafe(stateFilePath(dataDir), state);
34
33
  }
35
34
  /**
36
35
  * Installs a plugin by copying it to the plugins directory.
@@ -1 +1 @@
1
- {"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../../src/engine/plugins/lifecycle.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../../src/engine/plugins/lifecycle.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"sandbox.d.ts","sourceRoot":"","sources":["../../../src/engine/plugins/sandbox.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,aAAa,EACb,gBAAgB,EAChB,gBAAgB,EAChB,YAAY,EACb,MAAM,sBAAsB,CAAC;AAI9B;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,gBAAgB,CA2BvF;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,CAajE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,SAAS,gBAAgB,EAAE,EACxC,OAAO,EAAE,MAAM,GACd,aAAa,CAkCf;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,CAAC,EACvC,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,SAAS,GAAE,MAA2B,GACrC,OAAO,CAAC,CAAC,CAAC,CAqBZ"}
1
+ {"version":3,"file":"sandbox.d.ts","sourceRoot":"","sources":["../../../src/engine/plugins/sandbox.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,aAAa,EACb,gBAAgB,EAChB,gBAAgB,EAChB,YAAY,EACb,MAAM,sBAAsB,CAAC;AAK9B;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,gBAAgB,CA0BvF;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,CAajE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,SAAS,gBAAgB,EAAE,EACxC,OAAO,EAAE,MAAM,GACd,aAAa,CAkCf;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,CAAC,EACvC,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,SAAS,GAAE,MAA2B,GACrC,OAAO,CAAC,CAAC,CAAC,CAqBZ"}
@@ -1,6 +1,7 @@
1
1
  // engine/plugins/sandbox.ts — Plugin isolation and context (SPEC-085 AC-08)
2
- import { readFile, writeFile, mkdir, readdir } from 'node:fs/promises';
2
+ import { readFile, readdir } from 'node:fs/promises';
3
3
  import { join } from 'node:path';
4
+ import { writeJsonSafe } from '../safety/atomic-writer.js';
4
5
  const DEFAULT_TIMEOUT_MS = 30_000;
5
6
  /**
6
7
  * Creates a restricted storage API for a plugin.
@@ -20,9 +21,8 @@ export function createPluginStorage(pluginId, dataDir) {
20
21
  }
21
22
  },
22
23
  write: async (key, value) => {
23
- await mkdir(pluginDataDir, { recursive: true });
24
24
  const filePath = join(pluginDataDir, `${key}.json`);
25
- await writeFile(filePath, JSON.stringify(value, null, 2), 'utf8');
25
+ await writeJsonSafe(filePath, value);
26
26
  },
27
27
  list: async () => {
28
28
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"sandbox.js","sourceRoot":"","sources":["../../../src/engine/plugins/sandbox.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sandbox.js","sourceRoot":"","sources":["../../../src/engine/plugins/sandbox.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"registry-updater.d.ts","sourceRoot":"","sources":["../../src/engine/registry-updater.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,YAAY,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAIzF,wBAAsB,YAAY,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAO9E;AAED,wBAAsB,YAAY,CAAC,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAG9F;AAED,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,YAAY,EACtB,QAAQ,EAAE,YAAY,GAAG,WAAW,GAAG,UAAU,EACjD,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,iBAAiB,GACvB,YAAY,CAkBd;AAED,wBAAsB,0BAA0B,CAC9C,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,YAAY,GACrB,OAAO,CAAC;IAAE,QAAQ,EAAE,YAAY,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,CAAC,CA0BrD;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,YAAY,GAAG,cAAc,CAiCxE;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,YAAY,GAAG,YAAY,CAmBzF"}
1
+ {"version":3,"file":"registry-updater.d.ts","sourceRoot":"","sources":["../../src/engine/registry-updater.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,YAAY,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAIzF,wBAAsB,YAAY,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAO9E;AAED,wBAAsB,YAAY,CAAC,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAE9F;AAED,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,YAAY,EACtB,QAAQ,EAAE,YAAY,GAAG,WAAW,GAAG,UAAU,EACjD,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,iBAAiB,GACvB,YAAY,CAkBd;AAED,wBAAsB,0BAA0B,CAC9C,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,YAAY,GACrB,OAAO,CAAC;IAAE,QAAQ,EAAE,YAAY,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,CAAC,CA0BrD;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,YAAY,GAAG,cAAc,CAiCxE;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,YAAY,GAAG,YAAY,CAmBzF"}
@@ -1,7 +1,8 @@
1
1
  // Planu — Registry Auto-Updater
2
2
  // Updates docs-registry.json with data from web.
3
3
  // Respects userAdded entries — they are never overwritten.
4
- import { readFile, writeFile } from 'node:fs/promises';
4
+ import { readFile } from 'node:fs/promises';
5
+ import { writeJsonSafe } from './safety/atomic-writer.js';
5
6
  // === Public API ===
6
7
  export async function loadRegistry(registryPath) {
7
8
  try {
@@ -13,8 +14,7 @@ export async function loadRegistry(registryPath) {
13
14
  }
14
15
  }
15
16
  export async function saveRegistry(registryPath, registry) {
16
- const content = JSON.stringify(registry, null, 2) + '\n';
17
- await writeFile(registryPath, content, 'utf-8');
17
+ await writeJsonSafe(registryPath, registry);
18
18
  }
19
19
  export function updateDocsRegistryEntry(registry, category, key, entry) {
20
20
  const existing = registry[category][key];
@@ -1 +1 @@
1
- {"version":3,"file":"registry-updater.js","sourceRoot":"","sources":["../../src/engine/registry-updater.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"registry-updater.js","sourceRoot":"","sources":["../../src/engine/registry-updater.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ import type { DataSource, ResolvedData, BatchResolution } from '../types/source-resolution.js';
2
+ /**
3
+ * Resolve a conflict among multiple data sources by selecting the
4
+ * highest-priority non-null value.
5
+ *
6
+ * @param sources - Array of data sources, each with a priority and value.
7
+ * @param fieldName - Human-readable name of the field being resolved (for the explanation).
8
+ * @returns The resolved data with full explanation of the decision.
9
+ *
10
+ * @example
11
+ * ```ts
12
+ * const result = resolveConflict([
13
+ * { priority: 'spec-baseline', value: 'draft', label: 'spec.md' },
14
+ * { priority: 'progress', value: 'implementing', label: 'progress.md' },
15
+ * ], 'status');
16
+ * // result.value === 'implementing' (progress > spec-baseline)
17
+ * ```
18
+ */
19
+ export declare function resolveConflict<T>(sources: DataSource<T>[], fieldName: string): ResolvedData<T> | null;
20
+ /**
21
+ * Resolve multiple fields at once, returning a batch result.
22
+ *
23
+ * @param fieldSources - Map of field name to its data sources.
24
+ * @returns Batch resolution with all fields resolved and a summary.
25
+ */
26
+ export declare function resolveConflictBatch(fieldSources: Record<string, DataSource[]>): BatchResolution;
27
+ /**
28
+ * Convenience: resolve a status conflict from common spec sources.
29
+ * This is the most common use case — status appearing in multiple files.
30
+ */
31
+ export declare function resolveStatusConflict(statusSources: {
32
+ specMd?: string | null;
33
+ progressMd?: string | null;
34
+ wipTracker?: string | null;
35
+ gitDerived?: string | null;
36
+ explicit?: string | null;
37
+ }): ResolvedData<string> | null;
38
+ //# sourceMappingURL=source-resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source-resolver.d.ts","sourceRoot":"","sources":["../../src/engine/source-resolver.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,UAAU,EACV,YAAY,EACZ,eAAe,EAEhB,MAAM,+BAA+B,CAAC;AAsCvC;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAC/B,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,EACxB,SAAS,EAAE,MAAM,GAChB,YAAY,CAAC,CAAC,CAAC,GAAG,IAAI,CA2CxB;AAsCD;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC,GAAG,eAAe,CAsBhG;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,aAAa,EAAE;IACnD,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B,GAAG,YAAY,CAAC,MAAM,CAAC,GAAG,IAAI,CAwC9B"}