@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,10 @@
1
+ export declare const STOP_WORDS: Set<string>;
2
+ /** Extracts 3-5 meaningful keywords from an AC description text. */
3
+ export declare function extractKeywords(text: string): readonly string[];
4
+ /** Patterns for extracting test block names from source code. */
5
+ export declare const TEST_NAME_PATTERNS: RegExp[];
6
+ /** Extracts the first matching test name from source code. */
7
+ export declare function extractTestName(content: string, nearPattern: RegExp): string;
8
+ /** Extracts all test/describe block names from source code. */
9
+ export declare function extractAllTestNames(content: string): readonly string[];
10
+ //# sourceMappingURL=keyword-extractor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keyword-extractor.d.ts","sourceRoot":"","sources":["../../../src/engine/spec-coverage/keyword-extractor.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,UAAU,aAqErB,CAAC;AAEH,oEAAoE;AACpE,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAkB/D;AAMD,iEAAiE;AACjE,eAAO,MAAM,kBAAkB,UAM9B,CAAC;AAEF,8DAA8D;AAC9D,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAuB5E;AAED,+DAA+D;AAC/D,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAetE"}
@@ -0,0 +1,147 @@
1
+ // engine/spec-coverage/keyword-extractor.ts — Keyword extraction and test name parsing.
2
+ // Extracted from criteria-mapper.ts to keep file sizes within limits.
3
+ // ---------------------------------------------------------------------------
4
+ // Stop words for heuristic keyword extraction
5
+ // ---------------------------------------------------------------------------
6
+ export const STOP_WORDS = new Set([
7
+ 'the',
8
+ 'a',
9
+ 'an',
10
+ 'is',
11
+ 'are',
12
+ 'was',
13
+ 'were',
14
+ 'be',
15
+ 'been',
16
+ 'being',
17
+ 'have',
18
+ 'has',
19
+ 'had',
20
+ 'do',
21
+ 'does',
22
+ 'did',
23
+ 'will',
24
+ 'would',
25
+ 'could',
26
+ 'should',
27
+ 'may',
28
+ 'might',
29
+ 'shall',
30
+ 'must',
31
+ 'can',
32
+ 'to',
33
+ 'of',
34
+ 'in',
35
+ 'on',
36
+ 'at',
37
+ 'by',
38
+ 'for',
39
+ 'with',
40
+ 'from',
41
+ 'as',
42
+ 'and',
43
+ 'or',
44
+ 'but',
45
+ 'not',
46
+ 'no',
47
+ 'if',
48
+ 'when',
49
+ 'where',
50
+ 'that',
51
+ 'which',
52
+ 'this',
53
+ 'it',
54
+ 'its',
55
+ 'el',
56
+ 'la',
57
+ 'los',
58
+ 'las',
59
+ 'un',
60
+ 'una',
61
+ 'de',
62
+ 'del',
63
+ 'en',
64
+ 'que',
65
+ 'se',
66
+ 'por',
67
+ 'para',
68
+ 'con',
69
+ 'al',
70
+ 'lo',
71
+ 'le',
72
+ 'les',
73
+ 'y',
74
+ 'o',
75
+ ]);
76
+ /** Extracts 3-5 meaningful keywords from an AC description text. */
77
+ export function extractKeywords(text) {
78
+ const words = text
79
+ .toLowerCase()
80
+ .replace(/[^a-zA-Z0-9\s_àáéíóúñüÀÁÉÍÓÚÑÜ]/g, ' ')
81
+ .split(/\s+/)
82
+ .filter((w) => w.length >= 3 && !STOP_WORDS.has(w));
83
+ // De-duplicate preserving order
84
+ const seen = new Set();
85
+ const unique = [];
86
+ for (const w of words) {
87
+ if (!seen.has(w)) {
88
+ seen.add(w);
89
+ unique.push(w);
90
+ }
91
+ }
92
+ return unique.slice(0, 5);
93
+ }
94
+ // ---------------------------------------------------------------------------
95
+ // Test name extraction helpers
96
+ // ---------------------------------------------------------------------------
97
+ /** Patterns for extracting test block names from source code. */
98
+ export const TEST_NAME_PATTERNS = [
99
+ /(?:describe|it|test|context|suite|feature|scenario)\s*\(\s*['"`](.*?)['"`]/g,
100
+ /(?:func\s+Test\w+)\s*\(/g, // Go: func TestXxx(
101
+ /(?:def\s+test_\w+)\s*\(/g, // Python: def test_xxx(
102
+ /#\[test\]\s*(?:fn\s+(\w+))/g, // Rust: #[test] fn name
103
+ /(?:func|fun)\s+(test\w+)\s*\(/gi, // Swift/Kotlin
104
+ ];
105
+ /** Extracts the first matching test name from source code. */
106
+ export function extractTestName(content, nearPattern) {
107
+ // Find the line with the pattern match, then look for a nearby test name
108
+ const lines = content.split('\n');
109
+ for (let i = 0; i < lines.length; i++) {
110
+ /* v8 ignore next 1 */
111
+ const line = lines[i] ?? '';
112
+ if (!nearPattern.test(line)) {
113
+ continue;
114
+ }
115
+ // Look in ±5 lines for a test name
116
+ const start = Math.max(0, i - 5);
117
+ const end = Math.min(lines.length - 1, i + 5);
118
+ for (let j = start; j <= end; j++) {
119
+ /* v8 ignore next 1 */
120
+ const nearby = lines[j] ?? '';
121
+ const nameMatch = /(?:describe|it|test|context)\s*\(\s*['"`](.*?)['"`]/.exec(nearby);
122
+ if (nameMatch?.[1]) {
123
+ return nameMatch[1];
124
+ }
125
+ }
126
+ return line.trim().slice(0, 80);
127
+ }
128
+ return '';
129
+ }
130
+ /** Extracts all test/describe block names from source code. */
131
+ export function extractAllTestNames(content) {
132
+ const names = [];
133
+ for (const pattern of TEST_NAME_PATTERNS) {
134
+ pattern.lastIndex = 0;
135
+ let match;
136
+ while ((match = pattern.exec(content)) !== null) {
137
+ /* v8 ignore next 1 */
138
+ const name = match[1] ?? match[0];
139
+ /* v8 ignore next 1 */
140
+ if (name) {
141
+ names.push(name);
142
+ }
143
+ }
144
+ }
145
+ return names;
146
+ }
147
+ //# sourceMappingURL=keyword-extractor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keyword-extractor.js","sourceRoot":"","sources":["../../../src/engine/spec-coverage/keyword-extractor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { TestMatch, CoverageTestFile } from '../../types/index.js';
2
+ /** Strategy 1: look for AC-ID or AC ID (with space or no dash) in test content. */
3
+ export declare function findDirectReferences(acId: string, testFiles: readonly CoverageTestFile[], testContents: ReadonlyMap<string, string>): TestMatch[];
4
+ /** Strategy 2: look for SPEC-ID in file path or content. */
5
+ export declare function findSpecReferences(specId: string, testFiles: readonly CoverageTestFile[], testContents: ReadonlyMap<string, string>): TestMatch[];
6
+ /** Strategy 3: match keywords from criterion text against test names in files. */
7
+ export declare function findKeywordMatches(keywords: readonly string[], testFiles: readonly CoverageTestFile[], testContents: ReadonlyMap<string, string>): TestMatch[];
8
+ export { extractKeywords } from './keyword-extractor.js';
9
+ //# sourceMappingURL=test-matchers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-matchers.d.ts","sourceRoot":"","sources":["../../../src/engine/spec-coverage/test-matchers.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAGxE,mFAAmF;AACnF,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,SAAS,gBAAgB,EAAE,EACtC,YAAY,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,GACxC,SAAS,EAAE,CAkBb;AAED,4DAA4D;AAC5D,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,SAAS,gBAAgB,EAAE,EACtC,YAAY,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,GACxC,SAAS,EAAE,CAgBb;AAED,kFAAkF;AAClF,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,SAAS,MAAM,EAAE,EAC3B,SAAS,EAAE,SAAS,gBAAgB,EAAE,EACtC,YAAY,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,GACxC,SAAS,EAAE,CAqBb;AAGD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC"}
@@ -0,0 +1,59 @@
1
+ // engine/spec-coverage/test-matchers.ts — Test-to-criterion matching strategies.
2
+ // Extracted from criteria-mapper.ts to keep file sizes within limits.
3
+ import { extractTestName, extractAllTestNames } from './keyword-extractor.js';
4
+ /** Strategy 1: look for AC-ID or AC ID (with space or no dash) in test content. */
5
+ export function findDirectReferences(acId, testFiles, testContents) {
6
+ const matches = [];
7
+ // Build regex variants: AC-01, AC01, #AC-01, AC 01
8
+ const acNum = acId.replace('AC-', '');
9
+ const pattern = new RegExp(`\\b(?:AC[-\\s]?${acNum}|#AC-?${acNum})\\b`, 'i');
10
+ for (const tf of testFiles) {
11
+ const content = testContents.get(tf.file) ?? '';
12
+ if (!pattern.test(content)) {
13
+ continue;
14
+ }
15
+ // Extract the test name from the first matching line
16
+ const testName = extractTestName(content, pattern);
17
+ matches.push({ file: tf.file, testName, strategy: 'direct-reference' });
18
+ }
19
+ return matches;
20
+ }
21
+ /** Strategy 2: look for SPEC-ID in file path or content. */
22
+ export function findSpecReferences(specId, testFiles, testContents) {
23
+ const matches = [];
24
+ const specPattern = new RegExp(`\\b${specId.replace('-', '[-_]?')}\\b`, 'i');
25
+ for (const tf of testFiles) {
26
+ const inPath = specPattern.test(tf.file);
27
+ const content = testContents.get(tf.file) ?? '';
28
+ const inContent = specPattern.test(content);
29
+ if (!inPath && !inContent) {
30
+ continue;
31
+ }
32
+ const testName = inContent ? extractTestName(content, specPattern) : tf.file;
33
+ matches.push({ file: tf.file, testName, strategy: 'spec-reference' });
34
+ }
35
+ return matches;
36
+ }
37
+ /** Strategy 3: match keywords from criterion text against test names in files. */
38
+ export function findKeywordMatches(keywords, testFiles, testContents) {
39
+ const matches = [];
40
+ for (const tf of testFiles) {
41
+ const content = testContents.get(tf.file) ?? '';
42
+ // Extract all describe/it/test block names
43
+ const testNames = extractAllTestNames(content);
44
+ const combinedText = [...testNames, tf.file].join(' ').toLowerCase();
45
+ const matchCount = keywords.filter((kw) => combinedText.includes(kw.toLowerCase())).length;
46
+ if (matchCount >= 2) {
47
+ matches.push({
48
+ file: tf.file,
49
+ /* v8 ignore next 1 */
50
+ testName: testNames[0] ?? tf.file,
51
+ strategy: 'heuristic',
52
+ });
53
+ }
54
+ }
55
+ return matches;
56
+ }
57
+ // Re-export extractKeywords for backward compatibility
58
+ export { extractKeywords } from './keyword-extractor.js';
59
+ //# sourceMappingURL=test-matchers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-matchers.js","sourceRoot":"","sources":["../../../src/engine/spec-coverage/test-matchers.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
1
  import type { SpecTemplateEntry } from '../../types/spec-templates.js';
2
- /** Extra built-in spec templates (data, security, performance). */
2
+ /** Extra built-in spec templates (data, security, performance, integration). */
3
3
  export declare const EXTRA_TEMPLATES: SpecTemplateEntry[];
4
4
  //# sourceMappingURL=catalog-extra.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"catalog-extra.d.ts","sourceRoot":"","sources":["../../../src/engine/spec-templates/catalog-extra.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAEvE,mEAAmE;AACnE,eAAO,MAAM,eAAe,EAAE,iBAAiB,EA0W9C,CAAC"}
1
+ {"version":3,"file":"catalog-extra.d.ts","sourceRoot":"","sources":["../../../src/engine/spec-templates/catalog-extra.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAOvE,gFAAgF;AAChF,eAAO,MAAM,eAAe,EAAE,iBAAiB,EAK9C,CAAC"}
@@ -1,367 +1,12 @@
1
1
  // engine/spec-templates/catalog-extra.ts — Additional built-in templates (data, security, performance).
2
- // Split from catalog.ts to keep file size within the 500-line limit.
3
- /** Extra built-in spec templates (data, security, performance). */
2
+ // Templates are defined in dedicated files and re-exported here for backward compatibility.
3
+ import { DATA_MIGRATION_TEMPLATE, SECURITY_FEATURE_TEMPLATE } from './templates-data-security.js';
4
+ import { PERFORMANCE_OPTIMIZATION_TEMPLATE, THIRD_PARTY_INTEGRATION_TEMPLATE, } from './templates-perf-integration.js';
5
+ /** Extra built-in spec templates (data, security, performance, integration). */
4
6
  export const EXTRA_TEMPLATES = [
5
- {
6
- id: 'data-migration',
7
- name: 'Data Migration',
8
- category: 'data',
9
- description: 'Safe, reversible database or data migration with rollback support.',
10
- tags: ['migration', 'database', 'schema', 'data'],
11
- variables: [
12
- {
13
- key: 'MigrationName',
14
- label: 'Migration name',
15
- description: 'Short descriptive name for this migration',
16
- example: 'Add email_verified column to users',
17
- required: true,
18
- },
19
- ],
20
- huTemplate: `# HU: Data Migration — {{MigrationName}}
21
-
22
- ## User Story
23
- As a developer, I want to apply the migration "{{MigrationName}}" safely so that production data is not at risk.
24
-
25
- ## Acceptance Criteria
26
-
27
- ### AC-1: Migration script
28
- - [ ] Migration has an "up" (apply) and "down" (rollback) operation
29
- - [ ] Script is idempotent (safe to run multiple times)
30
- - [ ] Each step is transactional where supported by the database
31
-
32
- ### AC-2: Data safety
33
- - [ ] Pre-migration backup documented in runbook
34
- - [ ] No destructive operation without a confirmed backup
35
- - [ ] Migration tested on a staging copy of production data
36
-
37
- ### AC-3: Zero-downtime strategy
38
- - [ ] Migration can be applied while the application is running
39
- - [ ] Backward-compatible schema changes first (expand), then cleanup (contract)
40
- - [ ] Feature flag used if application code needs to switch behavior
41
-
42
- ### AC-4: Rollback
43
- - [ ] Rollback procedure documented and tested
44
- - [ ] Rollback does not cause data loss
45
- - [ ] Time to rollback < 15 minutes
46
-
47
- ### AC-5: Observability
48
- - [ ] Migration duration logged
49
- - [ ] Row counts before/after logged for verification
50
- - [ ] Anomalies (unexpected row counts) trigger alerts
51
- `,
52
- fichaTecnicaTemplate: `# FICHA TÉCNICA: Data Migration — {{MigrationName}}
53
-
54
- ## Affected Files
55
- - migrations/{{MigrationName}}/up
56
- - migrations/{{MigrationName}}/down
57
- - runbooks/{{MigrationName}}-rollback
58
-
59
- ## Types / Entities
60
- - Migration metadata: id, name, appliedAt, duration, rolledBack
61
-
62
- ## Risks
63
- - Data loss on rollback → mandatory backup before apply
64
- - Long-running migration → table locks in production
65
- - Missing idempotency → partial application leaves DB in bad state
66
-
67
- ## Estimation (rough)
68
- - Dev: 4–12 hours
69
- - Review: 2–4 hours
70
- - Difficulty: 3/5
71
- `,
72
- progressTemplate: `# PROGRESS: Data Migration — {{MigrationName}}
73
-
74
- ## Status: draft
75
-
76
- ## Criteria
77
- - [ ] AC-1: Migration script
78
- - [ ] AC-2: Data safety
79
- - [ ] AC-3: Zero-downtime strategy
80
- - [ ] AC-4: Rollback
81
- - [ ] AC-5: Observability
82
- `,
83
- },
84
- {
85
- id: 'security-feature',
86
- name: 'Security Feature',
87
- category: 'security',
88
- description: 'Security hardening: rate limiting, input sanitization, audit logging, etc.',
89
- tags: ['security', 'hardening', 'audit', 'rate-limiting'],
90
- variables: [
91
- {
92
- key: 'FeatureName',
93
- label: 'Security feature name',
94
- description: 'Name of the security feature being implemented',
95
- example: 'Rate Limiting',
96
- required: true,
97
- },
98
- {
99
- key: 'ProtectedResource',
100
- label: 'Protected resource or area',
101
- description: 'What is being protected by this feature',
102
- example: 'authentication endpoints',
103
- required: true,
104
- },
105
- ],
106
- huTemplate: `# HU: Security Feature — {{FeatureName}}
107
-
108
- ## User Story
109
- As a security engineer, I want {{FeatureName}} applied to {{ProtectedResource}} so that attack vectors are reduced.
110
-
111
- ## Acceptance Criteria
112
-
113
- ### AC-1: Implementation
114
- - [ ] {{FeatureName}} implemented at the correct layer (edge, gateway, application)
115
- - [ ] Configuration externalized (not hardcoded)
116
- - [ ] Enabled in production, configurable in development
117
-
118
- ### AC-2: Bypass prevention
119
- - [ ] Cannot be bypassed by manipulating headers or query parameters
120
- - [ ] Handles IPv4, IPv6, and forwarded IP headers correctly
121
- - [ ] Works behind reverse proxies and CDNs
122
-
123
- ### AC-3: Observability
124
- - [ ] Blocked/throttled requests logged with reason
125
- - [ ] Metrics exported: blocked count, block rate, top blocked IPs
126
- - [ ] Alert triggers when block rate exceeds threshold
127
-
128
- ### AC-4: Testing
129
- - [ ] Unit tests cover allowed and blocked cases
130
- - [ ] Integration tests simulate attack patterns
131
- - [ ] Penetration test checklist updated
132
-
133
- ### AC-5: Documentation
134
- - [ ] Security runbook updated with new feature
135
- - [ ] Limits and thresholds documented with rationale
136
- - [ ] On-call playbook updated for incident response
137
- `,
138
- fichaTecnicaTemplate: `# FICHA TÉCNICA: Security Feature — {{FeatureName}}
139
-
140
- ## Affected Files
141
- - middleware/{{FeatureName}}
142
- - config/security-config
143
- - monitoring/security-alerts
144
- - runbooks/security-incident
145
-
146
- ## Types / Entities
147
- - \`{{FeatureName}}Config\`: thresholds, enabled, dryRun
148
- - \`SecurityEvent\`: type, resource, ip, timestamp, blocked
149
-
150
- ## Risks
151
- - False positives blocking legitimate users → dry-run mode first
152
- - Missing coverage for all entry points → security audit required
153
- - Misconfiguration under proxy → test in staging with proxy enabled
154
-
155
- ## Estimation (rough)
156
- - Dev: 4–12 hours
157
- - Review: 2–4 hours
158
- - Difficulty: 3/5
159
- `,
160
- progressTemplate: `# PROGRESS: Security Feature — {{FeatureName}}
161
-
162
- ## Status: draft
163
-
164
- ## Criteria
165
- - [ ] AC-1: Implementation
166
- - [ ] AC-2: Bypass prevention
167
- - [ ] AC-3: Observability
168
- - [ ] AC-4: Testing
169
- - [ ] AC-5: Documentation
170
- `,
171
- },
172
- {
173
- id: 'performance-optimization',
174
- name: 'Performance Optimization',
175
- category: 'performance',
176
- description: 'Measurable performance improvements with before/after benchmarks.',
177
- tags: ['performance', 'optimization', 'caching', 'benchmarks'],
178
- variables: [
179
- {
180
- key: 'TargetArea',
181
- label: 'Target area',
182
- description: 'The specific area to optimize (e.g. API response time, DB queries)',
183
- example: 'API response time',
184
- required: true,
185
- },
186
- {
187
- key: 'CurrentBaseline',
188
- label: 'Current baseline',
189
- description: 'Current measured performance metric',
190
- example: 'P95 latency: 800ms',
191
- required: false,
192
- defaultValue: 'TBD — measure before starting',
193
- },
194
- {
195
- key: 'TargetGoal',
196
- label: 'Target goal',
197
- description: 'Desired performance metric after optimization',
198
- example: 'P95 latency: < 200ms',
199
- required: false,
200
- defaultValue: 'TBD — define after baseline measurement',
201
- },
202
- ],
203
- huTemplate: `# HU: Performance Optimization — {{TargetArea}}
204
-
205
- ## User Story
206
- As a user, I want {{TargetArea}} to be faster so that the application feels responsive.
207
-
208
- ## Baseline
209
- - Current: {{CurrentBaseline}}
210
- - Target: {{TargetGoal}}
211
-
212
- ## Acceptance Criteria
213
-
214
- ### AC-1: Baseline measurement
215
- - [ ] Benchmark suite established before any changes
216
- - [ ] Metrics captured: P50, P95, P99 latency, throughput, error rate
217
- - [ ] Benchmark results stored for comparison
218
-
219
- ### AC-2: Optimization implementation
220
- - [ ] Root cause of performance issue identified and documented
221
- - [ ] Optimization applied at the correct layer
222
- - [ ] No correctness regression introduced by optimization
223
-
224
- ### AC-3: Cache strategy (if applicable)
225
- - [ ] Cache invalidation strategy defined
226
- - [ ] Cache hit rate monitored
227
- - [ ] Cache warm-up procedure documented
228
-
229
- ### AC-4: Validation
230
- - [ ] Post-optimization benchmark shows improvement vs baseline
231
- - [ ] Target goal reached or documented with explanation if not
232
- - [ ] Load test confirms improvement holds under concurrent traffic
233
-
234
- ### AC-5: Observability
235
- - [ ] Performance metrics added to dashboard
236
- - [ ] Regression alert configured (auto-detect if P95 degrades)
237
- `,
238
- fichaTecnicaTemplate: `# FICHA TÉCNICA: Performance Optimization — {{TargetArea}}
239
-
240
- ## Affected Files
241
- - (determined during root-cause analysis)
242
- - monitoring/dashboards/{{TargetArea}}
243
- - benchmarks/{{TargetArea}}
244
-
245
- ## Types / Entities
246
- - \`BenchmarkResult\`: timestamp, p50, p95, p99, throughput, errorRate
247
- - \`CacheEntry\` (if caching): key, value, ttl, hitCount
248
-
249
- ## Risks
250
- - Optimization that breaks correctness → benchmark must include correctness tests
251
- - Cache inconsistency → strong consistency tests required
252
- - Performance regression after unrelated change → regression alert required
253
-
254
- ## Estimation (rough)
255
- - Dev: 4–20 hours (highly variable by root cause)
256
- - Review: 2–4 hours
257
- - Difficulty: 3–4/5
258
- `,
259
- progressTemplate: `# PROGRESS: Performance Optimization — {{TargetArea}}
260
-
261
- ## Status: draft
262
-
263
- ## Criteria
264
- - [ ] AC-1: Baseline measurement
265
- - [ ] AC-2: Optimization implementation
266
- - [ ] AC-3: Cache strategy
267
- - [ ] AC-4: Validation
268
- - [ ] AC-5: Observability
269
- `,
270
- },
271
- {
272
- id: 'third-party-integration',
273
- name: 'Third-Party Integration',
274
- category: 'integration',
275
- description: 'Integrating with an external service (payment, email, SMS, CRM, etc.).',
276
- tags: ['integration', 'external', 'api', 'webhook'],
277
- variables: [
278
- {
279
- key: 'ServiceName',
280
- label: 'Service name',
281
- description: 'Name of the external service to integrate',
282
- example: 'Stripe',
283
- required: true,
284
- },
285
- {
286
- key: 'IntegrationPurpose',
287
- label: 'Purpose',
288
- description: 'What the integration enables',
289
- example: 'payment processing',
290
- required: true,
291
- },
292
- ],
293
- huTemplate: `# HU: {{ServiceName}} Integration
294
-
295
- ## User Story
296
- As a developer, I want to integrate {{ServiceName}} so that the platform can handle {{IntegrationPurpose}} reliably.
297
-
298
- ## Acceptance Criteria
299
-
300
- ### AC-1: Credentials management
301
- - [ ] API keys and secrets stored in environment variables (never hardcoded)
302
- - [ ] Separate credentials for development, staging, and production
303
- - [ ] Credential rotation documented in runbook
304
-
305
- ### AC-2: Core integration
306
- - [ ] {{ServiceName}} SDK or HTTP client initialized with proper config
307
- - [ ] All calls wrapped in retry logic with exponential backoff
308
- - [ ] Timeouts configured (no infinite waits)
309
-
310
- ### AC-3: Error handling
311
- - [ ] {{ServiceName}} API errors mapped to internal error types
312
- - [ ] Network failures do not crash the application
313
- - [ ] Errors logged with enough context for debugging
314
-
315
- ### AC-4: Webhooks (if applicable)
316
- - [ ] Webhook endpoint validates signature before processing
317
- - [ ] Events processed idempotently (replay-safe)
318
- - [ ] Failed event processing alerts the on-call team
319
-
320
- ### AC-5: Observability
321
- - [ ] All outbound calls logged (method, status, latency)
322
- - [ ] Circuit breaker implemented for high-traffic paths
323
-
324
- ### AC-6: Testing
325
- - [ ] Unit tests mock {{ServiceName}} client
326
- - [ ] Integration tests use sandbox/test environment
327
- - [ ] Webhook tests replay recorded payloads
328
- `,
329
- fichaTecnicaTemplate: `# FICHA TÉCNICA: {{ServiceName}} Integration
330
-
331
- ## Affected Files
332
- - integrations/{{ServiceName}}/client
333
- - integrations/{{ServiceName}}/webhook-handler
334
- - integrations/{{ServiceName}}/error-mapper
335
- - config/{{ServiceName}}-config
336
- - tests/integrations/{{ServiceName}}
337
-
338
- ## Types / Entities
339
- - \`{{ServiceName}}Config\`: apiKey, baseUrl, timeout, retries
340
- - \`{{ServiceName}}Error\`: code, message, retryable
341
- - \`WebhookEvent\`: id, type, payload, receivedAt
342
-
343
- ## Risks
344
- - Vendor API changes without notice → pin SDK version, monitor changelogs
345
- - Rate limits exceeded → implement request queuing
346
- - Credentials leaked → secrets manager mandatory
347
-
348
- ## Estimation (rough)
349
- - Dev: 8–20 hours
350
- - Review: 2–4 hours
351
- - Difficulty: 3/5
352
- `,
353
- progressTemplate: `# PROGRESS: {{ServiceName}} Integration
354
-
355
- ## Status: draft
356
-
357
- ## Criteria
358
- - [ ] AC-1: Credentials management
359
- - [ ] AC-2: Core integration
360
- - [ ] AC-3: Error handling
361
- - [ ] AC-4: Webhooks
362
- - [ ] AC-5: Observability
363
- - [ ] AC-6: Testing
364
- `,
365
- },
7
+ DATA_MIGRATION_TEMPLATE,
8
+ SECURITY_FEATURE_TEMPLATE,
9
+ PERFORMANCE_OPTIMIZATION_TEMPLATE,
10
+ THIRD_PARTY_INTEGRATION_TEMPLATE,
366
11
  ];
367
12
  //# sourceMappingURL=catalog-extra.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"catalog-extra.js","sourceRoot":"","sources":["../../../src/engine/spec-templates/catalog-extra.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"catalog-extra.js","sourceRoot":"","sources":["../../../src/engine/spec-templates/catalog-extra.ts"],"names":[],"mappings":"AAAA,wGAAwG;AACxG,4FAA4F;AAG5F,OAAO,EAAE,uBAAuB,EAAE,yBAAyB,EAAE,MAAM,8BAA8B,CAAC;AAClG,OAAO,EACL,iCAAiC,EACjC,gCAAgC,GACjC,MAAM,iCAAiC,CAAC;AAEzC,gFAAgF;AAChF,MAAM,CAAC,MAAM,eAAe,GAAwB;IAClD,uBAAuB;IACvB,yBAAyB;IACzB,iCAAiC;IACjC,gCAAgC;CACjC,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { SpecTemplateEntry } from '../../types/spec-templates.js';
2
+ /** All industry vertical templates. */
3
+ export declare const INDUSTRY_TEMPLATES: SpecTemplateEntry[];
4
+ //# sourceMappingURL=catalog-industry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog-industry.d.ts","sourceRoot":"","sources":["../../../src/engine/spec-templates/catalog-industry.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAkBvE,uCAAuC;AACvC,eAAO,MAAM,kBAAkB,EAAE,iBAAiB,EAWjD,CAAC"}