@planu/cli 0.43.0 → 0.44.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/cli/colors.d.ts +14 -0
- package/dist/cli/colors.d.ts.map +1 -0
- package/dist/cli/colors.js +26 -0
- package/dist/cli/colors.js.map +1 -0
- package/dist/cli/commands/audit.d.ts +3 -0
- package/dist/cli/commands/audit.d.ts.map +1 -0
- package/dist/cli/commands/audit.js +38 -0
- package/dist/cli/commands/audit.js.map +1 -0
- package/dist/cli/commands/create.d.ts +3 -0
- package/dist/cli/commands/create.d.ts.map +1 -0
- package/dist/cli/commands/create.js +50 -0
- package/dist/cli/commands/create.js.map +1 -0
- package/dist/cli/commands/dashboard.d.ts +3 -0
- package/dist/cli/commands/dashboard.d.ts.map +1 -0
- package/dist/cli/commands/dashboard.js +29 -0
- package/dist/cli/commands/dashboard.js.map +1 -0
- package/dist/cli/commands/estimate.d.ts +3 -0
- package/dist/cli/commands/estimate.d.ts.map +1 -0
- package/dist/cli/commands/estimate.js +36 -0
- package/dist/cli/commands/estimate.js.map +1 -0
- package/dist/cli/commands/handoff.d.ts +3 -0
- package/dist/cli/commands/handoff.d.ts.map +1 -0
- package/dist/cli/commands/handoff.js +49 -0
- package/dist/cli/commands/handoff.js.map +1 -0
- package/dist/cli/commands/init.d.ts +3 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +43 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/list.d.ts +3 -0
- package/dist/cli/commands/list.d.ts.map +1 -0
- package/dist/cli/commands/list.js +36 -0
- package/dist/cli/commands/list.js.map +1 -0
- package/dist/cli/commands/serve.d.ts +3 -0
- package/dist/cli/commands/serve.d.ts.map +1 -0
- package/dist/cli/commands/serve.js +34 -0
- package/dist/cli/commands/serve.js.map +1 -0
- package/dist/cli/commands/status.d.ts +3 -0
- package/dist/cli/commands/status.d.ts.map +1 -0
- package/dist/cli/commands/status.js +49 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/commands/validate.d.ts +3 -0
- package/dist/cli/commands/validate.d.ts.map +1 -0
- package/dist/cli/commands/validate.js +36 -0
- package/dist/cli/commands/validate.js.map +1 -0
- package/dist/cli/commands/watch.d.ts +3 -0
- package/dist/cli/commands/watch.d.ts.map +1 -0
- package/dist/cli/commands/watch.js +156 -0
- package/dist/cli/commands/watch.js.map +1 -0
- package/dist/cli/formatter.d.ts +18 -0
- package/dist/cli/formatter.d.ts.map +1 -0
- package/dist/cli/formatter.js +78 -0
- package/dist/cli/formatter.js.map +1 -0
- package/dist/cli/index.d.ts +6 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +7 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/interactive.d.ts +13 -0
- package/dist/cli/interactive.d.ts.map +1 -0
- package/dist/cli/interactive.js +42 -0
- package/dist/cli/interactive.js.map +1 -0
- package/dist/cli/project-detector.d.ts +6 -0
- package/dist/cli/project-detector.d.ts.map +1 -0
- package/dist/cli/project-detector.js +12 -0
- package/dist/cli/project-detector.js.map +1 -0
- package/dist/cli/router.d.ts +5 -0
- package/dist/cli/router.d.ts.map +1 -0
- package/dist/cli/router.js +104 -0
- package/dist/cli/router.js.map +1 -0
- package/dist/config/hook-defaults.json +19 -0
- package/dist/config/license-plans.json +16 -1
- package/dist/config/tool-groups.json +12 -1
- package/dist/engine/analyzer/analyze-project.d.ts +15 -0
- package/dist/engine/analyzer/analyze-project.d.ts.map +1 -0
- package/dist/engine/analyzer/analyze-project.js +101 -0
- package/dist/engine/analyzer/analyze-project.js.map +1 -0
- package/dist/engine/analyzer/completeness-checker.d.ts +6 -0
- package/dist/engine/analyzer/completeness-checker.d.ts.map +1 -0
- package/dist/engine/analyzer/completeness-checker.js +79 -0
- package/dist/engine/analyzer/completeness-checker.js.map +1 -0
- package/dist/engine/analyzer/db-engine.d.ts +9 -0
- package/dist/engine/analyzer/db-engine.d.ts.map +1 -0
- package/dist/engine/analyzer/db-engine.js +137 -0
- package/dist/engine/analyzer/db-engine.js.map +1 -0
- package/dist/engine/analyzer/detectors.d.ts +7 -0
- package/dist/engine/analyzer/detectors.d.ts.map +1 -0
- package/dist/engine/analyzer/detectors.js +234 -0
- package/dist/engine/analyzer/detectors.js.map +1 -0
- package/dist/engine/analyzer/env-setup.d.ts +6 -0
- package/dist/engine/analyzer/env-setup.d.ts.map +1 -0
- package/dist/engine/analyzer/env-setup.js +174 -0
- package/dist/engine/analyzer/env-setup.js.map +1 -0
- package/dist/engine/analyzer/index.d.ts +6 -0
- package/dist/engine/analyzer/index.d.ts.map +1 -0
- package/dist/engine/analyzer/index.js +8 -0
- package/dist/engine/analyzer/index.js.map +1 -0
- package/dist/engine/analyzer-db.d.ts +1 -8
- package/dist/engine/analyzer-db.d.ts.map +1 -1
- package/dist/engine/analyzer-db.js +3 -136
- package/dist/engine/analyzer-db.js.map +1 -1
- package/dist/engine/analyzer-detectors.d.ts +1 -6
- package/dist/engine/analyzer-detectors.d.ts.map +1 -1
- package/dist/engine/analyzer-detectors.js +3 -231
- package/dist/engine/analyzer-detectors.js.map +1 -1
- package/dist/engine/analyzer-env.d.ts +1 -5
- package/dist/engine/analyzer-env.d.ts.map +1 -1
- package/dist/engine/analyzer-env.js +3 -173
- package/dist/engine/analyzer-env.js.map +1 -1
- package/dist/engine/analyzer.d.ts +2 -18
- package/dist/engine/analyzer.d.ts.map +1 -1
- package/dist/engine/analyzer.js +4 -172
- package/dist/engine/analyzer.js.map +1 -1
- package/dist/engine/dashboard/data-loader.d.ts +16 -1
- package/dist/engine/dashboard/data-loader.d.ts.map +1 -1
- package/dist/engine/dashboard/data-loader.js +140 -2
- package/dist/engine/dashboard/data-loader.js.map +1 -1
- package/dist/engine/dashboard/index.d.ts +2 -0
- package/dist/engine/dashboard/index.d.ts.map +1 -1
- package/dist/engine/dashboard/index.js +2 -0
- package/dist/engine/dashboard/index.js.map +1 -1
- package/dist/engine/dashboard/kanban-logic.d.ts +31 -0
- package/dist/engine/dashboard/kanban-logic.d.ts.map +1 -0
- package/dist/engine/dashboard/kanban-logic.js +122 -0
- package/dist/engine/dashboard/kanban-logic.js.map +1 -0
- package/dist/engine/dashboard/routes.d.ts +2 -0
- package/dist/engine/dashboard/routes.d.ts.map +1 -1
- package/dist/engine/dashboard/routes.js +112 -23
- package/dist/engine/dashboard/routes.js.map +1 -1
- package/dist/engine/dashboard/server.d.ts +5 -0
- package/dist/engine/dashboard/server.d.ts.map +1 -1
- package/dist/engine/dashboard/server.js +48 -0
- package/dist/engine/dashboard/server.js.map +1 -1
- package/dist/engine/dashboard/spec-updater.d.ts +8 -0
- package/dist/engine/dashboard/spec-updater.d.ts.map +1 -0
- package/dist/engine/dashboard/spec-updater.js +37 -0
- package/dist/engine/dashboard/spec-updater.js.map +1 -0
- package/dist/engine/dashboard/templates-kanban.d.ts +6 -0
- package/dist/engine/dashboard/templates-kanban.d.ts.map +1 -0
- package/dist/engine/dashboard/templates-kanban.js +100 -0
- package/dist/engine/dashboard/templates-kanban.js.map +1 -0
- package/dist/engine/dashboard/templates-layout.d.ts +3 -3
- package/dist/engine/dashboard/templates-layout.d.ts.map +1 -1
- package/dist/engine/dashboard/templates-layout.js +167 -44
- package/dist/engine/dashboard/templates-layout.js.map +1 -1
- package/dist/engine/dashboard/templates-project.d.ts +1 -1
- package/dist/engine/dashboard/templates-project.d.ts.map +1 -1
- package/dist/engine/dashboard/templates-project.js +109 -3
- package/dist/engine/dashboard/templates-project.js.map +1 -1
- package/dist/engine/dashboard/templates.d.ts +1 -0
- package/dist/engine/dashboard/templates.d.ts.map +1 -1
- package/dist/engine/dashboard/templates.js +1 -0
- package/dist/engine/dashboard/templates.js.map +1 -1
- package/dist/engine/docs-site-generator/spec-renderer.d.ts.map +1 -1
- package/dist/engine/docs-site-generator/spec-renderer.js +2 -1
- package/dist/engine/docs-site-generator/spec-renderer.js.map +1 -1
- package/dist/engine/execution-plan/agent-execution-plan.d.ts.map +1 -1
- package/dist/engine/execution-plan/agent-execution-plan.js +2 -0
- package/dist/engine/execution-plan/agent-execution-plan.js.map +1 -1
- package/dist/engine/hooks/config-loader.d.ts +36 -0
- package/dist/engine/hooks/config-loader.d.ts.map +1 -0
- package/dist/engine/hooks/config-loader.js +142 -0
- package/dist/engine/hooks/config-loader.js.map +1 -0
- package/dist/engine/hooks/debouncer.d.ts +30 -0
- package/dist/engine/hooks/debouncer.d.ts.map +1 -0
- package/dist/engine/hooks/debouncer.js +124 -0
- package/dist/engine/hooks/debouncer.js.map +1 -0
- package/dist/engine/hooks/event-bus.d.ts +40 -0
- package/dist/engine/hooks/event-bus.d.ts.map +1 -0
- package/dist/engine/hooks/event-bus.js +83 -0
- package/dist/engine/hooks/event-bus.js.map +1 -0
- package/dist/engine/hooks/file-watcher.d.ts +48 -0
- package/dist/engine/hooks/file-watcher.d.ts.map +1 -0
- package/dist/engine/hooks/file-watcher.js +193 -0
- package/dist/engine/hooks/file-watcher.js.map +1 -0
- package/dist/engine/hooks/handlers/on-commit.d.ts +26 -0
- package/dist/engine/hooks/handlers/on-commit.d.ts.map +1 -0
- package/dist/engine/hooks/handlers/on-commit.js +198 -0
- package/dist/engine/hooks/handlers/on-commit.js.map +1 -0
- package/dist/engine/hooks/handlers/on-create.d.ts +8 -0
- package/dist/engine/hooks/handlers/on-create.d.ts.map +1 -0
- package/dist/engine/hooks/handlers/on-create.js +30 -0
- package/dist/engine/hooks/handlers/on-create.js.map +1 -0
- package/dist/engine/hooks/handlers/on-delete.d.ts +9 -0
- package/dist/engine/hooks/handlers/on-delete.d.ts.map +1 -0
- package/dist/engine/hooks/handlers/on-delete.js +33 -0
- package/dist/engine/hooks/handlers/on-delete.js.map +1 -0
- package/dist/engine/hooks/handlers/on-save.d.ts +29 -0
- package/dist/engine/hooks/handlers/on-save.d.ts.map +1 -0
- package/dist/engine/hooks/handlers/on-save.js +118 -0
- package/dist/engine/hooks/handlers/on-save.js.map +1 -0
- package/dist/engine/hooks/handlers/on-test-pass.d.ts +33 -0
- package/dist/engine/hooks/handlers/on-test-pass.d.ts.map +1 -0
- package/dist/engine/hooks/handlers/on-test-pass.js +103 -0
- package/dist/engine/hooks/handlers/on-test-pass.js.map +1 -0
- package/dist/engine/hooks/hook-engine.d.ts +50 -0
- package/dist/engine/hooks/hook-engine.d.ts.map +1 -0
- package/dist/engine/hooks/hook-engine.js +159 -0
- package/dist/engine/hooks/hook-engine.js.map +1 -0
- package/dist/engine/hooks/index.d.ts +10 -0
- package/dist/engine/hooks/index.d.ts.map +1 -1
- package/dist/engine/hooks/index.js +12 -0
- package/dist/engine/hooks/index.js.map +1 -1
- package/dist/engine/living-spec/annotation-parser.d.ts +18 -0
- package/dist/engine/living-spec/annotation-parser.d.ts.map +1 -0
- package/dist/engine/living-spec/annotation-parser.js +105 -0
- package/dist/engine/living-spec/annotation-parser.js.map +1 -0
- package/dist/engine/living-spec/auto-reconciler.d.ts +28 -0
- package/dist/engine/living-spec/auto-reconciler.d.ts.map +1 -0
- package/dist/engine/living-spec/auto-reconciler.js +103 -0
- package/dist/engine/living-spec/auto-reconciler.js.map +1 -0
- package/dist/engine/living-spec/bidirectional-sync.d.ts +26 -0
- package/dist/engine/living-spec/bidirectional-sync.d.ts.map +1 -0
- package/dist/engine/living-spec/bidirectional-sync.js +160 -0
- package/dist/engine/living-spec/bidirectional-sync.js.map +1 -0
- package/dist/engine/living-spec/dashboard-collector.d.ts +22 -0
- package/dist/engine/living-spec/dashboard-collector.d.ts.map +1 -0
- package/dist/engine/living-spec/dashboard-collector.js +97 -0
- package/dist/engine/living-spec/dashboard-collector.js.map +1 -0
- package/dist/engine/living-spec/drift-watcher.d.ts +15 -0
- package/dist/engine/living-spec/drift-watcher.d.ts.map +1 -0
- package/dist/engine/living-spec/drift-watcher.js +126 -0
- package/dist/engine/living-spec/drift-watcher.js.map +1 -0
- package/dist/engine/living-spec/hash-tracker.d.ts +24 -0
- package/dist/engine/living-spec/hash-tracker.d.ts.map +1 -0
- package/dist/engine/living-spec/hash-tracker.js +123 -0
- package/dist/engine/living-spec/hash-tracker.js.map +1 -0
- package/dist/engine/living-spec/index.d.ts +9 -0
- package/dist/engine/living-spec/index.d.ts.map +1 -0
- package/dist/engine/living-spec/index.js +10 -0
- package/dist/engine/living-spec/index.js.map +1 -0
- package/dist/engine/living-spec/signature-tracker.d.ts +18 -0
- package/dist/engine/living-spec/signature-tracker.d.ts.map +1 -0
- package/dist/engine/living-spec/signature-tracker.js +136 -0
- package/dist/engine/living-spec/signature-tracker.js.map +1 -0
- package/dist/engine/living-spec/test-coverage-correlator.d.ts +22 -0
- package/dist/engine/living-spec/test-coverage-correlator.d.ts.map +1 -0
- package/dist/engine/living-spec/test-coverage-correlator.js +130 -0
- package/dist/engine/living-spec/test-coverage-correlator.js.map +1 -0
- package/dist/engine/llm-providers/cost-tracker.d.ts.map +1 -1
- package/dist/engine/llm-providers/cost-tracker.js +1 -0
- package/dist/engine/llm-providers/cost-tracker.js.map +1 -1
- package/dist/engine/llm-providers/load-balancer.d.ts.map +1 -1
- package/dist/engine/llm-providers/load-balancer.js +3 -0
- package/dist/engine/llm-providers/load-balancer.js.map +1 -1
- package/dist/engine/plugins/extensions/tool-extension.d.ts.map +1 -1
- package/dist/engine/plugins/extensions/tool-extension.js +1 -0
- package/dist/engine/plugins/extensions/tool-extension.js.map +1 -1
- package/dist/engine/plugins/extensions/worker-extension.d.ts.map +1 -1
- package/dist/engine/plugins/extensions/worker-extension.js +3 -1
- package/dist/engine/plugins/extensions/worker-extension.js.map +1 -1
- package/dist/engine/plugins/loader.d.ts.map +1 -1
- package/dist/engine/plugins/loader.js +3 -0
- package/dist/engine/plugins/loader.js.map +1 -1
- package/dist/engine/safety/file-mutex.d.ts.map +1 -1
- package/dist/engine/safety/file-mutex.js +3 -0
- package/dist/engine/safety/file-mutex.js.map +1 -1
- package/dist/engine/safety/health-monitor.d.ts.map +1 -1
- package/dist/engine/safety/health-monitor.js +3 -0
- package/dist/engine/safety/health-monitor.js.map +1 -1
- package/dist/engine/safety/transaction.d.ts.map +1 -1
- package/dist/engine/safety/transaction.js +3 -0
- package/dist/engine/safety/transaction.js.map +1 -1
- package/dist/engine/spec-templates/custom-loader.d.ts.map +1 -1
- package/dist/engine/spec-templates/custom-loader.js +1 -0
- package/dist/engine/spec-templates/custom-loader.js.map +1 -1
- package/dist/index.js +29 -0
- package/dist/index.js.map +1 -1
- package/dist/storage/hash-snapshot-store.d.ts +18 -0
- package/dist/storage/hash-snapshot-store.d.ts.map +1 -0
- package/dist/storage/hash-snapshot-store.js +43 -0
- package/dist/storage/hash-snapshot-store.js.map +1 -0
- package/dist/storage/index.d.ts +3 -0
- package/dist/storage/index.d.ts.map +1 -1
- package/dist/storage/index.js +3 -0
- package/dist/storage/index.js.map +1 -1
- package/dist/storage/living-dashboard-store.d.ts +10 -0
- package/dist/storage/living-dashboard-store.d.ts.map +1 -0
- package/dist/storage/living-dashboard-store.js +31 -0
- package/dist/storage/living-dashboard-store.js.map +1 -0
- package/dist/storage/sync-log-store.d.ts +26 -0
- package/dist/storage/sync-log-store.d.ts.map +1 -0
- package/dist/storage/sync-log-store.js +60 -0
- package/dist/storage/sync-log-store.js.map +1 -0
- package/dist/tools/auto-reconcile.d.ts +3 -0
- package/dist/tools/auto-reconcile.d.ts.map +1 -0
- package/dist/tools/auto-reconcile.js +81 -0
- package/dist/tools/auto-reconcile.js.map +1 -0
- package/dist/tools/challenge-spec/platform-challenge-scenarios-b2.d.ts.map +1 -1
- package/dist/tools/challenge-spec/platform-challenge-scenarios-b2.js +6 -0
- package/dist/tools/challenge-spec/platform-challenge-scenarios-b2.js.map +1 -1
- package/dist/tools/create-spec/spec-builder.js +2 -0
- package/dist/tools/create-spec/spec-builder.js.map +1 -1
- package/dist/tools/dashboard.d.ts.map +1 -1
- package/dist/tools/dashboard.js +20 -13
- package/dist/tools/dashboard.js.map +1 -1
- package/dist/tools/generate-annotations.d.ts +3 -0
- package/dist/tools/generate-annotations.d.ts.map +1 -0
- package/dist/tools/generate-annotations.js +70 -0
- package/dist/tools/generate-annotations.js.map +1 -0
- package/dist/tools/generate-execution-plan.d.ts.map +1 -1
- package/dist/tools/generate-execution-plan.js +1 -0
- package/dist/tools/generate-execution-plan.js.map +1 -1
- package/dist/tools/github-pr-handler.d.ts.map +1 -1
- package/dist/tools/github-pr-handler.js +1 -0
- package/dist/tools/github-pr-handler.js.map +1 -1
- package/dist/tools/github-review-handler.d.ts.map +1 -1
- package/dist/tools/github-review-handler.js +1 -0
- package/dist/tools/github-review-handler.js.map +1 -1
- package/dist/tools/ide-config-handler.d.ts.map +1 -1
- package/dist/tools/ide-config-handler.js +3 -0
- package/dist/tools/ide-config-handler.js.map +1 -1
- package/dist/tools/init-project/handler.d.ts.map +1 -1
- package/dist/tools/init-project/handler.js +0 -3
- package/dist/tools/init-project/handler.js.map +1 -1
- package/dist/tools/living-spec-coverage.d.ts +3 -0
- package/dist/tools/living-spec-coverage.d.ts.map +1 -0
- package/dist/tools/living-spec-coverage.js +100 -0
- package/dist/tools/living-spec-coverage.js.map +1 -0
- package/dist/tools/living-spec-watch.d.ts +4 -0
- package/dist/tools/living-spec-watch.d.ts.map +1 -0
- package/dist/tools/living-spec-watch.js +94 -0
- package/dist/tools/living-spec-watch.js.map +1 -0
- package/dist/tools/manage-plugins-handler.d.ts.map +1 -1
- package/dist/tools/manage-plugins-handler.js +2 -1
- package/dist/tools/manage-plugins-handler.js.map +1 -1
- package/dist/tools/orchestrate-distribution.d.ts.map +1 -1
- package/dist/tools/orchestrate-distribution.js +1 -0
- package/dist/tools/orchestrate-distribution.js.map +1 -1
- package/dist/tools/orchestrate-runtime.js +2 -0
- package/dist/tools/orchestrate-runtime.js.map +1 -1
- package/dist/tools/plan-team-distribution.d.ts.map +1 -1
- package/dist/tools/plan-team-distribution.js +2 -0
- package/dist/tools/plan-team-distribution.js.map +1 -1
- package/dist/tools/register-dashboard-tools.d.ts.map +1 -1
- package/dist/tools/register-dashboard-tools.js +5 -1
- package/dist/tools/register-dashboard-tools.js.map +1 -1
- package/dist/tools/register-hooks-tools.d.ts.map +1 -1
- package/dist/tools/register-hooks-tools.js +82 -1
- package/dist/tools/register-hooks-tools.js.map +1 -1
- package/dist/tools/register-living-spec-advanced-tools.d.ts +6 -0
- package/dist/tools/register-living-spec-advanced-tools.d.ts.map +1 -0
- package/dist/tools/register-living-spec-advanced-tools.js +113 -0
- package/dist/tools/register-living-spec-advanced-tools.js.map +1 -0
- package/dist/tools/register-living-spec-tools.d.ts +6 -0
- package/dist/tools/register-living-spec-tools.d.ts.map +1 -0
- package/dist/tools/register-living-spec-tools.js +67 -0
- package/dist/tools/register-living-spec-tools.js.map +1 -0
- package/dist/tools/resolve-sync-conflict.d.ts +3 -0
- package/dist/tools/resolve-sync-conflict.d.ts.map +1 -0
- package/dist/tools/resolve-sync-conflict.js +38 -0
- package/dist/tools/resolve-sync-conflict.js.map +1 -0
- package/dist/tools/snapshot-spec-hashes.d.ts +3 -0
- package/dist/tools/snapshot-spec-hashes.d.ts.map +1 -0
- package/dist/tools/snapshot-spec-hashes.js +100 -0
- package/dist/tools/snapshot-spec-hashes.js.map +1 -0
- package/dist/tools/spec-diff.d.ts +3 -0
- package/dist/tools/spec-diff.d.ts.map +1 -0
- package/dist/tools/spec-diff.js +58 -0
- package/dist/tools/spec-diff.js.map +1 -0
- package/dist/tools/start-hooks.d.ts +17 -0
- package/dist/tools/start-hooks.d.ts.map +1 -0
- package/dist/tools/start-hooks.js +209 -0
- package/dist/tools/start-hooks.js.map +1 -0
- package/dist/tools/suggest-tooling/catalog-loader.d.ts.map +1 -1
- package/dist/tools/suggest-tooling/catalog-loader.js +1 -0
- package/dist/tools/suggest-tooling/catalog-loader.js.map +1 -1
- package/dist/tools/sync-code-to-spec.d.ts +3 -0
- package/dist/tools/sync-code-to-spec.d.ts.map +1 -0
- package/dist/tools/sync-code-to-spec.js +51 -0
- package/dist/tools/sync-code-to-spec.js.map +1 -0
- package/dist/tools/sync-spec-to-code.d.ts +3 -0
- package/dist/tools/sync-spec-to-code.d.ts.map +1 -0
- package/dist/tools/sync-spec-to-code.js +58 -0
- package/dist/tools/sync-spec-to-code.js.map +1 -0
- package/dist/tools/validate-annotations.d.ts +3 -0
- package/dist/tools/validate-annotations.d.ts.map +1 -0
- package/dist/tools/validate-annotations.js +90 -0
- package/dist/tools/validate-annotations.js.map +1 -0
- package/dist/types/cli.d.ts +14 -0
- package/dist/types/cli.d.ts.map +1 -0
- package/dist/types/cli.js +3 -0
- package/dist/types/cli.js.map +1 -0
- package/dist/types/dashboard.d.ts +86 -1
- package/dist/types/dashboard.d.ts.map +1 -1
- package/dist/types/file-hooks.d.ts +230 -0
- package/dist/types/file-hooks.d.ts.map +1 -0
- package/dist/types/file-hooks.js +3 -0
- package/dist/types/file-hooks.js.map +1 -0
- package/dist/types/index.d.ts +3 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +3 -0
- package/dist/types/index.js.map +1 -1
- package/dist/types/living-spec.d.ts +382 -0
- package/dist/types/living-spec.d.ts.map +1 -0
- package/dist/types/living-spec.js +3 -0
- package/dist/types/living-spec.js.map +1 -0
- package/package.json +1 -1
- package/src/config/hook-defaults.json +19 -0
- package/src/config/license-plans.json +16 -1
- package/src/config/tool-groups.json +12 -1
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
// engine/hooks/file-watcher.ts — File system watcher with normalized events (SPEC-129)
|
|
2
|
+
import { EventEmitter } from 'node:events';
|
|
3
|
+
import { watch } from 'node:fs';
|
|
4
|
+
import { stat } from 'node:fs/promises';
|
|
5
|
+
import { normalize, sep } from 'node:path';
|
|
6
|
+
// ---------------------------------------------------------------------------
|
|
7
|
+
// Glob matching (simple, no external deps)
|
|
8
|
+
// ---------------------------------------------------------------------------
|
|
9
|
+
/**
|
|
10
|
+
* Convert a glob pattern to a RegExp. Supports:
|
|
11
|
+
* - `**` matches any path segment (including nested)
|
|
12
|
+
* - `*` matches any characters except path separator
|
|
13
|
+
* - `?` matches a single character
|
|
14
|
+
*/
|
|
15
|
+
export function globToRegex(pattern) {
|
|
16
|
+
let regex = '';
|
|
17
|
+
let i = 0;
|
|
18
|
+
while (i < pattern.length) {
|
|
19
|
+
const ch = pattern.charAt(i);
|
|
20
|
+
if (ch === '*' && pattern.charAt(i + 1) === '*') {
|
|
21
|
+
// ** matches everything including /
|
|
22
|
+
regex += '.*';
|
|
23
|
+
i += 2;
|
|
24
|
+
// skip trailing /
|
|
25
|
+
if (pattern.charAt(i) === '/') {
|
|
26
|
+
i++;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
else if (ch === '*') {
|
|
30
|
+
// * matches everything except /
|
|
31
|
+
regex += '[^/]*';
|
|
32
|
+
i++;
|
|
33
|
+
}
|
|
34
|
+
else if (ch === '?') {
|
|
35
|
+
regex += '[^/]';
|
|
36
|
+
i++;
|
|
37
|
+
}
|
|
38
|
+
else if (ch === '.') {
|
|
39
|
+
regex += '\\.';
|
|
40
|
+
i++;
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
regex += ch;
|
|
44
|
+
i++;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return new RegExp(`^${regex}$`);
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Test whether `filePath` matches a glob pattern.
|
|
51
|
+
*/
|
|
52
|
+
export function matchesGlobPattern(filePath, pattern) {
|
|
53
|
+
const normalized = filePath.replace(/\\/g, '/');
|
|
54
|
+
return globToRegex(pattern).test(normalized);
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Returns true if filePath matches any include pattern
|
|
58
|
+
* and does not match any exclude pattern.
|
|
59
|
+
*/
|
|
60
|
+
export function matchesPatterns(filePath, include, exclude) {
|
|
61
|
+
// If no include patterns, match everything
|
|
62
|
+
const included = !include || include.length === 0 || include.some((p) => matchesGlobPattern(filePath, p));
|
|
63
|
+
if (!included) {
|
|
64
|
+
return false;
|
|
65
|
+
}
|
|
66
|
+
// If any exclude matches, reject
|
|
67
|
+
if (exclude?.some((p) => matchesGlobPattern(filePath, p))) {
|
|
68
|
+
return false;
|
|
69
|
+
}
|
|
70
|
+
return true;
|
|
71
|
+
}
|
|
72
|
+
// ---------------------------------------------------------------------------
|
|
73
|
+
// Default excludes
|
|
74
|
+
// ---------------------------------------------------------------------------
|
|
75
|
+
const DEFAULT_EXCLUDES = ['data/**', 'node_modules/**', '.git/**'];
|
|
76
|
+
// ---------------------------------------------------------------------------
|
|
77
|
+
// FileWatcher
|
|
78
|
+
// ---------------------------------------------------------------------------
|
|
79
|
+
export class FileWatcher extends EventEmitter {
|
|
80
|
+
watcher = null;
|
|
81
|
+
rootDir;
|
|
82
|
+
include;
|
|
83
|
+
exclude;
|
|
84
|
+
/** Track known files to distinguish create vs modify */
|
|
85
|
+
knownFiles = new Set();
|
|
86
|
+
closed = false;
|
|
87
|
+
constructor(options) {
|
|
88
|
+
super();
|
|
89
|
+
this.rootDir = normalize(options.rootDir);
|
|
90
|
+
this.include = options.include ?? [];
|
|
91
|
+
this.exclude = [...DEFAULT_EXCLUDES, ...(options.exclude ?? [])];
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Start watching. Emits 'change' events with WatcherEvent payloads.
|
|
95
|
+
* Emits 'error' on watch failure — never throws.
|
|
96
|
+
*/
|
|
97
|
+
start() {
|
|
98
|
+
if (this.closed) {
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
try {
|
|
102
|
+
this.watcher = watch(this.rootDir, { recursive: true }, (_eventType, filename) => {
|
|
103
|
+
if (!filename || this.closed) {
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
// Normalize path separator
|
|
107
|
+
const relPath = filename.replace(/\\/g, '/');
|
|
108
|
+
void this.handleFsEvent(relPath);
|
|
109
|
+
});
|
|
110
|
+
this.watcher.on('error', (err) => {
|
|
111
|
+
this.emit('error', err);
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
catch (err) {
|
|
115
|
+
this.emit('error', err);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Mark a file as known (pre-existing). Call this for initial file scan.
|
|
120
|
+
*/
|
|
121
|
+
addKnownFile(relPath) {
|
|
122
|
+
this.knownFiles.add(relPath.replace(/\\/g, '/'));
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Mark multiple files as known.
|
|
126
|
+
*/
|
|
127
|
+
addKnownFiles(paths) {
|
|
128
|
+
for (const p of paths) {
|
|
129
|
+
this.knownFiles.add(p.replace(/\\/g, '/'));
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Graceful shutdown: release all handles.
|
|
134
|
+
*/
|
|
135
|
+
close() {
|
|
136
|
+
this.closed = true;
|
|
137
|
+
if (this.watcher) {
|
|
138
|
+
this.watcher.close();
|
|
139
|
+
this.watcher = null;
|
|
140
|
+
}
|
|
141
|
+
this.removeAllListeners();
|
|
142
|
+
}
|
|
143
|
+
// ---------------------------------------------------------------------------
|
|
144
|
+
// Private
|
|
145
|
+
// ---------------------------------------------------------------------------
|
|
146
|
+
async handleFsEvent(relPath) {
|
|
147
|
+
try {
|
|
148
|
+
// Check exclude patterns first
|
|
149
|
+
if (this.exclude.some((p) => matchesGlobPattern(relPath, p))) {
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
// Check include patterns
|
|
153
|
+
if (this.include.length > 0 && !this.include.some((p) => matchesGlobPattern(relPath, p))) {
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
const evType = await this.determineEventType(relPath);
|
|
157
|
+
if (!evType) {
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
const event = {
|
|
161
|
+
type: evType,
|
|
162
|
+
path: relPath,
|
|
163
|
+
timestamp: Date.now(),
|
|
164
|
+
};
|
|
165
|
+
this.emit('change', event);
|
|
166
|
+
}
|
|
167
|
+
catch (err) {
|
|
168
|
+
this.emit('error', err);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
async determineEventType(relPath) {
|
|
172
|
+
const fullPath = [this.rootDir, relPath].join(sep).replace(/\//g, sep);
|
|
173
|
+
try {
|
|
174
|
+
await stat(fullPath);
|
|
175
|
+
// File exists
|
|
176
|
+
if (this.knownFiles.has(relPath)) {
|
|
177
|
+
return 'modify';
|
|
178
|
+
}
|
|
179
|
+
this.knownFiles.add(relPath);
|
|
180
|
+
return 'create';
|
|
181
|
+
}
|
|
182
|
+
catch {
|
|
183
|
+
// File doesn't exist — it was deleted
|
|
184
|
+
if (this.knownFiles.has(relPath)) {
|
|
185
|
+
this.knownFiles.delete(relPath);
|
|
186
|
+
return 'delete';
|
|
187
|
+
}
|
|
188
|
+
// Unknown file deleted — still report
|
|
189
|
+
return 'delete';
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
//# sourceMappingURL=file-watcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-watcher.js","sourceRoot":"","sources":["../../../src/engine/hooks/file-watcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { OnCommitHookResult, OnCommitContext } from '../../../types/file-hooks.js';
|
|
2
|
+
/**
|
|
3
|
+
* Install a Planu post-commit git hook.
|
|
4
|
+
* If a hook already exists, appends the Planu section.
|
|
5
|
+
*/
|
|
6
|
+
export declare function installGitHook(projectPath: string): Promise<{
|
|
7
|
+
installed: boolean;
|
|
8
|
+
path: string;
|
|
9
|
+
}>;
|
|
10
|
+
/**
|
|
11
|
+
* Uninstall the Planu post-commit hook section.
|
|
12
|
+
* Removes only the Planu-marked section, preserving other hooks.
|
|
13
|
+
*/
|
|
14
|
+
export declare function uninstallGitHook(projectPath: string): Promise<{
|
|
15
|
+
uninstalled: boolean;
|
|
16
|
+
path: string;
|
|
17
|
+
}>;
|
|
18
|
+
/**
|
|
19
|
+
* Handle on-commit event.
|
|
20
|
+
* - Gets committed files
|
|
21
|
+
* - Runs spec integrity check
|
|
22
|
+
* - Identifies specs that may need reconciliation
|
|
23
|
+
* - Non-blocking, async
|
|
24
|
+
*/
|
|
25
|
+
export declare function handleOnCommit(ctx: OnCommitContext): Promise<OnCommitHookResult>;
|
|
26
|
+
//# sourceMappingURL=on-commit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"on-commit.d.ts","sourceRoot":"","sources":["../../../../src/engine/hooks/handlers/on-commit.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAgBxF;;;GAGG;AACH,wBAAsB,cAAc,CAClC,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC;IAAE,SAAS,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAwB/C;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC;IAAE,WAAW,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAoCjD;AAuGD;;;;;;GAMG;AACH,wBAAsB,cAAc,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAgCtF"}
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
// engine/hooks/handlers/on-commit.ts — on-commit hook handler (SPEC-130)
|
|
2
|
+
// Git post-commit integration: integrity check + auto-reconcile.
|
|
3
|
+
import { execFile } from 'node:child_process';
|
|
4
|
+
import { readFile, writeFile, chmod, unlink } from 'node:fs/promises';
|
|
5
|
+
import { join } from 'node:path';
|
|
6
|
+
import { promisify } from 'node:util';
|
|
7
|
+
import { extractSpecAnnotations } from './on-save.js';
|
|
8
|
+
const execFileAsync = promisify(execFile);
|
|
9
|
+
// ---------------------------------------------------------------------------
|
|
10
|
+
// Constants
|
|
11
|
+
// ---------------------------------------------------------------------------
|
|
12
|
+
const POST_COMMIT_HOOK_PATH = '.git/hooks/post-commit';
|
|
13
|
+
const PLANU_HOOK_MARKER = '# PLANU-HOOK-MARKER';
|
|
14
|
+
// ---------------------------------------------------------------------------
|
|
15
|
+
// Git hook install/uninstall
|
|
16
|
+
// ---------------------------------------------------------------------------
|
|
17
|
+
/**
|
|
18
|
+
* Install a Planu post-commit git hook.
|
|
19
|
+
* If a hook already exists, appends the Planu section.
|
|
20
|
+
*/
|
|
21
|
+
export async function installGitHook(projectPath) {
|
|
22
|
+
const hookPath = join(projectPath, POST_COMMIT_HOOK_PATH);
|
|
23
|
+
const hookScript = buildPostCommitScript();
|
|
24
|
+
let existingContent = '';
|
|
25
|
+
try {
|
|
26
|
+
existingContent = await readFile(hookPath, 'utf-8');
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
// No existing hook
|
|
30
|
+
}
|
|
31
|
+
// Check if already installed
|
|
32
|
+
if (existingContent.includes(PLANU_HOOK_MARKER)) {
|
|
33
|
+
return { installed: false, path: hookPath };
|
|
34
|
+
}
|
|
35
|
+
const newContent = existingContent
|
|
36
|
+
? `${existingContent}\n${hookScript}`
|
|
37
|
+
: `#!/usr/bin/env sh\n${hookScript}`;
|
|
38
|
+
await writeFile(hookPath, newContent, 'utf-8');
|
|
39
|
+
await chmod(hookPath, 0o755);
|
|
40
|
+
return { installed: true, path: hookPath };
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Uninstall the Planu post-commit hook section.
|
|
44
|
+
* Removes only the Planu-marked section, preserving other hooks.
|
|
45
|
+
*/
|
|
46
|
+
export async function uninstallGitHook(projectPath) {
|
|
47
|
+
const hookPath = join(projectPath, POST_COMMIT_HOOK_PATH);
|
|
48
|
+
let content;
|
|
49
|
+
try {
|
|
50
|
+
content = await readFile(hookPath, 'utf-8');
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
return { uninstalled: false, path: hookPath };
|
|
54
|
+
}
|
|
55
|
+
if (!content.includes(PLANU_HOOK_MARKER)) {
|
|
56
|
+
return { uninstalled: false, path: hookPath };
|
|
57
|
+
}
|
|
58
|
+
// Remove the Planu section
|
|
59
|
+
const startMarker = `${PLANU_HOOK_MARKER}-START`;
|
|
60
|
+
const endMarker = `${PLANU_HOOK_MARKER}-END`;
|
|
61
|
+
const startIdx = content.indexOf(startMarker);
|
|
62
|
+
const endIdx = content.indexOf(endMarker);
|
|
63
|
+
/* v8 ignore next 3 -- defensive: markers present but START/END corrupted */
|
|
64
|
+
if (startIdx === -1 || endIdx === -1) {
|
|
65
|
+
return { uninstalled: false, path: hookPath };
|
|
66
|
+
}
|
|
67
|
+
const cleaned = content.slice(0, startIdx) + content.slice(endIdx + endMarker.length + 1);
|
|
68
|
+
const trimmed = cleaned.trim();
|
|
69
|
+
if (trimmed === '' || trimmed === '#!/usr/bin/env sh') {
|
|
70
|
+
// Remove the hook file entirely if nothing remains
|
|
71
|
+
await unlink(hookPath);
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
await writeFile(hookPath, trimmed + '\n', 'utf-8');
|
|
75
|
+
}
|
|
76
|
+
return { uninstalled: true, path: hookPath };
|
|
77
|
+
}
|
|
78
|
+
// ---------------------------------------------------------------------------
|
|
79
|
+
// Build hook script
|
|
80
|
+
// ---------------------------------------------------------------------------
|
|
81
|
+
function buildPostCommitScript() {
|
|
82
|
+
return `
|
|
83
|
+
${PLANU_HOOK_MARKER}-START
|
|
84
|
+
# Planu on-commit hook — auto-generated by SPEC-130
|
|
85
|
+
if command -v node >/dev/null 2>&1; then
|
|
86
|
+
COMMIT_HASH="$(git rev-parse --short HEAD 2>/dev/null || echo 'unknown')"
|
|
87
|
+
BRANCH="$(git rev-parse --abbrev-ref HEAD 2>/dev/null || echo 'unknown')"
|
|
88
|
+
echo "[Planu] Post-commit: $COMMIT_HASH on $BRANCH"
|
|
89
|
+
fi
|
|
90
|
+
${PLANU_HOOK_MARKER}-END
|
|
91
|
+
`;
|
|
92
|
+
}
|
|
93
|
+
// ---------------------------------------------------------------------------
|
|
94
|
+
// Git helpers
|
|
95
|
+
// ---------------------------------------------------------------------------
|
|
96
|
+
/**
|
|
97
|
+
* Get the latest commit hash.
|
|
98
|
+
*/
|
|
99
|
+
async function getLatestCommitHash(projectRoot) {
|
|
100
|
+
try {
|
|
101
|
+
const { stdout } = await execFileAsync('git', ['rev-parse', '--short', 'HEAD'], {
|
|
102
|
+
cwd: projectRoot,
|
|
103
|
+
});
|
|
104
|
+
return stdout.trim();
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
return 'unknown';
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Get list of files changed in the latest commit.
|
|
112
|
+
*/
|
|
113
|
+
async function getCommittedFiles(projectRoot) {
|
|
114
|
+
try {
|
|
115
|
+
const { stdout } = await execFileAsync('git', ['diff-tree', '--no-commit-id', '--name-only', '-r', 'HEAD'], { cwd: projectRoot });
|
|
116
|
+
return stdout
|
|
117
|
+
.trim()
|
|
118
|
+
.split('\n')
|
|
119
|
+
.filter((f) => f.length > 0);
|
|
120
|
+
}
|
|
121
|
+
catch {
|
|
122
|
+
return [];
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
// ---------------------------------------------------------------------------
|
|
126
|
+
// Integrity check
|
|
127
|
+
// ---------------------------------------------------------------------------
|
|
128
|
+
/**
|
|
129
|
+
* Run a basic spec integrity check on committed files.
|
|
130
|
+
* Validates that @spec annotations reference known specs.
|
|
131
|
+
*/
|
|
132
|
+
async function checkIntegrity(files, projectRoot, knownSpecs) {
|
|
133
|
+
const errors = [];
|
|
134
|
+
for (const file of files) {
|
|
135
|
+
// Only check source files
|
|
136
|
+
if (!file.endsWith('.ts') &&
|
|
137
|
+
!file.endsWith('.js') &&
|
|
138
|
+
!file.endsWith('.tsx') &&
|
|
139
|
+
!file.endsWith('.jsx')) {
|
|
140
|
+
continue;
|
|
141
|
+
}
|
|
142
|
+
try {
|
|
143
|
+
const content = await readFile(join(projectRoot, file), 'utf-8');
|
|
144
|
+
const annotations = extractSpecAnnotations(content);
|
|
145
|
+
for (const specId of annotations) {
|
|
146
|
+
if (!knownSpecs.has(specId)) {
|
|
147
|
+
errors.push(`${file}: @spec ${specId} references unknown spec`);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
catch {
|
|
152
|
+
// File might have been deleted in this commit — skip
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
return { valid: errors.length === 0, errors };
|
|
156
|
+
}
|
|
157
|
+
// ---------------------------------------------------------------------------
|
|
158
|
+
// Handler
|
|
159
|
+
// ---------------------------------------------------------------------------
|
|
160
|
+
/**
|
|
161
|
+
* Handle on-commit event.
|
|
162
|
+
* - Gets committed files
|
|
163
|
+
* - Runs spec integrity check
|
|
164
|
+
* - Identifies specs that may need reconciliation
|
|
165
|
+
* - Non-blocking, async
|
|
166
|
+
*/
|
|
167
|
+
export async function handleOnCommit(ctx) {
|
|
168
|
+
const commitHash = await getLatestCommitHash(ctx.projectRoot);
|
|
169
|
+
const committedFiles = await getCommittedFiles(ctx.projectRoot);
|
|
170
|
+
// Run integrity check
|
|
171
|
+
const integrityResult = await checkIntegrity(committedFiles, ctx.projectRoot, ctx.knownSpecs);
|
|
172
|
+
// Collect specs referenced in committed files for auto-reconcile
|
|
173
|
+
const reconciledSpecs = new Set();
|
|
174
|
+
for (const file of committedFiles) {
|
|
175
|
+
if (!file.endsWith('.ts') && !file.endsWith('.js')) {
|
|
176
|
+
continue;
|
|
177
|
+
}
|
|
178
|
+
try {
|
|
179
|
+
const content = await readFile(join(ctx.projectRoot, file), 'utf-8');
|
|
180
|
+
const annotations = extractSpecAnnotations(content);
|
|
181
|
+
for (const specId of annotations) {
|
|
182
|
+
if (ctx.knownSpecs.has(specId)) {
|
|
183
|
+
reconciledSpecs.add(specId);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
catch {
|
|
188
|
+
// Skip unreadable files
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
return {
|
|
192
|
+
hook: 'on-commit',
|
|
193
|
+
commitHash,
|
|
194
|
+
reconciledSpecs: [...reconciledSpecs],
|
|
195
|
+
integrityResult,
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
//# sourceMappingURL=on-commit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"on-commit.js","sourceRoot":"","sources":["../../../../src/engine/hooks/handlers/on-commit.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,iEAAiE;AAEjE,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAEtD,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAE1C,8EAA8E;AAC9E,YAAY;AACZ,8EAA8E;AAE9E,MAAM,qBAAqB,GAAG,wBAAwB,CAAC;AACvD,MAAM,iBAAiB,GAAG,qBAAqB,CAAC;AAEhD,8EAA8E;AAC9E,6BAA6B;AAC7B,8EAA8E;AAE9E;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,WAAmB;IAEnB,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,qBAAqB,CAAC,CAAC;IAC1D,MAAM,UAAU,GAAG,qBAAqB,EAAE,CAAC;IAE3C,IAAI,eAAe,GAAG,EAAE,CAAC;IACzB,IAAI,CAAC;QACH,eAAe,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACtD,CAAC;IAAC,MAAM,CAAC;QACP,mBAAmB;IACrB,CAAC;IAED,6BAA6B;IAC7B,IAAI,eAAe,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC;QAChD,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IAC9C,CAAC;IAED,MAAM,UAAU,GAAG,eAAe;QAChC,CAAC,CAAC,GAAG,eAAe,KAAK,UAAU,EAAE;QACrC,CAAC,CAAC,sBAAsB,UAAU,EAAE,CAAC;IAEvC,MAAM,SAAS,CAAC,QAAQ,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;IAC/C,MAAM,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAE7B,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;AAC7C,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,WAAmB;IAEnB,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,qBAAqB,CAAC,CAAC;IAE1D,IAAI,OAAe,CAAC;IACpB,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC9C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IAChD,CAAC;IAED,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC;QACzC,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IAChD,CAAC;IAED,2BAA2B;IAC3B,MAAM,WAAW,GAAG,GAAG,iBAAiB,QAAQ,CAAC;IACjD,MAAM,SAAS,GAAG,GAAG,iBAAiB,MAAM,CAAC;IAC7C,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAC9C,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAE1C,4EAA4E;IAC5E,IAAI,QAAQ,KAAK,CAAC,CAAC,IAAI,MAAM,KAAK,CAAC,CAAC,EAAE,CAAC;QACrC,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IAChD,CAAC;IAED,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC1F,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAE/B,IAAI,OAAO,KAAK,EAAE,IAAI,OAAO,KAAK,mBAAmB,EAAE,CAAC;QACtD,mDAAmD;QACnD,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;IACzB,CAAC;SAAM,CAAC;QACN,MAAM,SAAS,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;IACrD,CAAC;IAED,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;AAC/C,CAAC;AAED,8EAA8E;AAC9E,oBAAoB;AACpB,8EAA8E;AAE9E,SAAS,qBAAqB;IAC5B,OAAO;EACP,iBAAiB;;;;;;;EAOjB,iBAAiB;CAClB,CAAC;AACF,CAAC;AAED,8EAA8E;AAC9E,cAAc;AACd,8EAA8E;AAE9E;;GAEG;AACH,KAAK,UAAU,mBAAmB,CAAC,WAAmB;IACpD,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,KAAK,EAAE,CAAC,WAAW,EAAE,SAAS,EAAE,MAAM,CAAC,EAAE;YAC9E,GAAG,EAAE,WAAW;SACjB,CAAC,CAAC;QACH,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC;IACvB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,iBAAiB,CAAC,WAAmB;IAClD,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CACpC,KAAK,EACL,CAAC,WAAW,EAAE,gBAAgB,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,CAAC,EAC5D,EAAE,GAAG,EAAE,WAAW,EAAE,CACrB,CAAC;QACF,OAAO,MAAM;aACV,IAAI,EAAE;aACN,KAAK,CAAC,IAAI,CAAC;aACX,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACjC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,kBAAkB;AAClB,8EAA8E;AAE9E;;;GAGG;AACH,KAAK,UAAU,cAAc,CAC3B,KAAe,EACf,WAAmB,EACnB,UAAuB;IAEvB,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,0BAA0B;QAC1B,IACE,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;YACrB,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;YACrB,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;YACtB,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EACtB,CAAC;YACD,SAAS;QACX,CAAC;QAED,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;YACjE,MAAM,WAAW,GAAG,sBAAsB,CAAC,OAAO,CAAC,CAAC;YAEpD,KAAK,MAAM,MAAM,IAAI,WAAW,EAAE,CAAC;gBACjC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;oBAC5B,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,WAAW,MAAM,0BAA0B,CAAC,CAAC;gBAClE,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,qDAAqD;QACvD,CAAC;IACH,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;AAChD,CAAC;AAED,8EAA8E;AAC9E,UAAU;AACV,8EAA8E;AAE9E;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,GAAoB;IACvD,MAAM,UAAU,GAAG,MAAM,mBAAmB,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAC9D,MAAM,cAAc,GAAG,MAAM,iBAAiB,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAEhE,sBAAsB;IACtB,MAAM,eAAe,GAAG,MAAM,cAAc,CAAC,cAAc,EAAE,GAAG,CAAC,WAAW,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC;IAE9F,iEAAiE;IACjE,MAAM,eAAe,GAAG,IAAI,GAAG,EAAU,CAAC;IAC1C,KAAK,MAAM,IAAI,IAAI,cAAc,EAAE,CAAC;QAClC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACnD,SAAS;QACX,CAAC;QACD,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;YACrE,MAAM,WAAW,GAAG,sBAAsB,CAAC,OAAO,CAAC,CAAC;YACpD,KAAK,MAAM,MAAM,IAAI,WAAW,EAAE,CAAC;gBACjC,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;oBAC/B,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;gBAC9B,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,wBAAwB;QAC1B,CAAC;IACH,CAAC;IAED,OAAO;QACL,IAAI,EAAE,WAAW;QACjB,UAAU;QACV,eAAe,EAAE,CAAC,GAAG,eAAe,CAAC;QACrC,eAAe;KAChB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { OnCreateHookResult, OnCreateContext } from '../../../types/file-hooks.js';
|
|
2
|
+
/**
|
|
3
|
+
* Handle on-create event for a new file.
|
|
4
|
+
* - Checks if file falls in any active spec's file plan
|
|
5
|
+
* - Suggests @spec annotations if the file matches a spec but has no annotation
|
|
6
|
+
*/
|
|
7
|
+
export declare function handleOnCreate(relPath: string, ctx: OnCreateContext): OnCreateHookResult;
|
|
8
|
+
//# sourceMappingURL=on-create.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"on-create.d.ts","sourceRoot":"","sources":["../../../../src/engine/hooks/handlers/on-create.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAOxF;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,eAAe,GAAG,kBAAkB,CAqBxF"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
// engine/hooks/handlers/on-create.ts — on-create hook handler (SPEC-129)
|
|
2
|
+
// Checks if new file falls in any active spec's file plan, suggests annotations.
|
|
3
|
+
import { matchesGlobPattern } from '../file-watcher.js';
|
|
4
|
+
// ---------------------------------------------------------------------------
|
|
5
|
+
// Handler
|
|
6
|
+
// ---------------------------------------------------------------------------
|
|
7
|
+
/**
|
|
8
|
+
* Handle on-create event for a new file.
|
|
9
|
+
* - Checks if file falls in any active spec's file plan
|
|
10
|
+
* - Suggests @spec annotations if the file matches a spec but has no annotation
|
|
11
|
+
*/
|
|
12
|
+
export function handleOnCreate(relPath, ctx) {
|
|
13
|
+
const normalizedPath = relPath.replace(/\\/g, '/');
|
|
14
|
+
const matchedSpecs = [];
|
|
15
|
+
const suggestedAnnotations = [];
|
|
16
|
+
for (const plan of ctx.specFilePlans) {
|
|
17
|
+
const matches = plan.plannedFiles.some((pattern) => matchesGlobPattern(normalizedPath, pattern));
|
|
18
|
+
if (matches) {
|
|
19
|
+
matchedSpecs.push(plan.specId);
|
|
20
|
+
suggestedAnnotations.push(`// @spec ${plan.specId}`);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
return {
|
|
24
|
+
hook: 'on-create',
|
|
25
|
+
path: normalizedPath,
|
|
26
|
+
matchedSpecs,
|
|
27
|
+
suggestedAnnotations,
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=on-create.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"on-create.js","sourceRoot":"","sources":["../../../../src/engine/hooks/handlers/on-create.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,iFAAiF;AAGjF,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAExD,8EAA8E;AAC9E,UAAU;AACV,8EAA8E;AAE9E;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,OAAe,EAAE,GAAoB;IAClE,MAAM,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACnD,MAAM,YAAY,GAAa,EAAE,CAAC;IAClC,MAAM,oBAAoB,GAAa,EAAE,CAAC;IAE1C,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,aAAa,EAAE,CAAC;QACrC,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CACjD,kBAAkB,CAAC,cAAc,EAAE,OAAO,CAAC,CAC5C,CAAC;QACF,IAAI,OAAO,EAAE,CAAC;YACZ,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC/B,oBAAoB,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;IAED,OAAO;QACL,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,cAAc;QACpB,YAAY;QACZ,oBAAoB;KACrB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { OnDeleteHookResult, OnDeleteContext } from '../../../types/file-hooks.js';
|
|
2
|
+
/**
|
|
3
|
+
* Handle on-delete event for a removed file.
|
|
4
|
+
* - Flags broken @spec annotations in other files referencing this file
|
|
5
|
+
* - Warns about affected spec scope
|
|
6
|
+
* - Removes file from hash snapshots
|
|
7
|
+
*/
|
|
8
|
+
export declare function handleOnDelete(relPath: string, ctx: OnDeleteContext): OnDeleteHookResult;
|
|
9
|
+
//# sourceMappingURL=on-delete.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"on-delete.d.ts","sourceRoot":"","sources":["../../../../src/engine/hooks/handlers/on-delete.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAOxF;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,eAAe,GAAG,kBAAkB,CAuBxF"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
// engine/hooks/handlers/on-delete.ts — on-delete hook handler (SPEC-129)
|
|
2
|
+
// Flags broken annotations, warns about changed spec scope, removes hash snapshots.
|
|
3
|
+
import { removeStoredHash } from './on-save.js';
|
|
4
|
+
// ---------------------------------------------------------------------------
|
|
5
|
+
// Handler
|
|
6
|
+
// ---------------------------------------------------------------------------
|
|
7
|
+
/**
|
|
8
|
+
* Handle on-delete event for a removed file.
|
|
9
|
+
* - Flags broken @spec annotations in other files referencing this file
|
|
10
|
+
* - Warns about affected spec scope
|
|
11
|
+
* - Removes file from hash snapshots
|
|
12
|
+
*/
|
|
13
|
+
export function handleOnDelete(relPath, ctx) {
|
|
14
|
+
const normalizedPath = relPath.replace(/\\/g, '/');
|
|
15
|
+
const affectedSpecs = [];
|
|
16
|
+
const brokenAnnotations = [];
|
|
17
|
+
// Check which specs reference this file
|
|
18
|
+
for (const entry of ctx.specAnnotations) {
|
|
19
|
+
if (entry.annotatedFiles.includes(normalizedPath)) {
|
|
20
|
+
affectedSpecs.push(entry.specId);
|
|
21
|
+
brokenAnnotations.push(`${entry.specId}: ${normalizedPath}`);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
// Remove from hash snapshots
|
|
25
|
+
removeStoredHash(normalizedPath);
|
|
26
|
+
return {
|
|
27
|
+
hook: 'on-delete',
|
|
28
|
+
path: normalizedPath,
|
|
29
|
+
affectedSpecs,
|
|
30
|
+
brokenAnnotations,
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=on-delete.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"on-delete.js","sourceRoot":"","sources":["../../../../src/engine/hooks/handlers/on-delete.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,oFAAoF;AAGpF,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEhD,8EAA8E;AAC9E,UAAU;AACV,8EAA8E;AAE9E;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,OAAe,EAAE,GAAoB;IAClE,MAAM,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAEnD,MAAM,aAAa,GAAa,EAAE,CAAC;IACnC,MAAM,iBAAiB,GAAa,EAAE,CAAC;IAEvC,wCAAwC;IACxC,KAAK,MAAM,KAAK,IAAI,GAAG,CAAC,eAAe,EAAE,CAAC;QACxC,IAAI,KAAK,CAAC,cAAc,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;YAClD,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YACjC,iBAAiB,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,KAAK,cAAc,EAAE,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC;IAED,6BAA6B;IAC7B,gBAAgB,CAAC,cAAc,CAAC,CAAC;IAEjC,OAAO;QACL,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,cAAc;QACpB,aAAa;QACb,iBAAiB;KAClB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { OnSaveHookResult, OnSaveContext } from '../../../types/file-hooks.js';
|
|
2
|
+
/**
|
|
3
|
+
* Extract @spec annotations from file content.
|
|
4
|
+
*/
|
|
5
|
+
export declare function extractSpecAnnotations(content: string): string[];
|
|
6
|
+
/**
|
|
7
|
+
* Handle on-save event for a file.
|
|
8
|
+
* - Validates @spec annotations
|
|
9
|
+
* - Computes SHA-256 hash and compares with stored snapshot
|
|
10
|
+
* - Reports drift delta
|
|
11
|
+
*/
|
|
12
|
+
export declare function handleOnSave(relPath: string, ctx: OnSaveContext): Promise<OnSaveHookResult>;
|
|
13
|
+
/**
|
|
14
|
+
* Get the stored hash for a file path.
|
|
15
|
+
*/
|
|
16
|
+
export declare function getStoredHash(relPath: string): string | undefined;
|
|
17
|
+
/**
|
|
18
|
+
* Set a hash snapshot (useful for initialization / testing).
|
|
19
|
+
*/
|
|
20
|
+
export declare function setStoredHash(relPath: string, hash: string): void;
|
|
21
|
+
/**
|
|
22
|
+
* Remove a hash snapshot.
|
|
23
|
+
*/
|
|
24
|
+
export declare function removeStoredHash(relPath: string): boolean;
|
|
25
|
+
/**
|
|
26
|
+
* Clear all stored hashes.
|
|
27
|
+
*/
|
|
28
|
+
export declare function clearStoredHashes(): void;
|
|
29
|
+
//# sourceMappingURL=on-save.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"on-save.d.ts","sourceRoot":"","sources":["../../../../src/engine/hooks/handlers/on-save.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAsBpF;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAWhE;AAgBD;;;;;GAKG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA+CjG;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAEjE;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAEjE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAEzD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CAExC"}
|