@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,19 @@
1
+ // engine/spec-templates/catalog-industry.ts — Industry vertical templates (AC-04).
2
+ // Re-exports all industry templates from their dedicated files.
3
+ import { FINTECH_KYC_TEMPLATE, FINTECH_TRANSACTIONS_TEMPLATE, FINTECH_COMPLIANCE_TEMPLATE, } from './templates-industry-fintech.js';
4
+ import { HEALTHTECH_PATIENT_RECORDS_TEMPLATE, HEALTHTECH_APPOINTMENTS_TEMPLATE, ECOMMERCE_CART_CHECKOUT_TEMPLATE, ECOMMERCE_INVENTORY_TEMPLATE, } from './templates-industry-health-ecom.js';
5
+ import { SAAS_MULTI_TENANT_TEMPLATE, SAAS_BILLING_TEMPLATE, SAAS_ROLES_TEMPLATE, } from './templates-industry-saas.js';
6
+ /** All industry vertical templates. */
7
+ export const INDUSTRY_TEMPLATES = [
8
+ FINTECH_KYC_TEMPLATE,
9
+ FINTECH_TRANSACTIONS_TEMPLATE,
10
+ FINTECH_COMPLIANCE_TEMPLATE,
11
+ HEALTHTECH_PATIENT_RECORDS_TEMPLATE,
12
+ HEALTHTECH_APPOINTMENTS_TEMPLATE,
13
+ ECOMMERCE_CART_CHECKOUT_TEMPLATE,
14
+ ECOMMERCE_INVENTORY_TEMPLATE,
15
+ SAAS_MULTI_TENANT_TEMPLATE,
16
+ SAAS_BILLING_TEMPLATE,
17
+ SAAS_ROLES_TEMPLATE,
18
+ ];
19
+ //# sourceMappingURL=catalog-industry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog-industry.js","sourceRoot":"","sources":["../../../src/engine/spec-templates/catalog-industry.ts"],"names":[],"mappings":"AAAA,mFAAmF;AACnF,gEAAgE;AAGhE,OAAO,EACL,oBAAoB,EACpB,6BAA6B,EAC7B,2BAA2B,GAC5B,MAAM,iCAAiC,CAAC;AACzC,OAAO,EACL,mCAAmC,EACnC,gCAAgC,EAChC,gCAAgC,EAChC,4BAA4B,GAC7B,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EACL,0BAA0B,EAC1B,qBAAqB,EACrB,mBAAmB,GACpB,MAAM,8BAA8B,CAAC;AAEtC,uCAAuC;AACvC,MAAM,CAAC,MAAM,kBAAkB,GAAwB;IACrD,oBAAoB;IACpB,6BAA6B;IAC7B,2BAA2B;IAC3B,mCAAmC;IACnC,gCAAgC;IAChC,gCAAgC;IAChC,4BAA4B;IAC5B,0BAA0B;IAC1B,qBAAqB;IACrB,mBAAmB;CACpB,CAAC"}
@@ -1,4 +1,4 @@
1
1
  import type { SpecTemplateEntry } from '../../types/spec-templates.js';
2
- /** Full catalog of built-in spec templates (core + extra). */
2
+ /** Full catalog of built-in spec templates (core + extra + industry). */
3
3
  export declare const BUILT_IN_TEMPLATES: SpecTemplateEntry[];
4
4
  //# sourceMappingURL=catalog.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../../../src/engine/spec-templates/catalog.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AA+XvE,8DAA8D;AAC9D,eAAO,MAAM,kBAAkB,EAAE,iBAAiB,EAA4C,CAAC"}
1
+ {"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../../../src/engine/spec-templates/catalog.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAMvE,yEAAyE;AACzE,eAAO,MAAM,kBAAkB,EAAE,iBAAiB,EAOjD,CAAC"}
@@ -1,386 +1,17 @@
1
1
  // engine/spec-templates/catalog.ts — Built-in template catalog (language-agnostic).
2
2
  // Each template is framework/language agnostic: no TypeScript-specific terms.
3
- // Templates 6-8 (data, security, performance) live in catalog-extra.ts to keep file size ≤500L.
3
+ // Templates are defined in dedicated files and assembled here.
4
+ import { AUTH_JWT_TEMPLATE, CRUD_ENTITY_TEMPLATE } from './templates-auth-crud.js';
5
+ import { REST_API_ENDPOINT_TEMPLATE, UI_FORM_TEMPLATE } from './templates-api-ui.js';
4
6
  import { EXTRA_TEMPLATES } from './catalog-extra.js';
5
- /** Full catalog of built-in spec templates (core entries — templates 1–5). */
6
- const CORE_TEMPLATES = [
7
- {
8
- id: 'auth-jwt',
9
- name: 'JWT Authentication',
10
- category: 'auth',
11
- description: 'User authentication flow with JWT tokens: login, logout, refresh, and guards.',
12
- tags: ['auth', 'jwt', 'security', 'session'],
13
- variables: [
14
- {
15
- key: 'EntityName',
16
- label: 'Entity name',
17
- description: 'The name of the authenticated entity (User, Admin, Member…)',
18
- example: 'User',
19
- required: true,
20
- },
21
- {
22
- key: 'TokenExpiry',
23
- label: 'Token expiry',
24
- description: 'JWT access token expiry duration',
25
- example: '15 minutes',
26
- required: false,
27
- defaultValue: '15 minutes',
28
- },
29
- ],
30
- huTemplate: `# HU: JWT Authentication for {{EntityName}}
31
-
32
- ## User Story
33
- As a {{EntityName}}, I want to securely authenticate with JWT tokens so that my session is stateless and protected.
34
-
35
- ## Acceptance Criteria
36
-
37
- ### AC-1: Login endpoint
38
- - [ ] POST /auth/login accepts credentials and returns access + refresh tokens
39
- - [ ] Access token expires after {{TokenExpiry}}
40
- - [ ] Refresh token stored server-side and rotated on each use
41
- - [ ] Failed login returns 401 with no sensitive detail
42
-
43
- ### AC-2: Protected route guard
44
- - [ ] Every protected endpoint validates the Bearer token
45
- - [ ] Expired or invalid tokens return 401
46
- - [ ] Tampered tokens are rejected and logged
47
-
48
- ### AC-3: Token refresh
49
- - [ ] POST /auth/refresh issues new access token given a valid refresh token
50
- - [ ] Refresh token is single-use (rotation strategy)
51
-
52
- ### AC-4: Logout
53
- - [ ] POST /auth/logout invalidates the refresh token server-side
54
- - [ ] Client-side storage is cleared by the caller
55
-
56
- ### AC-5: Security requirements
57
- - [ ] Passwords stored as salted hash (bcrypt or Argon2 equivalent)
58
- - [ ] HTTPS enforced in production
59
- - [ ] Rate limiting on /auth/login (max 5 requests/minute per IP)
60
- - [ ] Brute-force protection with account lockout after N failures
61
-
62
- ## Out of Scope
63
- - OAuth2 / SSO providers (create separate spec)
64
- - Multi-factor authentication (create separate spec)
65
- `,
66
- fichaTecnicaTemplate: `# FICHA TÉCNICA: JWT Authentication for {{EntityName}}
67
-
68
- ## Affected Files
69
- - auth/login handler
70
- - auth/refresh handler
71
- - auth/logout handler
72
- - auth/middleware (token guard)
73
- - storage/token-store (refresh token persistence)
74
- - config/auth-config (token secrets, expiry settings)
75
-
76
- ## Types / Entities
77
- - \`{{EntityName}}\`: id, email, passwordHash, createdAt
78
- - \`AuthTokenPair\`: accessToken, refreshToken, expiresIn
79
- - \`RefreshTokenRecord\`: token, entityId, expiresAt, usedAt
80
-
81
- ## Risks
82
- - Token secret exposure → rotate secrets without downtime (risk: high)
83
- - Refresh token replay attack → single-use rotation required
84
- - Brute force on login → rate limiting + lockout required
85
-
86
- ## Estimation (rough)
87
- - Dev: 8–16 hours
88
- - Review: 2–4 hours
89
- - Difficulty: 3/5
90
- `,
91
- progressTemplate: `# PROGRESS: JWT Authentication for {{EntityName}}
92
-
93
- ## Status: draft
94
-
95
- ## Criteria
96
- - [ ] AC-1: Login endpoint
97
- - [ ] AC-2: Protected route guard
98
- - [ ] AC-3: Token refresh
99
- - [ ] AC-4: Logout
100
- - [ ] AC-5: Security requirements
101
- `,
102
- },
103
- {
104
- id: 'crud-entity',
105
- name: 'CRUD Entity',
106
- category: 'crud',
107
- description: 'Full Create/Read/Update/Delete lifecycle for any data entity.',
108
- tags: ['crud', 'rest', 'api', 'database'],
109
- variables: [
110
- {
111
- key: 'EntityName',
112
- label: 'Entity name',
113
- description: 'Name of the entity (singular, PascalCase)',
114
- example: 'Product',
115
- required: true,
116
- },
117
- {
118
- key: 'EntityPlural',
119
- label: 'Entity plural',
120
- description: 'Plural form of the entity name',
121
- example: 'Products',
122
- required: true,
123
- },
124
- ],
125
- huTemplate: `# HU: CRUD for {{EntityName}}
126
-
127
- ## User Story
128
- As a user, I want to create, view, update and delete {{EntityPlural}} so that I can manage them effectively.
129
-
130
- ## Acceptance Criteria
131
-
132
- ### AC-1: Create {{EntityName}}
133
- - [ ] POST /{{EntityPlural}} accepts valid payload and persists the entity
134
- - [ ] Duplicate detection where applicable
135
- - [ ] Returns the created entity with generated ID and timestamps
136
-
137
- ### AC-2: List {{EntityPlural}}
138
- - [ ] GET /{{EntityPlural}} returns paginated list
139
- - [ ] Supports filtering and sorting by key fields
140
- - [ ] Empty list returns 200 with empty array (not 404)
141
-
142
- ### AC-3: Get single {{EntityName}}
143
- - [ ] GET /{{EntityPlural}}/:id returns the entity or 404
144
- - [ ] Soft-deleted entities return 404
145
-
146
- ### AC-4: Update {{EntityName}}
147
- - [ ] PATCH /{{EntityPlural}}/:id applies partial update
148
- - [ ] PUT /{{EntityPlural}}/:id replaces the full entity
149
- - [ ] Returns updated entity on success
150
-
151
- ### AC-5: Delete {{EntityName}}
152
- - [ ] DELETE /{{EntityPlural}}/:id performs soft delete by default
153
- - [ ] Hard delete available as a privileged action
154
- - [ ] Returns 204 No Content on success
155
-
156
- ### AC-6: Validation
157
- - [ ] All inputs validated at the API boundary
158
- - [ ] Invalid fields return 422 with per-field error messages
159
- `,
160
- fichaTecnicaTemplate: `# FICHA TÉCNICA: CRUD for {{EntityName}}
161
-
162
- ## Affected Files
163
- - handlers/{{EntityPlural}}/create
164
- - handlers/{{EntityPlural}}/list
165
- - handlers/{{EntityPlural}}/get
166
- - handlers/{{EntityPlural}}/update
167
- - handlers/{{EntityPlural}}/delete
168
- - storage/{{EntityPlural}}-repository
169
- - types/{{EntityName}}
170
-
171
- ## Types / Entities
172
- - \`{{EntityName}}\`: id, createdAt, updatedAt, deletedAt (nullable)
173
- - \`Create{{EntityName}}Input\`: entity fields (validated)
174
- - \`Update{{EntityName}}Input\`: partial entity fields
175
- - \`List{{EntityPlural}}Query\`: page, limit, sortBy, order, filters
176
-
177
- ## Risks
178
- - Missing soft-delete → data loss risk
179
- - Unbounded list without pagination → performance risk
180
- - Missing input validation → injection risk
181
-
182
- ## Estimation (rough)
183
- - Dev: 6–12 hours
184
- - Review: 1–3 hours
185
- - Difficulty: 2/5
186
- `,
187
- progressTemplate: `# PROGRESS: CRUD for {{EntityName}}
188
-
189
- ## Status: draft
190
-
191
- ## Criteria
192
- - [ ] AC-1: Create {{EntityName}}
193
- - [ ] AC-2: List {{EntityPlural}}
194
- - [ ] AC-3: Get single {{EntityName}}
195
- - [ ] AC-4: Update {{EntityName}}
196
- - [ ] AC-5: Delete {{EntityName}}
197
- - [ ] AC-6: Validation
198
- `,
199
- },
200
- {
201
- id: 'rest-api-endpoint',
202
- name: 'REST API Endpoint',
203
- category: 'api',
204
- description: 'A single REST endpoint with validation, error handling, and documentation.',
205
- tags: ['api', 'rest', 'endpoint', 'openapi'],
206
- variables: [
207
- {
208
- key: 'EndpointName',
209
- label: 'Endpoint name',
210
- description: 'Short descriptive name for this endpoint',
211
- example: 'Submit Order',
212
- required: true,
213
- },
214
- {
215
- key: 'HttpMethod',
216
- label: 'HTTP Method',
217
- description: 'HTTP method: GET, POST, PUT, PATCH, DELETE',
218
- example: 'POST',
219
- required: true,
220
- },
221
- {
222
- key: 'Path',
223
- label: 'URL path',
224
- description: 'The URL path for this endpoint',
225
- example: '/orders/submit',
226
- required: true,
227
- },
228
- ],
229
- huTemplate: `# HU: REST API Endpoint — {{EndpointName}}
230
-
231
- ## User Story
232
- As an API consumer, I want a reliable {{HttpMethod}} {{Path}} endpoint so that I can {{EndpointName}} without client-side workarounds.
233
-
234
- ## Acceptance Criteria
235
-
236
- ### AC-1: Request validation
237
- - [ ] Input schema validated at the boundary
238
- - [ ] Invalid requests return 422 with structured error messages
239
- - [ ] Content-Type header checked when applicable
240
-
241
- ### AC-2: Core business logic
242
- - [ ] {{EndpointName}} logic is encapsulated in a dedicated use-case function
243
- - [ ] Side effects (emails, notifications, jobs) are isolated and testable
244
-
245
- ### AC-3: Response contract
246
- - [ ] Success response follows the API response envelope convention
247
- - [ ] HTTP status codes match the operation semantics
248
- - [ ] Response schema is documented (OpenAPI or equivalent)
249
-
250
- ### AC-4: Error handling
251
- - [ ] All error paths return structured JSON (not stack traces)
252
- - [ ] 404 returned for missing resources
253
- - [ ] 409 returned for conflicts
254
- - [ ] 500 never leaks internal details
255
-
256
- ### AC-5: Idempotency (if applicable)
257
- - [ ] Idempotency key header supported for non-idempotent operations
258
- - [ ] Duplicate requests handled gracefully
259
-
260
- ### AC-6: Observability
261
- - [ ] Endpoint logged with method, path, status, latency
262
- - [ ] Errors reported to the monitoring system
263
- `,
264
- fichaTecnicaTemplate: `# FICHA TÉCNICA: REST API Endpoint — {{EndpointName}}
265
-
266
- ## Affected Files
267
- - handlers/{{Path}} (route handler)
268
- - use-cases/{{EndpointName}} (business logic)
269
- - validators/{{EndpointName}}-input
270
- - openapi/paths/{{Path}} (documentation)
271
-
272
- ## Types / Entities
273
- - \`{{EndpointName}}Input\`: validated request payload
274
- - \`{{EndpointName}}Output\`: response body shape
275
- - \`ApiError\`: code, message, details[]
276
-
277
- ## Risks
278
- - Missing idempotency for mutation → duplicate side effects
279
- - Unbounded response size → add pagination or field projection
280
- - Missing auth guard → unauthorized access
281
-
282
- ## Estimation (rough)
283
- - Dev: 4–8 hours
284
- - Review: 1–2 hours
285
- - Difficulty: 2/5
286
- `,
287
- progressTemplate: `# PROGRESS: REST API Endpoint — {{EndpointName}}
288
-
289
- ## Status: draft
290
-
291
- ## Criteria
292
- - [ ] AC-1: Request validation
293
- - [ ] AC-2: Core business logic
294
- - [ ] AC-3: Response contract
295
- - [ ] AC-4: Error handling
296
- - [ ] AC-5: Idempotency
297
- - [ ] AC-6: Observability
298
- `,
299
- },
300
- {
301
- id: 'ui-form',
302
- name: 'UI Form',
303
- category: 'ui',
304
- description: 'Interactive form with validation, error display, and accessibility.',
305
- tags: ['ui', 'form', 'ux', 'accessibility', 'validation'],
306
- variables: [
307
- {
308
- key: 'FormName',
309
- label: 'Form name',
310
- description: 'Name of the form (e.g. Registration, Checkout, Contact)',
311
- example: 'Registration',
312
- required: true,
313
- },
314
- ],
315
- huTemplate: `# HU: {{FormName}} Form
316
-
317
- ## User Story
318
- As a user, I want to fill out the {{FormName}} form with clear guidance so that I can complete the action without confusion.
319
-
320
- ## Acceptance Criteria
321
-
322
- ### AC-1: Field validation
323
- - [ ] Required fields marked visually
324
- - [ ] Validation runs on blur and on submit
325
- - [ ] Error messages appear adjacent to invalid fields
326
- - [ ] Valid fields show positive feedback
327
-
328
- ### AC-2: Submit behavior
329
- - [ ] Form is disabled (loading state) during submission
330
- - [ ] Success state shown after successful submission
331
- - [ ] Errors from the API are displayed inline
332
-
333
- ### AC-3: Accessibility
334
- - [ ] All inputs have visible labels
335
- - [ ] Error messages linked via aria-describedby
336
- - [ ] Form navigable via keyboard (Tab, Enter, Escape)
337
- - [ ] Screen reader announces validation errors
338
-
339
- ### AC-4: Responsive design
340
- - [ ] Form renders correctly on mobile, tablet, and desktop
341
- - [ ] Touch targets meet minimum size (44×44 px)
342
-
343
- ### AC-5: Reset and cancel
344
- - [ ] Reset clears all fields and removes error state
345
- - [ ] Cancel navigates away without data loss warning if form is pristine
346
- - [ ] Cancel shows confirmation dialog if form has unsaved changes
347
- `,
348
- fichaTecnicaTemplate: `# FICHA TÉCNICA: {{FormName}} Form
349
-
350
- ## Affected Files
351
- - components/{{FormName}}Form
352
- - hooks/use{{FormName}}Form (form state, validation)
353
- - api/{{FormName}}-client (submission)
354
- - i18n/{{FormName}}-form.json (strings)
355
-
356
- ## Types / Entities
357
- - \`{{FormName}}FormValues\`: all field values
358
- - \`{{FormName}}FormErrors\`: per-field error messages
359
- - \`{{FormName}}FormState\`: idle | submitting | success | error
360
-
361
- ## Risks
362
- - Missing server-side validation mirror → inconsistent UX
363
- - Missing loading state → double submissions
364
- - Missing ARIA attributes → accessibility failures
365
-
366
- ## Estimation (rough)
367
- - Dev: 4–10 hours
368
- - Review: 1–2 hours
369
- - Difficulty: 2/5
370
- `,
371
- progressTemplate: `# PROGRESS: {{FormName}} Form
372
-
373
- ## Status: draft
374
-
375
- ## Criteria
376
- - [ ] AC-1: Field validation
377
- - [ ] AC-2: Submit behavior
378
- - [ ] AC-3: Accessibility
379
- - [ ] AC-4: Responsive design
380
- - [ ] AC-5: Reset and cancel
381
- `,
382
- },
7
+ import { INDUSTRY_TEMPLATES } from './catalog-industry.js';
8
+ /** Full catalog of built-in spec templates (core + extra + industry). */
9
+ export const BUILT_IN_TEMPLATES = [
10
+ AUTH_JWT_TEMPLATE,
11
+ CRUD_ENTITY_TEMPLATE,
12
+ REST_API_ENDPOINT_TEMPLATE,
13
+ UI_FORM_TEMPLATE,
14
+ ...EXTRA_TEMPLATES,
15
+ ...INDUSTRY_TEMPLATES,
383
16
  ];
384
- /** Full catalog of built-in spec templates (core + extra). */
385
- export const BUILT_IN_TEMPLATES = [...CORE_TEMPLATES, ...EXTRA_TEMPLATES];
386
17
  //# sourceMappingURL=catalog.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../../src/engine/spec-templates/catalog.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../../src/engine/spec-templates/catalog.ts"],"names":[],"mappings":"AAAA,oFAAoF;AACpF,8EAA8E;AAC9E,+DAA+D;AAG/D,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AACnF,OAAO,EAAE,0BAA0B,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACrF,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAE3D,yEAAyE;AACzE,MAAM,CAAC,MAAM,kBAAkB,GAAwB;IACrD,iBAAiB;IACjB,oBAAoB;IACpB,0BAA0B;IAC1B,gBAAgB;IAChB,GAAG,eAAe;IAClB,GAAG,kBAAkB;CACtB,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { SpecTemplateEntry, CustomTemplateLoadResult } from '../../types/spec-templates.js';
2
+ /**
3
+ * Loads custom templates from a directory. Each .json file is validated.
4
+ * Malformed files generate warnings but do not block loading of other templates.
5
+ */
6
+ export declare function loadCustomTemplates(baseDir?: string): Promise<CustomTemplateLoadResult>;
7
+ /**
8
+ * Merges custom templates with built-in templates.
9
+ * Custom templates override built-in templates with the same ID.
10
+ */
11
+ export declare function mergeTemplates(builtIn: SpecTemplateEntry[], custom: SpecTemplateEntry[]): SpecTemplateEntry[];
12
+ //# sourceMappingURL=custom-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"custom-loader.d.ts","sourceRoot":"","sources":["../../../src/engine/spec-templates/custom-loader.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EACV,iBAAiB,EACjB,wBAAwB,EAEzB,MAAM,+BAA+B,CAAC;AA6DvC;;;GAGG;AACH,wBAAsB,mBAAmB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,wBAAwB,CAAC,CA6B7F;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,iBAAiB,EAAE,EAC5B,MAAM,EAAE,iBAAiB,EAAE,GAC1B,iBAAiB,EAAE,CAIrB"}
@@ -0,0 +1,99 @@
1
+ // engine/spec-templates/custom-loader.ts — Loads custom user templates from data/global/.
2
+ // AC-06: Custom templates from data/global/spec-templates/custom/.
3
+ // AC-11: Validates with Zod, reports malformed templates as warnings.
4
+ import { readdir, readFile } from 'node:fs/promises';
5
+ import { join } from 'node:path';
6
+ import { z } from 'zod';
7
+ /** Zod schema for validating custom template JSON files. */
8
+ const templateVariableSchema = z.object({
9
+ key: z.string().min(1),
10
+ label: z.string().min(1),
11
+ description: z.string().min(1),
12
+ example: z.string().min(1),
13
+ required: z.boolean(),
14
+ defaultValue: z.string().optional(),
15
+ });
16
+ const templateCriterionSchema = z.object({
17
+ id: z.string().min(1),
18
+ title: z.string().min(1),
19
+ required: z.boolean(),
20
+ });
21
+ const complexityScoreSchema = z.enum(['S', 'M', 'L', 'XL']);
22
+ const estimationBaseSchema = z.object({
23
+ hoursMin: z.number().nonnegative(),
24
+ hoursMax: z.number().nonnegative(),
25
+ notes: z.string(),
26
+ });
27
+ const templateCategorySchema = z.enum([
28
+ 'auth',
29
+ 'crud',
30
+ 'api',
31
+ 'ui',
32
+ 'infra',
33
+ 'testing',
34
+ 'integration',
35
+ 'data',
36
+ 'security',
37
+ 'performance',
38
+ 'industry',
39
+ ]);
40
+ const industrySubcategorySchema = z.enum(['fintech', 'healthtech', 'ecommerce', 'saas']);
41
+ const customTemplateSchema = z.object({
42
+ id: z.string().min(1),
43
+ name: z.string().min(1),
44
+ category: templateCategorySchema,
45
+ subcategory: industrySubcategorySchema.optional(),
46
+ description: z.string().min(1),
47
+ tags: z.array(z.string()),
48
+ complexityScore: complexityScoreSchema,
49
+ estimationBase: estimationBaseSchema,
50
+ criteria: z.array(templateCriterionSchema),
51
+ variables: z.array(templateVariableSchema),
52
+ huTemplate: z.string().min(1),
53
+ fichaTecnicaTemplate: z.string().min(1),
54
+ progressTemplate: z.string().min(1),
55
+ });
56
+ /** Default directory for custom user templates. */
57
+ const CUSTOM_TEMPLATES_DIR = 'data/global/spec-templates/custom';
58
+ /**
59
+ * Loads custom templates from a directory. Each .json file is validated.
60
+ * Malformed files generate warnings but do not block loading of other templates.
61
+ */
62
+ export async function loadCustomTemplates(baseDir) {
63
+ const dir = baseDir ?? CUSTOM_TEMPLATES_DIR;
64
+ const templates = [];
65
+ const warnings = [];
66
+ let files;
67
+ try {
68
+ files = await readdir(dir);
69
+ }
70
+ catch {
71
+ // Directory does not exist — not an error, just no custom templates
72
+ return { templates, warnings };
73
+ }
74
+ const jsonFiles = files.filter((f) => f.endsWith('.json'));
75
+ for (const file of jsonFiles) {
76
+ const filePath = join(dir, file);
77
+ try {
78
+ const content = await readFile(filePath, 'utf-8');
79
+ const parsed = JSON.parse(content);
80
+ const validated = customTemplateSchema.parse(parsed);
81
+ templates.push(validated);
82
+ }
83
+ catch (error) {
84
+ const message = error instanceof Error ? error.message : String(error);
85
+ warnings.push({ file: filePath, error: message });
86
+ }
87
+ }
88
+ return { templates, warnings };
89
+ }
90
+ /**
91
+ * Merges custom templates with built-in templates.
92
+ * Custom templates override built-in templates with the same ID.
93
+ */
94
+ export function mergeTemplates(builtIn, custom) {
95
+ const customIds = new Set(custom.map((t) => t.id));
96
+ const filtered = builtIn.filter((t) => !customIds.has(t.id));
97
+ return [...filtered, ...custom];
98
+ }
99
+ //# sourceMappingURL=custom-loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"custom-loader.js","sourceRoot":"","sources":["../../../src/engine/spec-templates/custom-loader.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,6 @@
1
1
  export { BUILT_IN_TEMPLATES } from './catalog.js';
2
- export { listTemplates, findTemplate, getAvailableCategories } from './query.js';
3
- export { renderTemplate, interpolate, findMissingRequired } from './renderer.js';
2
+ export { INDUSTRY_TEMPLATES } from './catalog-industry.js';
3
+ export { listTemplates, findTemplate, findTemplateWithCustom, getAvailableCategories, } from './query.js';
4
+ export { renderTemplate, interpolate, findMissingRequired, resolveCriteria, filterHuByCriteria, filterProgressByCriteria, buildEstimationSection, } from './renderer.js';
5
+ export { loadCustomTemplates, mergeTemplates } from './custom-loader.js';
4
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/engine/spec-templates/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AACjF,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/engine/spec-templates/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EACL,aAAa,EACb,YAAY,EACZ,sBAAsB,EACtB,sBAAsB,GACvB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,cAAc,EACd,WAAW,EACX,mBAAmB,EACnB,eAAe,EACf,kBAAkB,EAClB,wBAAwB,EACxB,sBAAsB,GACvB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC"}
@@ -1,5 +1,7 @@
1
1
  // engine/spec-templates/index.ts — Public API barrel for spec-templates engine.
2
2
  export { BUILT_IN_TEMPLATES } from './catalog.js';
3
- export { listTemplates, findTemplate, getAvailableCategories } from './query.js';
4
- export { renderTemplate, interpolate, findMissingRequired } from './renderer.js';
3
+ export { INDUSTRY_TEMPLATES } from './catalog-industry.js';
4
+ export { listTemplates, findTemplate, findTemplateWithCustom, getAvailableCategories, } from './query.js';
5
+ export { renderTemplate, interpolate, findMissingRequired, resolveCriteria, filterHuByCriteria, filterProgressByCriteria, buildEstimationSection, } from './renderer.js';
6
+ export { loadCustomTemplates, mergeTemplates } from './custom-loader.js';
5
7
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/engine/spec-templates/index.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAEhF,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AACjF,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/engine/spec-templates/index.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAEhF,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EACL,aAAa,EACb,YAAY,EACZ,sBAAsB,EACtB,sBAAsB,GACvB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,cAAc,EACd,WAAW,EACX,mBAAmB,EACnB,eAAe,EACf,kBAAkB,EAClB,wBAAwB,EACxB,sBAAsB,GACvB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC"}
@@ -1,12 +1,20 @@
1
- import type { SpecTemplateEntry, TemplateCategory, ListTemplatesResult } from '../../types/spec-templates.js';
1
+ import type { SpecTemplateEntry, TemplateCategory, TemplateComplexity, ListTemplatesResult, CustomTemplateWarning } from '../../types/spec-templates.js';
2
2
  /**
3
- * Lists templates from the catalog, optionally filtered by category and/or search term.
3
+ * Lists templates from the catalog, optionally filtered by category, search, and complexity.
4
+ * Includes custom user templates from data/global/spec-templates/custom/.
4
5
  */
5
- export declare function listTemplates(category?: TemplateCategory, search?: string): ListTemplatesResult;
6
+ export declare function listTemplates(category?: TemplateCategory, search?: string, complexityScore?: TemplateComplexity, customDir?: string): Promise<{
7
+ result: ListTemplatesResult;
8
+ warnings: CustomTemplateWarning[];
9
+ }>;
6
10
  /**
7
- * Returns a single template by ID, or undefined if not found.
11
+ * Returns a single template by ID (built-in only, sync).
8
12
  */
9
13
  export declare function findTemplate(templateId: string): SpecTemplateEntry | undefined;
14
+ /**
15
+ * Returns a single template by ID, searching built-in and custom templates.
16
+ */
17
+ export declare function findTemplateWithCustom(templateId: string, customDir?: string): Promise<SpecTemplateEntry | undefined>;
10
18
  /**
11
19
  * Returns all available categories that have at least one template.
12
20
  */
@@ -1 +1 @@
1
- {"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../../src/engine/spec-templates/query.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,iBAAiB,EACjB,gBAAgB,EAChB,mBAAmB,EAEpB,MAAM,+BAA+B,CAAC;AAkBvC;;GAEG;AACH,wBAAgB,aAAa,CAAC,QAAQ,CAAC,EAAE,gBAAgB,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,mBAAmB,CA6B/F;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,iBAAiB,GAAG,SAAS,CAE9E;AAED;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,gBAAgB,EAAE,CAG3D"}
1
+ {"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../../src/engine/spec-templates/query.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,iBAAiB,EACjB,gBAAgB,EAChB,kBAAkB,EAClB,mBAAmB,EAEnB,qBAAqB,EACtB,MAAM,+BAA+B,CAAC;AAsBvC;;;GAGG;AACH,wBAAsB,aAAa,CACjC,QAAQ,CAAC,EAAE,gBAAgB,EAC3B,MAAM,CAAC,EAAE,MAAM,EACf,eAAe,CAAC,EAAE,kBAAkB,EACpC,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC;IAAE,MAAM,EAAE,mBAAmB,CAAC;IAAC,QAAQ,EAAE,qBAAqB,EAAE,CAAA;CAAE,CAAC,CAwC7E;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,iBAAiB,GAAG,SAAS,CAE9E;AAED;;GAEG;AACH,wBAAsB,sBAAsB,CAC1C,UAAU,EAAE,MAAM,EAClB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,iBAAiB,GAAG,SAAS,CAAC,CAIxC;AAED;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,gBAAgB,EAAE,CAG3D"}