@planu/cli 0.24.0 → 0.26.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,163 @@
|
|
|
1
|
+
// engine/dashboard/templates-project.ts — Project and spec HTML renderers.
|
|
2
|
+
import { renderLayout, escapeHtml, markdownToHtml } from './templates-layout.js';
|
|
3
|
+
/** Render a single spec card HTML fragment */
|
|
4
|
+
function renderSpecCard(spec) {
|
|
5
|
+
const hasProgress = spec.criteriaTotal > 0;
|
|
6
|
+
const progressBar = hasProgress
|
|
7
|
+
? `<div class="progress-bar-wrap">
|
|
8
|
+
<div class="progress-bar-fill" style="width:${spec.progressPercent}%"></div>
|
|
9
|
+
</div>
|
|
10
|
+
<div class="progress-text">
|
|
11
|
+
<span class="criteria-text">${spec.criteriaImplemented}/${spec.criteriaTotal} criterios</span>
|
|
12
|
+
<span class="progress-pct">${spec.progressPercent}%</span>
|
|
13
|
+
</div>`
|
|
14
|
+
: `<div style="font-size:0.75rem;color:var(--text-muted)">Sin datos de progreso</div>`;
|
|
15
|
+
return `<a href="/spec/${encodeURIComponent(spec.id.split('-')[0] ?? spec.id)}/${encodeURIComponent(spec.id)}"
|
|
16
|
+
class="spec-card status-${escapeHtml(spec.status)}" data-spec-id="${escapeHtml(spec.id)}">
|
|
17
|
+
<div class="spec-id" style="color:var(--status-${escapeHtml(spec.status)})">${escapeHtml(spec.id)}</div>
|
|
18
|
+
<div class="spec-title">${escapeHtml(spec.title)}</div>
|
|
19
|
+
<span class="status-badge">${escapeHtml(spec.status)}</span>
|
|
20
|
+
${progressBar}
|
|
21
|
+
</a>`;
|
|
22
|
+
}
|
|
23
|
+
/** Render the usage stats panel */
|
|
24
|
+
function renderUsagePanel(usage) {
|
|
25
|
+
if (!usage.isAvailable) {
|
|
26
|
+
return `<div class="usage-panel">
|
|
27
|
+
<h3>Uso</h3>
|
|
28
|
+
<div style="color:var(--text-muted);font-size:0.85rem">Sin datos de uso disponibles</div>
|
|
29
|
+
</div>`;
|
|
30
|
+
}
|
|
31
|
+
const tierLabel = usage.tier.charAt(0).toUpperCase() + usage.tier.slice(1);
|
|
32
|
+
const limitLabel = usage.dailyLimit !== null ? String(usage.dailyLimit) : '∞';
|
|
33
|
+
const callsLabel = `${usage.callsToday} / ${limitLabel}`;
|
|
34
|
+
let trialHtml = '';
|
|
35
|
+
if (usage.trialDaysLeft !== null) {
|
|
36
|
+
const isCritical = usage.trialDaysLeft <= 3;
|
|
37
|
+
trialHtml = `<div class="trial-warning ${isCritical ? 'trial-critical' : ''}">
|
|
38
|
+
Trial: ${usage.trialDaysLeft} día${usage.trialDaysLeft !== 1 ? 's' : ''} restante${usage.trialDaysLeft !== 1 ? 's' : ''}
|
|
39
|
+
</div>`;
|
|
40
|
+
}
|
|
41
|
+
return `<div class="usage-panel">
|
|
42
|
+
<h3>Uso</h3>
|
|
43
|
+
<div class="usage-tier">${escapeHtml(tierLabel)}</div>
|
|
44
|
+
<div style="font-size:0.82rem;color:var(--text-muted);margin-top:0.35rem">Llamadas hoy: ${escapeHtml(callsLabel)}</div>
|
|
45
|
+
${trialHtml}
|
|
46
|
+
</div>`;
|
|
47
|
+
}
|
|
48
|
+
/** Render the health metrics panel */
|
|
49
|
+
function renderHealthPanel(metrics) {
|
|
50
|
+
const estimLabel = metrics.totalEstimation !== null ? `${metrics.totalEstimation}h` : 'Sin estimación';
|
|
51
|
+
return `<div>
|
|
52
|
+
<h2 style="margin-bottom:1rem;font-size:1rem;color:var(--text-muted)">Project Health</h2>
|
|
53
|
+
<div class="grid grid-2" style="gap:0.75rem">
|
|
54
|
+
<div class="metric-card">
|
|
55
|
+
<div class="metric-value">${metrics.totalSpecs}</div>
|
|
56
|
+
<div class="metric-label">Total specs</div>
|
|
57
|
+
</div>
|
|
58
|
+
<div class="metric-card">
|
|
59
|
+
<div class="metric-value">${metrics.donePercent}%</div>
|
|
60
|
+
<div class="metric-label">Completado</div>
|
|
61
|
+
</div>
|
|
62
|
+
<div class="metric-card">
|
|
63
|
+
<div class="metric-value">${metrics.pendingApproval}</div>
|
|
64
|
+
<div class="metric-label">Pendientes aprobación</div>
|
|
65
|
+
</div>
|
|
66
|
+
<div class="metric-card">
|
|
67
|
+
<div class="metric-value">${metrics.activeImplementation}</div>
|
|
68
|
+
<div class="metric-label">En implementación</div>
|
|
69
|
+
</div>
|
|
70
|
+
</div>
|
|
71
|
+
<div style="margin-top:0.75rem;font-size:0.82rem;color:var(--text-muted)">
|
|
72
|
+
Estimación total: <strong>${escapeHtml(estimLabel)}</strong>
|
|
73
|
+
</div>
|
|
74
|
+
</div>`;
|
|
75
|
+
}
|
|
76
|
+
/** Render the home page — list of all projects */
|
|
77
|
+
export function renderHomePage(projects, usage) {
|
|
78
|
+
const projectContent = projects.length === 0
|
|
79
|
+
? `<div class="empty-state">
|
|
80
|
+
<h2>No hay proyectos registrados</h2>
|
|
81
|
+
<p>Usa el tool <code>init_project</code> desde tu cliente MCP para crear tu primer proyecto.</p>
|
|
82
|
+
</div>`
|
|
83
|
+
: `<h2 style="margin-bottom:1rem">Proyectos</h2>
|
|
84
|
+
<div class="project-list">
|
|
85
|
+
${projects
|
|
86
|
+
.map((p) => `<a href="/project/${encodeURIComponent(p.id)}" class="project-card">
|
|
87
|
+
<div class="project-info">
|
|
88
|
+
<h2>${escapeHtml(p.name)}</h2>
|
|
89
|
+
<div class="meta">${escapeHtml(p.stack)} • ${escapeHtml(p.path)} • Última actividad: ${escapeHtml(p.lastActivity)}</div>
|
|
90
|
+
</div>
|
|
91
|
+
<div class="project-stats">
|
|
92
|
+
<div>${p.specCount} specs</div>
|
|
93
|
+
<div class="done">${p.doneCount} done</div>
|
|
94
|
+
</div>
|
|
95
|
+
</a>`)
|
|
96
|
+
.join('\n')}
|
|
97
|
+
</div>`;
|
|
98
|
+
const body = `${projectContent}${renderUsagePanel(usage)}`;
|
|
99
|
+
return renderLayout('Inicio', body);
|
|
100
|
+
}
|
|
101
|
+
/** Render the project detail page — spec cards + health panel */
|
|
102
|
+
export function renderProjectPage(project, metrics, usage) {
|
|
103
|
+
const specCards = project.specs.length === 0
|
|
104
|
+
? `<div class="empty-state"><p>Este proyecto no tiene specs aún.</p></div>`
|
|
105
|
+
: project.specs.map(renderSpecCard).join('\n');
|
|
106
|
+
const body = `
|
|
107
|
+
<div class="breadcrumb">
|
|
108
|
+
<a href="/">Inicio</a> › ${escapeHtml(project.name)}
|
|
109
|
+
</div>
|
|
110
|
+
<div style="display:grid;grid-template-columns:1fr 280px;gap:2rem;align-items:start">
|
|
111
|
+
<div>
|
|
112
|
+
<h2 style="margin-bottom:1.25rem">${escapeHtml(project.name)}</h2>
|
|
113
|
+
<div id="spec-grid" class="spec-grid">${specCards}</div>
|
|
114
|
+
</div>
|
|
115
|
+
<div>
|
|
116
|
+
${renderHealthPanel(metrics)}
|
|
117
|
+
${renderUsagePanel(usage)}
|
|
118
|
+
</div>
|
|
119
|
+
</div>
|
|
120
|
+
`;
|
|
121
|
+
return renderLayout(project.name, body);
|
|
122
|
+
}
|
|
123
|
+
/** Render the spec detail page — HU, FICHA, PROGRESS tabs */
|
|
124
|
+
export function renderSpecPage(projectId, projectName, specId, hu, ficha, progress) {
|
|
125
|
+
const huHtml = hu !== null ? markdownToHtml(hu) : '<p style="color:var(--text-muted)">HU.md no encontrado</p>';
|
|
126
|
+
const fichaHtml = ficha !== null
|
|
127
|
+
? markdownToHtml(ficha)
|
|
128
|
+
: '<p style="color:var(--text-muted)">FICHA-TECNICA.md no encontrado</p>';
|
|
129
|
+
const progressHtml = progress !== null
|
|
130
|
+
? markdownToHtml(progress)
|
|
131
|
+
: '<p style="color:var(--text-muted)">PROGRESS.md no encontrado</p>';
|
|
132
|
+
const body = `
|
|
133
|
+
<div class="breadcrumb">
|
|
134
|
+
<a href="/">Inicio</a> ›
|
|
135
|
+
<a href="/project/${encodeURIComponent(projectId)}">${escapeHtml(projectName)}</a> ›
|
|
136
|
+
${escapeHtml(specId)}
|
|
137
|
+
</div>
|
|
138
|
+
<div class="tabs">
|
|
139
|
+
<button class="tab-btn active" data-tab="hu">Historia de Usuario</button>
|
|
140
|
+
<button class="tab-btn" data-tab="ficha">Ficha Técnica</button>
|
|
141
|
+
<button class="tab-btn" data-tab="progress">Progreso</button>
|
|
142
|
+
</div>
|
|
143
|
+
<div id="tab-hu" class="tab-content active">
|
|
144
|
+
<div class="md-content card">${huHtml}</div>
|
|
145
|
+
</div>
|
|
146
|
+
<div id="tab-ficha" class="tab-content">
|
|
147
|
+
<div class="md-content card">${fichaHtml}</div>
|
|
148
|
+
</div>
|
|
149
|
+
<div id="tab-progress" class="tab-content">
|
|
150
|
+
<div class="md-content card">${progressHtml}</div>
|
|
151
|
+
</div>
|
|
152
|
+
`;
|
|
153
|
+
return renderLayout(specId, body);
|
|
154
|
+
}
|
|
155
|
+
/** Render a 404 not found page */
|
|
156
|
+
export function render404Page(path) {
|
|
157
|
+
return renderLayout('404', `<div class="empty-state">
|
|
158
|
+
<h2>404 — Página no encontrada</h2>
|
|
159
|
+
<p>La ruta <code>${escapeHtml(path)}</code> no existe.</p>
|
|
160
|
+
<p style="margin-top:1rem"><a href="/">Volver al inicio</a></p>
|
|
161
|
+
</div>`);
|
|
162
|
+
}
|
|
163
|
+
//# sourceMappingURL=templates-project.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"templates-project.js","sourceRoot":"","sources":["../../../src/engine/dashboard/templates-project.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAQ3E,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEjF,8CAA8C;AAC9C,SAAS,cAAc,CAAC,IAAuB;IAC7C,MAAM,WAAW,GAAG,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC;IAC3C,MAAM,WAAW,GAAG,WAAW;QAC7B,CAAC,CAAC;sDACgD,IAAI,CAAC,eAAe;;;uCAGnC,IAAI,CAAC,mBAAmB,IAAI,IAAI,CAAC,aAAa;sCAC/C,IAAI,CAAC,eAAe;cAC5C;QACV,CAAC,CAAC,oFAAoF,CAAC;IAEzF,OAAO,kBAAkB,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC,IAAI,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC;+BAC/E,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,mBAAmB,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;qDACvC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;8BACvE,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC;iCACnB,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC;MAClD,WAAW;OACV,CAAC;AACR,CAAC;AAED,mCAAmC;AACnC,SAAS,gBAAgB,CAAC,KAA0B;IAClD,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;QACvB,OAAO;;;WAGA,CAAC;IACV,CAAC;IAED,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC3E,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IAC9E,MAAM,UAAU,GAAG,GAAG,KAAK,CAAC,UAAU,MAAM,UAAU,EAAE,CAAC;IAEzD,IAAI,SAAS,GAAG,EAAE,CAAC;IACnB,IAAI,KAAK,CAAC,aAAa,KAAK,IAAI,EAAE,CAAC;QACjC,MAAM,UAAU,GAAG,KAAK,CAAC,aAAa,IAAI,CAAC,CAAC;QAC5C,SAAS,GAAG,6BAA6B,UAAU,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE;eAChE,KAAK,CAAC,aAAa,OAAO,KAAK,CAAC,aAAa,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,YAAY,KAAK,CAAC,aAAa,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;WAClH,CAAC;IACV,CAAC;IAED,OAAO;;8BAEqB,UAAU,CAAC,SAAS,CAAC;8FAC2C,UAAU,CAAC,UAAU,CAAC;MAC9G,SAAS;SACN,CAAC;AACV,CAAC;AAED,sCAAsC;AACtC,SAAS,iBAAiB,CAAC,OAA6B;IACtD,MAAM,UAAU,GACd,OAAO,CAAC,eAAe,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,eAAe,GAAG,CAAC,CAAC,CAAC,gBAAgB,CAAC;IAEtF,OAAO;;;;oCAI2B,OAAO,CAAC,UAAU;;;;oCAIlB,OAAO,CAAC,WAAW;;;;oCAInB,OAAO,CAAC,eAAe;;;;oCAIvB,OAAO,CAAC,oBAAoB;;;;;kCAK9B,UAAU,CAAC,UAAU,CAAC;;SAE/C,CAAC;AACV,CAAC;AAED,kDAAkD;AAClD,MAAM,UAAU,cAAc,CAC5B,QAAmC,EACnC,KAA0B;IAE1B,MAAM,cAAc,GAClB,QAAQ,CAAC,MAAM,KAAK,CAAC;QACnB,CAAC,CAAC;;;eAGO;QACT,CAAC,CAAC;;aAEK,QAAQ;aACP,GAAG,CACF,CAAC,CAAC,EAAE,EAAE,CAAC,qBAAqB,kBAAkB,CAAC,CAAC,CAAC,EAAE,CAAC;;uBAE5C,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC;qCACJ,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,6BAA6B,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC;;;wBAGpH,CAAC,CAAC,SAAS;qCACE,CAAC,CAAC,SAAS;;kBAE9B,CACJ;aACA,IAAI,CAAC,IAAI,CAAC;gBACR,CAAC;IAEf,MAAM,IAAI,GAAG,GAAG,cAAc,GAAG,gBAAgB,CAAC,KAAK,CAAC,EAAE,CAAC;IAE3D,OAAO,YAAY,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;AACtC,CAAC;AAED,iEAAiE;AACjE,MAAM,UAAU,iBAAiB,CAC/B,OAAgC,EAChC,OAA6B,EAC7B,KAA0B;IAE1B,MAAM,SAAS,GACb,OAAO,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;QACxB,CAAC,CAAC,yEAAyE;QAC3E,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEnD,MAAM,IAAI,GAAG;;wCAEyB,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC;;;;4CAIpB,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC;gDACpB,SAAS;;;UAG/C,iBAAiB,CAAC,OAAO,CAAC;UAC1B,gBAAgB,CAAC,KAAK,CAAC;;;GAG9B,CAAC;IAEF,OAAO,YAAY,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AAC1C,CAAC;AAED,6DAA6D;AAC7D,MAAM,UAAU,cAAc,CAC5B,SAAiB,EACjB,WAAmB,EACnB,MAAc,EACd,EAAiB,EACjB,KAAoB,EACpB,QAAuB;IAEvB,MAAM,MAAM,GACV,EAAE,KAAK,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,4DAA4D,CAAC;IAClG,MAAM,SAAS,GACb,KAAK,KAAK,IAAI;QACZ,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC;QACvB,CAAC,CAAC,uEAAuE,CAAC;IAC9E,MAAM,YAAY,GAChB,QAAQ,KAAK,IAAI;QACf,CAAC,CAAC,cAAc,CAAC,QAAQ,CAAC;QAC1B,CAAC,CAAC,kEAAkE,CAAC;IAEzE,MAAM,IAAI,GAAG;;;0BAGW,kBAAkB,CAAC,SAAS,CAAC,KAAK,UAAU,CAAC,WAAW,CAAC;QAC3E,UAAU,CAAC,MAAM,CAAC;;;;;;;;qCAQW,MAAM;;;qCAGN,SAAS;;;qCAGT,YAAY;;GAE9C,CAAC;IAEF,OAAO,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;AACpC,CAAC;AAED,kCAAkC;AAClC,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,OAAO,YAAY,CACjB,KAAK,EACL;;yBAEqB,UAAU,CAAC,IAAI,CAAC;;WAE9B,CACR,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../../src/engine/dashboard/templates.ts"],"names":[],"mappings":"AACA,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../../../src/engine/dashboard/templates.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"focus-tracker.d.ts","sourceRoot":"","sources":["../../src/engine/focus-tracker.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"focus-tracker.d.ts","sourceRoot":"","sources":["../../src/engine/focus-tracker.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAwDhE;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,IAAI,CAEnE;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAElE;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAElD;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAC7B,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,aAAa,CAAC,EAAE,MAAM,GACrB,UAAU,GAAG,IAAI,CA0BnB;AAWD;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAcxE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"focus-tracker.js","sourceRoot":"","sources":["../../src/engine/focus-tracker.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"focus-tracker.js","sourceRoot":"","sources":["../../src/engine/focus-tracker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { HookDefinition, HookEventPayload, HookExecutionLog } from '../../types/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Execute a single hook for the given payload.
|
|
4
|
+
* Returns a complete execution log entry.
|
|
5
|
+
*/
|
|
6
|
+
export declare function executeHook(hook: HookDefinition, payload: HookEventPayload, depth: number): HookExecutionLog;
|
|
7
|
+
/**
|
|
8
|
+
* Dispatch an event to all matching enabled hooks.
|
|
9
|
+
* Fire-and-forget — errors in hooks are captured in the log, never thrown.
|
|
10
|
+
* Returns execution logs for all fired hooks.
|
|
11
|
+
*
|
|
12
|
+
* @param hooks - List of all hooks for the project
|
|
13
|
+
* @param payload - Event payload to dispatch
|
|
14
|
+
* @param depth - Current recursion depth (starts at 0)
|
|
15
|
+
*/
|
|
16
|
+
export declare function dispatchEvent(hooks: HookDefinition[], payload: HookEventPayload, depth?: number): HookExecutionLog[];
|
|
17
|
+
/**
|
|
18
|
+
* Simulate hook execution without side effects (dry run).
|
|
19
|
+
* Returns which hooks would fire and what actions they would execute.
|
|
20
|
+
*/
|
|
21
|
+
export declare function dryRunDispatch(hooks: HookDefinition[], payload: HookEventPayload): {
|
|
22
|
+
hook: HookDefinition;
|
|
23
|
+
wouldFire: boolean;
|
|
24
|
+
reason?: string;
|
|
25
|
+
}[];
|
|
26
|
+
//# sourceMappingURL=core.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../../../src/engine/hooks/core.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAGjB,MAAM,sBAAsB,CAAC;AA8F9B;;;GAGG;AACH,wBAAgB,WAAW,CACzB,IAAI,EAAE,cAAc,EACpB,OAAO,EAAE,gBAAgB,EACzB,KAAK,EAAE,MAAM,GACZ,gBAAgB,CAyBlB;AAMD;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,cAAc,EAAE,EACvB,OAAO,EAAE,gBAAgB,EACzB,KAAK,SAAI,GACR,gBAAgB,EAAE,CAyBpB;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,cAAc,EAAE,EACvB,OAAO,EAAE,gBAAgB,GACxB;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,SAAS,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,CAiBjE"}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
// engine/hooks/core.ts — Hook registry: load, match, execute (SPEC-071)
|
|
2
|
+
// Hooks are LAZY — executed when a tool fires an event, not via daemon.
|
|
3
|
+
// Recursion guard: max depth = 3 to prevent infinite loops.
|
|
4
|
+
import { matchesFilter } from './triggers.js';
|
|
5
|
+
// ---------------------------------------------------------------------------
|
|
6
|
+
// Constants
|
|
7
|
+
// ---------------------------------------------------------------------------
|
|
8
|
+
const MAX_DEPTH = 3;
|
|
9
|
+
// ---------------------------------------------------------------------------
|
|
10
|
+
// Interpolation
|
|
11
|
+
// ---------------------------------------------------------------------------
|
|
12
|
+
/**
|
|
13
|
+
* Interpolate {{key}} placeholders in a string using values from the payload
|
|
14
|
+
* and a flat context map.
|
|
15
|
+
*/
|
|
16
|
+
function interpolate(template, context) {
|
|
17
|
+
return template.replace(/\{\{(\w+)\}\}/g, (_, key) => {
|
|
18
|
+
const value = context[key];
|
|
19
|
+
if (value === undefined || value === null) {
|
|
20
|
+
return `{{${key}}}`;
|
|
21
|
+
}
|
|
22
|
+
if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {
|
|
23
|
+
return String(value);
|
|
24
|
+
}
|
|
25
|
+
return JSON.stringify(value);
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Flatten the event payload into a string-keyed context map for interpolation.
|
|
30
|
+
*/
|
|
31
|
+
function payloadToContext(payload) {
|
|
32
|
+
return payload;
|
|
33
|
+
}
|
|
34
|
+
// ---------------------------------------------------------------------------
|
|
35
|
+
// Action execution
|
|
36
|
+
// ---------------------------------------------------------------------------
|
|
37
|
+
/**
|
|
38
|
+
* Execute a single hook action. Returns the action result.
|
|
39
|
+
* This function does NOT throw — errors are captured in the result.
|
|
40
|
+
*/
|
|
41
|
+
function executeAction(action, payload) {
|
|
42
|
+
const context = payloadToContext(payload);
|
|
43
|
+
try {
|
|
44
|
+
switch (action.type) {
|
|
45
|
+
case 'log_message': {
|
|
46
|
+
const message = interpolate(action.message, context);
|
|
47
|
+
console.warn(`[Planu Hook] ${message}`);
|
|
48
|
+
return { actionType: action.type, status: 'success', output: message };
|
|
49
|
+
}
|
|
50
|
+
case 'notify': {
|
|
51
|
+
const message = interpolate(action.message, context);
|
|
52
|
+
console.warn(`[Planu Hook Notify] ${message}`);
|
|
53
|
+
return { actionType: action.type, status: 'success', output: message };
|
|
54
|
+
}
|
|
55
|
+
case 'set_variable': {
|
|
56
|
+
const value = interpolate(action.value, context);
|
|
57
|
+
return {
|
|
58
|
+
actionType: action.type,
|
|
59
|
+
status: 'success',
|
|
60
|
+
output: `Set ${action.key}=${value}`,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
case 'run_tool': {
|
|
64
|
+
// Tools are invoked via fire-and-forget — we log intent but do not
|
|
65
|
+
// actually call the MCP server recursively from within the engine.
|
|
66
|
+
const toolArgs = JSON.stringify(action.args);
|
|
67
|
+
const message = `Would invoke tool '${action.tool}' with args: ${toolArgs}`;
|
|
68
|
+
console.warn(`[Planu Hook run_tool] ${message}`);
|
|
69
|
+
return { actionType: action.type, status: 'success', output: message };
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
catch (err) {
|
|
74
|
+
const errorMessage = err instanceof Error ? err.message : String(err);
|
|
75
|
+
return {
|
|
76
|
+
actionType: action.type,
|
|
77
|
+
status: 'failed',
|
|
78
|
+
errorMessage,
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
// ---------------------------------------------------------------------------
|
|
83
|
+
// Hook dispatch
|
|
84
|
+
// ---------------------------------------------------------------------------
|
|
85
|
+
/**
|
|
86
|
+
* Execute a single hook for the given payload.
|
|
87
|
+
* Returns a complete execution log entry.
|
|
88
|
+
*/
|
|
89
|
+
export function executeHook(hook, payload, depth) {
|
|
90
|
+
const startMs = Date.now();
|
|
91
|
+
const logId = `log-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
|
|
92
|
+
const actionResults = [];
|
|
93
|
+
for (const action of hook.actions) {
|
|
94
|
+
const result = executeAction(action, payload);
|
|
95
|
+
actionResults.push(result);
|
|
96
|
+
}
|
|
97
|
+
const allSucceeded = actionResults.every((r) => r.status === 'success');
|
|
98
|
+
return {
|
|
99
|
+
id: logId,
|
|
100
|
+
hookId: hook.id,
|
|
101
|
+
hookName: hook.name,
|
|
102
|
+
trigger: payload.trigger,
|
|
103
|
+
payload,
|
|
104
|
+
status: allSucceeded ? 'success' : 'failed',
|
|
105
|
+
depth,
|
|
106
|
+
actionResults,
|
|
107
|
+
executedAt: new Date().toISOString(),
|
|
108
|
+
durationMs: Date.now() - startMs,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
// ---------------------------------------------------------------------------
|
|
112
|
+
// Registry dispatch
|
|
113
|
+
// ---------------------------------------------------------------------------
|
|
114
|
+
/**
|
|
115
|
+
* Dispatch an event to all matching enabled hooks.
|
|
116
|
+
* Fire-and-forget — errors in hooks are captured in the log, never thrown.
|
|
117
|
+
* Returns execution logs for all fired hooks.
|
|
118
|
+
*
|
|
119
|
+
* @param hooks - List of all hooks for the project
|
|
120
|
+
* @param payload - Event payload to dispatch
|
|
121
|
+
* @param depth - Current recursion depth (starts at 0)
|
|
122
|
+
*/
|
|
123
|
+
export function dispatchEvent(hooks, payload, depth = 0) {
|
|
124
|
+
if (depth >= MAX_DEPTH) {
|
|
125
|
+
console.warn(`[Planu Hooks] Recursion guard triggered at depth ${depth} for trigger '${payload.trigger}'. Stopping.`);
|
|
126
|
+
return [];
|
|
127
|
+
}
|
|
128
|
+
const matchingHooks = hooks.filter((hook) => hook.enabled && hook.trigger === payload.trigger && matchesFilter(hook, payload));
|
|
129
|
+
const logs = [];
|
|
130
|
+
for (const hook of matchingHooks) {
|
|
131
|
+
try {
|
|
132
|
+
const log = executeHook(hook, payload, depth);
|
|
133
|
+
logs.push(log);
|
|
134
|
+
}
|
|
135
|
+
catch (err) {
|
|
136
|
+
const errorMessage = err instanceof Error ? err.message : String(err);
|
|
137
|
+
console.error(`[Planu Hooks] Unexpected error in hook '${hook.id}': ${errorMessage}`);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
return logs;
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Simulate hook execution without side effects (dry run).
|
|
144
|
+
* Returns which hooks would fire and what actions they would execute.
|
|
145
|
+
*/
|
|
146
|
+
export function dryRunDispatch(hooks, payload) {
|
|
147
|
+
return hooks.map((hook) => {
|
|
148
|
+
if (!hook.enabled) {
|
|
149
|
+
return { hook, wouldFire: false, reason: 'Hook is disabled' };
|
|
150
|
+
}
|
|
151
|
+
if (hook.trigger !== payload.trigger) {
|
|
152
|
+
return {
|
|
153
|
+
hook,
|
|
154
|
+
wouldFire: false,
|
|
155
|
+
reason: `Trigger mismatch: hook='${hook.trigger}', event='${payload.trigger}'`,
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
if (!matchesFilter(hook, payload)) {
|
|
159
|
+
return { hook, wouldFire: false, reason: 'Filter conditions not met' };
|
|
160
|
+
}
|
|
161
|
+
return { hook, wouldFire: true };
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
//# sourceMappingURL=core.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"core.js","sourceRoot":"","sources":["../../../src/engine/hooks/core.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { GitHookScript, GitHookType, GenerateGitHooksInput } from '../../types/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Generate a shell script for the given git hook type.
|
|
4
|
+
*/
|
|
5
|
+
export declare function generateGitHookScript(hookType: GitHookType, projectId: string, projectPath: string): GitHookScript;
|
|
6
|
+
/**
|
|
7
|
+
* Generate git hook scripts for all requested hook types.
|
|
8
|
+
*/
|
|
9
|
+
export declare function generateGitHooks(input: GenerateGitHooksInput): GitHookScript[];
|
|
10
|
+
/**
|
|
11
|
+
* Format the generated scripts as a human-readable installation guide.
|
|
12
|
+
*/
|
|
13
|
+
export declare function formatGitHookInstallGuide(scripts: GitHookScript[]): string;
|
|
14
|
+
//# sourceMappingURL=git-hook-generator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-hook-generator.d.ts","sourceRoot":"","sources":["../../../src/engine/hooks/git-hook-generator.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AA+E9F;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,WAAW,EACrB,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,GAClB,aAAa,CAiBf;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,qBAAqB,GAAG,aAAa,EAAE,CAI9E;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,aAAa,EAAE,GAAG,MAAM,CAkB1E"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
// engine/hooks/git-hook-generator.ts — Generates shell scripts for git hooks (SPEC-071)
|
|
2
|
+
// Git hooks are generated as shell scripts — Planu does NOT execute them directly.
|
|
3
|
+
// ---------------------------------------------------------------------------
|
|
4
|
+
// Script templates
|
|
5
|
+
// ---------------------------------------------------------------------------
|
|
6
|
+
function buildPreCommitScript(projectId) {
|
|
7
|
+
return `#!/usr/bin/env sh
|
|
8
|
+
# Planu pre-commit hook — auto-generated by manage_hooks
|
|
9
|
+
# Project: ${projectId}
|
|
10
|
+
# Do not edit manually — re-run manage_hooks install_template to regenerate.
|
|
11
|
+
|
|
12
|
+
set -e
|
|
13
|
+
|
|
14
|
+
echo "[Planu] Running pre-commit checks..."
|
|
15
|
+
|
|
16
|
+
# Dispatch on_commit event to Planu (fire-and-forget — does not block commit)
|
|
17
|
+
# Requires planu CLI to be installed: npm install -g planu (or equivalent)
|
|
18
|
+
if command -v planu >/dev/null 2>&1; then
|
|
19
|
+
COMMIT_HASH="$(git rev-parse --short HEAD 2>/dev/null || echo 'unknown')"
|
|
20
|
+
BRANCH="$(git rev-parse --abbrev-ref HEAD 2>/dev/null || echo 'unknown')"
|
|
21
|
+
COMMIT_MSG="$(git log -1 --pretty=%B 2>/dev/null | head -1 || echo '')"
|
|
22
|
+
planu dispatch on_commit \\
|
|
23
|
+
--project-id "${projectId}" \\
|
|
24
|
+
--commit-hash "\${COMMIT_HASH}" \\
|
|
25
|
+
--branch "\${BRANCH}" \\
|
|
26
|
+
--message "\${COMMIT_MSG}" \\
|
|
27
|
+
2>/dev/null || true
|
|
28
|
+
fi
|
|
29
|
+
|
|
30
|
+
echo "[Planu] Pre-commit checks complete."
|
|
31
|
+
`;
|
|
32
|
+
}
|
|
33
|
+
function buildPostCommitScript(projectId) {
|
|
34
|
+
return `#!/usr/bin/env sh
|
|
35
|
+
# Planu post-commit hook — auto-generated by manage_hooks
|
|
36
|
+
# Project: ${projectId}
|
|
37
|
+
# Do not edit manually — re-run manage_hooks install_template to regenerate.
|
|
38
|
+
|
|
39
|
+
echo "[Planu] Post-commit: recording commit event..."
|
|
40
|
+
|
|
41
|
+
if command -v planu >/dev/null 2>&1; then
|
|
42
|
+
COMMIT_HASH="$(git rev-parse --short HEAD 2>/dev/null || echo 'unknown')"
|
|
43
|
+
BRANCH="$(git rev-parse --abbrev-ref HEAD 2>/dev/null || echo 'unknown')"
|
|
44
|
+
COMMIT_MSG="$(git log -1 --pretty=%B 2>/dev/null | head -1 || echo '')"
|
|
45
|
+
planu dispatch on_commit \\
|
|
46
|
+
--project-id "${projectId}" \\
|
|
47
|
+
--commit-hash "\${COMMIT_HASH}" \\
|
|
48
|
+
--branch "\${BRANCH}" \\
|
|
49
|
+
--message "\${COMMIT_MSG}" \\
|
|
50
|
+
2>/dev/null || true
|
|
51
|
+
fi
|
|
52
|
+
`;
|
|
53
|
+
}
|
|
54
|
+
function buildPrePushScript(projectId) {
|
|
55
|
+
return `#!/usr/bin/env sh
|
|
56
|
+
# Planu pre-push hook — auto-generated by manage_hooks
|
|
57
|
+
# Project: ${projectId}
|
|
58
|
+
# Do not edit manually — re-run manage_hooks install_template to regenerate.
|
|
59
|
+
|
|
60
|
+
set -e
|
|
61
|
+
|
|
62
|
+
echo "[Planu] Running pre-push drift check..."
|
|
63
|
+
|
|
64
|
+
if command -v planu >/dev/null 2>&1; then
|
|
65
|
+
# Run drift detection for all active specs
|
|
66
|
+
planu detect-drift --project-id "${projectId}" --mode quick 2>/dev/null || true
|
|
67
|
+
fi
|
|
68
|
+
|
|
69
|
+
echo "[Planu] Pre-push checks complete."
|
|
70
|
+
`;
|
|
71
|
+
}
|
|
72
|
+
// ---------------------------------------------------------------------------
|
|
73
|
+
// Generator functions
|
|
74
|
+
// ---------------------------------------------------------------------------
|
|
75
|
+
/**
|
|
76
|
+
* Generate a shell script for the given git hook type.
|
|
77
|
+
*/
|
|
78
|
+
export function generateGitHookScript(hookType, projectId, projectPath) {
|
|
79
|
+
const installPath = `${projectPath}/.git/hooks/${hookType}`;
|
|
80
|
+
let content;
|
|
81
|
+
switch (hookType) {
|
|
82
|
+
case 'pre-commit':
|
|
83
|
+
content = buildPreCommitScript(projectId);
|
|
84
|
+
break;
|
|
85
|
+
case 'post-commit':
|
|
86
|
+
content = buildPostCommitScript(projectId);
|
|
87
|
+
break;
|
|
88
|
+
case 'pre-push':
|
|
89
|
+
content = buildPrePushScript(projectId);
|
|
90
|
+
break;
|
|
91
|
+
}
|
|
92
|
+
return { hookType, content, installPath };
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Generate git hook scripts for all requested hook types.
|
|
96
|
+
*/
|
|
97
|
+
export function generateGitHooks(input) {
|
|
98
|
+
return input.hookTypes.map((hookType) => generateGitHookScript(hookType, input.projectId, input.projectPath));
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Format the generated scripts as a human-readable installation guide.
|
|
102
|
+
*/
|
|
103
|
+
export function formatGitHookInstallGuide(scripts) {
|
|
104
|
+
const lines = ['Git hook scripts generated. To install:', '', '```bash'];
|
|
105
|
+
for (const script of scripts) {
|
|
106
|
+
lines.push(`# Install ${script.hookType} hook`);
|
|
107
|
+
lines.push(`cat > ${script.installPath} << 'PLANU_HOOK'`);
|
|
108
|
+
lines.push(script.content.trim());
|
|
109
|
+
lines.push('PLANU_HOOK');
|
|
110
|
+
lines.push(`chmod +x ${script.installPath}`);
|
|
111
|
+
lines.push('');
|
|
112
|
+
}
|
|
113
|
+
lines.push('```');
|
|
114
|
+
lines.push('');
|
|
115
|
+
lines.push('Note: These hooks dispatch events to Planu. They are fire-and-forget');
|
|
116
|
+
lines.push('and will not block git operations if Planu is unavailable.');
|
|
117
|
+
return lines.join('\n');
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=git-hook-generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-hook-generator.js","sourceRoot":"","sources":["../../../src/engine/hooks/git-hook-generator.ts"],"names":[],"mappings":"AAAA,wFAAwF;AACxF,mFAAmF;AAInF,8EAA8E;AAC9E,mBAAmB;AACnB,8EAA8E;AAE9E,SAAS,oBAAoB,CAAC,SAAiB;IAC7C,OAAO;;aAEI,SAAS;;;;;;;;;;;;;;oBAcF,SAAS;;;;;;;;CAQ5B,CAAC;AACF,CAAC;AAED,SAAS,qBAAqB,CAAC,SAAiB;IAC9C,OAAO;;aAEI,SAAS;;;;;;;;;;oBAUF,SAAS;;;;;;CAM5B,CAAC;AACF,CAAC;AAED,SAAS,kBAAkB,CAAC,SAAiB;IAC3C,OAAO;;aAEI,SAAS;;;;;;;;;qCASe,SAAS;;;;CAI7C,CAAC;AACF,CAAC;AAED,8EAA8E;AAC9E,sBAAsB;AACtB,8EAA8E;AAE9E;;GAEG;AACH,MAAM,UAAU,qBAAqB,CACnC,QAAqB,EACrB,SAAiB,EACjB,WAAmB;IAEnB,MAAM,WAAW,GAAG,GAAG,WAAW,eAAe,QAAQ,EAAE,CAAC;IAC5D,IAAI,OAAe,CAAC;IAEpB,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,YAAY;YACf,OAAO,GAAG,oBAAoB,CAAC,SAAS,CAAC,CAAC;YAC1C,MAAM;QACR,KAAK,aAAa;YAChB,OAAO,GAAG,qBAAqB,CAAC,SAAS,CAAC,CAAC;YAC3C,MAAM;QACR,KAAK,UAAU;YACb,OAAO,GAAG,kBAAkB,CAAC,SAAS,CAAC,CAAC;YACxC,MAAM;IACV,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC;AAC5C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAA4B;IAC3D,OAAO,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CACtC,qBAAqB,CAAC,QAAQ,EAAE,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,WAAW,CAAC,CACpE,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,yBAAyB,CAAC,OAAwB;IAChE,MAAM,KAAK,GAAa,CAAC,yCAAyC,EAAE,EAAE,EAAE,SAAS,CAAC,CAAC;IAEnF,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,KAAK,CAAC,IAAI,CAAC,aAAa,MAAM,CAAC,QAAQ,OAAO,CAAC,CAAC;QAChD,KAAK,CAAC,IAAI,CAAC,SAAS,MAAM,CAAC,WAAW,kBAAkB,CAAC,CAAC;QAC1D,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;QAClC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACzB,KAAK,CAAC,IAAI,CAAC,YAAY,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;QAC7C,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,sEAAsE,CAAC,CAAC;IACnF,KAAK,CAAC,IAAI,CAAC,4DAA4D,CAAC,CAAC;IAEzE,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { dispatchEvent, executeHook, dryRunDispatch } from './core.js';
|
|
2
|
+
export { buildSpecCreatedPayload, buildStatusChangePayload, buildDriftDetectedPayload, buildCommitPayload, matchesFilter, matchesGlob, } from './triggers.js';
|
|
3
|
+
export { generateGitHookScript, generateGitHooks, formatGitHookInstallGuide, } from './git-hook-generator.js';
|
|
4
|
+
export { listTemplateNames, getTemplate, getAllTemplates } from './templates.js';
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/engine/hooks/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AACvE,OAAO,EACL,uBAAuB,EACvB,wBAAwB,EACxB,yBAAyB,EACzB,kBAAkB,EAClB,aAAa,EACb,WAAW,GACZ,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,qBAAqB,EACrB,gBAAgB,EAChB,yBAAyB,GAC1B,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
// engine/hooks/index.ts — Barrel export for hooks engine (SPEC-071)
|
|
2
|
+
export { dispatchEvent, executeHook, dryRunDispatch } from './core.js';
|
|
3
|
+
export { buildSpecCreatedPayload, buildStatusChangePayload, buildDriftDetectedPayload, buildCommitPayload, matchesFilter, matchesGlob, } from './triggers.js';
|
|
4
|
+
export { generateGitHookScript, generateGitHooks, formatGitHookInstallGuide, } from './git-hook-generator.js';
|
|
5
|
+
export { listTemplateNames, getTemplate, getAllTemplates } from './templates.js';
|
|
6
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/engine/hooks/index.ts"],"names":[],"mappings":"AAAA,oEAAoE;AACpE,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AACvE,OAAO,EACL,uBAAuB,EACvB,wBAAwB,EACxB,yBAAyB,EACzB,kBAAkB,EAClB,aAAa,EACb,WAAW,GACZ,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,qBAAqB,EACrB,gBAAgB,EAChB,yBAAyB,GAC1B,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { HookTemplate } from '../../types/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Return all available template names.
|
|
4
|
+
*/
|
|
5
|
+
export declare function listTemplateNames(): string[];
|
|
6
|
+
/**
|
|
7
|
+
* Return a template by name, or undefined if not found.
|
|
8
|
+
*/
|
|
9
|
+
export declare function getTemplate(name: string): HookTemplate | undefined;
|
|
10
|
+
/**
|
|
11
|
+
* Return all templates.
|
|
12
|
+
*/
|
|
13
|
+
export declare function getAllTemplates(): HookTemplate[];
|
|
14
|
+
//# sourceMappingURL=templates.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../../src/engine/hooks/templates.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AA+HzD;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,EAAE,CAE5C;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAElE;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,YAAY,EAAE,CAEhD"}
|