@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
|
@@ -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
|
package/dist/tools/webhook.js
DELETED
|
@@ -1,150 +0,0 @@
|
|
|
1
|
-
// tools/webhook.ts — Handlers for webhook management MCP tools.
|
|
2
|
-
// start_webhook, stop_webhook, webhook_status
|
|
3
|
-
import { startWebhookServer, stopWebhookServer, getWebhookState, setWebhookSecret, } from '../engine/webhook/index.js';
|
|
4
|
-
// ---------------------------------------------------------------------------
|
|
5
|
-
// Tool handlers
|
|
6
|
-
// ---------------------------------------------------------------------------
|
|
7
|
-
export async function handleStartWebhook(args) {
|
|
8
|
-
const port = args.port ?? 2358;
|
|
9
|
-
const secret = args.secret ?? '';
|
|
10
|
-
if (port < 1 || port > 65535) {
|
|
11
|
-
return {
|
|
12
|
-
content: [{ type: 'text', text: 'Error: port must be between 1 and 65535.' }],
|
|
13
|
-
isError: true,
|
|
14
|
-
};
|
|
15
|
-
}
|
|
16
|
-
const current = getWebhookState();
|
|
17
|
-
if (current.running) {
|
|
18
|
-
return {
|
|
19
|
-
content: [
|
|
20
|
-
{
|
|
21
|
-
type: 'text',
|
|
22
|
-
text: [
|
|
23
|
-
'Webhook server is already running.',
|
|
24
|
-
`Port: ${String(current.port)}`,
|
|
25
|
-
`Started: ${current.startedAt ?? 'unknown'}`,
|
|
26
|
-
'',
|
|
27
|
-
'Use stop_webhook first to restart on a different port.',
|
|
28
|
-
].join('\n'),
|
|
29
|
-
},
|
|
30
|
-
],
|
|
31
|
-
};
|
|
32
|
-
}
|
|
33
|
-
if (secret) {
|
|
34
|
-
setWebhookSecret(secret);
|
|
35
|
-
}
|
|
36
|
-
try {
|
|
37
|
-
const state = await startWebhookServer(port);
|
|
38
|
-
const secretMsg = secret
|
|
39
|
-
? 'HMAC-SHA256 signature validation enabled.'
|
|
40
|
-
: 'Warning: no webhook secret set — all requests will be accepted.';
|
|
41
|
-
return {
|
|
42
|
-
content: [
|
|
43
|
-
{
|
|
44
|
-
type: 'text',
|
|
45
|
-
text: [
|
|
46
|
-
'Webhook server started.',
|
|
47
|
-
`URL: http://localhost:${String(state.port)}/`,
|
|
48
|
-
`Port: ${String(state.port)}`,
|
|
49
|
-
`Started: ${state.startedAt ?? 'unknown'}`,
|
|
50
|
-
'',
|
|
51
|
-
secretMsg,
|
|
52
|
-
'',
|
|
53
|
-
'Configure this URL in your Lemon Squeezy dashboard under:',
|
|
54
|
-
' Settings > Webhooks > Add webhook',
|
|
55
|
-
'',
|
|
56
|
-
'Supported events:',
|
|
57
|
-
' • subscription_cancelled',
|
|
58
|
-
' • subscription_updated',
|
|
59
|
-
' • license_key_created',
|
|
60
|
-
].join('\n'),
|
|
61
|
-
},
|
|
62
|
-
],
|
|
63
|
-
};
|
|
64
|
-
}
|
|
65
|
-
catch (err) {
|
|
66
|
-
const message = err instanceof Error ? err.message : String(err);
|
|
67
|
-
return {
|
|
68
|
-
content: [
|
|
69
|
-
{
|
|
70
|
-
type: 'text',
|
|
71
|
-
text: [
|
|
72
|
-
`Failed to start webhook server: ${message}`,
|
|
73
|
-
'',
|
|
74
|
-
'Common causes:',
|
|
75
|
-
`• Port ${String(port)} is already in use — try a different port`,
|
|
76
|
-
'• Insufficient permissions for ports below 1024',
|
|
77
|
-
].join('\n'),
|
|
78
|
-
},
|
|
79
|
-
],
|
|
80
|
-
isError: true,
|
|
81
|
-
};
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
export async function handleStopWebhook(_args) {
|
|
85
|
-
const current = getWebhookState();
|
|
86
|
-
if (!current.running) {
|
|
87
|
-
return {
|
|
88
|
-
content: [{ type: 'text', text: 'Webhook server is not running.' }],
|
|
89
|
-
};
|
|
90
|
-
}
|
|
91
|
-
// force flag reserved for future use (e.g., drop active connections)
|
|
92
|
-
try {
|
|
93
|
-
await stopWebhookServer();
|
|
94
|
-
return {
|
|
95
|
-
content: [
|
|
96
|
-
{
|
|
97
|
-
type: 'text',
|
|
98
|
-
text: [
|
|
99
|
-
'Webhook server stopped.',
|
|
100
|
-
`Events processed during session: ${String(current.eventsProcessed)}`,
|
|
101
|
-
].join('\n'),
|
|
102
|
-
},
|
|
103
|
-
],
|
|
104
|
-
};
|
|
105
|
-
}
|
|
106
|
-
catch (err) {
|
|
107
|
-
const message = err instanceof Error ? err.message : String(err);
|
|
108
|
-
return {
|
|
109
|
-
content: [{ type: 'text', text: `Failed to stop webhook server: ${message}` }],
|
|
110
|
-
isError: true,
|
|
111
|
-
};
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
export function handleWebhookStatus(args) {
|
|
115
|
-
const state = getWebhookState();
|
|
116
|
-
const includeEvents = args.includeEvents ?? true;
|
|
117
|
-
const lines = [
|
|
118
|
-
`Status: ${state.running ? 'RUNNING' : 'STOPPED'}`,
|
|
119
|
-
`Port: ${String(state.port)}`,
|
|
120
|
-
`Started: ${state.startedAt ?? 'N/A'}`,
|
|
121
|
-
`Events processed: ${String(state.eventsProcessed)}`,
|
|
122
|
-
];
|
|
123
|
-
if (includeEvents && state.recentEvents.length > 0) {
|
|
124
|
-
lines.push('', 'Recent events:');
|
|
125
|
-
for (const event of state.recentEvents) {
|
|
126
|
-
const status = event.processed ? 'OK' : 'FAIL';
|
|
127
|
-
lines.push(` [${status}] ${event.receivedAt} | ${event.eventType} | ${event.summary}`);
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
else if (includeEvents) {
|
|
131
|
-
lines.push('', 'No events received yet.');
|
|
132
|
-
}
|
|
133
|
-
if (!state.running) {
|
|
134
|
-
lines.push('', 'Use start_webhook to begin receiving Lemon Squeezy events.');
|
|
135
|
-
}
|
|
136
|
-
return {
|
|
137
|
-
content: [{ type: 'text', text: lines.join('\n') }],
|
|
138
|
-
};
|
|
139
|
-
}
|
|
140
|
-
// ---------------------------------------------------------------------------
|
|
141
|
-
// Internal helper (exported for testing)
|
|
142
|
-
// ---------------------------------------------------------------------------
|
|
143
|
-
export function formatStateForDisplay(state) {
|
|
144
|
-
return [
|
|
145
|
-
`running=${String(state.running)}`,
|
|
146
|
-
`port=${String(state.port)}`,
|
|
147
|
-
`eventsProcessed=${String(state.eventsProcessed)}`,
|
|
148
|
-
].join(', ');
|
|
149
|
-
}
|
|
150
|
-
//# sourceMappingURL=webhook.js.map
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
export type ChangelogEntryType = 'criteria_added' | 'criteria_removed' | 'status_changed' | 'scope_changed' | 'progress_updated' | 'reconciled';
|
|
2
|
-
export interface CriteriaDiff {
|
|
3
|
-
added: string[];
|
|
4
|
-
removed: string[];
|
|
5
|
-
modified: {
|
|
6
|
-
before: string;
|
|
7
|
-
after: string;
|
|
8
|
-
}[];
|
|
9
|
-
}
|
|
10
|
-
export interface SpecSnapshot {
|
|
11
|
-
criteriaCount: number;
|
|
12
|
-
completedCount: number;
|
|
13
|
-
status: string;
|
|
14
|
-
}
|
|
15
|
-
export interface SpecChangelogEntry {
|
|
16
|
-
timestamp: string;
|
|
17
|
-
type: ChangelogEntryType;
|
|
18
|
-
description: string;
|
|
19
|
-
triggeredBy: string;
|
|
20
|
-
before?: SpecSnapshot;
|
|
21
|
-
after?: SpecSnapshot;
|
|
22
|
-
diff?: CriteriaDiff;
|
|
23
|
-
}
|
|
24
|
-
export interface SpecChangelogData {
|
|
25
|
-
specId: string;
|
|
26
|
-
entries: SpecChangelogEntry[];
|
|
27
|
-
}
|
|
28
|
-
export interface AppendChangelogOptions {
|
|
29
|
-
specDir: string;
|
|
30
|
-
specId: string;
|
|
31
|
-
entry: SpecChangelogEntry;
|
|
32
|
-
}
|
|
33
|
-
export interface ReadChangelogOptions {
|
|
34
|
-
specDir: string;
|
|
35
|
-
specId: string;
|
|
36
|
-
}
|
|
37
|
-
export interface SpecHistoryInput {
|
|
38
|
-
specId: string;
|
|
39
|
-
specDir: string;
|
|
40
|
-
filter?: string;
|
|
41
|
-
}
|
|
42
|
-
export interface SpecHistoryResult {
|
|
43
|
-
specId: string;
|
|
44
|
-
entries: SpecChangelogEntry[];
|
|
45
|
-
totalEntries: number;
|
|
46
|
-
filtered: boolean;
|
|
47
|
-
message: string;
|
|
48
|
-
}
|
|
49
|
-
//# sourceMappingURL=changelog.d.ts.map
|
package/dist/types/changelog.js
DELETED
|
@@ -1,109 +0,0 @@
|
|
|
1
|
-
import type { PricingTier } from './common/primitives.js';
|
|
2
|
-
export interface LicenseState {
|
|
3
|
-
/** License key from Lemon Squeezy */
|
|
4
|
-
readonly licenseKey: string;
|
|
5
|
-
/** Unique instance identifier for this activation */
|
|
6
|
-
readonly instanceId: string;
|
|
7
|
-
/** Resolved tier from the license variant */
|
|
8
|
-
readonly tier: PricingTier;
|
|
9
|
-
/** ISO 8601 timestamp of when the license was activated locally */
|
|
10
|
-
readonly activatedAt: string;
|
|
11
|
-
/** ISO 8601 timestamp of the last successful remote validation */
|
|
12
|
-
readonly lastValidatedAt: string;
|
|
13
|
-
/** Lemon Squeezy variant name (e.g. "Planu Pro Monthly") */
|
|
14
|
-
readonly variantName: string;
|
|
15
|
-
/** Customer name from Lemon Squeezy */
|
|
16
|
-
readonly customerName: string;
|
|
17
|
-
/** Customer email from Lemon Squeezy */
|
|
18
|
-
readonly customerEmail: string;
|
|
19
|
-
/** SHA-256 fingerprint of the machine that activated this license */
|
|
20
|
-
readonly machineFingerprint: string;
|
|
21
|
-
/** Maximum number of activations allowed by Lemon Squeezy */
|
|
22
|
-
readonly activationLimit: number;
|
|
23
|
-
/** Current number of activations used */
|
|
24
|
-
readonly activationUsage: number;
|
|
25
|
-
}
|
|
26
|
-
export interface TierLimits {
|
|
27
|
-
readonly maxProjects: number;
|
|
28
|
-
readonly maxActiveSpecs: number;
|
|
29
|
-
}
|
|
30
|
-
export interface LicensePlanConfig {
|
|
31
|
-
readonly tiers: Record<PricingTier, TierLimits>;
|
|
32
|
-
readonly freeTools: readonly string[];
|
|
33
|
-
readonly proTools: readonly string[];
|
|
34
|
-
readonly alwaysAllowed: readonly string[];
|
|
35
|
-
readonly upgradeUrl: string;
|
|
36
|
-
/**
|
|
37
|
-
* ISO date string (YYYY-MM-DD). Until this date all PRO tools are accessible
|
|
38
|
-
* to free-tier users — promotional "open access" window.
|
|
39
|
-
*/
|
|
40
|
-
readonly freeUntil?: string;
|
|
41
|
-
}
|
|
42
|
-
export interface LicenseCheckResult {
|
|
43
|
-
readonly allowed: boolean;
|
|
44
|
-
readonly currentTier: PricingTier;
|
|
45
|
-
readonly requiredTier: PricingTier;
|
|
46
|
-
readonly message: string;
|
|
47
|
-
}
|
|
48
|
-
export interface LemonSqueezyMeta {
|
|
49
|
-
readonly store_id: number;
|
|
50
|
-
readonly order_id: number;
|
|
51
|
-
readonly order_item_id: number;
|
|
52
|
-
readonly product_id: number;
|
|
53
|
-
readonly product_name: string;
|
|
54
|
-
readonly variant_id: number;
|
|
55
|
-
readonly variant_name: string;
|
|
56
|
-
readonly customer_id: number;
|
|
57
|
-
readonly customer_name: string;
|
|
58
|
-
readonly customer_email: string;
|
|
59
|
-
}
|
|
60
|
-
export interface LemonSqueezyInstance {
|
|
61
|
-
readonly id: string;
|
|
62
|
-
readonly name: string;
|
|
63
|
-
readonly created_at: string;
|
|
64
|
-
}
|
|
65
|
-
export interface LemonSqueezyActivateResponse {
|
|
66
|
-
readonly activated: boolean;
|
|
67
|
-
readonly error: string | null;
|
|
68
|
-
readonly license_key: {
|
|
69
|
-
readonly id: number;
|
|
70
|
-
readonly status: string;
|
|
71
|
-
readonly key: string;
|
|
72
|
-
readonly activation_limit: number;
|
|
73
|
-
readonly activation_usage: number;
|
|
74
|
-
readonly created_at: string;
|
|
75
|
-
readonly expires_at: string | null;
|
|
76
|
-
};
|
|
77
|
-
readonly instance: LemonSqueezyInstance;
|
|
78
|
-
readonly meta: LemonSqueezyMeta;
|
|
79
|
-
}
|
|
80
|
-
export interface LemonSqueezyValidateResponse {
|
|
81
|
-
readonly valid: boolean;
|
|
82
|
-
readonly error: string | null;
|
|
83
|
-
readonly license_key: {
|
|
84
|
-
readonly id: number;
|
|
85
|
-
readonly status: string;
|
|
86
|
-
readonly key: string;
|
|
87
|
-
readonly activation_limit: number;
|
|
88
|
-
readonly activation_usage: number;
|
|
89
|
-
readonly created_at: string;
|
|
90
|
-
readonly expires_at: string | null;
|
|
91
|
-
};
|
|
92
|
-
readonly instance: LemonSqueezyInstance;
|
|
93
|
-
readonly meta: LemonSqueezyMeta;
|
|
94
|
-
}
|
|
95
|
-
export interface LemonSqueezyDeactivateResponse {
|
|
96
|
-
readonly deactivated: boolean;
|
|
97
|
-
readonly error: string | null;
|
|
98
|
-
}
|
|
99
|
-
export interface ActivateLicenseInput {
|
|
100
|
-
readonly licenseKey: string;
|
|
101
|
-
readonly instanceName?: string;
|
|
102
|
-
}
|
|
103
|
-
export interface DeactivateLicenseInput {
|
|
104
|
-
readonly confirm: boolean;
|
|
105
|
-
}
|
|
106
|
-
export interface LicenseStatusInput {
|
|
107
|
-
readonly projectId?: string;
|
|
108
|
-
}
|
|
109
|
-
//# sourceMappingURL=licensing.d.ts.map
|
package/dist/types/licensing.js
DELETED