@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,138 @@
|
|
|
1
|
+
// engine/hooks/templates.ts — Predefined hook templates for common workflows (SPEC-071)
|
|
2
|
+
// ---------------------------------------------------------------------------
|
|
3
|
+
// Built-in templates
|
|
4
|
+
// ---------------------------------------------------------------------------
|
|
5
|
+
/**
|
|
6
|
+
* sdd-full: Full SDD workflow automation.
|
|
7
|
+
* Validates spec on creation, logs when done.
|
|
8
|
+
*/
|
|
9
|
+
const SDD_FULL_TEMPLATE = {
|
|
10
|
+
name: 'sdd-full',
|
|
11
|
+
description: 'Full SDD workflow: validate on creation, audit on done',
|
|
12
|
+
hooks: [
|
|
13
|
+
{
|
|
14
|
+
name: 'Auto-validate on spec creation',
|
|
15
|
+
description: 'Runs validate tool whenever a new spec is created',
|
|
16
|
+
trigger: 'on_spec_created',
|
|
17
|
+
actions: [
|
|
18
|
+
{
|
|
19
|
+
type: 'run_tool',
|
|
20
|
+
tool: 'validate',
|
|
21
|
+
args: {},
|
|
22
|
+
},
|
|
23
|
+
],
|
|
24
|
+
enabled: true,
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
name: 'Log spec completion',
|
|
28
|
+
description: 'Logs a message when a spec reaches done status',
|
|
29
|
+
trigger: 'on_spec_status_change',
|
|
30
|
+
filter: { toStatus: 'done' },
|
|
31
|
+
actions: [
|
|
32
|
+
{
|
|
33
|
+
type: 'log_message',
|
|
34
|
+
message: 'Spec {{specId}} is now done in project {{projectId}}',
|
|
35
|
+
},
|
|
36
|
+
],
|
|
37
|
+
enabled: true,
|
|
38
|
+
},
|
|
39
|
+
],
|
|
40
|
+
};
|
|
41
|
+
/**
|
|
42
|
+
* ci-ready: CI/CD integration hooks.
|
|
43
|
+
* Runs checks on drift detection and commit events.
|
|
44
|
+
*/
|
|
45
|
+
const CI_READY_TEMPLATE = {
|
|
46
|
+
name: 'ci-ready',
|
|
47
|
+
description: 'CI/CD integration: alert on drift, notify on commit',
|
|
48
|
+
hooks: [
|
|
49
|
+
{
|
|
50
|
+
name: 'Alert on drift',
|
|
51
|
+
description: 'Logs alert when drift is detected above threshold',
|
|
52
|
+
trigger: 'on_drift_detected',
|
|
53
|
+
actions: [
|
|
54
|
+
{
|
|
55
|
+
type: 'log_message',
|
|
56
|
+
message: 'DRIFT ALERT: spec {{specId}} drift score {{driftScore}} in project {{projectId}}',
|
|
57
|
+
},
|
|
58
|
+
],
|
|
59
|
+
enabled: true,
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
name: 'Log commit events',
|
|
63
|
+
description: 'Records commit information for traceability',
|
|
64
|
+
trigger: 'on_commit',
|
|
65
|
+
actions: [
|
|
66
|
+
{
|
|
67
|
+
type: 'log_message',
|
|
68
|
+
message: 'Commit {{commitHash}} on branch {{branch}}: {{commitMessage}}',
|
|
69
|
+
},
|
|
70
|
+
],
|
|
71
|
+
enabled: true,
|
|
72
|
+
},
|
|
73
|
+
],
|
|
74
|
+
};
|
|
75
|
+
/**
|
|
76
|
+
* quality-gate: Enforces quality gates at critical transitions.
|
|
77
|
+
*/
|
|
78
|
+
const QUALITY_GATE_TEMPLATE = {
|
|
79
|
+
name: 'quality-gate',
|
|
80
|
+
description: 'Quality gates: audit before implementing, validate on review',
|
|
81
|
+
hooks: [
|
|
82
|
+
{
|
|
83
|
+
name: 'Audit before implementing',
|
|
84
|
+
description: 'Runs audit tool when spec moves to implementing',
|
|
85
|
+
trigger: 'on_spec_status_change',
|
|
86
|
+
filter: { toStatus: 'implementing' },
|
|
87
|
+
actions: [
|
|
88
|
+
{
|
|
89
|
+
type: 'run_tool',
|
|
90
|
+
tool: 'audit',
|
|
91
|
+
args: {},
|
|
92
|
+
},
|
|
93
|
+
],
|
|
94
|
+
enabled: true,
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
name: 'Validate on review',
|
|
98
|
+
description: 'Runs validate tool when spec moves to review',
|
|
99
|
+
trigger: 'on_spec_status_change',
|
|
100
|
+
filter: { toStatus: 'review' },
|
|
101
|
+
actions: [
|
|
102
|
+
{
|
|
103
|
+
type: 'run_tool',
|
|
104
|
+
tool: 'validate',
|
|
105
|
+
args: {},
|
|
106
|
+
},
|
|
107
|
+
],
|
|
108
|
+
enabled: true,
|
|
109
|
+
},
|
|
110
|
+
],
|
|
111
|
+
};
|
|
112
|
+
// ---------------------------------------------------------------------------
|
|
113
|
+
// Template registry
|
|
114
|
+
// ---------------------------------------------------------------------------
|
|
115
|
+
const TEMPLATES = {
|
|
116
|
+
'sdd-full': SDD_FULL_TEMPLATE,
|
|
117
|
+
'ci-ready': CI_READY_TEMPLATE,
|
|
118
|
+
'quality-gate': QUALITY_GATE_TEMPLATE,
|
|
119
|
+
};
|
|
120
|
+
/**
|
|
121
|
+
* Return all available template names.
|
|
122
|
+
*/
|
|
123
|
+
export function listTemplateNames() {
|
|
124
|
+
return Object.keys(TEMPLATES);
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Return a template by name, or undefined if not found.
|
|
128
|
+
*/
|
|
129
|
+
export function getTemplate(name) {
|
|
130
|
+
return TEMPLATES[name];
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Return all templates.
|
|
134
|
+
*/
|
|
135
|
+
export function getAllTemplates() {
|
|
136
|
+
return Object.values(TEMPLATES);
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=templates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../../../src/engine/hooks/templates.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { HookDefinition, HookEventPayload, HookEventPayloadSpecCreated, HookEventPayloadStatusChange, HookEventPayloadDriftDetected, HookEventPayloadCommit } from '../../types/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Build the payload for on_spec_created events.
|
|
4
|
+
*/
|
|
5
|
+
export declare function buildSpecCreatedPayload(projectId: string, specId: string, specTitle: string, specType: string): HookEventPayloadSpecCreated;
|
|
6
|
+
/**
|
|
7
|
+
* Build the payload for on_spec_status_change events.
|
|
8
|
+
*/
|
|
9
|
+
export declare function buildStatusChangePayload(projectId: string, specId: string, specTitle: string, fromStatus: string, toStatus: string): HookEventPayloadStatusChange;
|
|
10
|
+
/**
|
|
11
|
+
* Build the payload for on_drift_detected events.
|
|
12
|
+
*/
|
|
13
|
+
export declare function buildDriftDetectedPayload(projectId: string, specId: string, driftScore: number, driftSummary: string): HookEventPayloadDriftDetected;
|
|
14
|
+
/**
|
|
15
|
+
* Build the payload for on_commit events.
|
|
16
|
+
*/
|
|
17
|
+
export declare function buildCommitPayload(projectId: string, commitHash: string, commitMessage: string, branch: string): HookEventPayloadCommit;
|
|
18
|
+
/**
|
|
19
|
+
* Check whether a hook's filter conditions are satisfied by the given payload.
|
|
20
|
+
* Returns true when the hook should fire (no filter = always fires).
|
|
21
|
+
*/
|
|
22
|
+
export declare function matchesFilter(hook: HookDefinition, payload: HookEventPayload): boolean;
|
|
23
|
+
/**
|
|
24
|
+
* Simple glob matching: supports * wildcard (matches any character sequence).
|
|
25
|
+
*/
|
|
26
|
+
export declare function matchesGlob(value: string, pattern: string): boolean;
|
|
27
|
+
//# sourceMappingURL=triggers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"triggers.d.ts","sourceRoot":"","sources":["../../../src/engine/hooks/triggers.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,cAAc,EACd,gBAAgB,EAChB,2BAA2B,EAC3B,4BAA4B,EAC5B,6BAA6B,EAC7B,sBAAsB,EACvB,MAAM,sBAAsB,CAAC;AAM9B;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,GACf,2BAA2B,CAS7B;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,GACf,4BAA4B,CAU9B;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM,GACnB,6BAA6B,CAS/B;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE,MAAM,GACb,sBAAsB,CASxB;AAMD;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAuBtF;AAiBD;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAGnE"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
// engine/hooks/triggers.ts — Event matching logic and payload construction (SPEC-071)
|
|
2
|
+
// ---------------------------------------------------------------------------
|
|
3
|
+
// Payload constructors
|
|
4
|
+
// ---------------------------------------------------------------------------
|
|
5
|
+
/**
|
|
6
|
+
* Build the payload for on_spec_created events.
|
|
7
|
+
*/
|
|
8
|
+
export function buildSpecCreatedPayload(projectId, specId, specTitle, specType) {
|
|
9
|
+
return {
|
|
10
|
+
trigger: 'on_spec_created',
|
|
11
|
+
projectId,
|
|
12
|
+
specId,
|
|
13
|
+
specTitle,
|
|
14
|
+
specType,
|
|
15
|
+
timestamp: new Date().toISOString(),
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Build the payload for on_spec_status_change events.
|
|
20
|
+
*/
|
|
21
|
+
export function buildStatusChangePayload(projectId, specId, specTitle, fromStatus, toStatus) {
|
|
22
|
+
return {
|
|
23
|
+
trigger: 'on_spec_status_change',
|
|
24
|
+
projectId,
|
|
25
|
+
specId,
|
|
26
|
+
specTitle,
|
|
27
|
+
fromStatus,
|
|
28
|
+
toStatus,
|
|
29
|
+
timestamp: new Date().toISOString(),
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Build the payload for on_drift_detected events.
|
|
34
|
+
*/
|
|
35
|
+
export function buildDriftDetectedPayload(projectId, specId, driftScore, driftSummary) {
|
|
36
|
+
return {
|
|
37
|
+
trigger: 'on_drift_detected',
|
|
38
|
+
projectId,
|
|
39
|
+
specId,
|
|
40
|
+
driftScore,
|
|
41
|
+
driftSummary,
|
|
42
|
+
timestamp: new Date().toISOString(),
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Build the payload for on_commit events.
|
|
47
|
+
*/
|
|
48
|
+
export function buildCommitPayload(projectId, commitHash, commitMessage, branch) {
|
|
49
|
+
return {
|
|
50
|
+
trigger: 'on_commit',
|
|
51
|
+
projectId,
|
|
52
|
+
commitHash,
|
|
53
|
+
commitMessage,
|
|
54
|
+
branch,
|
|
55
|
+
timestamp: new Date().toISOString(),
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
// ---------------------------------------------------------------------------
|
|
59
|
+
// Filter matching
|
|
60
|
+
// ---------------------------------------------------------------------------
|
|
61
|
+
/**
|
|
62
|
+
* Check whether a hook's filter conditions are satisfied by the given payload.
|
|
63
|
+
* Returns true when the hook should fire (no filter = always fires).
|
|
64
|
+
*/
|
|
65
|
+
export function matchesFilter(hook, payload) {
|
|
66
|
+
const filter = hook.filter;
|
|
67
|
+
if (!filter) {
|
|
68
|
+
return true;
|
|
69
|
+
}
|
|
70
|
+
if (payload.trigger === 'on_spec_status_change') {
|
|
71
|
+
if (filter.fromStatus !== undefined && filter.fromStatus !== payload.fromStatus) {
|
|
72
|
+
return false;
|
|
73
|
+
}
|
|
74
|
+
if (filter.toStatus !== undefined && filter.toStatus !== payload.toStatus) {
|
|
75
|
+
return false;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
if (filter.specIdPattern !== undefined) {
|
|
79
|
+
const specId = getSpecIdFromPayload(payload);
|
|
80
|
+
if (specId !== null && !matchesGlob(specId, filter.specIdPattern)) {
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return true;
|
|
85
|
+
}
|
|
86
|
+
// ---------------------------------------------------------------------------
|
|
87
|
+
// Helpers
|
|
88
|
+
// ---------------------------------------------------------------------------
|
|
89
|
+
function getSpecIdFromPayload(payload) {
|
|
90
|
+
if (payload.trigger === 'on_spec_created' ||
|
|
91
|
+
payload.trigger === 'on_spec_status_change' ||
|
|
92
|
+
payload.trigger === 'on_drift_detected') {
|
|
93
|
+
return payload.specId;
|
|
94
|
+
}
|
|
95
|
+
return null;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Simple glob matching: supports * wildcard (matches any character sequence).
|
|
99
|
+
*/
|
|
100
|
+
export function matchesGlob(value, pattern) {
|
|
101
|
+
const escaped = pattern.replace(/[.+^${}()|[\]\\]/g, '\\$&').replace(/\*/g, '.*');
|
|
102
|
+
return new RegExp(`^${escaped}$`).test(value);
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=triggers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"triggers.js","sourceRoot":"","sources":["../../../src/engine/hooks/triggers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { RegistryEntry, SpecAccuracyReport, RegistryEnrichment } from '../../types/index.js';
|
|
2
|
+
export type { RegistryEnrichment };
|
|
3
|
+
import { formatReport } from './reporter.js';
|
|
4
|
+
/**
|
|
5
|
+
* Validate spec content against the framework registry.
|
|
6
|
+
* Returns a complete SpecAccuracyReport with issues, score, and stale warnings.
|
|
7
|
+
* This is the primary entry point for the check_spec_accuracy tool.
|
|
8
|
+
*
|
|
9
|
+
* @param specContent Full text of the spec (HU.md or fragment)
|
|
10
|
+
* @param frameworks Optional list of framework IDs to scope the validation;
|
|
11
|
+
* if omitted, frameworks are auto-detected from the text.
|
|
12
|
+
*/
|
|
13
|
+
export declare function validateSpecContent(specContent: string, frameworks?: string[]): Promise<SpecAccuracyReport>;
|
|
14
|
+
/**
|
|
15
|
+
* Enrich a documentation response with relevant registry patterns.
|
|
16
|
+
* Used by consult_docs to add guardrail data when answering framework questions.
|
|
17
|
+
*
|
|
18
|
+
* @param topic The topic or question being asked
|
|
19
|
+
* @param framework The framework being queried (e.g. "nextjs")
|
|
20
|
+
*/
|
|
21
|
+
export declare function enrichWithRegistry(topic: string, framework: string): Promise<RegistryEnrichment>;
|
|
22
|
+
/**
|
|
23
|
+
* Format a validation report as Markdown.
|
|
24
|
+
* Re-exported from reporter for convenience.
|
|
25
|
+
*/
|
|
26
|
+
export { formatReport };
|
|
27
|
+
/**
|
|
28
|
+
* Save a custom registry entry to data/global/registry-custom.json.
|
|
29
|
+
* Custom entries override base entries with the same framework ID.
|
|
30
|
+
*/
|
|
31
|
+
export declare function saveCustomEntry(entry: RegistryEntry): Promise<void>;
|
|
32
|
+
//# sourceMappingURL=core.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../../../src/engine/registry/core.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAGlG,YAAY,EAAE,kBAAkB,EAAE,CAAC;AAGnC,OAAO,EAAe,YAAY,EAAE,MAAM,eAAe,CAAC;AAE1D;;;;;;;;GAQG;AACH,wBAAsB,mBAAmB,CACvC,WAAW,EAAE,MAAM,EACnB,UAAU,CAAC,EAAE,MAAM,EAAE,GACpB,OAAO,CAAC,kBAAkB,CAAC,CAsB7B;AAED;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,kBAAkB,CAAC,CAiC7B;AAED;;;GAGG;AACH,OAAO,EAAE,YAAY,EAAE,CAAC;AAExB;;;GAGG;AACH,wBAAsB,eAAe,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBzE"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
// engine/registry/core.ts — Orchestrator for spec accuracy validation and doc enrichment
|
|
2
|
+
// Composes loader → matcher → validator → reporter into two public functions.
|
|
3
|
+
import { loadRegistry } from './loader.js';
|
|
4
|
+
import { detectFrameworks, extractReferences, detectUnknownFrameworks } from './matcher.js';
|
|
5
|
+
import { validateReferences } from './validator.js';
|
|
6
|
+
import { buildReport, formatReport } from './reporter.js';
|
|
7
|
+
/**
|
|
8
|
+
* Validate spec content against the framework registry.
|
|
9
|
+
* Returns a complete SpecAccuracyReport with issues, score, and stale warnings.
|
|
10
|
+
* This is the primary entry point for the check_spec_accuracy tool.
|
|
11
|
+
*
|
|
12
|
+
* @param specContent Full text of the spec (HU.md or fragment)
|
|
13
|
+
* @param frameworks Optional list of framework IDs to scope the validation;
|
|
14
|
+
* if omitted, frameworks are auto-detected from the text.
|
|
15
|
+
*/
|
|
16
|
+
export async function validateSpecContent(specContent, frameworks) {
|
|
17
|
+
const registry = await loadRegistry();
|
|
18
|
+
// Step 1: Determine which frameworks to check
|
|
19
|
+
const frameworksToCheck = frameworks && frameworks.length > 0
|
|
20
|
+
? frameworks.filter((f) => registry.has(f))
|
|
21
|
+
: detectFrameworks(specContent, registry);
|
|
22
|
+
// Step 2: Detect frameworks mentioned in the text that are NOT in registry
|
|
23
|
+
const unknownFrameworks = detectUnknownFrameworks(specContent, registry).filter((uf) => !frameworksToCheck.includes(uf));
|
|
24
|
+
// Step 3: Extract API/pattern references
|
|
25
|
+
const references = extractReferences(specContent, frameworksToCheck, registry);
|
|
26
|
+
// Step 4: Validate each reference
|
|
27
|
+
const validationResults = validateReferences(references, registry);
|
|
28
|
+
// Step 5: Build and return report
|
|
29
|
+
return buildReport(validationResults, frameworksToCheck, unknownFrameworks, registry);
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Enrich a documentation response with relevant registry patterns.
|
|
33
|
+
* Used by consult_docs to add guardrail data when answering framework questions.
|
|
34
|
+
*
|
|
35
|
+
* @param topic The topic or question being asked
|
|
36
|
+
* @param framework The framework being queried (e.g. "nextjs")
|
|
37
|
+
*/
|
|
38
|
+
export async function enrichWithRegistry(topic, framework) {
|
|
39
|
+
const registry = await loadRegistry();
|
|
40
|
+
const normalizedId = framework.toLowerCase();
|
|
41
|
+
const entry = registry.get(normalizedId);
|
|
42
|
+
if (!entry) {
|
|
43
|
+
return { matchedFrameworks: [], correctPatterns: [], deprecatedWarnings: [] };
|
|
44
|
+
}
|
|
45
|
+
const topicLower = topic.toLowerCase();
|
|
46
|
+
// Filter patterns relevant to the topic
|
|
47
|
+
const relevantCorrect = entry.correctPatterns
|
|
48
|
+
.filter((p) => p.pattern.toLowerCase().includes(topicLower) ||
|
|
49
|
+
topicLower.includes(p.pattern.toLowerCase().split(' ')[0] ?? ''))
|
|
50
|
+
.map((p) => p.pattern + (p.example ? `: ${p.example}` : ''));
|
|
51
|
+
const relevantDeprecated = entry.deprecatedPatterns
|
|
52
|
+
.filter((p) => p.pattern.toLowerCase().includes(topicLower) ||
|
|
53
|
+
topicLower.includes(p.replacedBy?.toLowerCase().split(' ')[0] ?? ''))
|
|
54
|
+
.map((p) => `OBSOLETO: ${p.pattern} → Usar: ${p.replacedBy}`);
|
|
55
|
+
return {
|
|
56
|
+
matchedFrameworks: [normalizedId],
|
|
57
|
+
correctPatterns: relevantCorrect,
|
|
58
|
+
deprecatedWarnings: relevantDeprecated,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Format a validation report as Markdown.
|
|
63
|
+
* Re-exported from reporter for convenience.
|
|
64
|
+
*/
|
|
65
|
+
export { formatReport };
|
|
66
|
+
/**
|
|
67
|
+
* Save a custom registry entry to data/global/registry-custom.json.
|
|
68
|
+
* Custom entries override base entries with the same framework ID.
|
|
69
|
+
*/
|
|
70
|
+
export async function saveCustomEntry(entry) {
|
|
71
|
+
const { readJson, writeJson, globalDataDir } = await import('../../storage/base-store.js');
|
|
72
|
+
const { join } = await import('node:path');
|
|
73
|
+
const filePath = join(globalDataDir(), 'registry-custom.json');
|
|
74
|
+
const store = await readJson(filePath, { entries: [] });
|
|
75
|
+
// Replace existing entry with same framework ID, or append
|
|
76
|
+
const existing = store.entries.findIndex((e) => e.framework === entry.framework);
|
|
77
|
+
if (existing >= 0) {
|
|
78
|
+
store.entries[existing] = entry;
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
store.entries.push(entry);
|
|
82
|
+
}
|
|
83
|
+
await writeJson(filePath, store);
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=core.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"core.js","sourceRoot":"","sources":["../../../src/engine/registry/core.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { validateSpecContent, enrichWithRegistry, saveCustomEntry, formatReport } from './core.js';
|
|
2
|
+
export { loadBaseRegistry, loadCustomRegistry, loadRegistry } from './loader.js';
|
|
3
|
+
export { detectFrameworks, extractReferences, detectUnknownFrameworks } from './matcher.js';
|
|
4
|
+
export { validateReference, validateReferences, detectStaleEntries } from './validator.js';
|
|
5
|
+
export { buildReport } from './reporter.js';
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/engine/registry/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACnG,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACjF,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAC5F,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAC3F,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
// engine/registry/index.ts — Barrel export for the spec registry engine.
|
|
2
|
+
// Types (RegistryEntry, FrameworkReference, ValidationResult, etc.) live in src/types/registry.ts
|
|
3
|
+
export { validateSpecContent, enrichWithRegistry, saveCustomEntry, formatReport } from './core.js';
|
|
4
|
+
export { loadBaseRegistry, loadCustomRegistry, loadRegistry } from './loader.js';
|
|
5
|
+
export { detectFrameworks, extractReferences, detectUnknownFrameworks } from './matcher.js';
|
|
6
|
+
export { validateReference, validateReferences, detectStaleEntries } from './validator.js';
|
|
7
|
+
export { buildReport } from './reporter.js';
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/engine/registry/index.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,kGAAkG;AAElG,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACnG,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACjF,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAC5F,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAC3F,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { RegistryEntry } from '../../types/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Load all base framework entries from src/config/framework-registry/.
|
|
4
|
+
* Skips index.json and any file that fails to parse.
|
|
5
|
+
*/
|
|
6
|
+
export declare function loadBaseRegistry(): Promise<RegistryEntry[]>;
|
|
7
|
+
/**
|
|
8
|
+
* Load user-defined custom registry entries from data/global/registry-custom.json.
|
|
9
|
+
* Returns an empty array when the file does not exist.
|
|
10
|
+
*/
|
|
11
|
+
export declare function loadCustomRegistry(): Promise<RegistryEntry[]>;
|
|
12
|
+
/**
|
|
13
|
+
* Load and merge the full registry: base + custom.
|
|
14
|
+
* Custom entries override base entries with the same framework ID.
|
|
15
|
+
* The merged map preserves custom entries for duplicates.
|
|
16
|
+
*/
|
|
17
|
+
export declare function loadRegistry(): Promise<Map<string, RegistryEntry>>;
|
|
18
|
+
//# sourceMappingURL=loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../../src/engine/registry/loader.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,aAAa,EAAyC,MAAM,sBAAsB,CAAC;AAuCjG;;;GAGG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC,CAWjE;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC,CAGnE;AAED;;;;GAIG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,CAYxE"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
// engine/registry/loader.ts — Loads and merges framework registry entries
|
|
2
|
+
// Base entries come from src/config/framework-registry/*.json
|
|
3
|
+
// Custom entries come from data/global/registry-custom.json (user-added)
|
|
4
|
+
import { readFile, readdir } from 'node:fs/promises';
|
|
5
|
+
import { join, dirname } from 'node:path';
|
|
6
|
+
import { fileURLToPath } from 'node:url';
|
|
7
|
+
import { readJson } from '../../storage/base-store.js';
|
|
8
|
+
const REGISTRY_DIR = join(dirname(fileURLToPath(import.meta.url)), '../../config/framework-registry');
|
|
9
|
+
const CUSTOM_REGISTRY_PATH = 'data/global/registry-custom.json';
|
|
10
|
+
/**
|
|
11
|
+
* Load a single framework JSON file from the base registry directory.
|
|
12
|
+
* Returns null if the file is missing or malformed.
|
|
13
|
+
*/
|
|
14
|
+
async function loadFrameworkFile(fileName) {
|
|
15
|
+
try {
|
|
16
|
+
const raw = await readFile(join(REGISTRY_DIR, fileName), 'utf-8');
|
|
17
|
+
const parsed = JSON.parse(raw);
|
|
18
|
+
return {
|
|
19
|
+
framework: parsed.framework,
|
|
20
|
+
displayName: parsed.displayName,
|
|
21
|
+
frameworkVersion: parsed.frameworkVersion,
|
|
22
|
+
lastUpdated: parsed.lastUpdated,
|
|
23
|
+
ecosystem: parsed.ecosystem,
|
|
24
|
+
customEntry: false,
|
|
25
|
+
correctPatterns: Array.isArray(parsed.correctPatterns)
|
|
26
|
+
? parsed.correctPatterns
|
|
27
|
+
: [],
|
|
28
|
+
deprecatedPatterns: Array.isArray(parsed.deprecatedPatterns)
|
|
29
|
+
? parsed.deprecatedPatterns
|
|
30
|
+
: [],
|
|
31
|
+
commonMistakes: Array.isArray(parsed.commonMistakes)
|
|
32
|
+
? parsed.commonMistakes
|
|
33
|
+
: [],
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Load all base framework entries from src/config/framework-registry/.
|
|
42
|
+
* Skips index.json and any file that fails to parse.
|
|
43
|
+
*/
|
|
44
|
+
export async function loadBaseRegistry() {
|
|
45
|
+
let files;
|
|
46
|
+
try {
|
|
47
|
+
files = await readdir(REGISTRY_DIR);
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
return [];
|
|
51
|
+
}
|
|
52
|
+
const jsonFiles = files.filter((f) => f.endsWith('.json') && f !== 'index.json');
|
|
53
|
+
const results = await Promise.all(jsonFiles.map(loadFrameworkFile));
|
|
54
|
+
return results.filter((e) => e !== null);
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Load user-defined custom registry entries from data/global/registry-custom.json.
|
|
58
|
+
* Returns an empty array when the file does not exist.
|
|
59
|
+
*/
|
|
60
|
+
export async function loadCustomRegistry() {
|
|
61
|
+
const store = await readJson(CUSTOM_REGISTRY_PATH, { entries: [] });
|
|
62
|
+
return store.entries.map((e) => ({ ...e, customEntry: true }));
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Load and merge the full registry: base + custom.
|
|
66
|
+
* Custom entries override base entries with the same framework ID.
|
|
67
|
+
* The merged map preserves custom entries for duplicates.
|
|
68
|
+
*/
|
|
69
|
+
export async function loadRegistry() {
|
|
70
|
+
const [base, custom] = await Promise.all([loadBaseRegistry(), loadCustomRegistry()]);
|
|
71
|
+
const map = new Map();
|
|
72
|
+
for (const entry of base) {
|
|
73
|
+
map.set(entry.framework, entry);
|
|
74
|
+
}
|
|
75
|
+
// Custom overrides base for same framework ID
|
|
76
|
+
for (const entry of custom) {
|
|
77
|
+
map.set(entry.framework, { ...entry, customEntry: true });
|
|
78
|
+
}
|
|
79
|
+
return map;
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../../src/engine/registry/loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { RegistryEntry, FrameworkReference } from '../../types/index.js';
|
|
2
|
+
export type { FrameworkReference };
|
|
3
|
+
/**
|
|
4
|
+
* Detect which frameworks from the registry are mentioned in the spec text.
|
|
5
|
+
* A framework is considered mentioned if one of its aliases appears in the text
|
|
6
|
+
* (case-insensitive). Avoids single-word generic terms without API context.
|
|
7
|
+
*/
|
|
8
|
+
export declare function detectFrameworks(specText: string, registry: Map<string, RegistryEntry>): string[];
|
|
9
|
+
/**
|
|
10
|
+
* Extract potential API/pattern references from spec text for specific frameworks.
|
|
11
|
+
* Returns deduplicated references with framework attribution.
|
|
12
|
+
*/
|
|
13
|
+
export declare function extractReferences(specText: string, frameworkIds: string[], registry: Map<string, RegistryEntry>): FrameworkReference[];
|
|
14
|
+
/**
|
|
15
|
+
* Detect any framework names mentioned in the spec that are NOT in the registry.
|
|
16
|
+
* Scans for common framework keywords in text that don't map to known entries.
|
|
17
|
+
*/
|
|
18
|
+
export declare function detectUnknownFrameworks(specText: string, registry: Map<string, RegistryEntry>): string[];
|
|
19
|
+
//# sourceMappingURL=matcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"matcher.d.ts","sourceRoot":"","sources":["../../../src/engine/registry/matcher.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE9E,YAAY,EAAE,kBAAkB,EAAE,CAAC;AA2DnC;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,GAAG,MAAM,EAAE,CAejG;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,EAAE,EACtB,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,GACnC,kBAAkB,EAAE,CA6BtB;AAgBD;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,GACnC,MAAM,EAAE,CAuBV"}
|