@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,222 +0,0 @@
|
|
|
1
|
-
// tools/license-gate.ts — Runtime license enforcement for MCP tool handlers.
|
|
2
|
-
// Provides getCurrentTier() with in-memory cache and withLicenseGate() wrapper.
|
|
3
|
-
import { createHash } from 'node:crypto';
|
|
4
|
-
import { licenseStore } from '../storage/index.js';
|
|
5
|
-
import * as usageStore from '../storage/usage-store.js';
|
|
6
|
-
import { resolveCurrentTier, checkToolAccess, isValidationFresh, isInGracePeriod, validateLicense, computeMachineFingerprint, isOpenAccessActive, } from '../engine/license-validator.js';
|
|
7
|
-
import { evaluateRateLimit, isTrialActive, trialDaysRemaining, recordUsageEvent, } from '../engine/usage-tracker/index.js';
|
|
8
|
-
import { getSessionContext } from '../transports/session-context.js';
|
|
9
|
-
// ---------------------------------------------------------------------------
|
|
10
|
-
// Owner token override (SHA-256 verified, not reversible)
|
|
11
|
-
// ---------------------------------------------------------------------------
|
|
12
|
-
// Salt prefix for owner token hashing (v1). New token hashes must be generated
|
|
13
|
-
// as: sha256(HASH_SALT + token). To regenerate OWNER_TOKEN_HASH run:
|
|
14
|
-
// node -e "const{createHash}=require('crypto');console.log(createHash('sha256').update('planu-owner-v1'+process.argv[1]).digest('hex'))" <token>
|
|
15
|
-
const HASH_SALT = 'planu-owner-v1';
|
|
16
|
-
// Hash generated without salt (legacy). Kept for migration: if you rotate the
|
|
17
|
-
// owner token, generate a new salted hash and replace OWNER_TOKEN_HASH_V1.
|
|
18
|
-
const OWNER_TOKEN_HASH = '9f9e8410fd0a718540fe1e29f7beaa2506b539c8732915d8eddcb3bcff9b9465';
|
|
19
|
-
function checkOwnerOverride() {
|
|
20
|
-
const token = process.env.SDD_OWNER_TOKEN;
|
|
21
|
-
if (!token) {
|
|
22
|
-
return null;
|
|
23
|
-
}
|
|
24
|
-
const trimmed = token.trim();
|
|
25
|
-
// Try salted hash first (current scheme).
|
|
26
|
-
const saltedHash = createHash('sha256')
|
|
27
|
-
.update(HASH_SALT + trimmed)
|
|
28
|
-
.digest('hex');
|
|
29
|
-
if (saltedHash === OWNER_TOKEN_HASH) {
|
|
30
|
-
return 'enterprise';
|
|
31
|
-
}
|
|
32
|
-
// Fall back to legacy unsalted hash so existing tokens keep working.
|
|
33
|
-
// DEPRECATED: regenerate OWNER_TOKEN_HASH with salt when rotating the token.
|
|
34
|
-
const legacyHash = createHash('sha256').update(trimmed).digest('hex');
|
|
35
|
-
return legacyHash === OWNER_TOKEN_HASH ? 'enterprise' : null;
|
|
36
|
-
}
|
|
37
|
-
// ---------------------------------------------------------------------------
|
|
38
|
-
// In-memory tier cache (avoids disk read on every tool call)
|
|
39
|
-
// ---------------------------------------------------------------------------
|
|
40
|
-
const CACHE_TTL_MS = 5 * 60 * 1000; // 5 minutes
|
|
41
|
-
let cachedTier = null;
|
|
42
|
-
let cacheTimestamp = 0;
|
|
43
|
-
export async function getCurrentTier() {
|
|
44
|
-
// Per-session license key (hosted multi-tenant mode via HTTP transport)
|
|
45
|
-
const sessionCtx = getSessionContext();
|
|
46
|
-
if (sessionCtx?.licenseKey) {
|
|
47
|
-
return resolveSessionTier(sessionCtx.licenseKey);
|
|
48
|
-
}
|
|
49
|
-
const now = Date.now();
|
|
50
|
-
if (cachedTier !== null && now - cacheTimestamp < CACHE_TTL_MS) {
|
|
51
|
-
return cachedTier;
|
|
52
|
-
}
|
|
53
|
-
const ownerTier = checkOwnerOverride();
|
|
54
|
-
if (ownerTier) {
|
|
55
|
-
cachedTier = ownerTier;
|
|
56
|
-
cacheTimestamp = now;
|
|
57
|
-
return cachedTier;
|
|
58
|
-
}
|
|
59
|
-
let state = await licenseStore.getLicenseState();
|
|
60
|
-
// Synchronous online validation when license is stale (>7 days)
|
|
61
|
-
if (state && !isValidationFresh(state)) {
|
|
62
|
-
state = await performOnlineValidation(state);
|
|
63
|
-
}
|
|
64
|
-
cachedTier = resolveCurrentTier(state);
|
|
65
|
-
cacheTimestamp = now;
|
|
66
|
-
return cachedTier;
|
|
67
|
-
}
|
|
68
|
-
export function invalidateTierCache() {
|
|
69
|
-
cachedTier = null;
|
|
70
|
-
cacheTimestamp = 0;
|
|
71
|
-
}
|
|
72
|
-
/**
|
|
73
|
-
* Synchronous tier estimate based on environment variables only — no disk I/O.
|
|
74
|
-
* Used at server startup to set the display name before async validation runs.
|
|
75
|
-
* Returns 'enterprise' for owner token, 'pro' if a license key env var is set, 'free' otherwise.
|
|
76
|
-
*/
|
|
77
|
-
export function getTierSync() {
|
|
78
|
-
if (checkOwnerOverride()) {
|
|
79
|
-
return 'enterprise';
|
|
80
|
-
}
|
|
81
|
-
if (process.env.SDD_LICENSE_KEY?.trim()) {
|
|
82
|
-
return 'pro';
|
|
83
|
-
}
|
|
84
|
-
return 'free';
|
|
85
|
-
}
|
|
86
|
-
// ---------------------------------------------------------------------------
|
|
87
|
-
// Per-session license resolution (hosted multi-tenant mode)
|
|
88
|
-
// ---------------------------------------------------------------------------
|
|
89
|
-
const sessionTierCache = new Map();
|
|
90
|
-
const SESSION_TIER_TTL_MS = 10 * 60 * 1000; // 10 min — longer since online validation is expensive
|
|
91
|
-
const RATE_LIMIT_EXEMPT_TOOLS = new Set([
|
|
92
|
-
'planu_status',
|
|
93
|
-
'update_status_batch',
|
|
94
|
-
'configure_code_graph',
|
|
95
|
-
'code_graph_status',
|
|
96
|
-
]);
|
|
97
|
-
export function shouldBypassDailyRateLimit(toolName) {
|
|
98
|
-
return RATE_LIMIT_EXEMPT_TOOLS.has(toolName);
|
|
99
|
-
}
|
|
100
|
-
async function resolveSessionTier(licenseKey) {
|
|
101
|
-
const now = Date.now();
|
|
102
|
-
const cached = sessionTierCache.get(licenseKey);
|
|
103
|
-
if (cached && now < cached.expiresAt) {
|
|
104
|
-
return cached.tier;
|
|
105
|
-
}
|
|
106
|
-
try {
|
|
107
|
-
const result = await validateLicense(licenseKey, 'hosted');
|
|
108
|
-
const tier = result.valid ? 'pro' : 'free';
|
|
109
|
-
sessionTierCache.set(licenseKey, { tier, expiresAt: now + SESSION_TIER_TTL_MS });
|
|
110
|
-
return tier;
|
|
111
|
-
}
|
|
112
|
-
catch {
|
|
113
|
-
// API unreachable — degrade to free (no grace period for session keys)
|
|
114
|
-
sessionTierCache.set(licenseKey, { tier: 'free', expiresAt: now + 60_000 }); // retry in 1 min
|
|
115
|
-
return 'free';
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
// ---------------------------------------------------------------------------
|
|
119
|
-
// License gate wrapper
|
|
120
|
-
// ---------------------------------------------------------------------------
|
|
121
|
-
export function withLicenseGate(toolName, handler) {
|
|
122
|
-
return async (args, extra) => {
|
|
123
|
-
const tier = await getCurrentTier();
|
|
124
|
-
const trialContext = await resolveTrialContext(tier);
|
|
125
|
-
const check = checkToolAccess(toolName, tier, trialContext);
|
|
126
|
-
if (!check.allowed) {
|
|
127
|
-
return { content: [{ type: 'text', text: check.message }], isError: true };
|
|
128
|
-
}
|
|
129
|
-
return handler(args, extra);
|
|
130
|
-
};
|
|
131
|
-
}
|
|
132
|
-
/**
|
|
133
|
-
* Resolves trial activity for free-tier users. Returns empty context for paid tiers
|
|
134
|
-
* (no need to query trial state — they already have full access).
|
|
135
|
-
*/
|
|
136
|
-
async function resolveTrialContext(tier) {
|
|
137
|
-
if (tier !== 'free') {
|
|
138
|
-
return { trialActive: false, trialDaysRemaining: 0 };
|
|
139
|
-
}
|
|
140
|
-
try {
|
|
141
|
-
const trialState = await usageStore.ensureTrialState();
|
|
142
|
-
return {
|
|
143
|
-
trialActive: isTrialActive(trialState.firstRunAt),
|
|
144
|
-
trialDaysRemaining: trialDaysRemaining(trialState.firstRunAt),
|
|
145
|
-
};
|
|
146
|
-
}
|
|
147
|
-
catch {
|
|
148
|
-
return { trialActive: false, trialDaysRemaining: 0 };
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
// ---------------------------------------------------------------------------
|
|
152
|
-
// Usage tracking wrapper
|
|
153
|
-
// ---------------------------------------------------------------------------
|
|
154
|
-
/**
|
|
155
|
-
* Wraps a handler with rate limiting (free tier only) and usage event recording.
|
|
156
|
-
* For free tier: checks daily limit + cooldown before executing.
|
|
157
|
-
* For all tiers: records a usage event after execution (fire-and-forget).
|
|
158
|
-
*/
|
|
159
|
-
export function withUsageTracking(toolName, handler) {
|
|
160
|
-
return async (args, extra) => {
|
|
161
|
-
const tier = await getCurrentTier();
|
|
162
|
-
// During open-access window, skip rate limiting for free tier
|
|
163
|
-
if (tier === 'free' && !isOpenAccessActive() && !shouldBypassDailyRateLimit(toolName)) {
|
|
164
|
-
const today = new Date().toISOString().slice(0, 10);
|
|
165
|
-
const [trialState, callCount, lastCallAt] = await Promise.all([
|
|
166
|
-
usageStore.ensureTrialState(),
|
|
167
|
-
usageStore.getDailyCallCount(today),
|
|
168
|
-
usageStore.getLastCallTimestamp(),
|
|
169
|
-
]);
|
|
170
|
-
const maxCalls = isTrialActive(trialState.firstRunAt) ? 50 : 30;
|
|
171
|
-
const check = evaluateRateLimit(callCount, maxCalls, lastCallAt, new Date());
|
|
172
|
-
if (!check.allowed) {
|
|
173
|
-
return { content: [{ type: 'text', text: check.message }], isError: true };
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
// Cast to ToolResult | undefined: TypeScript says ToolResult, but JS runtime may
|
|
177
|
-
// return undefined if a handler has a missing return path not caught at compile time.
|
|
178
|
-
// noImplicitReturns in tsconfig prevents new occurrences; this guard handles old ones.
|
|
179
|
-
const rawResult = (await handler(args, extra));
|
|
180
|
-
const result = rawResult ?? {
|
|
181
|
-
content: [{ type: 'text', text: 'Internal error: tool handler returned no result' }],
|
|
182
|
-
isError: true,
|
|
183
|
-
};
|
|
184
|
-
const success = !result.isError;
|
|
185
|
-
void usageStore
|
|
186
|
-
.appendUsageEvent(recordUsageEvent(toolName, tier, success))
|
|
187
|
-
.catch((err) => {
|
|
188
|
-
console.error('[planu] appendUsageEvent failed:', err);
|
|
189
|
-
});
|
|
190
|
-
return result;
|
|
191
|
-
};
|
|
192
|
-
}
|
|
193
|
-
// ---------------------------------------------------------------------------
|
|
194
|
-
// Synchronous online validation (replaces background fire-and-forget)
|
|
195
|
-
// ---------------------------------------------------------------------------
|
|
196
|
-
async function performOnlineValidation(state) {
|
|
197
|
-
try {
|
|
198
|
-
const result = await validateLicense(state.licenseKey, state.instanceId);
|
|
199
|
-
if (!result.valid) {
|
|
200
|
-
// License revoked remotely — clear local state
|
|
201
|
-
await licenseStore.deleteLicenseState();
|
|
202
|
-
return null;
|
|
203
|
-
}
|
|
204
|
-
const refreshed = {
|
|
205
|
-
...state,
|
|
206
|
-
lastValidatedAt: new Date().toISOString(),
|
|
207
|
-
activationUsage: result.license_key.activation_usage,
|
|
208
|
-
machineFingerprint: computeMachineFingerprint(),
|
|
209
|
-
};
|
|
210
|
-
await licenseStore.saveLicenseState(refreshed);
|
|
211
|
-
return refreshed;
|
|
212
|
-
}
|
|
213
|
-
catch {
|
|
214
|
-
// API unreachable — allow if within grace period (TTL + 3 days)
|
|
215
|
-
if (isInGracePeriod(state)) {
|
|
216
|
-
return state;
|
|
217
|
-
}
|
|
218
|
-
// Grace period expired — degrade to free
|
|
219
|
-
return null;
|
|
220
|
-
}
|
|
221
|
-
}
|
|
222
|
-
//# sourceMappingURL=license-gate.js.map
|
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
// tools/license-status.ts — Handler for license_status MCP tool.
|
|
2
|
-
// Shows current tier, limits, usage, and upgrade URL.
|
|
3
|
-
import { licenseStore } from '../storage/index.js';
|
|
4
|
-
import { getTierLimits, loadLicensePlans } from '../engine/license-validator.js';
|
|
5
|
-
import { getCurrentTier } from './license-gate.js';
|
|
6
|
-
import { readFileSync } from 'node:fs';
|
|
7
|
-
import { join, dirname } from 'node:path';
|
|
8
|
-
import { fileURLToPath } from 'node:url';
|
|
9
|
-
function getVersion() {
|
|
10
|
-
try {
|
|
11
|
-
const dir = dirname(fileURLToPath(import.meta.url));
|
|
12
|
-
const pkg = JSON.parse(readFileSync(join(dir, '../../package.json'), 'utf-8'));
|
|
13
|
-
return pkg.version;
|
|
14
|
-
}
|
|
15
|
-
catch {
|
|
16
|
-
return 'unknown';
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
export async function handleLicenseStatus(_args) {
|
|
20
|
-
const [state, tier] = await Promise.all([licenseStore.getLicenseState(), getCurrentTier()]);
|
|
21
|
-
const limits = getTierLimits(tier);
|
|
22
|
-
const config = loadLicensePlans();
|
|
23
|
-
const projectCount = await licenseStore.countActiveProjects();
|
|
24
|
-
const lines = [];
|
|
25
|
-
lines.push(`## Planu License Status`);
|
|
26
|
-
lines.push('');
|
|
27
|
-
const tierLabel = tier.charAt(0).toUpperCase() + tier.slice(1);
|
|
28
|
-
const totalTools = config.freeTools.length + config.proTools.length + config.alwaysAllowed.length;
|
|
29
|
-
lines.push(`**Version:** ${getVersion()}`);
|
|
30
|
-
lines.push(`**Plan:** ${tierLabel}`);
|
|
31
|
-
if (state?.customerName) {
|
|
32
|
-
lines.push(`**Customer:** ${state.customerName} (${state.customerEmail})`);
|
|
33
|
-
lines.push(`**Variant:** ${state.variantName}`);
|
|
34
|
-
lines.push(`**Activated:** ${state.activatedAt}`);
|
|
35
|
-
lines.push(`**Last validated:** ${state.lastValidatedAt}`);
|
|
36
|
-
}
|
|
37
|
-
if (tier === 'free') {
|
|
38
|
-
const freeAvailable = config.freeTools.length + config.alwaysAllowed.length;
|
|
39
|
-
lines.push(`**Tools available:** ${String(freeAvailable)} of ${String(totalTools)}`);
|
|
40
|
-
}
|
|
41
|
-
else {
|
|
42
|
-
lines.push(`**Tools available:** ${String(totalTools)} of ${String(totalTools)}`);
|
|
43
|
-
}
|
|
44
|
-
lines.push('');
|
|
45
|
-
lines.push('### Limits');
|
|
46
|
-
lines.push(`- Projects: ${String(projectCount)} / ${limits.maxProjects >= 999999 ? '∞' : String(limits.maxProjects)}`);
|
|
47
|
-
lines.push(`- Active specs: ${limits.maxActiveSpecs >= 999999 ? '∞' : String(limits.maxActiveSpecs)} per project`);
|
|
48
|
-
if (state?.customerName && state.activationLimit > 0) {
|
|
49
|
-
lines.push(`- Activation slots: ${String(state.activationUsage)} / ${String(state.activationLimit)}`);
|
|
50
|
-
}
|
|
51
|
-
if (tier === 'free') {
|
|
52
|
-
lines.push('');
|
|
53
|
-
lines.push('### Upgrade');
|
|
54
|
-
lines.push(`Unlock all ${String(totalTools)} tools, 10 projects, and unlimited specs.`);
|
|
55
|
-
lines.push(`→ ${config.upgradeUrl}`);
|
|
56
|
-
lines.push('');
|
|
57
|
-
lines.push('Already have a key? Use `activate_license` to activate it.');
|
|
58
|
-
}
|
|
59
|
-
const structured = {
|
|
60
|
-
version: getVersion(),
|
|
61
|
-
plan: tierLabel,
|
|
62
|
-
toolsAvailable: tier === 'free' ? config.freeTools.length + config.alwaysAllowed.length : totalTools,
|
|
63
|
-
toolsTotal: totalTools,
|
|
64
|
-
limits: {
|
|
65
|
-
maxProjects: limits.maxProjects,
|
|
66
|
-
currentProjects: projectCount,
|
|
67
|
-
maxActiveSpecs: limits.maxActiveSpecs,
|
|
68
|
-
},
|
|
69
|
-
};
|
|
70
|
-
if (state?.customerName) {
|
|
71
|
-
structured.customer = {
|
|
72
|
-
name: state.customerName,
|
|
73
|
-
email: state.customerEmail,
|
|
74
|
-
variant: state.variantName,
|
|
75
|
-
activatedAt: state.activatedAt,
|
|
76
|
-
lastValidatedAt: state.lastValidatedAt,
|
|
77
|
-
};
|
|
78
|
-
if (state.customerName && state.activationLimit > 0) {
|
|
79
|
-
structured.activationSlots = {
|
|
80
|
-
used: state.activationUsage,
|
|
81
|
-
total: state.activationLimit,
|
|
82
|
-
};
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
if (tier === 'free') {
|
|
86
|
-
structured.upgradeUrl = config.upgradeUrl;
|
|
87
|
-
}
|
|
88
|
-
return {
|
|
89
|
-
content: [{ type: 'text', text: lines.join('\n') }],
|
|
90
|
-
structuredContent: structured,
|
|
91
|
-
};
|
|
92
|
-
}
|
|
93
|
-
//# sourceMappingURL=license-status.js.map
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
import { hashProjectPath } from '../storage/base-store.js';
|
|
2
|
-
import * as sessionStore from '../storage/session-store.js';
|
|
3
|
-
import { t, ti } from '../i18n/index.js';
|
|
4
|
-
export async function handleListSessions(params) {
|
|
5
|
-
const projectId = hashProjectPath(params.projectPath);
|
|
6
|
-
const limit = params.limit ?? 10;
|
|
7
|
-
try {
|
|
8
|
-
const items = await sessionStore.listItems(projectId, limit);
|
|
9
|
-
const lines = [];
|
|
10
|
-
lines.push(t('tools.response.sessionsTitle'));
|
|
11
|
-
lines.push('');
|
|
12
|
-
if (items.length === 0) {
|
|
13
|
-
lines.push(t('tools.response.noSessions'));
|
|
14
|
-
}
|
|
15
|
-
else {
|
|
16
|
-
lines.push(ti('tools.response.sessionsFound', { count: items.length }));
|
|
17
|
-
lines.push('');
|
|
18
|
-
for (const session of items) {
|
|
19
|
-
lines.push(`- **${session.id}** | created: ${session.startedAt} | saved: ${session.lastSavedAt}`);
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
lines.push('');
|
|
23
|
-
lines.push('🚀 **Next Steps**');
|
|
24
|
-
lines.push('1. Use `restore_session` to resume a session');
|
|
25
|
-
lines.push('2. Use `export_session` to save session data');
|
|
26
|
-
const sessionTips = {
|
|
27
|
-
naming: 'Name sessions at start: claude -n auth-refactor | Or rename during: /rename auth-refactor',
|
|
28
|
-
resume: 'Resume by name: claude --resume auth-refactor | Most recent: claude --continue',
|
|
29
|
-
fromPr: 'Resume PR session: claude --from-pr 123 (auto-linked when PR created inside Claude Code)',
|
|
30
|
-
pickerShortcuts: 'In /resume picker: P=preview, R=rename, B=filter by branch, /=search',
|
|
31
|
-
btw: 'Use /btw for quick side questions — answer appears in overlay, never enters conversation history',
|
|
32
|
-
};
|
|
33
|
-
return {
|
|
34
|
-
content: [{ type: 'text', text: lines.join('\n') }],
|
|
35
|
-
sessionTips,
|
|
36
|
-
};
|
|
37
|
-
}
|
|
38
|
-
catch (error) {
|
|
39
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
40
|
-
return {
|
|
41
|
-
content: [{ type: 'text', text: `Error listing sessions: ${message}` }],
|
|
42
|
-
isError: true,
|
|
43
|
-
};
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
//# sourceMappingURL=list-sessions.js.map
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
import { runCheckpoint } from '../engine/session-safeguard/checkpoint-runner.js';
|
|
2
|
-
import { readPlanuConfig } from '../engine/planu-config-writer.js';
|
|
3
|
-
import { readFile } from 'node:fs/promises';
|
|
4
|
-
import { join } from 'node:path';
|
|
5
|
-
const DEFAULT_AUTOPUSH_BRANCHES = ['feat/*', 'fix/*', 'chore/*'];
|
|
6
|
-
function resolveProjectPath(input) {
|
|
7
|
-
return input ?? process.cwd();
|
|
8
|
-
}
|
|
9
|
-
async function loadProjectConfig(projectPath) {
|
|
10
|
-
const configPath = join(projectPath, 'planu', 'config.json');
|
|
11
|
-
const config = await readPlanuConfig(configPath, readFile);
|
|
12
|
-
return {
|
|
13
|
-
autopush: config?.autopush ?? false,
|
|
14
|
-
autopushBranches: config?.autopushBranches ?? DEFAULT_AUTOPUSH_BRANCHES,
|
|
15
|
-
};
|
|
16
|
-
}
|
|
17
|
-
export async function handlePlanSessionCheckpoint(input) {
|
|
18
|
-
const projectPath = resolveProjectPath(input.projectPath);
|
|
19
|
-
const { autopush, autopushBranches } = await loadProjectConfig(projectPath);
|
|
20
|
-
const result = await runCheckpoint({
|
|
21
|
-
projectPath,
|
|
22
|
-
dryRun: input.dryRun ?? false,
|
|
23
|
-
autopush,
|
|
24
|
-
autopushBranches,
|
|
25
|
-
});
|
|
26
|
-
const lines = [result.humanSummary, ''];
|
|
27
|
-
if (result.unpushedCommits && result.unpushedCommits.oldestAgeHours >= 2) {
|
|
28
|
-
const u = result.unpushedCommits;
|
|
29
|
-
lines.push(`WARNING: ${String(u.count)} commit(s) unpushed for ${String(u.oldestAgeHours)}h on branch ${u.branch}. Run git push or enable autopush.`);
|
|
30
|
-
}
|
|
31
|
-
if (result.pushed?.pushed === true) {
|
|
32
|
-
lines.push(`Pushed ${String(result.pushed.commitsPushed)} commit(s) to ${result.pushed.ref}`);
|
|
33
|
-
}
|
|
34
|
-
lines.push('');
|
|
35
|
-
lines.push(`session-context refreshed: ${String(result.sessionContextRefreshed)}`);
|
|
36
|
-
lines.push(`learnings flushed: ${String(result.learningsFlushed)}`);
|
|
37
|
-
lines.push(`unpushed commits: ${String(result.unpushedCommits?.count ?? 0)}`);
|
|
38
|
-
return {
|
|
39
|
-
content: [{ type: 'text', text: lines.join('\n').trim() }],
|
|
40
|
-
};
|
|
41
|
-
}
|
|
42
|
-
//# sourceMappingURL=planu-session-checkpoint.js.map
|
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
import { hashProjectPath } from '../storage/base-store.js';
|
|
2
|
-
import * as sessionStore from '../storage/session-store.js';
|
|
3
|
-
import { diffSessions, formatDiffSummary } from '../engine/session/session-diff.js';
|
|
4
|
-
import { compactJson } from './output-formatter.js';
|
|
5
|
-
export async function handleRestoreSession(params) {
|
|
6
|
-
const projectId = hashProjectPath(params.projectPath);
|
|
7
|
-
// Handle fromPr shortcut — returns the resume command without touching session storage
|
|
8
|
-
if (params.fromPr !== undefined) {
|
|
9
|
-
const n = params.fromPr;
|
|
10
|
-
const result = {
|
|
11
|
-
resumeCommand: `claude --from-pr ${n}`,
|
|
12
|
-
description: `Resumes the Claude Code session that created or was linked to PR #${n}`,
|
|
13
|
-
tip: 'Sessions auto-link when you use gh pr create inside Claude Code',
|
|
14
|
-
};
|
|
15
|
-
return { content: [{ type: 'text', text: compactJson(result) }] };
|
|
16
|
-
}
|
|
17
|
-
try {
|
|
18
|
-
let session;
|
|
19
|
-
if (params.sessionId) {
|
|
20
|
-
session = await sessionStore.load(projectId, params.sessionId);
|
|
21
|
-
}
|
|
22
|
-
else {
|
|
23
|
-
session = await sessionStore.getLatest(projectId);
|
|
24
|
-
}
|
|
25
|
-
if (!session) {
|
|
26
|
-
return {
|
|
27
|
-
content: [
|
|
28
|
-
{
|
|
29
|
-
type: 'text',
|
|
30
|
-
text: compactJson({
|
|
31
|
-
message: 'No sessions found for this project. Start working and sessions will be saved automatically.',
|
|
32
|
-
projectId,
|
|
33
|
-
}),
|
|
34
|
-
},
|
|
35
|
-
],
|
|
36
|
-
};
|
|
37
|
-
}
|
|
38
|
-
// Try to compute diff with the second-latest session
|
|
39
|
-
let diffSummary = '';
|
|
40
|
-
const allSessions = await sessionStore.list(projectId);
|
|
41
|
-
if (allSessions.length >= 2) {
|
|
42
|
-
const previous = allSessions[1];
|
|
43
|
-
if (previous) {
|
|
44
|
-
const diff = diffSessions(previous, session);
|
|
45
|
-
diffSummary = formatDiffSummary(diff);
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
const result = {
|
|
49
|
-
sessionId: session.id,
|
|
50
|
-
startedAt: session.startedAt,
|
|
51
|
-
lastSavedAt: session.lastSavedAt,
|
|
52
|
-
contextSummary: session.contextSummary,
|
|
53
|
-
activeSpecs: session.activeSpecs,
|
|
54
|
-
pendingDecisions: session.decisions.slice(-5),
|
|
55
|
-
toolCallCount: session.toolCallCount,
|
|
56
|
-
diffSummary: diffSummary || undefined,
|
|
57
|
-
message: 'Session restored successfully.',
|
|
58
|
-
};
|
|
59
|
-
return {
|
|
60
|
-
content: [{ type: 'text', text: compactJson(result, 60) }],
|
|
61
|
-
};
|
|
62
|
-
}
|
|
63
|
-
catch (error) {
|
|
64
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
65
|
-
return {
|
|
66
|
-
content: [{ type: 'text', text: `Error restoring session: ${message}` }],
|
|
67
|
-
isError: true,
|
|
68
|
-
};
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
//# sourceMappingURL=restore-session.js.map
|
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
import { readChangelog } from '../engine/spec-changelog/index.js';
|
|
2
|
-
import { compactResult } from './output-formatter.js';
|
|
3
|
-
const VALID_ENTRY_TYPES = [
|
|
4
|
-
'criteria_added',
|
|
5
|
-
'criteria_removed',
|
|
6
|
-
'status_changed',
|
|
7
|
-
'scope_changed',
|
|
8
|
-
'progress_updated',
|
|
9
|
-
'reconciled',
|
|
10
|
-
];
|
|
11
|
-
function parseFilterTypes(filter) {
|
|
12
|
-
return filter
|
|
13
|
-
.split(',')
|
|
14
|
-
.map((s) => s.trim())
|
|
15
|
-
.filter((t) => VALID_ENTRY_TYPES.includes(t));
|
|
16
|
-
}
|
|
17
|
-
export async function handleSpecHistory(params) {
|
|
18
|
-
const { specId, specDir, filter } = params;
|
|
19
|
-
try {
|
|
20
|
-
const changelog = await readChangelog({ specDir, specId });
|
|
21
|
-
if (!changelog) {
|
|
22
|
-
return compactResult(JSON.stringify({
|
|
23
|
-
specId,
|
|
24
|
-
entries: [],
|
|
25
|
-
totalEntries: 0,
|
|
26
|
-
filtered: false,
|
|
27
|
-
message: `No hay CHANGELOG.md para ${specId}. El changelog se crea automaticamente cuando se ejecuta reconcile_spec o update_status sobre la spec.`,
|
|
28
|
-
}, null, 2));
|
|
29
|
-
}
|
|
30
|
-
let entries = changelog.entries;
|
|
31
|
-
let filtered = false;
|
|
32
|
-
if (filter) {
|
|
33
|
-
const filterTypes = parseFilterTypes(filter);
|
|
34
|
-
if (filterTypes.length > 0) {
|
|
35
|
-
entries = entries.filter((e) => filterTypes.includes(e.type));
|
|
36
|
-
filtered = true;
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
const message = entries.length === 0 && filtered
|
|
40
|
-
? 'No hay entradas del tipo solicitado'
|
|
41
|
-
: `${entries.length} entrada${entries.length !== 1 ? 's' : ''} encontrada${entries.length !== 1 ? 's' : ''} en el changelog de ${specId}`;
|
|
42
|
-
const result = {
|
|
43
|
-
specId,
|
|
44
|
-
entries,
|
|
45
|
-
totalEntries: entries.length,
|
|
46
|
-
filtered,
|
|
47
|
-
message,
|
|
48
|
-
};
|
|
49
|
-
return compactResult(JSON.stringify(result, null, 2));
|
|
50
|
-
}
|
|
51
|
-
catch (error) {
|
|
52
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
53
|
-
return {
|
|
54
|
-
content: [{ type: 'text', text: `Error reading spec history: ${message}` }],
|
|
55
|
-
isError: true,
|
|
56
|
-
};
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
//# sourceMappingURL=spec-history.js.map
|
package/dist/tools/webhook.d.ts
DELETED
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
import type { ToolResult, StartWebhookInput, StopWebhookInput, WebhookStatusInput, WebhookServerState } from '../types/index.js';
|
|
2
|
-
export declare function handleStartWebhook(args: StartWebhookInput): Promise<ToolResult>;
|
|
3
|
-
export declare function handleStopWebhook(_args: StopWebhookInput): Promise<ToolResult>;
|
|
4
|
-
export declare function handleWebhookStatus(args: WebhookStatusInput): ToolResult;
|
|
5
|
-
export declare function formatStateForDisplay(state: WebhookServerState): string;
|
|
6
|
-
//# sourceMappingURL=webhook.d.ts.map
|