@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
|
@@ -1,130 +0,0 @@
|
|
|
1
|
-
// tools/checkpoint-handler.ts — Handler for session_checkpoint tool (SPEC-220).
|
|
2
|
-
import { execFileSync } from 'node:child_process';
|
|
3
|
-
import { saveSessionState, getStagedFiles, getActiveSpecIds, } from '../storage/session-state-store.js';
|
|
4
|
-
import { hashProjectPath } from '../storage/base-store.js';
|
|
5
|
-
import { listSpecs } from '../storage/spec-store.js';
|
|
6
|
-
// ---------------------------------------------------------------------------
|
|
7
|
-
// Internal helpers
|
|
8
|
-
// ---------------------------------------------------------------------------
|
|
9
|
-
const SEPARATOR = '━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━';
|
|
10
|
-
function formatList(items) {
|
|
11
|
-
if (items.length === 0) {
|
|
12
|
-
return '(none)';
|
|
13
|
-
}
|
|
14
|
-
return items.map((i) => `- ${i}`).join('\n');
|
|
15
|
-
}
|
|
16
|
-
function buildHandoffBlock(savedAt, activeSpecs, decisions, nextSteps, stagedFiles) {
|
|
17
|
-
const lines = [
|
|
18
|
-
`Saved: ${savedAt}`,
|
|
19
|
-
'',
|
|
20
|
-
`Active specs: ${activeSpecs.length > 0 ? activeSpecs.join(', ') : '(none)'}`,
|
|
21
|
-
'',
|
|
22
|
-
'Decisions:',
|
|
23
|
-
formatList(decisions),
|
|
24
|
-
'',
|
|
25
|
-
'Next steps:',
|
|
26
|
-
formatList(nextSteps),
|
|
27
|
-
'',
|
|
28
|
-
`Staged files: ${stagedFiles.length > 0 ? stagedFiles.join(', ') : '(none)'}`,
|
|
29
|
-
];
|
|
30
|
-
return lines.join('\n');
|
|
31
|
-
}
|
|
32
|
-
async function resolveActiveSpecs(projectPath, projectId) {
|
|
33
|
-
// Try spec store first (in-progress specs)
|
|
34
|
-
try {
|
|
35
|
-
const resolvedId = projectId !== '' ? projectId : hashProjectPath(projectPath);
|
|
36
|
-
const specs = await listSpecs(resolvedId);
|
|
37
|
-
const inProgress = specs
|
|
38
|
-
.filter((s) => s.status === 'implementing')
|
|
39
|
-
.map((s) => `${s.id} (${s.status})`);
|
|
40
|
-
if (inProgress.length > 0) {
|
|
41
|
-
return inProgress;
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
catch {
|
|
45
|
-
// Fallback to filesystem scan
|
|
46
|
-
}
|
|
47
|
-
return getActiveSpecIds(projectPath);
|
|
48
|
-
}
|
|
49
|
-
// ---------------------------------------------------------------------------
|
|
50
|
-
// Pending HTML changes notification (SPEC-326)
|
|
51
|
-
// ---------------------------------------------------------------------------
|
|
52
|
-
function checkPlanuUncommittedChanges(projectPath) {
|
|
53
|
-
try {
|
|
54
|
-
const output = execFileSync('git', ['status', '--porcelain', 'planu/'], {
|
|
55
|
-
cwd: projectPath,
|
|
56
|
-
encoding: 'utf-8',
|
|
57
|
-
timeout: 5_000,
|
|
58
|
-
stdio: ['pipe', 'pipe', 'pipe'],
|
|
59
|
-
});
|
|
60
|
-
return output.trim().length > 0;
|
|
61
|
-
}
|
|
62
|
-
catch {
|
|
63
|
-
return false;
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
// ---------------------------------------------------------------------------
|
|
67
|
-
// Worktree teardown recommendation (SPEC-279)
|
|
68
|
-
// ---------------------------------------------------------------------------
|
|
69
|
-
function buildWorktreeTeardownRecommendation(activeSpecs) {
|
|
70
|
-
const specNames = activeSpecs.map((s) => s.replace(/ \(implementing\)$/, '')).join(', ');
|
|
71
|
-
return {
|
|
72
|
-
type: 'worktree-teardown',
|
|
73
|
-
message: `Parallel sprint detected — ${String(activeSpecs.length)} specs in progress (${specNames}). Run these steps to close the sprint safely:`,
|
|
74
|
-
steps: [
|
|
75
|
-
'For each worktree: bash scripts/auto-merge.sh (full pipeline + merge to develop)',
|
|
76
|
-
'bash scripts/prune-worktrees.sh (clean up merged/orphan worktrees)',
|
|
77
|
-
'pnpm test:coverage (verify thresholds before promoting to main)',
|
|
78
|
-
'git checkout main && git merge --ff-only develop && git push origin main',
|
|
79
|
-
],
|
|
80
|
-
};
|
|
81
|
-
}
|
|
82
|
-
// ---------------------------------------------------------------------------
|
|
83
|
-
// Handler
|
|
84
|
-
// ---------------------------------------------------------------------------
|
|
85
|
-
export async function handleSessionCheckpoint(args) {
|
|
86
|
-
const { projectPath, projectId, decisions = [], nextSteps = [] } = args;
|
|
87
|
-
const savedAt = new Date().toISOString();
|
|
88
|
-
const stagedFiles = getStagedFiles(projectPath);
|
|
89
|
-
const activeSpecs = await resolveActiveSpecs(projectPath, projectId);
|
|
90
|
-
await saveSessionState(projectPath, {
|
|
91
|
-
savedAt,
|
|
92
|
-
activeSpecs,
|
|
93
|
-
recentDecisions: decisions.slice(0, 5),
|
|
94
|
-
stagedFiles,
|
|
95
|
-
nextSteps,
|
|
96
|
-
});
|
|
97
|
-
const handoff = buildHandoffBlock(savedAt, activeSpecs, decisions, nextSteps, stagedFiles);
|
|
98
|
-
// SPEC-256: always include /btw tip in checkpoint recommendations
|
|
99
|
-
const recommendations = [
|
|
100
|
-
{
|
|
101
|
-
type: 'context-tip',
|
|
102
|
-
message: 'Use /btw for side questions during implementation — keeps context clean for the task. Example: /btw what does useEffect cleanup do?',
|
|
103
|
-
command: '/btw your question here',
|
|
104
|
-
},
|
|
105
|
-
];
|
|
106
|
-
// SPEC-279: emit worktree teardown instructions when a parallel sprint is detected
|
|
107
|
-
if (activeSpecs.length >= 2) {
|
|
108
|
-
recommendations.push(buildWorktreeTeardownRecommendation(activeSpecs));
|
|
109
|
-
}
|
|
110
|
-
// SPEC-326: Pending HTML changes notification
|
|
111
|
-
const planuChanges = checkPlanuUncommittedChanges(projectPath);
|
|
112
|
-
const planuReminder = planuChanges
|
|
113
|
-
? '\n\n📁 Spec changes pending — commit to save: `git add planu/specs/ planu/conventions.json && git commit -m "chore(planu): save spec updates"`'
|
|
114
|
-
: '';
|
|
115
|
-
const text = [
|
|
116
|
-
`Session checkpoint saved — ${savedAt}`,
|
|
117
|
-
'',
|
|
118
|
-
'Session Handoff Block (paste in new session):',
|
|
119
|
-
SEPARATOR,
|
|
120
|
-
handoff,
|
|
121
|
-
SEPARATOR,
|
|
122
|
-
].join('\n') + planuReminder;
|
|
123
|
-
return {
|
|
124
|
-
content: [{ type: 'text', text }],
|
|
125
|
-
structuredContent: {
|
|
126
|
-
recommendations,
|
|
127
|
-
},
|
|
128
|
-
};
|
|
129
|
-
}
|
|
130
|
-
//# sourceMappingURL=checkpoint-handler.js.map
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import type { PriorDecisionLink } from '../../../types/prior-decisions.js';
|
|
2
|
-
/**
|
|
3
|
-
* Find prior decisions relevant to the new spec (AC1/AC2).
|
|
4
|
-
*
|
|
5
|
-
* Returns an empty array when:
|
|
6
|
-
* - No decisions have been logged (AC4 — omit when empty)
|
|
7
|
-
* - Any storage or search error occurs (best-effort, never blocks)
|
|
8
|
-
*
|
|
9
|
-
* @param projectId - hashed project identifier
|
|
10
|
-
* @param description - spec description + title (combined query text)
|
|
11
|
-
* @param tags - spec tags appended to the query for richer overlap
|
|
12
|
-
*/
|
|
13
|
-
export declare function runPriorDecisionsHint(projectId: string, description: string, tags: string[]): Promise<PriorDecisionLink[]>;
|
|
14
|
-
//# sourceMappingURL=prior-decisions-hint.d.ts.map
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
// tools/create-spec/adapters/prior-decisions-hint.ts — SPEC-615
|
|
2
|
-
// Best-effort adapter: searches logged decisions for keyword overlap with the
|
|
3
|
-
// new spec and returns formatted prior-decision links (AC1/AC2/AC4).
|
|
4
|
-
import { getDecisions } from '../../../storage/decision-store.js';
|
|
5
|
-
import { searchPriorDecisions } from '../../../engine/prior-decisions/index.js';
|
|
6
|
-
/**
|
|
7
|
-
* Find prior decisions relevant to the new spec (AC1/AC2).
|
|
8
|
-
*
|
|
9
|
-
* Returns an empty array when:
|
|
10
|
-
* - No decisions have been logged (AC4 — omit when empty)
|
|
11
|
-
* - Any storage or search error occurs (best-effort, never blocks)
|
|
12
|
-
*
|
|
13
|
-
* @param projectId - hashed project identifier
|
|
14
|
-
* @param description - spec description + title (combined query text)
|
|
15
|
-
* @param tags - spec tags appended to the query for richer overlap
|
|
16
|
-
*/
|
|
17
|
-
export async function runPriorDecisionsHint(projectId, description, tags) {
|
|
18
|
-
try {
|
|
19
|
-
const decisions = await getDecisions(projectId);
|
|
20
|
-
if (decisions.length === 0) {
|
|
21
|
-
return [];
|
|
22
|
-
}
|
|
23
|
-
const query = tags.length > 0 ? `${description} ${tags.join(' ')}` : description;
|
|
24
|
-
return searchPriorDecisions(query, decisions);
|
|
25
|
-
}
|
|
26
|
-
catch {
|
|
27
|
-
return [];
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
//# sourceMappingURL=prior-decisions-hint.js.map
|
|
@@ -1,90 +0,0 @@
|
|
|
1
|
-
import { hashProjectPath } from '../storage/base-store.js';
|
|
2
|
-
import * as sessionStore from '../storage/session-store.js';
|
|
3
|
-
function formatAsMarkdown(session) {
|
|
4
|
-
const lines = [];
|
|
5
|
-
lines.push(`# Session Export: ${session.id}`);
|
|
6
|
-
lines.push('');
|
|
7
|
-
lines.push(`## Summary`);
|
|
8
|
-
lines.push(`- **Project**: ${session.projectId}`);
|
|
9
|
-
lines.push(`- **Started**: ${session.startedAt}`);
|
|
10
|
-
lines.push(`- **Last Saved**: ${session.lastSavedAt}`);
|
|
11
|
-
lines.push(`- **Tool Calls**: ${String(session.toolCallCount)}`);
|
|
12
|
-
lines.push('');
|
|
13
|
-
if (session.activeSpecs.length > 0) {
|
|
14
|
-
lines.push('## Active Specs');
|
|
15
|
-
for (const spec of session.activeSpecs) {
|
|
16
|
-
lines.push(`- **${spec.specId}** (${spec.status}): ${spec.summary}`);
|
|
17
|
-
}
|
|
18
|
-
lines.push('');
|
|
19
|
-
}
|
|
20
|
-
if (session.decisions.length > 0) {
|
|
21
|
-
lines.push('## Decisions');
|
|
22
|
-
for (const d of session.decisions) {
|
|
23
|
-
const specRef = d.specId ? ` [${d.specId}]` : '';
|
|
24
|
-
lines.push(`- **${d.decision}**${specRef}`);
|
|
25
|
-
if (d.rationale) {
|
|
26
|
-
lines.push(` - _${d.rationale}_`);
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
lines.push('');
|
|
30
|
-
}
|
|
31
|
-
if (session.modifiedFiles.length > 0) {
|
|
32
|
-
lines.push('## Modified Files');
|
|
33
|
-
for (const f of session.modifiedFiles) {
|
|
34
|
-
lines.push(`- \`${f.path}\` (${f.action})`);
|
|
35
|
-
}
|
|
36
|
-
lines.push('');
|
|
37
|
-
}
|
|
38
|
-
if (Object.keys(session.metadata).length > 0) {
|
|
39
|
-
lines.push('## Metadata');
|
|
40
|
-
lines.push('```json');
|
|
41
|
-
lines.push(JSON.stringify(session.metadata, null, 2));
|
|
42
|
-
lines.push('```');
|
|
43
|
-
}
|
|
44
|
-
return lines.join('\n');
|
|
45
|
-
}
|
|
46
|
-
export async function handleExportSession(params) {
|
|
47
|
-
const projectId = hashProjectPath(params.projectPath);
|
|
48
|
-
const format = params.format ?? 'markdown';
|
|
49
|
-
try {
|
|
50
|
-
let session;
|
|
51
|
-
if (params.sessionId) {
|
|
52
|
-
session = await sessionStore.load(projectId, params.sessionId);
|
|
53
|
-
}
|
|
54
|
-
else {
|
|
55
|
-
session = await sessionStore.getLatest(projectId);
|
|
56
|
-
}
|
|
57
|
-
if (!session) {
|
|
58
|
-
return {
|
|
59
|
-
content: [{ type: 'text', text: 'No sessions found for this project.' }],
|
|
60
|
-
};
|
|
61
|
-
}
|
|
62
|
-
if (format === 'json') {
|
|
63
|
-
const summary = [
|
|
64
|
-
`✅ **Session exported:** ${session.id}`,
|
|
65
|
-
'',
|
|
66
|
-
`**Project:** ${session.projectId}`,
|
|
67
|
-
`**Started:** ${session.startedAt}`,
|
|
68
|
-
`**Tool Calls:** ${String(session.toolCallCount)}`,
|
|
69
|
-
`**Active Specs:** ${String(session.activeSpecs.length)}`,
|
|
70
|
-
`**Decisions:** ${String(session.decisions.length)}`,
|
|
71
|
-
`**Modified Files:** ${String(session.modifiedFiles.length)}`,
|
|
72
|
-
].join('\n');
|
|
73
|
-
return {
|
|
74
|
-
content: [{ type: 'text', text: summary }],
|
|
75
|
-
structuredContent: session,
|
|
76
|
-
};
|
|
77
|
-
}
|
|
78
|
-
return {
|
|
79
|
-
content: [{ type: 'text', text: formatAsMarkdown(session) }],
|
|
80
|
-
};
|
|
81
|
-
}
|
|
82
|
-
catch (error) {
|
|
83
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
84
|
-
return {
|
|
85
|
-
content: [{ type: 'text', text: `Error exporting session: ${message}` }],
|
|
86
|
-
isError: true,
|
|
87
|
-
};
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
//# sourceMappingURL=export-session.js.map
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Locations where an ancestor `data/projects/<projectId>/` directory was
|
|
3
|
-
* found. Empty array means no ancestor data exists.
|
|
4
|
-
*/
|
|
5
|
-
export interface AncestorDataReport {
|
|
6
|
-
/** Hits found by walking up from the projectPath itself. */
|
|
7
|
-
fromProjectPath: string[];
|
|
8
|
-
/** Hits found by walking up from process.cwd(). */
|
|
9
|
-
fromCwd: string[];
|
|
10
|
-
}
|
|
11
|
-
/**
|
|
12
|
-
* Scan for ancestor `data/projects/<projectId>/` dirs above projectPath and cwd.
|
|
13
|
-
* Returns deduplicated absolute paths (no double-counting when projectPath and
|
|
14
|
-
* cwd share an ancestor).
|
|
15
|
-
*/
|
|
16
|
-
export declare function detectAncestorDataDirs(projectPath: string, projectId: string, cwd?: string): Promise<AncestorDataReport>;
|
|
17
|
-
/**
|
|
18
|
-
* Build a single human-readable warning line summarizing every ancestor data
|
|
19
|
-
* dir hit. Returns null when no warning is needed.
|
|
20
|
-
*/
|
|
21
|
-
export declare function buildAncestorDataWarning(report: AncestorDataReport): string | null;
|
|
22
|
-
//# sourceMappingURL=ancestor-data-detector.d.ts.map
|
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
// tools/init-project/ancestor-data-detector.ts
|
|
2
|
-
//
|
|
3
|
-
// Detects existing `data/projects/<id>/` directories in ancestors of the
|
|
4
|
-
// projectPath and in ancestors of the current cwd. When such a dir exists,
|
|
5
|
-
// init_project would otherwise create a parallel, divergent data root in the
|
|
6
|
-
// new cwd-relative location — splitting the project state across two
|
|
7
|
-
// physical paths and confusing every downstream tool.
|
|
8
|
-
//
|
|
9
|
-
// This helper is read-only: it only reports findings. The handler decides
|
|
10
|
-
// whether to surface them as warnings or block.
|
|
11
|
-
import { stat } from 'node:fs/promises';
|
|
12
|
-
import { dirname, isAbsolute, join } from 'node:path';
|
|
13
|
-
const MAX_WALK_DEPTH = 8;
|
|
14
|
-
async function isExistingDir(p) {
|
|
15
|
-
try {
|
|
16
|
-
const s = await stat(p);
|
|
17
|
-
return s.isDirectory();
|
|
18
|
-
}
|
|
19
|
-
catch {
|
|
20
|
-
return false;
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
async function walkUpForDir(startDir, relative) {
|
|
24
|
-
if (!isAbsolute(startDir)) {
|
|
25
|
-
return null;
|
|
26
|
-
}
|
|
27
|
-
let current = startDir;
|
|
28
|
-
for (let i = 0; i < MAX_WALK_DEPTH; i++) {
|
|
29
|
-
const candidate = join(current, relative);
|
|
30
|
-
if (await isExistingDir(candidate)) {
|
|
31
|
-
return candidate;
|
|
32
|
-
}
|
|
33
|
-
const parent = dirname(current);
|
|
34
|
-
if (parent === current) {
|
|
35
|
-
return null;
|
|
36
|
-
}
|
|
37
|
-
current = parent;
|
|
38
|
-
}
|
|
39
|
-
return null;
|
|
40
|
-
}
|
|
41
|
-
/**
|
|
42
|
-
* Scan for ancestor `data/projects/<projectId>/` dirs above projectPath and cwd.
|
|
43
|
-
* Returns deduplicated absolute paths (no double-counting when projectPath and
|
|
44
|
-
* cwd share an ancestor).
|
|
45
|
-
*/
|
|
46
|
-
export async function detectAncestorDataDirs(projectPath, projectId, cwd = process.cwd()) {
|
|
47
|
-
const subPath = join('data', 'projects', projectId);
|
|
48
|
-
const seen = new Set();
|
|
49
|
-
const fromProjectPath = [];
|
|
50
|
-
const cursor = isAbsolute(projectPath) ? dirname(projectPath) : null;
|
|
51
|
-
if (cursor !== null) {
|
|
52
|
-
const hit = await walkUpForDir(cursor, subPath);
|
|
53
|
-
if (hit !== null && !seen.has(hit)) {
|
|
54
|
-
seen.add(hit);
|
|
55
|
-
fromProjectPath.push(hit);
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
const fromCwd = [];
|
|
59
|
-
if (cwd !== projectPath) {
|
|
60
|
-
const hit = await walkUpForDir(cwd, subPath);
|
|
61
|
-
if (hit !== null && !seen.has(hit)) {
|
|
62
|
-
seen.add(hit);
|
|
63
|
-
fromCwd.push(hit);
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
return { fromProjectPath, fromCwd };
|
|
67
|
-
}
|
|
68
|
-
/**
|
|
69
|
-
* Build a single human-readable warning line summarizing every ancestor data
|
|
70
|
-
* dir hit. Returns null when no warning is needed.
|
|
71
|
-
*/
|
|
72
|
-
export function buildAncestorDataWarning(report) {
|
|
73
|
-
const all = [...report.fromProjectPath, ...report.fromCwd];
|
|
74
|
-
if (all.length === 0) {
|
|
75
|
-
return null;
|
|
76
|
-
}
|
|
77
|
-
const list = all.map((p) => ` • ${p}`).join('\n');
|
|
78
|
-
return (`Existing Planu data found in ancestor directories — this project's state may be split across multiple locations:\n${list}\n` +
|
|
79
|
-
`If specs go missing, copy the contents into <projectPath>/data/projects/<id>/ and reopen Claude Code from the project root.`);
|
|
80
|
-
}
|
|
81
|
-
//# sourceMappingURL=ancestor-data-detector.js.map
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import type { PricingTier, ToolResult } from '../types/index.js';
|
|
2
|
-
export declare function getCurrentTier(): Promise<PricingTier>;
|
|
3
|
-
export declare function invalidateTierCache(): void;
|
|
4
|
-
/**
|
|
5
|
-
* Synchronous tier estimate based on environment variables only — no disk I/O.
|
|
6
|
-
* Used at server startup to set the display name before async validation runs.
|
|
7
|
-
* Returns 'enterprise' for owner token, 'pro' if a license key env var is set, 'free' otherwise.
|
|
8
|
-
*/
|
|
9
|
-
export declare function getTierSync(): PricingTier;
|
|
10
|
-
export declare function shouldBypassDailyRateLimit(toolName: string): boolean;
|
|
11
|
-
export declare function withLicenseGate<T>(toolName: string, handler: (args: T, extra?: unknown) => Promise<ToolResult>): (args: T, extra?: unknown) => Promise<ToolResult>;
|
|
12
|
-
/**
|
|
13
|
-
* Wraps a handler with rate limiting (free tier only) and usage event recording.
|
|
14
|
-
* For free tier: checks daily limit + cooldown before executing.
|
|
15
|
-
* For all tiers: records a usage event after execution (fire-and-forget).
|
|
16
|
-
*/
|
|
17
|
-
export declare function withUsageTracking<T>(toolName: string, handler: (args: T, extra?: unknown) => Promise<ToolResult>): (args: T, extra?: unknown) => Promise<ToolResult>;
|
|
18
|
-
//# sourceMappingURL=license-gate.d.ts.map
|
|
@@ -1,222 +0,0 @@
|
|
|
1
|
-
// tools/license-gate.ts — Runtime license enforcement for MCP tool handlers.
|
|
2
|
-
// Provides getCurrentTier() with in-memory cache and withLicenseGate() wrapper.
|
|
3
|
-
import { createHash } from 'node:crypto';
|
|
4
|
-
import { licenseStore } from '../storage/index.js';
|
|
5
|
-
import * as usageStore from '../storage/usage-store.js';
|
|
6
|
-
import { resolveCurrentTier, checkToolAccess, isValidationFresh, isInGracePeriod, validateLicense, computeMachineFingerprint, isOpenAccessActive, } from '../engine/license-validator.js';
|
|
7
|
-
import { evaluateRateLimit, isTrialActive, trialDaysRemaining, recordUsageEvent, } from '../engine/usage-tracker/index.js';
|
|
8
|
-
import { getSessionContext } from '../transports/session-context.js';
|
|
9
|
-
// ---------------------------------------------------------------------------
|
|
10
|
-
// Owner token override (SHA-256 verified, not reversible)
|
|
11
|
-
// ---------------------------------------------------------------------------
|
|
12
|
-
// Salt prefix for owner token hashing (v1). New token hashes must be generated
|
|
13
|
-
// as: sha256(HASH_SALT + token). To regenerate OWNER_TOKEN_HASH run:
|
|
14
|
-
// node -e "const{createHash}=require('crypto');console.log(createHash('sha256').update('planu-owner-v1'+process.argv[1]).digest('hex'))" <token>
|
|
15
|
-
const HASH_SALT = 'planu-owner-v1';
|
|
16
|
-
// Hash generated without salt (legacy). Kept for migration: if you rotate the
|
|
17
|
-
// owner token, generate a new salted hash and replace OWNER_TOKEN_HASH_V1.
|
|
18
|
-
const OWNER_TOKEN_HASH = '9f9e8410fd0a718540fe1e29f7beaa2506b539c8732915d8eddcb3bcff9b9465';
|
|
19
|
-
function checkOwnerOverride() {
|
|
20
|
-
const token = process.env.SDD_OWNER_TOKEN;
|
|
21
|
-
if (!token) {
|
|
22
|
-
return null;
|
|
23
|
-
}
|
|
24
|
-
const trimmed = token.trim();
|
|
25
|
-
// Try salted hash first (current scheme).
|
|
26
|
-
const saltedHash = createHash('sha256')
|
|
27
|
-
.update(HASH_SALT + trimmed)
|
|
28
|
-
.digest('hex');
|
|
29
|
-
if (saltedHash === OWNER_TOKEN_HASH) {
|
|
30
|
-
return 'enterprise';
|
|
31
|
-
}
|
|
32
|
-
// Fall back to legacy unsalted hash so existing tokens keep working.
|
|
33
|
-
// DEPRECATED: regenerate OWNER_TOKEN_HASH with salt when rotating the token.
|
|
34
|
-
const legacyHash = createHash('sha256').update(trimmed).digest('hex');
|
|
35
|
-
return legacyHash === OWNER_TOKEN_HASH ? 'enterprise' : null;
|
|
36
|
-
}
|
|
37
|
-
// ---------------------------------------------------------------------------
|
|
38
|
-
// In-memory tier cache (avoids disk read on every tool call)
|
|
39
|
-
// ---------------------------------------------------------------------------
|
|
40
|
-
const CACHE_TTL_MS = 5 * 60 * 1000; // 5 minutes
|
|
41
|
-
let cachedTier = null;
|
|
42
|
-
let cacheTimestamp = 0;
|
|
43
|
-
export async function getCurrentTier() {
|
|
44
|
-
// Per-session license key (hosted multi-tenant mode via HTTP transport)
|
|
45
|
-
const sessionCtx = getSessionContext();
|
|
46
|
-
if (sessionCtx?.licenseKey) {
|
|
47
|
-
return resolveSessionTier(sessionCtx.licenseKey);
|
|
48
|
-
}
|
|
49
|
-
const now = Date.now();
|
|
50
|
-
if (cachedTier !== null && now - cacheTimestamp < CACHE_TTL_MS) {
|
|
51
|
-
return cachedTier;
|
|
52
|
-
}
|
|
53
|
-
const ownerTier = checkOwnerOverride();
|
|
54
|
-
if (ownerTier) {
|
|
55
|
-
cachedTier = ownerTier;
|
|
56
|
-
cacheTimestamp = now;
|
|
57
|
-
return cachedTier;
|
|
58
|
-
}
|
|
59
|
-
let state = await licenseStore.getLicenseState();
|
|
60
|
-
// Synchronous online validation when license is stale (>7 days)
|
|
61
|
-
if (state && !isValidationFresh(state)) {
|
|
62
|
-
state = await performOnlineValidation(state);
|
|
63
|
-
}
|
|
64
|
-
cachedTier = resolveCurrentTier(state);
|
|
65
|
-
cacheTimestamp = now;
|
|
66
|
-
return cachedTier;
|
|
67
|
-
}
|
|
68
|
-
export function invalidateTierCache() {
|
|
69
|
-
cachedTier = null;
|
|
70
|
-
cacheTimestamp = 0;
|
|
71
|
-
}
|
|
72
|
-
/**
|
|
73
|
-
* Synchronous tier estimate based on environment variables only — no disk I/O.
|
|
74
|
-
* Used at server startup to set the display name before async validation runs.
|
|
75
|
-
* Returns 'enterprise' for owner token, 'pro' if a license key env var is set, 'free' otherwise.
|
|
76
|
-
*/
|
|
77
|
-
export function getTierSync() {
|
|
78
|
-
if (checkOwnerOverride()) {
|
|
79
|
-
return 'enterprise';
|
|
80
|
-
}
|
|
81
|
-
if (process.env.SDD_LICENSE_KEY?.trim()) {
|
|
82
|
-
return 'pro';
|
|
83
|
-
}
|
|
84
|
-
return 'free';
|
|
85
|
-
}
|
|
86
|
-
// ---------------------------------------------------------------------------
|
|
87
|
-
// Per-session license resolution (hosted multi-tenant mode)
|
|
88
|
-
// ---------------------------------------------------------------------------
|
|
89
|
-
const sessionTierCache = new Map();
|
|
90
|
-
const SESSION_TIER_TTL_MS = 10 * 60 * 1000; // 10 min — longer since online validation is expensive
|
|
91
|
-
const RATE_LIMIT_EXEMPT_TOOLS = new Set([
|
|
92
|
-
'planu_status',
|
|
93
|
-
'update_status_batch',
|
|
94
|
-
'configure_code_graph',
|
|
95
|
-
'code_graph_status',
|
|
96
|
-
]);
|
|
97
|
-
export function shouldBypassDailyRateLimit(toolName) {
|
|
98
|
-
return RATE_LIMIT_EXEMPT_TOOLS.has(toolName);
|
|
99
|
-
}
|
|
100
|
-
async function resolveSessionTier(licenseKey) {
|
|
101
|
-
const now = Date.now();
|
|
102
|
-
const cached = sessionTierCache.get(licenseKey);
|
|
103
|
-
if (cached && now < cached.expiresAt) {
|
|
104
|
-
return cached.tier;
|
|
105
|
-
}
|
|
106
|
-
try {
|
|
107
|
-
const result = await validateLicense(licenseKey, 'hosted');
|
|
108
|
-
const tier = result.valid ? 'pro' : 'free';
|
|
109
|
-
sessionTierCache.set(licenseKey, { tier, expiresAt: now + SESSION_TIER_TTL_MS });
|
|
110
|
-
return tier;
|
|
111
|
-
}
|
|
112
|
-
catch {
|
|
113
|
-
// API unreachable — degrade to free (no grace period for session keys)
|
|
114
|
-
sessionTierCache.set(licenseKey, { tier: 'free', expiresAt: now + 60_000 }); // retry in 1 min
|
|
115
|
-
return 'free';
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
// ---------------------------------------------------------------------------
|
|
119
|
-
// License gate wrapper
|
|
120
|
-
// ---------------------------------------------------------------------------
|
|
121
|
-
export function withLicenseGate(toolName, handler) {
|
|
122
|
-
return async (args, extra) => {
|
|
123
|
-
const tier = await getCurrentTier();
|
|
124
|
-
const trialContext = await resolveTrialContext(tier);
|
|
125
|
-
const check = checkToolAccess(toolName, tier, trialContext);
|
|
126
|
-
if (!check.allowed) {
|
|
127
|
-
return { content: [{ type: 'text', text: check.message }], isError: true };
|
|
128
|
-
}
|
|
129
|
-
return handler(args, extra);
|
|
130
|
-
};
|
|
131
|
-
}
|
|
132
|
-
/**
|
|
133
|
-
* Resolves trial activity for free-tier users. Returns empty context for paid tiers
|
|
134
|
-
* (no need to query trial state — they already have full access).
|
|
135
|
-
*/
|
|
136
|
-
async function resolveTrialContext(tier) {
|
|
137
|
-
if (tier !== 'free') {
|
|
138
|
-
return { trialActive: false, trialDaysRemaining: 0 };
|
|
139
|
-
}
|
|
140
|
-
try {
|
|
141
|
-
const trialState = await usageStore.ensureTrialState();
|
|
142
|
-
return {
|
|
143
|
-
trialActive: isTrialActive(trialState.firstRunAt),
|
|
144
|
-
trialDaysRemaining: trialDaysRemaining(trialState.firstRunAt),
|
|
145
|
-
};
|
|
146
|
-
}
|
|
147
|
-
catch {
|
|
148
|
-
return { trialActive: false, trialDaysRemaining: 0 };
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
// ---------------------------------------------------------------------------
|
|
152
|
-
// Usage tracking wrapper
|
|
153
|
-
// ---------------------------------------------------------------------------
|
|
154
|
-
/**
|
|
155
|
-
* Wraps a handler with rate limiting (free tier only) and usage event recording.
|
|
156
|
-
* For free tier: checks daily limit + cooldown before executing.
|
|
157
|
-
* For all tiers: records a usage event after execution (fire-and-forget).
|
|
158
|
-
*/
|
|
159
|
-
export function withUsageTracking(toolName, handler) {
|
|
160
|
-
return async (args, extra) => {
|
|
161
|
-
const tier = await getCurrentTier();
|
|
162
|
-
// During open-access window, skip rate limiting for free tier
|
|
163
|
-
if (tier === 'free' && !isOpenAccessActive() && !shouldBypassDailyRateLimit(toolName)) {
|
|
164
|
-
const today = new Date().toISOString().slice(0, 10);
|
|
165
|
-
const [trialState, callCount, lastCallAt] = await Promise.all([
|
|
166
|
-
usageStore.ensureTrialState(),
|
|
167
|
-
usageStore.getDailyCallCount(today),
|
|
168
|
-
usageStore.getLastCallTimestamp(),
|
|
169
|
-
]);
|
|
170
|
-
const maxCalls = isTrialActive(trialState.firstRunAt) ? 50 : 30;
|
|
171
|
-
const check = evaluateRateLimit(callCount, maxCalls, lastCallAt, new Date());
|
|
172
|
-
if (!check.allowed) {
|
|
173
|
-
return { content: [{ type: 'text', text: check.message }], isError: true };
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
// Cast to ToolResult | undefined: TypeScript says ToolResult, but JS runtime may
|
|
177
|
-
// return undefined if a handler has a missing return path not caught at compile time.
|
|
178
|
-
// noImplicitReturns in tsconfig prevents new occurrences; this guard handles old ones.
|
|
179
|
-
const rawResult = (await handler(args, extra));
|
|
180
|
-
const result = rawResult ?? {
|
|
181
|
-
content: [{ type: 'text', text: 'Internal error: tool handler returned no result' }],
|
|
182
|
-
isError: true,
|
|
183
|
-
};
|
|
184
|
-
const success = !result.isError;
|
|
185
|
-
void usageStore
|
|
186
|
-
.appendUsageEvent(recordUsageEvent(toolName, tier, success))
|
|
187
|
-
.catch((err) => {
|
|
188
|
-
console.error('[planu] appendUsageEvent failed:', err);
|
|
189
|
-
});
|
|
190
|
-
return result;
|
|
191
|
-
};
|
|
192
|
-
}
|
|
193
|
-
// ---------------------------------------------------------------------------
|
|
194
|
-
// Synchronous online validation (replaces background fire-and-forget)
|
|
195
|
-
// ---------------------------------------------------------------------------
|
|
196
|
-
async function performOnlineValidation(state) {
|
|
197
|
-
try {
|
|
198
|
-
const result = await validateLicense(state.licenseKey, state.instanceId);
|
|
199
|
-
if (!result.valid) {
|
|
200
|
-
// License revoked remotely — clear local state
|
|
201
|
-
await licenseStore.deleteLicenseState();
|
|
202
|
-
return null;
|
|
203
|
-
}
|
|
204
|
-
const refreshed = {
|
|
205
|
-
...state,
|
|
206
|
-
lastValidatedAt: new Date().toISOString(),
|
|
207
|
-
activationUsage: result.license_key.activation_usage,
|
|
208
|
-
machineFingerprint: computeMachineFingerprint(),
|
|
209
|
-
};
|
|
210
|
-
await licenseStore.saveLicenseState(refreshed);
|
|
211
|
-
return refreshed;
|
|
212
|
-
}
|
|
213
|
-
catch {
|
|
214
|
-
// API unreachable — allow if within grace period (TTL + 3 days)
|
|
215
|
-
if (isInGracePeriod(state)) {
|
|
216
|
-
return state;
|
|
217
|
-
}
|
|
218
|
-
// Grace period expired — degrade to free
|
|
219
|
-
return null;
|
|
220
|
-
}
|
|
221
|
-
}
|
|
222
|
-
//# sourceMappingURL=license-gate.js.map
|