@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
@@ -1,5 +1,6 @@
1
1
  // engine/spec-templates/query.ts — Catalog querying: list and find templates.
2
2
  import { BUILT_IN_TEMPLATES } from './catalog.js';
3
+ import { loadCustomTemplates, mergeTemplates } from './custom-loader.js';
3
4
  /**
4
5
  * Converts a full SpecTemplateEntry to a summary TemplateListItem.
5
6
  */
@@ -8,20 +9,29 @@ function toListItem(template) {
8
9
  id: template.id,
9
10
  name: template.name,
10
11
  category: template.category,
12
+ subcategory: template.subcategory,
11
13
  description: template.description,
12
14
  tags: template.tags,
15
+ complexityScore: template.complexityScore,
16
+ criteriaCount: template.criteria.length,
13
17
  variableCount: template.variables.length,
14
18
  requiredVariableCount: template.variables.filter((v) => v.required).length,
15
19
  };
16
20
  }
17
21
  /**
18
- * Lists templates from the catalog, optionally filtered by category and/or search term.
22
+ * Lists templates from the catalog, optionally filtered by category, search, and complexity.
23
+ * Includes custom user templates from data/global/spec-templates/custom/.
19
24
  */
20
- export function listTemplates(category, search) {
21
- let templates = [...BUILT_IN_TEMPLATES];
25
+ export async function listTemplates(category, search, complexityScore, customDir) {
26
+ const customResult = await loadCustomTemplates(customDir);
27
+ const allTemplates = mergeTemplates(BUILT_IN_TEMPLATES, customResult.templates);
28
+ let templates = [...allTemplates];
22
29
  if (category !== undefined) {
23
30
  templates = templates.filter((t) => t.category === category);
24
31
  }
32
+ if (complexityScore !== undefined) {
33
+ templates = templates.filter((t) => t.complexityScore === complexityScore);
34
+ }
25
35
  if (search !== undefined && search.trim().length > 0) {
26
36
  const term = search.trim().toLowerCase();
27
37
  templates = templates.filter((t) => t.name.toLowerCase().includes(term) ||
@@ -30,22 +40,34 @@ export function listTemplates(category, search) {
30
40
  }
31
41
  const filterLabel = [
32
42
  category !== undefined ? `category=${category}` : '',
43
+ complexityScore !== undefined ? `complexity=${complexityScore}` : '',
33
44
  search !== undefined && search.trim().length > 0 ? `search="${search.trim()}"` : '',
34
45
  ]
35
46
  .filter(Boolean)
36
47
  .join(', ');
37
48
  return {
38
- templates: templates.map(toListItem),
39
- total: templates.length,
40
- filteredBy: filterLabel.length > 0 ? filterLabel : undefined,
49
+ result: {
50
+ templates: templates.map(toListItem),
51
+ total: templates.length,
52
+ filteredBy: filterLabel.length > 0 ? filterLabel : undefined,
53
+ },
54
+ warnings: customResult.warnings,
41
55
  };
42
56
  }
43
57
  /**
44
- * Returns a single template by ID, or undefined if not found.
58
+ * Returns a single template by ID (built-in only, sync).
45
59
  */
46
60
  export function findTemplate(templateId) {
47
61
  return BUILT_IN_TEMPLATES.find((t) => t.id === templateId);
48
62
  }
63
+ /**
64
+ * Returns a single template by ID, searching built-in and custom templates.
65
+ */
66
+ export async function findTemplateWithCustom(templateId, customDir) {
67
+ const customResult = await loadCustomTemplates(customDir);
68
+ const allTemplates = mergeTemplates(BUILT_IN_TEMPLATES, customResult.templates);
69
+ return allTemplates.find((t) => t.id === templateId);
70
+ }
49
71
  /**
50
72
  * Returns all available categories that have at least one template.
51
73
  */
@@ -1 +1 @@
1
- {"version":3,"file":"query.js","sourceRoot":"","sources":["../../../src/engine/spec-templates/query.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAQ9E,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAElD;;GAEG;AACH,SAAS,UAAU,CAAC,QAA2B;IAC7C,OAAO;QACL,EAAE,EAAE,QAAQ,CAAC,EAAE;QACf,IAAI,EAAE,QAAQ,CAAC,IAAI;QACnB,QAAQ,EAAE,QAAQ,CAAC,QAAQ;QAC3B,WAAW,EAAE,QAAQ,CAAC,WAAW;QACjC,IAAI,EAAE,QAAQ,CAAC,IAAI;QACnB,aAAa,EAAE,QAAQ,CAAC,SAAS,CAAC,MAAM;QACxC,qBAAqB,EAAE,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,MAAM;KAC3E,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,QAA2B,EAAE,MAAe;IACxE,IAAI,SAAS,GAAG,CAAC,GAAG,kBAAkB,CAAC,CAAC;IAExC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;IAC/D,CAAC;IAED,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACzC,SAAS,GAAG,SAAS,CAAC,MAAM,CAC1B,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC;YACnC,CAAC,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC;YAC1C,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CACzD,CAAC;IACJ,CAAC;IAED,MAAM,WAAW,GAAG;QAClB,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,YAAY,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE;QACpD,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE;KACpF;SACE,MAAM,CAAC,OAAO,CAAC;SACf,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,OAAO;QACL,SAAS,EAAE,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC;QACpC,KAAK,EAAE,SAAS,CAAC,MAAM;QACvB,UAAU,EAAE,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS;KAC7D,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,UAAkB;IAC7C,OAAO,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,UAAU,CAAC,CAAC;AAC7D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB;IACpC,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;IACtE,OAAO,CAAC,GAAG,UAAU,CAAC,CAAC;AACzB,CAAC"}
1
+ {"version":3,"file":"query.js","sourceRoot":"","sources":["../../../src/engine/spec-templates/query.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import type { SpecTemplateEntry, TemplateVariableValue, TemplateVariable } from '../../types/spec-templates.js';
1
+ import type { SpecTemplateEntry, TemplateVariableValue, TemplateVariable, TemplateCriterion } from '../../types/spec-templates.js';
2
2
  /**
3
3
  * Interpolates all {{Key}} placeholders in a template string with provided values.
4
4
  * Falls back to defaultValue if a variable is optional and not provided.
@@ -8,12 +8,37 @@ export declare function interpolate(template: string, variables: TemplateVariabl
8
8
  * Returns the keys of required variables that are missing from the provided values.
9
9
  */
10
10
  export declare function findMissingRequired(template: SpecTemplateEntry, variables: TemplateVariableValue[]): string[];
11
+ /**
12
+ * Resolves which criteria to include and generates warnings for forced-required criteria.
13
+ * AC-07: Required criteria cannot be omitted.
14
+ */
15
+ export declare function resolveCriteria(allCriteria: TemplateCriterion[], includeCriteria?: string[]): {
16
+ included: TemplateCriterion[];
17
+ warnings: string[];
18
+ };
19
+ /**
20
+ * Filters HU template content to include only the selected criteria sections.
21
+ * Renumbers criteria sequentially (AC-01, AC-02, ...) to avoid gaps.
22
+ */
23
+ export declare function filterHuByCriteria(huContent: string, allCriteria: TemplateCriterion[], includedCriteria: TemplateCriterion[]): string;
24
+ /**
25
+ * Filters PROGRESS template to include only selected criteria.
26
+ */
27
+ export declare function filterProgressByCriteria(progressContent: string, allCriteria: TemplateCriterion[], includedCriteria: TemplateCriterion[]): string;
28
+ /**
29
+ * Builds the estimation section to inject into the HU.md (AC-09).
30
+ */
31
+ export declare function buildEstimationSection(template: SpecTemplateEntry): string;
11
32
  /**
12
33
  * Renders all three template files (HU, FICHA-TECNICA, PROGRESS) with the provided values.
34
+ * Supports partial criteria selection and estimation injection.
13
35
  */
14
- export declare function renderTemplate(template: SpecTemplateEntry, variables: TemplateVariableValue[]): {
36
+ export declare function renderTemplate(template: SpecTemplateEntry, variables: TemplateVariableValue[], includeCriteria?: string[]): {
15
37
  hu: string;
16
38
  fichaTecnica: string;
17
39
  progress: string;
40
+ criteriaIncluded: number;
41
+ criteriaTotal: number;
42
+ warnings: string[];
18
43
  };
19
44
  //# sourceMappingURL=renderer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../../../src/engine/spec-templates/renderer.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,iBAAiB,EACjB,qBAAqB,EACrB,gBAAgB,EACjB,MAAM,+BAA+B,CAAC;AAEvC;;;GAGG;AACH,wBAAgB,WAAW,CACzB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,qBAAqB,EAAE,EAClC,WAAW,EAAE,gBAAgB,EAAE,GAC9B,MAAM,CAiBR;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,iBAAiB,EAC3B,SAAS,EAAE,qBAAqB,EAAE,GACjC,MAAM,EAAE,CAWV;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,iBAAiB,EAC3B,SAAS,EAAE,qBAAqB,EAAE,GACjC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAOxD"}
1
+ {"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../../../src/engine/spec-templates/renderer.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,iBAAiB,EACjB,qBAAqB,EACrB,gBAAgB,EAChB,iBAAiB,EAClB,MAAM,+BAA+B,CAAC;AAEvC;;;GAGG;AACH,wBAAgB,WAAW,CACzB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,qBAAqB,EAAE,EAClC,WAAW,EAAE,gBAAgB,EAAE,GAC9B,MAAM,CAiBR;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,iBAAiB,EAC3B,SAAS,EAAE,qBAAqB,EAAE,GACjC,MAAM,EAAE,CAWV;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,WAAW,EAAE,iBAAiB,EAAE,EAChC,eAAe,CAAC,EAAE,MAAM,EAAE,GACzB;IAAE,QAAQ,EAAE,iBAAiB,EAAE,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,CAyBvD;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,iBAAiB,EAAE,EAChC,gBAAgB,EAAE,iBAAiB,EAAE,GACpC,MAAM,CA+BR;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,eAAe,EAAE,MAAM,EACvB,WAAW,EAAE,iBAAiB,EAAE,EAChC,gBAAgB,EAAE,iBAAiB,EAAE,GACpC,MAAM,CAwBR;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,iBAAiB,GAAG,MAAM,CAW1E;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,iBAAiB,EAC3B,SAAS,EAAE,qBAAqB,EAAE,EAClC,eAAe,CAAC,EAAE,MAAM,EAAE,GACzB;IACD,EAAE,EAAE,MAAM,CAAC;IACX,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,EAAE,MAAM,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB,CA0BA"}
@@ -1,5 +1,6 @@
1
1
  // engine/spec-templates/renderer.ts — Template variable substitution engine.
2
2
  // Replaces {{VariableKey}} placeholders with user-provided values.
3
+ // Supports partial criteria selection (AC-07) and estimation injection (AC-09).
3
4
  /**
4
5
  * Interpolates all {{Key}} placeholders in a template string with provided values.
5
6
  * Falls back to defaultValue if a variable is optional and not provided.
@@ -31,15 +32,129 @@ export function findMissingRequired(template, variables) {
31
32
  }));
32
33
  return template.variables.filter((v) => v.required && !providedKeys.has(v.key)).map((v) => v.key);
33
34
  }
35
+ /**
36
+ * Resolves which criteria to include and generates warnings for forced-required criteria.
37
+ * AC-07: Required criteria cannot be omitted.
38
+ */
39
+ export function resolveCriteria(allCriteria, includeCriteria) {
40
+ if (includeCriteria === undefined || includeCriteria.length === 0) {
41
+ return { included: allCriteria, warnings: [] };
42
+ }
43
+ const requestedIds = new Set(includeCriteria);
44
+ const warnings = [];
45
+ const included = [];
46
+ for (const criterion of allCriteria) {
47
+ const isRequested = requestedIds.has(criterion.id);
48
+ if (isRequested) {
49
+ included.push(criterion);
50
+ }
51
+ else if (criterion.required) {
52
+ // Required criterion was excluded — force-include with warning
53
+ included.push(criterion);
54
+ warnings.push(`Criterion "${criterion.id}: ${criterion.title}" is required and was included automatically.`);
55
+ }
56
+ // Optional, not requested → omit
57
+ }
58
+ return { included, warnings };
59
+ }
60
+ /**
61
+ * Filters HU template content to include only the selected criteria sections.
62
+ * Renumbers criteria sequentially (AC-01, AC-02, ...) to avoid gaps.
63
+ */
64
+ export function filterHuByCriteria(huContent, allCriteria, includedCriteria) {
65
+ if (includedCriteria.length === allCriteria.length) {
66
+ return huContent;
67
+ }
68
+ const includedIds = new Set(includedCriteria.map((c) => c.id));
69
+ const lines = huContent.split('\n');
70
+ const outputLines = [];
71
+ let currentCriterionId;
72
+ let isIncluded = true;
73
+ let renumberIndex = 0;
74
+ // Map from old AC IDs to which ones are included
75
+ const criterionIdPattern = /^### (AC-\d+)/;
76
+ for (const line of lines) {
77
+ const match = criterionIdPattern.exec(line);
78
+ if (match?.[1] !== undefined) {
79
+ currentCriterionId = match[1];
80
+ isIncluded = includedIds.has(currentCriterionId);
81
+ if (isIncluded) {
82
+ renumberIndex++;
83
+ const renumbered = line.replace(/^### AC-\d+/, `### AC-${renumberIndex}`);
84
+ outputLines.push(renumbered);
85
+ }
86
+ }
87
+ else if (isIncluded) {
88
+ outputLines.push(line);
89
+ }
90
+ }
91
+ return outputLines.join('\n');
92
+ }
93
+ /**
94
+ * Filters PROGRESS template to include only selected criteria.
95
+ */
96
+ export function filterProgressByCriteria(progressContent, allCriteria, includedCriteria) {
97
+ if (includedCriteria.length === allCriteria.length) {
98
+ return progressContent;
99
+ }
100
+ const includedIds = new Set(includedCriteria.map((c) => c.id));
101
+ const lines = progressContent.split('\n');
102
+ const outputLines = [];
103
+ let renumberIndex = 0;
104
+ for (const line of lines) {
105
+ const criterionMatch = /^- \[ \] (AC-\d+):/.exec(line);
106
+ if (criterionMatch?.[1] !== undefined) {
107
+ if (includedIds.has(criterionMatch[1])) {
108
+ renumberIndex++;
109
+ const renumbered = line.replace(/AC-\d+/, `AC-${renumberIndex}`);
110
+ outputLines.push(renumbered);
111
+ }
112
+ }
113
+ else {
114
+ outputLines.push(line);
115
+ }
116
+ }
117
+ return outputLines.join('\n');
118
+ }
119
+ /**
120
+ * Builds the estimation section to inject into the HU.md (AC-09).
121
+ */
122
+ export function buildEstimationSection(template) {
123
+ const { complexityScore, estimationBase } = template;
124
+ return [
125
+ '',
126
+ '## Estimacion Inicial',
127
+ '',
128
+ `- **Complejidad:** ${complexityScore}`,
129
+ `- **Horas estimadas:** ${estimationBase.hoursMin}–${estimationBase.hoursMax}h`,
130
+ `- **Notas:** ${estimationBase.notes}`,
131
+ '',
132
+ ].join('\n');
133
+ }
34
134
  /**
35
135
  * Renders all three template files (HU, FICHA-TECNICA, PROGRESS) with the provided values.
136
+ * Supports partial criteria selection and estimation injection.
36
137
  */
37
- export function renderTemplate(template, variables) {
138
+ export function renderTemplate(template, variables, includeCriteria) {
38
139
  const defs = template.variables;
140
+ // Resolve criteria selection
141
+ const { included, warnings } = resolveCriteria(template.criteria, includeCriteria);
142
+ // Interpolate variables first
143
+ let hu = interpolate(template.huTemplate, variables, defs);
144
+ const fichaTecnica = interpolate(template.fichaTecnicaTemplate, variables, defs);
145
+ let progress = interpolate(template.progressTemplate, variables, defs);
146
+ // Filter criteria if partial selection
147
+ hu = filterHuByCriteria(hu, template.criteria, included);
148
+ progress = filterProgressByCriteria(progress, template.criteria, included);
149
+ // Inject estimation section into HU (AC-09)
150
+ hu += buildEstimationSection(template);
39
151
  return {
40
- hu: interpolate(template.huTemplate, variables, defs),
41
- fichaTecnica: interpolate(template.fichaTecnicaTemplate, variables, defs),
42
- progress: interpolate(template.progressTemplate, variables, defs),
152
+ hu,
153
+ fichaTecnica,
154
+ progress,
155
+ criteriaIncluded: included.length,
156
+ criteriaTotal: template.criteria.length,
157
+ warnings,
43
158
  };
44
159
  }
45
160
  //# sourceMappingURL=renderer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"renderer.js","sourceRoot":"","sources":["../../../src/engine/spec-templates/renderer.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,mEAAmE;AAQnE;;;GAGG;AACH,MAAM,UAAU,WAAW,CACzB,QAAgB,EAChB,SAAkC,EAClC,WAA+B;IAE/B,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAiB,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAEjF,OAAO,QAAQ,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC,KAAK,EAAE,GAAW,EAAE,EAAE;QAC/D,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACnC,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAClD,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,MAAM,UAAU,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;QAC1D,IAAI,UAAU,EAAE,YAAY,KAAK,SAAS,EAAE,CAAC;YAC3C,OAAO,UAAU,CAAC,YAAY,CAAC;QACjC,CAAC;QAED,qFAAqF;QACrF,OAAO,KAAK,CAAC;IACf,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CACjC,QAA2B,EAC3B,SAAkC;IAElC,MAAM,YAAY,GAAG,IAAI,GAAG,CAC1B,SAAS;SACN,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;SACjB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;QACZ,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;QACjD,OAAO,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;IACvD,CAAC,CAAC,CACL,CAAC;IAEF,OAAO,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AACpG,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAC5B,QAA2B,EAC3B,SAAkC;IAElC,MAAM,IAAI,GAAG,QAAQ,CAAC,SAAS,CAAC;IAChC,OAAO;QACL,EAAE,EAAE,WAAW,CAAC,QAAQ,CAAC,UAAU,EAAE,SAAS,EAAE,IAAI,CAAC;QACrD,YAAY,EAAE,WAAW,CAAC,QAAQ,CAAC,oBAAoB,EAAE,SAAS,EAAE,IAAI,CAAC;QACzE,QAAQ,EAAE,WAAW,CAAC,QAAQ,CAAC,gBAAgB,EAAE,SAAS,EAAE,IAAI,CAAC;KAClE,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"renderer.js","sourceRoot":"","sources":["../../../src/engine/spec-templates/renderer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { SpecTemplateEntry } from '../../types/spec-templates.js';
2
+ /** REST API endpoint spec template. */
3
+ export declare const REST_API_ENDPOINT_TEMPLATE: SpecTemplateEntry;
4
+ /** UI Form spec template. */
5
+ export declare const UI_FORM_TEMPLATE: SpecTemplateEntry;
6
+ //# sourceMappingURL=templates-api-ui.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templates-api-ui.d.ts","sourceRoot":"","sources":["../../../src/engine/spec-templates/templates-api-ui.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAEvE,uCAAuC;AACvC,eAAO,MAAM,0BAA0B,EAAE,iBAiHxC,CAAC;AAEF,6BAA6B;AAC7B,eAAO,MAAM,gBAAgB,EAAE,iBA+F9B,CAAC"}
@@ -0,0 +1,215 @@
1
+ // engine/spec-templates/templates-api-ui.ts — REST API endpoint + UI form templates.
2
+ // Extracted from catalog.ts to keep file sizes within limits.
3
+ /** REST API endpoint spec template. */
4
+ export const REST_API_ENDPOINT_TEMPLATE = {
5
+ id: 'rest-api-endpoint',
6
+ name: 'REST API Endpoint',
7
+ category: 'api',
8
+ description: 'A single REST endpoint with validation, error handling, and documentation.',
9
+ tags: ['api', 'rest', 'endpoint', 'openapi'],
10
+ complexityScore: 'S',
11
+ estimationBase: {
12
+ hoursMin: 4,
13
+ hoursMax: 8,
14
+ notes: 'Single endpoint with validation and error handling',
15
+ },
16
+ criteria: [
17
+ { id: 'AC-1', title: 'Request validation', required: true },
18
+ { id: 'AC-2', title: 'Core business logic', required: true },
19
+ { id: 'AC-3', title: 'Response contract', required: true },
20
+ { id: 'AC-4', title: 'Error handling', required: true },
21
+ { id: 'AC-5', title: 'Idempotency', required: false },
22
+ { id: 'AC-6', title: 'Observability', required: false },
23
+ ],
24
+ variables: [
25
+ {
26
+ key: 'EndpointName',
27
+ label: 'Endpoint name',
28
+ description: 'Short descriptive name for this endpoint',
29
+ example: 'Submit Order',
30
+ required: true,
31
+ },
32
+ {
33
+ key: 'HttpMethod',
34
+ label: 'HTTP Method',
35
+ description: 'HTTP method: GET, POST, PUT, PATCH, DELETE',
36
+ example: 'POST',
37
+ required: true,
38
+ },
39
+ {
40
+ key: 'Path',
41
+ label: 'URL path',
42
+ description: 'The URL path for this endpoint',
43
+ example: '/orders/submit',
44
+ required: true,
45
+ },
46
+ ],
47
+ huTemplate: `# HU: REST API Endpoint — {{EndpointName}}
48
+
49
+ ## User Story
50
+ As an API consumer, I want a reliable {{HttpMethod}} {{Path}} endpoint so that I can {{EndpointName}} without client-side workarounds.
51
+
52
+ ## Acceptance Criteria
53
+
54
+ ### AC-1: Request validation
55
+ - [ ] Input schema validated at the boundary
56
+ - [ ] Invalid requests return 422 with structured error messages
57
+ - [ ] Content-Type header checked when applicable
58
+
59
+ ### AC-2: Core business logic
60
+ - [ ] {{EndpointName}} logic is encapsulated in a dedicated use-case function
61
+ - [ ] Side effects (emails, notifications, jobs) are isolated and testable
62
+
63
+ ### AC-3: Response contract
64
+ - [ ] Success response follows the API response envelope convention
65
+ - [ ] HTTP status codes match the operation semantics
66
+ - [ ] Response schema is documented (OpenAPI or equivalent)
67
+
68
+ ### AC-4: Error handling
69
+ - [ ] All error paths return structured JSON (not stack traces)
70
+ - [ ] 404 returned for missing resources
71
+ - [ ] 409 returned for conflicts
72
+ - [ ] 500 never leaks internal details
73
+
74
+ ### AC-5: Idempotency (if applicable)
75
+ - [ ] Idempotency key header supported for non-idempotent operations
76
+ - [ ] Duplicate requests handled gracefully
77
+
78
+ ### AC-6: Observability
79
+ - [ ] Endpoint logged with method, path, status, latency
80
+ - [ ] Errors reported to the monitoring system
81
+ `,
82
+ fichaTecnicaTemplate: `# FICHA TÉCNICA: REST API Endpoint — {{EndpointName}}
83
+
84
+ ## Affected Files
85
+ - handlers/{{Path}} (route handler)
86
+ - use-cases/{{EndpointName}} (business logic)
87
+ - validators/{{EndpointName}}-input
88
+ - openapi/paths/{{Path}} (documentation)
89
+
90
+ ## Types / Entities
91
+ - \`{{EndpointName}}Input\`: validated request payload
92
+ - \`{{EndpointName}}Output\`: response body shape
93
+ - \`ApiError\`: code, message, details[]
94
+
95
+ ## Risks
96
+ - Missing idempotency for mutation → duplicate side effects
97
+ - Unbounded response size → add pagination or field projection
98
+ - Missing auth guard → unauthorized access
99
+
100
+ ## Estimation (rough)
101
+ - Dev: 4–8 hours
102
+ - Review: 1–2 hours
103
+ - Difficulty: 2/5
104
+ `,
105
+ progressTemplate: `# PROGRESS: REST API Endpoint — {{EndpointName}}
106
+
107
+ ## Status: draft
108
+
109
+ ## Criteria
110
+ - [ ] AC-1: Request validation
111
+ - [ ] AC-2: Core business logic
112
+ - [ ] AC-3: Response contract
113
+ - [ ] AC-4: Error handling
114
+ - [ ] AC-5: Idempotency
115
+ - [ ] AC-6: Observability
116
+ `,
117
+ };
118
+ /** UI Form spec template. */
119
+ export const UI_FORM_TEMPLATE = {
120
+ id: 'ui-form',
121
+ name: 'UI Form',
122
+ category: 'ui',
123
+ description: 'Interactive form with validation, error display, and accessibility.',
124
+ tags: ['ui', 'form', 'ux', 'accessibility', 'validation'],
125
+ complexityScore: 'S',
126
+ estimationBase: {
127
+ hoursMin: 4,
128
+ hoursMax: 10,
129
+ notes: 'Form with client-side validation and accessibility',
130
+ },
131
+ criteria: [
132
+ { id: 'AC-1', title: 'Field validation', required: true },
133
+ { id: 'AC-2', title: 'Submit behavior', required: true },
134
+ { id: 'AC-3', title: 'Accessibility', required: true },
135
+ { id: 'AC-4', title: 'Responsive design', required: false },
136
+ { id: 'AC-5', title: 'Reset and cancel', required: false },
137
+ ],
138
+ variables: [
139
+ {
140
+ key: 'FormName',
141
+ label: 'Form name',
142
+ description: 'Name of the form (e.g. Registration, Checkout, Contact)',
143
+ example: 'Registration',
144
+ required: true,
145
+ },
146
+ ],
147
+ huTemplate: `# HU: {{FormName}} Form
148
+
149
+ ## User Story
150
+ As a user, I want to fill out the {{FormName}} form with clear guidance so that I can complete the action without confusion.
151
+
152
+ ## Acceptance Criteria
153
+
154
+ ### AC-1: Field validation
155
+ - [ ] Required fields marked visually
156
+ - [ ] Validation runs on blur and on submit
157
+ - [ ] Error messages appear adjacent to invalid fields
158
+ - [ ] Valid fields show positive feedback
159
+
160
+ ### AC-2: Submit behavior
161
+ - [ ] Form is disabled (loading state) during submission
162
+ - [ ] Success state shown after successful submission
163
+ - [ ] Errors from the API are displayed inline
164
+
165
+ ### AC-3: Accessibility
166
+ - [ ] All inputs have visible labels
167
+ - [ ] Error messages linked via aria-describedby
168
+ - [ ] Form navigable via keyboard (Tab, Enter, Escape)
169
+ - [ ] Screen reader announces validation errors
170
+
171
+ ### AC-4: Responsive design
172
+ - [ ] Form renders correctly on mobile, tablet, and desktop
173
+ - [ ] Touch targets meet minimum size (44x44 px)
174
+
175
+ ### AC-5: Reset and cancel
176
+ - [ ] Reset clears all fields and removes error state
177
+ - [ ] Cancel navigates away without data loss warning if form is pristine
178
+ - [ ] Cancel shows confirmation dialog if form has unsaved changes
179
+ `,
180
+ fichaTecnicaTemplate: `# FICHA TÉCNICA: {{FormName}} Form
181
+
182
+ ## Affected Files
183
+ - components/{{FormName}}Form
184
+ - hooks/use{{FormName}}Form (form state, validation)
185
+ - api/{{FormName}}-client (submission)
186
+ - i18n/{{FormName}}-form.json (strings)
187
+
188
+ ## Types / Entities
189
+ - \`{{FormName}}FormValues\`: all field values
190
+ - \`{{FormName}}FormErrors\`: per-field error messages
191
+ - \`{{FormName}}FormState\`: idle | submitting | success | error
192
+
193
+ ## Risks
194
+ - Missing server-side validation mirror → inconsistent UX
195
+ - Missing loading state → double submissions
196
+ - Missing ARIA attributes → accessibility failures
197
+
198
+ ## Estimation (rough)
199
+ - Dev: 4–10 hours
200
+ - Review: 1–2 hours
201
+ - Difficulty: 2/5
202
+ `,
203
+ progressTemplate: `# PROGRESS: {{FormName}} Form
204
+
205
+ ## Status: draft
206
+
207
+ ## Criteria
208
+ - [ ] AC-1: Field validation
209
+ - [ ] AC-2: Submit behavior
210
+ - [ ] AC-3: Accessibility
211
+ - [ ] AC-4: Responsive design
212
+ - [ ] AC-5: Reset and cancel
213
+ `,
214
+ };
215
+ //# sourceMappingURL=templates-api-ui.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templates-api-ui.js","sourceRoot":"","sources":["../../../src/engine/spec-templates/templates-api-ui.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { SpecTemplateEntry } from '../../types/spec-templates.js';
2
+ /** JWT Authentication spec template. */
3
+ export declare const AUTH_JWT_TEMPLATE: SpecTemplateEntry;
4
+ /** CRUD Entity spec template. */
5
+ export declare const CRUD_ENTITY_TEMPLATE: SpecTemplateEntry;
6
+ //# sourceMappingURL=templates-auth-crud.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templates-auth-crud.d.ts","sourceRoot":"","sources":["../../../src/engine/spec-templates/templates-auth-crud.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAEvE,wCAAwC;AACxC,eAAO,MAAM,iBAAiB,EAAE,iBA4G/B,CAAC;AAEF,iCAAiC;AACjC,eAAO,MAAM,oBAAoB,EAAE,iBA8GlC,CAAC"}