peaks-loop 4.1.3 → 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 +2 -2
- package/CHANGELOG.md +56 -0
- package/README-en.md +1 -1
- package/README.md +1 -1
- 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/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-emit-handoff-command.js +40 -3
- package/dist/cli/commands/code-gate-step-08-command.js +25 -9
- 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/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/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-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-from-dag.d.ts +27 -0
- package/dist/cli/commands/dispatch-from-dag.js +87 -257
- 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/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/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-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/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/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/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-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-terminalize-command.d.ts +3 -0
- package/dist/cli/commands/workflow-terminalize-command.js +56 -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/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 -657
- 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 +5 -5
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { fail, ok } from 'peaks-loop-shared/result';
|
|
2
|
+
import { addJsonOption, getErrorMessage, printResult } from '../cli-helpers.js';
|
|
3
|
+
import { fetchContextLayer, isContextLayer } from './context-layer-fetchers.js';
|
|
4
|
+
/** The two advisory `nextActions` a loaded layer reports. */
|
|
5
|
+
function layerActions(payload) {
|
|
6
|
+
return [
|
|
7
|
+
`${payload.layer} loaded: ${payload.byteSize} bytes across ${payload.files.length} file(s)`,
|
|
8
|
+
payload.warnings.length > 0
|
|
9
|
+
? `${payload.warnings.length} warning(s); see envelope.warnings`
|
|
10
|
+
: null
|
|
11
|
+
].filter((x) => typeof x === 'string');
|
|
12
|
+
}
|
|
13
|
+
export function registerContextLayerCommand(context, io) {
|
|
14
|
+
addJsonOption(context
|
|
15
|
+
.command('layer')
|
|
16
|
+
.description('Fetch a context layer (L0 = full SKILL.md; L1 = first paragraph; L2 = index; L3 = fuzzy search by --query)')
|
|
17
|
+
.requiredOption('--project <path>', 'target project root')
|
|
18
|
+
.requiredOption('--level <L0|L1|L2|L3>', 'context layer to load')
|
|
19
|
+
.option('--query <text>', 'fuzzy search query (required for L3)')).action(async (options) => {
|
|
20
|
+
try {
|
|
21
|
+
if (!isContextLayer(options.level)) {
|
|
22
|
+
printResult(io, fail('context.layer', 'INVALID_LEVEL', `level must be one of L0, L1, L2, L3 (got ${options.level})`, { provided: options.level }, ['Pass --level L0|L1|L2|L3']), options.json);
|
|
23
|
+
process.exitCode = 1;
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
const payload = await fetchContextLayer(options.level, options.project, options.query ?? '');
|
|
27
|
+
printResult(io, ok('context.layer', payload, [], layerActions(payload)), options.json);
|
|
28
|
+
}
|
|
29
|
+
catch (error) {
|
|
30
|
+
printResult(io, fail('context.layer', 'CONTEXT_LAYER_FAILED', getErrorMessage(error), { projectRoot: options.project }, ['Verify the project path and --level value']), options.json);
|
|
31
|
+
process.exitCode = 1;
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export type ContextLayer = 'L0' | 'L1' | 'L2' | 'L3';
|
|
2
|
+
export interface LayerPayload {
|
|
3
|
+
readonly layer: ContextLayer;
|
|
4
|
+
readonly description: string;
|
|
5
|
+
readonly files: readonly {
|
|
6
|
+
path: string;
|
|
7
|
+
bytes: number;
|
|
8
|
+
}[];
|
|
9
|
+
readonly content: string;
|
|
10
|
+
readonly byteSize: number;
|
|
11
|
+
readonly warnings: readonly string[];
|
|
12
|
+
}
|
|
13
|
+
/** Dispatch one layer by its validated `L0|L1|L2|L3` id. */
|
|
14
|
+
export declare function fetchContextLayer(level: ContextLayer, projectRoot: string, query: string): Promise<LayerPayload>;
|
|
15
|
+
export declare function isContextLayer(value: string): value is ContextLayer;
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The four context layers the `peaks context layer` verb can fetch.
|
|
3
|
+
*
|
|
4
|
+
* - L0: full read (every SKILL.md in full)
|
|
5
|
+
* - L1: summary (one paragraph per skill + the skill list)
|
|
6
|
+
* - L2: index (just names + paths)
|
|
7
|
+
* - L3: fuzzy search by query (delegates to peaks memory search)
|
|
8
|
+
*/
|
|
9
|
+
import { existsSync, readFileSync, readdirSync } from 'node:fs';
|
|
10
|
+
import { join } from 'node:path';
|
|
11
|
+
import { searchMemory } from '../../services/memory/memory-search-service.js';
|
|
12
|
+
import { getErrorMessage } from '../cli-helpers.js';
|
|
13
|
+
const SKILLS_DIR = 'skills';
|
|
14
|
+
/** Fallback preview length for a skill whose body has no blank-line paragraph break. */
|
|
15
|
+
const L1_PREVIEW_CHARS = 400;
|
|
16
|
+
/** How much of an L3 hit's description is echoed into the search listing. */
|
|
17
|
+
const L3_DESCRIPTION_CHARS = 120;
|
|
18
|
+
function readSkillsDir(projectRoot) {
|
|
19
|
+
const skillsRoot = join(projectRoot, SKILLS_DIR);
|
|
20
|
+
if (!existsSync(skillsRoot))
|
|
21
|
+
return [];
|
|
22
|
+
const out = [];
|
|
23
|
+
for (const entry of readdirSync(skillsRoot, { withFileTypes: true })) {
|
|
24
|
+
if (!entry.isDirectory() || entry.name.startsWith('.'))
|
|
25
|
+
continue;
|
|
26
|
+
const skillMd = join(skillsRoot, entry.name, 'SKILL.md');
|
|
27
|
+
if (existsSync(skillMd)) {
|
|
28
|
+
out.push(`skills/${entry.name}/SKILL.md`);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return out;
|
|
32
|
+
}
|
|
33
|
+
function readSkillFile(projectRoot, relPath) {
|
|
34
|
+
const abs = join(projectRoot, relPath);
|
|
35
|
+
try {
|
|
36
|
+
return readFileSync(abs, 'utf-8');
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
return '';
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/** Concatenate every SKILL.md in full. */
|
|
43
|
+
async function fetchL0(projectRoot) {
|
|
44
|
+
const files = readSkillsDir(projectRoot);
|
|
45
|
+
const warnings = [];
|
|
46
|
+
let content = '';
|
|
47
|
+
let byteSize = 0;
|
|
48
|
+
const sizes = [];
|
|
49
|
+
for (const rel of files) {
|
|
50
|
+
const body = readSkillFile(projectRoot, rel);
|
|
51
|
+
if (body.length === 0) {
|
|
52
|
+
warnings.push(`failed to read ${rel}`);
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
content += `## ${rel}\n\n${body}\n\n`;
|
|
56
|
+
sizes.push({ path: rel, bytes: body.length });
|
|
57
|
+
byteSize += body.length;
|
|
58
|
+
}
|
|
59
|
+
return {
|
|
60
|
+
layer: 'L0',
|
|
61
|
+
description: 'full read: every SKILL.md concatenated',
|
|
62
|
+
files: sizes,
|
|
63
|
+
content,
|
|
64
|
+
byteSize,
|
|
65
|
+
warnings
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
/** One paragraph (or a bounded preview) per skill. */
|
|
69
|
+
async function fetchL1(projectRoot) {
|
|
70
|
+
const files = readSkillsDir(projectRoot);
|
|
71
|
+
const warnings = [];
|
|
72
|
+
let content = '';
|
|
73
|
+
let byteSize = 0;
|
|
74
|
+
const sizes = [];
|
|
75
|
+
for (const rel of files) {
|
|
76
|
+
const body = readSkillFile(projectRoot, rel);
|
|
77
|
+
if (body.length === 0) {
|
|
78
|
+
warnings.push(`failed to read ${rel}`);
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
81
|
+
const firstPara = body.split(/\r?\n\r?\n/, 2)[0] ?? body.slice(0, L1_PREVIEW_CHARS);
|
|
82
|
+
content += `## ${rel}\n\n${firstPara}\n\n`;
|
|
83
|
+
sizes.push({ path: rel, bytes: firstPara.length });
|
|
84
|
+
byteSize += firstPara.length;
|
|
85
|
+
}
|
|
86
|
+
return {
|
|
87
|
+
layer: 'L1',
|
|
88
|
+
description: 'summary: first paragraph per skill',
|
|
89
|
+
files: sizes,
|
|
90
|
+
content,
|
|
91
|
+
byteSize,
|
|
92
|
+
warnings
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
/** Names and paths only, no bodies. */
|
|
96
|
+
async function fetchL2(projectRoot) {
|
|
97
|
+
const files = readSkillsDir(projectRoot);
|
|
98
|
+
const content = files.map((f) => `- ${f}`).join('\n') + '\n';
|
|
99
|
+
const byteSize = content.length;
|
|
100
|
+
return {
|
|
101
|
+
layer: 'L2',
|
|
102
|
+
description: 'index: skill paths only (no body)',
|
|
103
|
+
files: files.map((f) => ({ path: f, bytes: 0 })),
|
|
104
|
+
content,
|
|
105
|
+
byteSize,
|
|
106
|
+
warnings: []
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
/** Top 10 memory-search hits for `query`; a failure rides `warnings`. */
|
|
110
|
+
async function fetchL3(projectRoot, query) {
|
|
111
|
+
const warnings = [];
|
|
112
|
+
if (query.trim().length === 0) {
|
|
113
|
+
warnings.push('empty query; L3 requires a --query string for fuzzy search');
|
|
114
|
+
return {
|
|
115
|
+
layer: 'L3',
|
|
116
|
+
description: 'fuzzy search (empty query)',
|
|
117
|
+
files: [],
|
|
118
|
+
content: '',
|
|
119
|
+
byteSize: 0,
|
|
120
|
+
warnings
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
try {
|
|
124
|
+
const hits = searchMemory({ projectRoot, query, limit: 10 });
|
|
125
|
+
const lines = [];
|
|
126
|
+
for (const hit of hits) {
|
|
127
|
+
lines.push(`- [${hit.score.toFixed(2)}] ${hit.sourcePath}: ${hit.description.slice(0, L3_DESCRIPTION_CHARS)}`);
|
|
128
|
+
}
|
|
129
|
+
const content = lines.join('\n') + '\n';
|
|
130
|
+
return {
|
|
131
|
+
layer: 'L3',
|
|
132
|
+
description: 'fuzzy search: top 10 hits from memory index',
|
|
133
|
+
files: hits.map((h) => ({ path: h.sourcePath, bytes: h.description.length })),
|
|
134
|
+
content,
|
|
135
|
+
byteSize: content.length,
|
|
136
|
+
warnings
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
catch (error) {
|
|
140
|
+
return {
|
|
141
|
+
layer: 'L3',
|
|
142
|
+
description: 'fuzzy search (failed)',
|
|
143
|
+
files: [],
|
|
144
|
+
content: '',
|
|
145
|
+
byteSize: 0,
|
|
146
|
+
warnings: [`L3 search failed: ${getErrorMessage(error)}`]
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
/** Dispatch one layer by its validated `L0|L1|L2|L3` id. */
|
|
151
|
+
export async function fetchContextLayer(level, projectRoot, query) {
|
|
152
|
+
if (level === 'L0')
|
|
153
|
+
return fetchL0(projectRoot);
|
|
154
|
+
if (level === 'L1')
|
|
155
|
+
return fetchL1(projectRoot);
|
|
156
|
+
if (level === 'L2')
|
|
157
|
+
return fetchL2(projectRoot);
|
|
158
|
+
return fetchL3(projectRoot, query);
|
|
159
|
+
}
|
|
160
|
+
export function isContextLayer(value) {
|
|
161
|
+
return value === 'L0' || value === 'L1' || value === 'L2' || value === 'L3';
|
|
162
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { Command } from 'commander';
|
|
2
|
+
import { type ProgramIO } from '../cli-helpers.js';
|
|
3
|
+
export type ContextThresholdOptions = {
|
|
4
|
+
promptSize: string;
|
|
5
|
+
capacity?: string;
|
|
6
|
+
inFlightBatch?: boolean;
|
|
7
|
+
autoTrigger?: boolean;
|
|
8
|
+
json?: boolean;
|
|
9
|
+
};
|
|
10
|
+
/** `--capacity` override, or `undefined` to let the monitor use its default. */
|
|
11
|
+
export declare function capacityOf(opts: ContextThresholdOptions): number | undefined;
|
|
12
|
+
/**
|
|
13
|
+
* Parse `--prompt-size`, refusing a non-finite or negative value; `null` once
|
|
14
|
+
* the refusal envelope for `command` has been printed.
|
|
15
|
+
*/
|
|
16
|
+
export declare function requirePromptSize(command: string, opts: ContextThresholdOptions, io: ProgramIO): number | null;
|
|
17
|
+
export declare function registerContextStatusCommand(context: Command, io: ProgramIO): void;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { fail, ok } from 'peaks-loop-shared/result';
|
|
2
|
+
import { addJsonOption, getErrorMessage, printResult } from '../cli-helpers.js';
|
|
3
|
+
import { evaluateMainSessionThreshold } from '../../services/context/main-session-monitor.js';
|
|
4
|
+
import { detectIdeFromEnv } from '../../services/context/ide-detect.js';
|
|
5
|
+
/** `--capacity` override, or `undefined` to let the monitor use its default. */
|
|
6
|
+
export function capacityOf(opts) {
|
|
7
|
+
return opts.capacity !== undefined ? Number(opts.capacity) : undefined;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Parse `--prompt-size`, refusing a non-finite or negative value; `null` once
|
|
11
|
+
* the refusal envelope for `command` has been printed.
|
|
12
|
+
*/
|
|
13
|
+
export function requirePromptSize(command, opts, io) {
|
|
14
|
+
const promptSize = Number(opts.promptSize);
|
|
15
|
+
if (Number.isFinite(promptSize) && promptSize >= 0)
|
|
16
|
+
return promptSize;
|
|
17
|
+
printResult(io, fail(command, 'INVALID_PROMPT_SIZE', `prompt-size must be a non-negative number (got "${opts.promptSize}")`, { provided: opts.promptSize }, ['Pass --prompt-size <bytes>']), opts.json);
|
|
18
|
+
process.exitCode = 1;
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
export function registerContextStatusCommand(context, io) {
|
|
22
|
+
addJsonOption(context
|
|
23
|
+
.command('status')
|
|
24
|
+
.description('v2.11.0 D6: report main-session threshold tier for a given prompt size (no trigger dispatched). Useful for `--json` probes before invoking `peaks context check --auto-trigger`.')
|
|
25
|
+
.requiredOption('--prompt-size <bytes>', 'estimated prompt size in bytes')
|
|
26
|
+
.option('--capacity <bytes>', 'override the 256K default capacity (test seam)', '262144')).action((opts) => {
|
|
27
|
+
try {
|
|
28
|
+
const promptSize = requirePromptSize('context.status', opts, io);
|
|
29
|
+
if (promptSize === null)
|
|
30
|
+
return;
|
|
31
|
+
const evaluation = evaluateMainSessionThreshold(promptSize, capacityOf(opts));
|
|
32
|
+
printResult(io, ok('context.status', { ...evaluation, ide: detectIdeFromEnv() }, [...evaluation.warnings], [`Main-session tier=${evaluation.tier} (${(evaluation.ratio * 100).toFixed(0)}%)`]), opts.json);
|
|
33
|
+
}
|
|
34
|
+
catch (err) {
|
|
35
|
+
printResult(io, fail('context.status', 'CONTEXT_STATUS_FAILED', getErrorMessage(err), null, [
|
|
36
|
+
'Verify --prompt-size is a non-negative number'
|
|
37
|
+
]), opts.json);
|
|
38
|
+
process.exitCode = 1;
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
// src/cli/commands/contract-write-command.ts
|
|
2
|
+
//
|
|
3
|
+
// `peaks contract write` — persist a finished slice's public surface (exports /
|
|
4
|
+
// types / publicSignatures) to
|
|
5
|
+
// `.peaks/_runtime/<sessionId>/dispatch/contracts/<slice-id>.json`, where the
|
|
6
|
+
// orchestrator picks it up on the next dispatch run. Extracted from
|
|
7
|
+
// `governance-classify-contract-commands.ts` (which had merged
|
|
8
|
+
// `contract-commands.ts` and `classify-classify-commands.ts` verbatim); the
|
|
9
|
+
// registered name, description, options, refusal codes and envelope are
|
|
10
|
+
// unchanged.
|
|
11
|
+
//
|
|
12
|
+
// The guards and the write are separate functions because the merged file had
|
|
13
|
+
// all three inline in one 151-line registrar, and every branch there was over
|
|
14
|
+
// the per-function line cap on its own.
|
|
15
|
+
import { fail, getErrorMessage, ok } from 'peaks-loop-shared/result';
|
|
16
|
+
import { writeContract } from '../../services/dispatch/contract-store.js';
|
|
17
|
+
import { getCurrentSessionId } from '../../services/skills/skill-presence-service.js';
|
|
18
|
+
import { addJsonOption, printResult } from '../cli-helpers.js';
|
|
19
|
+
const INPUT_LIMIT_BYTES = 256 * 1024;
|
|
20
|
+
/** Split a comma-separated flag value into a trimmed string array. */
|
|
21
|
+
function splitCsv(value) {
|
|
22
|
+
if (value === undefined)
|
|
23
|
+
return [];
|
|
24
|
+
return value
|
|
25
|
+
.split(',')
|
|
26
|
+
.map((s) => s.trim())
|
|
27
|
+
.filter((s) => s.length > 0);
|
|
28
|
+
}
|
|
29
|
+
export function registerContractCommands(program, io) {
|
|
30
|
+
const contract = program
|
|
31
|
+
.command('contract')
|
|
32
|
+
.description('Slice contract store (skill-first / CLI-auxiliary). These commands ' +
|
|
33
|
+
'are primitives that peaks-code / peaks-rd SKILL.md compose. The LLM-side ' +
|
|
34
|
+
'runner (the IDE-resident sub-agent that finished a slice) calls ' +
|
|
35
|
+
"`peaks contract write` to persist the slice's public surface; the " +
|
|
36
|
+
'orchestrator picks it up on the next dispatch run via listContracts() ' +
|
|
37
|
+
'and splices it into downstream prompts via formatContractInjection().');
|
|
38
|
+
addJsonOption(contractWriteCommand(contract)).action((options) => {
|
|
39
|
+
const envelope = contractWriteEnvelope(options);
|
|
40
|
+
printResult(io, envelope, options.json === true);
|
|
41
|
+
if (!envelope.ok)
|
|
42
|
+
process.exitCode = 1;
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
// peaks contract write --project <root> --session-id <sid>
|
|
46
|
+
// --slice-id <id> --exports <a,b> --types <x,y> --signatures <s1,s2>
|
|
47
|
+
// [--broadcast-to <b1,b2>] [--completed-at <iso>]
|
|
48
|
+
function contractWriteCommand(contract) {
|
|
49
|
+
return contract
|
|
50
|
+
.command('write')
|
|
51
|
+
.description("2.7.0 slice-dag-dispatcher MVP: persist a finished slice's public " +
|
|
52
|
+
'surface (exports / types / publicSignatures) to disk at ' +
|
|
53
|
+
'.peaks/_runtime/<sessionId>/dispatch/contracts/<slice-id>.json. ' +
|
|
54
|
+
'The orchestrator picks it up on the next dispatch run. Idempotent: ' +
|
|
55
|
+
're-running with the same inputs overwrites in place; the SHA-256 ' +
|
|
56
|
+
'contractHash is content-derived so a contract write from a different ' +
|
|
57
|
+
'runner (re-execution) is detected as a content change.')
|
|
58
|
+
.option('--project <path>', 'target project root (defaults to cwd)')
|
|
59
|
+
.option('--session-id <sid>', 'session id (default: resolve from .peaks/_runtime/session.json; falls back to PEAKS_SESSION_ID env var; final fallback "unknown-sid")')
|
|
60
|
+
.requiredOption('--slice-id <id>', 'slice id; must be non-empty; used as the contract filename basename')
|
|
61
|
+
.option('--exports <list>', 'comma-separated public export names (e.g. "validateDag,topologicalLevels")')
|
|
62
|
+
.option('--types <list>', 'comma-separated public type names (e.g. "SliceDag,SliceNode")')
|
|
63
|
+
.option('--signatures <list>', 'comma-separated public function/method signatures (e.g. "validateDag(dag: SliceDag): void")')
|
|
64
|
+
.option('--broadcast-to <list>', 'comma-separated downstream slice ids that should auto-inherit this contract (e.g. "B,C")')
|
|
65
|
+
.option('--completed-at <iso>', 'ISO 8601 timestamp; defaults to now()');
|
|
66
|
+
}
|
|
67
|
+
/** The written-contract envelope, or the refusal the caller earned. */
|
|
68
|
+
function contractWriteEnvelope(options) {
|
|
69
|
+
const projectRoot = options.project ?? process.cwd();
|
|
70
|
+
const sid = options.sessionId ??
|
|
71
|
+
process.env['PEAKS_SESSION_ID'] ??
|
|
72
|
+
getCurrentSessionId(projectRoot) ??
|
|
73
|
+
'unknown-sid';
|
|
74
|
+
const lists = {
|
|
75
|
+
exports: splitCsv(options.exports),
|
|
76
|
+
types: splitCsv(options.types),
|
|
77
|
+
signatures: splitCsv(options.signatures),
|
|
78
|
+
broadcastTo: splitCsv(options.broadcastTo)
|
|
79
|
+
};
|
|
80
|
+
const refusal = contractWriteRefusal(options, sid, lists);
|
|
81
|
+
if (refusal !== null)
|
|
82
|
+
return refusal;
|
|
83
|
+
try {
|
|
84
|
+
const result = writeContract(projectRoot, sid, contractWriteInput(options, sid, lists));
|
|
85
|
+
return ok('contract.write', contractWriteData(result), [], [
|
|
86
|
+
'Contract written; orchestrator will pick it up on the next `peaks sub-agent dispatch --from-dag` run.',
|
|
87
|
+
'Re-running with the same inputs is idempotent (overwrites in place).'
|
|
88
|
+
]);
|
|
89
|
+
}
|
|
90
|
+
catch (err) {
|
|
91
|
+
return fail('contract.write', 'WRITE_ERROR', getErrorMessage(err), { path: null, contract: null }, [
|
|
92
|
+
'See error message; check that --project is a writable directory and --slice-id is a valid filename basename (no path separators).'
|
|
93
|
+
]);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* The `writeContract` input: `--broadcast-to` and `--completed-at` ride only
|
|
98
|
+
* when the caller set them, so an absent flag never becomes an empty value.
|
|
99
|
+
*/
|
|
100
|
+
function contractWriteInput(options, sid, lists) {
|
|
101
|
+
return {
|
|
102
|
+
// The refusal above already rejected `undefined` / empty.
|
|
103
|
+
sliceId: options.sliceId,
|
|
104
|
+
sessionId: sid,
|
|
105
|
+
exports: lists.exports,
|
|
106
|
+
types: lists.types,
|
|
107
|
+
publicSignatures: lists.signatures,
|
|
108
|
+
...(lists.broadcastTo.length > 0 ? { broadcastTo: lists.broadcastTo } : {}),
|
|
109
|
+
...(options.completedAt !== undefined ? { completedAt: options.completedAt } : {})
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
/** The written contract, counted per surface — never the raw store row. */
|
|
113
|
+
function contractWriteData(result) {
|
|
114
|
+
return {
|
|
115
|
+
path: result.path,
|
|
116
|
+
contractHash: result.contract.contractHash,
|
|
117
|
+
sliceId: result.contract.sliceId,
|
|
118
|
+
sessionId: result.contract.sessionId,
|
|
119
|
+
completedAt: result.contract.completedAt,
|
|
120
|
+
exportCount: result.contract.exports.length,
|
|
121
|
+
typeCount: result.contract.types.length,
|
|
122
|
+
signatureCount: result.contract.publicSignatures.length,
|
|
123
|
+
broadcastTo: result.contract.broadcastTo ?? []
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
/** The two pre-write refusals (missing slice id, oversized input), or `null`. */
|
|
127
|
+
function contractWriteRefusal(options, sid, lists) {
|
|
128
|
+
const sliceId = options.sliceId;
|
|
129
|
+
if (sliceId === undefined || sliceId.length === 0) {
|
|
130
|
+
return fail('contract.write', 'MISSING_SLICE_ID', '--slice-id is required', { path: null, contract: null }, ['Re-run with --slice-id <id> (must be non-empty; used as the contract filename basename).']);
|
|
131
|
+
}
|
|
132
|
+
// Cap the combined input to protect the file IO from runaway values
|
|
133
|
+
// (e.g. a 10MB comma-separated --signatures flag).
|
|
134
|
+
const inputSize = sliceId.length +
|
|
135
|
+
sid.length +
|
|
136
|
+
lists.exports.join(',').length +
|
|
137
|
+
lists.types.join(',').length +
|
|
138
|
+
lists.signatures.join(',').length +
|
|
139
|
+
lists.broadcastTo.join(',').length +
|
|
140
|
+
(options.completedAt?.length ?? 0);
|
|
141
|
+
if (inputSize <= INPUT_LIMIT_BYTES)
|
|
142
|
+
return null;
|
|
143
|
+
return fail('contract.write', 'INPUT_TOO_LARGE', `combined input size ${inputSize} bytes exceeds ${INPUT_LIMIT_BYTES} (likely oversized --exports/--types/--signatures lists)`, { path: null, contract: null }, ['Split the slice into smaller surfaces or omit optional fields.']);
|
|
144
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export type BindingSource = 'canonical' | 'legacy';
|
|
2
|
+
/** One stale entry in the project-level binding. */
|
|
3
|
+
export type StaleInstance = {
|
|
4
|
+
sid: string;
|
|
5
|
+
callerId: string;
|
|
6
|
+
lastHeartbeat: string;
|
|
7
|
+
};
|
|
8
|
+
export declare const STALE_TTL_MS = 300000;
|
|
9
|
+
export declare function listStaleInstances(projectRoot: string, ttlMs?: number): StaleInstance[];
|
|
10
|
+
/** The `staleBinding` block every doctor envelope carries. */
|
|
11
|
+
export declare function staleBindingSection(ttlMs: number, staleInstances: readonly StaleInstance[], droppedStale: readonly string[]): {
|
|
12
|
+
ttlMs: number;
|
|
13
|
+
staleCount: number;
|
|
14
|
+
staleInstances: readonly StaleInstance[];
|
|
15
|
+
droppedCount: number;
|
|
16
|
+
droppedSids: readonly string[];
|
|
17
|
+
};
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { readBinding } from '../../../services/session/binding-store.js';
|
|
2
|
+
// threshold is exposed as a CLI flag so users can tune it for
|
|
3
|
+
// long-running sessions. 300000 ms = 5 minutes.
|
|
4
|
+
export const STALE_TTL_MS = 300_000;
|
|
5
|
+
// in the project-level binding. Used by `peaks doctor` and surfaced as
|
|
6
|
+
// a warning in the report. Returns the stale entry descriptors.
|
|
7
|
+
export function listStaleInstances(projectRoot, ttlMs = STALE_TTL_MS) {
|
|
8
|
+
const binding = readBinding(projectRoot);
|
|
9
|
+
if (!binding)
|
|
10
|
+
return [];
|
|
11
|
+
const cutoff = Date.now() - ttlMs;
|
|
12
|
+
const stale = [];
|
|
13
|
+
for (const [sid, inst] of Object.entries(binding.instances)) {
|
|
14
|
+
const t = Date.parse(inst.lastHeartbeat);
|
|
15
|
+
if (Number.isFinite(t) && t < cutoff) {
|
|
16
|
+
stale.push({ sid, callerId: inst.callerId, lastHeartbeat: inst.lastHeartbeat });
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
return stale;
|
|
20
|
+
}
|
|
21
|
+
/** The `staleBinding` block every doctor envelope carries. */
|
|
22
|
+
export function staleBindingSection(ttlMs, staleInstances, droppedStale) {
|
|
23
|
+
return {
|
|
24
|
+
ttlMs,
|
|
25
|
+
staleCount: staleInstances.length,
|
|
26
|
+
staleInstances,
|
|
27
|
+
droppedCount: droppedStale.length,
|
|
28
|
+
droppedSids: droppedStale
|
|
29
|
+
};
|
|
30
|
+
}
|
|
@@ -1,18 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
* full message) and the stale-binding instance list collapse to counts +
|
|
6
|
-
* names-of-first-N; the summary counters and log section are scalars and are
|
|
7
|
-
* kept verbatim. ≤ 2 KB by construction.
|
|
8
|
-
*/
|
|
9
|
-
export declare function buildDoctorSummary(data: Record<string, unknown>): Record<string, unknown>;
|
|
10
|
-
export type BindingSource = 'canonical' | 'legacy';
|
|
11
|
-
export type DoctorLogsSection = {
|
|
12
|
-
logDir: string;
|
|
13
|
-
todayFile: string;
|
|
14
|
-
sizeBytes: number;
|
|
15
|
-
retentionDays: number;
|
|
16
|
-
level: string;
|
|
17
|
-
};
|
|
18
|
-
export declare function registerDoctorCommand(program: Command, io: ProgramIO): void;
|
|
1
|
+
export type { BindingSource, StaleInstance } from './doctor-bindings.js';
|
|
2
|
+
export type { DoctorLogsSection } from './doctor-logs.js';
|
|
3
|
+
export { buildDoctorSummary } from './doctor-summary.js';
|
|
4
|
+
export { registerDoctorCommand } from './doctor-run-command.js';
|