@planu/cli 4.13.0 → 5.0.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/CHANGELOG.md +64 -1
- package/LICENSE +55 -12
- package/README.md +33 -25
- package/dist/cli/commands/inspect.d.ts +4 -0
- package/dist/cli/commands/inspect.js +144 -0
- package/dist/cli/commands/install.d.ts +19 -12
- package/dist/cli/commands/install.js +148 -102
- package/dist/cli/commands/job.d.ts +3 -0
- package/dist/cli/commands/job.js +120 -0
- package/dist/cli/commands/offline.d.ts +15 -0
- package/dist/cli/commands/offline.js +132 -0
- package/dist/cli/commands/serve.js +4 -0
- package/dist/cli/commands/spec.js +1 -1
- package/dist/cli/commands/storage.d.ts +3 -0
- package/dist/cli/commands/storage.js +102 -0
- package/dist/cli/commands/uninstall.d.ts +10 -0
- package/dist/cli/commands/uninstall.js +93 -7
- package/dist/cli/commands/validate.js +1 -1
- package/dist/cli/index.js +2 -0
- package/dist/cli/router.js +9 -3
- package/dist/config/crash-shield-framework-rules.json +93 -0
- package/dist/config/environment-schema.json +147 -0
- package/dist/config/hardcode-exceptions.json +4 -0
- package/dist/config/native-release-public-key.pem +3 -0
- package/dist/config/native-targets.json +87 -0
- package/dist/config/official-sdd-tools.d.ts +4 -0
- package/dist/config/official-sdd-tools.js +35 -0
- package/dist/config/product-public.d.ts +225 -0
- package/dist/config/product-public.js +147 -0
- package/dist/config/product-public.json +283 -0
- package/dist/config/registries/hosts/codex.json +20 -363
- package/dist/config/release-compatibility.json +13 -0
- package/dist/config/release-policy.json +108 -0
- package/dist/config/runtime-policy.json +55 -0
- package/dist/config/skill-templates/planu-resume-work.md +2 -2
- package/dist/config/skill-templates/planu-validate.md +7 -4
- package/dist/config/subagent-templates/planu-spec-implementer.md +7 -3
- package/dist/config/subagent-templates/planu-validator.md +10 -5
- package/dist/config/technology-registry.json +120 -0
- package/dist/config/version.js +7 -8
- package/dist/core/index.d.ts +1 -1
- package/dist/core/spec-validator.d.ts +4 -4
- package/dist/core/spec-validator.js +1 -1
- package/dist/engine/abortable-process-runner.d.ts +20 -2
- package/dist/engine/abortable-process-runner.js +267 -67
- package/dist/engine/advanced-testing/accessibility-checker.js +12 -14
- package/dist/engine/advanced-testing/mutation-advisor.js +3 -4
- package/dist/engine/advanced-testing/property-based.js +2 -3
- package/dist/engine/advanced-testing/test-data-advisor.js +2 -3
- package/dist/engine/agent-generator.js +2 -1
- package/dist/engine/agent-handoff-store.js +2 -1
- package/dist/engine/agent-prompt-generator.js +7 -5
- package/dist/engine/agent-telemetry.js +2 -1
- package/dist/engine/ai-integration/gemini/extensions-advisor.js +41 -9
- package/dist/engine/ambiguity-detector.js +12 -11
- package/dist/engine/ambiguity-scorer.js +4 -26
- package/dist/engine/analyzer/db-engine.js +2 -3
- package/dist/engine/analyzer/detectors.js +13 -14
- package/dist/engine/analyzer/env-setup.js +9 -10
- package/dist/engine/analyzer-env-scanner/env-example.js +7 -8
- package/dist/engine/api-spec-generator/graphql-parser.js +2 -2
- package/dist/engine/api-validation/graphql-schema-validator.js +2 -1
- package/dist/engine/api-validation/openapi-impl-validator.js +6 -7
- package/dist/engine/architecture-detector.js +10 -8
- package/dist/engine/auth/config.d.ts +1 -1
- package/dist/engine/auth/config.js +4 -3
- package/dist/engine/auth/scope-mapper.js +1 -7
- package/dist/engine/auto-updater/atomic-upgrade.d.ts +8 -0
- package/dist/engine/auto-updater/atomic-upgrade.js +381 -0
- package/dist/engine/auto-updater/config-detector.js +9 -3
- package/dist/engine/auto-updater/config-patcher.d.ts +0 -4
- package/dist/engine/auto-updater/config-patcher.js +10 -15
- package/dist/engine/auto-updater/index.d.ts +3 -1
- package/dist/engine/auto-updater/index.js +44 -30
- package/dist/engine/auto-updater/npm-registry.js +10 -2
- package/dist/engine/auto-updater/release-verifier.d.ts +3 -0
- package/dist/engine/auto-updater/release-verifier.js +112 -0
- package/dist/engine/auto-updater/upgrade-lock.d.ts +6 -0
- package/dist/engine/auto-updater/upgrade-lock.js +28 -0
- package/dist/engine/auto-updater/upgrade-trust-state.d.ts +7 -0
- package/dist/engine/auto-updater/upgrade-trust-state.js +59 -0
- package/dist/engine/autopilot/audit-logger.js +2 -5
- package/dist/engine/autopilot/state-updater.js +4 -4
- package/dist/engine/best-practices-library.js +2 -1
- package/dist/engine/browser-validator.js +2 -1
- package/dist/engine/build-tool-detector.js +3 -2
- package/dist/engine/cascade-hooks/hooks/review-enricher.hook.js +9 -6
- package/dist/engine/cascade-hooks/state-drift-detector.d.ts +3 -3
- package/dist/engine/cascade-hooks/state-drift-detector.js +1 -1
- package/dist/engine/ci-generator/context-builders.js +7 -5
- package/dist/engine/ci-generator/planu-config.js +1 -7
- package/dist/engine/ci-generator/stack-detector.js +0 -2
- package/dist/engine/ci-generator/yaml-builder.js +0 -2
- package/dist/engine/clarification-gate/gate.d.ts +3 -3
- package/dist/engine/claude-config-auditor/rules-auditor.js +4 -3
- package/dist/engine/code-scanner/layer-scanner.js +6 -22
- package/dist/engine/code-transforms/typescript/ast-utils.js +2 -3
- package/dist/engine/complexity-budget/trivial-detector.js +2 -1
- package/dist/engine/compliance-test-generator/index.js +7 -2
- package/dist/engine/compliance-test-generator/test-formatter.js +2 -2
- package/dist/engine/config-health/mcp-config-checker.js +2 -1
- package/dist/engine/config-health/ts-checker-scripts.js +4 -3
- package/dist/engine/config-health/ts-checker.js +3 -2
- package/dist/engine/convention-injector.js +5 -7
- package/dist/engine/convention-scanner/convention-parser.js +3 -2
- package/dist/engine/core-bridge-duplicate-blocks.d.ts +3 -0
- package/dist/engine/core-bridge-duplicate-blocks.js +57 -0
- package/dist/engine/core-bridge-gaps.d.ts +4 -0
- package/dist/engine/core-bridge-gaps.js +75 -0
- package/dist/engine/core-bridge.d.ts +10 -10
- package/dist/engine/core-bridge.js +196 -283
- package/dist/engine/cost-guardrails.d.ts +1 -1
- package/dist/engine/cost-guardrails.js +1 -1
- package/dist/engine/cost-tracking/ledger.js +2 -5
- package/dist/engine/coverage-gap-analyzer.js +10 -1
- package/dist/engine/crash-shield/detectors/framework-detector.d.ts +2 -0
- package/dist/engine/crash-shield/detectors/framework-detector.js +110 -192
- package/dist/engine/crash-shield/detectors/typescript-detector.js +2 -1
- package/dist/engine/criterion-identity.d.ts +1 -0
- package/dist/engine/criterion-identity.js +7 -0
- package/dist/engine/dashboard/data-loader.js +4 -8
- package/dist/engine/dashboard/templates-layout.js +0 -3
- package/dist/engine/dashboard/templates-project.js +1 -13
- package/dist/engine/data-projects-gc/gc-runner.d.ts +7 -0
- package/dist/engine/data-projects-gc/gc-runner.js +113 -3
- package/dist/engine/data-projects-gc/scanner.js +5 -1
- package/dist/engine/decision-store.js +11 -14
- package/dist/engine/deleter/core.js +5 -5
- package/dist/engine/dep-auditor/abandonment-data.js +2 -1
- package/dist/engine/dep-auditor/abandonment-registry.js +3 -1
- package/dist/engine/dep-auditor/cve-fetcher.js +3 -0
- package/dist/engine/dep-auditor/dep-duplicates-detector.js +36 -4
- package/dist/engine/dep-auditor/license-registry.js +2 -0
- package/dist/engine/dependency-evaluator.d.ts +14 -0
- package/dist/engine/dependency-evaluator.js +81 -0
- package/dist/engine/deploy/providers/fly.js +7 -7
- package/dist/engine/deploy/providers/netlify.js +7 -7
- package/dist/engine/deploy/providers/railway.js +10 -12
- package/dist/engine/deploy/providers/vercel.js +7 -9
- package/dist/engine/deprecation-scanner/pattern-loader.js +0 -2
- package/dist/engine/desktop-detector.js +2 -3
- package/dist/engine/detect-duplication.js +2 -1
- package/dist/engine/detectors/advanced-framework-detector/css-state-detector.js +2 -1
- package/dist/engine/detectors/advanced-framework-detector/legacy-detector.js +2 -3
- package/dist/engine/detectors/advanced-framework-detector/modern-detector.js +3 -4
- package/dist/engine/detectors/agent-framework-detector.js +3 -2
- package/dist/engine/detectors/ai-native-detector.js +4 -6
- package/dist/engine/detectors/cache-db-detector.js +4 -3
- package/dist/engine/detectors/cicd-detector.js +4 -3
- package/dist/engine/detectors/deployment-detector.js +11 -12
- package/dist/engine/detectors/frontend-perf-detector.js +14 -9
- package/dist/engine/detectors/library-detector-multilang-a.js +16 -3
- package/dist/engine/detectors/library-detector-node.js +14 -4
- package/dist/engine/detectors/library-detector-python.js +7 -1
- package/dist/engine/detectors/library-detector.js +0 -2
- package/dist/engine/detectors/llm-detector/provider-maps.js +3 -2
- package/dist/engine/detectors/mcp-candidate-detector.js +12 -16
- package/dist/engine/detectors/mfe-detector.js +6 -7
- package/dist/engine/detectors/monitoring-detector.js +4 -3
- package/dist/engine/detectors/otel-detector.js +3 -2
- package/dist/engine/detectors/otel-ecosystem-detectors.d.ts +2 -2
- package/dist/engine/detectors/otel-ecosystem-detectors.js +4 -3
- package/dist/engine/detectors/platform-specialty-detector.js +3 -5
- package/dist/engine/detectors/template-engine-detector.js +3 -4
- package/dist/engine/doc-generator/builders.js +2 -3
- package/dist/engine/doc-generator/mobile-distribution-guide.js +13 -17
- package/dist/engine/doc-generator/portal/dirty-flag-map.d.ts +2 -2
- package/dist/engine/doc-generator/portal/portal-regenerator.js +3 -47
- package/dist/engine/docs-site-generator/data-collector.d.ts +1 -1
- package/dist/engine/docs-site-generator/data-collector.js +7 -28
- package/dist/engine/docs-site-generator/tools-renderer.js +3 -10
- package/dist/engine/domain-detector.js +3 -6
- package/dist/engine/dynamic-knowledge/knowledge-cache.js +3 -4
- package/dist/engine/dynamic-knowledge/knowledge-merger.js +17 -2
- package/dist/engine/dynamic-knowledge/web-researcher.js +15 -14
- package/dist/engine/dynamic-migration-detector/manifest-readers-extended.js +0 -2
- package/dist/engine/e2e-test-generator.js +4 -3
- package/dist/engine/ecosystem-absorber/knowledge-cache.js +2 -1
- package/dist/engine/ecosystem-absorber/platform-crawler.js +2 -2
- package/dist/engine/escalator/retry-counter.js +2 -1
- package/dist/engine/evidence-gates/artifact-reader.d.ts +16 -1
- package/dist/engine/evidence-gates/artifact-reader.js +220 -23
- package/dist/engine/evidence-gates/lifecycle-gate.d.ts +2 -1
- package/dist/engine/evidence-gates/lifecycle-gate.js +58 -3
- package/dist/engine/evidence-gates/reconciliation-freshness.d.ts +11 -0
- package/dist/engine/evidence-gates/reconciliation-freshness.js +72 -0
- package/dist/engine/evidence-index/done-drift.d.ts +1 -1
- package/dist/engine/evidence-index/done-drift.js +40 -18
- package/dist/engine/execution/context.d.ts +19 -0
- package/dist/engine/execution/context.js +130 -0
- package/dist/engine/execution/deadline-io.d.ts +21 -0
- package/dist/engine/execution/deadline-io.js +45 -0
- package/dist/engine/execution/durable-job-heartbeat-runtime.d.ts +4 -0
- package/dist/engine/execution/durable-job-heartbeat-runtime.js +400 -0
- package/dist/engine/execution/job-executor.d.ts +16 -0
- package/dist/engine/execution/job-executor.js +140 -0
- package/dist/engine/execution/job-runtime.d.ts +108 -0
- package/dist/engine/execution/job-runtime.js +328 -0
- package/dist/engine/execution/native-relevance-scorer.d.ts +6 -0
- package/dist/engine/execution/native-relevance-scorer.js +64 -0
- package/dist/engine/execution/native-worker-dispatch.d.ts +3 -0
- package/dist/engine/execution/native-worker-dispatch.js +46 -0
- package/dist/engine/execution/native-worker-protocol.d.ts +6 -0
- package/dist/engine/execution/native-worker-protocol.js +33 -0
- package/dist/engine/execution/native-worker-runtime.d.ts +4 -0
- package/dist/engine/execution/native-worker-runtime.js +177 -0
- package/dist/engine/execution/native-worker-thread.d.ts +2 -0
- package/dist/engine/execution/native-worker-thread.js +66 -0
- package/dist/engine/execution/operation-journal.d.ts +66 -0
- package/dist/engine/execution/operation-journal.js +260 -0
- package/dist/engine/execution/outbox-worker.d.ts +31 -0
- package/dist/engine/execution/outbox-worker.js +192 -0
- package/dist/engine/execution/public-job-sanitizer.d.ts +4 -0
- package/dist/engine/execution/public-job-sanitizer.js +31 -0
- package/dist/engine/execution/validate-job-executor.d.ts +35 -0
- package/dist/engine/execution/validate-job-executor.js +805 -0
- package/dist/engine/execution/validate-job-payload.d.ts +5 -0
- package/dist/engine/execution/validate-job-payload.js +144 -0
- package/dist/engine/execution/validate-job-recovery.d.ts +4 -0
- package/dist/engine/execution/validate-job-recovery.js +47 -0
- package/dist/engine/execution/validate-worker-runtime.d.ts +10 -0
- package/dist/engine/execution/validate-worker-runtime.js +188 -0
- package/dist/engine/execution/validate-worker-thread.d.ts +2 -0
- package/dist/engine/execution/validate-worker-thread.js +64 -0
- package/dist/engine/execution-plan/desktop-distribution.js +3 -7
- package/dist/engine/execution-plan/mobile-distribution.js +4 -9
- package/dist/engine/execution-plan/phases.js +4 -5
- package/dist/engine/execution-plan/plan-utils.js +8 -5
- package/dist/engine/facilitate/context-loader.js +3 -9
- package/dist/engine/figma/code-connect-fetcher.js +9 -8
- package/dist/engine/filesystem-watcher/index.d.ts +3 -3
- package/dist/engine/filesystem-watcher/index.js +5 -5
- package/dist/engine/framework-detector.js +14 -15
- package/dist/engine/git/planu-autocommit.js +8 -7
- package/dist/engine/git/repository-probe.d.ts +3 -0
- package/dist/engine/git/repository-probe.js +13 -0
- package/dist/engine/global-rules-manager.js +2 -2
- package/dist/engine/handoff-artifacts/io.js +2 -3
- package/dist/engine/handoff-artifacts/schemas/red-tests-handoff.js +8 -1
- package/dist/engine/handoff-artifacts/schemas.d.ts +6 -1
- package/dist/engine/handoff-artifacts/schemas.js +38 -0
- package/dist/engine/handoff-packager.d.ts +19 -0
- package/dist/engine/handoff-packager.js +415 -13
- package/dist/engine/hook-generator/stack-hook-templates.js +4 -4
- package/dist/engine/hooks/config-loader.js +1 -1
- package/dist/engine/hooks/context-injector.js +4 -7
- package/dist/engine/hooks/effort-configurator.js +1 -1
- package/dist/engine/hooks/file-watcher.js +1 -14
- package/dist/engine/hooks-reconciler.js +6 -4
- package/dist/engine/impact-detector/test-break-predictor.js +3 -3
- package/dist/engine/impact-detector/tool-registration.js +1 -1
- package/dist/engine/implementation-contract/renderer.js +23 -8
- package/dist/engine/infrastructure/component-mapper.js +5 -7
- package/dist/engine/infrastructure/docker-compose-generator.js +8 -10
- package/dist/engine/infrastructure/index.js +6 -3
- package/dist/engine/infrastructure/kubernetes-generator.js +2 -2
- package/dist/engine/infrastructure/railway-generator.js +10 -8
- package/dist/engine/infrastructure/signal-detector.js +6 -8
- package/dist/engine/infrastructure/terraform-generator.js +6 -8
- package/dist/engine/legal-compliance/detector.js +3 -2
- package/dist/engine/lifecycle-reconciliation-io.d.ts +11 -0
- package/dist/engine/lifecycle-reconciliation-io.js +180 -0
- package/dist/engine/lifecycle-reconciliation.d.ts +16 -0
- package/dist/engine/lifecycle-reconciliation.js +406 -0
- package/dist/engine/local-first/storage-advisor.js +5 -6
- package/dist/engine/local-first/tool-classification.js +2 -0
- package/dist/engine/macos-keychain-native-port.d.ts +10 -0
- package/dist/engine/macos-keychain-native-port.js +38 -0
- package/dist/engine/marketplace-fetcher/cache.js +3 -1
- package/dist/engine/mcp-config/mcp-config-writer.d.ts +2 -2
- package/dist/engine/mcp-config/mcp-config-writer.js +10 -8
- package/dist/engine/migration/db-migrator.js +2 -5
- package/dist/engine/migration/equivalence-mapper.js +12 -13
- package/dist/engine/migration/service-catalogs.js +6 -7
- package/dist/engine/migration/service-migrator-catalogs.js +6 -7
- package/dist/engine/migrations/remove-commercial-state.d.ts +3 -0
- package/dist/engine/migrations/remove-commercial-state.js +343 -0
- package/dist/engine/mobile-detector-ios.js +2 -3
- package/dist/engine/mobile-detector.js +16 -4
- package/dist/engine/model-router/complexity-analyzer.js +4 -7
- package/dist/engine/multi-agent-review/security-analyzer.js +3 -1
- package/dist/engine/multi-app-detector/app-type.js +26 -21
- package/dist/engine/multi-app-detector/core.js +3 -2
- package/dist/engine/multi-teammate-review/disagreement-counter.js +2 -1
- package/dist/engine/multi-teammate-review/panel-orchestrator.js +0 -2
- package/dist/engine/mutation-config-generator.js +10 -7
- package/dist/engine/native-capability-policy.d.ts +4 -0
- package/dist/engine/native-capability-policy.js +24 -0
- package/dist/engine/native-platform.d.ts +3 -0
- package/dist/engine/native-platform.js +44 -0
- package/dist/engine/native-runtime-handshake.d.ts +20 -0
- package/dist/engine/native-runtime-handshake.js +230 -0
- package/dist/engine/network-policy.d.ts +27 -0
- package/dist/engine/network-policy.js +175 -0
- package/dist/engine/next-spec-resolver/dependency-filter.js +2 -22
- package/dist/engine/nfr-profile-detector.js +12 -16
- package/dist/engine/nli-keywords.js +8 -9
- package/dist/engine/oauth/config-guard.js +4 -5
- package/dist/engine/observability/local-execution-spans.d.ts +15 -0
- package/dist/engine/observability/local-execution-spans.js +63 -0
- package/dist/engine/orchestrator/runtime.js +0 -1
- package/dist/engine/package-registry.js +2 -6
- package/dist/engine/performance-analyzer.js +2 -5
- package/dist/engine/permissions-merger/stack-detectors.js +5 -5
- package/dist/engine/planu-core.darwin-arm64.node.manifest.json +39 -0
- package/dist/engine/planu-core.darwin-arm64.node.sbom.json +1310 -0
- package/dist/engine/planu-core.darwin-x64.node.manifest.json +39 -0
- package/dist/engine/planu-core.darwin-x64.node.sbom.json +1310 -0
- package/dist/engine/planu-core.linux-arm64-gnu.node.manifest.json +38 -0
- package/dist/engine/planu-core.linux-arm64-gnu.node.sbom.json +1310 -0
- package/dist/engine/planu-core.linux-arm64-musl.node.manifest.json +38 -0
- package/dist/engine/planu-core.linux-arm64-musl.node.sbom.json +1310 -0
- package/dist/engine/planu-core.linux-x64-gnu.node.manifest.json +38 -0
- package/dist/engine/planu-core.linux-x64-gnu.node.sbom.json +1310 -0
- package/dist/engine/planu-core.linux-x64-musl.node.manifest.json +38 -0
- package/dist/engine/planu-core.linux-x64-musl.node.sbom.json +1310 -0
- package/dist/engine/planu-core.win32-arm64-msvc.node.manifest.json +38 -0
- package/dist/engine/planu-core.win32-arm64-msvc.node.sbom.json +1310 -0
- package/dist/engine/planu-core.win32-x64-msvc.node.manifest.json +38 -0
- package/dist/engine/planu-core.win32-x64-msvc.node.sbom.json +1310 -0
- package/dist/engine/platform-detector/desktop.js +15 -2
- package/dist/engine/platform-detector/extensions.js +2 -1
- package/dist/engine/platform-detector/games.js +2 -1
- package/dist/engine/platform-detector.js +3 -2
- package/dist/engine/platform-engineering/idp-detector.js +2 -1
- package/dist/engine/plugin-installer/stack-matcher.js +9 -17
- package/dist/engine/plugins/lifecycle.js +6 -2
- package/dist/engine/prior-decisions/contradiction-detector.js +60 -30
- package/dist/engine/project-dna/stack-detector.js +15 -17
- package/dist/engine/project-graph/builder.js +11 -0
- package/dist/engine/project-graph/cache.js +1 -1
- package/dist/engine/project-graph/freshness-projection.d.ts +16 -0
- package/dist/engine/project-graph/freshness-projection.js +95 -0
- package/dist/engine/project-graph/index.d.ts +1 -0
- package/dist/engine/project-graph/index.js +1 -0
- package/dist/engine/project-graph/query.js +15 -25
- package/dist/engine/project-health-checker.js +3 -4
- package/dist/engine/project-scanner/stack-detector.js +17 -17
- package/dist/engine/property-test-generator.js +2 -3
- package/dist/engine/qa-gate.d.ts +1 -0
- package/dist/engine/qa-gate.js +6 -4
- package/dist/engine/quality-gates/gate-catalog.js +47 -46
- package/dist/engine/quality-gates/gate-injector.js +9 -4
- package/dist/engine/readiness-checker.d.ts +1 -16
- package/dist/engine/readiness-checker.js +27 -88
- package/dist/engine/registry/core.js +0 -2
- package/dist/engine/registry/loader.js +9 -12
- package/dist/engine/registry/matcher.js +129 -24
- package/dist/engine/resilience-detector/concurrency-detector.js +4 -4
- package/dist/engine/resilience-detector/middleware-detector.js +11 -13
- package/dist/engine/resilience-detector/validation-detector.js +17 -4
- package/dist/engine/reverse-engineer/config-analyzer.js +9 -8
- package/dist/engine/reverse-engineer/orchestrator.js +5 -9
- package/dist/engine/reverse-engineer/test-file-parser.js +6 -3
- package/dist/engine/rules-generator/index.js +6 -5
- package/dist/engine/runtime-policy.d.ts +9 -0
- package/dist/engine/runtime-policy.js +138 -0
- package/dist/engine/runtime-security/checkers/content-security.js +21 -6
- package/dist/engine/runtime-security/checkers/file-permissions.js +0 -2
- package/dist/engine/runtime-security/rate-limiter.js +0 -1
- package/dist/engine/safety/atomic-write-file.js +20 -9
- package/dist/engine/safety/atomic-writer.js +10 -3
- package/dist/engine/safety/contained-project-file.d.ts +3 -0
- package/dist/engine/safety/contained-project-file.js +23 -0
- package/dist/engine/safety/cross-process-lock.d.ts +3 -40
- package/dist/engine/safety/cross-process-lock.js +268 -272
- package/dist/engine/safety/file-mutex.d.ts +2 -9
- package/dist/engine/safety/file-mutex.js +155 -87
- package/dist/engine/safety/health-monitor.js +15 -6
- package/dist/engine/safety/lock-lease-store.d.ts +79 -0
- package/dist/engine/safety/lock-lease-store.js +372 -0
- package/dist/engine/safety/lock-scavenger.d.ts +2 -5
- package/dist/engine/safety/lock-scavenger.js +158 -76
- package/dist/engine/safety/lock-staleness.js +4 -1
- package/dist/engine/safety/obsolete-lock-guard.d.ts +8 -0
- package/dist/engine/safety/obsolete-lock-guard.js +31 -0
- package/dist/engine/safety/transaction.js +3 -3
- package/dist/engine/sandbox/index.js +2 -1
- package/dist/engine/sandbox/runner-detect.js +3 -2
- package/dist/engine/sandbox/runner-docker.js +4 -3
- package/dist/engine/scan-project/module-discoverer.js +3 -2
- package/dist/engine/schema-generator.js +16 -9
- package/dist/engine/scope-boundaries/contradiction-checker.js +63 -1
- package/dist/engine/scope-boundaries/scope-validator.js +45 -7
- package/dist/engine/security-analyzer/criteria-generator.js +2 -3
- package/dist/engine/self-healing/healer.js +4 -4
- package/dist/engine/session/checkpoint-writer.js +0 -9
- package/dist/engine/shared-agent-memory.js +66 -74
- package/dist/engine/skill-adapter/command-rewriter.js +3 -2
- package/dist/engine/skill-adapter/index.js +3 -3
- package/dist/engine/skill-adapter/placeholder-map.js +3 -2
- package/dist/engine/skill-bootstrap/stack-matcher.js +47 -48
- package/dist/engine/skill-generation/stack-content-generator.js +0 -2
- package/dist/engine/skill-generator/workflow-skill-generator.js +2 -1
- package/dist/engine/skill-registry/ttl-refresh.js +3 -1
- package/dist/engine/skills/skills-fetcher.js +3 -6
- package/dist/engine/skills-reconciler.js +19 -39
- package/dist/engine/spec-coverage/test-finder.js +7 -6
- package/dist/engine/spec-diff-engine.js +3 -3
- package/dist/engine/spec-format/acceptance-criteria.d.ts +6 -2
- package/dist/engine/spec-format/acceptance-criteria.js +77 -18
- package/dist/engine/spec-format/markdown-sections.d.ts +14 -0
- package/dist/engine/spec-format/markdown-sections.js +105 -0
- package/dist/engine/spec-format/read-technical-section.js +33 -5
- package/dist/engine/spec-format/technical-md-populator.js +3 -2
- package/dist/engine/spec-format/unified-spec-builder.d.ts +7 -0
- package/dist/engine/spec-format/unified-spec-builder.js +202 -0
- package/dist/engine/spec-generator/api-key-resolver.d.ts +1 -1
- package/dist/engine/spec-generator/api-key-resolver.js +3 -24
- package/dist/engine/spec-generators/issue-extractor.js +9 -3
- package/dist/engine/spec-migrator/canonical-deduplicator.d.ts +18 -0
- package/dist/engine/spec-migrator/canonical-deduplicator.js +479 -0
- package/dist/engine/spec-migrator/drift-detector.js +5 -13
- package/dist/engine/spec-migrator/filesystem-import.d.ts +4 -8
- package/dist/engine/spec-migrator/filesystem-import.js +134 -23
- package/dist/engine/spec-migrator/frontmatter-parser.js +32 -15
- package/dist/engine/spec-migrator/index.d.ts +1 -0
- package/dist/engine/spec-migrator/index.js +1 -0
- package/dist/engine/spec-migrator/planu-canonical-policy.js +10 -1
- package/dist/engine/spec-migrator/strict-planu-cleanup.js +24 -25
- package/dist/engine/spec-registry/adapter.d.ts +0 -5
- package/dist/engine/spec-registry/adapter.js +45 -46
- package/dist/engine/spec-registry/client.js +2 -0
- package/dist/engine/spec-source-sync.js +3 -2
- package/dist/engine/spec-state-machine/transition-spec.d.ts +6 -1
- package/dist/engine/spec-state-machine/transition-spec.js +10 -1
- package/dist/engine/spec-templates/custom-loader.js +2 -3
- package/dist/engine/spec-templates/templates-domain-specific.js +8 -5
- package/dist/engine/spec-templates/templates-perf-integration.js +2 -3
- package/dist/engine/stack-auditor/manifest-reader.js +0 -2
- package/dist/engine/staleness/stale-implementing.js +7 -7
- package/dist/engine/tdd-scaffold-generator.js +24 -11
- package/dist/engine/teammate-router/green-phase-verifier.js +2 -1
- package/dist/engine/teammate-router/red-phase-verifier.js +2 -1
- package/dist/engine/technical-enricher/index.js +16 -8
- package/dist/engine/technical-enricher/render-enriched.d.ts +1 -0
- package/dist/engine/technical-enricher/render-enriched.js +42 -14
- package/dist/engine/technology-registry.d.ts +11 -0
- package/dist/engine/technology-registry.js +142 -0
- package/dist/engine/telemetry/error-reporter.d.ts +1 -2
- package/dist/engine/telemetry/error-reporter.js +11 -18
- package/dist/engine/telemetry/health-checker.js +58 -31
- package/dist/engine/telemetry/index.d.ts +0 -1
- package/dist/engine/telemetry/index.js +0 -1
- package/dist/engine/telemetry/stance.js +3 -2
- package/dist/engine/telemetry/telemetry-client.d.ts +1 -5
- package/dist/engine/telemetry/telemetry-client.js +69 -35
- package/dist/engine/telemetry/telemetry-store.d.ts +3 -3
- package/dist/engine/telemetry/telemetry-store.js +30 -23
- package/dist/engine/test-framework-detector/detectors.js +8 -8
- package/dist/engine/test-framework-detector/strategy.js +8 -9
- package/dist/engine/test-generators/agent-test-templates.js +2 -3
- package/dist/engine/test-generators/contract-test-generator.d.ts +1 -1
- package/dist/engine/test-generators/contract-test-generator.js +9 -202
- package/dist/engine/test-generators/platform-test-templates-b.js +2 -3
- package/dist/engine/test-generators/platform-test-templates.js +2 -5
- package/dist/engine/test-mocks-generator.js +4 -3
- package/dist/engine/test-plan-generator.js +30 -12
- package/dist/engine/test-scaffold-generator/advanced-scaffold.js +4 -5
- package/dist/engine/test-scaffold-generator/unit-scaffold.js +5 -6
- package/dist/engine/text-signal-boundaries.d.ts +2 -0
- package/dist/engine/text-signal-boundaries.js +25 -2
- package/dist/engine/time/relative-date.d.ts +3 -0
- package/dist/engine/time/relative-date.js +16 -0
- package/dist/engine/timing/budget.d.ts +17 -17
- package/dist/engine/timing/budget.js +98 -64
- package/dist/engine/token-optimizer/analytics.d.ts +1 -1
- package/dist/engine/token-optimizer/analytics.js +5 -6
- package/dist/engine/tool-groups/group-manager.js +3 -3
- package/dist/engine/universal-rules/installer.js +1 -1
- package/dist/engine/universal-rules/rules/planu-modes.js +2 -0
- package/dist/engine/universal-rules/rules/planu-release-policy.js +1 -0
- package/dist/engine/update-notifier.js +8 -5
- package/dist/engine/usage-tracker/core.d.ts +2 -2
- package/dist/engine/usage-tracker/core.js +1 -2
- package/dist/engine/usage-tracker/index.d.ts +0 -3
- package/dist/engine/usage-tracker/index.js +0 -3
- package/dist/engine/usage-tracker/stats.d.ts +2 -2
- package/dist/engine/usage-tracker/stats.js +1 -28
- package/dist/engine/validation/approved-spec-portability.d.ts +12 -0
- package/dist/engine/validation/approved-spec-portability.js +107 -0
- package/dist/engine/validation/durable-validation.d.ts +36 -0
- package/dist/engine/validation/durable-validation.js +256 -0
- package/dist/engine/validation/validation-freshness.d.ts +46 -0
- package/dist/engine/validation/validation-freshness.js +567 -0
- package/dist/engine/validation/validation-receipt-codec.d.ts +13 -0
- package/dist/engine/validation/validation-receipt-codec.js +182 -0
- package/dist/engine/validation/validation-receipt.d.ts +62 -0
- package/dist/engine/validation/validation-receipt.js +342 -0
- package/dist/engine/validation/validation-source-digest.d.ts +2 -0
- package/dist/engine/validation/validation-source-digest.js +86 -0
- package/dist/engine/validation/validation-source-policy.d.ts +4 -0
- package/dist/engine/validation/validation-source-policy.js +16 -0
- package/dist/engine/validation/validation-submission.d.ts +37 -0
- package/dist/engine/validation/validation-submission.js +142 -0
- package/dist/engine/validation/validation-worktree.d.ts +21 -0
- package/dist/engine/validation/validation-worktree.js +260 -0
- package/dist/engine/validation-evidence-ledger.js +41 -0
- package/dist/engine/validation-impact-planner.d.ts +14 -2
- package/dist/engine/validation-impact-planner.js +23 -10
- package/dist/engine/validator/dor-dod.d.ts +1 -0
- package/dist/engine/validator/dor-dod.js +5 -3
- package/dist/engine/validator/extractors.d.ts +1 -5
- package/dist/engine/validator/extractors.js +24 -69
- package/dist/engine/validator/spec-compliance-runner.d.ts +13 -25
- package/dist/engine/validator/spec-compliance-runner.js +442 -215
- package/dist/engine/validator/validation-report-writer.js +1 -1
- package/dist/engine/validator.js +37 -23
- package/dist/engine/verify-integrations/index.js +1 -1
- package/dist/engine/version-resolver.js +5 -6
- package/dist/engine/web-fetcher/stack-advisor.js +156 -92
- package/dist/engine/web-fetcher/stack-detector.js +114 -54
- package/dist/engine/workspace-manager.js +3 -2
- package/dist/errors/classified-degradation.d.ts +3 -0
- package/dist/errors/classified-degradation.js +10 -0
- package/dist/errors/degradation-sink.d.ts +3 -0
- package/dist/errors/degradation-sink.js +5 -0
- package/dist/errors/error-taxonomy.d.ts +12 -0
- package/dist/errors/error-taxonomy.js +62 -0
- package/dist/hosts/claude-code/ux/mcp-prompts.js +10 -4
- package/dist/hosts/claude-code/ux/mcp-resources.js +4 -2
- package/dist/hosts/codex/config-scaffold.js +4 -3
- package/dist/hosts/gemini/config-scaffold.js +2 -1
- package/dist/hosts/gemini/multimodal-spec-flow.js +7 -4
- package/dist/index.js +23 -20
- package/dist/resources/patterns.js +3 -1
- package/dist/resources/specs.js +3 -1
- package/dist/resources/templates.js +3 -1
- package/dist/resources/usage-stats-resource.js +2 -18
- package/dist/security/adapters/environment.d.ts +12 -0
- package/dist/security/adapters/environment.js +25 -0
- package/dist/security/adapters/linux-secret-service.d.ts +8 -0
- package/dist/security/adapters/linux-secret-service.js +64 -0
- package/dist/security/adapters/macos-keychain.d.ts +18 -0
- package/dist/security/adapters/macos-keychain.js +90 -0
- package/dist/security/adapters/windows-credential-manager.d.ts +8 -0
- package/dist/security/adapters/windows-credential-manager.js +60 -0
- package/dist/security/redactor.d.ts +5 -0
- package/dist/security/redactor.js +58 -0
- package/dist/security/secret-field.d.ts +5 -0
- package/dist/security/secret-field.js +17 -0
- package/dist/security/secret-migration.d.ts +3 -0
- package/dist/security/secret-migration.js +123 -0
- package/dist/security/secret-provider.d.ts +23 -0
- package/dist/security/secret-provider.js +145 -0
- package/dist/security/secure-json.d.ts +3 -0
- package/dist/security/secure-json.js +29 -0
- package/dist/server/routes/specs.js +10 -0
- package/dist/storage/api-surfaces-store.js +2 -2
- package/dist/storage/approval-operation-lock.d.ts +1 -1
- package/dist/storage/approval-operation-lock.js +5 -3
- package/dist/storage/audit-trail-store.d.ts +1 -1
- package/dist/storage/audit-trail-store.js +48 -62
- package/dist/storage/autopilot-log-store.js +12 -5
- package/dist/storage/base-store.d.ts +9 -9
- package/dist/storage/base-store.js +58 -21
- package/dist/storage/checkpoint-store.js +5 -2
- package/dist/storage/comments-store.js +2 -2
- package/dist/storage/compliance-audit-store.js +5 -2
- package/dist/storage/compliance-gate-config-store.js +7 -4
- package/dist/storage/compliance-store.js +2 -2
- package/dist/storage/context-profile-store.js +2 -2
- package/dist/storage/crash-shield-store.js +8 -4
- package/dist/storage/feedback-remote.d.ts +2 -3
- package/dist/storage/feedback-remote.js +45 -31
- package/dist/storage/feedback-store.js +10 -6
- package/dist/storage/figma-store.js +8 -4
- package/dist/storage/file-mutex.js +9 -1
- package/dist/storage/gaps-log.js +7 -4
- package/dist/storage/global-projects-store.js +4 -2
- package/dist/storage/global-store.d.ts +1 -17
- package/dist/storage/global-store.js +1 -42
- package/dist/storage/ideas-store.js +2 -2
- package/dist/storage/index.d.ts +5 -2
- package/dist/storage/index.js +5 -2
- package/dist/storage/knowledge-store/knowledge.js +27 -33
- package/dist/storage/lessons-store.js +2 -2
- package/dist/storage/migrations/canonical-storage.d.ts +15 -0
- package/dist/storage/migrations/canonical-storage.js +712 -0
- package/dist/storage/oauth-store.js +36 -8
- package/dist/storage/path-resolver.js +16 -3
- package/dist/storage/pr-store.js +2 -2
- package/dist/storage/project-drift-store.js +20 -8
- package/dist/storage/project-identity.d.ts +32 -0
- package/dist/storage/project-identity.js +194 -0
- package/dist/storage/project-resolver.js +14 -7
- package/dist/storage/release-notes-store.js +2 -6
- package/dist/storage/runtime-db.d.ts +195 -0
- package/dist/storage/runtime-db.js +1110 -0
- package/dist/storage/schema-registry.d.ts +5 -0
- package/dist/storage/schema-registry.js +74 -0
- package/dist/storage/sentry-store.js +20 -9
- package/dist/storage/session-state-store.js +12 -5
- package/dist/storage/skill-registry-storage.d.ts +1 -1
- package/dist/storage/skill-registry-storage.js +13 -11
- package/dist/storage/slack-store.js +10 -5
- package/dist/storage/spec-store.d.ts +14 -2
- package/dist/storage/spec-store.js +134 -37
- package/dist/storage/status-store/atomic-status-write.d.ts +5 -0
- package/dist/storage/status-store/atomic-status-write.js +57 -0
- package/dist/storage/status-store/file-lock.js +61 -20
- package/dist/storage/status-store/self-healing.js +13 -8
- package/dist/storage/status-store/version-sync.d.ts +2 -1
- package/dist/storage/status-store/version-sync.js +36 -39
- package/dist/storage/steering-store.js +2 -2
- package/dist/storage/storage-bundle.d.ts +5 -0
- package/dist/storage/storage-bundle.js +117 -0
- package/dist/storage/storage-catalog-validation.d.ts +3 -0
- package/dist/storage/storage-catalog-validation.js +20 -0
- package/dist/storage/storage-catalog.d.ts +25 -0
- package/dist/storage/storage-catalog.js +390 -0
- package/dist/storage/storage-layout.d.ts +24 -0
- package/dist/storage/storage-layout.js +101 -0
- package/dist/storage/storybook-store.js +2 -2
- package/dist/storage/supabase-store.js +24 -6
- package/dist/storage/tdd-policy-store.js +8 -6
- package/dist/storage/tech-debt-store.js +3 -3
- package/dist/storage/technology-selection-store.d.ts +1 -1
- package/dist/storage/technology-selection-store.js +6 -3
- package/dist/storage/token-cache-store.js +3 -3
- package/dist/storage/token-ledger-store.js +13 -8
- package/dist/storage/transition-log.js +7 -4
- package/dist/storage/trash-store.js +15 -6
- package/dist/storage/usage-store.d.ts +1 -5
- package/dist/storage/usage-store.js +0 -35
- package/dist/storage/vector-store/migrator.js +7 -2
- package/dist/storage/vector-store/sqlite-adapter.js +4 -1
- package/dist/storage/webhook-server-store.js +2 -2
- package/dist/tools/api-spec-generator-handler.js +3 -2
- package/dist/tools/auto-update-handler.d.ts +4 -4
- package/dist/tools/auto-update-handler.js +4 -4
- package/dist/tools/browser-validate-handler.js +2 -1
- package/dist/tools/challenge-spec/platform-challenge-scenarios-b.js +8 -5
- package/dist/tools/challenge-spec/resilience-challenge-scenarios.d.ts +2 -1
- package/dist/tools/challenge-spec/resilience-challenge-scenarios.js +10 -7
- package/dist/tools/challenge-spec/scenario-collector.js +1 -1
- package/dist/tools/challenge-spec/scenarios-data.js +1 -1
- package/dist/tools/challenge-spec/scenarios-desktop.js +8 -3
- package/dist/tools/challenge-spec/scenarios-failure.js +7 -2
- package/dist/tools/challenge-spec/scenarios-utils.d.ts +1 -1
- package/dist/tools/challenge-spec/scenarios-utils.js +35 -11
- package/dist/tools/challenge-spec/security-challenge-scenarios.js +3 -3
- package/dist/tools/challenge-spec.js +5 -5
- package/dist/tools/check-readiness.js +1 -1
- package/dist/tools/clarify-requirements/multiple-choice.js +53 -41
- package/dist/tools/comments-handler.js +2 -3
- package/dist/tools/compliance-test-handler.js +2 -2
- package/dist/tools/configure-telemetry.js +41 -13
- package/dist/tools/create-spec/auto-pipeline.js +13 -1
- package/dist/tools/create-spec/autopilot-analyzer.d.ts +1 -1
- package/dist/tools/create-spec/autopilot-analyzer.js +2 -4
- package/dist/tools/create-spec/mcp-tool-contract.d.ts +10 -4
- package/dist/tools/create-spec/mcp-tool-contract.js +7 -36
- package/dist/tools/create-spec/post-creation.d.ts +2 -1
- package/dist/tools/create-spec/post-creation.js +56 -54
- package/dist/tools/create-spec/relevance-scorer.d.ts +1 -1
- package/dist/tools/create-spec/relevance-scorer.js +17 -1
- package/dist/tools/create-spec/spec-builder.js +2 -23
- package/dist/tools/create-spec/spec-created-outbox-consumer.d.ts +14 -0
- package/dist/tools/create-spec/spec-created-outbox-consumer.js +176 -0
- package/dist/tools/create-spec.d.ts +1 -0
- package/dist/tools/create-spec.js +802 -732
- package/dist/tools/define-ui-contract/agent-interaction-contract.js +2 -4
- package/dist/tools/define-ui-contract-desktop/desktop-contract.js +12 -4
- package/dist/tools/define-ui-contract-desktop/native-contract.js +7 -3
- package/dist/tools/define-ui-contract-extensions.js +2 -3
- package/dist/tools/define-ui-contract-mobile.js +5 -9
- package/dist/tools/define-ui-contract-web/component-tree.js +4 -3
- package/dist/tools/define-ui-contract.js +7 -4
- package/dist/tools/deploy/deploy-spec.js +2 -4
- package/dist/tools/deploy/deploy-status.js +2 -4
- package/dist/tools/design-schema/nosql-category-schemas.js +2 -3
- package/dist/tools/design-schema-sql/migrations.js +3 -2
- package/dist/tools/design-schema-sql/tables.js +4 -1
- package/dist/tools/design-schema.js +4 -3
- package/dist/tools/feedback-handler.js +2 -4
- package/dist/tools/gc-data-projects.js +5 -5
- package/dist/tools/generate-execution-plan.js +3 -4
- package/dist/tools/generate-sub-agent.js +2 -1
- package/dist/tools/generate-tests/generators/a11y-tests-generator.js +5 -4
- package/dist/tools/generate-tests/generators/advanced-testing-generator.js +5 -4
- package/dist/tools/generate-tests/generators/concurrency-test-generator/js-templates.js +9 -4
- package/dist/tools/generate-tests/generators/concurrency-test-generator.js +8 -4
- package/dist/tools/generate-tests/generators/database/detectors.js +9 -3
- package/dist/tools/generate-tests/generators/database/index.js +2 -4
- package/dist/tools/generate-tests/generators/event-test-generator.js +5 -4
- package/dist/tools/generate-tests/generators/game-tests-generator.js +2 -1
- package/dist/tools/generate-tests/generators/graphql-test-generator.js +11 -5
- package/dist/tools/generate-tests/generators/grpc-test-generator.js +2 -3
- package/dist/tools/generate-tests/generators/llm-security-test-generator.js +4 -3
- package/dist/tools/generate-tests/generators/local-first-test-generator.js +4 -3
- package/dist/tools/generate-tests/generators/mcp-tests-generator.js +11 -9
- package/dist/tools/generate-tests/generators/microservices/index.js +2 -3
- package/dist/tools/generate-tests/generators/otel-test-generator.js +6 -3
- package/dist/tools/generate-tests/generators/security/detectors.js +2 -5
- package/dist/tools/generate-tests/generators/security/index.js +2 -4
- package/dist/tools/generate-tests/generators/supply-chain-test-generator.js +2 -3
- package/dist/tools/generate-tests/generators/visual-regression-generator.js +14 -17
- package/dist/tools/generate-tests/generators/websocket-test-generator.js +2 -3
- package/dist/tools/generate-tests/test-helpers.js +11 -12
- package/dist/tools/generate-tests-content.js +4 -3
- package/dist/tools/generate-tests.js +7 -4
- package/dist/tools/git/branch-ops.d.ts +1 -1
- package/dist/tools/git/branch-ops.js +3 -2
- package/dist/tools/git/git-helpers.d.ts +0 -2
- package/dist/tools/git/git-helpers.js +7 -7
- package/dist/tools/github-pr-handler.js +10 -3
- package/dist/tools/heal-spec-docs.js +6 -53
- package/dist/tools/hook-generator-handler.js +6 -6
- package/dist/tools/init-constitution/platform-principles.js +4 -2
- package/dist/tools/init-project/agents-md-writer.js +14 -5
- package/dist/tools/init-project/claude-md-generator.js +19 -12
- package/dist/tools/init-project/handler.js +165 -75
- package/dist/tools/init-project/host-assets-writer.d.ts +1 -1
- package/dist/tools/init-project/host-assets-writer.js +30 -3
- package/dist/tools/init-project/lifecycle-helpers.js +3 -5
- package/dist/tools/init-project/lint-scaffolder.d.ts +3 -3
- package/dist/tools/init-project/lint-scaffolder.js +6 -2
- package/dist/tools/init-project/migration-runner.d.ts +8 -1
- package/dist/tools/init-project/migration-runner.js +68 -2
- package/dist/tools/init-project/per-client-files-writer.js +14 -4
- package/dist/tools/init-project/portable-index-reconciler.d.ts +4 -0
- package/dist/tools/init-project/portable-index-reconciler.js +14 -0
- package/dist/tools/init-project/result-builder.js +1 -3
- package/dist/tools/init-project/rules-generator.js +10 -2
- package/dist/tools/init-project/scaffold-writer.d.ts +1 -1
- package/dist/tools/init-project/scaffold-writer.js +17 -15
- package/dist/tools/jobs/handlers.d.ts +15 -0
- package/dist/tools/jobs/handlers.js +158 -0
- package/dist/tools/list-specs.js +39 -59
- package/dist/tools/manage-plugins-handler.js +17 -9
- package/dist/tools/merge-risk-handler.js +2 -2
- package/dist/tools/migrate-tech/advanced-handlers.js +3 -2
- package/dist/tools/migrate-tech/build-tool-handlers.js +3 -2
- package/dist/tools/migrate-tech/core-handlers.js +5 -2
- package/dist/tools/migrate-tech/data-handlers.js +6 -3
- package/dist/tools/migrate-tech-advanced/rollback-handlers.js +3 -2
- package/dist/tools/migrate-tech-advanced/service-handlers.js +5 -2
- package/dist/tools/oauth-handler.js +7 -1
- package/dist/tools/package-handoff.js +2 -0
- package/dist/tools/reconcile-spec.js +0 -27
- package/dist/tools/register-agent-squad-tools.js +2 -2
- package/dist/tools/register-platform-tools/design-stack-tools.js +11 -11
- package/dist/tools/register-platform-tools/lifecycle-infra-tools.js +7 -7
- package/dist/tools/register-sdd-tools.d.ts +1 -1
- package/dist/tools/register-sdd-tools.js +2 -24
- package/dist/tools/register-spec-tools/analysis-tools.js +8 -8
- package/dist/tools/register-spec-tools/core-spec-tools.js +48 -8
- package/dist/tools/registry/auth.js +13 -5
- package/dist/tools/registry/publish.js +7 -4
- package/dist/tools/resolve-project-path.d.ts +2 -2
- package/dist/tools/resolve-project-path.js +7 -7
- package/dist/tools/reverse-engineer/analyzer.js +14 -14
- package/dist/tools/rollback-release.js +3 -2
- package/dist/tools/safe-handler.d.ts +5 -13
- package/dist/tools/safe-handler.js +302 -194
- package/dist/tools/schema-generator-handler.js +2 -1
- package/dist/tools/schemas/index.d.ts +1 -1
- package/dist/tools/schemas/index.js +1 -1
- package/dist/tools/schemas/output-schemas.d.ts +88 -105
- package/dist/tools/schemas/output-schemas.js +12 -122
- package/dist/tools/schemas/plugins-schemas.js +0 -2
- package/dist/tools/schemas/registry.js +0 -2
- package/dist/tools/schemas/skill-registry-schemas.js +0 -2
- package/dist/tools/schemas/spec.d.ts +4 -0
- package/dist/tools/schemas/spec.js +3 -0
- package/dist/tools/schemas/validate-output-schema.d.ts +267 -0
- package/dist/tools/schemas/validate-output-schema.js +219 -0
- package/dist/tools/sentry-handler.js +6 -1
- package/dist/tools/skill-bootstrap-handler.js +7 -4
- package/dist/tools/spec-prompt-handler.js +3 -3
- package/dist/tools/status-handler.js +4 -0
- package/dist/tools/storage-bundle-handler.d.ts +9 -0
- package/dist/tools/storage-bundle-handler.js +29 -0
- package/dist/tools/storage-paths-handler.d.ts +9 -0
- package/dist/tools/storage-paths-handler.js +17 -0
- package/dist/tools/suggest-mcp-server.js +11 -5
- package/dist/tools/suggest-mcps.js +29 -9
- package/dist/tools/suggest-tooling/advanced-testing-catalog.js +4 -5
- package/dist/tools/suggest-tooling/build-tool-catalog.js +2 -1
- package/dist/tools/suggest-tooling/css-framework-catalog.js +13 -7
- package/dist/tools/suggest-tooling/framework-catalog.js +3 -5
- package/dist/tools/suggest-tooling/frontend-perf-catalog.js +2 -6
- package/dist/tools/suggest-tooling/handler.js +10 -4
- package/dist/tools/suggest-tooling/hypermedia-catalog.js +11 -3
- package/dist/tools/suggest-tooling/linting-catalog.js +4 -7
- package/dist/tools/suggest-tooling/llm-security-catalog.js +2 -1
- package/dist/tools/suggest-tooling/local-first-catalog.js +7 -5
- package/dist/tools/suggest-tooling/observability-catalog.js +3 -4
- package/dist/tools/suggest-tooling/otel-catalog.js +4 -1
- package/dist/tools/suggest-tooling/resilience-catalog.js +16 -5
- package/dist/tools/suggest-tooling/skills-catalog.js +10 -9
- package/dist/tools/suggest-tooling/supply-chain-catalog.js +2 -3
- package/dist/tools/supabase-handler.js +2 -1
- package/dist/tools/sync-spec-state-handler.d.ts +1 -1
- package/dist/tools/sync-spec-state-handler.js +1 -1
- package/dist/tools/token-intelligence-handler.js +2 -2
- package/dist/tools/token-recording.js +2 -2
- package/dist/tools/token-savings-handler.js +2 -2
- package/dist/tools/tool-entry.d.ts +4 -4
- package/dist/tools/tool-entry.js +3 -3
- package/dist/tools/tool-registry/core-tools.js +162 -15
- package/dist/tools/tool-registry/group-infra.js +37 -122
- package/dist/tools/tool-registry/group-quality-compliance.js +31 -38
- package/dist/tools/tool-registry/inventory.d.ts +2 -0
- package/dist/tools/tool-registry/inventory.js +2 -0
- package/dist/tools/tool-registry-helpers.d.ts +3 -3
- package/dist/tools/tool-registry-helpers.js +3 -3
- package/dist/tools/tool-usage-report/registered-tools.d.ts +1 -1
- package/dist/tools/tool-usage-report/registered-tools.js +3 -15
- package/dist/tools/update-status/approval-gates.d.ts +13 -0
- package/dist/tools/update-status/approval-gates.js +84 -0
- package/dist/tools/update-status/batch.js +4 -2
- package/dist/tools/update-status/dod-gates.d.ts +6 -24
- package/dist/tools/update-status/dod-gates.js +60 -135
- package/dist/tools/update-status/done-receipt-verifier.d.ts +15 -0
- package/dist/tools/update-status/done-receipt-verifier.js +158 -0
- package/dist/tools/update-status/evidence-gate.js +190 -3
- package/dist/tools/update-status/file-sync.d.ts +2 -1
- package/dist/tools/update-status/file-sync.js +80 -18
- package/dist/tools/update-status/gate-harness.d.ts +7 -0
- package/dist/tools/update-status/gate-harness.js +8 -0
- package/dist/tools/update-status/index.d.ts +2 -0
- package/dist/tools/update-status/index.js +307 -367
- package/dist/tools/update-status/qa-gate.d.ts +1 -1
- package/dist/tools/update-status/qa-gate.js +2 -2
- package/dist/tools/update-status/response-builder.js +3 -3
- package/dist/tools/update-status/side-effects.d.ts +2 -0
- package/dist/tools/update-status/side-effects.js +32 -39
- package/dist/tools/update-status/transition-guard.d.ts +4 -2
- package/dist/tools/update-status/transition-guard.js +89 -25
- package/dist/tools/update-status-actions.d.ts +4 -2
- package/dist/tools/update-status-actions.js +16 -14
- package/dist/tools/update-status-convention-gate.js +24 -23
- package/dist/tools/update-status-reconcile.js +2 -2
- package/dist/tools/usage-report.js +1 -16
- package/dist/tools/usage-stats.js +1 -18
- package/dist/tools/usage-tracking.d.ts +4 -0
- package/dist/tools/usage-tracking.js +20 -0
- package/dist/tools/validate-api-contract-handler.js +3 -3
- package/dist/tools/validate-lint.d.ts +1 -0
- package/dist/tools/validate-lint.js +21 -14
- package/dist/tools/validate.d.ts +4 -1
- package/dist/tools/validate.js +319 -31
- package/dist/transports/http-transport.js +87 -66
- package/dist/transports/mcp-types.d.ts +0 -2
- package/dist/transports/middleware/with-telemetry.js +3 -2
- package/dist/transports/session-context.js +1 -1
- package/dist/types/abortable-process.d.ts +2 -0
- package/dist/types/advanced-framework.js +0 -2
- package/dist/types/atomic-upgrade.d.ts +71 -0
- package/dist/types/atomic-upgrade.js +2 -0
- package/dist/types/cascade-hooks.d.ts +1 -1
- package/dist/types/ci.d.ts +0 -4
- package/dist/types/ci.js +0 -2
- package/dist/types/clarification-token.d.ts +1 -1
- package/dist/types/claude-code-runtime.d.ts +0 -27
- package/dist/types/commercial-migration.d.ts +17 -0
- package/dist/types/commercial-migration.js +2 -0
- package/dist/types/common/primitives.d.ts +0 -2
- package/dist/types/core-bridge.d.ts +81 -10
- package/dist/types/crash-shield-framework-rules.d.ts +24 -0
- package/dist/types/crash-shield-framework-rules.js +2 -0
- package/dist/types/dashboard.d.ts +3 -7
- package/dist/types/data-gc.d.ts +16 -0
- package/dist/types/deploy.js +0 -2
- package/dist/types/docs.d.ts +0 -1
- package/dist/types/durable-job.d.ts +78 -0
- package/dist/types/durable-job.js +2 -0
- package/dist/types/durable-validation.d.ts +158 -0
- package/dist/types/durable-validation.js +166 -0
- package/dist/types/errors/structured-error.d.ts +3 -3
- package/dist/types/estimation.d.ts +4 -0
- package/dist/types/evidence-gates.d.ts +17 -1
- package/dist/types/execution.d.ts +45 -0
- package/dist/types/gemini-integration.d.ts +0 -11
- package/dist/types/handoff-artifacts.d.ts +43 -0
- package/dist/types/hooks-advanced.d.ts +0 -13
- package/dist/types/impact-detection.d.ts +2 -2
- package/dist/types/index.d.ts +4 -6
- package/dist/types/index.js +3 -5
- package/dist/types/infrastructure.js +0 -2
- package/dist/types/kiro-integration.d.ts +0 -6
- package/dist/types/lifecycle.js +0 -2
- package/dist/types/migration/canonical-storage.d.ts +37 -0
- package/dist/types/migration/canonical-storage.js +2 -0
- package/dist/types/migration/index.d.ts +1 -1
- package/dist/types/native-worker.d.ts +48 -0
- package/dist/types/native-worker.js +2 -0
- package/dist/types/network-policy.d.ts +12 -0
- package/dist/types/network-policy.js +2 -0
- package/dist/types/oauth.js +0 -2
- package/dist/types/observability.d.ts +32 -0
- package/dist/types/outbox-worker.d.ts +35 -0
- package/dist/types/outbox-worker.js +11 -0
- package/dist/types/permissions-config.d.ts +0 -27
- package/dist/types/permissions-config.js +0 -2
- package/dist/types/plugin-install.d.ts +0 -11
- package/dist/types/plugin-install.js +0 -2
- package/dist/types/portal.d.ts +1 -0
- package/dist/types/product-public.d.ts +75 -0
- package/dist/types/product-public.js +2 -0
- package/dist/types/project/inputs.d.ts +2 -0
- package/dist/types/project/lint-scaffolder.d.ts +1 -1
- package/dist/types/project/mfe-detection.js +0 -2
- package/dist/types/project/platform-mobile.js +0 -2
- package/dist/types/project/platform-specialty.js +0 -2
- package/dist/types/project-knowledge-graph.d.ts +7 -0
- package/dist/types/runtime-database.d.ts +10 -0
- package/dist/types/runtime-database.js +2 -0
- package/dist/types/runtime-policy.d.ts +51 -0
- package/dist/types/runtime-policy.js +2 -0
- package/dist/types/safety.d.ts +4 -5
- package/dist/types/schema-registry.d.ts +12 -0
- package/dist/types/schema-registry.js +2 -0
- package/dist/types/security.d.ts +52 -0
- package/dist/types/session-safeguard.d.ts +0 -31
- package/dist/types/skill-registry.js +0 -2
- package/dist/types/spec/canonical-repair.d.ts +81 -0
- package/dist/types/spec/canonical-repair.js +2 -0
- package/dist/types/spec/core.d.ts +14 -0
- package/dist/types/spec/index.d.ts +1 -0
- package/dist/types/spec/index.js +1 -0
- package/dist/types/spec/inputs.d.ts +31 -0
- package/dist/types/spec-format.d.ts +24 -0
- package/dist/types/spec-lock-v2.d.ts +13 -7
- package/dist/types/spec-lock-v2.js +1 -1
- package/dist/types/spec-registry.js +0 -2
- package/dist/types/storage-bundle.d.ts +13 -0
- package/dist/types/storage-bundle.js +2 -0
- package/dist/types/storage-catalog.d.ts +18 -0
- package/dist/types/storage-catalog.js +2 -0
- package/dist/types/team-planner.js +0 -2
- package/dist/types/technology-registry.d.ts +35 -0
- package/dist/types/technology-registry.js +2 -0
- package/dist/types/technology-symbols.generated.d.ts +117 -0
- package/dist/types/technology-symbols.generated.js +2 -0
- package/dist/types/telemetry.d.ts +7 -4
- package/dist/types/transport.d.ts +2 -2
- package/dist/types/usage.d.ts +1 -36
- package/dist/types/usage.js +1 -1
- package/dist/types/validate-worker.d.ts +50 -0
- package/dist/types/validate-worker.js +2 -0
- package/dist/types/validation-evidence.d.ts +1 -1
- package/dist/types/validation-receipt.d.ts +104 -0
- package/dist/types/validation-receipt.js +2 -0
- package/dist/types/validation.d.ts +2 -2
- package/package.json +36 -21
- package/planu-native.json +1 -1
- package/planu-plugin.json +23 -40
- package/scripts/lib/pending-release-file.mjs +93 -0
- package/src/i18n/messages/en.json +0 -41
- package/src/i18n/messages/es.json +0 -41
- package/src/i18n/messages/pt.json +0 -41
- package/dist/cli/commands/activate.d.ts +0 -14
- package/dist/cli/commands/activate.js +0 -174
- package/dist/config/license-plans.json +0 -244
- package/dist/config/server-instructions.ts +0 -121
- package/dist/config/version-defaults.ts +0 -76
- package/dist/config/version.ts +0 -18
- package/dist/engine/ai-integration/gemini/settings-generator.d.ts +0 -4
- package/dist/engine/ai-integration/gemini/settings-generator.js +0 -195
- package/dist/engine/ai-integration/kiro/hooks-generator.d.ts +0 -6
- package/dist/engine/ai-integration/kiro/hooks-generator.js +0 -75
- package/dist/engine/hooks/full-spectrum-generator.d.ts +0 -32
- package/dist/engine/hooks/full-spectrum-generator.js +0 -117
- package/dist/engine/license-validator/config-loader.d.ts +0 -5
- package/dist/engine/license-validator/config-loader.js +0 -16
- package/dist/engine/license-validator/core.d.ts +0 -15
- package/dist/engine/license-validator/core.js +0 -151
- package/dist/engine/license-validator/fingerprint.d.ts +0 -3
- package/dist/engine/license-validator/fingerprint.js +0 -17
- package/dist/engine/license-validator/lemon-squeezy.d.ts +0 -5
- package/dist/engine/license-validator/lemon-squeezy.js +0 -55
- package/dist/engine/license-validator.d.ts +0 -5
- package/dist/engine/license-validator.js +0 -6
- package/dist/engine/product-intelligence/index.d.ts +0 -7
- package/dist/engine/product-intelligence/index.js +0 -211
- package/dist/engine/session/auto-save.d.ts +0 -18
- package/dist/engine/session/auto-save.js +0 -98
- package/dist/engine/session/context-snapshot.d.ts +0 -8
- package/dist/engine/session/context-snapshot.js +0 -49
- package/dist/engine/session/memory-sync.d.ts +0 -12
- package/dist/engine/session/memory-sync.js +0 -34
- package/dist/engine/session/session-diff.d.ts +0 -11
- package/dist/engine/session/session-diff.js +0 -42
- package/dist/engine/session/session-merge.d.ts +0 -12
- package/dist/engine/session/session-merge.js +0 -55
- package/dist/engine/session-safeguard/checkpoint-runner.d.ts +0 -4
- package/dist/engine/session-safeguard/checkpoint-runner.js +0 -70
- package/dist/engine/session-safeguard/learnings-buffer.d.ts +0 -16
- package/dist/engine/session-safeguard/learnings-buffer.js +0 -114
- package/dist/engine/session-safeguard/precompaction-drain.d.ts +0 -10
- package/dist/engine/session-safeguard/precompaction-drain.js +0 -82
- package/dist/engine/session-safeguard/unpushed-detector.d.ts +0 -7
- package/dist/engine/session-safeguard/unpushed-detector.js +0 -59
- package/dist/engine/spec-changelog/core.d.ts +0 -16
- package/dist/engine/spec-changelog/core.js +0 -176
- package/dist/engine/spec-changelog/diff.d.ts +0 -18
- package/dist/engine/spec-changelog/diff.js +0 -121
- package/dist/engine/spec-changelog/index.d.ts +0 -3
- package/dist/engine/spec-changelog/index.js +0 -4
- package/dist/engine/telemetry/geo-resolver.d.ts +0 -9
- package/dist/engine/telemetry/geo-resolver.js +0 -43
- package/dist/engine/trial-engine.d.ts +0 -5
- package/dist/engine/trial-engine.js +0 -14
- package/dist/engine/usage-tracker/rate-check.d.ts +0 -7
- package/dist/engine/usage-tracker/rate-check.js +0 -18
- package/dist/engine/usage-tracker/rate-limiter.d.ts +0 -14
- package/dist/engine/usage-tracker/rate-limiter.js +0 -73
- package/dist/engine/usage-tracker/trial.d.ts +0 -27
- package/dist/engine/usage-tracker/trial.js +0 -49
- package/dist/engine/webhook/event-handlers.d.ts +0 -25
- package/dist/engine/webhook/event-handlers.js +0 -89
- package/dist/engine/webhook/index.d.ts +0 -4
- package/dist/engine/webhook/index.js +0 -5
- package/dist/engine/webhook/server.d.ts +0 -12
- package/dist/engine/webhook/server.js +0 -249
- package/dist/engine/webhook/signature.d.ts +0 -16
- package/dist/engine/webhook/signature.js +0 -49
- package/dist/storage/data-dir-discovery.d.ts +0 -31
- package/dist/storage/data-dir-discovery.js +0 -140
- package/dist/storage/license-store.d.ts +0 -6
- package/dist/storage/license-store.js +0 -91
- package/dist/storage/migrations/cwd-to-absolute.d.ts +0 -25
- package/dist/storage/migrations/cwd-to-absolute.js +0 -281
- package/dist/storage/session-store.d.ts +0 -20
- package/dist/storage/session-store.js +0 -128
- package/dist/tools/activate-license.d.ts +0 -6
- package/dist/tools/activate-license.js +0 -132
- package/dist/tools/checkpoint-handler.d.ts +0 -3
- package/dist/tools/checkpoint-handler.js +0 -130
- package/dist/tools/create-spec/adapters/prior-decisions-hint.d.ts +0 -14
- package/dist/tools/create-spec/adapters/prior-decisions-hint.js +0 -30
- package/dist/tools/export-session.d.ts +0 -3
- package/dist/tools/export-session.js +0 -90
- package/dist/tools/init-project/ancestor-data-detector.d.ts +0 -22
- package/dist/tools/init-project/ancestor-data-detector.js +0 -81
- package/dist/tools/license-gate.d.ts +0 -18
- package/dist/tools/license-gate.js +0 -222
- package/dist/tools/license-status.d.ts +0 -3
- package/dist/tools/license-status.js +0 -93
- package/dist/tools/list-sessions.d.ts +0 -3
- package/dist/tools/list-sessions.js +0 -46
- package/dist/tools/planu-session-checkpoint.d.ts +0 -6
- package/dist/tools/planu-session-checkpoint.js +0 -42
- package/dist/tools/restore-session.d.ts +0 -3
- package/dist/tools/restore-session.js +0 -71
- package/dist/tools/spec-history.d.ts +0 -3
- package/dist/tools/spec-history.js +0 -59
- package/dist/tools/update-status/force-done-audit.d.ts +0 -2
- package/dist/tools/update-status/force-done-audit.js +0 -23
- package/dist/tools/webhook.d.ts +0 -6
- package/dist/tools/webhook.js +0 -150
- package/dist/types/changelog.d.ts +0 -49
- package/dist/types/changelog.js +0 -3
- package/dist/types/licensing.d.ts +0 -109
- package/dist/types/licensing.js +0 -4
- package/dist/types/migration/cwd-to-absolute.d.ts +0 -8
- package/dist/types/migration/cwd-to-absolute.js +0 -3
- package/dist/types/product-intelligence.d.ts +0 -60
- package/dist/types/product-intelligence.js +0 -3
- package/dist/types/session.d.ts +0 -84
- package/dist/types/session.js +0 -3
- package/dist/types/webhook.d.ts +0 -62
- package/dist/types/webhook.js +0 -4
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { CriticalSchema, VersionedDocument } from '../types/schema-registry.js';
|
|
2
|
+
export declare function registerCriticalSchema<T>(schema: CriticalSchema<T>): void;
|
|
3
|
+
export declare function readCriticalSchema<T>(filePath: string, schemaName: string): Promise<VersionedDocument<T>>;
|
|
4
|
+
export declare function decodeCriticalSchema<T>(parsed: unknown, schemaName: string): VersionedDocument<T>;
|
|
5
|
+
//# sourceMappingURL=schema-registry.d.ts.map
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { readFile } from 'node:fs/promises';
|
|
2
|
+
import { BoundaryFailure, classifyBoundaryFailure } from '../errors/error-taxonomy.js';
|
|
3
|
+
const schemas = new Map();
|
|
4
|
+
export function registerCriticalSchema(schema) {
|
|
5
|
+
if (!schema.name.trim() ||
|
|
6
|
+
!Number.isSafeInteger(schema.currentVersion) ||
|
|
7
|
+
schema.currentVersion < 1) {
|
|
8
|
+
throw new BoundaryFailure('IncompatibleVersion', 'schema registration', 'Register a named schema with a positive integer version.');
|
|
9
|
+
}
|
|
10
|
+
if (schemas.has(schema.name)) {
|
|
11
|
+
const existing = schemas.get(schema.name);
|
|
12
|
+
if (existing === schema) {
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
throw new BoundaryFailure('Conflict', 'schema registration', `Schema ${schema.name} is already registered and cannot be replaced.`);
|
|
16
|
+
}
|
|
17
|
+
schemas.set(schema.name, schema);
|
|
18
|
+
}
|
|
19
|
+
export async function readCriticalSchema(filePath, schemaName) {
|
|
20
|
+
const schema = schemas.get(schemaName);
|
|
21
|
+
if (!schema) {
|
|
22
|
+
throw new BoundaryFailure('IncompatibleVersion', 'critical schema read', `Register schema ${schemaName} before reading persistent state.`);
|
|
23
|
+
}
|
|
24
|
+
let raw;
|
|
25
|
+
try {
|
|
26
|
+
raw = await readFile(filePath, 'utf8');
|
|
27
|
+
}
|
|
28
|
+
catch (error) {
|
|
29
|
+
const failure = classifyBoundaryFailure(error, `read ${schema.name}`, 'Restore access to the state file or initialize it if it does not exist.');
|
|
30
|
+
if (failure.kind === 'NotFound') {
|
|
31
|
+
return { schemaVersion: schema.currentVersion, data: schema.createDefault() };
|
|
32
|
+
}
|
|
33
|
+
throw failure;
|
|
34
|
+
}
|
|
35
|
+
let parsed;
|
|
36
|
+
try {
|
|
37
|
+
parsed = JSON.parse(raw);
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
throw new BoundaryFailure('Corrupt', `read ${schema.name}`, 'Recover the original file; Planu will not replace corrupt state with defaults.');
|
|
41
|
+
}
|
|
42
|
+
return decodeCriticalSchema(parsed, schemaName);
|
|
43
|
+
}
|
|
44
|
+
export function decodeCriticalSchema(parsed, schemaName) {
|
|
45
|
+
const schema = schemas.get(schemaName);
|
|
46
|
+
if (!schema) {
|
|
47
|
+
throw new BoundaryFailure('IncompatibleVersion', 'critical schema decode', `Register schema ${schemaName} before decoding persistent state.`);
|
|
48
|
+
}
|
|
49
|
+
const isEnvelope = parsed !== null && typeof parsed === 'object' && 'schemaVersion' in parsed && 'data' in parsed;
|
|
50
|
+
const document = isEnvelope
|
|
51
|
+
? parsed
|
|
52
|
+
: { schemaVersion: 0, data: parsed };
|
|
53
|
+
if (typeof document.schemaVersion !== 'number' || !Number.isSafeInteger(document.schemaVersion)) {
|
|
54
|
+
throw new BoundaryFailure('Corrupt', `read ${schema.name}`, 'Recover a versioned document.');
|
|
55
|
+
}
|
|
56
|
+
if (document.schemaVersion > schema.currentVersion || document.schemaVersion < 0) {
|
|
57
|
+
throw new BoundaryFailure('IncompatibleVersion', `read ${schema.name}`, `Use a Planu runtime compatible with schema version ${String(document.schemaVersion)}.`);
|
|
58
|
+
}
|
|
59
|
+
let data;
|
|
60
|
+
try {
|
|
61
|
+
data =
|
|
62
|
+
document.schemaVersion === schema.currentVersion
|
|
63
|
+
? document.data
|
|
64
|
+
: schema.migrate?.(document.data, document.schemaVersion);
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
throw new BoundaryFailure('IncompatibleVersion', `migrate ${schema.name}`, `Use a supported migration path to schema version ${String(schema.currentVersion)}.`);
|
|
68
|
+
}
|
|
69
|
+
if (data === undefined || !schema.validate(data)) {
|
|
70
|
+
throw new BoundaryFailure('Corrupt', `read ${schema.name}`, 'Recover state that satisfies the registered schema; no overwrite was performed.');
|
|
71
|
+
}
|
|
72
|
+
return { schemaVersion: schema.currentVersion, data };
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=schema-registry.js.map
|
|
@@ -1,22 +1,33 @@
|
|
|
1
|
+
import { technologyValue } from '../engine/technology-registry.js';
|
|
1
2
|
// storage/sentry-store.ts — Sentry integration persistence (SPEC-435)
|
|
2
|
-
import { readFile, writeFile
|
|
3
|
-
import {
|
|
4
|
-
import { safeJsonParse } from './base-store.js';
|
|
3
|
+
import { mkdir, readFile, writeFile } from 'node:fs/promises';
|
|
4
|
+
import { dirname, join } from 'node:path';
|
|
5
|
+
import { hashProjectPath, projectDataDir, safeJsonParse } from './base-store.js';
|
|
6
|
+
import { resolveSecretField, storeSecretField } from '../security/secret-field.js';
|
|
5
7
|
function sentryConfigPath(projectPath) {
|
|
6
|
-
return join(projectPath, '
|
|
8
|
+
return join(projectDataDir(hashProjectPath(projectPath)), technologyValue('technology-sentry-0cf685'), 'config.json');
|
|
7
9
|
}
|
|
8
10
|
export async function getSentryConfig(projectPath) {
|
|
9
11
|
try {
|
|
10
12
|
const raw = await readFile(sentryConfigPath(projectPath), 'utf-8');
|
|
11
|
-
|
|
13
|
+
const config = safeJsonParse(raw, null);
|
|
14
|
+
return config ? { ...config, authToken: await resolveSecretField(config.authToken) } : null;
|
|
12
15
|
}
|
|
13
|
-
catch {
|
|
14
|
-
|
|
16
|
+
catch (error) {
|
|
17
|
+
if (error.code === 'ENOENT' ||
|
|
18
|
+
(error instanceof Error && error.message === 'ENOENT')) {
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
throw error;
|
|
15
22
|
}
|
|
16
23
|
}
|
|
17
24
|
export async function saveSentryConfig(projectPath, config) {
|
|
18
25
|
const filePath = sentryConfigPath(projectPath);
|
|
19
|
-
await
|
|
20
|
-
await
|
|
26
|
+
const authToken = await storeSecretField(`${hashProjectPath(projectPath)}/sentry/auth`, 'sentry-auth', config.authToken);
|
|
27
|
+
await mkdir(dirname(filePath), { recursive: true, mode: 0o700 });
|
|
28
|
+
await writeFile(filePath, JSON.stringify({ ...config, authToken }, null, 2), {
|
|
29
|
+
encoding: 'utf-8',
|
|
30
|
+
mode: 0o600,
|
|
31
|
+
});
|
|
21
32
|
}
|
|
22
33
|
//# sourceMappingURL=sentry-store.js.map
|
|
@@ -5,6 +5,7 @@ import { join } from 'node:path';
|
|
|
5
5
|
import { execSync } from 'node:child_process';
|
|
6
6
|
import { readFile } from 'node:fs/promises';
|
|
7
7
|
import { getUniqueTopLevelFrontmatterString } from '../engine/frontmatter-parser.js';
|
|
8
|
+
import { reportClassifiedDegradation } from '../errors/classified-degradation.js';
|
|
8
9
|
// ---------------------------------------------------------------------------
|
|
9
10
|
// Constants
|
|
10
11
|
// ---------------------------------------------------------------------------
|
|
@@ -35,7 +36,9 @@ export function getStagedFiles(projectPath) {
|
|
|
35
36
|
.map((f) => f.trim())
|
|
36
37
|
.filter((f) => f.length > 0);
|
|
37
38
|
}
|
|
38
|
-
catch {
|
|
39
|
+
catch (error) {
|
|
40
|
+
// reliability-optional: GIT_SESSION_FILE_LIST — filesystem fallback runs next
|
|
41
|
+
reportClassifiedDegradation('GIT_SESSION_FILE_LIST', error);
|
|
39
42
|
return [];
|
|
40
43
|
}
|
|
41
44
|
}
|
|
@@ -58,14 +61,18 @@ export async function getActiveSpecIds(projectPath) {
|
|
|
58
61
|
active.add(match[0]);
|
|
59
62
|
}
|
|
60
63
|
}
|
|
61
|
-
catch {
|
|
62
|
-
//
|
|
64
|
+
catch (error) {
|
|
65
|
+
// reliability-compat: UNREADABLE_SPEC_CANDIDATE — preserve other valid active specs
|
|
66
|
+
reportClassifiedDegradation('UNREADABLE_SPEC_CANDIDATE', error);
|
|
63
67
|
}
|
|
64
68
|
}
|
|
65
69
|
return [...active];
|
|
66
70
|
}
|
|
67
|
-
catch {
|
|
68
|
-
|
|
71
|
+
catch (error) {
|
|
72
|
+
if (error.code === 'ENOENT') {
|
|
73
|
+
return [];
|
|
74
|
+
}
|
|
75
|
+
throw error;
|
|
69
76
|
}
|
|
70
77
|
}
|
|
71
78
|
// ---------------------------------------------------------------------------
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { SkillSource, SkillRegistryEntry, SkillRegistry } from '../types/skill-registry.js';
|
|
2
2
|
export type { SkillSource, SkillRegistryEntry, SkillRegistry };
|
|
3
|
-
export declare const REGISTRY_RELATIVE_PATH = "
|
|
3
|
+
export declare const REGISTRY_RELATIVE_PATH = "planu/skill-registry.json";
|
|
4
4
|
export declare const DEFAULT_TTL_DAYS = 30;
|
|
5
5
|
export declare const ALL_SKILL_SOURCES: SkillSource[];
|
|
6
6
|
/**
|
|
@@ -3,14 +3,13 @@
|
|
|
3
3
|
import { mkdir, readFile, writeFile } from 'node:fs/promises';
|
|
4
4
|
import { dirname, join } from 'node:path';
|
|
5
5
|
import { withFileLock } from './file-mutex.js';
|
|
6
|
-
import { safeJsonParse } from './base-store.js';
|
|
7
6
|
function isValidRegistry(parsed) {
|
|
8
7
|
return (parsed !== null && typeof parsed === 'object' && 'installed' in parsed && 'sources' in parsed);
|
|
9
8
|
}
|
|
10
9
|
// ---------------------------------------------------------------------------
|
|
11
10
|
// Configuration constants (no hardcodes in function bodies)
|
|
12
11
|
// ---------------------------------------------------------------------------
|
|
13
|
-
export const REGISTRY_RELATIVE_PATH = '
|
|
12
|
+
export const REGISTRY_RELATIVE_PATH = 'planu/skill-registry.json';
|
|
14
13
|
export const DEFAULT_TTL_DAYS = 30;
|
|
15
14
|
export const ALL_SKILL_SOURCES = ['superpowers', 'anthropic', 'local', 'community'];
|
|
16
15
|
// ---------------------------------------------------------------------------
|
|
@@ -41,14 +40,15 @@ export async function readSkillRegistry(projectPath) {
|
|
|
41
40
|
try {
|
|
42
41
|
raw = await readFile(filePath, 'utf-8');
|
|
43
42
|
}
|
|
44
|
-
catch {
|
|
45
|
-
|
|
46
|
-
|
|
43
|
+
catch (error) {
|
|
44
|
+
if (error.code === 'ENOENT') {
|
|
45
|
+
return emptyRegistry();
|
|
46
|
+
}
|
|
47
|
+
throw error;
|
|
47
48
|
}
|
|
48
|
-
const parsed =
|
|
49
|
+
const parsed = JSON.parse(raw);
|
|
49
50
|
if (!isValidRegistry(parsed)) {
|
|
50
|
-
|
|
51
|
-
return emptyRegistry();
|
|
51
|
+
throw new Error(`Skill registry is corrupt: ${filePath}`);
|
|
52
52
|
}
|
|
53
53
|
return parsed;
|
|
54
54
|
}
|
|
@@ -79,7 +79,7 @@ export async function writeSkillRegistryEntry(projectPath, entry) {
|
|
|
79
79
|
let registry;
|
|
80
80
|
try {
|
|
81
81
|
const raw = await readFile(filePath, 'utf-8');
|
|
82
|
-
const parsed =
|
|
82
|
+
const parsed = JSON.parse(raw);
|
|
83
83
|
if (isValidRegistry(parsed)) {
|
|
84
84
|
registry = parsed;
|
|
85
85
|
}
|
|
@@ -87,8 +87,10 @@ export async function writeSkillRegistryEntry(projectPath, entry) {
|
|
|
87
87
|
throw new Error('invalid');
|
|
88
88
|
}
|
|
89
89
|
}
|
|
90
|
-
catch {
|
|
91
|
-
|
|
90
|
+
catch (error) {
|
|
91
|
+
if (error.code !== 'ENOENT') {
|
|
92
|
+
throw error;
|
|
93
|
+
}
|
|
92
94
|
const now = new Date().toISOString();
|
|
93
95
|
registry = {
|
|
94
96
|
createdAt: now,
|
|
@@ -1,14 +1,16 @@
|
|
|
1
1
|
// storage/slack-store.ts — Slack integration persistence (SPEC-292)
|
|
2
2
|
import { join } from 'node:path';
|
|
3
|
-
import { hashProjectPath, readJson, writeJson } from './base-store.js';
|
|
3
|
+
import { hashProjectPath, projectDataDir, readJson, writeJson } from './base-store.js';
|
|
4
4
|
import { withFileLock } from './file-mutex.js';
|
|
5
|
+
import { deleteSecretField, resolveSecretField, storeSecretField, } from '../security/secret-field.js';
|
|
6
|
+
import { writeSecureJson } from '../security/secure-json.js';
|
|
5
7
|
// ---------------------------------------------------------------------------
|
|
6
8
|
// Path helpers
|
|
7
9
|
// ---------------------------------------------------------------------------
|
|
8
10
|
const MAX_DELIVERIES = 20;
|
|
9
11
|
function getProjectDir(projectPath) {
|
|
10
12
|
const hash = hashProjectPath(projectPath);
|
|
11
|
-
return
|
|
13
|
+
return projectDataDir(hash);
|
|
12
14
|
}
|
|
13
15
|
function getConfigPath(projectPath) {
|
|
14
16
|
return join(getProjectDir(projectPath), 'slack-config.json');
|
|
@@ -24,19 +26,22 @@ function getDeliveryLogPath(projectPath) {
|
|
|
24
26
|
*/
|
|
25
27
|
export async function getSlackConfig(projectPath) {
|
|
26
28
|
const config = await readJson(getConfigPath(projectPath), null);
|
|
27
|
-
return config;
|
|
29
|
+
return config ? { ...config, webhookUrl: await resolveSecretField(config.webhookUrl) } : null;
|
|
28
30
|
}
|
|
29
31
|
/**
|
|
30
32
|
* Persist the Slack config for a project.
|
|
31
33
|
*/
|
|
32
34
|
export async function saveSlackConfig(projectPath, config) {
|
|
33
|
-
await
|
|
35
|
+
const webhookUrl = await storeSecretField(`${hashProjectPath(projectPath)}/slack/webhook`, 'slack-webhook', config.webhookUrl);
|
|
36
|
+
await writeSecureJson(getConfigPath(projectPath), { ...config, webhookUrl });
|
|
34
37
|
}
|
|
35
38
|
/**
|
|
36
39
|
* Remove the Slack config for a project.
|
|
37
40
|
*/
|
|
38
41
|
export async function removeSlackConfig(projectPath) {
|
|
39
|
-
await
|
|
42
|
+
const config = await readJson(getConfigPath(projectPath), null);
|
|
43
|
+
await deleteSecretField(config?.webhookUrl);
|
|
44
|
+
await writeSecureJson(getConfigPath(projectPath), null);
|
|
40
45
|
}
|
|
41
46
|
/**
|
|
42
47
|
* Read the last N delivery log entries for a project.
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { Spec, SpecStatus, SpecVersion, SpecSummary, DefinitionOfReady, DefinitionOfDone, PostCommitTaskClaim } from '../types/index.js';
|
|
1
|
+
import type { Spec, SpecStatus, SpecVersion, SpecSummary, DefinitionOfReady, DefinitionOfDone, StatusHistoryEntry, PostCommitTaskClaim } from '../types/index.js';
|
|
2
2
|
/**
|
|
3
3
|
* Thrown when code tries to write `status` via `updateSpec` directly.
|
|
4
4
|
* All status transitions must go through `handleUpdateStatus` → `transitionSpec`.
|
|
@@ -6,6 +6,18 @@ import type { Spec, SpecStatus, SpecVersion, SpecSummary, DefinitionOfReady, Def
|
|
|
6
6
|
export declare class DirectStatusWriteForbiddenError extends Error {
|
|
7
7
|
constructor(specId: string, attemptedStatus: string, caller: string);
|
|
8
8
|
}
|
|
9
|
+
/** Stable, privacy-safe canonical identity failure. */
|
|
10
|
+
export declare class DuplicateSpecIdError extends Error {
|
|
11
|
+
readonly code: 'DUPLICATE_SPEC_ID';
|
|
12
|
+
constructor(projectId: string, specIds: readonly string[]);
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Validate the single canonical identity namespace shared by every spec row.
|
|
16
|
+
* Keep the diagnostic deliberately small: UUIDs and storage paths are private.
|
|
17
|
+
*/
|
|
18
|
+
export declare function validateCanonicalSpecRows(projectId: string, specs: readonly Spec[]): void;
|
|
19
|
+
/** Administrative-only lock boundary for the digest-bound raw-store repair. */
|
|
20
|
+
export declare function withCanonicalSpecRepairLock<T>(projectId: string, fn: () => Promise<T>): Promise<T>;
|
|
9
21
|
/** Evict the cache for a project (e.g. after external file changes). */
|
|
10
22
|
export declare function invalidateSpecsCache(projectId: string): void;
|
|
11
23
|
/**
|
|
@@ -34,7 +46,7 @@ export declare function createSpec(projectId: string, spec: Spec): Promise<Spec>
|
|
|
34
46
|
* Importable exclusively from `src/engine/spec-state-machine/transition-spec.ts`.
|
|
35
47
|
* All status transitions must flow through `transitionSpec` → `__internalSetStatus`.
|
|
36
48
|
*/
|
|
37
|
-
export declare function __internalSetStatus(projectId: string, specId: string, status: SpecStatus, updates?: Omit<Partial<Spec>, 'status'>, pendingBackgroundActions?: readonly string[], expectedSnapshot?: Pick<Spec, 'status' | 'updatedAt'>): Promise<Spec>;
|
|
49
|
+
export declare function __internalSetStatus(projectId: string, specId: string, status: SpecStatus, updates?: Omit<Partial<Spec>, 'status'>, pendingBackgroundActions?: readonly string[], expectedSnapshot?: Pick<Spec, 'status' | 'updatedAt'>, transitionRootBinding?: string, reconciliation?: Pick<StatusHistoryEntry, 'reconciliationRequestId' | 'reconciliationBindingDigest' | 'trigger'>): Promise<Spec>;
|
|
38
50
|
/**
|
|
39
51
|
* Restore the exact snapshot captured before a lifecycle transition.
|
|
40
52
|
* This is only used by transitionSpec compensation while the caller still
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { reportClassifiedDegradation } from '../errors/classified-degradation.js';
|
|
2
|
+
import { CriticalJsonReadError, readCriticalJson, readJson, writeJson, projectDataDir, } from './base-store.js';
|
|
3
|
+
import { decodeCriticalSchema, registerCriticalSchema } from './schema-registry.js';
|
|
4
|
+
import { BoundaryFailure } from '../errors/error-taxonomy.js';
|
|
3
5
|
import { withFileLock } from './file-mutex.js';
|
|
4
|
-
import { discoverProjectDataFile } from './data-dir-discovery.js';
|
|
5
6
|
import { computeHealthScore } from '../engine/spec-health-scorer.js';
|
|
6
7
|
import { loadSpecContent } from '../engine/validation-loop.js';
|
|
7
8
|
import { createHash, randomUUID } from 'node:crypto';
|
|
@@ -21,6 +22,15 @@ export class DirectStatusWriteForbiddenError extends Error {
|
|
|
21
22
|
this.name = 'DirectStatusWriteForbiddenError';
|
|
22
23
|
}
|
|
23
24
|
}
|
|
25
|
+
/** Stable, privacy-safe canonical identity failure. */
|
|
26
|
+
export class DuplicateSpecIdError extends Error {
|
|
27
|
+
code = 'DUPLICATE_SPEC_ID';
|
|
28
|
+
constructor(projectId, specIds) {
|
|
29
|
+
const ids = [...new Set(specIds)].sort((left, right) => left.localeCompare(right));
|
|
30
|
+
super(`[Planu] Canonical spec identity conflict in project ${projectId}: ${ids.join(', ')}`);
|
|
31
|
+
this.name = 'DuplicateSpecIdError';
|
|
32
|
+
}
|
|
33
|
+
}
|
|
24
34
|
// --- internal helpers ---
|
|
25
35
|
function specsFile(projectId) {
|
|
26
36
|
return `${projectDataDir(projectId)}/specs.json`;
|
|
@@ -40,8 +50,52 @@ function normalizeSpec(raw) {
|
|
|
40
50
|
}
|
|
41
51
|
// SPEC-601: Lazy UUID migration — generate if missing
|
|
42
52
|
spec.uuid ??= crypto.randomUUID();
|
|
53
|
+
if (spec.uuidAliases !== undefined) {
|
|
54
|
+
spec.uuidAliases = [
|
|
55
|
+
...new Set(spec.uuidAliases.filter((alias) => typeof alias === 'string' && alias)),
|
|
56
|
+
].sort((left, right) => left.localeCompare(right));
|
|
57
|
+
}
|
|
43
58
|
return spec;
|
|
44
59
|
}
|
|
60
|
+
/**
|
|
61
|
+
* Validate the single canonical identity namespace shared by every spec row.
|
|
62
|
+
* Keep the diagnostic deliberately small: UUIDs and storage paths are private.
|
|
63
|
+
*/
|
|
64
|
+
export function validateCanonicalSpecRows(projectId, specs) {
|
|
65
|
+
const ids = new Map();
|
|
66
|
+
const uuids = new Map();
|
|
67
|
+
const conflicts = new Set();
|
|
68
|
+
for (const spec of specs) {
|
|
69
|
+
const priorId = ids.get(spec.id);
|
|
70
|
+
if (priorId !== undefined) {
|
|
71
|
+
conflicts.add(spec.id);
|
|
72
|
+
conflicts.add(priorId);
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
ids.set(spec.id, spec.id);
|
|
76
|
+
}
|
|
77
|
+
if (spec.projectId !== projectId) {
|
|
78
|
+
conflicts.add(spec.id);
|
|
79
|
+
}
|
|
80
|
+
const identities = [spec.uuid, ...(spec.uuidAliases ?? [])];
|
|
81
|
+
for (const identity of identities) {
|
|
82
|
+
if (typeof identity !== 'string' || identity.length === 0) {
|
|
83
|
+
continue;
|
|
84
|
+
}
|
|
85
|
+
const owner = uuids.get(identity);
|
|
86
|
+
if (owner !== undefined) {
|
|
87
|
+
conflicts.add(owner);
|
|
88
|
+
conflicts.add(spec.id);
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
uuids.set(identity, spec.id);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
if (conflicts.size > 0) {
|
|
96
|
+
throw new DuplicateSpecIdError(projectId, [...conflicts]);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
45
99
|
// Write-through in-memory cache: projectId → Spec[].
|
|
46
100
|
// Populated on first read; invalidated (updated) on every mutation.
|
|
47
101
|
// Eliminates repeated disk I/O for a local single-user MCP server.
|
|
@@ -52,16 +106,27 @@ const STORE_LOCK_ID = '__project-spec-store__';
|
|
|
52
106
|
const DEFAULT_POST_COMMIT_LEASE_MS = 30_000;
|
|
53
107
|
const MAX_POST_COMMIT_ATTEMPTS = 3;
|
|
54
108
|
const COMPLETED_OUTBOX_RETENTION = 20;
|
|
109
|
+
registerCriticalSchema({
|
|
110
|
+
name: 'spec-store',
|
|
111
|
+
currentVersion: 1,
|
|
112
|
+
createDefault: () => [],
|
|
113
|
+
validate: (value) => Array.isArray(value),
|
|
114
|
+
migrate: (value, fromVersion) => {
|
|
115
|
+
if (fromVersion === 0 && Array.isArray(value)) {
|
|
116
|
+
return value;
|
|
117
|
+
}
|
|
118
|
+
throw new Error('[Planu] Unsupported spec-store schema migration');
|
|
119
|
+
},
|
|
120
|
+
});
|
|
55
121
|
async function withSpecMutationLock(projectId, fn) {
|
|
56
122
|
return withFileLock(specsFile(projectId), async () => {
|
|
57
|
-
const lockRoot = projectDataDir(projectId);
|
|
58
123
|
const deadline = Date.now() + STORE_LOCK_TIMEOUT_MS;
|
|
59
|
-
let handle = await acquireLock(
|
|
124
|
+
let handle = await acquireLock(projectId, STORE_LOCK_ID, {
|
|
60
125
|
reason: `spec-store mutation for ${projectId}`,
|
|
61
126
|
});
|
|
62
127
|
while (handle === null && Date.now() < deadline) {
|
|
63
128
|
await new Promise((resolve) => setTimeout(resolve, STORE_LOCK_RETRY_MS));
|
|
64
|
-
handle = await acquireLock(
|
|
129
|
+
handle = await acquireLock(projectId, STORE_LOCK_ID, {
|
|
65
130
|
reason: `spec-store mutation for ${projectId}`,
|
|
66
131
|
});
|
|
67
132
|
}
|
|
@@ -75,14 +140,16 @@ async function withSpecMutationLock(projectId, fn) {
|
|
|
75
140
|
}
|
|
76
141
|
finally {
|
|
77
142
|
await releaseLock(handle).catch((error) => {
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
error: error instanceof Error ? error.message : String(error),
|
|
81
|
-
});
|
|
143
|
+
// reliability-cleanup: SPEC_MUTATION_LOCK_RELEASE — mutation outcome is already durable
|
|
144
|
+
reportClassifiedDegradation('SPEC_MUTATION_LOCK_RELEASE', error);
|
|
82
145
|
});
|
|
83
146
|
}
|
|
84
147
|
});
|
|
85
148
|
}
|
|
149
|
+
/** Administrative-only lock boundary for the digest-bound raw-store repair. */
|
|
150
|
+
export async function withCanonicalSpecRepairLock(projectId, fn) {
|
|
151
|
+
return withSpecMutationLock(projectId, fn);
|
|
152
|
+
}
|
|
86
153
|
/**
|
|
87
154
|
* Load all specs — from cache on subsequent calls, disk only on first access.
|
|
88
155
|
*
|
|
@@ -96,29 +163,29 @@ async function loadAll(projectId) {
|
|
|
96
163
|
if (cached !== undefined) {
|
|
97
164
|
return cached;
|
|
98
165
|
}
|
|
99
|
-
// SPEC-1007: migrate legacy <cwd>/data/projects/{id} to absolute home once.
|
|
100
|
-
await migrateLegacyDataDir(projectId);
|
|
101
166
|
const directFile = specsFile(projectId);
|
|
102
|
-
let
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
validate: (value) => Array.isArray(value),
|
|
111
|
-
expectedDescription: 'an array of specs',
|
|
112
|
-
});
|
|
167
|
+
let persisted;
|
|
168
|
+
try {
|
|
169
|
+
persisted = await readCriticalJson(directFile, []);
|
|
170
|
+
}
|
|
171
|
+
catch (error) {
|
|
172
|
+
if (error instanceof CriticalJsonReadError) {
|
|
173
|
+
const cause = new BoundaryFailure('Corrupt', 'critical JSON parse', 'The persisted bytes did not contain a valid JSON document.');
|
|
174
|
+
throw new BoundaryFailure('Corrupt', 'read spec-store', 'Recover specs.json; Planu will not replace corrupt state with defaults.', cause);
|
|
113
175
|
}
|
|
176
|
+
throw error;
|
|
114
177
|
}
|
|
178
|
+
const raw = decodeCriticalSchema(persisted, 'spec-store').data;
|
|
115
179
|
const specs = raw.map(normalizeSpec);
|
|
180
|
+
validateCanonicalSpecRows(projectId, specs);
|
|
116
181
|
specsCache.set(projectId, specs);
|
|
117
182
|
return specs;
|
|
118
183
|
}
|
|
119
184
|
async function saveAll(projectId, specs) {
|
|
120
|
-
|
|
121
|
-
|
|
185
|
+
const normalized = specs.map((spec) => normalizeSpec(spec));
|
|
186
|
+
validateCanonicalSpecRows(projectId, normalized);
|
|
187
|
+
await writeJson(specsFile(projectId), { schemaVersion: 1, data: normalized });
|
|
188
|
+
specsCache.set(projectId, normalized);
|
|
122
189
|
}
|
|
123
190
|
/** Evict the cache for a project (e.g. after external file changes). */
|
|
124
191
|
export function invalidateSpecsCache(projectId) {
|
|
@@ -153,7 +220,7 @@ export async function getSpecFresh(projectId, specId) {
|
|
|
153
220
|
/** SPEC-601: Lookup a spec by its globally unique UUID. */
|
|
154
221
|
export async function getSpecByUuid(projectId, uuid) {
|
|
155
222
|
const specs = await loadAll(projectId);
|
|
156
|
-
return specs.find((
|
|
223
|
+
return (specs.find((spec) => spec.uuid === uuid || spec.uuidAliases?.includes(uuid) === true) ?? null);
|
|
157
224
|
}
|
|
158
225
|
/**
|
|
159
226
|
* Create a new spec. Throws if a spec with the same ID already exists.
|
|
@@ -179,7 +246,12 @@ export async function createSpec(projectId, spec) {
|
|
|
179
246
|
* NOT exported from the barrel. Called only by `__internalSetStatus` and itself.
|
|
180
247
|
* All external callers must use `updateSpec` (non-status) or `transitionSpec` (status).
|
|
181
248
|
*/
|
|
182
|
-
|
|
249
|
+
function snapshotChanged(spec, expectedSnapshot) {
|
|
250
|
+
return Boolean(expectedSnapshot &&
|
|
251
|
+
(spec.status !== expectedSnapshot.status || spec.updatedAt !== expectedSnapshot.updatedAt));
|
|
252
|
+
}
|
|
253
|
+
// eslint-disable-next-line max-lines-per-function -- lifecycle status persistence is one atomic mutation boundary
|
|
254
|
+
async function __internalUpdateSpec(projectId, specId, updates, pendingBackgroundActions = [], expectedSnapshot, transitionRootBinding, reconciliation) {
|
|
183
255
|
return withSpecMutationLock(projectId, async () => {
|
|
184
256
|
const specs = await loadAll(projectId);
|
|
185
257
|
const idx = specs.findIndex((s) => s.id === specId);
|
|
@@ -190,9 +262,7 @@ async function __internalUpdateSpec(projectId, specId, updates, pendingBackgroun
|
|
|
190
262
|
if (!existing) {
|
|
191
263
|
throw new Error(`Spec "${specId}" not found in project "${projectId}"`);
|
|
192
264
|
}
|
|
193
|
-
if (expectedSnapshot
|
|
194
|
-
(existing.status !== expectedSnapshot.status ||
|
|
195
|
-
existing.updatedAt !== expectedSnapshot.updatedAt)) {
|
|
265
|
+
if (snapshotChanged(existing, expectedSnapshot)) {
|
|
196
266
|
throw new Error(`Spec "${specId}" changed after lifecycle gates ran; retry update_status with the fresh state.`);
|
|
197
267
|
}
|
|
198
268
|
const now = new Date().toISOString();
|
|
@@ -217,6 +287,8 @@ async function __internalUpdateSpec(projectId, specId, updates, pendingBackgroun
|
|
|
217
287
|
fromStatus: existing.status,
|
|
218
288
|
transitionId,
|
|
219
289
|
...(pendingBackgroundActions.length > 0 && { pendingBackgroundActions }),
|
|
290
|
+
...(pendingBackgroundActions.length > 0 &&
|
|
291
|
+
transitionRootBinding && { transitionRootBinding }),
|
|
220
292
|
...(pendingBackgroundActions.length > 0 && {
|
|
221
293
|
postCommitTasks: pendingBackgroundActions.map((name) => ({
|
|
222
294
|
name,
|
|
@@ -225,6 +297,13 @@ async function __internalUpdateSpec(projectId, specId, updates, pendingBackgroun
|
|
|
225
297
|
updatedAt: now,
|
|
226
298
|
})),
|
|
227
299
|
}),
|
|
300
|
+
...(reconciliation?.reconciliationRequestId
|
|
301
|
+
? {
|
|
302
|
+
reconciliationRequestId: reconciliation.reconciliationRequestId,
|
|
303
|
+
reconciliationBindingDigest: reconciliation.reconciliationBindingDigest,
|
|
304
|
+
trigger: reconciliation.trigger,
|
|
305
|
+
}
|
|
306
|
+
: {}),
|
|
228
307
|
};
|
|
229
308
|
updatedStatusHistory = [...(existing.statusHistory ?? []), entry];
|
|
230
309
|
}
|
|
@@ -250,8 +329,8 @@ async function __internalUpdateSpec(projectId, specId, updates, pendingBackgroun
|
|
|
250
329
|
* Importable exclusively from `src/engine/spec-state-machine/transition-spec.ts`.
|
|
251
330
|
* All status transitions must flow through `transitionSpec` → `__internalSetStatus`.
|
|
252
331
|
*/
|
|
253
|
-
export async function __internalSetStatus(projectId, specId, status, updates = {}, pendingBackgroundActions = [], expectedSnapshot) {
|
|
254
|
-
return __internalUpdateSpec(projectId, specId, { ...updates, status }, pendingBackgroundActions, expectedSnapshot);
|
|
332
|
+
export async function __internalSetStatus(projectId, specId, status, updates = {}, pendingBackgroundActions = [], expectedSnapshot, transitionRootBinding, reconciliation) {
|
|
333
|
+
return __internalUpdateSpec(projectId, specId, { ...updates, status }, pendingBackgroundActions, expectedSnapshot, transitionRootBinding, reconciliation);
|
|
255
334
|
}
|
|
256
335
|
/**
|
|
257
336
|
* Restore the exact snapshot captured before a lifecycle transition.
|
|
@@ -306,6 +385,21 @@ function isPendingPostCommitTask(task) {
|
|
|
306
385
|
return (task.status !== 'done' &&
|
|
307
386
|
!(task.status === 'failed' && task.attempts >= MAX_POST_COMMIT_ATTEMPTS));
|
|
308
387
|
}
|
|
388
|
+
function terminalizeExhaustedPostCommitTask(entry, tasks, taskIndex, current, now) {
|
|
389
|
+
const failedTask = {
|
|
390
|
+
name: current.name,
|
|
391
|
+
status: 'failed',
|
|
392
|
+
attempts: current.attempts,
|
|
393
|
+
updatedAt: now,
|
|
394
|
+
...(current.lastError ? { lastError: current.lastError } : {}),
|
|
395
|
+
};
|
|
396
|
+
const nextTasks = tasks.map((task, index) => (index === taskIndex ? failedTask : task));
|
|
397
|
+
return {
|
|
398
|
+
...entry,
|
|
399
|
+
postCommitTasks: nextTasks,
|
|
400
|
+
pendingBackgroundActions: nextTasks.filter(isPendingPostCommitTask).map((task) => task.name),
|
|
401
|
+
};
|
|
402
|
+
}
|
|
309
403
|
function pruneCompletedOutbox(history) {
|
|
310
404
|
let completedOutboxesKept = 0;
|
|
311
405
|
return [...history]
|
|
@@ -329,6 +423,7 @@ function pruneCompletedOutbox(history) {
|
|
|
329
423
|
* Atomically claim one durable post-commit task.
|
|
330
424
|
* Legacy transition receipts are materialized only when the task was explicitly planned.
|
|
331
425
|
*/
|
|
426
|
+
// eslint-disable-next-line max-lines-per-function -- claim and exhaustion normalization share one atomic mutation boundary
|
|
332
427
|
export async function claimPostCommitTask(projectId, specId, transitionId, taskName, options = {}) {
|
|
333
428
|
return withSpecMutationLock(projectId, async () => {
|
|
334
429
|
const specs = await loadAll(projectId);
|
|
@@ -342,6 +437,7 @@ export async function claimPostCommitTask(projectId, specId, transitionId, taskN
|
|
|
342
437
|
const claimResult = {
|
|
343
438
|
value: { claimed: false, reason: 'missing' },
|
|
344
439
|
};
|
|
440
|
+
const normalizedExhausted = { value: false };
|
|
345
441
|
const nextHistory = updateOutboxReceipt(existing.statusHistory, transitionId, (entry) => {
|
|
346
442
|
const tasks = materializePostCommitTasks(entry);
|
|
347
443
|
const taskIndex = tasks.findIndex((task) => task.name === taskName);
|
|
@@ -353,10 +449,6 @@ export async function claimPostCommitTask(projectId, specId, transitionId, taskN
|
|
|
353
449
|
claimResult.value = { claimed: false, reason: 'done' };
|
|
354
450
|
return entry;
|
|
355
451
|
}
|
|
356
|
-
if (current.attempts >= MAX_POST_COMMIT_ATTEMPTS) {
|
|
357
|
-
claimResult.value = { claimed: false, reason: 'done' };
|
|
358
|
-
return entry;
|
|
359
|
-
}
|
|
360
452
|
if (current.status === 'running' &&
|
|
361
453
|
current.leaseExpiresAt &&
|
|
362
454
|
Date.parse(current.leaseExpiresAt) > nowMs) {
|
|
@@ -367,6 +459,11 @@ export async function claimPostCommitTask(projectId, specId, transitionId, taskN
|
|
|
367
459
|
};
|
|
368
460
|
return entry;
|
|
369
461
|
}
|
|
462
|
+
if (current.attempts >= MAX_POST_COMMIT_ATTEMPTS) {
|
|
463
|
+
claimResult.value = { claimed: false, reason: 'done' };
|
|
464
|
+
normalizedExhausted.value = true;
|
|
465
|
+
return terminalizeExhaustedPostCommitTask(entry, tasks, taskIndex, current, now);
|
|
466
|
+
}
|
|
370
467
|
const executionId = randomUUID();
|
|
371
468
|
const attempts = current.attempts + 1;
|
|
372
469
|
const claimedTask = {
|
|
@@ -387,7 +484,7 @@ export async function claimPostCommitTask(projectId, specId, transitionId, taskN
|
|
|
387
484
|
.map((task) => task.name),
|
|
388
485
|
};
|
|
389
486
|
});
|
|
390
|
-
if (!nextHistory || !claimResult.value.claimed) {
|
|
487
|
+
if (!nextHistory || (!claimResult.value.claimed && !normalizedExhausted.value)) {
|
|
391
488
|
return claimResult.value;
|
|
392
489
|
}
|
|
393
490
|
const updated = { ...existing, statusHistory: nextHistory };
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/** Publish one complete canonical status snapshot with same-directory atomic replacement. */
|
|
2
|
+
export declare function atomicStatusWrite(statusPath: string, status: unknown): Promise<void>;
|
|
3
|
+
/** Remove only default atomic-write temporaries whose local owner process is dead. */
|
|
4
|
+
export declare function cleanupDeadStatusTemps(statusPath: string): Promise<number>;
|
|
5
|
+
//# sourceMappingURL=atomic-status-write.d.ts.map
|