@planu/cli 4.14.1 → 5.1.1
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 +82 -0
- package/LICENSE +55 -12
- package/README.md +10 -2
- package/dist/cli/commands/install.d.ts +1 -12
- package/dist/cli/commands/install.js +9 -65
- package/dist/cli/commands/job.js +4 -3
- package/dist/cli/commands/spec.js +12 -3
- package/dist/cli/commands/validate.js +2 -2
- package/dist/cli/router.js +1 -3
- package/dist/config/environment-schema.json +1 -3
- 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 +139 -3
- package/dist/config/product-public.js +8 -1
- package/dist/config/product-public.json +7 -36
- package/dist/config/registries/hosts/codex.json +20 -363
- package/dist/config/release-policy.json +84 -2
- package/dist/config/runtime-policy.json +12 -1
- package/dist/config/skill-templates/planu-resume-work.md +2 -2
- package/dist/core/index.d.ts +1 -1
- package/dist/core/spec-validator.d.ts +4 -4
- package/dist/core/spec-validator.js +33 -19
- package/dist/engine/abortable-process-runner.d.ts +20 -2
- package/dist/engine/abortable-process-runner.js +243 -74
- package/dist/engine/ambiguity-scorer.js +4 -26
- package/dist/engine/auth/scope-mapper.js +1 -7
- package/dist/engine/autopilot/state-updater.js +4 -4
- 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/planu-config.js +1 -7
- package/dist/engine/clarification-gate/gate.d.ts +3 -3
- package/dist/engine/code-scanner/layer-scanner.js +6 -22
- package/dist/engine/core-bridge.d.ts +3 -3
- package/dist/engine/cost-guardrails.d.ts +1 -1
- package/dist/engine/cost-guardrails.js +1 -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 +2 -7
- package/dist/engine/dashboard/templates-layout.js +0 -3
- package/dist/engine/dashboard/templates-project.js +1 -13
- 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/evidence-gates/artifact-reader.d.ts +12 -1
- package/dist/engine/evidence-gates/artifact-reader.js +174 -4
- package/dist/engine/evidence-gates/evidence-autofill.d.ts +10 -0
- package/dist/engine/evidence-gates/evidence-autofill.js +148 -0
- package/dist/engine/evidence-gates/evidence-skeletons.d.ts +19 -0
- package/dist/engine/evidence-gates/evidence-skeletons.js +69 -0
- package/dist/engine/evidence-gates/lifecycle-gate.js +4 -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.js +3 -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-runtime.d.ts +30 -0
- package/dist/engine/execution/job-runtime.js +114 -6
- package/dist/engine/execution/operation-journal.js +10 -4
- 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 +12 -1
- package/dist/engine/execution/validate-job-executor.js +549 -86
- package/dist/engine/execution/validate-job-payload.js +107 -50
- package/dist/engine/execution/validate-job-recovery.js +1 -1
- package/dist/engine/execution/validate-worker-runtime.d.ts +5 -0
- package/dist/engine/execution/validate-worker-runtime.js +90 -2
- package/dist/engine/execution/validate-worker-thread.js +17 -24
- package/dist/engine/handoff-artifacts/schemas.d.ts +2 -1
- package/dist/engine/handoff-artifacts/schemas.js +33 -0
- package/dist/engine/handoff-packager.d.ts +19 -0
- package/dist/engine/handoff-packager.js +415 -13
- package/dist/engine/hooks/effort-configurator.js +1 -1
- 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/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/tool-classification.js +2 -0
- package/dist/engine/macos-keychain-native-port.d.ts +5 -0
- package/dist/engine/macos-keychain-native-port.js +19 -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/minimality/policy-loader.js +247 -6
- package/dist/engine/network-policy.js +1 -0
- package/dist/engine/planu-core.darwin-arm64.node.manifest.json +7 -7
- package/dist/engine/planu-core.darwin-arm64.node.sbom.json +20 -20
- package/dist/engine/planu-core.darwin-x64.node.manifest.json +7 -7
- package/dist/engine/planu-core.darwin-x64.node.sbom.json +20 -20
- package/dist/engine/planu-core.linux-arm64-gnu.node.manifest.json +7 -7
- package/dist/engine/planu-core.linux-arm64-gnu.node.sbom.json +20 -20
- package/dist/engine/planu-core.linux-arm64-musl.node.manifest.json +7 -7
- package/dist/engine/planu-core.linux-arm64-musl.node.sbom.json +20 -20
- package/dist/engine/planu-core.linux-x64-gnu.node.manifest.json +7 -7
- package/dist/engine/planu-core.linux-x64-gnu.node.sbom.json +20 -20
- package/dist/engine/planu-core.linux-x64-musl.node.manifest.json +7 -7
- package/dist/engine/planu-core.linux-x64-musl.node.sbom.json +20 -20
- package/dist/engine/planu-core.win32-arm64-msvc.node.manifest.json +7 -7
- package/dist/engine/planu-core.win32-arm64-msvc.node.sbom.json +20 -20
- package/dist/engine/planu-core.win32-x64-msvc.node.manifest.json +7 -7
- package/dist/engine/planu-core.win32-x64-msvc.node.sbom.json +20 -20
- package/dist/engine/readiness-checker.d.ts +1 -16
- package/dist/engine/readiness-checker.js +27 -88
- package/dist/engine/reverse-engineer/api-detector.js +2 -13
- package/dist/engine/reverse-engineer/complexity-analyzer.js +2 -13
- package/dist/engine/reverse-engineer/config-analyzer.js +2 -13
- package/dist/engine/reverse-engineer/dependency-graph.js +2 -13
- package/dist/engine/reverse-engineer/test-analyzer.js +2 -13
- package/dist/engine/reverse-engineer/walk-ignore.d.ts +3 -0
- package/dist/engine/reverse-engineer/walk-ignore.js +26 -0
- package/dist/engine/runtime-policy.d.ts +2 -0
- package/dist/engine/runtime-policy.js +42 -5
- package/dist/engine/runtime-security/rate-limiter.js +0 -1
- package/dist/engine/safety/contained-project-file.d.ts +3 -0
- package/dist/engine/safety/contained-project-file.js +23 -0
- package/dist/engine/scope-boundaries/contradiction-checker.js +63 -1
- package/dist/engine/scope-boundaries/scope-validator.js +45 -7
- package/dist/engine/session/checkpoint-writer.js +0 -9
- package/dist/engine/spec-format/acceptance-criteria.d.ts +6 -2
- package/dist/engine/spec-format/acceptance-criteria.js +82 -22
- 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/text-fences.js +20 -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-migrator/canonical-deduplicator.d.ts +18 -0
- package/dist/engine/spec-migrator/canonical-deduplicator.js +479 -0
- package/dist/engine/spec-migrator/filesystem-import.d.ts +4 -8
- package/dist/engine/spec-migrator/filesystem-import.js +121 -14
- 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-state-machine/transition-spec.d.ts +6 -1
- package/dist/engine/spec-state-machine/transition-spec.js +10 -1
- package/dist/engine/spec-state-syncer.js +1 -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/telemetry/health-checker.js +53 -17
- package/dist/engine/telemetry/telemetry-client.js +26 -8
- 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 +11 -0
- package/dist/engine/timing/budget.js +31 -9
- package/dist/engine/token-optimizer/analytics.d.ts +1 -1
- package/dist/engine/token-optimizer/analytics.js +5 -6
- 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/durable-validation.d.ts +1 -1
- package/dist/engine/validation/durable-validation.js +3 -82
- package/dist/engine/validation/validation-freshness.d.ts +11 -1
- package/dist/engine/validation/validation-freshness.js +231 -91
- package/dist/engine/validation/validation-receipt.d.ts +9 -6
- package/dist/engine/validation/validation-receipt.js +84 -24
- 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-submission.d.ts +5 -4
- package/dist/engine/validation/validation-submission.js +25 -11
- package/dist/engine/validation/validation-worktree.d.ts +21 -0
- package/dist/engine/validation/validation-worktree.js +260 -0
- package/dist/engine/validation-impact-planner.d.ts +14 -2
- package/dist/engine/validation-impact-planner.js +0 -3
- 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 +12 -24
- package/dist/engine/validator/spec-compliance-runner.js +429 -211
- package/dist/engine/validator.js +35 -22
- package/dist/index.js +4 -16
- package/dist/resources/usage-stats-resource.js +2 -18
- package/dist/security/adapters/linux-secret-service.js +7 -3
- package/dist/security/adapters/windows-credential-manager.js +6 -4
- package/dist/server/routes/specs.js +13 -1
- package/dist/storage/base-store.d.ts +1 -1
- package/dist/storage/base-store.js +1 -1
- package/dist/storage/feedback-remote.d.ts +2 -3
- package/dist/storage/feedback-remote.js +45 -31
- package/dist/storage/global-store.d.ts +1 -17
- package/dist/storage/global-store.js +1 -42
- package/dist/storage/index.d.ts +0 -2
- package/dist/storage/index.js +0 -2
- package/dist/storage/migrations/canonical-storage.js +124 -11
- package/dist/storage/runtime-db.d.ts +9 -0
- package/dist/storage/runtime-db.js +64 -8
- package/dist/storage/spec-store.d.ts +14 -2
- package/dist/storage/spec-store.js +104 -14
- 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 +30 -11
- package/dist/storage/status-store/self-healing.js +3 -3
- package/dist/storage/status-store/version-sync.d.ts +2 -1
- package/dist/storage/status-store/version-sync.js +35 -40
- package/dist/storage/usage-store.d.ts +1 -5
- package/dist/storage/usage-store.js +0 -35
- package/dist/tools/auto-update-handler.d.ts +3 -3
- package/dist/tools/auto-update-handler.js +3 -3
- 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-utils.d.ts +1 -1
- package/dist/tools/challenge-spec/scenarios-utils.js +35 -11
- package/dist/tools/challenge-spec-helpers.d.ts +10 -1
- package/dist/tools/challenge-spec-helpers.js +63 -22
- package/dist/tools/challenge-spec.js +23 -8
- package/dist/tools/check-readiness.js +38 -14
- package/dist/tools/configure-telemetry.js +30 -2
- package/dist/tools/create-spec/spec-builder.d.ts +7 -0
- package/dist/tools/create-spec/spec-builder.js +19 -15
- package/dist/tools/create-spec.d.ts +1 -0
- package/dist/tools/create-spec.js +584 -309
- package/dist/tools/git/branch-ops.d.ts +1 -1
- package/dist/tools/git/branch-ops.js +3 -2
- package/dist/tools/init-project/handler.js +10 -12
- package/dist/tools/init-project/host-assets-writer.js +26 -1
- package/dist/tools/init-project/lint-scaffolder.d.ts +3 -3
- package/dist/tools/init-project/migration-runner.d.ts +2 -4
- package/dist/tools/init-project/migration-runner.js +3 -2
- 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/jobs/handlers.js +38 -6
- package/dist/tools/list-specs.js +5 -26
- package/dist/tools/merge-risk-handler.js +2 -2
- 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 -29
- package/dist/tools/register-spec-tools/analysis-tools.js +8 -8
- package/dist/tools/register-spec-tools/core-spec-tools.js +29 -19
- package/dist/tools/safe-handler.d.ts +5 -13
- package/dist/tools/safe-handler.js +7 -23
- 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 +0 -23
- package/dist/tools/schemas/output-schemas.js +0 -28
- 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 +11 -0
- package/dist/tools/schemas/validate-output-schema.js +7 -0
- package/dist/tools/spec-prompt-handler.js +3 -3
- package/dist/tools/sync-spec-state-handler.d.ts +1 -1
- package/dist/tools/sync-spec-state-handler.js +50 -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 +31 -15
- package/dist/tools/tool-registry/group-infra.js +27 -110
- package/dist/tools/tool-registry/group-quality-compliance.js +26 -26
- 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.js +3 -0
- package/dist/tools/update-status/batch.d.ts +6 -2
- package/dist/tools/update-status/batch.js +58 -1
- package/dist/tools/update-status/dod-gates.d.ts +16 -1
- package/dist/tools/update-status/dod-gates.js +191 -1
- package/dist/tools/update-status/done-receipt-verifier.d.ts +8 -0
- package/dist/tools/update-status/done-receipt-verifier.js +75 -27
- package/dist/tools/update-status/evidence-gate.d.ts +4 -0
- package/dist/tools/update-status/evidence-gate.js +103 -3
- package/dist/tools/update-status/file-sync.d.ts +4 -3
- package/dist/tools/update-status/file-sync.js +57 -6
- package/dist/tools/update-status/index.d.ts +25 -1
- package/dist/tools/update-status/index.js +292 -78
- 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 +2 -2
- package/dist/tools/update-status/transition-guard.js +45 -16
- package/dist/tools/update-status-actions.d.ts +4 -2
- package/dist/tools/update-status-actions.js +16 -14
- 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-lint.d.ts +1 -0
- package/dist/tools/validate-lint.js +1 -1
- package/dist/tools/validate.d.ts +2 -1
- package/dist/tools/validate.js +114 -34
- package/dist/tools/workspace-dashboard-handler.js +38 -0
- package/dist/transports/http-transport.js +6 -8
- package/dist/transports/mcp-types.d.ts +0 -2
- package/dist/transports/session-context.js +1 -1
- package/dist/types/cascade-hooks.d.ts +1 -1
- package/dist/types/ci.d.ts +0 -4
- 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 +4 -10
- package/dist/types/dashboard.d.ts +3 -7
- package/dist/types/docs.d.ts +0 -1
- package/dist/types/durable-job.d.ts +4 -4
- package/dist/types/durable-validation.d.ts +100 -2
- package/dist/types/durable-validation.js +165 -1
- package/dist/types/errors/structured-error.d.ts +3 -3
- package/dist/types/estimation.d.ts +2 -0
- package/dist/types/evidence-autofill.d.ts +34 -0
- package/dist/types/evidence-autofill.js +2 -0
- package/dist/types/evidence-gates.d.ts +9 -1
- package/dist/types/execution.d.ts +2 -0
- package/dist/types/gemini-integration.d.ts +0 -11
- package/dist/types/handoff-artifacts.d.ts +41 -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 +3 -6
- package/dist/types/index.js +2 -5
- package/dist/types/kiro-integration.d.ts +0 -6
- package/dist/types/network-policy.d.ts +1 -1
- package/dist/types/project/lint-scaffolder.d.ts +1 -1
- package/dist/types/runtime-policy.d.ts +11 -0
- package/dist/types/session-safeguard.d.ts +0 -31
- 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 +20 -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 +35 -1
- package/dist/types/spec-format.d.ts +25 -1
- package/dist/types/telemetry.d.ts +4 -1
- package/dist/types/transition-log.d.ts +1 -1
- package/dist/types/transport.d.ts +0 -2
- package/dist/types/usage.d.ts +1 -36
- package/dist/types/usage.js +1 -1
- package/dist/types/validate-worker.d.ts +6 -0
- package/dist/types/validation-receipt.d.ts +1 -1
- package/dist/types/validation.d.ts +10 -4
- package/package.json +17 -12
- 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 -251
- package/dist/config/product-public.ts +0 -148
- package/dist/config/server-instructions.ts +0 -121
- package/dist/config/version-defaults.ts +0 -76
- package/dist/config/version.ts +0 -21
- 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 -15
- package/dist/engine/session-safeguard/learnings-buffer.js +0 -91
- 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/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/license-store.d.ts +0 -6
- package/dist/storage/license-store.js +0 -63
- package/dist/storage/session-store.d.ts +0 -20
- package/dist/storage/session-store.js +0 -136
- 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/export-session.d.ts +0 -3
- package/dist/tools/export-session.js +0 -90
- 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/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/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,4 +1,4 @@
|
|
|
1
1
|
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
-
export
|
|
2
|
+
export { OFFICIAL_SDD_TOOL_NAMES } from './tool-registry/inventory.js';
|
|
3
3
|
export declare function registerSddTools(server: McpServer): void;
|
|
4
4
|
//# sourceMappingURL=register-sdd-tools.d.ts.map
|
|
@@ -12,35 +12,8 @@ import { handleCreateRule } from './create-rule.js';
|
|
|
12
12
|
import { handleCreateSkill } from './create-skill.js';
|
|
13
13
|
import { handleReconcileUniversalRules } from './reconcile-universal-rules.js';
|
|
14
14
|
import { registerPrompts } from '../prompts/index.js';
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
'facilitate',
|
|
18
|
-
'init_project',
|
|
19
|
-
'clarify_requirements',
|
|
20
|
-
'create_spec',
|
|
21
|
-
'list_specs',
|
|
22
|
-
'challenge_spec',
|
|
23
|
-
'check_readiness',
|
|
24
|
-
'update_status',
|
|
25
|
-
'update_status_batch',
|
|
26
|
-
'package_handoff',
|
|
27
|
-
'validate',
|
|
28
|
-
'get_job',
|
|
29
|
-
'watch_job',
|
|
30
|
-
'cancel_job',
|
|
31
|
-
'restart_job',
|
|
32
|
-
'reconcile_spec',
|
|
33
|
-
'create_rule',
|
|
34
|
-
'create_skill',
|
|
35
|
-
'skill_search',
|
|
36
|
-
'configure_code_graph',
|
|
37
|
-
'code_graph_status',
|
|
38
|
-
'submit_feedback',
|
|
39
|
-
'triage_feedback',
|
|
40
|
-
'resolve_feedback',
|
|
41
|
-
'sync_feedback',
|
|
42
|
-
'feedback_status',
|
|
43
|
-
];
|
|
15
|
+
import { OFFICIAL_SDD_TOOL_NAMES } from './tool-registry/inventory.js';
|
|
16
|
+
export { OFFICIAL_SDD_TOOL_NAMES } from './tool-registry/inventory.js';
|
|
44
17
|
const OFFICIAL_SDD_TOOL_SET = new Set(OFFICIAL_SDD_TOOL_NAMES);
|
|
45
18
|
const noop = () => undefined;
|
|
46
19
|
const DUMMY_TOOL_SLOT = {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
import { t } from '../../i18n/index.js';
|
|
3
|
-
import { safeTracked,
|
|
3
|
+
import { safeTracked, safeGoverned } from '../safe-handler.js';
|
|
4
4
|
import { ChecklistFocusEnum, AuditCategoryEnum, SpecIdSchema } from '../schemas/index.js';
|
|
5
5
|
import { resolveProjectId, missingProjectIdError } from '../resolve-project-id.js';
|
|
6
6
|
import { handleDetectDrift } from '../detect-drift.js';
|
|
@@ -92,7 +92,7 @@ export function registerAnalysisTools(server) {
|
|
|
92
92
|
.optional()
|
|
93
93
|
.describe('Focus areas for the checklist'),
|
|
94
94
|
},
|
|
95
|
-
},
|
|
95
|
+
}, safeGoverned('generate_checklist', async (args) => {
|
|
96
96
|
const pid = resolveProjectId(args);
|
|
97
97
|
if (!pid) {
|
|
98
98
|
return missingProjectIdError;
|
|
@@ -130,7 +130,7 @@ export function registerAnalysisTools(server) {
|
|
|
130
130
|
.optional()
|
|
131
131
|
.describe('Manual changes to apply'),
|
|
132
132
|
},
|
|
133
|
-
},
|
|
133
|
+
}, safeGoverned('reconcile_spec', async (args) => {
|
|
134
134
|
const pid = resolveProjectId(args);
|
|
135
135
|
if (!pid) {
|
|
136
136
|
return missingProjectIdError;
|
|
@@ -178,7 +178,7 @@ export function registerAnalysisTools(server) {
|
|
|
178
178
|
.describe('Audit categories to check'),
|
|
179
179
|
specId: SpecIdSchema.optional().describe('Spec ID to audit against'),
|
|
180
180
|
},
|
|
181
|
-
},
|
|
181
|
+
}, safeGoverned('audit', async (args) => {
|
|
182
182
|
const pid = resolveProjectId(args);
|
|
183
183
|
if (!pid) {
|
|
184
184
|
return missingProjectIdError;
|
|
@@ -220,7 +220,7 @@ export function registerAnalysisTools(server) {
|
|
|
220
220
|
.describe('Path to MCP config file (auto-detected if omitted)'),
|
|
221
221
|
projectId: z.string().max(500).optional().describe('Project ID'),
|
|
222
222
|
},
|
|
223
|
-
},
|
|
223
|
+
}, safeGoverned('discover_mcps', async (args) => handleDiscoverMcps(args)));
|
|
224
224
|
// 19. suggest_mcps
|
|
225
225
|
server.registerTool('suggest_mcps', {
|
|
226
226
|
description: t('tools.suggest_mcps.description'),
|
|
@@ -233,7 +233,7 @@ export function registerAnalysisTools(server) {
|
|
|
233
233
|
.describe('Absolute path to project root. Derives projectId automatically.'),
|
|
234
234
|
specId: SpecIdSchema.optional().describe('Spec ID for context-specific suggestions'),
|
|
235
235
|
},
|
|
236
|
-
},
|
|
236
|
+
}, safeGoverned('suggest_mcps', async (args) => {
|
|
237
237
|
const pid = resolveProjectId(args);
|
|
238
238
|
if (!pid) {
|
|
239
239
|
return missingProjectIdError;
|
|
@@ -252,7 +252,7 @@ export function registerAnalysisTools(server) {
|
|
|
252
252
|
.optional()
|
|
253
253
|
.describe('Absolute path to project root. Derives projectId automatically.'),
|
|
254
254
|
},
|
|
255
|
-
},
|
|
255
|
+
}, safeGoverned('suggest_mcp_server', async (args) => {
|
|
256
256
|
const pid = resolveProjectId(args);
|
|
257
257
|
if (!pid) {
|
|
258
258
|
return missingProjectIdError;
|
|
@@ -321,6 +321,6 @@ export function registerAnalysisTools(server) {
|
|
|
321
321
|
.describe('When false (default), done-status specs are skipped (respects SPEC-747 freeze). ' +
|
|
322
322
|
'Set true to migrate done specs (writes backup to planu/backups/ first).'),
|
|
323
323
|
},
|
|
324
|
-
},
|
|
324
|
+
}, safeGoverned('ssr_back_migration', async (args) => handleSsrBackMigration(args)));
|
|
325
325
|
}
|
|
326
326
|
//# sourceMappingURL=analysis-tools.js.map
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
import { t } from '../../i18n/index.js';
|
|
3
|
-
import { safeTracked,
|
|
4
|
-
import { SupportedLocaleEnum, SpecStatusEnum,
|
|
3
|
+
import { safeTracked, safeGoverned } from '../safe-handler.js';
|
|
4
|
+
import { SupportedLocaleEnum, SpecStatusEnum, ExperienceLevelEnum, WorkModeEnum, ListSpecsOutputSchema, EstimateOutputSchema, ValidateOutputSchema, SpecIdSchema, } from '../schemas/index.js';
|
|
5
|
+
import { SpecAcFormatEnum, SpecScopeEnum, SpecTargetEnum, SpecTypeEnum } from '../schemas/spec.js';
|
|
5
6
|
import { handleSetLocale } from '../set-locale.js';
|
|
6
7
|
import { handleInitProject } from '../init-project.js';
|
|
7
8
|
import { handleSetWorkMode } from '../set-work-mode-handler.js';
|
|
@@ -15,6 +16,7 @@ import { handleEstimate } from '../estimate.js';
|
|
|
15
16
|
import { handleReverseEngineer } from '../reverse-engineer.js';
|
|
16
17
|
import { handleValidate } from '../validate.js';
|
|
17
18
|
import { handleTypeSafetyGate } from '../type-safety-gate.js';
|
|
19
|
+
import { runWithTrustedLocalMcpContext } from '../../engine/lifecycle-reconciliation.js';
|
|
18
20
|
/** init_project inputSchema — extracted to keep registerCoreSpecTools within line budget. */
|
|
19
21
|
const INIT_PROJECT_INPUT_SCHEMA = {
|
|
20
22
|
projectPath: z.string().max(4096).describe('Absolute path to the project root'),
|
|
@@ -216,10 +218,7 @@ export function registerCoreSpecTools(server) {
|
|
|
216
218
|
.max(500)
|
|
217
219
|
.optional()
|
|
218
220
|
.describe('Feature group tag (e.g. "Authentication", "Billing"). Added to tags for categorization. Flat structure — no subdirectories created.'),
|
|
219
|
-
acFormat:
|
|
220
|
-
.enum(['bdd', 'checkbox'])
|
|
221
|
-
.optional()
|
|
222
|
-
.describe('SPEC-224: Format for acceptance criteria in spec.md. ' +
|
|
221
|
+
acFormat: SpecAcFormatEnum.optional().describe('SPEC-224: Format for acceptance criteria in spec.md. ' +
|
|
223
222
|
'checkbox (default) — markdown checkboxes (- [ ] criterion). ' +
|
|
224
223
|
'bdd — Gherkin Given-When-Then scenarios for BDD workflows.'),
|
|
225
224
|
clarificationAnswers: z
|
|
@@ -360,18 +359,18 @@ export function registerCoreSpecTools(server) {
|
|
|
360
359
|
.describe('Set true when implementation drift requires reconcile_spec before status=done; true blocks done.'),
|
|
361
360
|
actuals: z
|
|
362
361
|
.object({
|
|
363
|
-
devHours: z.number().min(0),
|
|
364
|
-
reviewHours: z.number().min(0),
|
|
365
|
-
tokensOpus: z.number().min(0),
|
|
366
|
-
tokensSonnet: z.number().min(0),
|
|
367
|
-
apiCostUsd: z.number().min(0),
|
|
368
|
-
humanCostUsd: z.number().min(0),
|
|
369
|
-
totalCostUsd: z.number().min(0),
|
|
370
|
-
completedAt: z.string().max(500),
|
|
371
|
-
notes: z.string().max(10_000),
|
|
362
|
+
devHours: z.number().min(0).optional(),
|
|
363
|
+
reviewHours: z.number().min(0).optional(),
|
|
364
|
+
tokensOpus: z.number().min(0).optional(),
|
|
365
|
+
tokensSonnet: z.number().min(0).optional(),
|
|
366
|
+
apiCostUsd: z.number().min(0).optional(),
|
|
367
|
+
humanCostUsd: z.number().min(0).optional(),
|
|
368
|
+
totalCostUsd: z.number().min(0).optional(),
|
|
369
|
+
completedAt: z.string().max(500).optional(),
|
|
370
|
+
notes: z.string().max(10_000).optional(),
|
|
372
371
|
})
|
|
373
372
|
.optional()
|
|
374
|
-
.describe('Actual metrics
|
|
373
|
+
.describe('Actual metrics for status = done. All fields optional (SPEC-1356): missing numeric fields default to 0, completedAt/notes are auto-filled when omitted.'),
|
|
375
374
|
reviewNotes: z
|
|
376
375
|
.string()
|
|
377
376
|
.max(10_000)
|
|
@@ -399,12 +398,23 @@ export function registerCoreSpecTools(server) {
|
|
|
399
398
|
.max(2000)
|
|
400
399
|
.optional()
|
|
401
400
|
.describe('SPEC-733: Required for reverse transitions (done→implementing, discarded→draft). Must be ≥30 chars explaining why the spec is being reopened.'),
|
|
401
|
+
reconciliationRequestId: z
|
|
402
|
+
.string()
|
|
403
|
+
.regex(/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/u)
|
|
404
|
+
.optional()
|
|
405
|
+
.describe('Trusted local MCP only: lowercase UUID idempotency key for implementing to review reconciliation.'),
|
|
406
|
+
expectedImplementingTransitionId: z.string().max(500).optional(),
|
|
407
|
+
implementationReviewDigest: z
|
|
408
|
+
.string()
|
|
409
|
+
.regex(/^sha256:[a-f0-9]{64}$/u)
|
|
410
|
+
.optional()
|
|
411
|
+
.describe('SHA-256 of the exact validation-report.json bytes. Required implementation evidence for status=done; for status=review it is valid only inside the complete trusted local-MCP reconciliation tuple.'),
|
|
402
412
|
forceApprove: z
|
|
403
413
|
.boolean()
|
|
404
414
|
.optional()
|
|
405
415
|
.describe('SPEC-769: Force-approve a spec that scored below 70 on the readiness gate. Warnings are stored in spec.md frontmatter. Use when the LLM has explicitly confirmed the spec is ready despite a low readiness score.'),
|
|
406
416
|
},
|
|
407
|
-
}, safeTracked('update_status', async (args) => handleUpdateStatus(args)));
|
|
417
|
+
}, safeTracked('update_status', async (args) => runWithTrustedLocalMcpContext(() => handleUpdateStatus(args))));
|
|
408
418
|
server.registerTool('update_status_batch', {
|
|
409
419
|
description: 'Batch update many specs to the same status in one MCP execution. Uses the same transition rules as update_status and reports updated/skipped/failed per spec.',
|
|
410
420
|
inputSchema: {
|
|
@@ -415,7 +425,7 @@ export function registerCoreSpecTools(server) {
|
|
|
415
425
|
.max(4096)
|
|
416
426
|
.optional()
|
|
417
427
|
.describe('Absolute project root. Preferred when projectId is unknown.'),
|
|
418
|
-
status: SpecStatusEnum.describe('New status for all specs'),
|
|
428
|
+
status: SpecStatusEnum.exclude(['done']).describe('New status for all specs. Batch supports draft, review, approved, implementing, and discarded; close done specs individually with full evidence.'),
|
|
419
429
|
dryRun: z.boolean().optional().describe('Preview the batch without mutating any spec.'),
|
|
420
430
|
reviewNotes: z
|
|
421
431
|
.string()
|
|
@@ -444,7 +454,7 @@ export function registerCoreSpecTools(server) {
|
|
|
444
454
|
.optional()
|
|
445
455
|
.describe('Analysis depth: shallow (fast scan), deep (full file scan), deep-v2 (full scan + test coverage, dependency graph, API detection, complexity metrics, config analysis). Default: shallow'),
|
|
446
456
|
},
|
|
447
|
-
},
|
|
457
|
+
}, safeGoverned('reverse_engineer', async (args) => handleReverseEngineer(args)));
|
|
448
458
|
// 10. validate
|
|
449
459
|
server.registerTool('validate', {
|
|
450
460
|
description: t('tools.validate.description'),
|
|
@@ -30,27 +30,19 @@ export declare function withToolTimeout<T>(p: Promise<T>, ms: number, fallback:
|
|
|
30
30
|
* graceful MCP error response, preventing server crashes. Also enforces a
|
|
31
31
|
* configurable execution timeout (default 55s, env PLANU_TOOL_TIMEOUT_MS).
|
|
32
32
|
*
|
|
33
|
-
* Usage —
|
|
33
|
+
* Usage — for infrastructure tools that do not need usage recording:
|
|
34
34
|
* server.registerTool('my_tool', schema, safe(async (args) => { ... }));
|
|
35
35
|
*/
|
|
36
36
|
export declare function safe<T>(handler: (args: T, extra?: unknown) => Promise<ToolResult>): (args: T, extra?: unknown) => Promise<ToolResult>;
|
|
37
37
|
/**
|
|
38
|
-
* Composable wrapper: usage tracking + error boundary.
|
|
39
|
-
* Use for free-tier tools that need rate limiting and usage recording.
|
|
38
|
+
* Composable wrapper: neutral local usage tracking + error boundary.
|
|
40
39
|
*
|
|
41
40
|
* Usage:
|
|
42
|
-
* server.registerTool('
|
|
41
|
+
* server.registerTool('tracked_tool', schema, safeTracked('tracked_tool', async (args) => { ... }));
|
|
43
42
|
*/
|
|
44
43
|
export declare function safeTracked<T>(toolName: string, handler: (args: T, extra?: unknown) => Promise<ToolResult>): (args: T, extra?: unknown) => Promise<ToolResult>;
|
|
45
44
|
/**
|
|
46
|
-
*
|
|
47
|
-
* Use for tools that require a paid plan.
|
|
48
|
-
*
|
|
49
|
-
* Trial bypass: if the 30-day free trial is active, skips the license gate
|
|
50
|
-
* entirely and routes to safeTracked (usage tracking without restriction).
|
|
51
|
-
*
|
|
52
|
-
* Usage:
|
|
53
|
-
* server.registerTool('pro_tool', schema, safeLicensed('pro_tool', async (args) => { ... }));
|
|
45
|
+
* Neutral governed wrapper: engineering budget + local usage + error boundary.
|
|
54
46
|
*/
|
|
55
|
-
export declare function
|
|
47
|
+
export declare function safeGoverned<T>(toolName: string, handler: (args: T, extra?: unknown) => Promise<ToolResult>): (args: T, extra?: unknown) => Promise<ToolResult>;
|
|
56
48
|
//# sourceMappingURL=safe-handler.d.ts.map
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
// tools/safe-handler.ts — Generic error-boundary wrapper for MCP tool handlers.
|
|
2
2
|
// Catches any unhandled error and returns a graceful MCP error response
|
|
3
3
|
// instead of crashing the server. Includes cancellation-aware execution deadlines.
|
|
4
|
-
import {
|
|
5
|
-
import { isTrialActive } from '../engine/trial-engine.js';
|
|
4
|
+
import { withUsageTracking } from './usage-tracking.js';
|
|
6
5
|
import { sanitizePath } from './sanitize-path.js';
|
|
7
6
|
import { ensureHooksStarted } from './start-hooks.js';
|
|
8
7
|
import { ensureWorkersStarted } from '../engine/workers/index.js';
|
|
@@ -388,7 +387,7 @@ export function withToolTimeout(p, ms, fallback) {
|
|
|
388
387
|
* graceful MCP error response, preventing server crashes. Also enforces a
|
|
389
388
|
* configurable execution timeout (default 55s, env PLANU_TOOL_TIMEOUT_MS).
|
|
390
389
|
*
|
|
391
|
-
* Usage —
|
|
390
|
+
* Usage — for infrastructure tools that do not need usage recording:
|
|
392
391
|
* server.registerTool('my_tool', schema, safe(async (args) => { ... }));
|
|
393
392
|
*/
|
|
394
393
|
export function safe(handler) {
|
|
@@ -616,26 +615,18 @@ function safeWithTelemetry(toolName, handler) {
|
|
|
616
615
|
};
|
|
617
616
|
}
|
|
618
617
|
/**
|
|
619
|
-
* Composable wrapper: usage tracking + error boundary.
|
|
620
|
-
* Use for free-tier tools that need rate limiting and usage recording.
|
|
618
|
+
* Composable wrapper: neutral local usage tracking + error boundary.
|
|
621
619
|
*
|
|
622
620
|
* Usage:
|
|
623
|
-
* server.registerTool('
|
|
621
|
+
* server.registerTool('tracked_tool', schema, safeTracked('tracked_tool', async (args) => { ... }));
|
|
624
622
|
*/
|
|
625
623
|
export function safeTracked(toolName, handler) {
|
|
626
624
|
return safeWithTelemetry(toolName, withUsageTracking(toolName, handler));
|
|
627
625
|
}
|
|
628
626
|
/**
|
|
629
|
-
*
|
|
630
|
-
* Use for tools that require a paid plan.
|
|
631
|
-
*
|
|
632
|
-
* Trial bypass: if the 30-day free trial is active, skips the license gate
|
|
633
|
-
* entirely and routes to safeTracked (usage tracking without restriction).
|
|
634
|
-
*
|
|
635
|
-
* Usage:
|
|
636
|
-
* server.registerTool('pro_tool', schema, safeLicensed('pro_tool', async (args) => { ... }));
|
|
627
|
+
* Neutral governed wrapper: engineering budget + local usage + error boundary.
|
|
637
628
|
*/
|
|
638
|
-
export function
|
|
629
|
+
export function safeGoverned(toolName, handler) {
|
|
639
630
|
return safeWithTelemetry(toolName, async (args, extra) => {
|
|
640
631
|
// Enforce spec budget limit when specId is present in args (opt-in enforcement)
|
|
641
632
|
if (args !== null && typeof args === 'object') {
|
|
@@ -646,14 +637,7 @@ export function safeLicensed(toolName, handler) {
|
|
|
646
637
|
await checkBudgetEnforcement(specId, projectPath);
|
|
647
638
|
}
|
|
648
639
|
}
|
|
649
|
-
|
|
650
|
-
if (process.env.PLANU_SKIP_TRIAL !== 'true') {
|
|
651
|
-
const trialActive = isTrialActive(); // always false — trial tools removed
|
|
652
|
-
if (trialActive) {
|
|
653
|
-
return withUsageTracking(toolName, handler)(args, extra);
|
|
654
|
-
}
|
|
655
|
-
}
|
|
656
|
-
return withUsageTracking(toolName, withLicenseGate(toolName, handler))(args, extra);
|
|
640
|
+
return withUsageTracking(toolName, handler)(args, extra);
|
|
657
641
|
});
|
|
658
642
|
}
|
|
659
643
|
//# sourceMappingURL=safe-handler.js.map
|
|
@@ -16,7 +16,7 @@ export { TokenIntelligencePeriodEnum, TokenIntelligenceGroupByEnum, TokenIntelli
|
|
|
16
16
|
export { ProjectGraphActionEnum, ProjectGraphQueryKindEnum } from './project-graph.js';
|
|
17
17
|
export { ConfigureLLMProvidersActionEnum, LoadBalancingStrategyEnum, } from './llm-provider-schemas.js';
|
|
18
18
|
export { PluginActionEnum } from './plugins-schemas.js';
|
|
19
|
-
export { ListSpecsOutputSchema, EstimateOutputSchema, ValidateOutputSchema, CheckReadinessOutputSchema,
|
|
19
|
+
export { ListSpecsOutputSchema, EstimateOutputSchema, ValidateOutputSchema, CheckReadinessOutputSchema, } from './output-schemas.js';
|
|
20
20
|
export { CreatePRFromSpecSchema, PRStatusSchema, ReviewPRSchema, CreateReleaseSchema, GenerateChangelogSchema, } from './github.js';
|
|
21
21
|
export { SkillSearchInputSchema, SkillInstallInputSchema } from './skill-registry-schemas.js';
|
|
22
22
|
export { EcosystemStatusInputSchema } from './ecosystem-schemas.js';
|
|
@@ -17,7 +17,7 @@ export { TokenIntelligencePeriodEnum, TokenIntelligenceGroupByEnum, TokenIntelli
|
|
|
17
17
|
export { ProjectGraphActionEnum, ProjectGraphQueryKindEnum } from './project-graph.js';
|
|
18
18
|
export { ConfigureLLMProvidersActionEnum, LoadBalancingStrategyEnum, } from './llm-provider-schemas.js';
|
|
19
19
|
export { PluginActionEnum } from './plugins-schemas.js';
|
|
20
|
-
export { ListSpecsOutputSchema, EstimateOutputSchema, ValidateOutputSchema, CheckReadinessOutputSchema,
|
|
20
|
+
export { ListSpecsOutputSchema, EstimateOutputSchema, ValidateOutputSchema, CheckReadinessOutputSchema, } from './output-schemas.js';
|
|
21
21
|
export { CreatePRFromSpecSchema, PRStatusSchema, ReviewPRSchema, CreateReleaseSchema, GenerateChangelogSchema, } from './github.js';
|
|
22
22
|
export { SkillSearchInputSchema, SkillInstallInputSchema } from './skill-registry-schemas.js';
|
|
23
23
|
export { EcosystemStatusInputSchema } from './ecosystem-schemas.js';
|
|
@@ -216,27 +216,4 @@ export declare const CheckReadinessOutputSchema: {
|
|
|
216
216
|
}, z.core.$strip>>;
|
|
217
217
|
humanSummary: z.ZodOptional<z.ZodString>;
|
|
218
218
|
};
|
|
219
|
-
export declare const LicenseStatusOutputSchema: {
|
|
220
|
-
version: z.ZodString;
|
|
221
|
-
plan: z.ZodString;
|
|
222
|
-
toolsAvailable: z.ZodNumber;
|
|
223
|
-
toolsTotal: z.ZodNumber;
|
|
224
|
-
limits: z.ZodObject<{
|
|
225
|
-
maxProjects: z.ZodNumber;
|
|
226
|
-
currentProjects: z.ZodNumber;
|
|
227
|
-
maxActiveSpecs: z.ZodNumber;
|
|
228
|
-
}, z.core.$strip>;
|
|
229
|
-
customer: z.ZodOptional<z.ZodObject<{
|
|
230
|
-
name: z.ZodString;
|
|
231
|
-
email: z.ZodString;
|
|
232
|
-
variant: z.ZodString;
|
|
233
|
-
activatedAt: z.ZodString;
|
|
234
|
-
lastValidatedAt: z.ZodString;
|
|
235
|
-
}, z.core.$strip>>;
|
|
236
|
-
activationSlots: z.ZodOptional<z.ZodObject<{
|
|
237
|
-
used: z.ZodNumber;
|
|
238
|
-
total: z.ZodNumber;
|
|
239
|
-
}, z.core.$strip>>;
|
|
240
|
-
upgradeUrl: z.ZodOptional<z.ZodString>;
|
|
241
|
-
};
|
|
242
219
|
//# sourceMappingURL=output-schemas.d.ts.map
|
|
@@ -159,32 +159,4 @@ export const CheckReadinessOutputSchema = {
|
|
|
159
159
|
.optional(),
|
|
160
160
|
humanSummary: z.string().optional(),
|
|
161
161
|
};
|
|
162
|
-
// ── license_status ──────────────────────────────────────────────────────────
|
|
163
|
-
export const LicenseStatusOutputSchema = {
|
|
164
|
-
version: z.string(),
|
|
165
|
-
plan: z.string(),
|
|
166
|
-
toolsAvailable: z.number(),
|
|
167
|
-
toolsTotal: z.number(),
|
|
168
|
-
limits: z.object({
|
|
169
|
-
maxProjects: z.number(),
|
|
170
|
-
currentProjects: z.number(),
|
|
171
|
-
maxActiveSpecs: z.number(),
|
|
172
|
-
}),
|
|
173
|
-
customer: z
|
|
174
|
-
.object({
|
|
175
|
-
name: z.string(),
|
|
176
|
-
email: z.string(),
|
|
177
|
-
variant: z.string(),
|
|
178
|
-
activatedAt: z.string(),
|
|
179
|
-
lastValidatedAt: z.string(),
|
|
180
|
-
})
|
|
181
|
-
.optional(),
|
|
182
|
-
activationSlots: z
|
|
183
|
-
.object({
|
|
184
|
-
used: z.number(),
|
|
185
|
-
total: z.number(),
|
|
186
|
-
})
|
|
187
|
-
.optional(),
|
|
188
|
-
upgradeUrl: z.string().optional(),
|
|
189
|
-
};
|
|
190
162
|
//# sourceMappingURL=output-schemas.js.map
|
|
@@ -38,6 +38,10 @@ export declare const SpecTargetEnum: z.ZodEnum<{
|
|
|
38
38
|
ios: "ios";
|
|
39
39
|
shared: "shared";
|
|
40
40
|
}>;
|
|
41
|
+
export declare const SpecAcFormatEnum: z.ZodEnum<{
|
|
42
|
+
bdd: "bdd";
|
|
43
|
+
checkbox: "checkbox";
|
|
44
|
+
}>;
|
|
41
45
|
export declare const ExperienceLevelEnum: z.ZodEnum<{
|
|
42
46
|
beginner: "beginner";
|
|
43
47
|
expert: "expert";
|
|
@@ -31,6 +31,9 @@ export const SpecTargetEnum = z
|
|
|
31
31
|
'android',
|
|
32
32
|
])
|
|
33
33
|
.describe('Target area: frontend | backend | shared | fullstack | infrastructure | database | ios | android');
|
|
34
|
+
export const SpecAcFormatEnum = z
|
|
35
|
+
.enum(['bdd', 'checkbox'])
|
|
36
|
+
.describe('Acceptance criteria format: bdd | checkbox');
|
|
34
37
|
export const ExperienceLevelEnum = z
|
|
35
38
|
.enum(['beginner', 'intermediate', 'expert'])
|
|
36
39
|
.describe('Experience level: beginner, intermediate, or expert');
|
|
@@ -244,6 +244,17 @@ export declare const ValidateOutputSchema: {
|
|
|
244
244
|
}>;
|
|
245
245
|
submittedAt: z.ZodISODateTime;
|
|
246
246
|
cursor: z.ZodString;
|
|
247
|
+
queue: z.ZodObject<{
|
|
248
|
+
status: z.ZodEnum<{
|
|
249
|
+
active: "active";
|
|
250
|
+
queued: "queued";
|
|
251
|
+
terminal: "terminal";
|
|
252
|
+
}>;
|
|
253
|
+
position: z.ZodNullable<z.ZodNumber>;
|
|
254
|
+
aheadCount: z.ZodNumber;
|
|
255
|
+
capacity: z.ZodNumber;
|
|
256
|
+
remainingBudgetMs: z.ZodNumber;
|
|
257
|
+
}, z.core.$strip>;
|
|
247
258
|
terminalStates: z.ZodTuple<[z.ZodLiteral<"completed">, z.ZodLiteral<"failed">, z.ZodLiteral<"cancelled">, z.ZodLiteral<"dead-letter">], null>;
|
|
248
259
|
resultSchema: z.ZodLiteral<"validate-completion/v1">;
|
|
249
260
|
observation: z.ZodObject<{
|
|
@@ -195,6 +195,13 @@ export const ValidateOutputSchema = {
|
|
|
195
195
|
state: z.enum(['accepted', 'running', 'checkpointed']),
|
|
196
196
|
submittedAt: z.iso.datetime(),
|
|
197
197
|
cursor: z.string().regex(/^[a-f0-9]{64}$/),
|
|
198
|
+
queue: z.object({
|
|
199
|
+
status: z.enum(['active', 'queued', 'terminal']),
|
|
200
|
+
position: z.number().int().positive().nullable(),
|
|
201
|
+
aheadCount: z.number().int().nonnegative(),
|
|
202
|
+
capacity: z.number().int().positive(),
|
|
203
|
+
remainingBudgetMs: z.number().int().nonnegative(),
|
|
204
|
+
}),
|
|
198
205
|
terminalStates: z.tuple([
|
|
199
206
|
z.literal('completed'),
|
|
200
207
|
z.literal('failed'),
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
-
import {
|
|
2
|
+
import { safeGoverned } from './safe-handler.js';
|
|
3
3
|
import { getSpec } from '../storage/spec-store.js';
|
|
4
4
|
import { hashProjectPath } from '../storage/base-store.js';
|
|
5
5
|
import { generatePromptFromSpec } from '../engine/spec-prompt-generator.js';
|
|
@@ -109,7 +109,7 @@ export function registerSpecPromptHandlers(server) {
|
|
|
109
109
|
destructiveHint: false,
|
|
110
110
|
openWorldHint: false,
|
|
111
111
|
},
|
|
112
|
-
},
|
|
112
|
+
}, safeGoverned('expose_spec_as_prompt', async (args) => handleExposeSpecAsPrompt(args, server)));
|
|
113
113
|
server.registerTool('list_spec_prompts', {
|
|
114
114
|
description: 'List all Planu spec prompts registered in the current session. ' +
|
|
115
115
|
'Returns prompt names, spec IDs, and titles.',
|
|
@@ -120,6 +120,6 @@ export function registerSpecPromptHandlers(server) {
|
|
|
120
120
|
destructiveHint: false,
|
|
121
121
|
openWorldHint: false,
|
|
122
122
|
},
|
|
123
|
-
},
|
|
123
|
+
}, safeGoverned('list_spec_prompts', (args) => Promise.resolve(handleListSpecPrompts(args))));
|
|
124
124
|
}
|
|
125
125
|
//# sourceMappingURL=spec-prompt-handler.js.map
|
|
@@ -12,7 +12,7 @@ export declare function syncSpecState(projectPath: string, projectId: string): P
|
|
|
12
12
|
export declare function startupSync(): Promise<void>;
|
|
13
13
|
/**
|
|
14
14
|
* Registers the sync_spec_state tool on the MCP server (SPEC-334).
|
|
15
|
-
* Always-on (free) tool — registered directly without
|
|
15
|
+
* Always-on (free) tool — registered directly without safeGoverned.
|
|
16
16
|
*/
|
|
17
17
|
export declare function registerSyncSpecStateTool(server: McpServer): void;
|
|
18
18
|
//# sourceMappingURL=sync-spec-state-handler.d.ts.map
|
|
@@ -12,7 +12,7 @@ import { parseFrontmatter } from '../engine/frontmatter-parser.js';
|
|
|
12
12
|
import { verifyTerminalFrontmatter } from '../engine/frontmatter-sha/index.js';
|
|
13
13
|
import { appendTransitionEvent } from '../storage/transition-log.js';
|
|
14
14
|
import { cleanEphemeralArtifacts } from '../engine/housekeeping/index.js';
|
|
15
|
-
import { readFile } from 'node:fs/promises';
|
|
15
|
+
import { readFile, stat } from 'node:fs/promises';
|
|
16
16
|
// ---------------------------------------------------------------------------
|
|
17
17
|
// Sync helpers (exported for startup use)
|
|
18
18
|
// ---------------------------------------------------------------------------
|
|
@@ -33,9 +33,15 @@ export async function syncSpecState(projectPath, projectId) {
|
|
|
33
33
|
divergences: [],
|
|
34
34
|
errors: [`Failed to load specs for ${projectId}: ${msg}`],
|
|
35
35
|
rejected: [],
|
|
36
|
+
ghosts: [],
|
|
36
37
|
};
|
|
37
38
|
}
|
|
39
|
+
// SPEC-1351 (AC3): quarantine store entries whose spec.md is missing on
|
|
40
|
+
// disk — ghost registrations left behind by a create_spec attempt that
|
|
41
|
+
// reported success but never persisted (or whose file was later deleted).
|
|
42
|
+
const ghosts = await detectGhostSpecs(projectId, dataEntries);
|
|
38
43
|
const { updates, report } = await detectSpecStateDivergences(projectPath, dataEntries);
|
|
44
|
+
report.ghosts = ghosts;
|
|
39
45
|
// SyncReport.rejected is always defined (SPEC-720)
|
|
40
46
|
const TERMINAL_STATUSES = ['done', 'discarded'];
|
|
41
47
|
for (const { specId, newStatus } of updates) {
|
|
@@ -136,6 +142,41 @@ export async function syncSpecState(projectPath, projectId) {
|
|
|
136
142
|
}
|
|
137
143
|
return report;
|
|
138
144
|
}
|
|
145
|
+
/**
|
|
146
|
+
* SPEC-1351 (AC3): scan the data store for entries whose spec.md is missing on
|
|
147
|
+
* disk and quarantine each one — appends a `ghost_spec_quarantined` transition
|
|
148
|
+
* event (surfaced by workspace_alerts with a recovery action) and returns the
|
|
149
|
+
* list so callers can report it inline.
|
|
150
|
+
*/
|
|
151
|
+
async function detectGhostSpecs(projectId, dataEntries) {
|
|
152
|
+
const ghosts = [];
|
|
153
|
+
await Promise.all(dataEntries.map(async (entry) => {
|
|
154
|
+
if (!entry.specPath) {
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
try {
|
|
158
|
+
const fileStat = await stat(entry.specPath);
|
|
159
|
+
if (fileStat.size > 0) {
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
catch {
|
|
164
|
+
// fall through to quarantine — missing or unreadable spec.md
|
|
165
|
+
}
|
|
166
|
+
const reason = `Store entry ${entry.id} references spec.md at ${entry.specPath}, which is missing or empty on disk. Recreate the spec via create_spec or restore spec.md from git/backup.`;
|
|
167
|
+
ghosts.push({ specId: entry.id, specPath: entry.specPath, reason });
|
|
168
|
+
void appendTransitionEvent({
|
|
169
|
+
projectId,
|
|
170
|
+
specId: entry.id,
|
|
171
|
+
eventType: 'ghost_spec_quarantined',
|
|
172
|
+
actor: 'sync_spec_state',
|
|
173
|
+
reason,
|
|
174
|
+
}).catch(() => {
|
|
175
|
+
/* best-effort */
|
|
176
|
+
});
|
|
177
|
+
}));
|
|
178
|
+
return ghosts;
|
|
179
|
+
}
|
|
139
180
|
/**
|
|
140
181
|
* Startup sync: iterates all registered projects and calls syncSpecState for each.
|
|
141
182
|
* Non-blocking — errors are logged but not propagated.
|
|
@@ -183,6 +224,13 @@ function formatReport(report, label) {
|
|
|
183
224
|
lines.push(` - ${r.specId}: ${r.reason}`);
|
|
184
225
|
}
|
|
185
226
|
}
|
|
227
|
+
// SPEC-1351: Ghost store entries quarantined (missing spec.md on disk)
|
|
228
|
+
if ((report.ghosts?.length ?? 0) > 0) {
|
|
229
|
+
lines.push(' Quarantined ghosts (spec.md missing — recreate or restore):');
|
|
230
|
+
for (const g of report.ghosts ?? []) {
|
|
231
|
+
lines.push(` - ${g.specId}: ${g.specPath}`);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
186
234
|
if (report.errors.length > 0) {
|
|
187
235
|
lines.push(' Errors:');
|
|
188
236
|
for (const e of report.errors) {
|
|
@@ -196,7 +244,7 @@ function formatReport(report, label) {
|
|
|
196
244
|
// ---------------------------------------------------------------------------
|
|
197
245
|
/**
|
|
198
246
|
* Registers the sync_spec_state tool on the MCP server (SPEC-334).
|
|
199
|
-
* Always-on (free) tool — registered directly without
|
|
247
|
+
* Always-on (free) tool — registered directly without safeGoverned.
|
|
200
248
|
*/
|
|
201
249
|
export function registerSyncSpecStateTool(server) {
|
|
202
250
|
server.registerTool('sync_spec_state', {
|
|
@@ -29,12 +29,12 @@ export interface ToolEntry {
|
|
|
29
29
|
annotations?: Record<string, unknown>;
|
|
30
30
|
/**
|
|
31
31
|
* Which safe-handler wrapper to apply.
|
|
32
|
-
* - 'tracked' → safeTracked (
|
|
33
|
-
* - '
|
|
34
|
-
* - 'safe' → safe (no
|
|
32
|
+
* - 'tracked' → safeTracked (local usage tracking) [default]
|
|
33
|
+
* - 'governed' → safeGoverned (engineering budget + local usage)
|
|
34
|
+
* - 'safe' → safe (no usage tracking — for infra/admin tools)
|
|
35
35
|
* - 'none' → raw handler with no wrapper (rare — test only)
|
|
36
36
|
*/
|
|
37
|
-
wrap?: 'tracked' | '
|
|
37
|
+
wrap?: 'tracked' | 'governed' | 'safe' | 'none';
|
|
38
38
|
/**
|
|
39
39
|
* Optional Zod output schema for MCP outputSchema validation.
|
|
40
40
|
* When provided, passed as `outputSchema` to server.registerTool().
|
package/dist/tools/tool-entry.js
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
// Phase 1 (refactor/declarative-registry): replaces the register-*-tools.ts boilerplate pattern:
|
|
4
4
|
// server.registerTool(name, { description, inputSchema, annotations }, safeXxx(name, handler))
|
|
5
5
|
// with a plain data array that registerFromEntries() consumes.
|
|
6
|
-
import { safe,
|
|
6
|
+
import { safe, safeGoverned, safeTracked } from './safe-handler.js';
|
|
7
7
|
// ---------------------------------------------------------------------------
|
|
8
8
|
// Registration helper
|
|
9
9
|
// ---------------------------------------------------------------------------
|
|
@@ -21,8 +21,8 @@ export function registerFromEntries(server, entries) {
|
|
|
21
21
|
if (wrap === 'none') {
|
|
22
22
|
wrappedHandler = handler;
|
|
23
23
|
}
|
|
24
|
-
else if (wrap === '
|
|
25
|
-
wrappedHandler =
|
|
24
|
+
else if (wrap === 'governed') {
|
|
25
|
+
wrappedHandler = safeGoverned(name, handler);
|
|
26
26
|
}
|
|
27
27
|
else if (wrap === 'safe') {
|
|
28
28
|
wrappedHandler = safe(handler);
|