@planu/cli 0.28.0 → 0.30.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 (297) hide show
  1. package/dist/config/model-routing-rules.json +98 -0
  2. package/dist/engine/ai-cost-estimator/core.d.ts.map +1 -1
  3. package/dist/engine/ai-cost-estimator/core.js +2 -202
  4. package/dist/engine/ai-cost-estimator/core.js.map +1 -1
  5. package/dist/engine/ai-cost-estimator/recommender.d.ts +8 -0
  6. package/dist/engine/ai-cost-estimator/recommender.d.ts.map +1 -0
  7. package/dist/engine/ai-cost-estimator/recommender.js +94 -0
  8. package/dist/engine/ai-cost-estimator/recommender.js.map +1 -0
  9. package/dist/engine/ai-cost-estimator/spec-loader.d.ts +13 -0
  10. package/dist/engine/ai-cost-estimator/spec-loader.d.ts.map +1 -0
  11. package/dist/engine/ai-cost-estimator/spec-loader.js +102 -0
  12. package/dist/engine/ai-cost-estimator/spec-loader.js.map +1 -0
  13. package/dist/engine/ci-generator/planu-config.d.ts +7 -0
  14. package/dist/engine/ci-generator/planu-config.d.ts.map +1 -0
  15. package/dist/engine/ci-generator/planu-config.js +40 -0
  16. package/dist/engine/ci-generator/planu-config.js.map +1 -0
  17. package/dist/engine/ci-generator/planu-steps.d.ts +11 -0
  18. package/dist/engine/ci-generator/planu-steps.d.ts.map +1 -0
  19. package/dist/engine/ci-generator/planu-steps.js +292 -0
  20. package/dist/engine/ci-generator/planu-steps.js.map +1 -0
  21. package/dist/engine/code-transforms/transform-engine.d.ts +7 -0
  22. package/dist/engine/code-transforms/transform-engine.d.ts.map +1 -0
  23. package/dist/engine/code-transforms/transform-engine.js +67 -0
  24. package/dist/engine/code-transforms/transform-engine.js.map +1 -0
  25. package/dist/engine/code-transforms/typescript/add-error-handling.d.ts +6 -0
  26. package/dist/engine/code-transforms/typescript/add-error-handling.d.ts.map +1 -0
  27. package/dist/engine/code-transforms/typescript/add-error-handling.js +92 -0
  28. package/dist/engine/code-transforms/typescript/add-error-handling.js.map +1 -0
  29. package/dist/engine/code-transforms/typescript/add-jsdoc.d.ts +6 -0
  30. package/dist/engine/code-transforms/typescript/add-jsdoc.d.ts.map +1 -0
  31. package/dist/engine/code-transforms/typescript/add-jsdoc.js +83 -0
  32. package/dist/engine/code-transforms/typescript/add-jsdoc.js.map +1 -0
  33. package/dist/engine/code-transforms/typescript/add-types.d.ts +3 -0
  34. package/dist/engine/code-transforms/typescript/add-types.d.ts.map +1 -0
  35. package/dist/engine/code-transforms/typescript/add-types.js +182 -0
  36. package/dist/engine/code-transforms/typescript/add-types.js.map +1 -0
  37. package/dist/engine/code-transforms/typescript/ast-utils.d.ts +38 -0
  38. package/dist/engine/code-transforms/typescript/ast-utils.d.ts.map +1 -0
  39. package/dist/engine/code-transforms/typescript/ast-utils.js +90 -0
  40. package/dist/engine/code-transforms/typescript/ast-utils.js.map +1 -0
  41. package/dist/engine/code-transforms/typescript/extract-interface.d.ts +6 -0
  42. package/dist/engine/code-transforms/typescript/extract-interface.d.ts.map +1 -0
  43. package/dist/engine/code-transforms/typescript/extract-interface.js +103 -0
  44. package/dist/engine/code-transforms/typescript/extract-interface.js.map +1 -0
  45. package/dist/engine/code-transforms/typescript/modernize-syntax.d.ts +3 -0
  46. package/dist/engine/code-transforms/typescript/modernize-syntax.d.ts.map +1 -0
  47. package/dist/engine/code-transforms/typescript/modernize-syntax.js +213 -0
  48. package/dist/engine/code-transforms/typescript/modernize-syntax.js.map +1 -0
  49. package/dist/engine/code-transforms/typescript/rename-symbol.d.ts +8 -0
  50. package/dist/engine/code-transforms/typescript/rename-symbol.d.ts.map +1 -0
  51. package/dist/engine/code-transforms/typescript/rename-symbol.js +40 -0
  52. package/dist/engine/code-transforms/typescript/rename-symbol.js.map +1 -0
  53. package/dist/engine/mermaid/core.d.ts +18 -0
  54. package/dist/engine/mermaid/core.d.ts.map +1 -0
  55. package/dist/engine/mermaid/core.js +88 -0
  56. package/dist/engine/mermaid/core.js.map +1 -0
  57. package/dist/engine/mermaid/diagram-generators.d.ts +22 -0
  58. package/dist/engine/mermaid/diagram-generators.d.ts.map +1 -0
  59. package/dist/engine/mermaid/diagram-generators.js +139 -0
  60. package/dist/engine/mermaid/diagram-generators.js.map +1 -0
  61. package/dist/engine/mermaid/helpers.d.ts +8 -0
  62. package/dist/engine/mermaid/helpers.d.ts.map +1 -0
  63. package/dist/engine/mermaid/helpers.js +61 -0
  64. package/dist/engine/mermaid/helpers.js.map +1 -0
  65. package/dist/engine/mermaid-generator.d.ts +2 -37
  66. package/dist/engine/mermaid-generator.d.ts.map +1 -1
  67. package/dist/engine/mermaid-generator.js +4 -276
  68. package/dist/engine/mermaid-generator.js.map +1 -1
  69. package/dist/engine/model-router/complexity-analyzer.d.ts +26 -0
  70. package/dist/engine/model-router/complexity-analyzer.d.ts.map +1 -0
  71. package/dist/engine/model-router/complexity-analyzer.js +182 -0
  72. package/dist/engine/model-router/complexity-analyzer.js.map +1 -0
  73. package/dist/engine/model-router/cost-estimator.d.ts +6 -0
  74. package/dist/engine/model-router/cost-estimator.d.ts.map +1 -0
  75. package/dist/engine/model-router/cost-estimator.js +60 -0
  76. package/dist/engine/model-router/cost-estimator.js.map +1 -0
  77. package/dist/engine/model-router/historical-learner.d.ts +26 -0
  78. package/dist/engine/model-router/historical-learner.d.ts.map +1 -0
  79. package/dist/engine/model-router/historical-learner.js +91 -0
  80. package/dist/engine/model-router/historical-learner.js.map +1 -0
  81. package/dist/engine/model-router/rules-engine.d.ts +13 -0
  82. package/dist/engine/model-router/rules-engine.d.ts.map +1 -0
  83. package/dist/engine/model-router/rules-engine.js +142 -0
  84. package/dist/engine/model-router/rules-engine.js.map +1 -0
  85. package/dist/engine/spec-coverage/criteria-mapper.d.ts +1 -2
  86. package/dist/engine/spec-coverage/criteria-mapper.d.ts.map +1 -1
  87. package/dist/engine/spec-coverage/criteria-mapper.js +4 -203
  88. package/dist/engine/spec-coverage/criteria-mapper.js.map +1 -1
  89. package/dist/engine/spec-coverage/keyword-extractor.d.ts +10 -0
  90. package/dist/engine/spec-coverage/keyword-extractor.d.ts.map +1 -0
  91. package/dist/engine/spec-coverage/keyword-extractor.js +147 -0
  92. package/dist/engine/spec-coverage/keyword-extractor.js.map +1 -0
  93. package/dist/engine/spec-coverage/test-matchers.d.ts +9 -0
  94. package/dist/engine/spec-coverage/test-matchers.d.ts.map +1 -0
  95. package/dist/engine/spec-coverage/test-matchers.js +59 -0
  96. package/dist/engine/spec-coverage/test-matchers.js.map +1 -0
  97. package/dist/engine/spec-templates/catalog-extra.d.ts +1 -1
  98. package/dist/engine/spec-templates/catalog-extra.d.ts.map +1 -1
  99. package/dist/engine/spec-templates/catalog-extra.js +8 -363
  100. package/dist/engine/spec-templates/catalog-extra.js.map +1 -1
  101. package/dist/engine/spec-templates/catalog-industry.d.ts +4 -0
  102. package/dist/engine/spec-templates/catalog-industry.d.ts.map +1 -0
  103. package/dist/engine/spec-templates/catalog-industry.js +19 -0
  104. package/dist/engine/spec-templates/catalog-industry.js.map +1 -0
  105. package/dist/engine/spec-templates/catalog.d.ts +1 -1
  106. package/dist/engine/spec-templates/catalog.d.ts.map +1 -1
  107. package/dist/engine/spec-templates/catalog.js +12 -381
  108. package/dist/engine/spec-templates/catalog.js.map +1 -1
  109. package/dist/engine/spec-templates/custom-loader.d.ts +12 -0
  110. package/dist/engine/spec-templates/custom-loader.d.ts.map +1 -0
  111. package/dist/engine/spec-templates/custom-loader.js +99 -0
  112. package/dist/engine/spec-templates/custom-loader.js.map +1 -0
  113. package/dist/engine/spec-templates/index.d.ts +4 -2
  114. package/dist/engine/spec-templates/index.d.ts.map +1 -1
  115. package/dist/engine/spec-templates/index.js +4 -2
  116. package/dist/engine/spec-templates/index.js.map +1 -1
  117. package/dist/engine/spec-templates/query.d.ts +12 -4
  118. package/dist/engine/spec-templates/query.d.ts.map +1 -1
  119. package/dist/engine/spec-templates/query.js +29 -7
  120. package/dist/engine/spec-templates/query.js.map +1 -1
  121. package/dist/engine/spec-templates/renderer.d.ts +27 -2
  122. package/dist/engine/spec-templates/renderer.d.ts.map +1 -1
  123. package/dist/engine/spec-templates/renderer.js +119 -4
  124. package/dist/engine/spec-templates/renderer.js.map +1 -1
  125. package/dist/engine/spec-templates/templates-api-ui.d.ts +6 -0
  126. package/dist/engine/spec-templates/templates-api-ui.d.ts.map +1 -0
  127. package/dist/engine/spec-templates/templates-api-ui.js +215 -0
  128. package/dist/engine/spec-templates/templates-api-ui.js.map +1 -0
  129. package/dist/engine/spec-templates/templates-auth-crud.d.ts +6 -0
  130. package/dist/engine/spec-templates/templates-auth-crud.d.ts.map +1 -0
  131. package/dist/engine/spec-templates/templates-auth-crud.js +225 -0
  132. package/dist/engine/spec-templates/templates-auth-crud.js.map +1 -0
  133. package/dist/engine/spec-templates/templates-data-security.d.ts +6 -0
  134. package/dist/engine/spec-templates/templates-data-security.d.ts.map +1 -0
  135. package/dist/engine/spec-templates/templates-data-security.js +198 -0
  136. package/dist/engine/spec-templates/templates-data-security.js.map +1 -0
  137. package/dist/engine/spec-templates/templates-industry-ecom.d.ts +6 -0
  138. package/dist/engine/spec-templates/templates-industry-ecom.d.ts.map +1 -0
  139. package/dist/engine/spec-templates/templates-industry-ecom.js +209 -0
  140. package/dist/engine/spec-templates/templates-industry-ecom.js.map +1 -0
  141. package/dist/engine/spec-templates/templates-industry-fintech.d.ts +8 -0
  142. package/dist/engine/spec-templates/templates-industry-fintech.d.ts.map +1 -0
  143. package/dist/engine/spec-templates/templates-industry-fintech.js +350 -0
  144. package/dist/engine/spec-templates/templates-industry-fintech.js.map +1 -0
  145. package/dist/engine/spec-templates/templates-industry-health-ecom.d.ts +3 -0
  146. package/dist/engine/spec-templates/templates-industry-health-ecom.d.ts.map +1 -0
  147. package/dist/engine/spec-templates/templates-industry-health-ecom.js +5 -0
  148. package/dist/engine/spec-templates/templates-industry-health-ecom.js.map +1 -0
  149. package/dist/engine/spec-templates/templates-industry-health.d.ts +6 -0
  150. package/dist/engine/spec-templates/templates-industry-health.d.ts.map +1 -0
  151. package/dist/engine/spec-templates/templates-industry-health.js +208 -0
  152. package/dist/engine/spec-templates/templates-industry-health.js.map +1 -0
  153. package/dist/engine/spec-templates/templates-industry-saas.d.ts +8 -0
  154. package/dist/engine/spec-templates/templates-industry-saas.d.ts.map +1 -0
  155. package/dist/engine/spec-templates/templates-industry-saas.js +323 -0
  156. package/dist/engine/spec-templates/templates-industry-saas.js.map +1 -0
  157. package/dist/engine/spec-templates/templates-perf-integration.d.ts +6 -0
  158. package/dist/engine/spec-templates/templates-perf-integration.d.ts.map +1 -0
  159. package/dist/engine/spec-templates/templates-perf-integration.js +226 -0
  160. package/dist/engine/spec-templates/templates-perf-integration.js.map +1 -0
  161. package/dist/engine/vector-store/hnsw.d.ts +37 -0
  162. package/dist/engine/vector-store/hnsw.d.ts.map +1 -0
  163. package/dist/engine/vector-store/hnsw.js +294 -0
  164. package/dist/engine/vector-store/hnsw.js.map +1 -0
  165. package/dist/engine/vector-store/similarity.d.ts +21 -0
  166. package/dist/engine/vector-store/similarity.d.ts.map +1 -0
  167. package/dist/engine/vector-store/similarity.js +86 -0
  168. package/dist/engine/vector-store/similarity.js.map +1 -0
  169. package/dist/engine/vector-store/tfidf.d.ts +35 -0
  170. package/dist/engine/vector-store/tfidf.d.ts.map +1 -0
  171. package/dist/engine/vector-store/tfidf.js +255 -0
  172. package/dist/engine/vector-store/tfidf.js.map +1 -0
  173. package/dist/index.js +6 -0
  174. package/dist/index.js.map +1 -1
  175. package/dist/storage/vector-store/backend-factory.d.ts +9 -0
  176. package/dist/storage/vector-store/backend-factory.d.ts.map +1 -0
  177. package/dist/storage/vector-store/backend-factory.js +33 -0
  178. package/dist/storage/vector-store/backend-factory.js.map +1 -0
  179. package/dist/storage/vector-store/json-fallback.d.ts +21 -0
  180. package/dist/storage/vector-store/json-fallback.d.ts.map +1 -0
  181. package/dist/storage/vector-store/json-fallback.js +85 -0
  182. package/dist/storage/vector-store/json-fallback.js.map +1 -0
  183. package/dist/storage/vector-store/migrator.d.ts +10 -0
  184. package/dist/storage/vector-store/migrator.d.ts.map +1 -0
  185. package/dist/storage/vector-store/migrator.js +139 -0
  186. package/dist/storage/vector-store/migrator.js.map +1 -0
  187. package/dist/storage/vector-store/sqlite-adapter.d.ts +28 -0
  188. package/dist/storage/vector-store/sqlite-adapter.d.ts.map +1 -0
  189. package/dist/storage/vector-store/sqlite-adapter.js +142 -0
  190. package/dist/storage/vector-store/sqlite-adapter.js.map +1 -0
  191. package/dist/tools/ci-planu-handler.d.ts +8 -0
  192. package/dist/tools/ci-planu-handler.d.ts.map +1 -0
  193. package/dist/tools/ci-planu-handler.js +44 -0
  194. package/dist/tools/ci-planu-handler.js.map +1 -0
  195. package/dist/tools/create-spec/constitution-validator.d.ts +4 -0
  196. package/dist/tools/create-spec/constitution-validator.d.ts.map +1 -0
  197. package/dist/tools/create-spec/constitution-validator.js +37 -0
  198. package/dist/tools/create-spec/constitution-validator.js.map +1 -0
  199. package/dist/tools/create-spec/post-creation.d.ts +11 -0
  200. package/dist/tools/create-spec/post-creation.d.ts.map +1 -0
  201. package/dist/tools/create-spec/post-creation.js +48 -0
  202. package/dist/tools/create-spec/post-creation.js.map +1 -0
  203. package/dist/tools/create-spec/spec-builder.d.ts +14 -0
  204. package/dist/tools/create-spec/spec-builder.d.ts.map +1 -0
  205. package/dist/tools/create-spec/spec-builder.js +131 -0
  206. package/dist/tools/create-spec/spec-builder.js.map +1 -0
  207. package/dist/tools/create-spec.d.ts.map +1 -1
  208. package/dist/tools/create-spec.js +42 -172
  209. package/dist/tools/create-spec.js.map +1 -1
  210. package/dist/tools/init-project/handler.d.ts.map +1 -1
  211. package/dist/tools/init-project/handler.js +24 -159
  212. package/dist/tools/init-project/handler.js.map +1 -1
  213. package/dist/tools/init-project/result-builder.d.ts +4 -0
  214. package/dist/tools/init-project/result-builder.d.ts.map +1 -0
  215. package/dist/tools/init-project/result-builder.js +150 -0
  216. package/dist/tools/init-project/result-builder.js.map +1 -0
  217. package/dist/tools/learn.d.ts.map +1 -1
  218. package/dist/tools/learn.js +67 -14
  219. package/dist/tools/learn.js.map +1 -1
  220. package/dist/tools/recommend-model-handler.d.ts +8 -0
  221. package/dist/tools/recommend-model-handler.d.ts.map +1 -0
  222. package/dist/tools/recommend-model-handler.js +65 -0
  223. package/dist/tools/recommend-model-handler.js.map +1 -0
  224. package/dist/tools/register-ci-tools.d.ts.map +1 -1
  225. package/dist/tools/register-ci-tools.js +36 -0
  226. package/dist/tools/register-ci-tools.js.map +1 -1
  227. package/dist/tools/register-model-tools.d.ts +3 -0
  228. package/dist/tools/register-model-tools.d.ts.map +1 -0
  229. package/dist/tools/register-model-tools.js +50 -0
  230. package/dist/tools/register-model-tools.js.map +1 -0
  231. package/dist/tools/register-search-tools.d.ts +7 -0
  232. package/dist/tools/register-search-tools.d.ts.map +1 -0
  233. package/dist/tools/register-search-tools.js +34 -0
  234. package/dist/tools/register-search-tools.js.map +1 -0
  235. package/dist/tools/register-template-tools.d.ts.map +1 -1
  236. package/dist/tools/register-template-tools.js +21 -8
  237. package/dist/tools/register-template-tools.js.map +1 -1
  238. package/dist/tools/register-transform-tools.d.ts +3 -0
  239. package/dist/tools/register-transform-tools.d.ts.map +1 -0
  240. package/dist/tools/register-transform-tools.js +29 -0
  241. package/dist/tools/register-transform-tools.js.map +1 -0
  242. package/dist/tools/semantic-search-handler.d.ts +7 -0
  243. package/dist/tools/semantic-search-handler.d.ts.map +1 -0
  244. package/dist/tools/semantic-search-handler.js +72 -0
  245. package/dist/tools/semantic-search-handler.js.map +1 -0
  246. package/dist/tools/spec-templates.d.ts +1 -1
  247. package/dist/tools/spec-templates.d.ts.map +1 -1
  248. package/dist/tools/spec-templates.js +20 -6
  249. package/dist/tools/spec-templates.js.map +1 -1
  250. package/dist/tools/transform-code-handler.d.ts +7 -0
  251. package/dist/tools/transform-code-handler.d.ts.map +1 -0
  252. package/dist/tools/transform-code-handler.js +58 -0
  253. package/dist/tools/transform-code-handler.js.map +1 -0
  254. package/dist/types/advanced-framework.d.ts +47 -0
  255. package/dist/types/advanced-framework.d.ts.map +1 -0
  256. package/dist/types/advanced-framework.js +3 -0
  257. package/dist/types/advanced-framework.js.map +1 -0
  258. package/dist/types/ci.d.ts +51 -0
  259. package/dist/types/ci.d.ts.map +1 -1
  260. package/dist/types/code-transforms.d.ts +114 -0
  261. package/dist/types/code-transforms.d.ts.map +1 -0
  262. package/dist/types/code-transforms.js +11 -0
  263. package/dist/types/code-transforms.js.map +1 -0
  264. package/dist/types/css-framework.d.ts +110 -0
  265. package/dist/types/css-framework.d.ts.map +1 -0
  266. package/dist/types/css-framework.js +3 -0
  267. package/dist/types/css-framework.js.map +1 -0
  268. package/dist/types/dashboard.d.ts +77 -0
  269. package/dist/types/dashboard.d.ts.map +1 -0
  270. package/dist/types/dashboard.js +2 -0
  271. package/dist/types/dashboard.js.map +1 -0
  272. package/dist/types/index.d.ts +3 -0
  273. package/dist/types/index.d.ts.map +1 -1
  274. package/dist/types/index.js +3 -0
  275. package/dist/types/index.js.map +1 -1
  276. package/dist/types/model-routing.d.ts +127 -0
  277. package/dist/types/model-routing.d.ts.map +1 -0
  278. package/dist/types/model-routing.js +3 -0
  279. package/dist/types/model-routing.js.map +1 -0
  280. package/dist/types/project/core.d.ts +46 -5
  281. package/dist/types/project/core.d.ts.map +1 -1
  282. package/dist/types/spec/core.d.ts +28 -1
  283. package/dist/types/spec/core.d.ts.map +1 -1
  284. package/dist/types/spec/inputs.d.ts +1 -6
  285. package/dist/types/spec/inputs.d.ts.map +1 -1
  286. package/dist/types/spec-templates.d.ts +51 -1
  287. package/dist/types/spec-templates.d.ts.map +1 -1
  288. package/dist/types/ui.d.ts +3 -231
  289. package/dist/types/ui.d.ts.map +1 -1
  290. package/dist/types/ui.js +7 -1
  291. package/dist/types/ui.js.map +1 -1
  292. package/dist/types/vector-store.d.ts +144 -0
  293. package/dist/types/vector-store.d.ts.map +1 -0
  294. package/dist/types/vector-store.js +3 -0
  295. package/dist/types/vector-store.js.map +1 -0
  296. package/package.json +1 -1
  297. package/src/config/model-routing-rules.json +98 -0
@@ -0,0 +1,61 @@
1
+ // engine/mermaid/helpers.ts — Shared helpers for mermaid diagram generation.
2
+ // Extracted from mermaid-generator.ts to keep file sizes within limits.
3
+ /** Checks if a scope meets or exceeds a threshold in the scope ordering. */
4
+ export function isScopeAtLeast(scope, threshold) {
5
+ const order = {
6
+ trivial: 0,
7
+ feature: 1,
8
+ 'cross-module': 2,
9
+ architectural: 3,
10
+ };
11
+ return order[scope] >= order[threshold];
12
+ }
13
+ /** Builds layer nodes for data flow diagrams based on target and knowledge. */
14
+ export function buildLayers(target, knowledge) {
15
+ // If knowledge has real architecture layers, prefer them over target-inferred ones
16
+ if (knowledge && knowledge.architecture.layers.length > 0) {
17
+ return knowledge.architecture.layers.map((l) => ({
18
+ id: l.name.replace(/[^a-zA-Z0-9]/g, '_'),
19
+ label: l.name,
20
+ }));
21
+ }
22
+ const framework = knowledge?.framework ?? '';
23
+ const layers = [];
24
+ if (target === 'frontend' || target === 'fullstack') {
25
+ layers.push({ id: 'Client', label: framework ? `Client (${framework})` : 'Client' });
26
+ }
27
+ if (target !== 'database' && target !== 'infrastructure') {
28
+ layers.push({ id: 'Action', label: 'Action/Controller' });
29
+ layers.push({ id: 'Service', label: 'Service' });
30
+ }
31
+ if (target === 'backend' || target === 'fullstack' || target === 'database') {
32
+ layers.push({ id: 'Repo', label: 'Repository' });
33
+ const dbRaw = knowledge?.database ?? 'DB';
34
+ const db = dbRaw === 'unknown' ? 'DB' : dbRaw;
35
+ layers.push({ id: 'DB', label: db });
36
+ }
37
+ if (target === 'infrastructure') {
38
+ layers.push({ id: 'Infra', label: 'Infrastructure' });
39
+ layers.push({ id: 'Cloud', label: 'Cloud Provider' });
40
+ }
41
+ // Fallback if empty
42
+ if (layers.length === 0) {
43
+ layers.push({ id: 'Input', label: 'Input' }, { id: 'Process', label: 'Process' }, { id: 'Output', label: 'Output' });
44
+ }
45
+ return layers;
46
+ }
47
+ /** Builds participant nodes for sequence diagrams based on target and knowledge. */
48
+ export function buildParticipants(target, knowledge) {
49
+ const participants = [];
50
+ if (target === 'frontend' || target === 'fullstack') {
51
+ participants.push({ id: 'UI', label: 'UI' });
52
+ }
53
+ participants.push({ id: 'API', label: 'API' });
54
+ participants.push({ id: 'SVC', label: 'Service' });
55
+ if (target === 'backend' || target === 'fullstack' || target === 'database') {
56
+ const db = knowledge?.database ?? 'DB';
57
+ participants.push({ id: 'DB', label: db });
58
+ }
59
+ return participants;
60
+ }
61
+ //# sourceMappingURL=helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../../src/engine/mermaid/helpers.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,wEAAwE;AAIxE,4EAA4E;AAC5E,MAAM,UAAU,cAAc,CAAC,KAAgB,EAAE,SAAoB;IACnE,MAAM,KAAK,GAA8B;QACvC,OAAO,EAAE,CAAC;QACV,OAAO,EAAE,CAAC;QACV,cAAc,EAAE,CAAC;QACjB,aAAa,EAAE,CAAC;KACjB,CAAC;IACF,OAAO,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC;AAC1C,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,WAAW,CAAC,MAAkB,EAAE,SAAkC;IAChF,mFAAmF;IACnF,IAAI,SAAS,IAAI,SAAS,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1D,OAAO,SAAS,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC/C,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,GAAG,CAAC;YACxC,KAAK,EAAE,CAAC,CAAC,IAAI;SACd,CAAC,CAAC,CAAC;IACN,CAAC;IAED,MAAM,SAAS,GAAG,SAAS,EAAE,SAAS,IAAI,EAAE,CAAC;IAE7C,MAAM,MAAM,GAAgB,EAAE,CAAC;IAE/B,IAAI,MAAM,KAAK,UAAU,IAAI,MAAM,KAAK,WAAW,EAAE,CAAC;QACpD,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,WAAW,SAAS,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;IACvF,CAAC;IAED,IAAI,MAAM,KAAK,UAAU,IAAI,MAAM,KAAK,gBAAgB,EAAE,CAAC;QACzD,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,mBAAmB,EAAE,CAAC,CAAC;QAC1D,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;IACnD,CAAC;IAED,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,WAAW,IAAI,MAAM,KAAK,UAAU,EAAE,CAAC;QAC5E,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC,CAAC;QACjD,MAAM,KAAK,GAAG,SAAS,EAAE,QAAQ,IAAI,IAAI,CAAC;QAC1C,MAAM,EAAE,GAAG,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC;QAC9C,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;IACvC,CAAC;IAED,IAAI,MAAM,KAAK,gBAAgB,EAAE,CAAC;QAChC,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,gBAAgB,EAAE,CAAC,CAAC;QACtD,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,gBAAgB,EAAE,CAAC,CAAC;IACxD,CAAC;IAED,oBAAoB;IACpB,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,CAAC,IAAI,CACT,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,EAC/B,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,EACnC,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,CAClC,CAAC;IACJ,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,oFAAoF;AACpF,MAAM,UAAU,iBAAiB,CAC/B,MAAkB,EAClB,SAAkC;IAElC,MAAM,YAAY,GAAgB,EAAE,CAAC;IAErC,IAAI,MAAM,KAAK,UAAU,IAAI,MAAM,KAAK,WAAW,EAAE,CAAC;QACpD,YAAY,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/C,CAAC;IAED,YAAY,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IAC/C,YAAY,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;IAEnD,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,WAAW,IAAI,MAAM,KAAK,UAAU,EAAE,CAAC;QAC5E,MAAM,EAAE,GAAG,SAAS,EAAE,QAAQ,IAAI,IAAI,CAAC;QACvC,YAAY,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;IAC7C,CAAC;IAED,OAAO,YAAY,CAAC;AACtB,CAAC"}
@@ -1,39 +1,4 @@
1
- import type { SpecDiagram, Spec, ProjectKnowledge } from '../types/index.js';
1
+ export { generateDiagrams, generateDataFlowDiagram, formatDiagramsAsMarkdown, } from './mermaid/core.js';
2
+ export { generateErDiagram, generateSequenceDiagram, generateComponentDiagram, generateStateDiagram, generateArchitectureDiagram, } from './mermaid/diagram-generators.js';
2
3
  export { generateClassDiagram, generateGanttDiagram, generatePieDiagram, } from './mermaid-extended.js';
3
- /**
4
- * Generate all applicable diagrams for a spec based on its scope and context.
5
- */
6
- export declare function generateDiagrams(spec: Spec, knowledge: ProjectKnowledge | null, options: {
7
- hasDatabase: boolean;
8
- hasUi: boolean;
9
- hasTransitions: boolean;
10
- }): SpecDiagram[];
11
- /**
12
- * Generate a data flow diagram: Client -> Action -> Service -> Repo -> DB
13
- */
14
- export declare function generateDataFlowDiagram(spec: Spec, knowledge: ProjectKnowledge | null): SpecDiagram;
15
- /**
16
- * Generate an ER diagram for database changes.
17
- */
18
- export declare function generateErDiagram(spec: Spec, knowledge: ProjectKnowledge | null): SpecDiagram;
19
- /**
20
- * Generate a sequence diagram for cross-module interactions.
21
- */
22
- export declare function generateSequenceDiagram(spec: Spec, knowledge: ProjectKnowledge | null): SpecDiagram;
23
- /**
24
- * Generate a component diagram for UI specs.
25
- */
26
- export declare function generateComponentDiagram(spec: Spec, knowledge: ProjectKnowledge | null): SpecDiagram;
27
- /**
28
- * Generate a state machine diagram for transitions.
29
- */
30
- export declare function generateStateDiagram(spec: Spec): SpecDiagram;
31
- /**
32
- * Generate an architecture diagram for architectural specs.
33
- */
34
- export declare function generateArchitectureDiagram(spec: Spec, knowledge: ProjectKnowledge | null): SpecDiagram;
35
- /**
36
- * Format diagrams as Mermaid code blocks for inclusion in markdown.
37
- */
38
- export declare function formatDiagramsAsMarkdown(diagrams: SpecDiagram[]): string;
39
4
  //# sourceMappingURL=mermaid-generator.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"mermaid-generator.d.ts","sourceRoot":"","sources":["../../src/engine/mermaid-generator.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,WAAW,EACX,IAAI,EAGJ,gBAAgB,EAEjB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,uBAAuB,CAAC;AAO/B;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,IAAI,EACV,SAAS,EAAE,gBAAgB,GAAG,IAAI,EAClC,OAAO,EAAE;IAAE,WAAW,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,OAAO,CAAC;IAAC,cAAc,EAAE,OAAO,CAAA;CAAE,GACzE,WAAW,EAAE,CAkDf;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,IAAI,EACV,SAAS,EAAE,gBAAgB,GAAG,IAAI,GACjC,WAAW,CAkBb;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,gBAAgB,GAAG,IAAI,GAAG,WAAW,CA2B7F;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,IAAI,EACV,SAAS,EAAE,gBAAgB,GAAG,IAAI,GACjC,WAAW,CA+Bb;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,IAAI,EACV,SAAS,EAAE,gBAAgB,GAAG,IAAI,GACjC,WAAW,CAqBb;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,IAAI,GAAG,WAAW,CAmB5D;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CACzC,IAAI,EAAE,IAAI,EACV,SAAS,EAAE,gBAAgB,GAAG,IAAI,GACjC,WAAW,CA8Bb;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,WAAW,EAAE,GAAG,MAAM,CAkBxE"}
1
+ {"version":3,"file":"mermaid-generator.d.ts","sourceRoot":"","sources":["../../src/engine/mermaid-generator.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,gBAAgB,EAChB,uBAAuB,EACvB,wBAAwB,GACzB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,iBAAiB,EACjB,uBAAuB,EACvB,wBAAwB,EACxB,oBAAoB,EACpB,2BAA2B,GAC5B,MAAM,iCAAiC,CAAC;AACzC,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,uBAAuB,CAAC"}
@@ -1,278 +1,6 @@
1
- // Planu — Mermaid Diagram Generator
2
- // Generates Mermaid diagrams based on spec type, scope, and project context
1
+ // Planu — Mermaid Diagram Generator (facade)
2
+ // Re-exports from mermaid/ subdirectory + mermaid-extended.ts for backward compatibility.
3
+ export { generateDiagrams, generateDataFlowDiagram, formatDiagramsAsMarkdown, } from './mermaid/core.js';
4
+ export { generateErDiagram, generateSequenceDiagram, generateComponentDiagram, generateStateDiagram, generateArchitectureDiagram, } from './mermaid/diagram-generators.js';
3
5
  export { generateClassDiagram, generateGanttDiagram, generatePieDiagram, } from './mermaid-extended.js';
4
- import { generateClassDiagram, generateGanttDiagram, generatePieDiagram, } from './mermaid-extended.js';
5
- /**
6
- * Generate all applicable diagrams for a spec based on its scope and context.
7
- */
8
- export function generateDiagrams(spec, knowledge, options) {
9
- const diagrams = [];
10
- // Data flow diagram for ALL specs (except trivial)
11
- if (spec.scope !== 'trivial') {
12
- diagrams.push(generateDataFlowDiagram(spec, knowledge));
13
- }
14
- // ER diagram if database changes
15
- if (options.hasDatabase) {
16
- diagrams.push(generateErDiagram(spec, knowledge));
17
- }
18
- // Sequence diagram if scope >= cross-module
19
- if (isScopeAtLeast(spec.scope, 'cross-module')) {
20
- diagrams.push(generateSequenceDiagram(spec, knowledge));
21
- }
22
- // Component diagram if UI
23
- if (options.hasUi) {
24
- diagrams.push(generateComponentDiagram(spec, knowledge));
25
- }
26
- // State machine diagram if transitions
27
- if (options.hasTransitions) {
28
- diagrams.push(generateStateDiagram(spec));
29
- }
30
- // Architecture diagram if scope = architectural
31
- if (spec.scope === 'architectural') {
32
- diagrams.push(generateArchitectureDiagram(spec, knowledge));
33
- }
34
- // Class diagram for cross-module+ backend/shared specs
35
- if (isScopeAtLeast(spec.scope, 'cross-module') &&
36
- (spec.target === 'backend' || spec.target === 'shared' || spec.target === 'fullstack')) {
37
- diagrams.push(generateClassDiagram(spec));
38
- }
39
- // Gantt diagram for larger specs (> 8 dev hours)
40
- if (spec.estimation.devHours > 8) {
41
- diagrams.push(generateGanttDiagram(spec));
42
- }
43
- // Pie chart for effort distribution (always for per-spec reports)
44
- diagrams.push(generatePieDiagram(spec));
45
- return diagrams;
46
- }
47
- /**
48
- * Generate a data flow diagram: Client -> Action -> Service -> Repo -> DB
49
- */
50
- export function generateDataFlowDiagram(spec, knowledge) {
51
- const layers = buildLayers(spec.target, knowledge);
52
- const lines = ['graph LR'];
53
- layers.forEach((from, i) => {
54
- const to = layers[i + 1];
55
- if (to) {
56
- lines.push(` ${from.id}[${from.label}] --> ${to.id}[${to.label}]`);
57
- }
58
- });
59
- return {
60
- type: 'data-flow',
61
- title: `Data Flow — ${spec.title}`,
62
- format: 'mermaid',
63
- content: lines.join('\n'),
64
- description: 'Data flow diagram showing how data moves through the system layers.',
65
- };
66
- }
67
- /**
68
- * Generate an ER diagram for database changes.
69
- */
70
- export function generateErDiagram(spec, knowledge) {
71
- const dbEngine = knowledge?.database ?? 'unknown';
72
- const lines = [
73
- 'erDiagram',
74
- ` %% Database: ${dbEngine}`,
75
- ` %% Spec: ${spec.title}`,
76
- ' ENTITY_A {',
77
- ' string id PK',
78
- ' string name',
79
- ' datetime created_at',
80
- ' }',
81
- ' ENTITY_B {',
82
- ' string id PK',
83
- ' string entity_a_id FK',
84
- ' string value',
85
- ' }',
86
- ' ENTITY_A ||--o{ ENTITY_B : "has many"',
87
- ];
88
- return {
89
- type: 'er',
90
- title: `Entity Relationship — ${spec.title}`,
91
- format: 'mermaid',
92
- content: lines.join('\n'),
93
- description: 'Entity-relationship diagram for database schema changes. Customize entities to match your domain.',
94
- };
95
- }
96
- /**
97
- * Generate a sequence diagram for cross-module interactions.
98
- */
99
- export function generateSequenceDiagram(spec, knowledge) {
100
- const participants = buildParticipants(spec.target, knowledge);
101
- const lines = ['sequenceDiagram'];
102
- for (const p of participants) {
103
- lines.push(` participant ${p.id} as ${p.label}`);
104
- }
105
- // Generate basic request-response flow
106
- const first = participants[0];
107
- const second = participants[1];
108
- if (first && second) {
109
- lines.push(` ${first.id}->>+${second.id}: Request`);
110
- const third = participants[2];
111
- if (third) {
112
- lines.push(` ${second.id}->>+${third.id}: Process`);
113
- lines.push(` ${third.id}-->>-${second.id}: Result`);
114
- }
115
- lines.push(` ${second.id}-->>-${first.id}: Response`);
116
- }
117
- return {
118
- type: 'sequence',
119
- title: `Sequence Diagram — ${spec.title}`,
120
- format: 'mermaid',
121
- content: lines.join('\n'),
122
- description: 'Sequence diagram showing interactions between modules. Customize messages to match your flow.',
123
- };
124
- }
125
- /**
126
- * Generate a component diagram for UI specs.
127
- */
128
- export function generateComponentDiagram(spec, knowledge) {
129
- const framework = knowledge?.framework ?? 'UI';
130
- const lines = [
131
- 'graph TD',
132
- ` Page["${spec.title} Page"]`,
133
- ` Page --> Header[Header]`,
134
- ` Page --> Main[Main Content]`,
135
- ` Page --> Footer[Footer]`,
136
- ` Main --> CompA["Component A"]`,
137
- ` Main --> CompB["Component B"]`,
138
- ` CompA --> Store["${framework} State"]`,
139
- ` CompB --> Store`,
140
- ];
141
- return {
142
- type: 'component',
143
- title: `Component Diagram — ${spec.title}`,
144
- format: 'mermaid',
145
- content: lines.join('\n'),
146
- description: 'UI component hierarchy diagram. Customize components to match your design.',
147
- };
148
- }
149
- /**
150
- * Generate a state machine diagram for transitions.
151
- */
152
- export function generateStateDiagram(spec) {
153
- const lines = [
154
- 'stateDiagram-v2',
155
- ` [*] --> Initial`,
156
- ` Initial --> Processing: Start`,
157
- ` Processing --> Success: Complete`,
158
- ` Processing --> Error: Fail`,
159
- ` Error --> Processing: Retry`,
160
- ` Success --> [*]`,
161
- ];
162
- return {
163
- type: 'state-machine',
164
- title: `State Machine — ${spec.title}`,
165
- format: 'mermaid',
166
- content: lines.join('\n'),
167
- description: 'State machine diagram showing state transitions. Customize states to match your domain.',
168
- };
169
- }
170
- /**
171
- * Generate an architecture diagram for architectural specs.
172
- */
173
- export function generateArchitectureDiagram(spec, knowledge) {
174
- const arch = knowledge?.architecture;
175
- const pattern = arch ? arch.primary : 'layered';
176
- const externalServices = knowledge?.externalServices ?? [];
177
- const externalLabel = externalServices.length > 0 ? externalServices.slice(0, 2).join(' / ') : 'External Services';
178
- const lines = [
179
- 'graph TB',
180
- ` subgraph "${spec.title}"`,
181
- ` direction TB`,
182
- ` Client["Client Layer"]`,
183
- ` API["API Gateway"]`,
184
- ` Service["Service Layer"]`,
185
- ` Data["Data Layer"]`,
186
- ` Client --> API`,
187
- ` API --> Service`,
188
- ` Service --> Data`,
189
- ` end`,
190
- ` External["${externalLabel}"]`,
191
- ` Service --> External`,
192
- ` %% Architecture: ${pattern}`,
193
- ];
194
- return {
195
- type: 'architecture',
196
- title: `Architecture — ${spec.title}`,
197
- format: 'mermaid',
198
- content: lines.join('\n'),
199
- description: `Architecture diagram using ${pattern} pattern. Customize to match your system.`,
200
- };
201
- }
202
- /**
203
- * Format diagrams as Mermaid code blocks for inclusion in markdown.
204
- */
205
- export function formatDiagramsAsMarkdown(diagrams) {
206
- if (diagrams.length === 0) {
207
- return '';
208
- }
209
- const sections = [];
210
- for (const diagram of diagrams) {
211
- sections.push(`### ${diagram.title}`);
212
- sections.push('');
213
- sections.push(`> ${diagram.description}`);
214
- sections.push('');
215
- sections.push('```mermaid');
216
- sections.push(diagram.content);
217
- sections.push('```');
218
- sections.push('');
219
- }
220
- return sections.join('\n');
221
- }
222
- // === Internal helpers ===
223
- function isScopeAtLeast(scope, threshold) {
224
- const order = {
225
- trivial: 0,
226
- feature: 1,
227
- 'cross-module': 2,
228
- architectural: 3,
229
- };
230
- return order[scope] >= order[threshold];
231
- }
232
- function buildLayers(target, knowledge) {
233
- // If knowledge has real architecture layers, prefer them over target-inferred ones
234
- if (knowledge && knowledge.architecture.layers.length > 0) {
235
- return knowledge.architecture.layers.map((l) => ({
236
- id: l.name.replace(/[^a-zA-Z0-9]/g, '_'),
237
- label: l.name,
238
- }));
239
- }
240
- const framework = knowledge?.framework ?? '';
241
- const layers = [];
242
- if (target === 'frontend' || target === 'fullstack') {
243
- layers.push({ id: 'Client', label: framework ? `Client (${framework})` : 'Client' });
244
- }
245
- if (target !== 'database' && target !== 'infrastructure') {
246
- layers.push({ id: 'Action', label: 'Action/Controller' });
247
- layers.push({ id: 'Service', label: 'Service' });
248
- }
249
- if (target === 'backend' || target === 'fullstack' || target === 'database') {
250
- layers.push({ id: 'Repo', label: 'Repository' });
251
- const dbRaw = knowledge?.database ?? 'DB';
252
- const db = dbRaw === 'unknown' ? 'DB' : dbRaw;
253
- layers.push({ id: 'DB', label: db });
254
- }
255
- if (target === 'infrastructure') {
256
- layers.push({ id: 'Infra', label: 'Infrastructure' });
257
- layers.push({ id: 'Cloud', label: 'Cloud Provider' });
258
- }
259
- // Fallback if empty
260
- if (layers.length === 0) {
261
- layers.push({ id: 'Input', label: 'Input' }, { id: 'Process', label: 'Process' }, { id: 'Output', label: 'Output' });
262
- }
263
- return layers;
264
- }
265
- function buildParticipants(target, knowledge) {
266
- const participants = [];
267
- if (target === 'frontend' || target === 'fullstack') {
268
- participants.push({ id: 'UI', label: 'UI' });
269
- }
270
- participants.push({ id: 'API', label: 'API' });
271
- participants.push({ id: 'SVC', label: 'Service' });
272
- if (target === 'backend' || target === 'fullstack' || target === 'database') {
273
- const db = knowledge?.database ?? 'DB';
274
- participants.push({ id: 'DB', label: db });
275
- }
276
- return participants;
277
- }
278
6
  //# sourceMappingURL=mermaid-generator.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"mermaid-generator.js","sourceRoot":"","sources":["../../src/engine/mermaid-generator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mermaid-generator.js","sourceRoot":"","sources":["../../src/engine/mermaid-generator.ts"],"names":[],"mappings":"AAAA,6CAA6C;AAC7C,0FAA0F;AAE1F,OAAO,EACL,gBAAgB,EAChB,uBAAuB,EACvB,wBAAwB,GACzB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,iBAAiB,EACjB,uBAAuB,EACvB,wBAAwB,EACxB,oBAAoB,EACpB,2BAA2B,GAC5B,MAAM,iCAAiC,CAAC;AACzC,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,26 @@
1
+ import type { ComplexitySignals, NormalisedSignals, PartialSignals } from '../../types/index.js';
2
+ /**
3
+ * Extract complexity signals from a text description (spec content or task description).
4
+ * Missing signals are filled with sensible defaults.
5
+ */
6
+ export declare function extractSignals(text: string, overrides?: PartialSignals): ComplexitySignals;
7
+ /** Build signals entirely from an explicit partial object (no text analysis). */
8
+ export declare function buildSignalsFromPartial(partial: PartialSignals): ComplexitySignals;
9
+ /** Normalise raw numeric signals to the 0-1 range. */
10
+ export declare function normaliseSignals(raw: {
11
+ criteriaCount: number;
12
+ fileCount: number;
13
+ dependencyDepth: number;
14
+ crossLayerCount: number;
15
+ estimatedHours: number;
16
+ hasNewTypes: boolean;
17
+ hasDBChanges: boolean;
18
+ hasSecurityImplications: boolean;
19
+ isReadOnly: boolean;
20
+ }): NormalisedSignals;
21
+ /**
22
+ * Compute a weighted overall complexity score (0-1) from normalised signals.
23
+ * Higher = more complex.
24
+ */
25
+ export declare function computeOverallScore(n: NormalisedSignals): number;
26
+ //# sourceMappingURL=complexity-analyzer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"complexity-analyzer.d.ts","sourceRoot":"","sources":["../../../src/engine/model-router/complexity-analyzer.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,iBAAiB,EACjB,iBAAiB,EACjB,cAAc,EAEf,MAAM,sBAAsB,CAAC;AAiK9B;;;GAGG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,cAAc,GAAG,iBAAiB,CAO1F;AAED,iFAAiF;AACjF,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,cAAc,GAAG,iBAAiB,CAElF;AAED,sDAAsD;AACtD,wBAAgB,gBAAgB,CAAC,GAAG,EAAE;IACpC,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,OAAO,CAAC;IACrB,YAAY,EAAE,OAAO,CAAC;IACtB,uBAAuB,EAAE,OAAO,CAAC;IACjC,UAAU,EAAE,OAAO,CAAC;CACrB,GAAG,iBAAiB,CAYpB;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,iBAAiB,GAAG,MAAM,CAmBhE"}
@@ -0,0 +1,182 @@
1
+ // engine/model-router/complexity-analyzer.ts — Extract and normalise complexity signals.
2
+ // SPEC-076 AC-01
3
+ // ---------------------------------------------------------------------------
4
+ // Normalisation ceilings (signals are clamped to 0-1 using these maximums)
5
+ // ---------------------------------------------------------------------------
6
+ const MAX_CRITERIA = 40;
7
+ const MAX_FILES = 30;
8
+ const MAX_DEPTH = 6;
9
+ const MAX_CROSS_LAYER = 5;
10
+ const MAX_HOURS = 80;
11
+ /** Clamp a value into [0, 1] by dividing by its ceiling. */
12
+ function norm(value, ceiling) {
13
+ if (ceiling <= 0) {
14
+ return 0;
15
+ }
16
+ return Math.min(Math.max(value / ceiling, 0), 1);
17
+ }
18
+ // ---------------------------------------------------------------------------
19
+ // Signal extraction from text
20
+ // ---------------------------------------------------------------------------
21
+ const TASK_KEYWORDS = {
22
+ search: ['search', 'find', 'explore', 'list', 'read', 'summarize', 'grep'],
23
+ generation: ['generate', 'create', 'implement', 'write', 'build', 'add', 'scaffold'],
24
+ architecture: ['architect', 'design', 'restructure', 'system', 'plan', 'rfc'],
25
+ debugging: ['debug', 'fix', 'investigate', 'trace', 'diagnose', 'bug', 'error'],
26
+ refactor: ['refactor', 'rename', 'extract', 'simplify', 'clean', 'reorganize', 'move'],
27
+ };
28
+ const SECURITY_KEYWORDS = [
29
+ 'security',
30
+ 'auth',
31
+ 'permission',
32
+ 'rbac',
33
+ 'encryption',
34
+ 'token',
35
+ 'jwt',
36
+ 'cors',
37
+ 'csrf',
38
+ 'xss',
39
+ 'injection',
40
+ 'sanitize',
41
+ 'pii',
42
+ 'gdpr',
43
+ ];
44
+ const DB_KEYWORDS = [
45
+ 'database',
46
+ 'migration',
47
+ 'schema',
48
+ 'table',
49
+ 'column',
50
+ 'index',
51
+ 'query',
52
+ 'sql',
53
+ 'postgres',
54
+ 'mysql',
55
+ 'mongo',
56
+ 'redis',
57
+ 'prisma',
58
+ 'drizzle',
59
+ ];
60
+ /** Infer a TaskType from a text description. */
61
+ function inferTaskType(text) {
62
+ const lower = text.toLowerCase();
63
+ let bestType = 'generation';
64
+ let bestScore = 0;
65
+ for (const [type, keywords] of Object.entries(TASK_KEYWORDS)) {
66
+ const score = keywords.filter((kw) => lower.includes(kw)).length;
67
+ if (score > bestScore) {
68
+ bestScore = score;
69
+ bestType = type;
70
+ }
71
+ }
72
+ return bestType;
73
+ }
74
+ /** Count how many keywords from a list appear in a text. */
75
+ function keywordHits(text, keywords) {
76
+ const lower = text.toLowerCase();
77
+ return keywords.filter((kw) => lower.includes(kw)).length;
78
+ }
79
+ /** Count acceptance criteria by looking for AC- or numbered list patterns. */
80
+ function countCriteria(text) {
81
+ const acMatches = text.match(/\bAC-\d+/g);
82
+ if (acMatches) {
83
+ return acMatches.length;
84
+ }
85
+ // Fallback: count markdown list items that look like criteria
86
+ const listItems = text.match(/^[-*]\s+/gm);
87
+ return listItems ? Math.ceil(listItems.length / 2) : 0;
88
+ }
89
+ /** Estimate file count from technical sheet patterns. */
90
+ function countFiles(text) {
91
+ const fileRefs = text.match(/`[^`]+\.(ts|js|json|md|tsx|jsx|py|go|rs)`/g);
92
+ return fileRefs ? fileRefs.length : 0;
93
+ }
94
+ /** Count distinct architectural layers referenced. */
95
+ function countLayers(text) {
96
+ const layers = ['types/', 'engine/', 'tools/', 'storage/', 'config/', 'resources/'];
97
+ return layers.filter((l) => text.includes(l)).length;
98
+ }
99
+ // ---------------------------------------------------------------------------
100
+ // Internal helpers to reduce extractSignals complexity
101
+ // ---------------------------------------------------------------------------
102
+ /** Extract boolean and categorical signals from text, applying overrides. */
103
+ function extractQualitativeSignals(text, overrides) {
104
+ return {
105
+ hasNewTypes: overrides?.hasNewTypes ?? text.includes('types/'),
106
+ hasDBChanges: overrides?.hasDBChanges ?? keywordHits(text, DB_KEYWORDS) >= 2,
107
+ hasSecurityImplications: overrides?.hasSecurityImplications ?? keywordHits(text, SECURITY_KEYWORDS) >= 2,
108
+ isReadOnly: overrides?.isReadOnly ?? false,
109
+ taskType: overrides?.taskType ?? inferTaskType(text),
110
+ };
111
+ }
112
+ /** Extract raw signal values from text, applying overrides. */
113
+ function extractRawSignals(text, overrides) {
114
+ const criteriaCount = overrides?.criteriaCount ?? countCriteria(text);
115
+ const fileCount = overrides?.fileCount ?? countFiles(text);
116
+ const crossLayerCount = overrides?.crossLayerCount ?? countLayers(text);
117
+ const dependencyDepth = overrides?.dependencyDepth ?? Math.min(crossLayerCount, MAX_DEPTH);
118
+ const estimatedHours = overrides?.estimatedHours ?? criteriaCount * 0.5;
119
+ const qualitative = extractQualitativeSignals(text, overrides);
120
+ return {
121
+ criteriaCount,
122
+ fileCount,
123
+ dependencyDepth,
124
+ crossLayerCount,
125
+ estimatedHours,
126
+ ...qualitative,
127
+ };
128
+ }
129
+ // ---------------------------------------------------------------------------
130
+ // Public API
131
+ // ---------------------------------------------------------------------------
132
+ /**
133
+ * Extract complexity signals from a text description (spec content or task description).
134
+ * Missing signals are filled with sensible defaults.
135
+ */
136
+ export function extractSignals(text, overrides) {
137
+ const raw = extractRawSignals(text, overrides);
138
+ const normalised = normaliseSignals(raw);
139
+ const overallScore = computeOverallScore(normalised);
140
+ return { ...raw, overallScore };
141
+ }
142
+ /** Build signals entirely from an explicit partial object (no text analysis). */
143
+ export function buildSignalsFromPartial(partial) {
144
+ return extractSignals('', partial);
145
+ }
146
+ /** Normalise raw numeric signals to the 0-1 range. */
147
+ export function normaliseSignals(raw) {
148
+ return {
149
+ criteriaCount: norm(raw.criteriaCount, MAX_CRITERIA),
150
+ fileCount: norm(raw.fileCount, MAX_FILES),
151
+ dependencyDepth: norm(raw.dependencyDepth, MAX_DEPTH),
152
+ crossLayerCount: norm(raw.crossLayerCount, MAX_CROSS_LAYER),
153
+ estimatedHours: norm(raw.estimatedHours, MAX_HOURS),
154
+ hasNewTypes: raw.hasNewTypes ? 1 : 0,
155
+ hasDBChanges: raw.hasDBChanges ? 1 : 0,
156
+ hasSecurityImplications: raw.hasSecurityImplications ? 1 : 0,
157
+ isReadOnly: raw.isReadOnly ? 1 : 0,
158
+ };
159
+ }
160
+ /**
161
+ * Compute a weighted overall complexity score (0-1) from normalised signals.
162
+ * Higher = more complex.
163
+ */
164
+ export function computeOverallScore(n) {
165
+ const weights = {
166
+ criteriaCount: 0.25,
167
+ fileCount: 0.15,
168
+ dependencyDepth: 0.1,
169
+ crossLayerCount: 0.15,
170
+ estimatedHours: 0.1,
171
+ hasNewTypes: 0.05,
172
+ hasDBChanges: 0.05,
173
+ hasSecurityImplications: 0.1,
174
+ isReadOnly: -0.05, // read-only reduces complexity
175
+ };
176
+ let score = 0;
177
+ for (const [key, weight] of Object.entries(weights)) {
178
+ score += n[key] * weight;
179
+ }
180
+ return Math.min(Math.max(score, 0), 1);
181
+ }
182
+ //# sourceMappingURL=complexity-analyzer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"complexity-analyzer.js","sourceRoot":"","sources":["../../../src/engine/model-router/complexity-analyzer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { ComplexitySignals, CostEstimate, ModelTier } from '../../types/index.js';
2
+ /** Calculate the cost estimate for a given model tier and complexity signals. */
3
+ export declare function calculateCost(tier: ModelTier, signals: ComplexitySignals): CostEstimate;
4
+ /** Calculate costs for all three tiers so the user can compare. */
5
+ export declare function calculateAllTierCosts(signals: ComplexitySignals): Record<ModelTier, CostEstimate>;
6
+ //# sourceMappingURL=cost-estimator.d.ts.map