@planu/cli 0.27.0 → 0.29.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 (273) hide show
  1. package/dist/config/model-routing-rules.json +98 -0
  2. package/dist/config/tool-groups.json +140 -0
  3. package/dist/engine/ai-cost-estimator/core.d.ts +1 -1
  4. package/dist/engine/ai-cost-estimator/core.d.ts.map +1 -1
  5. package/dist/engine/ai-cost-estimator/core.js +3 -167
  6. package/dist/engine/ai-cost-estimator/core.js.map +1 -1
  7. package/dist/engine/ai-cost-estimator/recommender.d.ts +8 -0
  8. package/dist/engine/ai-cost-estimator/recommender.d.ts.map +1 -0
  9. package/dist/engine/ai-cost-estimator/recommender.js +94 -0
  10. package/dist/engine/ai-cost-estimator/recommender.js.map +1 -0
  11. package/dist/engine/ai-cost-estimator/spec-loader.d.ts +13 -0
  12. package/dist/engine/ai-cost-estimator/spec-loader.d.ts.map +1 -0
  13. package/dist/engine/ai-cost-estimator/spec-loader.js +102 -0
  14. package/dist/engine/ai-cost-estimator/spec-loader.js.map +1 -0
  15. package/dist/engine/code-transforms/transform-engine.d.ts +7 -0
  16. package/dist/engine/code-transforms/transform-engine.d.ts.map +1 -0
  17. package/dist/engine/code-transforms/transform-engine.js +67 -0
  18. package/dist/engine/code-transforms/transform-engine.js.map +1 -0
  19. package/dist/engine/code-transforms/typescript/add-error-handling.d.ts +6 -0
  20. package/dist/engine/code-transforms/typescript/add-error-handling.d.ts.map +1 -0
  21. package/dist/engine/code-transforms/typescript/add-error-handling.js +92 -0
  22. package/dist/engine/code-transforms/typescript/add-error-handling.js.map +1 -0
  23. package/dist/engine/code-transforms/typescript/add-jsdoc.d.ts +6 -0
  24. package/dist/engine/code-transforms/typescript/add-jsdoc.d.ts.map +1 -0
  25. package/dist/engine/code-transforms/typescript/add-jsdoc.js +83 -0
  26. package/dist/engine/code-transforms/typescript/add-jsdoc.js.map +1 -0
  27. package/dist/engine/code-transforms/typescript/add-types.d.ts +3 -0
  28. package/dist/engine/code-transforms/typescript/add-types.d.ts.map +1 -0
  29. package/dist/engine/code-transforms/typescript/add-types.js +182 -0
  30. package/dist/engine/code-transforms/typescript/add-types.js.map +1 -0
  31. package/dist/engine/code-transforms/typescript/ast-utils.d.ts +38 -0
  32. package/dist/engine/code-transforms/typescript/ast-utils.d.ts.map +1 -0
  33. package/dist/engine/code-transforms/typescript/ast-utils.js +90 -0
  34. package/dist/engine/code-transforms/typescript/ast-utils.js.map +1 -0
  35. package/dist/engine/code-transforms/typescript/extract-interface.d.ts +6 -0
  36. package/dist/engine/code-transforms/typescript/extract-interface.d.ts.map +1 -0
  37. package/dist/engine/code-transforms/typescript/extract-interface.js +103 -0
  38. package/dist/engine/code-transforms/typescript/extract-interface.js.map +1 -0
  39. package/dist/engine/code-transforms/typescript/modernize-syntax.d.ts +3 -0
  40. package/dist/engine/code-transforms/typescript/modernize-syntax.d.ts.map +1 -0
  41. package/dist/engine/code-transforms/typescript/modernize-syntax.js +213 -0
  42. package/dist/engine/code-transforms/typescript/modernize-syntax.js.map +1 -0
  43. package/dist/engine/code-transforms/typescript/rename-symbol.d.ts +8 -0
  44. package/dist/engine/code-transforms/typescript/rename-symbol.d.ts.map +1 -0
  45. package/dist/engine/code-transforms/typescript/rename-symbol.js +40 -0
  46. package/dist/engine/code-transforms/typescript/rename-symbol.js.map +1 -0
  47. package/dist/engine/focus-tracker.d.ts.map +1 -1
  48. package/dist/engine/focus-tracker.js +1 -0
  49. package/dist/engine/focus-tracker.js.map +1 -1
  50. package/dist/engine/mermaid/core.d.ts +18 -0
  51. package/dist/engine/mermaid/core.d.ts.map +1 -0
  52. package/dist/engine/mermaid/core.js +88 -0
  53. package/dist/engine/mermaid/core.js.map +1 -0
  54. package/dist/engine/mermaid/diagram-generators.d.ts +22 -0
  55. package/dist/engine/mermaid/diagram-generators.d.ts.map +1 -0
  56. package/dist/engine/mermaid/diagram-generators.js +139 -0
  57. package/dist/engine/mermaid/diagram-generators.js.map +1 -0
  58. package/dist/engine/mermaid/helpers.d.ts +8 -0
  59. package/dist/engine/mermaid/helpers.d.ts.map +1 -0
  60. package/dist/engine/mermaid/helpers.js +61 -0
  61. package/dist/engine/mermaid/helpers.js.map +1 -0
  62. package/dist/engine/mermaid-generator.d.ts +2 -37
  63. package/dist/engine/mermaid-generator.d.ts.map +1 -1
  64. package/dist/engine/mermaid-generator.js +4 -276
  65. package/dist/engine/mermaid-generator.js.map +1 -1
  66. package/dist/engine/model-router/complexity-analyzer.d.ts +26 -0
  67. package/dist/engine/model-router/complexity-analyzer.d.ts.map +1 -0
  68. package/dist/engine/model-router/complexity-analyzer.js +182 -0
  69. package/dist/engine/model-router/complexity-analyzer.js.map +1 -0
  70. package/dist/engine/model-router/cost-estimator.d.ts +6 -0
  71. package/dist/engine/model-router/cost-estimator.d.ts.map +1 -0
  72. package/dist/engine/model-router/cost-estimator.js +60 -0
  73. package/dist/engine/model-router/cost-estimator.js.map +1 -0
  74. package/dist/engine/model-router/historical-learner.d.ts +26 -0
  75. package/dist/engine/model-router/historical-learner.d.ts.map +1 -0
  76. package/dist/engine/model-router/historical-learner.js +91 -0
  77. package/dist/engine/model-router/historical-learner.js.map +1 -0
  78. package/dist/engine/model-router/rules-engine.d.ts +13 -0
  79. package/dist/engine/model-router/rules-engine.d.ts.map +1 -0
  80. package/dist/engine/model-router/rules-engine.js +142 -0
  81. package/dist/engine/model-router/rules-engine.js.map +1 -0
  82. package/dist/engine/planu-config-writer.d.ts +2 -2
  83. package/dist/engine/planu-config-writer.d.ts.map +1 -1
  84. package/dist/engine/planu-config-writer.js +4 -6
  85. package/dist/engine/planu-config-writer.js.map +1 -1
  86. package/dist/engine/spec-coverage/criteria-mapper.d.ts +1 -2
  87. package/dist/engine/spec-coverage/criteria-mapper.d.ts.map +1 -1
  88. package/dist/engine/spec-coverage/criteria-mapper.js +4 -203
  89. package/dist/engine/spec-coverage/criteria-mapper.js.map +1 -1
  90. package/dist/engine/spec-coverage/keyword-extractor.d.ts +10 -0
  91. package/dist/engine/spec-coverage/keyword-extractor.d.ts.map +1 -0
  92. package/dist/engine/spec-coverage/keyword-extractor.js +147 -0
  93. package/dist/engine/spec-coverage/keyword-extractor.js.map +1 -0
  94. package/dist/engine/spec-coverage/test-matchers.d.ts +9 -0
  95. package/dist/engine/spec-coverage/test-matchers.d.ts.map +1 -0
  96. package/dist/engine/spec-coverage/test-matchers.js +59 -0
  97. package/dist/engine/spec-coverage/test-matchers.js.map +1 -0
  98. package/dist/engine/spec-migrator.d.ts +17 -0
  99. package/dist/engine/spec-migrator.d.ts.map +1 -0
  100. package/dist/engine/spec-migrator.js +119 -0
  101. package/dist/engine/spec-migrator.js.map +1 -0
  102. package/dist/engine/spec-templates/catalog-extra.d.ts +1 -1
  103. package/dist/engine/spec-templates/catalog-extra.d.ts.map +1 -1
  104. package/dist/engine/spec-templates/catalog-extra.js +8 -363
  105. package/dist/engine/spec-templates/catalog-extra.js.map +1 -1
  106. package/dist/engine/spec-templates/catalog.d.ts.map +1 -1
  107. package/dist/engine/spec-templates/catalog.js +10 -381
  108. package/dist/engine/spec-templates/catalog.js.map +1 -1
  109. package/dist/engine/spec-templates/templates-api-ui.d.ts +6 -0
  110. package/dist/engine/spec-templates/templates-api-ui.d.ts.map +1 -0
  111. package/dist/engine/spec-templates/templates-api-ui.js +188 -0
  112. package/dist/engine/spec-templates/templates-api-ui.js.map +1 -0
  113. package/dist/engine/spec-templates/templates-auth-crud.d.ts +6 -0
  114. package/dist/engine/spec-templates/templates-auth-crud.d.ts.map +1 -0
  115. package/dist/engine/spec-templates/templates-auth-crud.js +198 -0
  116. package/dist/engine/spec-templates/templates-auth-crud.js.map +1 -0
  117. package/dist/engine/spec-templates/templates-data-security.d.ts +6 -0
  118. package/dist/engine/spec-templates/templates-data-security.d.ts.map +1 -0
  119. package/dist/engine/spec-templates/templates-data-security.js +172 -0
  120. package/dist/engine/spec-templates/templates-data-security.js.map +1 -0
  121. package/dist/engine/spec-templates/templates-perf-integration.d.ts +6 -0
  122. package/dist/engine/spec-templates/templates-perf-integration.d.ts.map +1 -0
  123. package/dist/engine/spec-templates/templates-perf-integration.js +199 -0
  124. package/dist/engine/spec-templates/templates-perf-integration.js.map +1 -0
  125. package/dist/engine/tool-groups/context-analyzer.d.ts +11 -0
  126. package/dist/engine/tool-groups/context-analyzer.d.ts.map +1 -0
  127. package/dist/engine/tool-groups/context-analyzer.js +40 -0
  128. package/dist/engine/tool-groups/context-analyzer.js.map +1 -0
  129. package/dist/engine/tool-groups/group-manager.d.ts +35 -0
  130. package/dist/engine/tool-groups/group-manager.d.ts.map +1 -0
  131. package/dist/engine/tool-groups/group-manager.js +201 -0
  132. package/dist/engine/tool-groups/group-manager.js.map +1 -0
  133. package/dist/engine/vector-store/hnsw.d.ts +37 -0
  134. package/dist/engine/vector-store/hnsw.d.ts.map +1 -0
  135. package/dist/engine/vector-store/hnsw.js +294 -0
  136. package/dist/engine/vector-store/hnsw.js.map +1 -0
  137. package/dist/engine/vector-store/similarity.d.ts +21 -0
  138. package/dist/engine/vector-store/similarity.d.ts.map +1 -0
  139. package/dist/engine/vector-store/similarity.js +86 -0
  140. package/dist/engine/vector-store/similarity.js.map +1 -0
  141. package/dist/engine/vector-store/tfidf.d.ts +35 -0
  142. package/dist/engine/vector-store/tfidf.d.ts.map +1 -0
  143. package/dist/engine/vector-store/tfidf.js +255 -0
  144. package/dist/engine/vector-store/tfidf.js.map +1 -0
  145. package/dist/engine/web-fetcher/registry-loader.d.ts.map +1 -1
  146. package/dist/engine/web-fetcher/registry-loader.js +2 -0
  147. package/dist/engine/web-fetcher/registry-loader.js.map +1 -1
  148. package/dist/index.js +19 -0
  149. package/dist/index.js.map +1 -1
  150. package/dist/storage/vector-store/backend-factory.d.ts +9 -0
  151. package/dist/storage/vector-store/backend-factory.d.ts.map +1 -0
  152. package/dist/storage/vector-store/backend-factory.js +33 -0
  153. package/dist/storage/vector-store/backend-factory.js.map +1 -0
  154. package/dist/storage/vector-store/json-fallback.d.ts +21 -0
  155. package/dist/storage/vector-store/json-fallback.d.ts.map +1 -0
  156. package/dist/storage/vector-store/json-fallback.js +85 -0
  157. package/dist/storage/vector-store/json-fallback.js.map +1 -0
  158. package/dist/storage/vector-store/migrator.d.ts +10 -0
  159. package/dist/storage/vector-store/migrator.d.ts.map +1 -0
  160. package/dist/storage/vector-store/migrator.js +139 -0
  161. package/dist/storage/vector-store/migrator.js.map +1 -0
  162. package/dist/storage/vector-store/sqlite-adapter.d.ts +28 -0
  163. package/dist/storage/vector-store/sqlite-adapter.d.ts.map +1 -0
  164. package/dist/storage/vector-store/sqlite-adapter.js +142 -0
  165. package/dist/storage/vector-store/sqlite-adapter.js.map +1 -0
  166. package/dist/tools/create-spec/constitution-validator.d.ts +4 -0
  167. package/dist/tools/create-spec/constitution-validator.d.ts.map +1 -0
  168. package/dist/tools/create-spec/constitution-validator.js +37 -0
  169. package/dist/tools/create-spec/constitution-validator.js.map +1 -0
  170. package/dist/tools/create-spec/post-creation.d.ts +11 -0
  171. package/dist/tools/create-spec/post-creation.d.ts.map +1 -0
  172. package/dist/tools/create-spec/post-creation.js +48 -0
  173. package/dist/tools/create-spec/post-creation.js.map +1 -0
  174. package/dist/tools/create-spec/spec-builder.d.ts +14 -0
  175. package/dist/tools/create-spec/spec-builder.d.ts.map +1 -0
  176. package/dist/tools/create-spec/spec-builder.js +131 -0
  177. package/dist/tools/create-spec/spec-builder.js.map +1 -0
  178. package/dist/tools/create-spec.d.ts.map +1 -1
  179. package/dist/tools/create-spec.js +42 -172
  180. package/dist/tools/create-spec.js.map +1 -1
  181. package/dist/tools/data-governance/audit-handler.d.ts.map +1 -1
  182. package/dist/tools/data-governance/audit-handler.js +1 -0
  183. package/dist/tools/data-governance/audit-handler.js.map +1 -1
  184. package/dist/tools/design-schema.d.ts.map +1 -1
  185. package/dist/tools/design-schema.js +1 -0
  186. package/dist/tools/design-schema.js.map +1 -1
  187. package/dist/tools/init-project/handler.d.ts.map +1 -1
  188. package/dist/tools/init-project/handler.js +48 -14
  189. package/dist/tools/init-project/handler.js.map +1 -1
  190. package/dist/tools/recommend-model-handler.d.ts +8 -0
  191. package/dist/tools/recommend-model-handler.d.ts.map +1 -0
  192. package/dist/tools/recommend-model-handler.js +65 -0
  193. package/dist/tools/recommend-model-handler.js.map +1 -0
  194. package/dist/tools/register-ai-cost-tools.js +1 -1
  195. package/dist/tools/register-ai-cost-tools.js.map +1 -1
  196. package/dist/tools/register-model-tools.d.ts +3 -0
  197. package/dist/tools/register-model-tools.d.ts.map +1 -0
  198. package/dist/tools/register-model-tools.js +50 -0
  199. package/dist/tools/register-model-tools.js.map +1 -0
  200. package/dist/tools/register-search-tools.d.ts +7 -0
  201. package/dist/tools/register-search-tools.d.ts.map +1 -0
  202. package/dist/tools/register-search-tools.js +34 -0
  203. package/dist/tools/register-search-tools.js.map +1 -0
  204. package/dist/tools/register-spec-tools/core-spec-tools.d.ts.map +1 -1
  205. package/dist/tools/register-spec-tools/core-spec-tools.js +0 -4
  206. package/dist/tools/register-spec-tools/core-spec-tools.js.map +1 -1
  207. package/dist/tools/register-tool-groups.d.ts +7 -0
  208. package/dist/tools/register-tool-groups.d.ts.map +1 -0
  209. package/dist/tools/register-tool-groups.js +39 -0
  210. package/dist/tools/register-tool-groups.js.map +1 -0
  211. package/dist/tools/register-transform-tools.d.ts +3 -0
  212. package/dist/tools/register-transform-tools.d.ts.map +1 -0
  213. package/dist/tools/register-transform-tools.js +29 -0
  214. package/dist/tools/register-transform-tools.js.map +1 -0
  215. package/dist/tools/semantic-search-handler.d.ts +7 -0
  216. package/dist/tools/semantic-search-handler.d.ts.map +1 -0
  217. package/dist/tools/semantic-search-handler.js +72 -0
  218. package/dist/tools/semantic-search-handler.js.map +1 -0
  219. package/dist/tools/suggest-tooling/orchestration-generator.js +1 -1
  220. package/dist/tools/suggest-tooling/orchestration-generator.js.map +1 -1
  221. package/dist/tools/tool-group-handler.d.ts +9 -0
  222. package/dist/tools/tool-group-handler.d.ts.map +1 -0
  223. package/dist/tools/tool-group-handler.js +82 -0
  224. package/dist/tools/tool-group-handler.js.map +1 -0
  225. package/dist/tools/transform-code-handler.d.ts +7 -0
  226. package/dist/tools/transform-code-handler.d.ts.map +1 -0
  227. package/dist/tools/transform-code-handler.js +58 -0
  228. package/dist/tools/transform-code-handler.js.map +1 -0
  229. package/dist/types/advanced-framework.d.ts +47 -0
  230. package/dist/types/advanced-framework.d.ts.map +1 -0
  231. package/dist/types/advanced-framework.js +3 -0
  232. package/dist/types/advanced-framework.js.map +1 -0
  233. package/dist/types/code-transforms.d.ts +114 -0
  234. package/dist/types/code-transforms.d.ts.map +1 -0
  235. package/dist/types/code-transforms.js +11 -0
  236. package/dist/types/code-transforms.js.map +1 -0
  237. package/dist/types/css-framework.d.ts +110 -0
  238. package/dist/types/css-framework.d.ts.map +1 -0
  239. package/dist/types/css-framework.js +3 -0
  240. package/dist/types/css-framework.js.map +1 -0
  241. package/dist/types/dashboard.d.ts +77 -0
  242. package/dist/types/dashboard.d.ts.map +1 -0
  243. package/dist/types/dashboard.js +2 -0
  244. package/dist/types/dashboard.js.map +1 -0
  245. package/dist/types/index.d.ts +4 -0
  246. package/dist/types/index.d.ts.map +1 -1
  247. package/dist/types/index.js +4 -0
  248. package/dist/types/index.js.map +1 -1
  249. package/dist/types/model-routing.d.ts +127 -0
  250. package/dist/types/model-routing.d.ts.map +1 -0
  251. package/dist/types/model-routing.js +3 -0
  252. package/dist/types/model-routing.js.map +1 -0
  253. package/dist/types/project/inputs.d.ts +0 -1
  254. package/dist/types/project/inputs.d.ts.map +1 -1
  255. package/dist/types/spec/core.d.ts +28 -1
  256. package/dist/types/spec/core.d.ts.map +1 -1
  257. package/dist/types/spec/inputs.d.ts +9 -6
  258. package/dist/types/spec/inputs.d.ts.map +1 -1
  259. package/dist/types/tool-groups.d.ts +57 -0
  260. package/dist/types/tool-groups.d.ts.map +1 -0
  261. package/dist/types/tool-groups.js +3 -0
  262. package/dist/types/tool-groups.js.map +1 -0
  263. package/dist/types/ui.d.ts +3 -231
  264. package/dist/types/ui.d.ts.map +1 -1
  265. package/dist/types/ui.js +7 -1
  266. package/dist/types/ui.js.map +1 -1
  267. package/dist/types/vector-store.d.ts +137 -0
  268. package/dist/types/vector-store.d.ts.map +1 -0
  269. package/dist/types/vector-store.js +3 -0
  270. package/dist/types/vector-store.js.map +1 -0
  271. package/package.json +1 -1
  272. package/src/config/model-routing-rules.json +98 -0
  273. package/src/config/tool-groups.json +140 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-fallback.js","sourceRoot":"","sources":["../../../src/storage/vector-store/json-fallback.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { MigrationResult, StorageBackend } from '../../types/index.js';
2
+ /** Check if migration has already been done. */
3
+ export declare function isMigrated(projectId: string): boolean;
4
+ /**
5
+ * Migrate legacy JSON data to the vector store backend.
6
+ * Idempotent: skips if migration marker exists.
7
+ * Does NOT delete original JSON files.
8
+ */
9
+ export declare function migrateJsonToBackend(projectId: string, backend: StorageBackend): Promise<MigrationResult>;
10
+ //# sourceMappingURL=migrator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrator.d.ts","sourceRoot":"","sources":["../../../src/storage/vector-store/migrator.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,eAAe,EACf,cAAc,EAMf,MAAM,sBAAsB,CAAC;AAU9B,gDAAgD;AAChD,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAErD;AAgFD;;;;GAIG;AACH,wBAAsB,oBAAoB,CACxC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,eAAe,CAAC,CAoD1B"}
@@ -0,0 +1,139 @@
1
+ // storage/vector-store/migrator.ts — JSON to SQLite migration.
2
+ // SPEC-075 AC-05: Idempotent, preserves JSON backup.
3
+ import { readJson, projectDataDir } from '../base-store.js';
4
+ import { existsSync } from 'node:fs';
5
+ import { TFIDFEngine } from '../../engine/vector-store/tfidf.js';
6
+ /** Check if a migration marker exists (idempotency). */
7
+ function migrationMarkerPath(projectId) {
8
+ return `${projectDataDir(projectId)}/.vector-migrated`;
9
+ }
10
+ /** Check if migration has already been done. */
11
+ export function isMigrated(projectId) {
12
+ return existsSync(migrationMarkerPath(projectId));
13
+ }
14
+ /** Create migration marker. */
15
+ async function markMigrated(projectId) {
16
+ const { writeFile, mkdir } = await import('node:fs/promises');
17
+ const { dirname } = await import('node:path');
18
+ const markerPath = migrationMarkerPath(projectId);
19
+ await mkdir(dirname(markerPath), { recursive: true });
20
+ await writeFile(markerPath, new Date().toISOString(), 'utf-8');
21
+ }
22
+ /** Load legacy patterns from JSON. */
23
+ async function loadPatterns(dataDir) {
24
+ const items = [];
25
+ const patternsPath = `${dataDir}/patterns.json`;
26
+ if (!existsSync(patternsPath)) {
27
+ return items;
28
+ }
29
+ const patterns = await readJson(patternsPath, []);
30
+ for (let i = 0; i < patterns.length; i++) {
31
+ const p = patterns[i];
32
+ if (p?.pattern) {
33
+ items.push({
34
+ type: 'pattern',
35
+ id: `pattern-${String(i)}`,
36
+ text: p.pattern,
37
+ meta: { category: p.category, usageCount: p.usageCount },
38
+ });
39
+ }
40
+ }
41
+ return items;
42
+ }
43
+ /** Load legacy knowledge from JSON. */
44
+ async function loadKnowledge(dataDir) {
45
+ const items = [];
46
+ const knowledgePath = `${dataDir}/knowledge.json`;
47
+ if (!existsSync(knowledgePath)) {
48
+ return items;
49
+ }
50
+ const knowledge = await readJson(knowledgePath, []);
51
+ for (let i = 0; i < knowledge.length; i++) {
52
+ const k = knowledge[i];
53
+ if (k) {
54
+ items.push({
55
+ type: 'knowledge',
56
+ id: `knowledge-${String(i)}`,
57
+ text: `${k.key}: ${k.value}`,
58
+ meta: { source: k.source },
59
+ });
60
+ }
61
+ }
62
+ return items;
63
+ }
64
+ /** Load legacy decisions from JSON. */
65
+ async function loadDecisions(dataDir) {
66
+ const items = [];
67
+ const decisionsPath = `${dataDir}/decisions.json`;
68
+ if (!existsSync(decisionsPath)) {
69
+ return items;
70
+ }
71
+ const decisions = await readJson(decisionsPath, []);
72
+ for (let i = 0; i < decisions.length; i++) {
73
+ const d = decisions[i];
74
+ if (d) {
75
+ items.push({
76
+ type: 'decision',
77
+ id: `decision-${String(i)}`,
78
+ text: `${d.decision} ${d.rationale ?? ''}`.trim(),
79
+ meta: { specId: d.specId },
80
+ });
81
+ }
82
+ }
83
+ return items;
84
+ }
85
+ /**
86
+ * Migrate legacy JSON data to the vector store backend.
87
+ * Idempotent: skips if migration marker exists.
88
+ * Does NOT delete original JSON files.
89
+ */
90
+ export async function migrateJsonToBackend(projectId, backend) {
91
+ if (isMigrated(projectId)) {
92
+ return { documentsProcessed: 0, durationMs: 0, errors: [] };
93
+ }
94
+ const start = Date.now();
95
+ const errors = [];
96
+ let processed = 0;
97
+ const dataDir = projectDataDir(projectId);
98
+ // Collect all texts, catching errors per source
99
+ const allTexts = [];
100
+ for (const loader of [loadPatterns, loadKnowledge, loadDecisions]) {
101
+ try {
102
+ const items = await loader(dataDir);
103
+ allTexts.push(...items);
104
+ }
105
+ catch (err) {
106
+ errors.push(err instanceof Error ? err.message : String(err));
107
+ }
108
+ }
109
+ // Build IDF from all texts
110
+ const tfidf = new TFIDFEngine();
111
+ for (const item of allTexts) {
112
+ tfidf.addDocument(item.text);
113
+ }
114
+ // Insert all entries with embeddings
115
+ const now = new Date().toISOString();
116
+ for (const item of allTexts) {
117
+ try {
118
+ const embedding = tfidf.embed(item.text);
119
+ const entry = {
120
+ id: item.id,
121
+ type: item.type,
122
+ content: item.text,
123
+ embedding,
124
+ metadata: item.meta,
125
+ createdAt: now,
126
+ updatedAt: now,
127
+ };
128
+ await backend.insert(entry);
129
+ processed++;
130
+ }
131
+ catch (err) {
132
+ errors.push(`${item.id}: ${err instanceof Error ? err.message : String(err)}`);
133
+ }
134
+ }
135
+ await markMigrated(projectId);
136
+ const durationMs = Date.now() - start;
137
+ return { documentsProcessed: processed, durationMs, errors };
138
+ }
139
+ //# sourceMappingURL=migrator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrator.js","sourceRoot":"","sources":["../../../src/storage/vector-store/migrator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import type { StorageBackend, VectorEntry, VectorEntryType, VectorSearchResult, BetterSqlite3Database, BetterSqlite3Constructor } from '../../types/index.js';
2
+ /**
3
+ * Attempt to dynamically import better-sqlite3.
4
+ * Returns null if the package is not installed.
5
+ */
6
+ export declare function tryLoadSqlite(): Promise<BetterSqlite3Constructor | null>;
7
+ /**
8
+ * SQLite storage backend using better-sqlite3.
9
+ * WAL mode for concurrent reads. Embeddings stored as BLOB.
10
+ */
11
+ export declare class SqliteBackend implements StorageBackend {
12
+ private readonly db;
13
+ constructor(db: BetterSqlite3Database);
14
+ private initSchema;
15
+ insert(entry: VectorEntry): Promise<void>;
16
+ update(id: string, partial: Partial<VectorEntry>): Promise<void>;
17
+ delete(id: string): Promise<void>;
18
+ getById(id: string): Promise<VectorEntry | undefined>;
19
+ getAll(type?: VectorEntryType): Promise<VectorEntry[]>;
20
+ searchSimilar(embedding: number[], topK: number, threshold: number, type?: VectorEntryType): Promise<VectorSearchResult[]>;
21
+ close(): void;
22
+ }
23
+ /**
24
+ * Create a SQLite backend for a project.
25
+ * Returns null if better-sqlite3 is not available.
26
+ */
27
+ export declare function createSqliteBackend(projectId: string): Promise<SqliteBackend | null>;
28
+ //# sourceMappingURL=sqlite-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite-adapter.d.ts","sourceRoot":"","sources":["../../../src/storage/vector-store/sqlite-adapter.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,cAAc,EACd,WAAW,EACX,eAAe,EACf,kBAAkB,EAElB,qBAAqB,EACrB,wBAAwB,EACzB,MAAM,sBAAsB,CAAC;AAM9B;;;GAGG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,wBAAwB,GAAG,IAAI,CAAC,CAa9E;AA2BD;;;GAGG;AACH,qBAAa,aAAc,YAAW,cAAc;IAClD,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAwB;gBAE/B,EAAE,EAAE,qBAAqB;IAKrC,OAAO,CAAC,UAAU;IAeZ,MAAM,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAkBzC,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAUhE,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKjC,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC;IAQrD,MAAM,CAAC,IAAI,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAWtD,aAAa,CACjB,SAAS,EAAE,MAAM,EAAE,EACnB,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,EACjB,IAAI,CAAC,EAAE,eAAe,GACrB,OAAO,CAAC,kBAAkB,EAAE,CAAC;IAgBhC,KAAK,IAAI,IAAI;CAGd;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAgB1F"}
@@ -0,0 +1,142 @@
1
+ // storage/vector-store/sqlite-adapter.ts — SQLite storage backend using better-sqlite3.
2
+ // SPEC-075 AC-03: WAL mode, BLOB embeddings, optional native dependency.
3
+ import { cosineSimilarity } from '../../engine/vector-store/similarity.js';
4
+ import { projectDataDir } from '../base-store.js';
5
+ import { mkdirSync, existsSync } from 'node:fs';
6
+ import { dirname } from 'node:path';
7
+ /**
8
+ * Attempt to dynamically import better-sqlite3.
9
+ * Returns null if the package is not installed.
10
+ */
11
+ export async function tryLoadSqlite() {
12
+ try {
13
+ // Dynamic import with variable to avoid TypeScript module resolution
14
+ const moduleName = 'better-sqlite3';
15
+ const mod = (await import(/* webpackIgnore: true */ moduleName));
16
+ /* v8 ignore start -- better-sqlite3 not available in test env */
17
+ return mod.default;
18
+ /* v8 ignore stop */
19
+ }
20
+ catch {
21
+ return null;
22
+ }
23
+ }
24
+ /** Serialize a number[] embedding to a Buffer (Float32Array). */
25
+ function serializeEmbedding(embedding) {
26
+ const float32 = new Float32Array(embedding);
27
+ return Buffer.from(float32.buffer);
28
+ }
29
+ /** Deserialize a Buffer back to number[]. */
30
+ function deserializeEmbedding(buf) {
31
+ const float32 = new Float32Array(buf.buffer, buf.byteOffset, buf.byteLength / 4);
32
+ return [...float32];
33
+ }
34
+ /** Convert a database row to a VectorEntry. */
35
+ function rowToEntry(row) {
36
+ return {
37
+ id: row.id,
38
+ type: row.type,
39
+ content: row.content,
40
+ embedding: deserializeEmbedding(row.embedding),
41
+ metadata: JSON.parse(row.metadata),
42
+ createdAt: row.createdAt,
43
+ updatedAt: row.updatedAt,
44
+ };
45
+ }
46
+ /**
47
+ * SQLite storage backend using better-sqlite3.
48
+ * WAL mode for concurrent reads. Embeddings stored as BLOB.
49
+ */
50
+ export class SqliteBackend {
51
+ db;
52
+ constructor(db) {
53
+ this.db = db;
54
+ this.initSchema();
55
+ }
56
+ initSchema() {
57
+ this.db.exec(`
58
+ CREATE TABLE IF NOT EXISTS vectors (
59
+ id TEXT PRIMARY KEY,
60
+ type TEXT NOT NULL,
61
+ content TEXT NOT NULL,
62
+ embedding BLOB NOT NULL,
63
+ metadata TEXT NOT NULL DEFAULT '{}',
64
+ createdAt TEXT NOT NULL,
65
+ updatedAt TEXT NOT NULL
66
+ );
67
+ CREATE INDEX IF NOT EXISTS idx_vectors_type ON vectors(type);
68
+ `);
69
+ }
70
+ async insert(entry) {
71
+ this.db
72
+ .prepare(`INSERT OR REPLACE INTO vectors (id, type, content, embedding, metadata, createdAt, updatedAt)
73
+ VALUES (?, ?, ?, ?, ?, ?, ?)`)
74
+ .run(entry.id, entry.type, entry.content, serializeEmbedding(entry.embedding), JSON.stringify(entry.metadata), entry.createdAt, entry.updatedAt);
75
+ await Promise.resolve();
76
+ }
77
+ async update(id, partial) {
78
+ const existing = await this.getById(id);
79
+ if (!existing) {
80
+ return;
81
+ }
82
+ const merged = { ...existing, ...partial, id: existing.id };
83
+ await this.insert(merged);
84
+ }
85
+ async delete(id) {
86
+ this.db.prepare('DELETE FROM vectors WHERE id = ?').run(id);
87
+ await Promise.resolve();
88
+ }
89
+ async getById(id) {
90
+ const row = this.db.prepare('SELECT * FROM vectors WHERE id = ?').get(id);
91
+ await Promise.resolve();
92
+ return row ? rowToEntry(row) : undefined;
93
+ }
94
+ async getAll(type) {
95
+ let rows;
96
+ if (type) {
97
+ rows = this.db.prepare('SELECT * FROM vectors WHERE type = ?').all(type);
98
+ }
99
+ else {
100
+ rows = this.db.prepare('SELECT * FROM vectors').all();
101
+ }
102
+ await Promise.resolve();
103
+ return rows.map(rowToEntry);
104
+ }
105
+ async searchSimilar(embedding, topK, threshold, type) {
106
+ // Load all entries of the given type and compute similarity in JS.
107
+ const entries = await this.getAll(type);
108
+ const results = [];
109
+ for (const entry of entries) {
110
+ const similarity = cosineSimilarity(embedding, entry.embedding);
111
+ if (similarity >= threshold) {
112
+ results.push({ entry, similarity });
113
+ }
114
+ }
115
+ results.sort((a, b) => b.similarity - a.similarity);
116
+ return results.slice(0, topK);
117
+ }
118
+ close() {
119
+ this.db.close();
120
+ }
121
+ }
122
+ /**
123
+ * Create a SQLite backend for a project.
124
+ * Returns null if better-sqlite3 is not available.
125
+ */
126
+ export async function createSqliteBackend(projectId) {
127
+ const SqliteConstructor = await tryLoadSqlite();
128
+ /* v8 ignore start -- entire path after this only reachable with better-sqlite3 */
129
+ if (!SqliteConstructor) {
130
+ return null;
131
+ }
132
+ const dbPath = `${projectDataDir(projectId)}/vector-store.db`;
133
+ const dir = dirname(dbPath);
134
+ if (!existsSync(dir)) {
135
+ mkdirSync(dir, { recursive: true });
136
+ }
137
+ const db = SqliteConstructor(dbPath);
138
+ db.pragma('journal_mode = WAL');
139
+ return new SqliteBackend(db);
140
+ /* v8 ignore stop */
141
+ }
142
+ //# sourceMappingURL=sqlite-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite-adapter.js","sourceRoot":"","sources":["../../../src/storage/vector-store/sqlite-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { ConstitutionCheckResult } from '../../types/index.js';
2
+ /** Validates spec against Constitution principles. Returns block result or warnings. */
3
+ export declare function validateConstitution(projectId: string, title: string, tags: string[]): Promise<ConstitutionCheckResult>;
4
+ //# sourceMappingURL=constitution-validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constitution-validator.d.ts","sourceRoot":"","sources":["../../../src/tools/create-spec/constitution-validator.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAIpE,wFAAwF;AACxF,wBAAsB,oBAAoB,CACxC,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EAAE,GACb,OAAO,CAAC,uBAAuB,CAAC,CAqClC"}
@@ -0,0 +1,37 @@
1
+ // tools/create-spec/constitution-validator.ts — Constitution compliance validation.
2
+ // Extracted from create-spec.ts to keep file sizes within limits.
3
+ import { knowledgeStore } from '../../storage/index.js';
4
+ import { checkConstitutionCompliance } from '../create-spec-tech.js';
5
+ /** Validates spec against Constitution principles. Returns block result or warnings. */
6
+ export async function validateConstitution(projectId, title, tags) {
7
+ const constitution = await knowledgeStore.getConstitution(projectId);
8
+ if (!constitution || constitution.principles.length === 0) {
9
+ return { blocked: false, warnings: [] };
10
+ }
11
+ const violations = checkConstitutionCompliance(title, tags, constitution.principles);
12
+ const strictViolations = violations.filter((v) => v.severity === 'error');
13
+ if (strictViolations.length > 0) {
14
+ return {
15
+ blocked: true,
16
+ errorResult: {
17
+ content: [
18
+ {
19
+ type: 'text',
20
+ text: JSON.stringify({
21
+ error: 'Constitution violation',
22
+ strictViolations,
23
+ message: `Spec violates ${strictViolations.length} strict Constitution principle(s). Revise the spec or update the Constitution.`,
24
+ }, null, 2),
25
+ },
26
+ ],
27
+ isError: true,
28
+ },
29
+ warnings: [],
30
+ };
31
+ }
32
+ return {
33
+ blocked: false,
34
+ warnings: violations.filter((v) => v.severity === 'warning'),
35
+ };
36
+ }
37
+ //# sourceMappingURL=constitution-validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constitution-validator.js","sourceRoot":"","sources":["../../../src/tools/create-spec/constitution-validator.ts"],"names":[],"mappings":"AAAA,oFAAoF;AACpF,kEAAkE;AAGlE,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,2BAA2B,EAAE,MAAM,wBAAwB,CAAC;AAErE,wFAAwF;AACxF,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,SAAiB,EACjB,KAAa,EACb,IAAc;IAEd,MAAM,YAAY,GAAG,MAAM,cAAc,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;IACrE,IAAI,CAAC,YAAY,IAAI,YAAY,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1D,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IAC1C,CAAC;IAED,MAAM,UAAU,GAAG,2BAA2B,CAAC,KAAK,EAAE,IAAI,EAAE,YAAY,CAAC,UAAU,CAAC,CAAC;IACrF,MAAM,gBAAgB,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC;IAE1E,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChC,OAAO;YACL,OAAO,EAAE,IAAI;YACb,WAAW,EAAE;gBACX,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAClB;4BACE,KAAK,EAAE,wBAAwB;4BAC/B,gBAAgB;4BAChB,OAAO,EAAE,iBAAiB,gBAAgB,CAAC,MAAM,gFAAgF;yBAClI,EACD,IAAI,EACJ,CAAC,CACF;qBACF;iBACF;gBACD,OAAO,EAAE,IAAI;aACd;YACD,QAAQ,EAAE,EAAE;SACb,CAAC;IACJ,CAAC;IAED,OAAO;QACL,OAAO,EAAE,KAAK;QACd,QAAQ,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,SAAS,CAAC;KAC7D,CAAC;AACJ,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { Spec } from '../../types/index.js';
2
+ /** Auto-setup git branch (non-blocking). Returns branch info or undefined. */
3
+ export declare function setupGitBranch(projectId: string, specId: string): Promise<{
4
+ branch: string;
5
+ data: unknown;
6
+ } | undefined>;
7
+ /** Brief contradiction check (non-blocking). Returns a warning hint or undefined. */
8
+ export declare function checkContradictions(projectId: string, specId: string, description: string): Promise<string | undefined>;
9
+ /** Dispatches the on_spec_created hook event (fire-and-forget). */
10
+ export declare function fireSpecCreatedHook(projectId: string, spec: Spec): void;
11
+ //# sourceMappingURL=post-creation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"post-creation.d.ts","sourceRoot":"","sources":["../../../src/tools/create-spec/post-creation.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAKjD,8EAA8E;AAC9E,wBAAsB,cAAc,CAClC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CAAE,GAAG,SAAS,CAAC,CAQxD;AAED,qFAAqF;AACrF,wBAAsB,mBAAmB,CACvC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAsB7B;AAED,mEAAmE;AACnE,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI,CAUvE"}
@@ -0,0 +1,48 @@
1
+ // tools/create-spec/post-creation.ts — Git setup + contradiction detection after spec creation.
2
+ // Extracted from create-spec.ts to keep file sizes within limits.
3
+ import { specStore } from '../../storage/index.js';
4
+ import { detectContradictions } from '../../engine/contradiction-detector.js';
5
+ import { tryAutoSetupGit } from '../create-spec-helpers.js';
6
+ /** Auto-setup git branch (non-blocking). Returns branch info or undefined. */
7
+ export async function setupGitBranch(projectId, specId) {
8
+ const result = await tryAutoSetupGit(projectId, specId);
9
+ /* v8 ignore start -- requires real git repo */
10
+ if (result) {
11
+ return { branch: result.branch, data: result.data };
12
+ }
13
+ /* v8 ignore stop */
14
+ return undefined;
15
+ }
16
+ /** Brief contradiction check (non-blocking). Returns a warning hint or undefined. */
17
+ export async function checkContradictions(projectId, specId, description) {
18
+ try {
19
+ const allSpecs = await specStore.listSpecs(projectId);
20
+ const specInputs = allSpecs.map((s) => ({
21
+ id: s.id,
22
+ title: s.title,
23
+ content: s.title + ' ' + description,
24
+ }));
25
+ const contradictions = detectContradictions(specInputs);
26
+ const newSpecContradictions = contradictions.filter((c) => c.specA === specId || c.specB === specId);
27
+ if (newSpecContradictions.length === 0) {
28
+ return undefined;
29
+ }
30
+ const blockers = newSpecContradictions.filter((c) => c.severity === 'blocker');
31
+ return blockers.length > 0
32
+ ? `[CONFLICT] ${blockers.length} potential blocker contradiction(s) detected. Run detect_contradictions for details.`
33
+ : `[WARNING] ${newSpecContradictions.length} potential contradiction(s) detected. Run detect_contradictions for details.`;
34
+ }
35
+ catch {
36
+ return undefined;
37
+ }
38
+ }
39
+ /** Dispatches the on_spec_created hook event (fire-and-forget). */
40
+ export function fireSpecCreatedHook(projectId, spec) {
41
+ // Dynamic imports to avoid circular dependency issues
42
+ void (async () => {
43
+ const { dispatchHookEvent } = await import('../manage-hooks.js');
44
+ const { buildSpecCreatedPayload } = await import('../../engine/hooks/triggers.js');
45
+ void dispatchHookEvent(projectId, buildSpecCreatedPayload(projectId, spec.id, spec.title, spec.type));
46
+ })();
47
+ }
48
+ //# sourceMappingURL=post-creation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"post-creation.js","sourceRoot":"","sources":["../../../src/tools/create-spec/post-creation.ts"],"names":[],"mappings":"AAAA,gGAAgG;AAChG,kEAAkE;AAGlE,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,oBAAoB,EAAE,MAAM,wCAAwC,CAAC;AAC9E,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAE5D,8EAA8E;AAC9E,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,SAAiB,EACjB,MAAc;IAEd,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IACxD,+CAA+C;IAC/C,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;IACtD,CAAC;IACD,oBAAoB;IACpB,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,qFAAqF;AACrF,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,SAAiB,EACjB,MAAc,EACd,WAAmB;IAEnB,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QACtD,MAAM,UAAU,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACtC,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,OAAO,EAAE,CAAC,CAAC,KAAK,GAAG,GAAG,GAAG,WAAW;SACrC,CAAC,CAAC,CAAC;QACJ,MAAM,cAAc,GAAG,oBAAoB,CAAC,UAAU,CAAC,CAAC;QACxD,MAAM,qBAAqB,GAAG,cAAc,CAAC,MAAM,CACjD,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,MAAM,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,CAChD,CAAC;QACF,IAAI,qBAAqB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvC,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,MAAM,QAAQ,GAAG,qBAAqB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC;QAC/E,OAAO,QAAQ,CAAC,MAAM,GAAG,CAAC;YACxB,CAAC,CAAC,cAAc,QAAQ,CAAC,MAAM,sFAAsF;YACrH,CAAC,CAAC,aAAa,qBAAqB,CAAC,MAAM,8EAA8E,CAAC;IAC9H,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,mEAAmE;AACnE,MAAM,UAAU,mBAAmB,CAAC,SAAiB,EAAE,IAAU;IAC/D,sDAAsD;IACtD,KAAK,CAAC,KAAK,IAAmB,EAAE;QAC9B,MAAM,EAAE,iBAAiB,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;QACjE,MAAM,EAAE,uBAAuB,EAAE,GAAG,MAAM,MAAM,CAAC,gCAAgC,CAAC,CAAC;QACnF,KAAK,iBAAiB,CACpB,SAAS,EACT,uBAAuB,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CACnE,CAAC;IACJ,CAAC,CAAC,EAAE,CAAC;AACP,CAAC"}
@@ -0,0 +1,14 @@
1
+ import type { CreateSpecInput, SpecBuildContext } from '../../types/index.js';
2
+ import { analyzeSplit } from '../../engine/spec-splitter.js';
3
+ export type { SpecBuildContext };
4
+ /** Builds the Spec object, calculates estimation, generates diagrams, and scope filters. */
5
+ export declare function buildSpecContext(params: CreateSpecInput): Promise<{
6
+ ok: true;
7
+ context: SpecBuildContext;
8
+ } | {
9
+ ok: false;
10
+ errorMessage: string;
11
+ }>;
12
+ /** Builds the split suggestion result object if applicable. */
13
+ export declare function buildSplitResult(splitSuggestion: ReturnType<typeof analyzeSplit>, experienceLevel: string | undefined): Record<string, unknown> | undefined;
14
+ //# sourceMappingURL=spec-builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spec-builder.d.ts","sourceRoot":"","sources":["../../../src/tools/create-spec/spec-builder.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,eAAe,EAIf,gBAAgB,EACjB,MAAM,sBAAsB,CAAC;AAM9B,OAAO,EAAE,YAAY,EAAyB,MAAM,+BAA+B,CAAC;AAMpF,YAAY,EAAE,gBAAgB,EAAE,CAAC;AAEjC,4FAA4F;AAC5F,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,eAAe,GACtB,OAAO,CAAC;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,gBAAgB,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAAC,CAkIxF;AAED,+DAA+D;AAC/D,wBAAgB,gBAAgB,CAC9B,eAAe,EAAE,UAAU,CAAC,OAAO,YAAY,CAAC,EAChD,eAAe,EAAE,MAAM,GAAG,SAAS,GAClC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAWrC"}
@@ -0,0 +1,131 @@
1
+ // tools/create-spec/spec-builder.ts — Builds the Spec object, diagrams, and scope filters.
2
+ // Extracted from create-spec.ts to keep file sizes within limits.
3
+ import { hashProjectPath, knowledgeStore, specStore, globalStore } from '../../storage/index.js';
4
+ import { getCurrentTier } from '../license-gate.js';
5
+ import { checkLimits } from '../../engine/license-validator.js';
6
+ import { inferDifficulty, calculateEstimation } from '../../engine/estimator.js';
7
+ import { generateDiagrams } from '../../engine/mermaid-generator.js';
8
+ import { analyzeSplit, formatSplitSuggestion } from '../../engine/spec-splitter.js';
9
+ import { getScopeFilters } from '../../engine/scope-filter.js';
10
+ import { isLegacyLocation, getSpecFileNames } from '../../engine/planu-config-writer.js';
11
+ import { slugify, generateSpecId, generateBranchName } from '../create-spec-helpers.js';
12
+ import { join } from 'node:path';
13
+ /** Builds the Spec object, calculates estimation, generates diagrams, and scope filters. */
14
+ export async function buildSpecContext(params) {
15
+ const { title, description, projectPath, type = 'feature', scope = 'feature', target = 'fullstack', tags = [], feature, } = params;
16
+ const projectId = hashProjectPath(projectPath);
17
+ const knowledge = await knowledgeStore.getKnowledge(projectId);
18
+ const existingSpecs = await specStore.listSpecs(projectId);
19
+ // License: check active spec limit (exclude completed specs)
20
+ const activeSpecs = existingSpecs.filter((s) => s.status !== 'done');
21
+ const tier = await getCurrentTier();
22
+ const specLimit = checkLimits(tier, activeSpecs.length, 'maxActiveSpecs');
23
+ /* v8 ignore start -- license limit requires paid tier test env */
24
+ if (!specLimit.allowed) {
25
+ return { ok: false, errorMessage: specLimit.message };
26
+ }
27
+ /* v8 ignore stop */
28
+ // Generate spec ID and slug
29
+ const specId = generateSpecId(existingSpecs.length);
30
+ const slug = slugify(title);
31
+ // Check for duplicate title
32
+ const duplicate = existingSpecs.find((s) => slugify(s.title) === slug);
33
+ // Infer difficulty and calculate estimation
34
+ const difficulty = inferDifficulty(type, scope);
35
+ const globalConfig = await globalStore.getGlobalConfig();
36
+ const estimation = calculateEstimation(type, scope, difficulty, globalConfig);
37
+ // Determine risk level from difficulty and scope
38
+ const risk = difficulty >= 4 || scope === 'architectural'
39
+ ? 'high'
40
+ : difficulty >= 3 || scope === 'cross-module'
41
+ ? 'medium'
42
+ : 'low';
43
+ // Build spec location with naming convention detection
44
+ const specLocation = knowledge?.specLocation ?? 'planu/specs';
45
+ const naming = isLegacyLocation(specLocation) ? 'legacy' : 'modern';
46
+ const fileNames = getSpecFileNames(naming);
47
+ const featureSlug = feature ? slugify(feature) : '_general';
48
+ const specDir = join(projectPath, specLocation, featureSlug, slug);
49
+ const specPath = join(specDir, fileNames.spec);
50
+ const technicalPath = join(specDir, fileNames.technical);
51
+ const progressPath = join(specDir, fileNames.progress);
52
+ // Generate git branch name
53
+ const gitBranch = generateBranchName(specId, slug, type);
54
+ // Build the Spec object
55
+ const now = new Date().toISOString();
56
+ const spec = {
57
+ id: specId,
58
+ title,
59
+ slug,
60
+ feature: featureSlug,
61
+ type,
62
+ scope,
63
+ status: 'draft',
64
+ difficulty,
65
+ risk,
66
+ projectId,
67
+ createdAt: now,
68
+ updatedAt: now,
69
+ specPath,
70
+ technicalPath,
71
+ progressPath,
72
+ estimation,
73
+ actuals: null,
74
+ target,
75
+ tags,
76
+ dependencies: [],
77
+ blockedBy: [],
78
+ gitBranch,
79
+ impactAnalysis: null,
80
+ };
81
+ // Detect context flags for diagrams and filters
82
+ const { detectContextFlags } = await import('../create-spec-tech.js');
83
+ const contextFlags = detectContextFlags(spec, knowledge);
84
+ // Generate Mermaid diagrams
85
+ const diagrams = generateDiagrams(spec, knowledge, contextFlags);
86
+ // Analyze if spec should be split
87
+ const splitSuggestion = analyzeSplit({
88
+ criteriaCount: 4,
89
+ moduleCount: scope === 'cross-module' ? 5 : scope === 'architectural' ? 6 : 2,
90
+ estimatedHours: estimation.devHours,
91
+ description,
92
+ type,
93
+ scope,
94
+ target,
95
+ }, specId);
96
+ // Get scope filter configuration
97
+ const scopeFilters = getScopeFilters(scope, {
98
+ hasDatabase: contextFlags.hasDatabase,
99
+ hasUi: contextFlags.hasUi,
100
+ });
101
+ return {
102
+ ok: true,
103
+ context: {
104
+ spec,
105
+ specDir,
106
+ specPath,
107
+ technicalPath,
108
+ progressPath,
109
+ diagrams,
110
+ estimation,
111
+ splitSuggestion,
112
+ scopeFilters,
113
+ duplicate,
114
+ projectId,
115
+ },
116
+ };
117
+ }
118
+ /** Builds the split suggestion result object if applicable. */
119
+ export function buildSplitResult(splitSuggestion, experienceLevel) {
120
+ if (!splitSuggestion) {
121
+ return undefined;
122
+ }
123
+ const level = experienceLevel ?? 'intermediate';
124
+ return {
125
+ shouldSplit: true,
126
+ reason: splitSuggestion.reason,
127
+ subSpecs: splitSuggestion.suggestedSpecs,
128
+ formatted: formatSplitSuggestion(splitSuggestion, level === 'beginner' ? 'beginner' : 'expert'),
129
+ };
130
+ }
131
+ //# sourceMappingURL=spec-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spec-builder.js","sourceRoot":"","sources":["../../../src/tools/create-spec/spec-builder.ts"],"names":[],"mappings":"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"}