@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.
- package/dist/config/model-routing-rules.json +98 -0
- package/dist/engine/ai-cost-estimator/core.d.ts.map +1 -1
- package/dist/engine/ai-cost-estimator/core.js +2 -202
- package/dist/engine/ai-cost-estimator/core.js.map +1 -1
- package/dist/engine/ai-cost-estimator/recommender.d.ts +8 -0
- package/dist/engine/ai-cost-estimator/recommender.d.ts.map +1 -0
- package/dist/engine/ai-cost-estimator/recommender.js +94 -0
- package/dist/engine/ai-cost-estimator/recommender.js.map +1 -0
- package/dist/engine/ai-cost-estimator/spec-loader.d.ts +13 -0
- package/dist/engine/ai-cost-estimator/spec-loader.d.ts.map +1 -0
- package/dist/engine/ai-cost-estimator/spec-loader.js +102 -0
- package/dist/engine/ai-cost-estimator/spec-loader.js.map +1 -0
- package/dist/engine/ci-generator/planu-config.d.ts +7 -0
- package/dist/engine/ci-generator/planu-config.d.ts.map +1 -0
- package/dist/engine/ci-generator/planu-config.js +40 -0
- package/dist/engine/ci-generator/planu-config.js.map +1 -0
- package/dist/engine/ci-generator/planu-steps.d.ts +11 -0
- package/dist/engine/ci-generator/planu-steps.d.ts.map +1 -0
- package/dist/engine/ci-generator/planu-steps.js +292 -0
- package/dist/engine/ci-generator/planu-steps.js.map +1 -0
- package/dist/engine/code-transforms/transform-engine.d.ts +7 -0
- package/dist/engine/code-transforms/transform-engine.d.ts.map +1 -0
- package/dist/engine/code-transforms/transform-engine.js +67 -0
- package/dist/engine/code-transforms/transform-engine.js.map +1 -0
- package/dist/engine/code-transforms/typescript/add-error-handling.d.ts +6 -0
- package/dist/engine/code-transforms/typescript/add-error-handling.d.ts.map +1 -0
- package/dist/engine/code-transforms/typescript/add-error-handling.js +92 -0
- package/dist/engine/code-transforms/typescript/add-error-handling.js.map +1 -0
- package/dist/engine/code-transforms/typescript/add-jsdoc.d.ts +6 -0
- package/dist/engine/code-transforms/typescript/add-jsdoc.d.ts.map +1 -0
- package/dist/engine/code-transforms/typescript/add-jsdoc.js +83 -0
- package/dist/engine/code-transforms/typescript/add-jsdoc.js.map +1 -0
- package/dist/engine/code-transforms/typescript/add-types.d.ts +3 -0
- package/dist/engine/code-transforms/typescript/add-types.d.ts.map +1 -0
- package/dist/engine/code-transforms/typescript/add-types.js +182 -0
- package/dist/engine/code-transforms/typescript/add-types.js.map +1 -0
- package/dist/engine/code-transforms/typescript/ast-utils.d.ts +38 -0
- package/dist/engine/code-transforms/typescript/ast-utils.d.ts.map +1 -0
- package/dist/engine/code-transforms/typescript/ast-utils.js +90 -0
- package/dist/engine/code-transforms/typescript/ast-utils.js.map +1 -0
- package/dist/engine/code-transforms/typescript/extract-interface.d.ts +6 -0
- package/dist/engine/code-transforms/typescript/extract-interface.d.ts.map +1 -0
- package/dist/engine/code-transforms/typescript/extract-interface.js +103 -0
- package/dist/engine/code-transforms/typescript/extract-interface.js.map +1 -0
- package/dist/engine/code-transforms/typescript/modernize-syntax.d.ts +3 -0
- package/dist/engine/code-transforms/typescript/modernize-syntax.d.ts.map +1 -0
- package/dist/engine/code-transforms/typescript/modernize-syntax.js +213 -0
- package/dist/engine/code-transforms/typescript/modernize-syntax.js.map +1 -0
- package/dist/engine/code-transforms/typescript/rename-symbol.d.ts +8 -0
- package/dist/engine/code-transforms/typescript/rename-symbol.d.ts.map +1 -0
- package/dist/engine/code-transforms/typescript/rename-symbol.js +40 -0
- package/dist/engine/code-transforms/typescript/rename-symbol.js.map +1 -0
- package/dist/engine/mermaid/core.d.ts +18 -0
- package/dist/engine/mermaid/core.d.ts.map +1 -0
- package/dist/engine/mermaid/core.js +88 -0
- package/dist/engine/mermaid/core.js.map +1 -0
- package/dist/engine/mermaid/diagram-generators.d.ts +22 -0
- package/dist/engine/mermaid/diagram-generators.d.ts.map +1 -0
- package/dist/engine/mermaid/diagram-generators.js +139 -0
- package/dist/engine/mermaid/diagram-generators.js.map +1 -0
- package/dist/engine/mermaid/helpers.d.ts +8 -0
- package/dist/engine/mermaid/helpers.d.ts.map +1 -0
- package/dist/engine/mermaid/helpers.js +61 -0
- package/dist/engine/mermaid/helpers.js.map +1 -0
- package/dist/engine/mermaid-generator.d.ts +2 -37
- package/dist/engine/mermaid-generator.d.ts.map +1 -1
- package/dist/engine/mermaid-generator.js +4 -276
- package/dist/engine/mermaid-generator.js.map +1 -1
- package/dist/engine/model-router/complexity-analyzer.d.ts +26 -0
- package/dist/engine/model-router/complexity-analyzer.d.ts.map +1 -0
- package/dist/engine/model-router/complexity-analyzer.js +182 -0
- package/dist/engine/model-router/complexity-analyzer.js.map +1 -0
- package/dist/engine/model-router/cost-estimator.d.ts +6 -0
- package/dist/engine/model-router/cost-estimator.d.ts.map +1 -0
- package/dist/engine/model-router/cost-estimator.js +60 -0
- package/dist/engine/model-router/cost-estimator.js.map +1 -0
- package/dist/engine/model-router/historical-learner.d.ts +26 -0
- package/dist/engine/model-router/historical-learner.d.ts.map +1 -0
- package/dist/engine/model-router/historical-learner.js +91 -0
- package/dist/engine/model-router/historical-learner.js.map +1 -0
- package/dist/engine/model-router/rules-engine.d.ts +13 -0
- package/dist/engine/model-router/rules-engine.d.ts.map +1 -0
- package/dist/engine/model-router/rules-engine.js +142 -0
- package/dist/engine/model-router/rules-engine.js.map +1 -0
- package/dist/engine/spec-coverage/criteria-mapper.d.ts +1 -2
- package/dist/engine/spec-coverage/criteria-mapper.d.ts.map +1 -1
- package/dist/engine/spec-coverage/criteria-mapper.js +4 -203
- package/dist/engine/spec-coverage/criteria-mapper.js.map +1 -1
- package/dist/engine/spec-coverage/keyword-extractor.d.ts +10 -0
- package/dist/engine/spec-coverage/keyword-extractor.d.ts.map +1 -0
- package/dist/engine/spec-coverage/keyword-extractor.js +147 -0
- package/dist/engine/spec-coverage/keyword-extractor.js.map +1 -0
- package/dist/engine/spec-coverage/test-matchers.d.ts +9 -0
- package/dist/engine/spec-coverage/test-matchers.d.ts.map +1 -0
- package/dist/engine/spec-coverage/test-matchers.js +59 -0
- package/dist/engine/spec-coverage/test-matchers.js.map +1 -0
- package/dist/engine/spec-templates/catalog-extra.d.ts +1 -1
- package/dist/engine/spec-templates/catalog-extra.d.ts.map +1 -1
- package/dist/engine/spec-templates/catalog-extra.js +8 -363
- package/dist/engine/spec-templates/catalog-extra.js.map +1 -1
- package/dist/engine/spec-templates/catalog-industry.d.ts +4 -0
- package/dist/engine/spec-templates/catalog-industry.d.ts.map +1 -0
- package/dist/engine/spec-templates/catalog-industry.js +19 -0
- package/dist/engine/spec-templates/catalog-industry.js.map +1 -0
- package/dist/engine/spec-templates/catalog.d.ts +1 -1
- package/dist/engine/spec-templates/catalog.d.ts.map +1 -1
- package/dist/engine/spec-templates/catalog.js +12 -381
- package/dist/engine/spec-templates/catalog.js.map +1 -1
- package/dist/engine/spec-templates/custom-loader.d.ts +12 -0
- package/dist/engine/spec-templates/custom-loader.d.ts.map +1 -0
- package/dist/engine/spec-templates/custom-loader.js +99 -0
- package/dist/engine/spec-templates/custom-loader.js.map +1 -0
- package/dist/engine/spec-templates/index.d.ts +4 -2
- package/dist/engine/spec-templates/index.d.ts.map +1 -1
- package/dist/engine/spec-templates/index.js +4 -2
- package/dist/engine/spec-templates/index.js.map +1 -1
- package/dist/engine/spec-templates/query.d.ts +12 -4
- package/dist/engine/spec-templates/query.d.ts.map +1 -1
- package/dist/engine/spec-templates/query.js +29 -7
- package/dist/engine/spec-templates/query.js.map +1 -1
- package/dist/engine/spec-templates/renderer.d.ts +27 -2
- package/dist/engine/spec-templates/renderer.d.ts.map +1 -1
- package/dist/engine/spec-templates/renderer.js +119 -4
- package/dist/engine/spec-templates/renderer.js.map +1 -1
- package/dist/engine/spec-templates/templates-api-ui.d.ts +6 -0
- package/dist/engine/spec-templates/templates-api-ui.d.ts.map +1 -0
- package/dist/engine/spec-templates/templates-api-ui.js +215 -0
- package/dist/engine/spec-templates/templates-api-ui.js.map +1 -0
- package/dist/engine/spec-templates/templates-auth-crud.d.ts +6 -0
- package/dist/engine/spec-templates/templates-auth-crud.d.ts.map +1 -0
- package/dist/engine/spec-templates/templates-auth-crud.js +225 -0
- package/dist/engine/spec-templates/templates-auth-crud.js.map +1 -0
- package/dist/engine/spec-templates/templates-data-security.d.ts +6 -0
- package/dist/engine/spec-templates/templates-data-security.d.ts.map +1 -0
- package/dist/engine/spec-templates/templates-data-security.js +198 -0
- package/dist/engine/spec-templates/templates-data-security.js.map +1 -0
- package/dist/engine/spec-templates/templates-industry-ecom.d.ts +6 -0
- package/dist/engine/spec-templates/templates-industry-ecom.d.ts.map +1 -0
- package/dist/engine/spec-templates/templates-industry-ecom.js +209 -0
- package/dist/engine/spec-templates/templates-industry-ecom.js.map +1 -0
- package/dist/engine/spec-templates/templates-industry-fintech.d.ts +8 -0
- package/dist/engine/spec-templates/templates-industry-fintech.d.ts.map +1 -0
- package/dist/engine/spec-templates/templates-industry-fintech.js +350 -0
- package/dist/engine/spec-templates/templates-industry-fintech.js.map +1 -0
- package/dist/engine/spec-templates/templates-industry-health-ecom.d.ts +3 -0
- package/dist/engine/spec-templates/templates-industry-health-ecom.d.ts.map +1 -0
- package/dist/engine/spec-templates/templates-industry-health-ecom.js +5 -0
- package/dist/engine/spec-templates/templates-industry-health-ecom.js.map +1 -0
- package/dist/engine/spec-templates/templates-industry-health.d.ts +6 -0
- package/dist/engine/spec-templates/templates-industry-health.d.ts.map +1 -0
- package/dist/engine/spec-templates/templates-industry-health.js +208 -0
- package/dist/engine/spec-templates/templates-industry-health.js.map +1 -0
- package/dist/engine/spec-templates/templates-industry-saas.d.ts +8 -0
- package/dist/engine/spec-templates/templates-industry-saas.d.ts.map +1 -0
- package/dist/engine/spec-templates/templates-industry-saas.js +323 -0
- package/dist/engine/spec-templates/templates-industry-saas.js.map +1 -0
- package/dist/engine/spec-templates/templates-perf-integration.d.ts +6 -0
- package/dist/engine/spec-templates/templates-perf-integration.d.ts.map +1 -0
- package/dist/engine/spec-templates/templates-perf-integration.js +226 -0
- package/dist/engine/spec-templates/templates-perf-integration.js.map +1 -0
- package/dist/engine/vector-store/hnsw.d.ts +37 -0
- package/dist/engine/vector-store/hnsw.d.ts.map +1 -0
- package/dist/engine/vector-store/hnsw.js +294 -0
- package/dist/engine/vector-store/hnsw.js.map +1 -0
- package/dist/engine/vector-store/similarity.d.ts +21 -0
- package/dist/engine/vector-store/similarity.d.ts.map +1 -0
- package/dist/engine/vector-store/similarity.js +86 -0
- package/dist/engine/vector-store/similarity.js.map +1 -0
- package/dist/engine/vector-store/tfidf.d.ts +35 -0
- package/dist/engine/vector-store/tfidf.d.ts.map +1 -0
- package/dist/engine/vector-store/tfidf.js +255 -0
- package/dist/engine/vector-store/tfidf.js.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/storage/vector-store/backend-factory.d.ts +9 -0
- package/dist/storage/vector-store/backend-factory.d.ts.map +1 -0
- package/dist/storage/vector-store/backend-factory.js +33 -0
- package/dist/storage/vector-store/backend-factory.js.map +1 -0
- package/dist/storage/vector-store/json-fallback.d.ts +21 -0
- package/dist/storage/vector-store/json-fallback.d.ts.map +1 -0
- package/dist/storage/vector-store/json-fallback.js +85 -0
- package/dist/storage/vector-store/json-fallback.js.map +1 -0
- package/dist/storage/vector-store/migrator.d.ts +10 -0
- package/dist/storage/vector-store/migrator.d.ts.map +1 -0
- package/dist/storage/vector-store/migrator.js +139 -0
- package/dist/storage/vector-store/migrator.js.map +1 -0
- package/dist/storage/vector-store/sqlite-adapter.d.ts +28 -0
- package/dist/storage/vector-store/sqlite-adapter.d.ts.map +1 -0
- package/dist/storage/vector-store/sqlite-adapter.js +142 -0
- package/dist/storage/vector-store/sqlite-adapter.js.map +1 -0
- package/dist/tools/ci-planu-handler.d.ts +8 -0
- package/dist/tools/ci-planu-handler.d.ts.map +1 -0
- package/dist/tools/ci-planu-handler.js +44 -0
- package/dist/tools/ci-planu-handler.js.map +1 -0
- package/dist/tools/create-spec/constitution-validator.d.ts +4 -0
- package/dist/tools/create-spec/constitution-validator.d.ts.map +1 -0
- package/dist/tools/create-spec/constitution-validator.js +37 -0
- package/dist/tools/create-spec/constitution-validator.js.map +1 -0
- package/dist/tools/create-spec/post-creation.d.ts +11 -0
- package/dist/tools/create-spec/post-creation.d.ts.map +1 -0
- package/dist/tools/create-spec/post-creation.js +48 -0
- package/dist/tools/create-spec/post-creation.js.map +1 -0
- package/dist/tools/create-spec/spec-builder.d.ts +14 -0
- package/dist/tools/create-spec/spec-builder.d.ts.map +1 -0
- package/dist/tools/create-spec/spec-builder.js +131 -0
- package/dist/tools/create-spec/spec-builder.js.map +1 -0
- package/dist/tools/create-spec.d.ts.map +1 -1
- package/dist/tools/create-spec.js +42 -172
- package/dist/tools/create-spec.js.map +1 -1
- package/dist/tools/init-project/handler.d.ts.map +1 -1
- package/dist/tools/init-project/handler.js +24 -159
- package/dist/tools/init-project/handler.js.map +1 -1
- package/dist/tools/init-project/result-builder.d.ts +4 -0
- package/dist/tools/init-project/result-builder.d.ts.map +1 -0
- package/dist/tools/init-project/result-builder.js +150 -0
- package/dist/tools/init-project/result-builder.js.map +1 -0
- package/dist/tools/learn.d.ts.map +1 -1
- package/dist/tools/learn.js +67 -14
- package/dist/tools/learn.js.map +1 -1
- package/dist/tools/recommend-model-handler.d.ts +8 -0
- package/dist/tools/recommend-model-handler.d.ts.map +1 -0
- package/dist/tools/recommend-model-handler.js +65 -0
- package/dist/tools/recommend-model-handler.js.map +1 -0
- package/dist/tools/register-ci-tools.d.ts.map +1 -1
- package/dist/tools/register-ci-tools.js +36 -0
- package/dist/tools/register-ci-tools.js.map +1 -1
- package/dist/tools/register-model-tools.d.ts +3 -0
- package/dist/tools/register-model-tools.d.ts.map +1 -0
- package/dist/tools/register-model-tools.js +50 -0
- package/dist/tools/register-model-tools.js.map +1 -0
- package/dist/tools/register-search-tools.d.ts +7 -0
- package/dist/tools/register-search-tools.d.ts.map +1 -0
- package/dist/tools/register-search-tools.js +34 -0
- package/dist/tools/register-search-tools.js.map +1 -0
- package/dist/tools/register-template-tools.d.ts.map +1 -1
- package/dist/tools/register-template-tools.js +21 -8
- package/dist/tools/register-template-tools.js.map +1 -1
- package/dist/tools/register-transform-tools.d.ts +3 -0
- package/dist/tools/register-transform-tools.d.ts.map +1 -0
- package/dist/tools/register-transform-tools.js +29 -0
- package/dist/tools/register-transform-tools.js.map +1 -0
- package/dist/tools/semantic-search-handler.d.ts +7 -0
- package/dist/tools/semantic-search-handler.d.ts.map +1 -0
- package/dist/tools/semantic-search-handler.js +72 -0
- package/dist/tools/semantic-search-handler.js.map +1 -0
- package/dist/tools/spec-templates.d.ts +1 -1
- package/dist/tools/spec-templates.d.ts.map +1 -1
- package/dist/tools/spec-templates.js +20 -6
- package/dist/tools/spec-templates.js.map +1 -1
- package/dist/tools/transform-code-handler.d.ts +7 -0
- package/dist/tools/transform-code-handler.d.ts.map +1 -0
- package/dist/tools/transform-code-handler.js +58 -0
- package/dist/tools/transform-code-handler.js.map +1 -0
- package/dist/types/advanced-framework.d.ts +47 -0
- package/dist/types/advanced-framework.d.ts.map +1 -0
- package/dist/types/advanced-framework.js +3 -0
- package/dist/types/advanced-framework.js.map +1 -0
- package/dist/types/ci.d.ts +51 -0
- package/dist/types/ci.d.ts.map +1 -1
- package/dist/types/code-transforms.d.ts +114 -0
- package/dist/types/code-transforms.d.ts.map +1 -0
- package/dist/types/code-transforms.js +11 -0
- package/dist/types/code-transforms.js.map +1 -0
- package/dist/types/css-framework.d.ts +110 -0
- package/dist/types/css-framework.d.ts.map +1 -0
- package/dist/types/css-framework.js +3 -0
- package/dist/types/css-framework.js.map +1 -0
- package/dist/types/dashboard.d.ts +77 -0
- package/dist/types/dashboard.d.ts.map +1 -0
- package/dist/types/dashboard.js +2 -0
- package/dist/types/dashboard.js.map +1 -0
- package/dist/types/index.d.ts +3 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +3 -0
- package/dist/types/index.js.map +1 -1
- package/dist/types/model-routing.d.ts +127 -0
- package/dist/types/model-routing.d.ts.map +1 -0
- package/dist/types/model-routing.js +3 -0
- package/dist/types/model-routing.js.map +1 -0
- package/dist/types/project/core.d.ts +46 -5
- package/dist/types/project/core.d.ts.map +1 -1
- package/dist/types/spec/core.d.ts +28 -1
- package/dist/types/spec/core.d.ts.map +1 -1
- package/dist/types/spec/inputs.d.ts +1 -6
- package/dist/types/spec/inputs.d.ts.map +1 -1
- package/dist/types/spec-templates.d.ts +51 -1
- package/dist/types/spec-templates.d.ts.map +1 -1
- package/dist/types/ui.d.ts +3 -231
- package/dist/types/ui.d.ts.map +1 -1
- package/dist/types/ui.js +7 -1
- package/dist/types/ui.js.map +1 -1
- package/dist/types/vector-store.d.ts +144 -0
- package/dist/types/vector-store.d.ts.map +1 -0
- package/dist/types/vector-store.js +3 -0
- package/dist/types/vector-store.js.map +1 -0
- package/package.json +1 -1
- 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;
|
|
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
|
|
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
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
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":"AAAA,oFAAoF;AACpF,8EAA8E;AAC9E
|
|
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 {
|
|
3
|
-
export {
|
|
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,
|
|
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 {
|
|
4
|
-
export {
|
|
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,
|
|
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
|
|
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):
|
|
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
|
|
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,
|
|
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"}
|