@planu/cli 0.24.0 → 0.25.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/ai-model-pricing.json +81 -0
- package/dist/config/framework-registry/csharp-aspnet.json +67 -0
- package/dist/config/framework-registry/dart-flutter.json +61 -0
- package/dist/config/framework-registry/go-gin.json +62 -0
- package/dist/config/framework-registry/index.json +164 -0
- package/dist/config/framework-registry/java-springboot.json +67 -0
- package/dist/config/framework-registry/php-laravel.json +67 -0
- package/dist/config/framework-registry/python-django.json +72 -0
- package/dist/config/framework-registry/python-fastapi.json +72 -0
- package/dist/config/framework-registry/ruby-rails.json +67 -0
- package/dist/config/framework-registry/rust-actix.json +61 -0
- package/dist/config/framework-registry/swift-swiftui.json +67 -0
- package/dist/config/framework-registry/typescript-angular.json +67 -0
- package/dist/config/framework-registry/typescript-astro.json +61 -0
- package/dist/config/framework-registry/typescript-express.json +67 -0
- package/dist/config/framework-registry/typescript-nestjs.json +62 -0
- package/dist/config/framework-registry/typescript-nextjs.json +82 -0
- package/dist/config/framework-registry/typescript-nuxt.json +67 -0
- package/dist/config/framework-registry/typescript-react.json +77 -0
- package/dist/config/framework-registry/typescript-remix.json +61 -0
- package/dist/config/framework-registry/typescript-sveltekit.json +67 -0
- package/dist/config/framework-registry/typescript-vue.json +72 -0
- package/dist/config/license-plans.json +23 -3
- package/dist/engine/agile-config-builder.d.ts.map +1 -1
- package/dist/engine/agile-config-builder.js +3 -0
- package/dist/engine/agile-config-builder.js.map +1 -1
- package/dist/engine/ai-cost-estimator/core.d.ts +8 -0
- package/dist/engine/ai-cost-estimator/core.d.ts.map +1 -0
- package/dist/engine/ai-cost-estimator/core.js +257 -0
- package/dist/engine/ai-cost-estimator/core.js.map +1 -0
- package/dist/engine/ai-cost-estimator/index.d.ts +4 -0
- package/dist/engine/ai-cost-estimator/index.d.ts.map +1 -0
- package/dist/engine/ai-cost-estimator/index.js +5 -0
- package/dist/engine/ai-cost-estimator/index.js.map +1 -0
- package/dist/engine/ai-cost-estimator/model-pricing.d.ts +31 -0
- package/dist/engine/ai-cost-estimator/model-pricing.d.ts.map +1 -0
- package/dist/engine/ai-cost-estimator/model-pricing.js +96 -0
- package/dist/engine/ai-cost-estimator/model-pricing.js.map +1 -0
- package/dist/engine/ai-cost-estimator/token-estimator.d.ts +37 -0
- package/dist/engine/ai-cost-estimator/token-estimator.d.ts.map +1 -0
- package/dist/engine/ai-cost-estimator/token-estimator.js +194 -0
- package/dist/engine/ai-cost-estimator/token-estimator.js.map +1 -0
- package/dist/engine/ci-generator/context-builders.d.ts +4 -0
- package/dist/engine/ci-generator/context-builders.d.ts.map +1 -0
- package/dist/engine/ci-generator/context-builders.js +129 -0
- package/dist/engine/ci-generator/context-builders.js.map +1 -0
- package/dist/engine/ci-generator/index.d.ts +7 -0
- package/dist/engine/ci-generator/index.d.ts.map +1 -0
- package/dist/engine/ci-generator/index.js +44 -0
- package/dist/engine/ci-generator/index.js.map +1 -0
- package/dist/engine/ci-generator/stack-detector.d.ts +21 -0
- package/dist/engine/ci-generator/stack-detector.d.ts.map +1 -0
- package/dist/engine/ci-generator/stack-detector.js +203 -0
- package/dist/engine/ci-generator/stack-detector.js.map +1 -0
- package/dist/engine/ci-generator/yaml-builder.d.ts +8 -0
- package/dist/engine/ci-generator/yaml-builder.d.ts.map +1 -0
- package/dist/engine/ci-generator/yaml-builder.js +285 -0
- package/dist/engine/ci-generator/yaml-builder.js.map +1 -0
- package/dist/engine/dashboard/data-loader.d.ts +21 -0
- package/dist/engine/dashboard/data-loader.d.ts.map +1 -0
- package/dist/engine/dashboard/data-loader.js +196 -0
- package/dist/engine/dashboard/data-loader.js.map +1 -0
- package/dist/engine/dashboard/index.d.ts +5 -0
- package/dist/engine/dashboard/index.d.ts.map +1 -0
- package/dist/engine/dashboard/index.js +6 -0
- package/dist/engine/dashboard/index.js.map +1 -0
- package/dist/engine/dashboard/routes.d.ts +4 -0
- package/dist/engine/dashboard/routes.d.ts.map +1 -0
- package/dist/engine/dashboard/routes.js +120 -0
- package/dist/engine/dashboard/routes.js.map +1 -0
- package/dist/engine/dashboard/server.d.ts +14 -0
- package/dist/engine/dashboard/server.d.ts.map +1 -0
- package/dist/engine/dashboard/server.js +88 -0
- package/dist/engine/dashboard/server.js.map +1 -0
- package/dist/engine/dashboard/templates-layout.d.ts +11 -0
- package/dist/engine/dashboard/templates-layout.d.ts.map +1 -0
- package/dist/engine/dashboard/templates-layout.js +305 -0
- package/dist/engine/dashboard/templates-layout.js.map +1 -0
- package/dist/engine/dashboard/templates-project.d.ts +10 -0
- package/dist/engine/dashboard/templates-project.d.ts.map +1 -0
- package/dist/engine/dashboard/templates-project.js +163 -0
- package/dist/engine/dashboard/templates-project.js.map +1 -0
- package/dist/engine/dashboard/templates.d.ts +3 -0
- package/dist/engine/dashboard/templates.d.ts.map +1 -0
- package/dist/engine/dashboard/templates.js +4 -0
- package/dist/engine/dashboard/templates.js.map +1 -0
- package/dist/engine/focus-tracker.d.ts.map +1 -1
- package/dist/engine/focus-tracker.js +1 -0
- package/dist/engine/focus-tracker.js.map +1 -1
- package/dist/engine/hooks/core.d.ts +26 -0
- package/dist/engine/hooks/core.d.ts.map +1 -0
- package/dist/engine/hooks/core.js +164 -0
- package/dist/engine/hooks/core.js.map +1 -0
- package/dist/engine/hooks/git-hook-generator.d.ts +14 -0
- package/dist/engine/hooks/git-hook-generator.d.ts.map +1 -0
- package/dist/engine/hooks/git-hook-generator.js +119 -0
- package/dist/engine/hooks/git-hook-generator.js.map +1 -0
- package/dist/engine/hooks/index.d.ts +5 -0
- package/dist/engine/hooks/index.d.ts.map +1 -0
- package/dist/engine/hooks/index.js +6 -0
- package/dist/engine/hooks/index.js.map +1 -0
- package/dist/engine/hooks/templates.d.ts +14 -0
- package/dist/engine/hooks/templates.d.ts.map +1 -0
- package/dist/engine/hooks/templates.js +138 -0
- package/dist/engine/hooks/templates.js.map +1 -0
- package/dist/engine/hooks/triggers.d.ts +27 -0
- package/dist/engine/hooks/triggers.d.ts.map +1 -0
- package/dist/engine/hooks/triggers.js +104 -0
- package/dist/engine/hooks/triggers.js.map +1 -0
- package/dist/engine/registry/core.d.ts +32 -0
- package/dist/engine/registry/core.d.ts.map +1 -0
- package/dist/engine/registry/core.js +85 -0
- package/dist/engine/registry/core.js.map +1 -0
- package/dist/engine/registry/index.d.ts +6 -0
- package/dist/engine/registry/index.d.ts.map +1 -0
- package/dist/engine/registry/index.js +8 -0
- package/dist/engine/registry/index.js.map +1 -0
- package/dist/engine/registry/loader.d.ts +18 -0
- package/dist/engine/registry/loader.d.ts.map +1 -0
- package/dist/engine/registry/loader.js +81 -0
- package/dist/engine/registry/loader.js.map +1 -0
- package/dist/engine/registry/matcher.d.ts +19 -0
- package/dist/engine/registry/matcher.d.ts.map +1 -0
- package/dist/engine/registry/matcher.js +150 -0
- package/dist/engine/registry/matcher.js.map +1 -0
- package/dist/engine/registry/reporter.d.ts +10 -0
- package/dist/engine/registry/reporter.d.ts.map +1 -0
- package/dist/engine/registry/reporter.js +132 -0
- package/dist/engine/registry/reporter.js.map +1 -0
- package/dist/engine/registry/validator.d.ts +17 -0
- package/dist/engine/registry/validator.d.ts.map +1 -0
- package/dist/engine/registry/validator.js +103 -0
- package/dist/engine/registry/validator.js.map +1 -0
- package/dist/engine/spec-changelog/core.d.ts +16 -0
- package/dist/engine/spec-changelog/core.d.ts.map +1 -0
- package/dist/engine/spec-changelog/core.js +175 -0
- package/dist/engine/spec-changelog/core.js.map +1 -0
- package/dist/engine/spec-changelog/diff.d.ts +18 -0
- package/dist/engine/spec-changelog/diff.d.ts.map +1 -0
- package/dist/engine/spec-changelog/diff.js +116 -0
- package/dist/engine/spec-changelog/diff.js.map +1 -0
- package/dist/engine/spec-changelog/index.d.ts +3 -0
- package/dist/engine/spec-changelog/index.d.ts.map +1 -0
- package/dist/engine/spec-changelog/index.js +4 -0
- package/dist/engine/spec-changelog/index.js.map +1 -0
- package/dist/engine/spec-coverage/core.d.ts +14 -0
- package/dist/engine/spec-coverage/core.d.ts.map +1 -0
- package/dist/engine/spec-coverage/core.js +132 -0
- package/dist/engine/spec-coverage/core.js.map +1 -0
- package/dist/engine/spec-coverage/criteria-mapper.d.ts +18 -0
- package/dist/engine/spec-coverage/criteria-mapper.d.ts.map +1 -0
- package/dist/engine/spec-coverage/criteria-mapper.js +306 -0
- package/dist/engine/spec-coverage/criteria-mapper.js.map +1 -0
- package/dist/engine/spec-coverage/index.d.ts +4 -0
- package/dist/engine/spec-coverage/index.d.ts.map +1 -0
- package/dist/engine/spec-coverage/index.js +5 -0
- package/dist/engine/spec-coverage/index.js.map +1 -0
- package/dist/engine/spec-coverage/test-finder.d.ts +17 -0
- package/dist/engine/spec-coverage/test-finder.d.ts.map +1 -0
- package/dist/engine/spec-coverage/test-finder.js +250 -0
- package/dist/engine/spec-coverage/test-finder.js.map +1 -0
- package/dist/engine/spec-templates/catalog-extra.d.ts +4 -0
- package/dist/engine/spec-templates/catalog-extra.d.ts.map +1 -0
- package/dist/engine/spec-templates/catalog-extra.js +367 -0
- package/dist/engine/spec-templates/catalog-extra.js.map +1 -0
- package/dist/engine/spec-templates/catalog.d.ts +4 -0
- package/dist/engine/spec-templates/catalog.d.ts.map +1 -0
- package/dist/engine/spec-templates/catalog.js +386 -0
- package/dist/engine/spec-templates/catalog.js.map +1 -0
- package/dist/engine/spec-templates/index.d.ts +4 -0
- package/dist/engine/spec-templates/index.d.ts.map +1 -0
- package/dist/engine/spec-templates/index.js +5 -0
- package/dist/engine/spec-templates/index.js.map +1 -0
- package/dist/engine/spec-templates/query.d.ts +14 -0
- package/dist/engine/spec-templates/query.d.ts.map +1 -0
- package/dist/engine/spec-templates/query.js +56 -0
- package/dist/engine/spec-templates/query.js.map +1 -0
- package/dist/engine/spec-templates/renderer.d.ts +19 -0
- package/dist/engine/spec-templates/renderer.d.ts.map +1 -0
- package/dist/engine/spec-templates/renderer.js +45 -0
- package/dist/engine/spec-templates/renderer.js.map +1 -0
- package/dist/engine/usage-tracker/trial.d.ts +4 -4
- package/dist/engine/usage-tracker/trial.d.ts.map +1 -1
- package/dist/engine/usage-tracker/trial.js +4 -4
- package/dist/engine/usage-tracker/trial.js.map +1 -1
- package/dist/engine/webhook/event-handlers.d.ts +25 -0
- package/dist/engine/webhook/event-handlers.d.ts.map +1 -0
- package/dist/engine/webhook/event-handlers.js +89 -0
- package/dist/engine/webhook/event-handlers.js.map +1 -0
- package/dist/engine/webhook/index.d.ts +4 -0
- package/dist/engine/webhook/index.d.ts.map +1 -0
- package/dist/engine/webhook/index.js +5 -0
- package/dist/engine/webhook/index.js.map +1 -0
- package/dist/engine/webhook/server.d.ts +18 -0
- package/dist/engine/webhook/server.d.ts.map +1 -0
- package/dist/engine/webhook/server.js +187 -0
- package/dist/engine/webhook/server.js.map +1 -0
- package/dist/engine/webhook/signature.d.ts +16 -0
- package/dist/engine/webhook/signature.d.ts.map +1 -0
- package/dist/engine/webhook/signature.js +49 -0
- package/dist/engine/webhook/signature.js.map +1 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -1
- package/dist/storage/hooks-store.d.ts +34 -0
- package/dist/storage/hooks-store.d.ts.map +1 -0
- package/dist/storage/hooks-store.js +128 -0
- package/dist/storage/hooks-store.js.map +1 -0
- package/dist/storage/index.d.ts +1 -0
- package/dist/storage/index.d.ts.map +1 -1
- package/dist/storage/index.js +1 -0
- package/dist/storage/index.js.map +1 -1
- package/dist/tools/check-spec-accuracy.d.ts +7 -0
- package/dist/tools/check-spec-accuracy.d.ts.map +1 -0
- package/dist/tools/check-spec-accuracy.js +28 -0
- package/dist/tools/check-spec-accuracy.js.map +1 -0
- package/dist/tools/ci-generator.d.ts +7 -0
- package/dist/tools/ci-generator.d.ts.map +1 -0
- package/dist/tools/ci-generator.js +49 -0
- package/dist/tools/ci-generator.js.map +1 -0
- package/dist/tools/create-spec.d.ts.map +1 -1
- package/dist/tools/create-spec.js +4 -0
- package/dist/tools/create-spec.js.map +1 -1
- package/dist/tools/dashboard.d.ts +6 -0
- package/dist/tools/dashboard.d.ts.map +1 -0
- package/dist/tools/dashboard.js +48 -0
- package/dist/tools/dashboard.js.map +1 -0
- package/dist/tools/detect-drift.d.ts.map +1 -1
- package/dist/tools/detect-drift.js +6 -0
- package/dist/tools/detect-drift.js.map +1 -1
- package/dist/tools/estimate-ai-cost.d.ts +8 -0
- package/dist/tools/estimate-ai-cost.d.ts.map +1 -0
- package/dist/tools/estimate-ai-cost.js +29 -0
- package/dist/tools/estimate-ai-cost.js.map +1 -0
- package/dist/tools/list-specs.d.ts.map +1 -1
- package/dist/tools/list-specs.js +15 -0
- package/dist/tools/list-specs.js.map +1 -1
- package/dist/tools/manage-hooks.d.ts +5 -0
- package/dist/tools/manage-hooks.d.ts.map +1 -0
- package/dist/tools/manage-hooks.js +247 -0
- package/dist/tools/manage-hooks.js.map +1 -0
- package/dist/tools/reconcile-spec.d.ts.map +1 -1
- package/dist/tools/reconcile-spec.js +24 -0
- package/dist/tools/reconcile-spec.js.map +1 -1
- package/dist/tools/register-ai-cost-tools.d.ts +3 -0
- package/dist/tools/register-ai-cost-tools.d.ts.map +1 -0
- package/dist/tools/register-ai-cost-tools.js +25 -0
- package/dist/tools/register-ai-cost-tools.js.map +1 -0
- package/dist/tools/register-changelog-tools.d.ts +3 -0
- package/dist/tools/register-changelog-tools.d.ts.map +1 -0
- package/dist/tools/register-changelog-tools.js +23 -0
- package/dist/tools/register-changelog-tools.js.map +1 -0
- package/dist/tools/register-ci-tools.d.ts +3 -0
- package/dist/tools/register-ci-tools.d.ts.map +1 -0
- package/dist/tools/register-ci-tools.js +50 -0
- package/dist/tools/register-ci-tools.js.map +1 -0
- package/dist/tools/register-coverage-tools.d.ts +7 -0
- package/dist/tools/register-coverage-tools.d.ts.map +1 -0
- package/dist/tools/register-coverage-tools.js +27 -0
- package/dist/tools/register-coverage-tools.js.map +1 -0
- package/dist/tools/register-dashboard-tools.d.ts +3 -0
- package/dist/tools/register-dashboard-tools.d.ts.map +1 -0
- package/dist/tools/register-dashboard-tools.js +29 -0
- package/dist/tools/register-dashboard-tools.js.map +1 -0
- package/dist/tools/register-hooks-tools.d.ts +3 -0
- package/dist/tools/register-hooks-tools.d.ts.map +1 -0
- package/dist/tools/register-hooks-tools.js +107 -0
- package/dist/tools/register-hooks-tools.js.map +1 -0
- package/dist/tools/register-registry-tools.d.ts +3 -0
- package/dist/tools/register-registry-tools.d.ts.map +1 -0
- package/dist/tools/register-registry-tools.js +43 -0
- package/dist/tools/register-registry-tools.js.map +1 -0
- package/dist/tools/register-template-tools.d.ts +8 -0
- package/dist/tools/register-template-tools.d.ts.map +1 -0
- package/dist/tools/register-template-tools.js +71 -0
- package/dist/tools/register-template-tools.js.map +1 -0
- package/dist/tools/register-webhook-tools.d.ts +3 -0
- package/dist/tools/register-webhook-tools.d.ts.map +1 -0
- package/dist/tools/register-webhook-tools.js +49 -0
- package/dist/tools/register-webhook-tools.js.map +1 -0
- package/dist/tools/schemas/index.d.ts +1 -0
- package/dist/tools/schemas/index.d.ts.map +1 -1
- package/dist/tools/schemas/index.js +1 -0
- package/dist/tools/schemas/index.js.map +1 -1
- package/dist/tools/schemas/registry.d.ts +41 -0
- package/dist/tools/schemas/registry.d.ts.map +1 -0
- package/dist/tools/schemas/registry.js +62 -0
- package/dist/tools/schemas/registry.js.map +1 -0
- package/dist/tools/spec-coverage.d.ts +3 -0
- package/dist/tools/spec-coverage.d.ts.map +1 -0
- package/dist/tools/spec-coverage.js +176 -0
- package/dist/tools/spec-coverage.js.map +1 -0
- package/dist/tools/spec-history.d.ts +3 -0
- package/dist/tools/spec-history.d.ts.map +1 -0
- package/dist/tools/spec-history.js +67 -0
- package/dist/tools/spec-history.js.map +1 -0
- package/dist/tools/spec-templates.d.ts +10 -0
- package/dist/tools/spec-templates.d.ts.map +1 -0
- package/dist/tools/spec-templates.js +155 -0
- package/dist/tools/spec-templates.js.map +1 -0
- package/dist/tools/update-registry.d.ts +8 -0
- package/dist/tools/update-registry.d.ts.map +1 -0
- package/dist/tools/update-registry.js +53 -0
- package/dist/tools/update-registry.js.map +1 -0
- package/dist/tools/update-status.d.ts.map +1 -1
- package/dist/tools/update-status.js +24 -0
- package/dist/tools/update-status.js.map +1 -1
- package/dist/tools/webhook.d.ts +6 -0
- package/dist/tools/webhook.d.ts.map +1 -0
- package/dist/tools/webhook.js +150 -0
- package/dist/tools/webhook.js.map +1 -0
- package/dist/types/ai-cost.d.ts +98 -0
- package/dist/types/ai-cost.d.ts.map +1 -0
- package/dist/types/ai-cost.js +4 -0
- package/dist/types/ai-cost.js.map +1 -0
- package/dist/types/analysis.d.ts +64 -0
- package/dist/types/analysis.d.ts.map +1 -1
- package/dist/types/changelog.d.ts +49 -0
- package/dist/types/changelog.d.ts.map +1 -0
- package/dist/types/changelog.js +3 -0
- package/dist/types/changelog.js.map +1 -0
- package/dist/types/ci.d.ts +105 -0
- package/dist/types/ci.d.ts.map +1 -0
- package/dist/types/ci.js +3 -0
- package/dist/types/ci.js.map +1 -0
- package/dist/types/coverage.d.ts +95 -0
- package/dist/types/coverage.d.ts.map +1 -0
- package/dist/types/coverage.js +4 -0
- package/dist/types/coverage.js.map +1 -0
- package/dist/types/hooks.d.ts +139 -0
- package/dist/types/hooks.d.ts.map +1 -0
- package/dist/types/hooks.js +3 -0
- package/dist/types/hooks.js.map +1 -0
- package/dist/types/index.d.ts +8 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +8 -0
- package/dist/types/index.js.map +1 -1
- package/dist/types/registry.d.ts +90 -0
- package/dist/types/registry.d.ts.map +1 -0
- package/dist/types/registry.js +5 -0
- package/dist/types/registry.js.map +1 -0
- package/dist/types/spec-templates.d.ts +87 -0
- package/dist/types/spec-templates.d.ts.map +1 -0
- package/dist/types/spec-templates.js +3 -0
- package/dist/types/spec-templates.js.map +1 -0
- package/dist/types/ui.d.ts +76 -0
- package/dist/types/ui.d.ts.map +1 -1
- package/dist/types/webhook.d.ts +62 -0
- package/dist/types/webhook.d.ts.map +1 -0
- package/dist/types/webhook.js +4 -0
- package/dist/types/webhook.js.map +1 -0
- package/package.json +1 -1
- package/src/config/ai-model-pricing.json +81 -0
- package/src/config/framework-registry/csharp-aspnet.json +67 -0
- package/src/config/framework-registry/dart-flutter.json +61 -0
- package/src/config/framework-registry/go-gin.json +62 -0
- package/src/config/framework-registry/index.json +164 -0
- package/src/config/framework-registry/java-springboot.json +67 -0
- package/src/config/framework-registry/php-laravel.json +67 -0
- package/src/config/framework-registry/python-django.json +72 -0
- package/src/config/framework-registry/python-fastapi.json +72 -0
- package/src/config/framework-registry/ruby-rails.json +67 -0
- package/src/config/framework-registry/rust-actix.json +61 -0
- package/src/config/framework-registry/swift-swiftui.json +67 -0
- package/src/config/framework-registry/typescript-angular.json +67 -0
- package/src/config/framework-registry/typescript-astro.json +61 -0
- package/src/config/framework-registry/typescript-express.json +67 -0
- package/src/config/framework-registry/typescript-nestjs.json +62 -0
- package/src/config/framework-registry/typescript-nextjs.json +82 -0
- package/src/config/framework-registry/typescript-nuxt.json +67 -0
- package/src/config/framework-registry/typescript-react.json +77 -0
- package/src/config/framework-registry/typescript-remix.json +61 -0
- package/src/config/framework-registry/typescript-sveltekit.json +67 -0
- package/src/config/framework-registry/typescript-vue.json +72 -0
- package/src/config/license-plans.json +23 -3
|
@@ -0,0 +1,386 @@
|
|
|
1
|
+
// engine/spec-templates/catalog.ts — Built-in template catalog (language-agnostic).
|
|
2
|
+
// Each template is framework/language agnostic: no TypeScript-specific terms.
|
|
3
|
+
// Templates 6-8 (data, security, performance) live in catalog-extra.ts to keep file size ≤500L.
|
|
4
|
+
import { EXTRA_TEMPLATES } from './catalog-extra.js';
|
|
5
|
+
/** Full catalog of built-in spec templates (core entries — templates 1–5). */
|
|
6
|
+
const CORE_TEMPLATES = [
|
|
7
|
+
{
|
|
8
|
+
id: 'auth-jwt',
|
|
9
|
+
name: 'JWT Authentication',
|
|
10
|
+
category: 'auth',
|
|
11
|
+
description: 'User authentication flow with JWT tokens: login, logout, refresh, and guards.',
|
|
12
|
+
tags: ['auth', 'jwt', 'security', 'session'],
|
|
13
|
+
variables: [
|
|
14
|
+
{
|
|
15
|
+
key: 'EntityName',
|
|
16
|
+
label: 'Entity name',
|
|
17
|
+
description: 'The name of the authenticated entity (User, Admin, Member…)',
|
|
18
|
+
example: 'User',
|
|
19
|
+
required: true,
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
key: 'TokenExpiry',
|
|
23
|
+
label: 'Token expiry',
|
|
24
|
+
description: 'JWT access token expiry duration',
|
|
25
|
+
example: '15 minutes',
|
|
26
|
+
required: false,
|
|
27
|
+
defaultValue: '15 minutes',
|
|
28
|
+
},
|
|
29
|
+
],
|
|
30
|
+
huTemplate: `# HU: JWT Authentication for {{EntityName}}
|
|
31
|
+
|
|
32
|
+
## User Story
|
|
33
|
+
As a {{EntityName}}, I want to securely authenticate with JWT tokens so that my session is stateless and protected.
|
|
34
|
+
|
|
35
|
+
## Acceptance Criteria
|
|
36
|
+
|
|
37
|
+
### AC-1: Login endpoint
|
|
38
|
+
- [ ] POST /auth/login accepts credentials and returns access + refresh tokens
|
|
39
|
+
- [ ] Access token expires after {{TokenExpiry}}
|
|
40
|
+
- [ ] Refresh token stored server-side and rotated on each use
|
|
41
|
+
- [ ] Failed login returns 401 with no sensitive detail
|
|
42
|
+
|
|
43
|
+
### AC-2: Protected route guard
|
|
44
|
+
- [ ] Every protected endpoint validates the Bearer token
|
|
45
|
+
- [ ] Expired or invalid tokens return 401
|
|
46
|
+
- [ ] Tampered tokens are rejected and logged
|
|
47
|
+
|
|
48
|
+
### AC-3: Token refresh
|
|
49
|
+
- [ ] POST /auth/refresh issues new access token given a valid refresh token
|
|
50
|
+
- [ ] Refresh token is single-use (rotation strategy)
|
|
51
|
+
|
|
52
|
+
### AC-4: Logout
|
|
53
|
+
- [ ] POST /auth/logout invalidates the refresh token server-side
|
|
54
|
+
- [ ] Client-side storage is cleared by the caller
|
|
55
|
+
|
|
56
|
+
### AC-5: Security requirements
|
|
57
|
+
- [ ] Passwords stored as salted hash (bcrypt or Argon2 equivalent)
|
|
58
|
+
- [ ] HTTPS enforced in production
|
|
59
|
+
- [ ] Rate limiting on /auth/login (max 5 requests/minute per IP)
|
|
60
|
+
- [ ] Brute-force protection with account lockout after N failures
|
|
61
|
+
|
|
62
|
+
## Out of Scope
|
|
63
|
+
- OAuth2 / SSO providers (create separate spec)
|
|
64
|
+
- Multi-factor authentication (create separate spec)
|
|
65
|
+
`,
|
|
66
|
+
fichaTecnicaTemplate: `# FICHA TÉCNICA: JWT Authentication for {{EntityName}}
|
|
67
|
+
|
|
68
|
+
## Affected Files
|
|
69
|
+
- auth/login handler
|
|
70
|
+
- auth/refresh handler
|
|
71
|
+
- auth/logout handler
|
|
72
|
+
- auth/middleware (token guard)
|
|
73
|
+
- storage/token-store (refresh token persistence)
|
|
74
|
+
- config/auth-config (token secrets, expiry settings)
|
|
75
|
+
|
|
76
|
+
## Types / Entities
|
|
77
|
+
- \`{{EntityName}}\`: id, email, passwordHash, createdAt
|
|
78
|
+
- \`AuthTokenPair\`: accessToken, refreshToken, expiresIn
|
|
79
|
+
- \`RefreshTokenRecord\`: token, entityId, expiresAt, usedAt
|
|
80
|
+
|
|
81
|
+
## Risks
|
|
82
|
+
- Token secret exposure → rotate secrets without downtime (risk: high)
|
|
83
|
+
- Refresh token replay attack → single-use rotation required
|
|
84
|
+
- Brute force on login → rate limiting + lockout required
|
|
85
|
+
|
|
86
|
+
## Estimation (rough)
|
|
87
|
+
- Dev: 8–16 hours
|
|
88
|
+
- Review: 2–4 hours
|
|
89
|
+
- Difficulty: 3/5
|
|
90
|
+
`,
|
|
91
|
+
progressTemplate: `# PROGRESS: JWT Authentication for {{EntityName}}
|
|
92
|
+
|
|
93
|
+
## Status: draft
|
|
94
|
+
|
|
95
|
+
## Criteria
|
|
96
|
+
- [ ] AC-1: Login endpoint
|
|
97
|
+
- [ ] AC-2: Protected route guard
|
|
98
|
+
- [ ] AC-3: Token refresh
|
|
99
|
+
- [ ] AC-4: Logout
|
|
100
|
+
- [ ] AC-5: Security requirements
|
|
101
|
+
`,
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
id: 'crud-entity',
|
|
105
|
+
name: 'CRUD Entity',
|
|
106
|
+
category: 'crud',
|
|
107
|
+
description: 'Full Create/Read/Update/Delete lifecycle for any data entity.',
|
|
108
|
+
tags: ['crud', 'rest', 'api', 'database'],
|
|
109
|
+
variables: [
|
|
110
|
+
{
|
|
111
|
+
key: 'EntityName',
|
|
112
|
+
label: 'Entity name',
|
|
113
|
+
description: 'Name of the entity (singular, PascalCase)',
|
|
114
|
+
example: 'Product',
|
|
115
|
+
required: true,
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
key: 'EntityPlural',
|
|
119
|
+
label: 'Entity plural',
|
|
120
|
+
description: 'Plural form of the entity name',
|
|
121
|
+
example: 'Products',
|
|
122
|
+
required: true,
|
|
123
|
+
},
|
|
124
|
+
],
|
|
125
|
+
huTemplate: `# HU: CRUD for {{EntityName}}
|
|
126
|
+
|
|
127
|
+
## User Story
|
|
128
|
+
As a user, I want to create, view, update and delete {{EntityPlural}} so that I can manage them effectively.
|
|
129
|
+
|
|
130
|
+
## Acceptance Criteria
|
|
131
|
+
|
|
132
|
+
### AC-1: Create {{EntityName}}
|
|
133
|
+
- [ ] POST /{{EntityPlural}} accepts valid payload and persists the entity
|
|
134
|
+
- [ ] Duplicate detection where applicable
|
|
135
|
+
- [ ] Returns the created entity with generated ID and timestamps
|
|
136
|
+
|
|
137
|
+
### AC-2: List {{EntityPlural}}
|
|
138
|
+
- [ ] GET /{{EntityPlural}} returns paginated list
|
|
139
|
+
- [ ] Supports filtering and sorting by key fields
|
|
140
|
+
- [ ] Empty list returns 200 with empty array (not 404)
|
|
141
|
+
|
|
142
|
+
### AC-3: Get single {{EntityName}}
|
|
143
|
+
- [ ] GET /{{EntityPlural}}/:id returns the entity or 404
|
|
144
|
+
- [ ] Soft-deleted entities return 404
|
|
145
|
+
|
|
146
|
+
### AC-4: Update {{EntityName}}
|
|
147
|
+
- [ ] PATCH /{{EntityPlural}}/:id applies partial update
|
|
148
|
+
- [ ] PUT /{{EntityPlural}}/:id replaces the full entity
|
|
149
|
+
- [ ] Returns updated entity on success
|
|
150
|
+
|
|
151
|
+
### AC-5: Delete {{EntityName}}
|
|
152
|
+
- [ ] DELETE /{{EntityPlural}}/:id performs soft delete by default
|
|
153
|
+
- [ ] Hard delete available as a privileged action
|
|
154
|
+
- [ ] Returns 204 No Content on success
|
|
155
|
+
|
|
156
|
+
### AC-6: Validation
|
|
157
|
+
- [ ] All inputs validated at the API boundary
|
|
158
|
+
- [ ] Invalid fields return 422 with per-field error messages
|
|
159
|
+
`,
|
|
160
|
+
fichaTecnicaTemplate: `# FICHA TÉCNICA: CRUD for {{EntityName}}
|
|
161
|
+
|
|
162
|
+
## Affected Files
|
|
163
|
+
- handlers/{{EntityPlural}}/create
|
|
164
|
+
- handlers/{{EntityPlural}}/list
|
|
165
|
+
- handlers/{{EntityPlural}}/get
|
|
166
|
+
- handlers/{{EntityPlural}}/update
|
|
167
|
+
- handlers/{{EntityPlural}}/delete
|
|
168
|
+
- storage/{{EntityPlural}}-repository
|
|
169
|
+
- types/{{EntityName}}
|
|
170
|
+
|
|
171
|
+
## Types / Entities
|
|
172
|
+
- \`{{EntityName}}\`: id, createdAt, updatedAt, deletedAt (nullable)
|
|
173
|
+
- \`Create{{EntityName}}Input\`: entity fields (validated)
|
|
174
|
+
- \`Update{{EntityName}}Input\`: partial entity fields
|
|
175
|
+
- \`List{{EntityPlural}}Query\`: page, limit, sortBy, order, filters
|
|
176
|
+
|
|
177
|
+
## Risks
|
|
178
|
+
- Missing soft-delete → data loss risk
|
|
179
|
+
- Unbounded list without pagination → performance risk
|
|
180
|
+
- Missing input validation → injection risk
|
|
181
|
+
|
|
182
|
+
## Estimation (rough)
|
|
183
|
+
- Dev: 6–12 hours
|
|
184
|
+
- Review: 1–3 hours
|
|
185
|
+
- Difficulty: 2/5
|
|
186
|
+
`,
|
|
187
|
+
progressTemplate: `# PROGRESS: CRUD for {{EntityName}}
|
|
188
|
+
|
|
189
|
+
## Status: draft
|
|
190
|
+
|
|
191
|
+
## Criteria
|
|
192
|
+
- [ ] AC-1: Create {{EntityName}}
|
|
193
|
+
- [ ] AC-2: List {{EntityPlural}}
|
|
194
|
+
- [ ] AC-3: Get single {{EntityName}}
|
|
195
|
+
- [ ] AC-4: Update {{EntityName}}
|
|
196
|
+
- [ ] AC-5: Delete {{EntityName}}
|
|
197
|
+
- [ ] AC-6: Validation
|
|
198
|
+
`,
|
|
199
|
+
},
|
|
200
|
+
{
|
|
201
|
+
id: 'rest-api-endpoint',
|
|
202
|
+
name: 'REST API Endpoint',
|
|
203
|
+
category: 'api',
|
|
204
|
+
description: 'A single REST endpoint with validation, error handling, and documentation.',
|
|
205
|
+
tags: ['api', 'rest', 'endpoint', 'openapi'],
|
|
206
|
+
variables: [
|
|
207
|
+
{
|
|
208
|
+
key: 'EndpointName',
|
|
209
|
+
label: 'Endpoint name',
|
|
210
|
+
description: 'Short descriptive name for this endpoint',
|
|
211
|
+
example: 'Submit Order',
|
|
212
|
+
required: true,
|
|
213
|
+
},
|
|
214
|
+
{
|
|
215
|
+
key: 'HttpMethod',
|
|
216
|
+
label: 'HTTP Method',
|
|
217
|
+
description: 'HTTP method: GET, POST, PUT, PATCH, DELETE',
|
|
218
|
+
example: 'POST',
|
|
219
|
+
required: true,
|
|
220
|
+
},
|
|
221
|
+
{
|
|
222
|
+
key: 'Path',
|
|
223
|
+
label: 'URL path',
|
|
224
|
+
description: 'The URL path for this endpoint',
|
|
225
|
+
example: '/orders/submit',
|
|
226
|
+
required: true,
|
|
227
|
+
},
|
|
228
|
+
],
|
|
229
|
+
huTemplate: `# HU: REST API Endpoint — {{EndpointName}}
|
|
230
|
+
|
|
231
|
+
## User Story
|
|
232
|
+
As an API consumer, I want a reliable {{HttpMethod}} {{Path}} endpoint so that I can {{EndpointName}} without client-side workarounds.
|
|
233
|
+
|
|
234
|
+
## Acceptance Criteria
|
|
235
|
+
|
|
236
|
+
### AC-1: Request validation
|
|
237
|
+
- [ ] Input schema validated at the boundary
|
|
238
|
+
- [ ] Invalid requests return 422 with structured error messages
|
|
239
|
+
- [ ] Content-Type header checked when applicable
|
|
240
|
+
|
|
241
|
+
### AC-2: Core business logic
|
|
242
|
+
- [ ] {{EndpointName}} logic is encapsulated in a dedicated use-case function
|
|
243
|
+
- [ ] Side effects (emails, notifications, jobs) are isolated and testable
|
|
244
|
+
|
|
245
|
+
### AC-3: Response contract
|
|
246
|
+
- [ ] Success response follows the API response envelope convention
|
|
247
|
+
- [ ] HTTP status codes match the operation semantics
|
|
248
|
+
- [ ] Response schema is documented (OpenAPI or equivalent)
|
|
249
|
+
|
|
250
|
+
### AC-4: Error handling
|
|
251
|
+
- [ ] All error paths return structured JSON (not stack traces)
|
|
252
|
+
- [ ] 404 returned for missing resources
|
|
253
|
+
- [ ] 409 returned for conflicts
|
|
254
|
+
- [ ] 500 never leaks internal details
|
|
255
|
+
|
|
256
|
+
### AC-5: Idempotency (if applicable)
|
|
257
|
+
- [ ] Idempotency key header supported for non-idempotent operations
|
|
258
|
+
- [ ] Duplicate requests handled gracefully
|
|
259
|
+
|
|
260
|
+
### AC-6: Observability
|
|
261
|
+
- [ ] Endpoint logged with method, path, status, latency
|
|
262
|
+
- [ ] Errors reported to the monitoring system
|
|
263
|
+
`,
|
|
264
|
+
fichaTecnicaTemplate: `# FICHA TÉCNICA: REST API Endpoint — {{EndpointName}}
|
|
265
|
+
|
|
266
|
+
## Affected Files
|
|
267
|
+
- handlers/{{Path}} (route handler)
|
|
268
|
+
- use-cases/{{EndpointName}} (business logic)
|
|
269
|
+
- validators/{{EndpointName}}-input
|
|
270
|
+
- openapi/paths/{{Path}} (documentation)
|
|
271
|
+
|
|
272
|
+
## Types / Entities
|
|
273
|
+
- \`{{EndpointName}}Input\`: validated request payload
|
|
274
|
+
- \`{{EndpointName}}Output\`: response body shape
|
|
275
|
+
- \`ApiError\`: code, message, details[]
|
|
276
|
+
|
|
277
|
+
## Risks
|
|
278
|
+
- Missing idempotency for mutation → duplicate side effects
|
|
279
|
+
- Unbounded response size → add pagination or field projection
|
|
280
|
+
- Missing auth guard → unauthorized access
|
|
281
|
+
|
|
282
|
+
## Estimation (rough)
|
|
283
|
+
- Dev: 4–8 hours
|
|
284
|
+
- Review: 1–2 hours
|
|
285
|
+
- Difficulty: 2/5
|
|
286
|
+
`,
|
|
287
|
+
progressTemplate: `# PROGRESS: REST API Endpoint — {{EndpointName}}
|
|
288
|
+
|
|
289
|
+
## Status: draft
|
|
290
|
+
|
|
291
|
+
## Criteria
|
|
292
|
+
- [ ] AC-1: Request validation
|
|
293
|
+
- [ ] AC-2: Core business logic
|
|
294
|
+
- [ ] AC-3: Response contract
|
|
295
|
+
- [ ] AC-4: Error handling
|
|
296
|
+
- [ ] AC-5: Idempotency
|
|
297
|
+
- [ ] AC-6: Observability
|
|
298
|
+
`,
|
|
299
|
+
},
|
|
300
|
+
{
|
|
301
|
+
id: 'ui-form',
|
|
302
|
+
name: 'UI Form',
|
|
303
|
+
category: 'ui',
|
|
304
|
+
description: 'Interactive form with validation, error display, and accessibility.',
|
|
305
|
+
tags: ['ui', 'form', 'ux', 'accessibility', 'validation'],
|
|
306
|
+
variables: [
|
|
307
|
+
{
|
|
308
|
+
key: 'FormName',
|
|
309
|
+
label: 'Form name',
|
|
310
|
+
description: 'Name of the form (e.g. Registration, Checkout, Contact)',
|
|
311
|
+
example: 'Registration',
|
|
312
|
+
required: true,
|
|
313
|
+
},
|
|
314
|
+
],
|
|
315
|
+
huTemplate: `# HU: {{FormName}} Form
|
|
316
|
+
|
|
317
|
+
## User Story
|
|
318
|
+
As a user, I want to fill out the {{FormName}} form with clear guidance so that I can complete the action without confusion.
|
|
319
|
+
|
|
320
|
+
## Acceptance Criteria
|
|
321
|
+
|
|
322
|
+
### AC-1: Field validation
|
|
323
|
+
- [ ] Required fields marked visually
|
|
324
|
+
- [ ] Validation runs on blur and on submit
|
|
325
|
+
- [ ] Error messages appear adjacent to invalid fields
|
|
326
|
+
- [ ] Valid fields show positive feedback
|
|
327
|
+
|
|
328
|
+
### AC-2: Submit behavior
|
|
329
|
+
- [ ] Form is disabled (loading state) during submission
|
|
330
|
+
- [ ] Success state shown after successful submission
|
|
331
|
+
- [ ] Errors from the API are displayed inline
|
|
332
|
+
|
|
333
|
+
### AC-3: Accessibility
|
|
334
|
+
- [ ] All inputs have visible labels
|
|
335
|
+
- [ ] Error messages linked via aria-describedby
|
|
336
|
+
- [ ] Form navigable via keyboard (Tab, Enter, Escape)
|
|
337
|
+
- [ ] Screen reader announces validation errors
|
|
338
|
+
|
|
339
|
+
### AC-4: Responsive design
|
|
340
|
+
- [ ] Form renders correctly on mobile, tablet, and desktop
|
|
341
|
+
- [ ] Touch targets meet minimum size (44×44 px)
|
|
342
|
+
|
|
343
|
+
### AC-5: Reset and cancel
|
|
344
|
+
- [ ] Reset clears all fields and removes error state
|
|
345
|
+
- [ ] Cancel navigates away without data loss warning if form is pristine
|
|
346
|
+
- [ ] Cancel shows confirmation dialog if form has unsaved changes
|
|
347
|
+
`,
|
|
348
|
+
fichaTecnicaTemplate: `# FICHA TÉCNICA: {{FormName}} Form
|
|
349
|
+
|
|
350
|
+
## Affected Files
|
|
351
|
+
- components/{{FormName}}Form
|
|
352
|
+
- hooks/use{{FormName}}Form (form state, validation)
|
|
353
|
+
- api/{{FormName}}-client (submission)
|
|
354
|
+
- i18n/{{FormName}}-form.json (strings)
|
|
355
|
+
|
|
356
|
+
## Types / Entities
|
|
357
|
+
- \`{{FormName}}FormValues\`: all field values
|
|
358
|
+
- \`{{FormName}}FormErrors\`: per-field error messages
|
|
359
|
+
- \`{{FormName}}FormState\`: idle | submitting | success | error
|
|
360
|
+
|
|
361
|
+
## Risks
|
|
362
|
+
- Missing server-side validation mirror → inconsistent UX
|
|
363
|
+
- Missing loading state → double submissions
|
|
364
|
+
- Missing ARIA attributes → accessibility failures
|
|
365
|
+
|
|
366
|
+
## Estimation (rough)
|
|
367
|
+
- Dev: 4–10 hours
|
|
368
|
+
- Review: 1–2 hours
|
|
369
|
+
- Difficulty: 2/5
|
|
370
|
+
`,
|
|
371
|
+
progressTemplate: `# PROGRESS: {{FormName}} Form
|
|
372
|
+
|
|
373
|
+
## Status: draft
|
|
374
|
+
|
|
375
|
+
## Criteria
|
|
376
|
+
- [ ] AC-1: Field validation
|
|
377
|
+
- [ ] AC-2: Submit behavior
|
|
378
|
+
- [ ] AC-3: Accessibility
|
|
379
|
+
- [ ] AC-4: Responsive design
|
|
380
|
+
- [ ] AC-5: Reset and cancel
|
|
381
|
+
`,
|
|
382
|
+
},
|
|
383
|
+
];
|
|
384
|
+
/** Full catalog of built-in spec templates (core + extra). */
|
|
385
|
+
export const BUILT_IN_TEMPLATES = [...CORE_TEMPLATES, ...EXTRA_TEMPLATES];
|
|
386
|
+
//# sourceMappingURL=catalog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../../src/engine/spec-templates/catalog.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/engine/spec-templates/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AACjF,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
// engine/spec-templates/index.ts — Public API barrel for spec-templates engine.
|
|
2
|
+
export { BUILT_IN_TEMPLATES } from './catalog.js';
|
|
3
|
+
export { listTemplates, findTemplate, getAvailableCategories } from './query.js';
|
|
4
|
+
export { renderTemplate, interpolate, findMissingRequired } from './renderer.js';
|
|
5
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/engine/spec-templates/index.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAEhF,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AACjF,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { SpecTemplateEntry, TemplateCategory, ListTemplatesResult } from '../../types/spec-templates.js';
|
|
2
|
+
/**
|
|
3
|
+
* Lists templates from the catalog, optionally filtered by category and/or search term.
|
|
4
|
+
*/
|
|
5
|
+
export declare function listTemplates(category?: TemplateCategory, search?: string): ListTemplatesResult;
|
|
6
|
+
/**
|
|
7
|
+
* Returns a single template by ID, or undefined if not found.
|
|
8
|
+
*/
|
|
9
|
+
export declare function findTemplate(templateId: string): SpecTemplateEntry | undefined;
|
|
10
|
+
/**
|
|
11
|
+
* Returns all available categories that have at least one template.
|
|
12
|
+
*/
|
|
13
|
+
export declare function getAvailableCategories(): TemplateCategory[];
|
|
14
|
+
//# sourceMappingURL=query.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../../src/engine/spec-templates/query.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,iBAAiB,EACjB,gBAAgB,EAChB,mBAAmB,EAEpB,MAAM,+BAA+B,CAAC;AAkBvC;;GAEG;AACH,wBAAgB,aAAa,CAAC,QAAQ,CAAC,EAAE,gBAAgB,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,mBAAmB,CA6B/F;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,iBAAiB,GAAG,SAAS,CAE9E;AAED;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,gBAAgB,EAAE,CAG3D"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
// engine/spec-templates/query.ts — Catalog querying: list and find templates.
|
|
2
|
+
import { BUILT_IN_TEMPLATES } from './catalog.js';
|
|
3
|
+
/**
|
|
4
|
+
* Converts a full SpecTemplateEntry to a summary TemplateListItem.
|
|
5
|
+
*/
|
|
6
|
+
function toListItem(template) {
|
|
7
|
+
return {
|
|
8
|
+
id: template.id,
|
|
9
|
+
name: template.name,
|
|
10
|
+
category: template.category,
|
|
11
|
+
description: template.description,
|
|
12
|
+
tags: template.tags,
|
|
13
|
+
variableCount: template.variables.length,
|
|
14
|
+
requiredVariableCount: template.variables.filter((v) => v.required).length,
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Lists templates from the catalog, optionally filtered by category and/or search term.
|
|
19
|
+
*/
|
|
20
|
+
export function listTemplates(category, search) {
|
|
21
|
+
let templates = [...BUILT_IN_TEMPLATES];
|
|
22
|
+
if (category !== undefined) {
|
|
23
|
+
templates = templates.filter((t) => t.category === category);
|
|
24
|
+
}
|
|
25
|
+
if (search !== undefined && search.trim().length > 0) {
|
|
26
|
+
const term = search.trim().toLowerCase();
|
|
27
|
+
templates = templates.filter((t) => t.name.toLowerCase().includes(term) ||
|
|
28
|
+
t.description.toLowerCase().includes(term) ||
|
|
29
|
+
t.tags.some((tag) => tag.toLowerCase().includes(term)));
|
|
30
|
+
}
|
|
31
|
+
const filterLabel = [
|
|
32
|
+
category !== undefined ? `category=${category}` : '',
|
|
33
|
+
search !== undefined && search.trim().length > 0 ? `search="${search.trim()}"` : '',
|
|
34
|
+
]
|
|
35
|
+
.filter(Boolean)
|
|
36
|
+
.join(', ');
|
|
37
|
+
return {
|
|
38
|
+
templates: templates.map(toListItem),
|
|
39
|
+
total: templates.length,
|
|
40
|
+
filteredBy: filterLabel.length > 0 ? filterLabel : undefined,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Returns a single template by ID, or undefined if not found.
|
|
45
|
+
*/
|
|
46
|
+
export function findTemplate(templateId) {
|
|
47
|
+
return BUILT_IN_TEMPLATES.find((t) => t.id === templateId);
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Returns all available categories that have at least one template.
|
|
51
|
+
*/
|
|
52
|
+
export function getAvailableCategories() {
|
|
53
|
+
const categories = new Set(BUILT_IN_TEMPLATES.map((t) => t.category));
|
|
54
|
+
return [...categories];
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=query.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query.js","sourceRoot":"","sources":["../../../src/engine/spec-templates/query.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAQ9E,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAElD;;GAEG;AACH,SAAS,UAAU,CAAC,QAA2B;IAC7C,OAAO;QACL,EAAE,EAAE,QAAQ,CAAC,EAAE;QACf,IAAI,EAAE,QAAQ,CAAC,IAAI;QACnB,QAAQ,EAAE,QAAQ,CAAC,QAAQ;QAC3B,WAAW,EAAE,QAAQ,CAAC,WAAW;QACjC,IAAI,EAAE,QAAQ,CAAC,IAAI;QACnB,aAAa,EAAE,QAAQ,CAAC,SAAS,CAAC,MAAM;QACxC,qBAAqB,EAAE,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,MAAM;KAC3E,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,QAA2B,EAAE,MAAe;IACxE,IAAI,SAAS,GAAG,CAAC,GAAG,kBAAkB,CAAC,CAAC;IAExC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;IAC/D,CAAC;IAED,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACzC,SAAS,GAAG,SAAS,CAAC,MAAM,CAC1B,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC;YACnC,CAAC,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC;YAC1C,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CACzD,CAAC;IACJ,CAAC;IAED,MAAM,WAAW,GAAG;QAClB,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,YAAY,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE;QACpD,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE;KACpF;SACE,MAAM,CAAC,OAAO,CAAC;SACf,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,OAAO;QACL,SAAS,EAAE,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC;QACpC,KAAK,EAAE,SAAS,CAAC,MAAM;QACvB,UAAU,EAAE,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS;KAC7D,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,UAAkB;IAC7C,OAAO,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,UAAU,CAAC,CAAC;AAC7D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB;IACpC,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;IACtE,OAAO,CAAC,GAAG,UAAU,CAAC,CAAC;AACzB,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { SpecTemplateEntry, TemplateVariableValue, TemplateVariable } from '../../types/spec-templates.js';
|
|
2
|
+
/**
|
|
3
|
+
* Interpolates all {{Key}} placeholders in a template string with provided values.
|
|
4
|
+
* Falls back to defaultValue if a variable is optional and not provided.
|
|
5
|
+
*/
|
|
6
|
+
export declare function interpolate(template: string, variables: TemplateVariableValue[], definitions: TemplateVariable[]): string;
|
|
7
|
+
/**
|
|
8
|
+
* Returns the keys of required variables that are missing from the provided values.
|
|
9
|
+
*/
|
|
10
|
+
export declare function findMissingRequired(template: SpecTemplateEntry, variables: TemplateVariableValue[]): string[];
|
|
11
|
+
/**
|
|
12
|
+
* Renders all three template files (HU, FICHA-TECNICA, PROGRESS) with the provided values.
|
|
13
|
+
*/
|
|
14
|
+
export declare function renderTemplate(template: SpecTemplateEntry, variables: TemplateVariableValue[]): {
|
|
15
|
+
hu: string;
|
|
16
|
+
fichaTecnica: string;
|
|
17
|
+
progress: string;
|
|
18
|
+
};
|
|
19
|
+
//# sourceMappingURL=renderer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../../../src/engine/spec-templates/renderer.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,iBAAiB,EACjB,qBAAqB,EACrB,gBAAgB,EACjB,MAAM,+BAA+B,CAAC;AAEvC;;;GAGG;AACH,wBAAgB,WAAW,CACzB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,qBAAqB,EAAE,EAClC,WAAW,EAAE,gBAAgB,EAAE,GAC9B,MAAM,CAiBR;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,iBAAiB,EAC3B,SAAS,EAAE,qBAAqB,EAAE,GACjC,MAAM,EAAE,CAWV;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,iBAAiB,EAC3B,SAAS,EAAE,qBAAqB,EAAE,GACjC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAOxD"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
// engine/spec-templates/renderer.ts — Template variable substitution engine.
|
|
2
|
+
// Replaces {{VariableKey}} placeholders with user-provided values.
|
|
3
|
+
/**
|
|
4
|
+
* Interpolates all {{Key}} placeholders in a template string with provided values.
|
|
5
|
+
* Falls back to defaultValue if a variable is optional and not provided.
|
|
6
|
+
*/
|
|
7
|
+
export function interpolate(template, variables, definitions) {
|
|
8
|
+
const valueMap = new Map(variables.map((v) => [v.key, v.value]));
|
|
9
|
+
return template.replace(/\{\{(\w+)\}\}/g, (match, key) => {
|
|
10
|
+
const provided = valueMap.get(key);
|
|
11
|
+
if (provided !== undefined && provided.length > 0) {
|
|
12
|
+
return provided;
|
|
13
|
+
}
|
|
14
|
+
const definition = definitions.find((d) => d.key === key);
|
|
15
|
+
if (definition?.defaultValue !== undefined) {
|
|
16
|
+
return definition.defaultValue;
|
|
17
|
+
}
|
|
18
|
+
// Leave the placeholder intact if no value was provided (will be flagged as missing)
|
|
19
|
+
return match;
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Returns the keys of required variables that are missing from the provided values.
|
|
24
|
+
*/
|
|
25
|
+
export function findMissingRequired(template, variables) {
|
|
26
|
+
const providedKeys = new Set(variables
|
|
27
|
+
.map((v) => v.key)
|
|
28
|
+
.filter((k) => {
|
|
29
|
+
const match = variables.find((v) => v.key === k);
|
|
30
|
+
return match !== undefined && match.value.length > 0;
|
|
31
|
+
}));
|
|
32
|
+
return template.variables.filter((v) => v.required && !providedKeys.has(v.key)).map((v) => v.key);
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Renders all three template files (HU, FICHA-TECNICA, PROGRESS) with the provided values.
|
|
36
|
+
*/
|
|
37
|
+
export function renderTemplate(template, variables) {
|
|
38
|
+
const defs = template.variables;
|
|
39
|
+
return {
|
|
40
|
+
hu: interpolate(template.huTemplate, variables, defs),
|
|
41
|
+
fichaTecnica: interpolate(template.fichaTecnicaTemplate, variables, defs),
|
|
42
|
+
progress: interpolate(template.progressTemplate, variables, defs),
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=renderer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"renderer.js","sourceRoot":"","sources":["../../../src/engine/spec-templates/renderer.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,mEAAmE;AAQnE;;;GAGG;AACH,MAAM,UAAU,WAAW,CACzB,QAAgB,EAChB,SAAkC,EAClC,WAA+B;IAE/B,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAiB,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAEjF,OAAO,QAAQ,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC,KAAK,EAAE,GAAW,EAAE,EAAE;QAC/D,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACnC,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAClD,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,MAAM,UAAU,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;QAC1D,IAAI,UAAU,EAAE,YAAY,KAAK,SAAS,EAAE,CAAC;YAC3C,OAAO,UAAU,CAAC,YAAY,CAAC;QACjC,CAAC;QAED,qFAAqF;QACrF,OAAO,KAAK,CAAC;IACf,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CACjC,QAA2B,EAC3B,SAAkC;IAElC,MAAM,YAAY,GAAG,IAAI,GAAG,CAC1B,SAAS;SACN,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;SACjB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;QACZ,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;QACjD,OAAO,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;IACvD,CAAC,CAAC,CACL,CAAC;IAEF,OAAO,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AACpG,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAC5B,QAA2B,EAC3B,SAAkC;IAElC,MAAM,IAAI,GAAG,QAAQ,CAAC,SAAS,CAAC;IAChC,OAAO;QACL,EAAE,EAAE,WAAW,CAAC,QAAQ,CAAC,UAAU,EAAE,SAAS,EAAE,IAAI,CAAC;QACrD,YAAY,EAAE,WAAW,CAAC,QAAQ,CAAC,oBAAoB,EAAE,SAAS,EAAE,IAAI,CAAC;QACzE,QAAQ,EAAE,WAAW,CAAC,QAAQ,CAAC,gBAAgB,EAAE,SAAS,EAAE,IAAI,CAAC;KAClE,CAAC;AACJ,CAAC"}
|
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
/** Number of days in the full trial period. */
|
|
2
|
-
export declare const TRIAL_DAYS =
|
|
2
|
+
export declare const TRIAL_DAYS = 7;
|
|
3
3
|
/**
|
|
4
4
|
* Returns the number of whole days elapsed since the given ISO 8601 timestamp.
|
|
5
5
|
*/
|
|
6
6
|
export declare function calculateDaysSinceFirstRun(firstRunAt: string): number;
|
|
7
7
|
/**
|
|
8
|
-
* Returns true if the installation is still within the
|
|
8
|
+
* Returns true if the installation is still within the 7-day trial period.
|
|
9
9
|
*/
|
|
10
10
|
export declare function isTrialActive(firstRunAt: string): boolean;
|
|
11
11
|
/**
|
|
12
12
|
* Returns tool/spec/daily-call limits based on the current trial status.
|
|
13
13
|
*
|
|
14
|
-
* - Day 1–
|
|
15
|
-
* - Day
|
|
14
|
+
* - Day 1–7 (trial active): { tools: 20, specs: 5, dailyCalls: 50 }
|
|
15
|
+
* - Day 8+ (trial expired): { tools: 10, specs: 3, dailyCalls: 30 }
|
|
16
16
|
*/
|
|
17
17
|
export declare function getTrialLimits(firstRunAt: string): {
|
|
18
18
|
tools: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trial.d.ts","sourceRoot":"","sources":["../../../src/engine/usage-tracker/trial.ts"],"names":[],"mappings":"AAMA,+CAA+C;AAC/C,eAAO,MAAM,UAAU,
|
|
1
|
+
{"version":3,"file":"trial.d.ts","sourceRoot":"","sources":["../../../src/engine/usage-tracker/trial.ts"],"names":[],"mappings":"AAMA,+CAA+C;AAC/C,eAAO,MAAM,UAAU,IAAI,CAAC;AAQ5B;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAKrE;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAEzD;AAMD;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG;IAClD,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;CACpB,CAKA"}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
// Constants
|
|
4
4
|
// ---------------------------------------------------------------------------
|
|
5
5
|
/** Number of days in the full trial period. */
|
|
6
|
-
export const TRIAL_DAYS =
|
|
6
|
+
export const TRIAL_DAYS = 7;
|
|
7
7
|
const MS_PER_DAY = 24 * 60 * 60 * 1000;
|
|
8
8
|
// ---------------------------------------------------------------------------
|
|
9
9
|
// Trial calculations
|
|
@@ -18,7 +18,7 @@ export function calculateDaysSinceFirstRun(firstRunAt) {
|
|
|
18
18
|
return Math.floor(elapsedMs / MS_PER_DAY);
|
|
19
19
|
}
|
|
20
20
|
/**
|
|
21
|
-
* Returns true if the installation is still within the
|
|
21
|
+
* Returns true if the installation is still within the 7-day trial period.
|
|
22
22
|
*/
|
|
23
23
|
export function isTrialActive(firstRunAt) {
|
|
24
24
|
return calculateDaysSinceFirstRun(firstRunAt) < TRIAL_DAYS;
|
|
@@ -29,8 +29,8 @@ export function isTrialActive(firstRunAt) {
|
|
|
29
29
|
/**
|
|
30
30
|
* Returns tool/spec/daily-call limits based on the current trial status.
|
|
31
31
|
*
|
|
32
|
-
* - Day 1–
|
|
33
|
-
* - Day
|
|
32
|
+
* - Day 1–7 (trial active): { tools: 20, specs: 5, dailyCalls: 50 }
|
|
33
|
+
* - Day 8+ (trial expired): { tools: 10, specs: 3, dailyCalls: 30 }
|
|
34
34
|
*/
|
|
35
35
|
export function getTrialLimits(firstRunAt) {
|
|
36
36
|
if (isTrialActive(firstRunAt)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trial.js","sourceRoot":"","sources":["../../../src/engine/usage-tracker/trial.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAE/E,8EAA8E;AAC9E,YAAY;AACZ,8EAA8E;AAE9E,+CAA+C;AAC/C,MAAM,CAAC,MAAM,UAAU,GAAG,
|
|
1
|
+
{"version":3,"file":"trial.js","sourceRoot":"","sources":["../../../src/engine/usage-tracker/trial.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAE/E,8EAA8E;AAC9E,YAAY;AACZ,8EAA8E;AAE9E,+CAA+C;AAC/C,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,CAAC;AAE5B,MAAM,UAAU,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAEvC,8EAA8E;AAC9E,qBAAqB;AACrB,8EAA8E;AAE9E;;GAEG;AACH,MAAM,UAAU,0BAA0B,CAAC,UAAkB;IAC3D,MAAM,UAAU,GAAG,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,CAAC;IAClD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACzB,MAAM,SAAS,GAAG,KAAK,GAAG,UAAU,CAAC;IACrC,OAAO,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,UAAU,CAAC,CAAC;AAC5C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,UAAkB;IAC9C,OAAO,0BAA0B,CAAC,UAAU,CAAC,GAAG,UAAU,CAAC;AAC7D,CAAC;AAED,8EAA8E;AAC9E,mBAAmB;AACnB,8EAA8E;AAE9E;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,UAAkB;IAK/C,IAAI,aAAa,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9B,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;IACjD,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;AACjD,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { LemonSqueezyWebhookPayload, WebhookProcessResult } from '../../types/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Handles subscription_cancelled: the customer cancelled their subscription.
|
|
4
|
+
* The tier should be reverted to free when the subscription period ends.
|
|
5
|
+
*/
|
|
6
|
+
export declare function handleSubscriptionCancelled(payload: LemonSqueezyWebhookPayload): WebhookProcessResult;
|
|
7
|
+
/**
|
|
8
|
+
* Handles subscription_updated: plan tier may have changed (upgrade/downgrade).
|
|
9
|
+
*/
|
|
10
|
+
export declare function handleSubscriptionUpdated(payload: LemonSqueezyWebhookPayload): WebhookProcessResult;
|
|
11
|
+
/**
|
|
12
|
+
* Handles license_key_created: a new license key was issued (after purchase).
|
|
13
|
+
* This is informational — the user will activate the key via activate_license tool.
|
|
14
|
+
*/
|
|
15
|
+
export declare function handleLicenseKeyCreated(payload: LemonSqueezyWebhookPayload): WebhookProcessResult;
|
|
16
|
+
/**
|
|
17
|
+
* Returns a generic "acknowledged" result for unhandled but recognised events.
|
|
18
|
+
*/
|
|
19
|
+
export declare function handleUnknownEvent(eventType: string): WebhookProcessResult;
|
|
20
|
+
/**
|
|
21
|
+
* Dispatches a parsed webhook payload to the appropriate event handler.
|
|
22
|
+
* Unhandled but valid events are acknowledged with a 200 response.
|
|
23
|
+
*/
|
|
24
|
+
export declare function dispatchWebhookEvent(payload: LemonSqueezyWebhookPayload): WebhookProcessResult;
|
|
25
|
+
//# sourceMappingURL=event-handlers.d.ts.map
|