peaks-loop 4.1.2 → 4.1.4
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/.claude-plugin/marketplace.json +136 -47
- package/CHANGELOG.md +112 -0
- package/README-en.md +1 -1
- package/README.md +1 -1
- package/contracts/readonly-argv-whitelist.json +211 -0
- package/dist/cli/commands/asset-command-shared.d.ts +12 -0
- package/dist/cli/commands/asset-command-shared.js +45 -0
- package/dist/cli/commands/asset-commands.d.ts +6 -1
- package/dist/cli/commands/asset-commands.js +11 -372
- package/dist/cli/commands/asset-crystallize-command.d.ts +3 -0
- package/dist/cli/commands/asset-crystallize-command.js +60 -0
- package/dist/cli/commands/asset-crystallize-payload.d.ts +47 -0
- package/dist/cli/commands/asset-crystallize-payload.js +85 -0
- package/dist/cli/commands/asset-crystallize-runner.d.ts +3 -0
- package/dist/cli/commands/asset-crystallize-runner.js +133 -0
- package/dist/cli/commands/asset-dispose-command.d.ts +3 -0
- package/dist/cli/commands/asset-dispose-command.js +99 -0
- package/dist/cli/commands/asset-status-command.d.ts +3 -0
- package/dist/cli/commands/asset-status-command.js +100 -0
- package/dist/cli/commands/audit-artifact-runners.d.ts +16 -0
- package/dist/cli/commands/audit-artifact-runners.js +170 -0
- package/dist/cli/commands/audit-command-shared.d.ts +97 -0
- package/dist/cli/commands/audit-command-shared.js +60 -0
- package/dist/cli/commands/audit-commands.d.ts +7 -31
- package/dist/cli/commands/audit-commands.js +64 -473
- package/dist/cli/commands/audit-goal-runners.d.ts +17 -0
- package/dist/cli/commands/audit-goal-runners.js +114 -0
- package/dist/cli/commands/audit-red-lines-runners.d.ts +11 -0
- package/dist/cli/commands/audit-red-lines-runners.js +43 -0
- package/dist/cli/commands/audit-refusal-data.d.ts +23 -0
- package/dist/cli/commands/audit-refusal-data.js +69 -0
- package/dist/cli/commands/audit-static-runners.d.ts +13 -0
- package/dist/cli/commands/audit-static-runners.js +139 -0
- package/dist/cli/commands/await-runners.d.ts +11 -0
- package/dist/cli/commands/await-runners.js +148 -0
- package/dist/cli/commands/baseline-audit-command.d.ts +3 -0
- package/dist/cli/commands/baseline-audit-command.js +64 -0
- package/dist/cli/commands/baseline-command-shared.d.ts +23 -0
- package/dist/cli/commands/baseline-command-shared.js +39 -0
- package/dist/cli/commands/baseline-commands.js +33 -313
- package/dist/cli/commands/baseline-freeze-commands.d.ts +4 -0
- package/dist/cli/commands/baseline-freeze-commands.js +81 -0
- package/dist/cli/commands/baseline-guard-command.d.ts +3 -0
- package/dist/cli/commands/baseline-guard-command.js +52 -0
- package/dist/cli/commands/baseline-read-commands.d.ts +5 -0
- package/dist/cli/commands/baseline-read-commands.js +72 -0
- package/dist/cli/commands/baseline-rollback-commands.d.ts +4 -0
- package/dist/cli/commands/baseline-rollback-commands.js +88 -0
- package/dist/cli/commands/classify-downgrade-command.d.ts +9 -0
- package/dist/cli/commands/classify-downgrade-command.js +21 -0
- package/dist/cli/commands/classify-run-command.d.ts +9 -0
- package/dist/cli/commands/classify-run-command.js +73 -0
- package/dist/cli/commands/classify-signals.d.ts +5 -0
- package/dist/cli/commands/classify-signals.js +104 -0
- package/dist/cli/commands/code-auto-compact-command.d.ts +3 -0
- package/dist/cli/commands/code-auto-compact-command.js +124 -0
- package/dist/cli/commands/code-auto-compact-envelope.d.ts +22 -0
- package/dist/cli/commands/code-auto-compact-envelope.js +39 -0
- package/dist/cli/commands/code-context-audit-command.d.ts +3 -0
- package/dist/cli/commands/code-context-audit-command.js +68 -0
- package/dist/cli/commands/code-context-now-command.d.ts +3 -0
- package/dist/cli/commands/code-context-now-command.js +124 -0
- package/dist/cli/commands/code-context-now-envelope.d.ts +66 -0
- package/dist/cli/commands/code-context-now-envelope.js +136 -0
- package/dist/cli/commands/code-context-now-mapping.d.ts +27 -0
- package/dist/cli/commands/code-context-now-mapping.js +43 -0
- package/dist/cli/commands/code-emit-handoff-command.d.ts +3 -0
- package/dist/cli/commands/code-emit-handoff-command.js +136 -0
- package/dist/cli/commands/code-gate-step-08-command.d.ts +3 -0
- package/dist/cli/commands/code-gate-step-08-command.js +155 -0
- package/dist/cli/commands/code-post-compact-detect-command.d.ts +3 -0
- package/dist/cli/commands/code-post-compact-detect-command.js +50 -0
- package/dist/cli/commands/code-runtime-commands.d.ts +9 -43
- package/dist/cli/commands/code-runtime-commands.js +20 -672
- package/dist/cli/commands/code-runtime-session.d.ts +1 -0
- package/dist/cli/commands/code-runtime-session.js +15 -0
- package/dist/cli/commands/codegraph-command-options.d.ts +22 -0
- package/dist/cli/commands/codegraph-command-options.js +22 -0
- package/dist/cli/commands/codegraph-commands.d.ts +2 -2
- package/dist/cli/commands/codegraph-commands.js +14 -397
- package/dist/cli/commands/codegraph-config-restore-command.d.ts +3 -0
- package/dist/cli/commands/codegraph-config-restore-command.js +200 -0
- package/dist/cli/commands/codegraph-proxy-commands.d.ts +10 -0
- package/dist/cli/commands/codegraph-proxy-commands.js +159 -0
- package/dist/cli/commands/codegraph-repair-commands.d.ts +3 -0
- package/dist/cli/commands/codegraph-repair-commands.js +94 -0
- package/dist/cli/commands/codegraph-status-command.d.ts +1 -1
- package/dist/cli/commands/codegraph-status-command.js +27 -214
- package/dist/cli/commands/codegraph-status-integrity.d.ts +44 -0
- package/dist/cli/commands/codegraph-status-integrity.js +121 -0
- package/dist/cli/commands/codegraph-status-json.d.ts +5 -0
- package/dist/cli/commands/codegraph-status-json.js +127 -0
- package/dist/cli/commands/compact-command.d.ts +6 -2
- package/dist/cli/commands/compact-command.js +12 -559
- package/dist/cli/commands/compact-dry-run-command.d.ts +3 -0
- package/dist/cli/commands/compact-dry-run-command.js +87 -0
- package/dist/cli/commands/compact-force-command.d.ts +3 -0
- package/dist/cli/commands/compact-force-command.js +98 -0
- package/dist/cli/commands/compact-harness-window-command.d.ts +3 -0
- package/dist/cli/commands/compact-harness-window-command.js +174 -0
- package/dist/cli/commands/compact-history-command.d.ts +3 -0
- package/dist/cli/commands/compact-history-command.js +89 -0
- package/dist/cli/commands/compact-read-commands.d.ts +3 -0
- package/dist/cli/commands/compact-read-commands.js +123 -0
- package/dist/cli/commands/compact-settle-command.d.ts +3 -0
- package/dist/cli/commands/compact-settle-command.js +130 -0
- package/dist/cli/commands/compact-shared.d.ts +9 -0
- package/dist/cli/commands/compact-shared.js +26 -0
- package/dist/cli/commands/container-command-shared.d.ts +60 -0
- package/dist/cli/commands/container-command-shared.js +52 -0
- package/dist/cli/commands/container-commands.d.ts +1 -1
- package/dist/cli/commands/container-commands.js +4 -216
- package/dist/cli/commands/container-release-command.d.ts +3 -0
- package/dist/cli/commands/container-release-command.js +105 -0
- package/dist/cli/commands/container-spawn-command.d.ts +3 -0
- package/dist/cli/commands/container-spawn-command.js +148 -0
- package/dist/cli/commands/context-check-command.d.ts +3 -0
- package/dist/cli/commands/context-check-command.js +81 -0
- package/dist/cli/commands/context-commands.d.ts +2 -7
- package/dist/cli/commands/context-commands.js +6 -276
- package/dist/cli/commands/context-layer-command.d.ts +3 -0
- package/dist/cli/commands/context-layer-command.js +34 -0
- package/dist/cli/commands/context-layer-fetchers.d.ts +15 -0
- package/dist/cli/commands/context-layer-fetchers.js +162 -0
- package/dist/cli/commands/context-status-command.d.ts +17 -0
- package/dist/cli/commands/context-status-command.js +41 -0
- package/dist/cli/commands/contract-write-command.d.ts +3 -0
- package/dist/cli/commands/contract-write-command.js +144 -0
- package/dist/cli/commands/core/doctor-bindings.d.ts +17 -0
- package/dist/cli/commands/core/doctor-bindings.js +30 -0
- package/dist/cli/commands/core/doctor-command.d.ts +4 -18
- package/dist/cli/commands/core/doctor-command.js +2 -323
- package/dist/cli/commands/core/doctor-logs.d.ts +8 -0
- package/dist/cli/commands/core/doctor-logs.js +32 -0
- package/dist/cli/commands/core/doctor-probes.d.ts +3 -0
- package/dist/cli/commands/core/doctor-probes.js +55 -0
- package/dist/cli/commands/core/doctor-run-command.d.ts +12 -0
- package/dist/cli/commands/core/doctor-run-command.js +172 -0
- package/dist/cli/commands/core/doctor-summary.d.ts +7 -0
- package/dist/cli/commands/core/doctor-summary.js +39 -0
- package/dist/cli/commands/core/memory-command-shared.d.ts +25 -0
- package/dist/cli/commands/core/memory-command-shared.js +20 -0
- package/dist/cli/commands/core/memory-command.d.ts +1 -1
- package/dist/cli/commands/core/memory-command.js +6 -227
- package/dist/cli/commands/core/memory-delegated-verbs.d.ts +4 -0
- package/dist/cli/commands/core/memory-delegated-verbs.js +178 -0
- package/dist/cli/commands/core/memory-extract-command.d.ts +3 -0
- package/dist/cli/commands/core/memory-extract-command.js +90 -0
- package/dist/cli/commands/core/memory-sync-command.d.ts +3 -0
- package/dist/cli/commands/core/memory-sync-command.js +38 -0
- package/dist/cli/commands/core/session-command.d.ts +1 -1
- package/dist/cli/commands/core/session-command.js +12 -206
- package/dist/cli/commands/core/session-info-command.d.ts +3 -0
- package/dist/cli/commands/core/session-info-command.js +142 -0
- package/dist/cli/commands/core/session-verb-commands.d.ts +5 -0
- package/dist/cli/commands/core/session-verb-commands.js +58 -0
- package/dist/cli/commands/core/skill-command.d.ts +1 -44
- package/dist/cli/commands/core/skill-command.js +13 -541
- package/dist/cli/commands/core/skill-context-verdict.d.ts +38 -0
- package/dist/cli/commands/core/skill-context-verdict.js +63 -0
- package/dist/cli/commands/core/skill-generated-config-notice.d.ts +41 -0
- package/dist/cli/commands/core/skill-generated-config-notice.js +75 -0
- package/dist/cli/commands/core/skill-heartbeat-commands.d.ts +3 -0
- package/dist/cli/commands/core/skill-heartbeat-commands.js +50 -0
- package/dist/cli/commands/core/skill-presence-commands.d.ts +3 -0
- package/dist/cli/commands/core/skill-presence-commands.js +123 -0
- package/dist/cli/commands/core/skill-presence-housekeeping-commands.d.ts +3 -0
- package/dist/cli/commands/core/skill-presence-housekeeping-commands.js +165 -0
- package/dist/cli/commands/core/skill-registry-commands.d.ts +3 -0
- package/dist/cli/commands/core/skill-registry-commands.js +117 -0
- package/dist/cli/commands/core/skill-runbook-command.d.ts +3 -0
- package/dist/cli/commands/core/skill-runbook-command.js +29 -0
- package/dist/cli/commands/core/standards-command.d.ts +1 -24
- package/dist/cli/commands/core/standards-command.js +33 -201
- package/dist/cli/commands/core/standards-init-command.d.ts +3 -0
- package/dist/cli/commands/core/standards-init-command.js +87 -0
- package/dist/cli/commands/core/standards-lint.d.ts +24 -0
- package/dist/cli/commands/core/standards-lint.js +57 -0
- package/dist/cli/commands/core/standards-migrate-command.d.ts +3 -0
- package/dist/cli/commands/core/standards-migrate-command.js +57 -0
- package/dist/cli/commands/cron-scheduler-commands.d.ts +5 -1
- package/dist/cli/commands/cron-scheduler-commands.js +36 -206
- package/dist/cli/commands/cron-scheduler-run-once-command.d.ts +7 -0
- package/dist/cli/commands/cron-scheduler-run-once-command.js +35 -0
- package/dist/cli/commands/cron-scheduler-shared.d.ts +6 -0
- package/dist/cli/commands/cron-scheduler-shared.js +48 -0
- package/dist/cli/commands/cron-scheduler-start-command.d.ts +7 -0
- package/dist/cli/commands/cron-scheduler-start-command.js +65 -0
- package/dist/cli/commands/cron-scheduler-status-command.d.ts +7 -0
- package/dist/cli/commands/cron-scheduler-status-command.js +46 -0
- package/dist/cli/commands/cron-scheduler-stop-command.d.ts +7 -0
- package/dist/cli/commands/cron-scheduler-stop-command.js +61 -0
- package/dist/cli/commands/dispatch-command-spec.d.ts +2 -0
- package/dist/cli/commands/dispatch-command-spec.js +62 -0
- package/dist/cli/commands/dispatch-commands.js +159 -775
- package/dist/cli/commands/dispatch-dag-envelope.d.ts +41 -0
- package/dist/cli/commands/dispatch-dag-envelope.js +49 -0
- package/dist/cli/commands/dispatch-dag-failure.d.ts +18 -0
- package/dist/cli/commands/dispatch-dag-failure.js +16 -0
- package/dist/cli/commands/dispatch-dag-preflight.d.ts +51 -0
- package/dist/cli/commands/dispatch-dag-preflight.js +105 -0
- package/dist/cli/commands/dispatch-dag-runners.d.ts +48 -0
- package/dist/cli/commands/dispatch-dag-runners.js +73 -0
- package/dist/cli/commands/dispatch-detached-branch.d.ts +3 -0
- package/dist/cli/commands/dispatch-detached-branch.js +58 -0
- package/dist/cli/commands/dispatch-envelope.d.ts +36 -0
- package/dist/cli/commands/dispatch-envelope.js +104 -0
- package/dist/cli/commands/dispatch-from-dag.d.ts +27 -0
- package/dist/cli/commands/dispatch-from-dag.js +87 -257
- package/dist/cli/commands/dispatch-isolation-lease.d.ts +17 -0
- package/dist/cli/commands/dispatch-isolation-lease.js +149 -0
- package/dist/cli/commands/dispatch-preflight.d.ts +7 -0
- package/dist/cli/commands/dispatch-preflight.js +105 -0
- package/dist/cli/commands/dispatch-prompt-blocks.d.ts +10 -0
- package/dist/cli/commands/dispatch-prompt-blocks.js +56 -0
- package/dist/cli/commands/dispatch-prompt-composition.d.ts +30 -0
- package/dist/cli/commands/dispatch-prompt-composition.js +171 -0
- package/dist/cli/commands/dispatch-record-write.d.ts +24 -0
- package/dist/cli/commands/dispatch-record-write.js +96 -0
- package/dist/cli/commands/dispatch-tool-call.d.ts +15 -0
- package/dist/cli/commands/dispatch-tool-call.js +128 -0
- package/dist/cli/commands/evolution-command-shared.d.ts +78 -0
- package/dist/cli/commands/evolution-command-shared.js +107 -0
- package/dist/cli/commands/evolution-commands.d.ts +11 -1
- package/dist/cli/commands/evolution-commands.js +19 -350
- package/dist/cli/commands/evolution-evaluate-command.d.ts +24 -0
- package/dist/cli/commands/evolution-evaluate-command.js +138 -0
- package/dist/cli/commands/evolution-propose-command.d.ts +23 -0
- package/dist/cli/commands/evolution-propose-command.js +145 -0
- package/dist/cli/commands/evolution-status-command.d.ts +17 -0
- package/dist/cli/commands/evolution-status-command.js +41 -0
- package/dist/cli/commands/evolution-verdict-commands.d.ts +30 -0
- package/dist/cli/commands/evolution-verdict-commands.js +100 -0
- package/dist/cli/commands/final-review-command-envelopes.d.ts +44 -0
- package/dist/cli/commands/final-review-command-envelopes.js +100 -0
- package/dist/cli/commands/final-review-command-shared.d.ts +52 -0
- package/dist/cli/commands/final-review-command-shared.js +35 -0
- package/dist/cli/commands/final-review-commands.d.ts +7 -27
- package/dist/cli/commands/final-review-commands.js +13 -240
- package/dist/cli/commands/final-review-prepare-command.d.ts +3 -0
- package/dist/cli/commands/final-review-prepare-command.js +200 -0
- package/dist/cli/commands/finalize-accumulator.d.ts +44 -0
- package/dist/cli/commands/finalize-accumulator.js +55 -0
- package/dist/cli/commands/finalize-branches.d.ts +34 -0
- package/dist/cli/commands/finalize-branches.js +119 -0
- package/dist/cli/commands/finalize-runners.d.ts +3 -0
- package/dist/cli/commands/finalize-runners.js +92 -0
- package/dist/cli/commands/finalize-selection.d.ts +65 -0
- package/dist/cli/commands/finalize-selection.js +35 -0
- package/dist/cli/commands/gate-commands.js +26 -8
- package/dist/cli/commands/governance-classify-contract-commands.d.ts +23 -9
- package/dist/cli/commands/governance-classify-contract-commands.js +26 -269
- package/dist/cli/commands/hooks-command-shared.d.ts +42 -0
- package/dist/cli/commands/hooks-command-shared.js +32 -0
- package/dist/cli/commands/hooks-commands.d.ts +20 -0
- package/dist/cli/commands/hooks-commands.js +75 -309
- package/dist/cli/commands/hooks-install-envelopes.d.ts +6 -0
- package/dist/cli/commands/hooks-install-envelopes.js +144 -0
- package/dist/cli/commands/hooks-status-command.d.ts +3 -0
- package/dist/cli/commands/hooks-status-command.js +93 -0
- package/dist/cli/commands/hooks-uninstall-command.d.ts +3 -0
- package/dist/cli/commands/hooks-uninstall-command.js +43 -0
- package/dist/cli/commands/job-checkpoint-commands.d.ts +3 -0
- package/dist/cli/commands/job-checkpoint-commands.js +157 -0
- package/dist/cli/commands/job-command-shared.d.ts +109 -0
- package/dist/cli/commands/job-command-shared.js +72 -0
- package/dist/cli/commands/job-commands.d.ts +4 -64
- package/dist/cli/commands/job-commands.js +42 -552
- package/dist/cli/commands/job-cost-check-command.d.ts +3 -0
- package/dist/cli/commands/job-cost-check-command.js +41 -0
- package/dist/cli/commands/job-init-status-commands.d.ts +3 -0
- package/dist/cli/commands/job-init-status-commands.js +149 -0
- package/dist/cli/commands/job-run-commands.d.ts +3 -0
- package/dist/cli/commands/job-run-commands.js +97 -0
- package/dist/cli/commands/job-state-root.d.ts +35 -0
- package/dist/cli/commands/job-state-root.js +76 -0
- package/dist/cli/commands/loop-command-shared.d.ts +31 -0
- package/dist/cli/commands/loop-command-shared.js +15 -0
- package/dist/cli/commands/loop-commands.d.ts +12 -17
- package/dist/cli/commands/loop-commands.js +56 -238
- package/dist/cli/commands/loop-eval-capture-index.d.ts +4 -0
- package/dist/cli/commands/loop-eval-capture-index.js +44 -0
- package/dist/cli/commands/loop-eval-commands.d.ts +8 -5
- package/dist/cli/commands/loop-eval-commands.js +12 -626
- package/dist/cli/commands/loop-eval-eval-command.d.ts +3 -0
- package/dist/cli/commands/loop-eval-eval-command.js +168 -0
- package/dist/cli/commands/loop-eval-monotonic-command.d.ts +3 -0
- package/dist/cli/commands/loop-eval-monotonic-command.js +90 -0
- package/dist/cli/commands/loop-eval-parents.d.ts +7 -0
- package/dist/cli/commands/loop-eval-parents.js +20 -0
- package/dist/cli/commands/loop-eval-run-code.d.ts +7 -0
- package/dist/cli/commands/loop-eval-run-code.js +40 -0
- package/dist/cli/commands/loop-eval-run-command.d.ts +3 -0
- package/dist/cli/commands/loop-eval-run-command.js +113 -0
- package/dist/cli/commands/loop-eval-spec-commands.d.ts +3 -0
- package/dist/cli/commands/loop-eval-spec-commands.js +165 -0
- package/dist/cli/commands/loop-eval-spec-lint-command.d.ts +3 -0
- package/dist/cli/commands/loop-eval-spec-lint-command.js +42 -0
- package/dist/cli/commands/loop-eval-workflow-commands.d.ts +3 -0
- package/dist/cli/commands/loop-eval-workflow-commands.js +141 -0
- package/dist/cli/commands/loop-export-command.d.ts +3 -0
- package/dist/cli/commands/loop-export-command.js +73 -0
- package/dist/cli/commands/loop-goal-compose-command.d.ts +3 -0
- package/dist/cli/commands/loop-goal-compose-command.js +36 -0
- package/dist/cli/commands/loop-import-command.d.ts +3 -0
- package/dist/cli/commands/loop-import-command.js +86 -0
- package/dist/cli/commands/loop-placeholder-commands.d.ts +3 -0
- package/dist/cli/commands/loop-placeholder-commands.js +52 -0
- package/dist/cli/commands/mcp-commands.d.ts +10 -0
- package/dist/cli/commands/mcp-commands.js +157 -0
- package/dist/cli/commands/memory-command-shared.d.ts +59 -0
- package/dist/cli/commands/memory-command-shared.js +39 -0
- package/dist/cli/commands/memory-commands.d.ts +6 -79
- package/dist/cli/commands/memory-commands.js +19 -309
- package/dist/cli/commands/memory-ingest-command.d.ts +3 -0
- package/dist/cli/commands/memory-ingest-command.js +50 -0
- package/dist/cli/commands/memory-list-command.d.ts +16 -0
- package/dist/cli/commands/memory-list-command.js +129 -0
- package/dist/cli/commands/memory-reindex-command.d.ts +9 -0
- package/dist/cli/commands/memory-reindex-command.js +78 -0
- package/dist/cli/commands/memory-rotate-command.d.ts +3 -0
- package/dist/cli/commands/memory-rotate-command.js +55 -0
- package/dist/cli/commands/memory-search-command.d.ts +7 -0
- package/dist/cli/commands/memory-search-command.js +46 -0
- package/dist/cli/commands/openspec-archive-command.d.ts +3 -0
- package/dist/cli/commands/openspec-archive-command.js +55 -0
- package/dist/cli/commands/openspec-command-shared.d.ts +62 -0
- package/dist/cli/commands/openspec-command-shared.js +135 -0
- package/dist/cli/commands/openspec-commands.d.ts +1 -1
- package/dist/cli/commands/openspec-commands.js +33 -306
- package/dist/cli/commands/openspec-from-doctor-command.d.ts +3 -0
- package/dist/cli/commands/openspec-from-doctor-command.js +66 -0
- package/dist/cli/commands/openspec-init-command.d.ts +3 -0
- package/dist/cli/commands/openspec-init-command.js +49 -0
- package/dist/cli/commands/openspec-list-command.d.ts +3 -0
- package/dist/cli/commands/openspec-list-command.js +27 -0
- package/dist/cli/commands/openspec-render-command.d.ts +3 -0
- package/dist/cli/commands/openspec-render-command.js +33 -0
- package/dist/cli/commands/openspec-show-command.d.ts +3 -0
- package/dist/cli/commands/openspec-show-command.js +33 -0
- package/dist/cli/commands/openspec-to-rd-command.d.ts +3 -0
- package/dist/cli/commands/openspec-to-rd-command.js +33 -0
- package/dist/cli/commands/openspec-validate-command.d.ts +3 -0
- package/dist/cli/commands/openspec-validate-command.js +45 -0
- package/dist/cli/commands/playwright-browser-command.d.ts +8 -0
- package/dist/cli/commands/playwright-browser-command.js +61 -0
- package/dist/cli/commands/playwright-commands.d.ts +10 -62
- package/dist/cli/commands/playwright-commands.js +77 -400
- package/dist/cli/commands/playwright-envelope.d.ts +8 -0
- package/dist/cli/commands/playwright-envelope.js +29 -0
- package/dist/cli/commands/playwright-ls-stop-commands.d.ts +4 -0
- package/dist/cli/commands/playwright-ls-stop-commands.js +74 -0
- package/dist/cli/commands/playwright-session-store.d.ts +65 -0
- package/dist/cli/commands/playwright-session-store.js +189 -0
- package/dist/cli/commands/project-commands.d.ts +19 -0
- package/dist/cli/commands/project-commands.js +98 -259
- package/dist/cli/commands/project-context-command.d.ts +3 -0
- package/dist/cli/commands/project-context-command.js +44 -0
- package/dist/cli/commands/project-dashboard-command.d.ts +3 -0
- package/dist/cli/commands/project-dashboard-command.js +74 -0
- package/dist/cli/commands/project-knowledge-command.d.ts +3 -0
- package/dist/cli/commands/project-knowledge-command.js +48 -0
- package/dist/cli/commands/project-memories-show-command.d.ts +3 -0
- package/dist/cli/commands/project-memories-show-command.js +87 -0
- package/dist/cli/commands/project-memory-index-command.d.ts +3 -0
- package/dist/cli/commands/project-memory-index-command.js +31 -0
- package/dist/cli/commands/qa-archive-screenshots-command.d.ts +3 -0
- package/dist/cli/commands/qa-archive-screenshots-command.js +53 -0
- package/dist/cli/commands/qa-commands.d.ts +14 -87
- package/dist/cli/commands/qa-commands.js +17 -315
- package/dist/cli/commands/qa-context-prestep.d.ts +1 -0
- package/dist/cli/commands/qa-context-prestep.js +34 -0
- package/dist/cli/commands/qa-run-command.d.ts +3 -0
- package/dist/cli/commands/qa-run-command.js +105 -0
- package/dist/cli/commands/qa-run-options.d.ts +23 -0
- package/dist/cli/commands/qa-run-options.js +31 -0
- package/dist/cli/commands/qa-run-slice.d.ts +41 -0
- package/dist/cli/commands/qa-run-slice.js +145 -0
- package/dist/cli/commands/release-canary-command.d.ts +28 -0
- package/dist/cli/commands/release-canary-command.js +129 -0
- package/dist/cli/commands/release-command-shared.d.ts +13 -0
- package/dist/cli/commands/release-command-shared.js +18 -0
- package/dist/cli/commands/release-commands.d.ts +10 -18
- package/dist/cli/commands/release-commands.js +25 -298
- package/dist/cli/commands/release-done-command.d.ts +3 -0
- package/dist/cli/commands/release-done-command.js +64 -0
- package/dist/cli/commands/release-hotfix-command.d.ts +3 -0
- package/dist/cli/commands/release-hotfix-command.js +50 -0
- package/dist/cli/commands/release-plan-command.d.ts +3 -0
- package/dist/cli/commands/release-plan-command.js +33 -0
- package/dist/cli/commands/release-precheck-command.d.ts +3 -0
- package/dist/cli/commands/release-precheck-command.js +28 -0
- package/dist/cli/commands/release-promote-command.d.ts +3 -0
- package/dist/cli/commands/release-promote-command.js +34 -0
- package/dist/cli/commands/release-rollback-command.d.ts +3 -0
- package/dist/cli/commands/release-rollback-command.js +33 -0
- package/dist/cli/commands/release-watch-command.d.ts +3 -0
- package/dist/cli/commands/release-watch-command.js +44 -0
- package/dist/cli/commands/request-command-options.d.ts +49 -0
- package/dist/cli/commands/request-command-options.js +1 -0
- package/dist/cli/commands/request-commands.d.ts +3 -9
- package/dist/cli/commands/request-commands.js +17 -522
- package/dist/cli/commands/request-init-command.d.ts +3 -0
- package/dist/cli/commands/request-init-command.js +100 -0
- package/dist/cli/commands/request-lint-command.d.ts +3 -0
- package/dist/cli/commands/request-lint-command.js +50 -0
- package/dist/cli/commands/request-list-command.d.ts +10 -0
- package/dist/cli/commands/request-list-command.js +53 -0
- package/dist/cli/commands/request-repair-status-command.d.ts +3 -0
- package/dist/cli/commands/request-repair-status-command.js +61 -0
- package/dist/cli/commands/request-show-command.d.ts +3 -0
- package/dist/cli/commands/request-show-command.js +56 -0
- package/dist/cli/commands/request-transition-command.d.ts +3 -0
- package/dist/cli/commands/request-transition-command.js +122 -0
- package/dist/cli/commands/request-transition-failures.d.ts +8 -0
- package/dist/cli/commands/request-transition-failures.js +90 -0
- package/dist/cli/commands/request-transition-hooks.d.ts +50 -0
- package/dist/cli/commands/request-transition-hooks.js +115 -0
- package/dist/cli/commands/request-transition-preflight.d.ts +10 -0
- package/dist/cli/commands/request-transition-preflight.js +107 -0
- package/dist/cli/commands/scan-command-shared.d.ts +96 -0
- package/dist/cli/commands/scan-command-shared.js +83 -0
- package/dist/cli/commands/scan-commands.d.ts +3 -2
- package/dist/cli/commands/scan-commands.js +23 -463
- package/dist/cli/commands/scan-inventory-commands.d.ts +3 -0
- package/dist/cli/commands/scan-inventory-commands.js +96 -0
- package/dist/cli/commands/scan-project-commands.d.ts +3 -0
- package/dist/cli/commands/scan-project-commands.js +65 -0
- package/dist/cli/commands/scan-scope-commands.d.ts +3 -0
- package/dist/cli/commands/scan-scope-commands.js +149 -0
- package/dist/cli/commands/scan-scope-helpers.d.ts +8 -0
- package/dist/cli/commands/scan-scope-helpers.js +54 -0
- package/dist/cli/commands/scan-structural-commands.d.ts +3 -0
- package/dist/cli/commands/scan-structural-commands.js +113 -0
- package/dist/cli/commands/sediment-argv-flags.d.ts +54 -0
- package/dist/cli/commands/sediment-argv-flags.js +116 -0
- package/dist/cli/commands/sediment-command-shared.d.ts +15 -0
- package/dist/cli/commands/sediment-command-shared.js +5 -0
- package/dist/cli/commands/sediment-commands.d.ts +35 -59
- package/dist/cli/commands/sediment-commands.js +36 -590
- package/dist/cli/commands/sediment-pool-commands.d.ts +9 -0
- package/dist/cli/commands/sediment-pool-commands.js +185 -0
- package/dist/cli/commands/sediment-query-commands.d.ts +4 -0
- package/dist/cli/commands/sediment-query-commands.js +94 -0
- package/dist/cli/commands/sediment-release-commands.d.ts +8 -0
- package/dist/cli/commands/sediment-release-commands.js +232 -0
- package/dist/cli/commands/share-commands.d.ts +12 -68
- package/dist/cli/commands/share-commands.js +47 -556
- package/dist/cli/commands/share-error-hints.d.ts +14 -0
- package/dist/cli/commands/share-error-hints.js +38 -0
- package/dist/cli/commands/share-identity.d.ts +13 -0
- package/dist/cli/commands/share-identity.js +22 -0
- package/dist/cli/commands/share-record-paths.d.ts +37 -0
- package/dist/cli/commands/share-record-paths.js +68 -0
- package/dist/cli/commands/share-runners.d.ts +3 -0
- package/dist/cli/commands/share-runners.js +158 -0
- package/dist/cli/commands/shared-read-runners.d.ts +3 -0
- package/dist/cli/commands/shared-read-runners.js +51 -0
- package/dist/cli/commands/slice-check-command.d.ts +3 -0
- package/dist/cli/commands/slice-check-command.js +54 -0
- package/dist/cli/commands/slice-commands.d.ts +2 -22
- package/dist/cli/commands/slice-commands.js +18 -517
- package/dist/cli/commands/slice-decompose-artifacts.d.ts +18 -0
- package/dist/cli/commands/slice-decompose-artifacts.js +79 -0
- package/dist/cli/commands/slice-decompose-command.d.ts +3 -0
- package/dist/cli/commands/slice-decompose-command.js +123 -0
- package/dist/cli/commands/slice-list-commands.d.ts +3 -0
- package/dist/cli/commands/slice-list-commands.js +182 -0
- package/dist/cli/commands/slice-pick-command.d.ts +3 -0
- package/dist/cli/commands/slice-pick-command.js +60 -0
- package/dist/cli/commands/slice-plan-command.d.ts +24 -0
- package/dist/cli/commands/slice-plan-command.js +111 -0
- package/dist/cli/commands/sop-advance-command.d.ts +3 -0
- package/dist/cli/commands/sop-advance-command.js +160 -0
- package/dist/cli/commands/sop-check-command.d.ts +3 -0
- package/dist/cli/commands/sop-check-command.js +44 -0
- package/dist/cli/commands/sop-command-shared.d.ts +23 -0
- package/dist/cli/commands/sop-command-shared.js +18 -0
- package/dist/cli/commands/sop-commands.d.ts +15 -1
- package/dist/cli/commands/sop-commands.js +26 -240
- package/dist/cli/commands/sop-init-command.d.ts +3 -0
- package/dist/cli/commands/sop-init-command.js +51 -0
- package/dist/cli/commands/sop-lint-command.d.ts +3 -0
- package/dist/cli/commands/sop-lint-command.js +64 -0
- package/dist/cli/commands/sop-register-command.d.ts +3 -0
- package/dist/cli/commands/sop-register-command.js +48 -0
- package/dist/cli/commands/sop-registry-command.d.ts +3 -0
- package/dist/cli/commands/sop-registry-command.js +30 -0
- package/dist/cli/commands/statusline-command-shared.d.ts +73 -0
- package/dist/cli/commands/statusline-command-shared.js +90 -0
- package/dist/cli/commands/statusline-commands.d.ts +1 -19
- package/dist/cli/commands/statusline-commands.js +48 -287
- package/dist/cli/commands/statusline-compact-command.d.ts +4 -0
- package/dist/cli/commands/statusline-compact-command.js +54 -0
- package/dist/cli/commands/statusline-install-command.d.ts +3 -0
- package/dist/cli/commands/statusline-install-command.js +48 -0
- package/dist/cli/commands/statusline-render-command.d.ts +9 -0
- package/dist/cli/commands/statusline-render-command.js +55 -0
- package/dist/cli/commands/statusline-status-command.d.ts +3 -0
- package/dist/cli/commands/statusline-status-command.js +23 -0
- package/dist/cli/commands/statusline-uninstall-command.d.ts +3 -0
- package/dist/cli/commands/statusline-uninstall-command.js +23 -0
- package/dist/cli/commands/test-command-run-helpers.d.ts +27 -0
- package/dist/cli/commands/test-command-run-helpers.js +73 -0
- package/dist/cli/commands/test-command-runner-resolution.d.ts +57 -0
- package/dist/cli/commands/test-command-runner-resolution.js +183 -0
- package/dist/cli/commands/test-commands.d.ts +8 -56
- package/dist/cli/commands/test-commands.js +26 -249
- package/dist/cli/commands/vm-command-shared.d.ts +23 -0
- package/dist/cli/commands/vm-command-shared.js +23 -0
- package/dist/cli/commands/vm-commands.d.ts +1 -28
- package/dist/cli/commands/vm-commands.js +36 -270
- package/dist/cli/commands/vm-hypervisor-runtime.d.ts +15 -0
- package/dist/cli/commands/vm-hypervisor-runtime.js +64 -0
- package/dist/cli/commands/vm-release-command.d.ts +5 -0
- package/dist/cli/commands/vm-release-command.js +101 -0
- package/dist/cli/commands/vm-spawn-command.d.ts +5 -0
- package/dist/cli/commands/vm-spawn-command.js +177 -0
- package/dist/cli/commands/web-command-shared.d.ts +12 -0
- package/dist/cli/commands/web-command-shared.js +30 -0
- package/dist/cli/commands/web-commands.d.ts +7 -14
- package/dist/cli/commands/web-commands.js +6 -314
- package/dist/cli/commands/web-install-command.d.ts +10 -0
- package/dist/cli/commands/web-install-command.js +116 -0
- package/dist/cli/commands/web-lifecycle-commands.d.ts +9 -30
- package/dist/cli/commands/web-lifecycle-commands.js +14 -322
- package/dist/cli/commands/web-login-command.d.ts +14 -0
- package/dist/cli/commands/web-login-command.js +189 -0
- package/dist/cli/commands/web-op-payload.d.ts +22 -0
- package/dist/cli/commands/web-op-payload.js +89 -0
- package/dist/cli/commands/web-op-refusals.d.ts +37 -0
- package/dist/cli/commands/web-op-refusals.js +73 -0
- package/dist/cli/commands/web-op-runner.d.ts +14 -0
- package/dist/cli/commands/web-op-runner.js +166 -0
- package/dist/cli/commands/web-status-command.d.ts +4 -0
- package/dist/cli/commands/web-status-command.js +32 -0
- package/dist/cli/commands/web-stop-command.d.ts +10 -0
- package/dist/cli/commands/web-stop-command.js +59 -0
- package/dist/cli/commands/web-verb-specs.d.ts +18 -0
- package/dist/cli/commands/web-verb-specs.js +66 -0
- package/dist/cli/commands/workflow-command-shared.d.ts +102 -0
- package/dist/cli/commands/workflow-command-shared.js +74 -0
- package/dist/cli/commands/workflow-commands.d.ts +10 -1
- package/dist/cli/commands/workflow-commands.js +6 -594
- package/dist/cli/commands/workflow-gate-commands.d.ts +3 -0
- package/dist/cli/commands/workflow-gate-commands.js +116 -0
- package/dist/cli/commands/workflow-graph-commands.d.ts +3 -0
- package/dist/cli/commands/workflow-graph-commands.js +73 -0
- package/dist/cli/commands/workflow-init-command.d.ts +3 -0
- package/dist/cli/commands/workflow-init-command.js +68 -0
- package/dist/cli/commands/workflow-lifecycle-commands.d.ts +9 -59
- package/dist/cli/commands/workflow-lifecycle-commands.js +14 -348
- package/dist/cli/commands/workflow-node-commands.d.ts +3 -0
- package/dist/cli/commands/workflow-node-commands.js +154 -0
- package/dist/cli/commands/workflow-plan-helpers.d.ts +48 -0
- package/dist/cli/commands/workflow-plan-helpers.js +103 -0
- package/dist/cli/commands/workflow-planning-commands.d.ts +3 -0
- package/dist/cli/commands/workflow-planning-commands.js +56 -0
- package/dist/cli/commands/workflow-swarm-actions.d.ts +7 -0
- package/dist/cli/commands/workflow-swarm-actions.js +109 -0
- package/dist/cli/commands/workflow-swarm-commands.d.ts +3 -0
- package/dist/cli/commands/workflow-swarm-commands.js +138 -0
- package/dist/cli/commands/workflow-tech-actions.d.ts +10 -0
- package/dist/cli/commands/workflow-tech-actions.js +150 -0
- package/dist/cli/commands/workflow-terminalize-command.d.ts +3 -0
- package/dist/cli/commands/workflow-terminalize-command.js +56 -0
- package/dist/cli/commands/workspace/init-actions.d.ts +10 -0
- package/dist/cli/commands/workspace/init-actions.js +199 -0
- package/dist/cli/commands/workspace/init-codegraph-stake.d.ts +10 -0
- package/dist/cli/commands/workspace/init-codegraph-stake.js +54 -0
- package/dist/cli/commands/workspace/init-command.d.ts +8 -124
- package/dist/cli/commands/workspace/init-command.js +59 -623
- package/dist/cli/commands/workspace/init-context.d.ts +58 -0
- package/dist/cli/commands/workspace/init-context.js +121 -0
- package/dist/cli/commands/workspace/init-envelope.d.ts +3 -0
- package/dist/cli/commands/workspace/init-envelope.js +34 -0
- package/dist/cli/commands/workspace/init-failures.d.ts +3 -0
- package/dist/cli/commands/workspace/init-failures.js +84 -0
- package/dist/cli/commands/workspace/init-hooks-decision.d.ts +24 -0
- package/dist/cli/commands/workspace/init-hooks-decision.js +189 -0
- package/dist/cli/commands/workspace/init-options.d.ts +102 -0
- package/dist/cli/commands/workspace/init-options.js +1 -0
- package/dist/cli/commands/worktree-lease-commands.d.ts +10 -6
- package/dist/cli/commands/worktree-lease-commands.js +42 -512
- package/dist/cli/commands/worktree-lease-gc-command.d.ts +12 -0
- package/dist/cli/commands/worktree-lease-gc-command.js +117 -0
- package/dist/cli/commands/worktree-lease-git.d.ts +22 -0
- package/dist/cli/commands/worktree-lease-git.js +48 -0
- package/dist/cli/commands/worktree-lease-list-command.d.ts +12 -0
- package/dist/cli/commands/worktree-lease-list-command.js +100 -0
- package/dist/cli/commands/worktree-lease-load.d.ts +37 -0
- package/dist/cli/commands/worktree-lease-load.js +28 -0
- package/dist/cli/commands/worktree-lease-release-command.d.ts +13 -0
- package/dist/cli/commands/worktree-lease-release-command.js +105 -0
- package/dist/cli/commands/worktree-lease-renew-command.d.ts +11 -0
- package/dist/cli/commands/worktree-lease-renew-command.js +99 -0
- package/dist/cli/commands/worktree-lease-session.d.ts +22 -0
- package/dist/cli/commands/worktree-lease-session.js +29 -0
- package/dist/cli/commands/worktree-lease-spawn-command.d.ts +11 -0
- package/dist/cli/commands/worktree-lease-spawn-command.js +119 -0
- package/dist/cli/commands/worktree-lease-status-command.d.ts +11 -0
- package/dist/cli/commands/worktree-lease-status-command.js +86 -0
- package/dist/cli/commands/worktree-lease-store.d.ts +19 -0
- package/dist/cli/commands/worktree-lease-store.js +24 -0
- package/dist/cli/program.js +5 -0
- package/dist/services/code/auto-compact-artifacts.d.ts +54 -0
- package/dist/services/code/auto-compact-artifacts.js +135 -0
- package/dist/services/code/auto-compact-attempt.d.ts +46 -0
- package/dist/services/code/auto-compact-attempt.js +88 -0
- package/dist/services/code/auto-compact-decision.d.ts +74 -0
- package/dist/services/code/auto-compact-decision.js +149 -0
- package/dist/services/code/auto-compact-dispatch-gate.d.ts +36 -0
- package/dist/services/code/auto-compact-dispatch-gate.js +86 -0
- package/dist/services/code/auto-compact-envelopes.d.ts +33 -0
- package/dist/services/code/auto-compact-envelopes.js +134 -0
- package/dist/services/code/auto-compact-history.d.ts +46 -0
- package/dist/services/code/auto-compact-history.js +17 -0
- package/dist/services/code/auto-compact-orchestrator.d.ts +11 -240
- package/dist/services/code/auto-compact-orchestrator.js +165 -686
- package/dist/services/code/auto-compact-run-types.d.ts +123 -0
- package/dist/services/code/auto-compact-run-types.js +1 -0
- package/dist/services/code/emit-handoff.d.ts +35 -1
- package/dist/services/code/emit-handoff.js +128 -7
- package/dist/services/code/step-08-gate.d.ts +28 -19
- package/dist/services/code/step-08-gate.js +92 -35
- package/dist/services/config/config-coercion.d.ts +7 -0
- package/dist/services/config/config-coercion.js +156 -0
- package/dist/services/config/config-file-io.d.ts +11 -0
- package/dist/services/config/config-file-io.js +61 -0
- package/dist/services/config/config-get.d.ts +2 -0
- package/dist/services/config/config-get.js +36 -0
- package/dist/services/config/config-global-loader.d.ts +15 -0
- package/dist/services/config/config-global-loader.js +111 -0
- package/dist/services/config/config-nested-path.d.ts +3 -0
- package/dist/services/config/config-nested-path.js +53 -0
- package/dist/services/config/config-primitives.d.ts +16 -0
- package/dist/services/config/config-primitives.js +24 -0
- package/dist/services/config/config-service.d.ts +9 -33
- package/dist/services/config/config-service.js +16 -665
- package/dist/services/config/config-validation.d.ts +19 -0
- package/dist/services/config/config-validation.js +152 -0
- package/dist/services/config/config-workspace.d.ts +10 -0
- package/dist/services/config/config-workspace.js +158 -0
- package/dist/services/distribution/mcp-install-runner.d.ts +21 -0
- package/dist/services/distribution/mcp-install-runner.js +59 -0
- package/dist/services/distribution/mcp-install.d.ts +95 -0
- package/dist/services/distribution/mcp-install.js +179 -0
- package/dist/services/distribution/plugin-manifest.d.ts +97 -0
- package/dist/services/distribution/plugin-manifest.js +126 -0
- package/dist/services/hooks/mcp-surface-gate.d.ts +19 -0
- package/dist/services/hooks/mcp-surface-gate.js +87 -0
- package/dist/services/ide/adapters/claude-code-adapter.d.ts +4 -35
- package/dist/services/ide/adapters/claude-code-adapter.js +48 -171
- package/dist/services/ide/adapters/claude-code-local-state.d.ts +28 -0
- package/dist/services/ide/adapters/claude-code-local-state.js +112 -0
- package/dist/services/ide/adapters/claude-code-model-window.d.ts +37 -0
- package/dist/services/ide/adapters/claude-code-model-window.js +113 -0
- package/dist/services/ide/ide-mcp-install-types.d.ts +78 -0
- package/dist/services/ide/ide-mcp-install-types.js +104 -0
- package/dist/services/ide/ide-types.d.ts +45 -1
- package/dist/services/ide/mcp-tool-matcher.d.ts +34 -0
- package/dist/services/ide/mcp-tool-matcher.js +84 -0
- package/dist/services/lint/npx-resolver.js +7 -0
- package/dist/services/mcp/cli-executor.d.ts +36 -0
- package/dist/services/mcp/cli-executor.js +97 -0
- package/dist/services/mcp/json-rpc.d.ts +81 -0
- package/dist/services/mcp/json-rpc.js +116 -0
- package/dist/services/mcp/memory-tool.d.ts +3 -0
- package/dist/services/mcp/memory-tool.js +62 -0
- package/dist/services/mcp/server-main.d.ts +1 -0
- package/dist/services/mcp/server-main.js +66 -0
- package/dist/services/mcp/server.d.ts +22 -0
- package/dist/services/mcp/server.js +152 -0
- package/dist/services/mcp/surface.d.ts +62 -0
- package/dist/services/mcp/surface.js +198 -0
- package/dist/services/mcp/tool-core.d.ts +42 -0
- package/dist/services/mcp/tool-core.js +137 -0
- package/dist/services/mcp/tools.d.ts +13 -0
- package/dist/services/mcp/tools.js +58 -0
- package/dist/services/readonly-surface/argv-guard.d.ts +32 -0
- package/dist/services/readonly-surface/argv-guard.js +164 -0
- package/dist/services/readonly-surface/readonly-whitelist.d.ts +147 -0
- package/dist/services/readonly-surface/readonly-whitelist.js +107 -0
- package/dist/services/readonly-surface/whitelist-generator.d.ts +64 -0
- package/dist/services/readonly-surface/whitelist-generator.js +212 -0
- package/dist/services/skills/hooks-codegate-superpowers.d.ts +1 -0
- package/dist/services/skills/hooks-codegate-superpowers.js +26 -0
- package/dist/services/skills/hooks-settings-deny-list.d.ts +61 -0
- package/dist/services/skills/hooks-settings-deny-list.js +173 -0
- package/dist/services/skills/hooks-settings-envelopes.d.ts +20 -0
- package/dist/services/skills/hooks-settings-envelopes.js +79 -0
- package/dist/services/skills/hooks-settings-file-shape.d.ts +43 -0
- package/dist/services/skills/hooks-settings-file-shape.js +207 -0
- package/dist/services/skills/hooks-settings-paths.d.ts +34 -0
- package/dist/services/skills/hooks-settings-paths.js +75 -0
- package/dist/services/skills/hooks-settings-read-installed.d.ts +39 -0
- package/dist/services/skills/hooks-settings-read-installed.js +60 -0
- package/dist/services/skills/hooks-settings-service.d.ts +12 -212
- package/dist/services/skills/hooks-settings-service.js +71 -649
- package/dist/services/skills/hooks-settings-types.d.ts +139 -0
- package/dist/services/skills/hooks-settings-types.js +1 -0
- package/dist/services/workspace/claude-settings-template-merge.d.ts +89 -0
- package/dist/services/workspace/claude-settings-template-merge.js +243 -0
- package/dist/services/workspace/claude-settings-template.d.ts +29 -87
- package/dist/services/workspace/claude-settings-template.js +81 -236
- package/package.json +17 -6
- package/scripts/install-skills-bundles.mjs +233 -0
- package/scripts/install-skills-fs.mjs +148 -0
- package/scripts/install-skills-ide.mjs +279 -0
- package/scripts/install-skills-output-style-default.mjs +196 -0
- package/scripts/install-skills-output-styles.mjs +121 -0
- package/scripts/install-skills-report.mjs +42 -0
- package/scripts/install-skills-user-config.mjs +198 -0
- package/scripts/install-skills.mjs +36 -1066
- package/scripts/watch-tree.mjs +140 -0
- package/scripts/watch.mjs +4 -126
- package/skills/peaks-status/SKILL.md +31 -13
|
@@ -23,10 +23,11 @@
|
|
|
23
23
|
* it can be unit-tested in isolation and so the on-disk file matches
|
|
24
24
|
* the in-memory template byte-for-byte.
|
|
25
25
|
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
* that matcher's gate is
|
|
29
|
-
*
|
|
26
|
+
* Four `Bash` matchers are emitted: the Step 0.8 mechanical gate, the SOP
|
|
27
|
+
* gate-enforce handler, and the two layer-B feedback hooks. No
|
|
28
|
+
* `Write|Edit|MultiEdit` entry is emitted: that matcher's gate is
|
|
29
|
+
* `peaks code-gate --json`, installed into the committed
|
|
30
|
+
* `.claude/settings.json` by `peaks hooks install`.
|
|
30
31
|
*
|
|
31
32
|
* The previous `Bash` matcher (which whitelisted a fixed `peaks
|
|
32
33
|
* <subcommand>` prefix) was removed in TEMPLATE_VERSION 1.2.0. The
|
|
@@ -40,7 +41,15 @@
|
|
|
40
41
|
* consumer project's `.claude/settings.json` and which exits 0
|
|
41
42
|
* silently for any command not guarded by a registered SOP gate.
|
|
42
43
|
*/
|
|
43
|
-
import { EXTERNAL_GATE_EXEMPT_ENV,
|
|
44
|
+
import { EXTERNAL_GATE_EXEMPT_ENV, resolveHookShell, resolveHookSpec } from '../skills/hooks-codegate-superpowers.js';
|
|
45
|
+
/**
|
|
46
|
+
* The comparison and the entry-level merge live in
|
|
47
|
+
* `claude-settings-template-merge.ts` — they were two thirds of this file's
|
|
48
|
+
* bytes and none of its template shape. Re-exported here so this module stays
|
|
49
|
+
* the single public entry point for the template concern: no caller has to
|
|
50
|
+
* know which half a symbol lives in.
|
|
51
|
+
*/
|
|
52
|
+
export { isRetiredTemplateEntry, mergeTemplateOwnedHooks, templateContentMatches } from './claude-settings-template-merge.js';
|
|
44
53
|
export const CLAUDE_SETTINGS_LOCAL_FILENAME = '.claude/settings.local.json';
|
|
45
54
|
/**
|
|
46
55
|
* Informational version of the offline template shape. Bumped when the
|
|
@@ -98,232 +107,17 @@ export const CLAUDE_SETTINGS_LOCAL_FILENAME = '.claude/settings.local.json';
|
|
|
98
107
|
* `mergeTemplateOwnedHooks` drops the retired entry from
|
|
99
108
|
* existing on-disk files, so an earlier install converges
|
|
100
109
|
* instead of keeping a no-op with a stale absolute path.
|
|
110
|
+
* 1.9.0 — added the two layer-B feedback hook entries
|
|
111
|
+
* (`pre-tool-peaks-current-directory-scope.sh` and
|
|
112
|
+
* `pre-tool-piping-a-test-run-reports-the-pipes-exit-code.sh`),
|
|
113
|
+
* pinned to `shell: bash`. Until now their registration existed only
|
|
114
|
+
* in the generated copies on the machine that hand-wrote them: a
|
|
115
|
+
* fresh clone got the two scripts and no registration, so the
|
|
116
|
+
* promotion they carry was true only locally. See
|
|
117
|
+
* `buildFeedbackHookHandler` for why the pin is `bash` and not the
|
|
118
|
+
* `powershell` its three siblings take.
|
|
101
119
|
*/
|
|
102
|
-
export const TEMPLATE_VERSION = '1.
|
|
103
|
-
/**
|
|
104
|
-
* Compare two serialized template strings: does the on-disk file already
|
|
105
|
-
* declare every entry the generated tree declares?
|
|
106
|
-
*
|
|
107
|
-
* This comparator answers "is each entry the GENERATED tree declares present
|
|
108
|
-
* on disk?", NOT "are the two `hooks` trees identical". Extra on-disk entries
|
|
109
|
-
* are IGNORED, so an entry another writer put in this file never makes it look
|
|
110
|
-
* drifted.
|
|
111
|
-
*
|
|
112
|
-
* That is the deliberate other half of the entry-level merge in
|
|
113
|
-
* `mergeTemplateOwnedHooks` / `workspace-claude-settings-materializer.ts`.
|
|
114
|
-
* `.claude/settings.local.json` has a SECOND writer of `hooks.PreToolUse`:
|
|
115
|
-
* `installAutoCompactHook` appends a `Bash|Task` entry. Under the previous
|
|
116
|
-
* exact-tree rule the merged file carried 4 entries against a 3-entry
|
|
117
|
-
* generated tree, so every `peaks workspace init` answered "drifted",
|
|
118
|
-
* rewrote, and reported `refreshed` forever — precisely the state whole-key
|
|
119
|
-
* ownership existed to prevent, and the reason the merge could not ship alone.
|
|
120
|
-
*
|
|
121
|
-
* Matching is order-insensitive AND multiset-aware: the template declares TWO
|
|
122
|
-
* `Bash` entries, and each must have its own counterpart on disk, so a file
|
|
123
|
-
* carrying only one of them is still reported as drifted (the previous
|
|
124
|
-
* index-by-index loop had the same property; it is load-bearing, not a
|
|
125
|
-
* detail).
|
|
126
|
-
*
|
|
127
|
-
* Returns `true` iff both strings parse to objects whose `hooks.PreToolUse`
|
|
128
|
-
* arrays satisfy that containment, the on-disk file carries NO entry this
|
|
129
|
-
* template has retired (`isRetiredTemplateEntry`), AND the on-disk `env`
|
|
130
|
-
* already carries every exemption the template declares (extra on-disk keys
|
|
131
|
-
* and extra globs are allowed — a user may exempt other trees, and a
|
|
132
|
-
* requirement the file already exceeds must not re-trigger a write).
|
|
133
|
-
*
|
|
134
|
-
* Returns `false` on any `JSON.parse` error, shape mismatch, or
|
|
135
|
-
* missing `hooks.PreToolUse`. Whitespace and key order do NOT affect
|
|
136
|
-
* the result — the comparison is on the parsed AST, not on bytes.
|
|
137
|
-
*
|
|
138
|
-
* This is the comparator `initWorkspace` uses to decide whether to
|
|
139
|
-
* refresh a stale `.peaks/.claude-settings-template.json` on disk.
|
|
140
|
-
*/
|
|
141
|
-
export function templateContentMatches(generated, onDisk) {
|
|
142
|
-
let parsedGenerated;
|
|
143
|
-
let parsedOnDisk;
|
|
144
|
-
try {
|
|
145
|
-
parsedGenerated = JSON.parse(generated);
|
|
146
|
-
}
|
|
147
|
-
catch {
|
|
148
|
-
return false;
|
|
149
|
-
}
|
|
150
|
-
try {
|
|
151
|
-
parsedOnDisk = JSON.parse(onDisk);
|
|
152
|
-
}
|
|
153
|
-
catch {
|
|
154
|
-
return false;
|
|
155
|
-
}
|
|
156
|
-
if (!isTemplateShape(parsedGenerated) || !isTemplateShape(parsedOnDisk)) {
|
|
157
|
-
return false;
|
|
158
|
-
}
|
|
159
|
-
// Multiset containment: consume one on-disk entry per generated entry so a
|
|
160
|
-
// file holding a single copy of a doubly-declared entry still fails.
|
|
161
|
-
const unmatched = [...parsedOnDisk.hooks.PreToolUse];
|
|
162
|
-
for (const required of parsedGenerated.hooks.PreToolUse) {
|
|
163
|
-
const at = unmatched.findIndex((candidate) => sameEntry(required, candidate));
|
|
164
|
-
if (at === -1) {
|
|
165
|
-
return false;
|
|
166
|
-
}
|
|
167
|
-
unmatched.splice(at, 1);
|
|
168
|
-
}
|
|
169
|
-
// A RETIRED entry on disk is drift, and this clause is what makes the
|
|
170
|
-
// retirement in `mergeTemplateOwnedHooks` reach an installed file at all.
|
|
171
|
-
//
|
|
172
|
-
// Containment alone cannot express it: a file still carrying
|
|
173
|
-
// `Write|Edit|MultiEdit` declares every entry the template declares, so
|
|
174
|
-
// `templateContentMatches` answered "current", no rewrite ran, and the merge
|
|
175
|
-
// never got the chance to drop it. Measured on a throwaway project root
|
|
176
|
-
// before this clause existed — init against the rebuilt CLI reported
|
|
177
|
-
// `already-current` and the retired entry survived verbatim. Declaring less
|
|
178
|
-
// is not a retirement; the comparator has to say so.
|
|
179
|
-
//
|
|
180
|
-
// One extra rewrite per affected install, then the fixed point holds: the
|
|
181
|
-
// merge emits no retired entry, so the next comparison finds none and
|
|
182
|
-
// answers `current`.
|
|
183
|
-
if (parsedOnDisk.hooks.PreToolUse.some((entry) => isRetiredTemplateEntry(entry))) {
|
|
184
|
-
return false;
|
|
185
|
-
}
|
|
186
|
-
// A project installed by a release that predates a template-declared
|
|
187
|
-
// exemption still needs the refresh this comparator gates — otherwise the
|
|
188
|
-
// entry would only ever appear on a machine that re-ran `peaks hooks
|
|
189
|
-
// install`. `hasExternalGateExemptions` is the same predicate the installer
|
|
190
|
-
// uses, so the two writers cannot drift apart.
|
|
191
|
-
return hasExternalGateExemptions({ env: parsedOnDisk.env });
|
|
192
|
-
}
|
|
193
|
-
/**
|
|
194
|
-
* Merge the on-disk `hooks.PreToolUse` list with the template's.
|
|
195
|
-
*
|
|
196
|
-
* the entries IT DECLARES — and nothing else. Every other on-disk entry is
|
|
197
|
-
* carried across verbatim, whatever its matcher, because the template has no
|
|
198
|
-
* opinion about it:
|
|
199
|
-
*
|
|
200
|
-
* - a `matcher` the template does not declare (`Bash|Task`, the auto-compact
|
|
201
|
-
* hook `installAutoCompactHook` appends) is never touched;
|
|
202
|
-
* - surplus entries BEYOND the template's count for a declared matcher (a
|
|
203
|
-
* user's own `Bash` hook) are surplus too, and survive;
|
|
204
|
-
* - an on-disk entry that fills a declared slot is REPLACED by the template's
|
|
205
|
-
* entry for it. That is what makes a hand-edited (or older-release) entry
|
|
206
|
-
* self-heal instead of lingering next to a correct copy of itself.
|
|
207
|
-
*
|
|
208
|
-
* Slot counting is per `matcher` and positional within it: the template
|
|
209
|
-
* declares TWO `Bash` entries, so the first two on-disk `Bash` entries are
|
|
210
|
-
* theirs and a third is the user's. The template's entries are emitted first,
|
|
211
|
-
* in template order, then the preserved ones in their on-disk order — which is
|
|
212
|
-
* a fixed point: re-merging the result yields the result (the template's own
|
|
213
|
-
* entries are encountered first and refill their own slots).
|
|
214
|
-
*
|
|
215
|
-
* Non-conforming entries (no string `matcher`, no `hooks` array) are preserved
|
|
216
|
-
* rather than dropped: guessing at their shape is how a user's entry gets
|
|
217
|
-
* deleted.
|
|
218
|
-
*
|
|
219
|
-
* ONE exception to "preserve what I do not declare": an entry this template
|
|
220
|
-
* used to declare and RETIRED (TEMPLATE_VERSION 1.8.0's `Write|Edit|MultiEdit`
|
|
221
|
-
* gate — see `isRetiredTemplateEntry`) is dropped rather than preserved.
|
|
222
|
-
* Declaring less cannot retire an entry on its own, because preserving
|
|
223
|
-
* undeclared entries is exactly what this function does; without the drop, a
|
|
224
|
-
* pre-1.8.0 install would keep the no-op handler and its version-pinned script
|
|
225
|
-
* path forever. The predicate is narrow enough that only the exact command
|
|
226
|
-
* this template emitted matches.
|
|
227
|
-
*/
|
|
228
|
-
export function mergeTemplateOwnedHooks(onDisk, template) {
|
|
229
|
-
const slots = new Map();
|
|
230
|
-
for (const entry of template) {
|
|
231
|
-
if (!isPreToolUseEntry(entry))
|
|
232
|
-
continue;
|
|
233
|
-
slots.set(entry.matcher, (slots.get(entry.matcher) ?? 0) + 1);
|
|
234
|
-
}
|
|
235
|
-
const taken = new Map();
|
|
236
|
-
const preserved = [];
|
|
237
|
-
for (const entry of onDisk) {
|
|
238
|
-
// Retired by this template — dropped, not carried across.
|
|
239
|
-
if (isRetiredTemplateEntry(entry)) {
|
|
240
|
-
continue;
|
|
241
|
-
}
|
|
242
|
-
// Unowned by construction: not a shape the template could have declared.
|
|
243
|
-
if (!isPreToolUseEntry(entry)) {
|
|
244
|
-
preserved.push(entry);
|
|
245
|
-
continue;
|
|
246
|
-
}
|
|
247
|
-
const declared = slots.get(entry.matcher) ?? 0;
|
|
248
|
-
const used = taken.get(entry.matcher) ?? 0;
|
|
249
|
-
if (used >= declared) {
|
|
250
|
-
preserved.push(entry);
|
|
251
|
-
continue;
|
|
252
|
-
}
|
|
253
|
-
taken.set(entry.matcher, used + 1);
|
|
254
|
-
}
|
|
255
|
-
return [...template, ...preserved];
|
|
256
|
-
}
|
|
257
|
-
/** Structural equality of two `PreToolUse` entries. */
|
|
258
|
-
function sameEntry(a, b) {
|
|
259
|
-
return a.matcher === b.matcher && sameHooksArray(a.hooks, b.hooks);
|
|
260
|
-
}
|
|
261
|
-
function isPreToolUseEntry(value) {
|
|
262
|
-
if (typeof value !== 'object' || value === null || Array.isArray(value)) {
|
|
263
|
-
return false;
|
|
264
|
-
}
|
|
265
|
-
const candidate = value;
|
|
266
|
-
return typeof candidate.matcher === 'string' && Array.isArray(candidate.hooks);
|
|
267
|
-
}
|
|
268
|
-
function isTemplateShape(value) {
|
|
269
|
-
if (typeof value !== 'object' || value === null) {
|
|
270
|
-
return false;
|
|
271
|
-
}
|
|
272
|
-
const candidate = value;
|
|
273
|
-
if (typeof candidate.hooks !== 'object' || candidate.hooks === null) {
|
|
274
|
-
return false;
|
|
275
|
-
}
|
|
276
|
-
const hooksObj = candidate.hooks;
|
|
277
|
-
return Array.isArray(hooksObj.PreToolUse);
|
|
278
|
-
}
|
|
279
|
-
function sameHooksArray(a, b) {
|
|
280
|
-
if (a.length !== b.length) {
|
|
281
|
-
return false;
|
|
282
|
-
}
|
|
283
|
-
for (let i = 0; i < a.length; i += 1) {
|
|
284
|
-
const ha = a[i];
|
|
285
|
-
const hb = b[i];
|
|
286
|
-
// `shell` participates in the comparison: it is machine-specific (see
|
|
287
|
-
// `resolveHookShell`), so a file written on one platform must be
|
|
288
|
-
// recognized as drifted on the other instead of silently kept.
|
|
289
|
-
if (ha.type !== hb.type || ha.command !== hb.command || ha.shell !== hb.shell) {
|
|
290
|
-
return false;
|
|
291
|
-
}
|
|
292
|
-
}
|
|
293
|
-
return true;
|
|
294
|
-
}
|
|
295
|
-
/**
|
|
296
|
-
* The retired `Write|Edit|MultiEdit` gate entry, as an on-disk file written by
|
|
297
|
-
* a pre-1.8.0 release holds it.
|
|
298
|
-
*
|
|
299
|
-
* TEMPLATE_VERSION 1.8.0 stopped emitting this entry. Declaring less is not
|
|
300
|
-
* enough on its own: `mergeTemplateOwnedHooks` preserves every on-disk entry
|
|
301
|
-
* the template does not declare — that is the whole point of the entry-level
|
|
302
|
-
* ownership rule (it is what keeps `installAutoCompactHook`'s `Bash|Task`
|
|
303
|
-
* entry alive) — so a project installed by an earlier release would keep the
|
|
304
|
-
* no-op handler, and its `node "C:/…/nvm/v24.14.0/…"` path, forever. This
|
|
305
|
-
* predicate is the retirement: `mergeTemplateOwnedHooks` drops a match.
|
|
306
|
-
*
|
|
307
|
-
* Deliberately narrow. It matches the exact command shape this template used
|
|
308
|
-
* to emit — one handler, `node "<…>/services/hooks/write-gate.js"` — under the
|
|
309
|
-
* exact legacy matcher spelling, so a user's OWN `Write|Edit|MultiEdit` entry
|
|
310
|
-
* (a different command, or more than one handler) is preserved like any other
|
|
311
|
-
* entry the template does not declare. A looser "drop anything on this
|
|
312
|
-
* matcher" rule would delete a user's hook, which is the failure the ownership
|
|
313
|
-
* rule exists to prevent.
|
|
314
|
-
*/
|
|
315
|
-
const RETIRED_WRITE_GATE_MATCHER = 'Write|Edit|MultiEdit';
|
|
316
|
-
const RETIRED_WRITE_GATE_COMMAND = /^node "[^"]*\/services\/hooks\/write-gate\.js"$/;
|
|
317
|
-
export function isRetiredTemplateEntry(entry) {
|
|
318
|
-
if (!isPreToolUseEntry(entry))
|
|
319
|
-
return false;
|
|
320
|
-
if (entry.matcher !== RETIRED_WRITE_GATE_MATCHER)
|
|
321
|
-
return false;
|
|
322
|
-
if (entry.hooks.length !== 1)
|
|
323
|
-
return false;
|
|
324
|
-
const handler = entry.hooks[0];
|
|
325
|
-
return handler.type === 'command' && RETIRED_WRITE_GATE_COMMAND.test(handler.command);
|
|
326
|
-
}
|
|
120
|
+
export const TEMPLATE_VERSION = '1.9.0';
|
|
327
121
|
/**
|
|
328
122
|
* TEMPLATE_VERSION 1.4.0 — the SOP gate-enforce handler, read from the same
|
|
329
123
|
* canonical hook spec `peaks hooks install` uses. Deriving it here (rather
|
|
@@ -347,11 +141,12 @@ function buildGateEnforceHandler() {
|
|
|
347
141
|
* forcing gate is a core feature that PreToolUse hooks can short-
|
|
348
142
|
* circuit but that the `permissions` block cannot.
|
|
349
143
|
*
|
|
350
|
-
* As of TEMPLATE_VERSION 1.
|
|
351
|
-
*
|
|
352
|
-
*
|
|
353
|
-
* (`peaks code-gate --json`) is
|
|
354
|
-
* `.claude/settings.json` by `peaks hooks
|
|
144
|
+
* As of TEMPLATE_VERSION 1.9.0 the template emits four `Bash` matchers: the
|
|
145
|
+
* two above, plus one per layer-B feedback hook (`FEEDBACK_HOOK_SCRIPTS`). The
|
|
146
|
+
* `Write|Edit|MultiEdit` fact-forcing bypass is no longer a hook: it is the
|
|
147
|
+
* `env` exemption above, and that matcher's gate (`peaks code-gate --json`) is
|
|
148
|
+
* installed into the committed `.claude/settings.json` by `peaks hooks
|
|
149
|
+
* install`.
|
|
355
150
|
*/
|
|
356
151
|
export function buildClaudeSettingsLocalJson() {
|
|
357
152
|
return {
|
|
@@ -387,7 +182,15 @@ export function buildClaudeSettingsLocalJson() {
|
|
|
387
182
|
// group and the gate would run twice per Bash call.
|
|
388
183
|
matcher: 'Bash',
|
|
389
184
|
hooks: [buildGateEnforceHandler()]
|
|
390
|
-
}
|
|
185
|
+
},
|
|
186
|
+
...FEEDBACK_HOOK_SCRIPTS.map((script) => ({
|
|
187
|
+
// TEMPLATE_VERSION 1.9.0 — the layer-B feedback hooks, one matcher
|
|
188
|
+
// group each, for the same reason the entry above has its own: a
|
|
189
|
+
// group is peaks-managed only when EVERY handler in it carries a
|
|
190
|
+
// peaks sentinel, and none of these handlers does.
|
|
191
|
+
matcher: 'Bash',
|
|
192
|
+
hooks: [buildFeedbackHookHandler(script)]
|
|
193
|
+
}))
|
|
391
194
|
]
|
|
392
195
|
}
|
|
393
196
|
};
|
|
@@ -420,3 +223,45 @@ function buildBashGateStep08Handler() {
|
|
|
420
223
|
...(shell !== undefined ? { shell } : {})
|
|
421
224
|
};
|
|
422
225
|
}
|
|
226
|
+
/**
|
|
227
|
+
* TEMPLATE_VERSION 1.9.0 — the two rules promoted to layer B by hand first: the
|
|
228
|
+
* scripts shipped in `src/services/hooks/`, but the registration existed only in
|
|
229
|
+
* the generated copy on the machine that wrote it. Emitting it here is what makes
|
|
230
|
+
* the promotion a property of the repository rather than of that machine — the
|
|
231
|
+
* layer-B feedback gate reads THIS template's `hooks` block, so a fresh clone had
|
|
232
|
+
* the enforcement and nothing registering it.
|
|
233
|
+
*
|
|
234
|
+
* The filenames are the contract: the layer-B check looks for a hook command that
|
|
235
|
+
* INVOKES A FILE NAMED AFTER THE RULE, so the command has to carry the script's
|
|
236
|
+
* name and cannot be a `peaks` verb that dispatches to it.
|
|
237
|
+
*/
|
|
238
|
+
const FEEDBACK_HOOK_SCRIPTS = [
|
|
239
|
+
'pre-tool-peaks-current-directory-scope.sh',
|
|
240
|
+
'pre-tool-piping-a-test-run-reports-the-pipes-exit-code.sh'
|
|
241
|
+
];
|
|
242
|
+
/** The shell these two handlers are pinned to. See `buildFeedbackHookHandler`. */
|
|
243
|
+
const FEEDBACK_HOOK_SHELL = 'bash';
|
|
244
|
+
/**
|
|
245
|
+
* The handler for one feedback hook, pinned to `shell: 'bash'`.
|
|
246
|
+
*
|
|
247
|
+
* THE PIN IS THE DECISION, and it is deliberately not the `powershell` its three
|
|
248
|
+
* siblings take. Measured on this host, both shapes run the script and both print
|
|
249
|
+
* its refusal to stderr — but they do not report the same exit code:
|
|
250
|
+
*
|
|
251
|
+
* bash "<script>" exit 2 (the script's own code)
|
|
252
|
+
* powershell "<script>" exit 1 (flattened by the shell)
|
|
253
|
+
*
|
|
254
|
+
* Under the Claude Code hook protocol only exit 2 blocks; any other non-zero exit
|
|
255
|
+
* is a NON-BLOCKING ERROR and the tool call goes ahead. So pinning `powershell`
|
|
256
|
+
* here would not be a cosmetic difference on a blocking hook — it would turn the
|
|
257
|
+
* refusal into a log line and let the command through, which is the failure these
|
|
258
|
+
* two entries exist to prevent. `shell` accepts `bash` and `powershell` only, and
|
|
259
|
+
* `bash` is also the interpreter this command already names.
|
|
260
|
+
*/
|
|
261
|
+
function buildFeedbackHookHandler(script) {
|
|
262
|
+
return {
|
|
263
|
+
type: 'command',
|
|
264
|
+
command: `bash "\${CLAUDE_PROJECT_DIR}/src/services/hooks/${script}"`,
|
|
265
|
+
shell: FEEDBACK_HOOK_SHELL
|
|
266
|
+
};
|
|
267
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "peaks-loop",
|
|
3
|
-
"version": "4.1.
|
|
3
|
+
"version": "4.1.4",
|
|
4
4
|
"description": "Loop Engineering CLI — workflow primitive / loop guards / evaluators / slice orchestration",
|
|
5
5
|
"author": "SquabbyZ",
|
|
6
6
|
"keywords": [
|
|
@@ -75,16 +75,25 @@
|
|
|
75
75
|
"scripts/copy-templates.mjs",
|
|
76
76
|
"scripts/sync-version.mjs",
|
|
77
77
|
"scripts/install-skills.mjs",
|
|
78
|
+
"scripts/install-skills-fs.mjs",
|
|
79
|
+
"scripts/install-skills-report.mjs",
|
|
80
|
+
"scripts/install-skills-user-config.mjs",
|
|
81
|
+
"scripts/install-skills-ide.mjs",
|
|
82
|
+
"scripts/install-skills-bundles.mjs",
|
|
83
|
+
"scripts/install-skills-output-styles.mjs",
|
|
84
|
+
"scripts/install-skills-output-style-default.mjs",
|
|
78
85
|
"scripts/canonical-store.mjs",
|
|
79
86
|
"scripts/canonical-store-link.mjs",
|
|
80
87
|
"scripts/canonical-store-prune.mjs",
|
|
81
88
|
"scripts/watch.mjs",
|
|
89
|
+
"scripts/watch-tree.mjs",
|
|
82
90
|
"skills/**",
|
|
83
91
|
"!skills/**/test-prompts.json",
|
|
84
92
|
"!skills/**/.DS_Store",
|
|
85
93
|
"output-styles/**",
|
|
86
94
|
"agents/**",
|
|
87
95
|
"schemas/*.json",
|
|
96
|
+
"contracts/readonly-argv-whitelist.json",
|
|
88
97
|
".claude-plugin/**",
|
|
89
98
|
"config/eslint/.peaks-rules.cjs",
|
|
90
99
|
"config/eslint/tsconfig.lint.json",
|
|
@@ -120,10 +129,10 @@
|
|
|
120
129
|
"picomatch": "4.0.4",
|
|
121
130
|
"yaml": "^2.9.0",
|
|
122
131
|
"zod": "^4.4.3",
|
|
123
|
-
"peaks-loop-internal-runtime": "0.0.
|
|
124
|
-
"peaks-loop-shared
|
|
125
|
-
"peaks-loop-mut": "0.1.
|
|
126
|
-
"peaks-loop-shared": "0.0.
|
|
132
|
+
"peaks-loop-internal-runtime": "0.0.44",
|
|
133
|
+
"peaks-loop-shared": "0.0.93",
|
|
134
|
+
"peaks-loop-mut": "0.1.58",
|
|
135
|
+
"peaks-loop-shared-channel": "0.0.61"
|
|
127
136
|
},
|
|
128
137
|
"devDependencies": {
|
|
129
138
|
"@changesets/cli": "2.31.1",
|
|
@@ -148,7 +157,9 @@
|
|
|
148
157
|
"vitest": "^4.1.10"
|
|
149
158
|
},
|
|
150
159
|
"scripts": {
|
|
151
|
-
"build": "node ./scripts/sync-version.mjs && node ./scripts/clean-dist.mjs && pnpm -r --filter \"./packages/*\" run build && node ./scripts/write-package-dist-stamps.mjs && tsc -p tsconfig.build.json && node ./scripts/copy-templates.mjs && node ./scripts/check-build-integrity.mjs && node ./scripts/write-dist-stamp.mjs",
|
|
160
|
+
"build": "node ./scripts/sync-version.mjs && node ./scripts/clean-dist.mjs && pnpm -r --filter \"./packages/*\" run build && node ./scripts/write-package-dist-stamps.mjs && node node_modules/tsx/dist/cli.mjs scripts/generate-readonly-whitelist.ts && node node_modules/tsx/dist/cli.mjs scripts/generate-plugin-manifest.ts && tsc -p tsconfig.build.json && node ./scripts/copy-templates.mjs && node ./scripts/check-build-integrity.mjs && node ./scripts/write-dist-stamp.mjs",
|
|
161
|
+
"readonly:whitelist": "node node_modules/tsx/dist/cli.mjs scripts/generate-readonly-whitelist.ts",
|
|
162
|
+
"plugin:manifest": "node node_modules/tsx/dist/cli.mjs scripts/generate-plugin-manifest.ts",
|
|
152
163
|
"prepublish": "node ./scripts/sync-version.mjs",
|
|
153
164
|
"postinstall": "node ./scripts/install-skills.mjs",
|
|
154
165
|
"predev": "node ./scripts/sync-version.mjs",
|
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
// scripts/install-skills-bundles.mjs
|
|
2
|
+
//
|
|
3
|
+
// The two installers that read a directory of bundled assets out of the package and
|
|
4
|
+
// reconcile each entry into an IDE directory: the DIRECTORY-shaped family (skills) and
|
|
5
|
+
// the FILE-shaped one (agents). Each owns its dispatch precedence and its repair rule.
|
|
6
|
+
//
|
|
7
|
+
// Split out of `scripts/install-skills.mjs` (rid-043). Every line below was moved
|
|
8
|
+
// VERBATIM from that file; only this header, the import block, and the `export`
|
|
9
|
+
// keyword on names a sibling imports are new.
|
|
10
|
+
|
|
11
|
+
import { existsSync, lstatSync, mkdirSync, readdirSync } from 'node:fs';
|
|
12
|
+
import { join } from 'node:path';
|
|
13
|
+
|
|
14
|
+
import { reconcileCanonicalEntry } from './canonical-store.mjs';
|
|
15
|
+
import { reconcileCanonicalFileEntry } from './canonical-store-link.mjs';
|
|
16
|
+
import { pruneBundledEntries } from './canonical-store-prune.mjs';
|
|
17
|
+
import { createInstallResult } from './install-skills-report.mjs';
|
|
18
|
+
import { createInstallRootValidator, resolvePackageRoot } from './install-skills-fs.mjs';
|
|
19
|
+
import { resolveBundleTargetRoot } from './install-skills-ide.mjs';
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* THE INSTALL CANDIDATE LIST — every skill the package ships, as
|
|
23
|
+
* `{ skillName, sourcePath }`.
|
|
24
|
+
*
|
|
25
|
+
* After the v2.13.0 bee-demote (commit de0872b), the role skills (peaks-prd,
|
|
26
|
+
* peaks-rd, peaks-qa, peaks-ui, peaks-sc, peaks-txt) moved under
|
|
27
|
+
* `skills/bee/<role>/` while user-facing helpers stayed at `skills/<name>/`. So the
|
|
28
|
+
* list is built by walking top-level entries (user-facing helpers) AND
|
|
29
|
+
* `skills/bee/<role>` (demoted role skills). Each candidate is installed under its
|
|
30
|
+
* basename, so the postinstall links `~/.claude/skills/peaks-rd` to
|
|
31
|
+
* `skills/bee/peaks-rd` rather than to `skills/bee`.
|
|
32
|
+
*
|
|
33
|
+
* De-dupe rule: a top-level helper with the same name WINS, which preserves the
|
|
34
|
+
* existing install contract for any helper sharing a name with a demoted role skill
|
|
35
|
+
* (legacy overlap).
|
|
36
|
+
*
|
|
37
|
+
* @param {string} skillsRoot
|
|
38
|
+
* @returns {Array<{ skillName: string, sourcePath: string }>}
|
|
39
|
+
*/
|
|
40
|
+
function collectSkillCandidates(skillsRoot) {
|
|
41
|
+
const beeRoot = join(skillsRoot, 'bee');
|
|
42
|
+
/** @type {Array<{ skillName: string, sourcePath: string }>} */
|
|
43
|
+
const candidates = [];
|
|
44
|
+
for (const skillName of readdirSync(skillsRoot)) {
|
|
45
|
+
if (skillName === 'bee') continue;
|
|
46
|
+
const sourcePath = join(skillsRoot, skillName);
|
|
47
|
+
if (!isSkillSource(sourcePath)) continue;
|
|
48
|
+
candidates.push({ skillName, sourcePath });
|
|
49
|
+
}
|
|
50
|
+
if (existsSync(beeRoot) && isDirectoryEntry(beeRoot)) {
|
|
51
|
+
for (const skillName of readdirSync(beeRoot)) {
|
|
52
|
+
const sourcePath = join(beeRoot, skillName);
|
|
53
|
+
if (!isSkillSource(sourcePath)) continue;
|
|
54
|
+
if (candidates.some((c) => c.skillName === skillName)) continue;
|
|
55
|
+
candidates.push({ skillName, sourcePath });
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return candidates;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/** A real directory entry — `lstat`, so a symlink to one is NOT one. */
|
|
62
|
+
function isDirectoryEntry(entryPath) {
|
|
63
|
+
return lstatSync(entryPath).isDirectory();
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/** A directory entry that is a skill: a real directory holding a `SKILL.md`. */
|
|
67
|
+
function isSkillSource(sourcePath) {
|
|
68
|
+
return isDirectoryEntry(sourcePath) && existsSync(join(sourcePath, 'SKILL.md'));
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export function installBundledSkills(options = {}) {
|
|
72
|
+
const packageRoot = resolvePackageRoot(options);
|
|
73
|
+
const skillsRoot = join(packageRoot, 'skills');
|
|
74
|
+
|
|
75
|
+
if (process.env.PEAKS_SKIP_SKILL_INSTALL === '1' || !existsSync(skillsRoot)) {
|
|
76
|
+
return createInstallResult();
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// Slice #011: IDE-aware dispatch — the precedence itself now lives in ONE place
|
|
80
|
+
// (`resolveBundleTargetRoot` in `install-skills-ide.mjs`), because all three
|
|
81
|
+
// families stated it and only this one also warns.
|
|
82
|
+
const targetRoot = resolveBundleTargetRoot(options, {
|
|
83
|
+
profileField: 'skillsDir',
|
|
84
|
+
envVar: 'PEAKS_CLAUDE_SKILLS_DIR',
|
|
85
|
+
fallback: '.claude/skills',
|
|
86
|
+
warn: true
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
const installed = [];
|
|
90
|
+
const skipped = [];
|
|
91
|
+
mkdirSync(targetRoot, { recursive: true });
|
|
92
|
+
const validateSkillsRoot = createInstallRootValidator(targetRoot, 'Peaks skills');
|
|
93
|
+
|
|
94
|
+
const candidates = collectSkillCandidates(skillsRoot);
|
|
95
|
+
|
|
96
|
+
for (const { skillName, sourcePath } of candidates) {
|
|
97
|
+
const targetPath = join(targetRoot, skillName);
|
|
98
|
+
|
|
99
|
+
// Slice 2 (`agents-canonical-store`) — the entry points at the CANONICAL
|
|
100
|
+
// STORE (`~/.peaks/skills/<name>`), not at `<packageRoot>/skills/<name>`,
|
|
101
|
+
// because `<packageRoot>` changes on every `npm i -g peaks-loop@latest` and
|
|
102
|
+
// the links must bind to a PATH peaks-loop owns, not to a VERSION. Repair is
|
|
103
|
+
// the only behaviour: an entry peaks-loop owns (sidecar matches, or the link
|
|
104
|
+
// dangles) is relinked onto the store; only a real directory the user authored
|
|
105
|
+
// is left alone and reported `skipped`. `options.reconcileJunctions` is
|
|
106
|
+
// therefore READ NOWHERE here — still accepted (`sync-service.ts` forwards it)
|
|
107
|
+
// so passing it changes nothing, and removing it is a CLI-surface change this
|
|
108
|
+
// slice does not own.
|
|
109
|
+
validateSkillsRoot();
|
|
110
|
+
const reconciled = reconcileCanonicalEntry({
|
|
111
|
+
kind: 'skills',
|
|
112
|
+
name: skillName,
|
|
113
|
+
sourcePath,
|
|
114
|
+
linkPath: targetPath
|
|
115
|
+
});
|
|
116
|
+
validateSkillsRoot();
|
|
117
|
+
|
|
118
|
+
if (reconciled.linkAction === 'skipped') {
|
|
119
|
+
skipped.push(skillName);
|
|
120
|
+
continue;
|
|
121
|
+
}
|
|
122
|
+
installed.push(skillName);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
// Slice 3 — PRUNE. The loop above only ever ADDS. A skill removed from the
|
|
126
|
+
// package left its canonical copy, every IDE link and every sidecar on the
|
|
127
|
+
// user's machine forever, because nothing walked the DESTINATIONS. This does,
|
|
128
|
+
// and deletes only what `isManagedEntry` proves is ours.
|
|
129
|
+
const { pruned } = pruneBundledEntries({
|
|
130
|
+
kind: 'skills',
|
|
131
|
+
keepNames: candidates.map((candidate) => candidate.skillName),
|
|
132
|
+
linkDirs: [targetRoot]
|
|
133
|
+
});
|
|
134
|
+
|
|
135
|
+
return { installed, skipped, pruned };
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* Slice 7/7 — bundled agents (Claude Code sub-agent prompts).
|
|
140
|
+
*
|
|
141
|
+
* Writes into the IDE's sub-agent loader directory (`~/.claude/agents/` for Claude
|
|
142
|
+
* Code, and whatever `agentsDir` the detected profile declares). The bytes live in
|
|
143
|
+
* the canonical store (`~/.peaks/agents/<name>`) and the IDE entry is a link to it.
|
|
144
|
+
*
|
|
145
|
+
* Ownership policy — ONE predicate, in `canonical-store-link.mjs::isOwnedFileEntry`,
|
|
146
|
+
* and it is deliberately not a string comparison:
|
|
147
|
+
* - entry resolves to the canonical copy → leave it (idempotent run)
|
|
148
|
+
* - entry is a link we wrote (sidecar agrees, dangles) → relink onto the store
|
|
149
|
+
* - entry is a real file with OUR sidecar beside it → re-point it at the store
|
|
150
|
+
* - entry is a real file with a LEGACY sidecar whose
|
|
151
|
+
* recorded package path no longer resolves → same: repair it
|
|
152
|
+
* - entry is a real file we never wrote (no sidecar) → skip (user-authored)
|
|
153
|
+
* - entry is a real file whose sidecar names a path
|
|
154
|
+
* that STILL resolves → skip (a second live install)
|
|
155
|
+
*
|
|
156
|
+
* The two "skip" arms above are the ones the old code got wrong in opposite
|
|
157
|
+
* directions: it skipped whenever the package path merely DIFFERED, which froze
|
|
158
|
+
* every entry on the first upgrade, silently and permanently. See
|
|
159
|
+
* `isOwnedFileEntry` for why a vanished package path is proof of an earlier install.
|
|
160
|
+
*/
|
|
161
|
+
export function installBundledAgents(options = {}) {
|
|
162
|
+
const packageRoot = resolvePackageRoot(options);
|
|
163
|
+
const agentsRoot = join(packageRoot, 'agents');
|
|
164
|
+
|
|
165
|
+
// Per-IDE env-var override (claude-code only today): PEAKS_CLAUDE_AGENTS_DIR.
|
|
166
|
+
// Universal escape hatch: PEAKS_SKIP_AGENT_INSTALL=1 (parallel to
|
|
167
|
+
// PEAKS_SKIP_SKILL_INSTALL).
|
|
168
|
+
if (
|
|
169
|
+
process.env.PEAKS_SKIP_SKILL_INSTALL === '1' ||
|
|
170
|
+
process.env.PEAKS_SKIP_AGENT_INSTALL === '1' ||
|
|
171
|
+
!existsSync(agentsRoot)
|
|
172
|
+
) {
|
|
173
|
+
return createInstallResult();
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
// Slice #011: IDE-aware dispatch — same precedence as the other two families,
|
|
177
|
+
// resolved by the same helper (`resolveBundleTargetRoot`).
|
|
178
|
+
const targetRoot = resolveBundleTargetRoot(options, {
|
|
179
|
+
profileField: 'agentsDir',
|
|
180
|
+
envVar: 'PEAKS_CLAUDE_AGENTS_DIR',
|
|
181
|
+
fallback: '.claude/agents'
|
|
182
|
+
});
|
|
183
|
+
|
|
184
|
+
const installed = [];
|
|
185
|
+
const skipped = [];
|
|
186
|
+
const fallbacks = [];
|
|
187
|
+
mkdirSync(targetRoot, { recursive: true });
|
|
188
|
+
const validateAgentsRoot = createInstallRootValidator(targetRoot, 'Peaks agents');
|
|
189
|
+
|
|
190
|
+
// Slice 4 (`agents-canonical-store`) — the canonical store owns the bytes and the
|
|
191
|
+
// IDE entry points at it. Everything this loop used to decide about ownership is
|
|
192
|
+
// now `reconcileCanonicalFileEntry`'s, and the reason is the defect the brief
|
|
193
|
+
// names as this slice's core: the old test was
|
|
194
|
+
// `resolve(marker.sourcePath) === resolve(sourcePath)`, a STRING comparison against
|
|
195
|
+
// the package path of the installing version — a path with a node version inside it
|
|
196
|
+
// (`…\nvm\v24.21.0\node_modules\peaks-loop\agents\…`). It went false the first time
|
|
197
|
+
// the package moved and stayed false, so the agent silently never updated again.
|
|
198
|
+
const bundledAgentNames = [];
|
|
199
|
+
for (const agentFileName of readdirSync(agentsRoot)) {
|
|
200
|
+
const sourcePath = join(agentsRoot, agentFileName);
|
|
201
|
+
if (!lstatSync(sourcePath).isFile() || !agentFileName.endsWith('.md')) continue;
|
|
202
|
+
bundledAgentNames.push(agentFileName);
|
|
203
|
+
|
|
204
|
+
validateAgentsRoot();
|
|
205
|
+
const reconciled = reconcileCanonicalFileEntry({
|
|
206
|
+
kind: 'agents',
|
|
207
|
+
name: agentFileName,
|
|
208
|
+
sourcePath,
|
|
209
|
+
linkPath: join(targetRoot, agentFileName),
|
|
210
|
+
createFileLink: options.createFileLink
|
|
211
|
+
});
|
|
212
|
+
validateAgentsRoot();
|
|
213
|
+
|
|
214
|
+
if (reconciled.linkAction === 'skipped') {
|
|
215
|
+
skipped.push(agentFileName);
|
|
216
|
+
continue;
|
|
217
|
+
}
|
|
218
|
+
installed.push(agentFileName);
|
|
219
|
+
if (reconciled.fallback !== null) {
|
|
220
|
+
fallbacks.push({ name: agentFileName, ...reconciled.fallback });
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
// The delete half: an agent the package stops shipping used to leave its canonical
|
|
225
|
+
// copy, its IDE entry and both sidecars on the machine forever.
|
|
226
|
+
const { pruned } = pruneBundledEntries({
|
|
227
|
+
kind: 'agents',
|
|
228
|
+
keepNames: bundledAgentNames,
|
|
229
|
+
linkDirs: [targetRoot]
|
|
230
|
+
});
|
|
231
|
+
|
|
232
|
+
return { installed, skipped, pruned, fallbacks };
|
|
233
|
+
}
|