@planu/cli 4.14.1 → 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 +35 -1
- 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 +2 -2
- 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 +1 -1
- 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 +10 -1
- package/dist/engine/evidence-gates/artifact-reader.js +115 -2
- 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/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/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 +10 -10
- package/dist/engine/planu-core.darwin-x64.node.manifest.json +7 -7
- package/dist/engine/planu-core.darwin-x64.node.sbom.json +10 -10
- package/dist/engine/planu-core.linux-arm64-gnu.node.manifest.json +7 -7
- package/dist/engine/planu-core.linux-arm64-gnu.node.sbom.json +10 -10
- package/dist/engine/planu-core.linux-arm64-musl.node.manifest.json +7 -7
- package/dist/engine/planu-core.linux-arm64-musl.node.sbom.json +10 -10
- package/dist/engine/planu-core.linux-x64-gnu.node.manifest.json +7 -7
- package/dist/engine/planu-core.linux-x64-gnu.node.sbom.json +10 -10
- package/dist/engine/planu-core.linux-x64-musl.node.manifest.json +7 -7
- package/dist/engine/planu-core.linux-x64-musl.node.sbom.json +10 -10
- package/dist/engine/planu-core.win32-arm64-msvc.node.manifest.json +7 -7
- package/dist/engine/planu-core.win32-arm64-msvc.node.sbom.json +10 -10
- package/dist/engine/planu-core.win32-x64-msvc.node.manifest.json +7 -7
- package/dist/engine/planu-core.win32-x64-msvc.node.sbom.json +10 -10
- package/dist/engine/readiness-checker.d.ts +1 -16
- package/dist/engine/readiness-checker.js +27 -88
- 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 +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-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/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 +27 -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 +10 -0
- 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.js +5 -5
- package/dist/tools/check-readiness.js +1 -1
- package/dist/tools/configure-telemetry.js +30 -2
- package/dist/tools/create-spec/spec-builder.js +0 -11
- package/dist/tools/create-spec.d.ts +1 -0
- package/dist/tools/create-spec.js +444 -239
- 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 +17 -8
- 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 +1 -1
- 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/done-receipt-verifier.js +40 -27
- package/dist/tools/update-status/evidence-gate.js +36 -1
- package/dist/tools/update-status/file-sync.d.ts +2 -1
- package/dist/tools/update-status/file-sync.js +57 -6
- package/dist/tools/update-status/index.d.ts +2 -0
- package/dist/tools/update-status/index.js +95 -58
- 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 +32 -15
- 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/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-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 +2 -6
- package/dist/types/index.js +1 -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 +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 +29 -0
- package/dist/types/spec-format.d.ts +24 -0
- package/dist/types/telemetry.d.ts +4 -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 +2 -2
- package/package.json +16 -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
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,37 @@
|
|
|
1
|
+
## [5.0.0] - 2026-07-31
|
|
2
|
+
|
|
3
|
+
### Breaking Changes
|
|
4
|
+
|
|
5
|
+
- Removed Planu commercial plans, license activation, trials, project/spec
|
|
6
|
+
limits, daily commercial quotas, and the Lemon Squeezy entitlement surface.
|
|
7
|
+
- All local tools are available without payment under the Planu Proprietary
|
|
8
|
+
Free-Use License. The official unmodified package may be used commercially or
|
|
9
|
+
non-commercially with unlimited users and instances; the repository and
|
|
10
|
+
TypeScript implementation remain private and proprietary.
|
|
11
|
+
- Removed the public license commands, entitlement fields, environment
|
|
12
|
+
variables, and tier-based tool metadata. Consumers must remove those obsolete
|
|
13
|
+
fields instead of relying on compatibility aliases.
|
|
14
|
+
- Removed the orphaned `product-intelligence` public types and embedded
|
|
15
|
+
telemetry/feedback project endpoints and credentials. Telemetry delivery now
|
|
16
|
+
requires explicit `PLANU_TELEMETRY_ENDPOINT` and `PLANU_TELEMETRY_TOKEN`
|
|
17
|
+
configuration; remote feedback requires `PLANU_FEEDBACK_ENDPOINT`.
|
|
18
|
+
|
|
19
|
+
### Security and Distribution
|
|
20
|
+
|
|
21
|
+
- Preserved engineering budgets, hosted authentication and authorization,
|
|
22
|
+
transport abuse controls, dependency-license auditing, model pricing, runtime
|
|
23
|
+
timeouts, local usage health, and generic outbound webhooks.
|
|
24
|
+
- Added narrow, idempotent cleanup for obsolete commercial state and a forward
|
|
25
|
+
Supabase migration that removes trial data without rewriting migration history.
|
|
26
|
+
- Hardened npm packaging to allow public `.d.ts` declarations while rejecting
|
|
27
|
+
implementation `.ts`, source maps, embedded sources, personal paths, and
|
|
28
|
+
personal identity metadata.
|
|
29
|
+
|
|
30
|
+
### Community
|
|
31
|
+
|
|
32
|
+
- Kept direct BTC, ETH, and SOL donations, sponsorship channels, testimonials,
|
|
33
|
+
and the disabled-until-configured newsletter contract.
|
|
34
|
+
|
|
1
35
|
## [4.14.1] - 2026-07-29
|
|
2
36
|
|
|
3
37
|
### Bug Fixes
|
|
@@ -4474,4 +4508,4 @@ Format: [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) · Versioning:
|
|
|
4474
4508
|
- Mermaid diagram generation (architecture, sequence, state machine, ER, data flow)
|
|
4475
4509
|
- Multi-language i18n (EN/ES/PT) for generated specs
|
|
4476
4510
|
- Clean Architecture (hexagonal) — engine, tools, storage, types layers
|
|
4477
|
-
- 10,857 tests with ≥95% coverage
|
|
4511
|
+
- 10,857 tests with ≥95% coverage
|
package/LICENSE
CHANGED
|
@@ -1,16 +1,59 @@
|
|
|
1
|
+
Planu Proprietary Free-Use License 1.0
|
|
2
|
+
|
|
1
3
|
Copyright (c) 2026 Planu. All rights reserved.
|
|
2
4
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
5
|
+
1. Definitions
|
|
6
|
+
|
|
7
|
+
"Official Package" means an unmodified Planu executable package made available
|
|
8
|
+
by Planu through an authorized package registry or distribution channel. It
|
|
9
|
+
includes the JavaScript runtime, native binaries, public type declarations,
|
|
10
|
+
documentation, and other files intentionally included in that package.
|
|
11
|
+
|
|
12
|
+
2. Free-use grant
|
|
13
|
+
|
|
14
|
+
Subject to this license, Planu grants you a worldwide, royalty-free,
|
|
15
|
+
non-exclusive, non-transferable license to install and execute Official
|
|
16
|
+
Packages for commercial and non-commercial purposes, with no limit on users,
|
|
17
|
+
projects, installations, or instances. You may make the internal copies
|
|
18
|
+
reasonably necessary for npm installation, package caches, CI, containers,
|
|
19
|
+
deployment, disaster recovery, and backups. Those copies must remain
|
|
20
|
+
unmodified, be used only by you or your organization, and retain this license
|
|
21
|
+
and all proprietary notices.
|
|
22
|
+
|
|
23
|
+
3. Proprietary ownership and restrictions
|
|
24
|
+
|
|
25
|
+
Planu and its licensors retain all right, title, and interest in the software,
|
|
26
|
+
repository, implementation source code, and derivative works. This license
|
|
27
|
+
does not grant source-code access or any open-source rights. Except where
|
|
28
|
+
applicable law expressly prevents the restriction, you may not:
|
|
29
|
+
|
|
30
|
+
- publish, disclose, sell, sublicense, or provide Planu implementation source;
|
|
31
|
+
- modify, adapt, translate, reverse engineer, decompile, or create derivative
|
|
32
|
+
builds from an Official Package;
|
|
33
|
+
- remove or alter copyright, license, attribution, or proprietary notices;
|
|
34
|
+
- repackage, mirror, resell, sublicense, or publicly redistribute an Official
|
|
35
|
+
Package or a derived build; or
|
|
36
|
+
- use Planu trademarks to imply endorsement or authorship of another product.
|
|
37
|
+
|
|
38
|
+
Planu may separately authorize redistribution or modification in writing.
|
|
39
|
+
|
|
40
|
+
4. Third-party components
|
|
41
|
+
|
|
42
|
+
Third-party components remain subject to their own license terms. Those terms
|
|
43
|
+
do not change the proprietary status of Planu's original implementation.
|
|
44
|
+
|
|
45
|
+
5. Termination
|
|
46
|
+
|
|
47
|
+
This license terminates automatically if you breach it. On termination, you
|
|
48
|
+
must stop using Planu and delete copies under your control, except archival
|
|
49
|
+
copies that applicable law requires you to retain.
|
|
50
|
+
|
|
51
|
+
6. Disclaimer and limitation of liability
|
|
7
52
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
out of, or in connection with the Software or the use or other dealings in the
|
|
14
|
-
Software.
|
|
53
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
54
|
+
IMPLIED, INCLUDING MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND
|
|
55
|
+
NONINFRINGEMENT. TO THE MAXIMUM EXTENT PERMITTED BY LAW, PLANU AND ITS AUTHORS
|
|
56
|
+
OR COPYRIGHT HOLDERS ARE NOT LIABLE FOR ANY CLAIM, DAMAGES, OR OTHER LIABILITY
|
|
57
|
+
ARISING FROM OR RELATED TO THE SOFTWARE OR ITS USE.
|
|
15
58
|
|
|
16
|
-
For
|
|
59
|
+
For permissions beyond this license, contact hello@planu.dev.
|
package/README.md
CHANGED
|
@@ -21,7 +21,7 @@ Planu is a Spec Driven Development stack for AI coding agents: an MCP server and
|
|
|
21
21
|
- **Local change detection** — observes project changes without requiring a hosted configuration service.
|
|
22
22
|
- **Unified Spec Format** — Requirements and technical details in a single, context-efficient `spec.md`.
|
|
23
23
|
- **Atomic Integrity** — Indestructible writes and **Freeze-on-done** immutability (P0).
|
|
24
|
-
- **
|
|
24
|
+
- **28 official MCP tools** for the public SDD surface, with advanced workflows kept in skills, CLI commands, and internal pipelines.
|
|
25
25
|
- **Multi-agent compatible** — Optimized for Claude Code, Cursor, Windsurf, and Gemini CLI.
|
|
26
26
|
|
|
27
27
|
---
|
|
@@ -126,4 +126,12 @@ pnpm release:local # Local-first release flow when shipping
|
|
|
126
126
|
|
|
127
127
|
## License
|
|
128
128
|
|
|
129
|
-
Planu is proprietary software.
|
|
129
|
+
Planu is proprietary, free-use software. The official unmodified package may be
|
|
130
|
+
installed and executed without payment for commercial and non-commercial work,
|
|
131
|
+
with unlimited users and instances. Internal copies needed for npm caches, CI,
|
|
132
|
+
containers, deployment, and backups are permitted. The repository and
|
|
133
|
+
TypeScript implementation sources remain private; modification, repackaging,
|
|
134
|
+
derived builds, and public redistribution are restricted. Distributed
|
|
135
|
+
JavaScript remains readable and is not represented as secret.
|
|
136
|
+
|
|
137
|
+
See the [Planu Proprietary Free-Use License](LICENSE) for the complete terms.
|
|
@@ -1,9 +1,4 @@
|
|
|
1
1
|
import type { CliCommand } from '../../types/cli.js';
|
|
2
|
-
export interface LicenseActivationResult {
|
|
3
|
-
key: string;
|
|
4
|
-
customerEmail: string;
|
|
5
|
-
variantName: string;
|
|
6
|
-
}
|
|
7
2
|
interface McpEntry {
|
|
8
3
|
command: string;
|
|
9
4
|
args: string[];
|
|
@@ -46,7 +41,7 @@ export interface InstallationManifest {
|
|
|
46
41
|
updatedAt: string;
|
|
47
42
|
installations: InstallationRecord[];
|
|
48
43
|
}
|
|
49
|
-
declare function buildMcpEntry(
|
|
44
|
+
declare function buildMcpEntry(): McpEntry;
|
|
50
45
|
declare function readJsonFile(filePath: string): ToolConfig;
|
|
51
46
|
declare function hasPlanuEntry(config: ToolConfig, format: ToolDefinition['format']): boolean;
|
|
52
47
|
export declare function readInstallationManifest(manifestPath: string): InstallationManifest;
|
|
@@ -55,12 +50,6 @@ export declare function removeInstallationRecords(manifestPath: string, removedC
|
|
|
55
50
|
declare function writeStandardEntry(filePath: string, entry: McpEntry): void;
|
|
56
51
|
declare function writeZedEntry(filePath: string, entry: McpEntry): void;
|
|
57
52
|
declare function removeEntry(filePath: string, format: ToolDefinition['format']): void;
|
|
58
|
-
/**
|
|
59
|
-
* Prompt the user for a license key and activate it.
|
|
60
|
-
* Returns the activation result or null if the user skips.
|
|
61
|
-
* In CI/headless mode (SDD_OWNER_TOKEN already set), returns a synthetic result immediately.
|
|
62
|
-
*/
|
|
63
|
-
export declare function promptLicense(): Promise<LicenseActivationResult | null>;
|
|
64
53
|
export { buildMcpEntry, readJsonFile, hasPlanuEntry, writeStandardEntry, writeZedEntry, removeEntry, };
|
|
65
54
|
export declare const installCommand: CliCommand;
|
|
66
55
|
//# sourceMappingURL=install.d.ts.map
|
|
@@ -5,9 +5,9 @@ import { homedir } from 'node:os';
|
|
|
5
5
|
import { dirname, isAbsolute, join } from 'node:path';
|
|
6
6
|
import { bold, cyan, green, yellow, dim } from '../colors.js';
|
|
7
7
|
import { PLANU_VERSION } from '../../config/version.js';
|
|
8
|
-
import { confirm, select
|
|
9
|
-
import { activateLicense } from '../../engine/license-validator.js';
|
|
8
|
+
import { confirm, select } from '../interactive.js';
|
|
10
9
|
import { resolveStorageLayout } from '../../storage/storage-layout.js';
|
|
10
|
+
import { removeCommercialState } from '../../engine/migrations/remove-commercial-state.js';
|
|
11
11
|
// ---------------------------------------------------------------------------
|
|
12
12
|
// Constants
|
|
13
13
|
// ---------------------------------------------------------------------------
|
|
@@ -66,7 +66,7 @@ const TOOLS = [
|
|
|
66
66
|
// ---------------------------------------------------------------------------
|
|
67
67
|
// Helpers
|
|
68
68
|
// ---------------------------------------------------------------------------
|
|
69
|
-
function buildMcpEntry(
|
|
69
|
+
function buildMcpEntry() {
|
|
70
70
|
const offline = process.env.PLANU_OFFLINE === '1';
|
|
71
71
|
return {
|
|
72
72
|
command: 'npx',
|
|
@@ -243,61 +243,6 @@ function removeEntry(filePath, format) {
|
|
|
243
243
|
: removePlanuFromStandard(config);
|
|
244
244
|
writeJsonAtomically(filePath, updated);
|
|
245
245
|
}
|
|
246
|
-
// ---------------------------------------------------------------------------
|
|
247
|
-
// License step helper (exported for tests)
|
|
248
|
-
// ---------------------------------------------------------------------------
|
|
249
|
-
/**
|
|
250
|
-
* Prompt the user for a license key and activate it.
|
|
251
|
-
* Returns the activation result or null if the user skips.
|
|
252
|
-
* In CI/headless mode (SDD_OWNER_TOKEN already set), returns a synthetic result immediately.
|
|
253
|
-
*/
|
|
254
|
-
export async function promptLicense() {
|
|
255
|
-
// Headless / CI mode: use token from environment directly
|
|
256
|
-
const envToken = process.env.SDD_OWNER_TOKEN;
|
|
257
|
-
if (envToken) {
|
|
258
|
-
return { key: envToken, customerEmail: '', variantName: 'Pro' };
|
|
259
|
-
}
|
|
260
|
-
if (process.env.PLANU_OFFLINE === '1') {
|
|
261
|
-
return null;
|
|
262
|
-
}
|
|
263
|
-
const wantsLicense = await confirm('Do you have a Pro license key?', false);
|
|
264
|
-
if (!wantsLicense) {
|
|
265
|
-
return null;
|
|
266
|
-
}
|
|
267
|
-
const key = await ask('Enter your license key:');
|
|
268
|
-
if (!key) {
|
|
269
|
-
return null;
|
|
270
|
-
}
|
|
271
|
-
process.stdout.write(`${dim('Validating license key...')}\n`);
|
|
272
|
-
try {
|
|
273
|
-
const result = await activateLicense(key, 'planu-cli');
|
|
274
|
-
if (!result.activated) {
|
|
275
|
-
const errMsg = result.error ?? 'Invalid license key';
|
|
276
|
-
process.stdout.write(`${yellow('!')} License validation failed: ${errMsg}\n`);
|
|
277
|
-
const continueWithout = await confirm('Continue without license?', true);
|
|
278
|
-
if (!continueWithout) {
|
|
279
|
-
throw new Error('Aborted by user after license validation failure');
|
|
280
|
-
}
|
|
281
|
-
return null;
|
|
282
|
-
}
|
|
283
|
-
const email = result.meta.customer_email;
|
|
284
|
-
const variant = result.meta.variant_name;
|
|
285
|
-
process.stdout.write(`${green('+')} Pro license — ${email}\n`);
|
|
286
|
-
return { key, customerEmail: email, variantName: variant };
|
|
287
|
-
}
|
|
288
|
-
catch (err) {
|
|
289
|
-
if (err instanceof Error && err.message.startsWith('Aborted')) {
|
|
290
|
-
throw err;
|
|
291
|
-
}
|
|
292
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
293
|
-
process.stdout.write(`${yellow('!')} License API error: ${msg}\n`);
|
|
294
|
-
const continueWithout = await confirm('Continue without license?', true);
|
|
295
|
-
if (!continueWithout) {
|
|
296
|
-
throw new Error('Aborted by user after license API error', { cause: err });
|
|
297
|
-
}
|
|
298
|
-
return null;
|
|
299
|
-
}
|
|
300
|
-
}
|
|
301
246
|
// Exported so tests can use them without going through the interactive CLI
|
|
302
247
|
export { buildMcpEntry, readJsonFile, hasPlanuEntry, writeStandardEntry, writeZedEntry, removeEntry, };
|
|
303
248
|
// ---------------------------------------------------------------------------
|
|
@@ -372,8 +317,8 @@ async function resolveTargets(detected, installAll) {
|
|
|
372
317
|
}
|
|
373
318
|
return detected.filter((t) => t.name === choice);
|
|
374
319
|
}
|
|
375
|
-
async function installToPath(tool, targetPath, scope, quiet
|
|
376
|
-
const entry = buildMcpEntry(
|
|
320
|
+
async function installToPath(tool, targetPath, scope, quiet) {
|
|
321
|
+
const entry = buildMcpEntry();
|
|
377
322
|
const targetExisted = existsSync(targetPath);
|
|
378
323
|
const previousContent = targetExisted ? readFileSync(targetPath, 'utf8') : null;
|
|
379
324
|
let existingConfig = {};
|
|
@@ -455,6 +400,9 @@ export const installCommand = {
|
|
|
455
400
|
installAll = true;
|
|
456
401
|
}
|
|
457
402
|
}
|
|
403
|
+
await removeCommercialState({
|
|
404
|
+
hostConfigPaths: TOOLS.flatMap((tool) => tool.projectScopePath ? [tool.userScopePath, tool.projectScopePath] : [tool.userScopePath]),
|
|
405
|
+
});
|
|
458
406
|
printBanner();
|
|
459
407
|
// Detect installed tools (user-scope paths)
|
|
460
408
|
const detected = [];
|
|
@@ -486,10 +434,6 @@ export const installCommand = {
|
|
|
486
434
|
}
|
|
487
435
|
const scope = await resolveScope(scopeArg);
|
|
488
436
|
const targets = await resolveTargets(detected, installAll);
|
|
489
|
-
// License step — prompt or read from env
|
|
490
|
-
process.stdout.write('\n');
|
|
491
|
-
const license = await promptLicense();
|
|
492
|
-
const licenseKey = license?.key;
|
|
493
437
|
process.stdout.write(`\n${cyan('Installing...')}\n`);
|
|
494
438
|
let installed = 0;
|
|
495
439
|
for (const tool of targets) {
|
|
@@ -504,7 +448,7 @@ export const installCommand = {
|
|
|
504
448
|
else {
|
|
505
449
|
targetPath = tool.userScopePath;
|
|
506
450
|
}
|
|
507
|
-
const ok = await installToPath(tool, targetPath, scope, quiet
|
|
451
|
+
const ok = await installToPath(tool, targetPath, scope, quiet);
|
|
508
452
|
if (ok) {
|
|
509
453
|
installed++;
|
|
510
454
|
}
|
package/dist/cli/commands/job.js
CHANGED
|
@@ -51,7 +51,7 @@ var __disposeResources = (this && this.__disposeResources) || (function (Suppres
|
|
|
51
51
|
return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
|
|
52
52
|
});
|
|
53
53
|
import { parseArgs } from 'node:util';
|
|
54
|
-
import {
|
|
54
|
+
import { publicJobCursor, DurableJobRuntime } from '../../engine/execution/job-runtime.js';
|
|
55
55
|
const USAGE = 'planu job <get|watch|cancel> --operation-id ID --project-id ID [--workspace-id ID] [--after-cursor CURSOR] [--timeout-ms N] [--json]';
|
|
56
56
|
export const jobCommand = {
|
|
57
57
|
name: 'job',
|
|
@@ -86,7 +86,7 @@ export const jobCommand = {
|
|
|
86
86
|
workspaceId: values['workspace-id'],
|
|
87
87
|
};
|
|
88
88
|
const runtime = __addDisposableResource(env_1, new DurableJobRuntime(), false);
|
|
89
|
-
const
|
|
89
|
+
const internalJob = action === 'cancel'
|
|
90
90
|
? runtime.cancel(identity)
|
|
91
91
|
: action === 'watch'
|
|
92
92
|
? await runtime.watch({
|
|
@@ -95,7 +95,8 @@ export const jobCommand = {
|
|
|
95
95
|
timeoutMs: parseTimeout(values['timeout-ms']),
|
|
96
96
|
})
|
|
97
97
|
: runtime.get(identity);
|
|
98
|
-
|
|
98
|
+
const job = runtime.observe(internalJob);
|
|
99
|
+
process.stdout.write(`${JSON.stringify({ job, cursor: publicJobCursor(job) }, null, flags?.json === true || values.json === true ? undefined : 2)}\n`);
|
|
99
100
|
}
|
|
100
101
|
catch (e_1) {
|
|
101
102
|
env_1.error = e_1;
|
|
@@ -12,7 +12,7 @@ import { handleCreateSpec } from '../../tools/create-spec.js';
|
|
|
12
12
|
import { handleListSpecs } from '../../tools/list-specs.js';
|
|
13
13
|
import { handleUpdateStatus } from '../../tools/update-status.js';
|
|
14
14
|
import { handleUpdateStatusBatch } from '../../tools/update-status/batch.js';
|
|
15
|
-
import {
|
|
15
|
+
import { handleValidate } from '../../tools/validate.js';
|
|
16
16
|
import { formatToolResult } from '../formatter.js';
|
|
17
17
|
import { detectProjectId } from '../project-detector.js';
|
|
18
18
|
import { bold, cyan, green, red, dim } from '../colors.js';
|
|
@@ -60,7 +60,7 @@ async function runValidate(args, flags) {
|
|
|
60
60
|
return;
|
|
61
61
|
}
|
|
62
62
|
const projectId = values['project-id'] ?? detectProjectId();
|
|
63
|
-
const result = await handleValidate({ specId, projectId });
|
|
63
|
+
const result = await handleValidate({ specId, projectId, projectPath: process.cwd() });
|
|
64
64
|
if (result.isError) {
|
|
65
65
|
process.stderr.write(`${red(formatToolResult(result, flags))}\n`);
|
|
66
66
|
process.exitCode = 1;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// cli/commands/validate.ts — planu validate <specId> (SPEC-124)
|
|
2
2
|
import { parseArgs } from 'node:util';
|
|
3
|
-
import {
|
|
3
|
+
import { handleValidate } from '../../tools/validate.js';
|
|
4
4
|
import { formatToolResult } from '../formatter.js';
|
|
5
5
|
import { detectProjectId } from '../project-detector.js';
|
|
6
6
|
import { red } from '../colors.js';
|
|
@@ -24,7 +24,7 @@ export const validateCommand = {
|
|
|
24
24
|
return;
|
|
25
25
|
}
|
|
26
26
|
const projectId = values['project-id'] ?? detectProjectId();
|
|
27
|
-
const result = await handleValidate({ specId, projectId });
|
|
27
|
+
const result = await handleValidate({ specId, projectId, projectPath: process.cwd() });
|
|
28
28
|
if (result.isError) {
|
|
29
29
|
process.stderr.write(`${red(formatToolResult(result, flags))}\n`);
|
|
30
30
|
process.exitCode = 1;
|
package/dist/cli/router.js
CHANGED
|
@@ -4,7 +4,7 @@ import { PLANU_VERSION } from '../config/version.js';
|
|
|
4
4
|
import { red, bold, cyan, dim } from './colors.js';
|
|
5
5
|
// Lazy-load commands to avoid importing tool handlers when not needed
|
|
6
6
|
async function loadCommands() {
|
|
7
|
-
const [{ initCommand }, { createCommand }, { listCommand }, { statusCommand }, { estimateCommand }, { validateCommand }, { dashboardCommand }, { auditCommand }, { serveCommand }, { handoffCommand }, { watchCommand }, { installCommand }, { doctorCommand }, { uninstallCommand }, {
|
|
7
|
+
const [{ initCommand }, { createCommand }, { listCommand }, { statusCommand }, { estimateCommand }, { validateCommand }, { dashboardCommand }, { auditCommand }, { serveCommand }, { handoffCommand }, { watchCommand }, { installCommand }, { doctorCommand }, { uninstallCommand }, { specCommand }, { healthCommand }, { releaseCommand }, { storageCommand }, { inspectCommand }, { offlineCommand }, { jobCommand },] = await Promise.all([
|
|
8
8
|
import('./commands/init.js'),
|
|
9
9
|
import('./commands/create.js'),
|
|
10
10
|
import('./commands/list.js'),
|
|
@@ -19,7 +19,6 @@ async function loadCommands() {
|
|
|
19
19
|
import('./commands/install.js'),
|
|
20
20
|
import('./commands/doctor.js'),
|
|
21
21
|
import('./commands/uninstall.js'),
|
|
22
|
-
import('./commands/activate.js'),
|
|
23
22
|
import('./commands/spec.js'),
|
|
24
23
|
import('./commands/health.js'),
|
|
25
24
|
import('./commands/release.js'),
|
|
@@ -43,7 +42,6 @@ async function loadCommands() {
|
|
|
43
42
|
installCommand,
|
|
44
43
|
doctorCommand,
|
|
45
44
|
uninstallCommand,
|
|
46
|
-
activateCommand,
|
|
47
45
|
specCommand,
|
|
48
46
|
healthCommand,
|
|
49
47
|
releaseCommand,
|
|
@@ -101,9 +101,6 @@
|
|
|
101
101
|
{ "name": "PLANU_SAGA_CHAOS", "type": "string", "scope": "test", "sensitivity": "public", "default": null },
|
|
102
102
|
{ "name": "PLANU_SESSION_BUDGET", "type": "number", "scope": "runtime", "sensitivity": "private", "default": null },
|
|
103
103
|
{ "name": "PLANU_SESSION_ID", "type": "string", "scope": "runtime", "sensitivity": "private", "default": null },
|
|
104
|
-
{ "name": "PLANU_SKIP_TRIAL", "type": "boolean", "scope": "runtime", "sensitivity": "public", "default": null },
|
|
105
|
-
{ "name": "PLANU_SUPABASE_KEY", "type": "string", "scope": "runtime", "sensitivity": "secret", "default": null },
|
|
106
|
-
{ "name": "PLANU_SUPABASE_URL", "type": "string", "scope": "runtime", "sensitivity": "public", "default": null },
|
|
107
104
|
{
|
|
108
105
|
"name": "PLANU_SUPPRESS_AUTOCOMMIT",
|
|
109
106
|
"type": "boolean",
|
|
@@ -126,6 +123,7 @@
|
|
|
126
123
|
"sensitivity": "public",
|
|
127
124
|
"default": null
|
|
128
125
|
},
|
|
126
|
+
{ "name": "PLANU_TELEMETRY_TOKEN", "type": "string", "scope": "runtime", "sensitivity": "secret", "default": null },
|
|
129
127
|
{ "name": "PLANU_TIMING", "type": "boolean", "scope": "runtime", "sensitivity": "public", "default": null },
|
|
130
128
|
{ "name": "PLANU_TOOL_TIMEOUT_MS", "type": "number", "scope": "runtime", "sensitivity": "public", "default": null },
|
|
131
129
|
{
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
/** Single editable authority for the official local SDD tool surface. */
|
|
2
|
+
export declare const OFFICIAL_SDD_TOOL_NAMES: readonly ['planu_status', 'session_checkpoint', 'facilitate', 'init_project', 'clarify_requirements', 'create_spec', 'list_specs', 'challenge_spec', 'check_readiness', 'update_status', 'update_status_batch', 'package_handoff', 'validate', 'get_job', 'watch_job', 'cancel_job', 'restart_job', 'reconcile_spec', 'create_rule', 'create_skill', 'skill_search', 'configure_code_graph', 'code_graph_status', 'submit_feedback', 'triage_feedback', 'resolve_feedback', 'sync_feedback', 'feedback_status'];
|
|
3
|
+
export declare function readCanonicalToolNames(): string[];
|
|
4
|
+
//# sourceMappingURL=official-sdd-tools.d.ts.map
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/** Single editable authority for the official local SDD tool surface. */
|
|
2
|
+
export const OFFICIAL_SDD_TOOL_NAMES = [
|
|
3
|
+
'planu_status',
|
|
4
|
+
'session_checkpoint',
|
|
5
|
+
'facilitate',
|
|
6
|
+
'init_project',
|
|
7
|
+
'clarify_requirements',
|
|
8
|
+
'create_spec',
|
|
9
|
+
'list_specs',
|
|
10
|
+
'challenge_spec',
|
|
11
|
+
'check_readiness',
|
|
12
|
+
'update_status',
|
|
13
|
+
'update_status_batch',
|
|
14
|
+
'package_handoff',
|
|
15
|
+
'validate',
|
|
16
|
+
'get_job',
|
|
17
|
+
'watch_job',
|
|
18
|
+
'cancel_job',
|
|
19
|
+
'restart_job',
|
|
20
|
+
'reconcile_spec',
|
|
21
|
+
'create_rule',
|
|
22
|
+
'create_skill',
|
|
23
|
+
'skill_search',
|
|
24
|
+
'configure_code_graph',
|
|
25
|
+
'code_graph_status',
|
|
26
|
+
'submit_feedback',
|
|
27
|
+
'triage_feedback',
|
|
28
|
+
'resolve_feedback',
|
|
29
|
+
'sync_feedback',
|
|
30
|
+
'feedback_status',
|
|
31
|
+
];
|
|
32
|
+
export function readCanonicalToolNames() {
|
|
33
|
+
return [...OFFICIAL_SDD_TOOL_NAMES];
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=official-sdd-tools.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
import type { ProductPublicManifest } from '../types/product-public.js';
|
|
3
|
-
export declare const productPublicSchema: z.ZodObject<{
|
|
3
|
+
export declare const productPublicSchema: z.ZodPipe<z.ZodObject<{
|
|
4
4
|
schemaVersion: z.ZodLiteral<1>;
|
|
5
5
|
website: z.ZodObject<{
|
|
6
6
|
baseUrl: z.ZodURL;
|
|
@@ -75,14 +75,150 @@ export declare const productPublicSchema: z.ZodObject<{
|
|
|
75
75
|
}, z.core.$strict>>;
|
|
76
76
|
claims: z.ZodObject<{
|
|
77
77
|
installCommand: z.ZodString;
|
|
78
|
-
publicToolInventory: z.ZodArray<z.ZodUnion<[z.ZodString, z.ZodString]>>;
|
|
79
78
|
registryReadmeBaseline: z.ZodObject<{
|
|
80
79
|
package: z.ZodLiteral<"@planu/cli">;
|
|
81
80
|
version: z.ZodString;
|
|
82
81
|
sha256: z.ZodString;
|
|
83
82
|
}, z.core.$strict>;
|
|
84
83
|
}, z.core.$strict>;
|
|
85
|
-
}, z.core.$strict
|
|
84
|
+
}, z.core.$strict>, z.ZodTransform<{
|
|
85
|
+
schemaVersion: 1;
|
|
86
|
+
website: {
|
|
87
|
+
baseUrl: string;
|
|
88
|
+
defaultLocale: string;
|
|
89
|
+
theme: {
|
|
90
|
+
defaultAppearance: "system";
|
|
91
|
+
allowUserToggle: boolean;
|
|
92
|
+
};
|
|
93
|
+
disabledRouteSegments: string[];
|
|
94
|
+
locales: {
|
|
95
|
+
id: string;
|
|
96
|
+
contentLocale: "de" | "en" | "es" | "fr" | "pt" | "zh";
|
|
97
|
+
label: string;
|
|
98
|
+
lang: string;
|
|
99
|
+
hreflang: string;
|
|
100
|
+
ogLocale: string;
|
|
101
|
+
nav: {
|
|
102
|
+
text: string;
|
|
103
|
+
path: string;
|
|
104
|
+
}[];
|
|
105
|
+
chrome: {
|
|
106
|
+
footerLead: string;
|
|
107
|
+
support: string;
|
|
108
|
+
changelog: string;
|
|
109
|
+
reportBug: string;
|
|
110
|
+
appearance: string;
|
|
111
|
+
lightTheme: string;
|
|
112
|
+
darkTheme: string;
|
|
113
|
+
sidebar: string;
|
|
114
|
+
top: string;
|
|
115
|
+
language: string;
|
|
116
|
+
skip: string;
|
|
117
|
+
outline: string;
|
|
118
|
+
previous: string;
|
|
119
|
+
next: string;
|
|
120
|
+
search: string;
|
|
121
|
+
noResults: string;
|
|
122
|
+
};
|
|
123
|
+
}[];
|
|
124
|
+
newsletter: {
|
|
125
|
+
enabled: boolean;
|
|
126
|
+
provider: "none";
|
|
127
|
+
signupUrl: string | null;
|
|
128
|
+
};
|
|
129
|
+
sponsors: {
|
|
130
|
+
enabled: boolean;
|
|
131
|
+
pagePath: string;
|
|
132
|
+
githubUrl: string;
|
|
133
|
+
contactEmail: string;
|
|
134
|
+
};
|
|
135
|
+
};
|
|
136
|
+
donations: {
|
|
137
|
+
id: "btc" | "eth" | "sol";
|
|
138
|
+
symbol: string;
|
|
139
|
+
network: string;
|
|
140
|
+
address: string;
|
|
141
|
+
qrPath: string;
|
|
142
|
+
walletUri: string | null;
|
|
143
|
+
}[];
|
|
144
|
+
claims: {
|
|
145
|
+
installCommand: string;
|
|
146
|
+
registryReadmeBaseline: {
|
|
147
|
+
package: "@planu/cli";
|
|
148
|
+
version: string;
|
|
149
|
+
sha256: string;
|
|
150
|
+
};
|
|
151
|
+
publicToolInventory: string[];
|
|
152
|
+
};
|
|
153
|
+
}, {
|
|
154
|
+
schemaVersion: 1;
|
|
155
|
+
website: {
|
|
156
|
+
baseUrl: string;
|
|
157
|
+
defaultLocale: string;
|
|
158
|
+
theme: {
|
|
159
|
+
defaultAppearance: "system";
|
|
160
|
+
allowUserToggle: boolean;
|
|
161
|
+
};
|
|
162
|
+
disabledRouteSegments: string[];
|
|
163
|
+
locales: {
|
|
164
|
+
id: string;
|
|
165
|
+
contentLocale: "de" | "en" | "es" | "fr" | "pt" | "zh";
|
|
166
|
+
label: string;
|
|
167
|
+
lang: string;
|
|
168
|
+
hreflang: string;
|
|
169
|
+
ogLocale: string;
|
|
170
|
+
nav: {
|
|
171
|
+
text: string;
|
|
172
|
+
path: string;
|
|
173
|
+
}[];
|
|
174
|
+
chrome: {
|
|
175
|
+
footerLead: string;
|
|
176
|
+
support: string;
|
|
177
|
+
changelog: string;
|
|
178
|
+
reportBug: string;
|
|
179
|
+
appearance: string;
|
|
180
|
+
lightTheme: string;
|
|
181
|
+
darkTheme: string;
|
|
182
|
+
sidebar: string;
|
|
183
|
+
top: string;
|
|
184
|
+
language: string;
|
|
185
|
+
skip: string;
|
|
186
|
+
outline: string;
|
|
187
|
+
previous: string;
|
|
188
|
+
next: string;
|
|
189
|
+
search: string;
|
|
190
|
+
noResults: string;
|
|
191
|
+
};
|
|
192
|
+
}[];
|
|
193
|
+
newsletter: {
|
|
194
|
+
enabled: boolean;
|
|
195
|
+
provider: "none";
|
|
196
|
+
signupUrl: string | null;
|
|
197
|
+
};
|
|
198
|
+
sponsors: {
|
|
199
|
+
enabled: boolean;
|
|
200
|
+
pagePath: string;
|
|
201
|
+
githubUrl: string;
|
|
202
|
+
contactEmail: string;
|
|
203
|
+
};
|
|
204
|
+
};
|
|
205
|
+
donations: {
|
|
206
|
+
id: "btc" | "eth" | "sol";
|
|
207
|
+
symbol: string;
|
|
208
|
+
network: string;
|
|
209
|
+
address: string;
|
|
210
|
+
qrPath: string;
|
|
211
|
+
walletUri: string | null;
|
|
212
|
+
}[];
|
|
213
|
+
claims: {
|
|
214
|
+
installCommand: string;
|
|
215
|
+
registryReadmeBaseline: {
|
|
216
|
+
package: "@planu/cli";
|
|
217
|
+
version: string;
|
|
218
|
+
sha256: string;
|
|
219
|
+
};
|
|
220
|
+
};
|
|
221
|
+
}>>;
|
|
86
222
|
export declare function parseProductPublicManifest(input: unknown): ProductPublicManifest;
|
|
87
223
|
export declare function getProductPublicManifest(): ProductPublicManifest;
|
|
88
224
|
export declare const productPublic: ProductPublicManifest;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
import rawProductPublic from './product-public.json' with { type: 'json' };
|
|
3
|
+
import { readCanonicalToolNames } from './official-sdd-tools.js';
|
|
3
4
|
const nonBlank = z.string().trim().min(1).max(512);
|
|
4
5
|
const pathSegment = z.string().regex(/^[A-Za-z0-9-]+$/u);
|
|
5
6
|
const navItemSchema = z.object({ text: nonBlank, path: nonBlank }).strict();
|
|
@@ -81,7 +82,6 @@ export const productPublicSchema = z
|
|
|
81
82
|
claims: z
|
|
82
83
|
.object({
|
|
83
84
|
installCommand: nonBlank,
|
|
84
|
-
publicToolInventory: z.array(pathSegment.or(z.string().regex(/^[a-z][a-z0-9_]+$/u))).min(1),
|
|
85
85
|
registryReadmeBaseline: z
|
|
86
86
|
.object({
|
|
87
87
|
package: z.literal('@planu/cli'),
|
|
@@ -93,6 +93,13 @@ export const productPublicSchema = z
|
|
|
93
93
|
.strict(),
|
|
94
94
|
})
|
|
95
95
|
.strict()
|
|
96
|
+
.transform((value) => ({
|
|
97
|
+
...value,
|
|
98
|
+
claims: {
|
|
99
|
+
...value.claims,
|
|
100
|
+
publicToolInventory: readCanonicalToolNames(),
|
|
101
|
+
},
|
|
102
|
+
}))
|
|
96
103
|
.superRefine((value, context) => {
|
|
97
104
|
const localeIds = value.website.locales.map(({ id }) => id);
|
|
98
105
|
const donationIds = value.donations.map(({ id }) => id);
|