peaks-loop 4.0.0-beta.9 → 4.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +910 -141
- package/README-en.md +26 -7
- package/README.md +75 -6
- package/agents/karpathy-reviewer.md +33 -0
- package/bin/peaks.js +0 -0
- package/dist/cli/cli-helpers.d.ts +31 -6
- package/dist/cli/cli-helpers.js +48 -25
- package/dist/cli/commands/_register.d.ts +3 -0
- package/dist/cli/commands/_register.js +139 -0
- package/dist/cli/commands/_super.d.ts +10 -0
- package/dist/cli/commands/_super.js +97 -0
- package/dist/cli/commands/adapter-commands-s2a.js +1 -1
- package/dist/cli/commands/asset-commands.js +33 -16
- package/dist/cli/commands/audit-commands.js +2 -2
- package/dist/cli/commands/autonomous-swarm-commands.d.ts +12 -0
- package/dist/cli/commands/autonomous-swarm-commands.js +120 -0
- package/dist/cli/commands/bee-commands.js +1 -1
- package/dist/cli/commands/capability-commands.js +1 -1
- package/dist/cli/commands/capability-worker-config-sc-commands.js +0 -2
- package/dist/cli/commands/changeset-commands.d.ts +13 -0
- package/dist/cli/commands/changeset-commands.js +46 -0
- package/dist/cli/commands/code-commands.d.ts +11 -1
- package/dist/cli/commands/code-commands.js +19 -699
- package/dist/cli/commands/code-job-shape-commands.d.ts +9 -0
- package/dist/cli/commands/code-job-shape-commands.js +164 -0
- package/dist/cli/commands/code-mode-gate-commands.d.ts +9 -0
- package/dist/cli/commands/code-mode-gate-commands.js +223 -0
- package/dist/cli/commands/code-review-commands.js +2 -2
- package/dist/cli/commands/code-run-command.d.ts +12 -0
- package/dist/cli/commands/code-run-command.js +68 -0
- package/dist/cli/commands/code-runtime-commands.d.ts +11 -0
- package/dist/cli/commands/code-runtime-commands.js +391 -0
- package/dist/cli/commands/codegraph-commands.js +1 -1
- package/dist/cli/commands/compact-command.js +53 -1
- package/dist/cli/commands/complexity-commands.js +1 -1
- package/dist/cli/commands/config-commands.js +4 -75
- package/dist/cli/commands/container-commands.d.ts +28 -0
- package/dist/cli/commands/container-commands.js +221 -0
- package/dist/cli/commands/context-commands.js +3 -2
- package/dist/cli/commands/core/artifacts-command.js +1 -1
- package/dist/cli/commands/core/binding-commands.js +1 -1
- package/dist/cli/commands/core/doctor-command.js +63 -3
- package/dist/cli/commands/core/memory-command.js +1 -1
- package/dist/cli/commands/core/profile-command.js +1 -1
- package/dist/cli/commands/core/proxy-command.js +1 -1
- package/dist/cli/commands/core/session-command.js +9 -7
- package/dist/cli/commands/core/skill-command.js +7 -4
- package/dist/cli/commands/core/standards-command.js +1 -1
- package/dist/cli/commands/cron-commands.d.ts +57 -0
- package/dist/cli/commands/cron-commands.js +257 -0
- package/dist/cli/commands/cron-scheduler-commands.d.ts +47 -0
- package/dist/cli/commands/cron-scheduler-commands.js +284 -0
- package/dist/cli/commands/dashboard-commands.d.ts +4 -0
- package/dist/cli/commands/dashboard-commands.js +10 -0
- package/dist/cli/commands/dashboard-long-run.d.ts +25 -0
- package/dist/cli/commands/dashboard-long-run.js +122 -0
- package/dist/cli/commands/dashboard-summary.d.ts +12 -0
- package/dist/cli/commands/dashboard-summary.js +58 -0
- package/dist/cli/commands/dispatch-commands.d.ts +0 -7
- package/dist/cli/commands/dispatch-commands.js +372 -8
- package/dist/cli/commands/dispatch-from-dag.js +4 -1
- package/dist/cli/commands/doc-commands.js +1 -1
- package/dist/cli/commands/ecc-commands.d.ts +30 -0
- package/dist/cli/commands/ecc-commands.js +119 -0
- package/dist/cli/commands/evolution-commands.js +1 -1
- package/dist/cli/commands/feedback-commands.js +1 -1
- package/dist/cli/commands/final-review-commands.js +1 -1
- package/dist/cli/commands/fixture-commands.js +1 -1
- package/dist/cli/commands/fork-commands.js +1 -1
- package/dist/cli/commands/gate-commands.js +128 -6
- package/dist/cli/commands/governance-classify-contract-commands.d.ts +21 -0
- package/dist/cli/commands/governance-classify-contract-commands.js +273 -0
- package/dist/cli/commands/heartbeat-commands.js +76 -5
- package/dist/cli/commands/heartbeat-watch-command.d.ts +31 -0
- package/dist/cli/commands/heartbeat-watch-command.js +146 -0
- package/dist/cli/commands/hook-handle.js +1 -1
- package/dist/cli/commands/hooks-commands.js +126 -10
- package/dist/cli/commands/ide-commands.js +1 -1
- package/dist/cli/commands/impact-commands.js +1 -1
- package/dist/cli/commands/job-commands.js +34 -1
- package/dist/cli/commands/lease-metrics-commands.d.ts +67 -0
- package/dist/cli/commands/lease-metrics-commands.js +231 -0
- package/dist/cli/commands/lease-stats-commands.d.ts +65 -0
- package/dist/cli/commands/lease-stats-commands.js +107 -0
- package/dist/cli/commands/legacy-commands.js +1 -1
- package/dist/cli/commands/log-commands.js +1 -1
- package/dist/cli/commands/loop-commands.js +1 -1
- package/dist/cli/commands/loop-eval-commands.js +1 -1
- package/dist/cli/commands/memory-commands.js +1 -1
- package/dist/cli/commands/migrate-1-4-1-command.js +1 -1
- package/dist/cli/commands/migrate-v2-10-to-v2-11-command.js +1 -1
- package/dist/cli/commands/mut-commands.d.ts +1 -1
- package/dist/cli/commands/mut-commands.js +1 -5
- package/dist/cli/commands/observability-commands.js +1 -1
- package/dist/cli/commands/openspec-commands.js +65 -4
- package/dist/cli/commands/perf-audit-commands.js +3 -3
- package/dist/cli/commands/perf-commands.js +1 -1
- package/dist/cli/commands/polyrepo-commands.js +1 -1
- package/dist/cli/commands/prd-blocks-commands.js +1 -1
- package/dist/cli/commands/prd-commands.js +4 -2
- package/dist/cli/commands/preferences-commands.js +23 -3
- package/dist/cli/commands/project-commands.js +1 -1
- package/dist/cli/commands/qa-business-review-commands.js +1 -1
- package/dist/cli/commands/qa-commands.d.ts +1 -1
- package/dist/cli/commands/qa-commands.js +39 -3
- package/dist/cli/commands/release-commands.d.ts +15 -0
- package/dist/cli/commands/release-commands.js +113 -21
- package/dist/cli/commands/request-commands.js +1 -1
- package/dist/cli/commands/retrospective-commands.js +1 -1
- package/dist/cli/commands/reviewer-commands.js +1 -1
- package/dist/cli/commands/role-commands.js +1 -1
- package/dist/cli/commands/runtime-commands-helpers.d.ts +7 -0
- package/dist/cli/commands/runtime-commands-helpers.js +24 -0
- package/dist/cli/commands/runtime-commands.js +1 -2
- package/dist/cli/commands/sc-commands.js +4 -2
- package/dist/cli/commands/scan-commands.js +1 -1
- package/dist/cli/commands/security-audit-commands.js +3 -3
- package/dist/cli/commands/sediment-commands.js +10 -1
- package/dist/cli/commands/session-24h-mode.d.ts +26 -0
- package/dist/cli/commands/session-24h-mode.js +196 -0
- package/dist/cli/commands/share-commands.d.ts +19 -0
- package/dist/cli/commands/share-commands.js +121 -2
- package/dist/cli/commands/skill-conformance-commands.js +1 -1
- package/dist/cli/commands/skill-loop-engineering-readiness-commands.js +1 -1
- package/dist/cli/commands/skill-search-commands.js +4 -1
- package/dist/cli/commands/slice-commands.js +1 -1
- package/dist/cli/commands/slice-integrate-commands.js +1 -1
- package/dist/cli/commands/slice-review-commands.js +1 -1
- package/dist/cli/commands/smoke-commands.js +1 -1
- package/dist/cli/commands/sop-commands.js +1 -1
- package/dist/cli/commands/spill-demo-command.d.ts +7 -0
- package/dist/cli/commands/spill-demo-command.js +29 -0
- package/dist/cli/commands/statusline-commands.d.ts +12 -0
- package/dist/cli/commands/statusline-commands.js +79 -17
- package/dist/cli/commands/sub-agent-commands.js +2 -1
- package/dist/cli/commands/sub-agent-shared.d.ts +10 -0
- package/dist/cli/commands/sub-agent-shared.js +24 -1
- package/dist/cli/commands/swarm-commands.d.ts +13 -0
- package/dist/cli/commands/swarm-commands.js +77 -0
- package/dist/cli/commands/tech-commands.d.ts +64 -0
- package/dist/cli/commands/tech-commands.js +195 -0
- package/dist/cli/commands/understand-commands.js +1 -1
- package/dist/cli/commands/upgrade-commands.d.ts +2 -0
- package/dist/cli/commands/upgrade-commands.js +40 -5
- package/dist/cli/commands/user-touchpoint-commands.js +1 -1
- package/dist/cli/commands/verdict-aggregate-command.js +1 -1
- package/dist/cli/commands/vm-commands.d.ts +31 -0
- package/dist/cli/commands/vm-commands.js +274 -0
- package/dist/cli/commands/workflow-commands.js +24 -1
- package/dist/cli/commands/workflow-plan-commands.js +1 -1
- package/dist/cli/commands/workspace/init-command.js +1 -1
- package/dist/cli/commands/workspace/migrate-command.js +1 -1
- package/dist/cli/commands/workspace/reconcile-command.js +1 -1
- package/dist/cli/commands/worktree-auth-commands.d.ts +29 -0
- package/dist/cli/commands/worktree-auth-commands.js +652 -0
- package/dist/cli/index.js +58 -13
- package/dist/cli/program.d.ts +2 -2
- package/dist/cli/program.js +86 -281
- package/dist/services/24h-mode/decider.d.ts +103 -0
- package/dist/services/24h-mode/decider.js +144 -0
- package/dist/services/24h-mode/index.d.ts +12 -0
- package/dist/services/24h-mode/index.js +12 -0
- package/dist/services/24h-mode/state.d.ts +48 -0
- package/dist/services/24h-mode/state.js +51 -0
- package/dist/services/24h-mode/store.d.ts +27 -0
- package/dist/services/24h-mode/store.js +119 -0
- package/dist/services/artifacts/artifact-prerequisites.js +1 -1
- package/dist/services/artifacts/request-artifact-service.js +1 -1
- package/dist/services/artifacts/workspace-service.js +1 -1
- package/dist/services/audit/enforcers/lint-bee-runtime-contract.d.ts +25 -0
- package/dist/services/audit/enforcers/lint-bee-runtime-contract.js +91 -0
- package/dist/services/audit/enforcers/lint-peaks-code-runtime.d.ts +16 -0
- package/dist/services/audit/enforcers/lint-peaks-code-runtime.js +31 -0
- package/dist/services/audit/enforcers/lint-peaks-skill-runtime.d.ts +23 -0
- package/dist/services/audit/enforcers/lint-peaks-skill-runtime.js +59 -0
- package/dist/services/audit/enforcers/lint-peaks-ui-sc-txt-runtime.d.ts +28 -0
- package/dist/services/audit/enforcers/lint-peaks-ui-sc-txt-runtime.js +86 -0
- package/dist/services/audit/enforcers/lint-prd-artifact-handoff.d.ts +16 -0
- package/dist/services/audit/enforcers/lint-prd-artifact-handoff.js +41 -0
- package/dist/services/audit/enforcers/lint-prd-source-snapshot.d.ts +27 -0
- package/dist/services/audit/enforcers/lint-prd-source-snapshot.js +47 -0
- package/dist/services/audit/enforcers/lint-qa-gateguard-and-runtime.d.ts +19 -0
- package/dist/services/audit/enforcers/lint-qa-gateguard-and-runtime.js +47 -0
- package/dist/services/audit/enforcers/lint-rd-handoff-coverage.d.ts +18 -0
- package/dist/services/audit/enforcers/lint-rd-handoff-coverage.js +70 -0
- package/dist/services/audit/enforcers/lint-skill-presence-mandatory.d.ts +25 -0
- package/dist/services/audit/enforcers/lint-skill-presence-mandatory.js +53 -0
- package/dist/services/audit/red-line-catalog-p2-a.d.ts +0 -6
- package/dist/services/audit/red-line-catalog-p2-a.js +230 -1
- package/dist/services/audit/static-service.d.ts +32 -25
- package/dist/services/audit/static-service.js +30 -109
- package/dist/services/audit-independent/index.d.ts +2 -0
- package/dist/services/audit-independent/index.js +2 -0
- package/dist/services/autonomous-swarm/autonomous-swarm-service.d.ts +127 -0
- package/dist/services/autonomous-swarm/autonomous-swarm-service.js +446 -0
- package/dist/services/changeset/changeset-check-service.d.ts +22 -0
- package/dist/services/changeset/changeset-check-service.js +47 -0
- package/dist/services/code/auto-compact-modes.d.ts +30 -0
- package/dist/services/code/auto-compact-modes.js +38 -0
- package/dist/services/code/auto-compact-orchestrator.d.ts +43 -5
- package/dist/services/code/auto-compact-orchestrator.js +101 -21
- package/dist/services/code/dag-orchestrator.d.ts +30 -1
- package/dist/services/code/dag-orchestrator.js +106 -1
- package/dist/services/code/status-line-renderer.d.ts +2 -0
- package/dist/services/code/status-line-renderer.js +21 -3
- package/dist/services/code-review/ocr-service.d.ts +1 -1
- package/dist/services/code-review/ocr-service.js +6 -3
- package/dist/services/compact-history/compact-history-service.d.ts +41 -0
- package/dist/services/compact-history/compact-history-service.js +62 -0
- package/dist/services/compact-statusline/compact-statusline-service.d.ts +16 -0
- package/dist/services/compact-statusline/compact-statusline-service.js +83 -0
- package/dist/services/config/config-service.d.ts +1 -12
- package/dist/services/config/config-service.js +3 -72
- package/dist/services/config/config-types.d.ts +2 -4
- package/dist/services/config/config-types.js +1 -1
- package/dist/services/container/container-lease.d.ts +67 -0
- package/dist/services/container/container-lease.js +135 -0
- package/dist/services/context/auto-compact-dispatcher.d.ts +40 -5
- package/dist/services/context/auto-compact-dispatcher.js +32 -102
- package/dist/services/context/auto-compact-reader.js +1 -1
- package/dist/services/context/auto-compact-types.d.ts +27 -2
- package/dist/services/context/auto-compact-types.js +8 -1
- package/dist/services/context/build-dispatch-system-prompt.d.ts +75 -0
- package/dist/services/context/build-dispatch-system-prompt.js +117 -0
- package/dist/services/context/collector.d.ts +2 -2
- package/dist/services/context/context-builder.d.ts +4 -4
- package/dist/services/context/context-schema.d.ts +48 -48
- package/dist/services/context/ide-detect.d.ts +4 -0
- package/dist/services/context/ide-detect.js +24 -0
- package/dist/services/context/main-session-monitor.d.ts +1 -4
- package/dist/services/context/main-session-monitor.js +1 -24
- package/dist/services/context/memory-index-reader.d.ts +8 -0
- package/dist/services/context/memory-index-reader.js +57 -0
- package/dist/services/context/memory-lru-cache.d.ts +12 -0
- package/dist/services/context/memory-lru-cache.js +60 -0
- package/dist/services/context/memory-preflight-config.d.ts +19 -0
- package/dist/services/context/memory-preflight-config.js +25 -0
- package/dist/services/context/memory-preflight-service.d.ts +19 -0
- package/dist/services/context/memory-preflight-service.js +120 -0
- package/dist/services/context/spillover-store.d.ts +23 -0
- package/dist/services/context/spillover-store.js +155 -0
- package/dist/services/context/spillover-types.d.ts +18 -0
- package/dist/services/context/spillover-types.js +1 -0
- package/dist/services/crystallization/crystallization-service.d.ts +22 -5
- package/dist/services/crystallization/crystallization-service.js +8 -14
- package/dist/services/crystallization/crystallization-types.d.ts +6 -6
- package/dist/services/crystallization/evidence-brief-builder.d.ts +1 -1
- package/dist/services/crystallization/index.d.ts +13 -0
- package/dist/services/crystallization/index.js +13 -0
- package/dist/services/dashboard/project-dashboard-service.js +2 -2
- package/dist/services/dispatch/await-batch.d.ts +70 -0
- package/dist/services/dispatch/await-batch.js +272 -0
- package/dist/services/dispatch/batch-counter.js +1 -1
- package/dist/services/dispatch/dispatch-record-writer.d.ts +126 -4
- package/dist/services/dispatch/dispatch-record-writer.js +239 -9
- package/dist/services/dispatch/slice-dag.d.ts +46 -0
- package/dist/services/dispatch/slice-dag.js +6 -0
- package/dist/services/dispatch/stage-enum.d.ts +27 -0
- package/dist/services/dispatch/stage-enum.js +48 -0
- package/dist/services/dispatch/startup-timeout.d.ts +86 -0
- package/dist/services/dispatch/startup-timeout.js +97 -0
- package/dist/services/dispatch/sub-agent-dispatcher.js +40 -89
- package/dist/services/dispatch/test-tool-detection.d.ts +25 -1
- package/dist/services/dispatch/test-tool-detection.js +80 -0
- package/dist/services/doctor/doctor-service/checks/check-id-schema.d.ts +18 -0
- package/dist/services/doctor/doctor-service/checks/check-id-schema.js +64 -0
- package/dist/services/doctor/doctor-service/checks/codegraph-capability.d.ts +14 -0
- package/dist/services/doctor/doctor-service/checks/codegraph-capability.js +69 -0
- package/dist/services/doctor/doctor-service/checks/dist-source-version.d.ts +32 -0
- package/dist/services/doctor/doctor-service/checks/dist-source-version.js +110 -0
- package/dist/services/doctor/doctor-service/checks/gateguard-conflict.d.ts +24 -0
- package/dist/services/doctor/doctor-service/checks/gateguard-conflict.js +164 -0
- package/dist/services/doctor/doctor-service/checks/l3-memory-health.d.ts +16 -0
- package/dist/services/doctor/doctor-service/checks/l3-memory-health.js +57 -0
- package/dist/services/doctor/doctor-service/checks/l3-orphan-sessions.d.ts +19 -0
- package/dist/services/doctor/doctor-service/checks/l3-orphan-sessions.js +66 -0
- package/dist/services/doctor/doctor-service/checks/schema-validity.d.ts +10 -0
- package/dist/services/doctor/doctor-service/checks/schema-validity.js +33 -0
- package/dist/services/doctor/doctor-service/checks/skill-apply-note.d.ts +20 -0
- package/dist/services/doctor/doctor-service/checks/skill-apply-note.js +85 -0
- package/dist/services/doctor/doctor-service/checks/skill-existence.d.ts +13 -0
- package/dist/services/doctor/doctor-service/checks/skill-existence.js +30 -0
- package/dist/services/doctor/doctor-service/checks/skill-name-match.d.ts +10 -0
- package/dist/services/doctor/doctor-service/checks/skill-name-match.js +25 -0
- package/dist/services/doctor/doctor-service/checks/skill-parse.d.ts +10 -0
- package/dist/services/doctor/doctor-service/checks/skill-parse.js +19 -0
- package/dist/services/doctor/doctor-service/checks/skill-presence.d.ts +21 -0
- package/dist/services/doctor/doctor-service/checks/skill-presence.js +75 -0
- package/dist/services/doctor/doctor-service/checks/skill-runbook.d.ts +14 -0
- package/dist/services/doctor/doctor-service/checks/skill-runbook.js +47 -0
- package/dist/services/doctor/doctor-service/checks/statusline-install.d.ts +14 -0
- package/dist/services/doctor/doctor-service/checks/statusline-install.js +32 -0
- package/dist/services/doctor/doctor-service/checks/statusline-runtime.d.ts +13 -0
- package/dist/services/doctor/doctor-service/checks/statusline-runtime.js +30 -0
- package/dist/services/doctor/doctor-service/checks/user-config.d.ts +11 -0
- package/dist/services/doctor/doctor-service/checks/user-config.js +27 -0
- package/dist/services/doctor/doctor-service/checks/workspace-init.d.ts +16 -0
- package/dist/services/doctor/doctor-service/checks/workspace-init.js +34 -0
- package/dist/services/doctor/doctor-service/checks/workspace-layout.d.ts +33 -0
- package/dist/services/doctor/doctor-service/checks/workspace-layout.js +180 -0
- package/dist/services/doctor/doctor-service/index.d.ts +48 -0
- package/dist/services/doctor/doctor-service/index.js +254 -0
- package/dist/services/doctor/doctor-service/plugin-registry.d.ts +41 -0
- package/dist/services/doctor/doctor-service/plugin-registry.js +77 -0
- package/dist/services/doctor/doctor-service/report/final-summary.d.ts +20 -0
- package/dist/services/doctor/doctor-service/report/final-summary.js +29 -0
- package/dist/services/doctor/doctor-service/types.d.ts +245 -0
- package/dist/services/doctor/doctor-service/types.js +15 -0
- package/dist/services/doctor/doctor-service.d.ts +15 -146
- package/dist/services/doctor/doctor-service.js +22 -926
- package/dist/services/doctor/index.d.ts +22 -0
- package/dist/services/doctor/index.js +22 -0
- package/dist/services/env/shell-probe.d.ts +71 -0
- package/dist/services/env/shell-probe.js +161 -0
- package/dist/services/evolution/evolution-types.d.ts +39 -39
- package/dist/services/final-review/final-review-service.d.ts +11 -1
- package/dist/services/final-review/index.d.ts +2 -0
- package/dist/services/final-review/index.js +1 -0
- package/dist/services/hooks/auto-compact-hook-install.d.ts +4 -5
- package/dist/services/hooks/auto-compact-hook-install.js +4 -5
- package/dist/services/hooks/worktree-authorization-gate.d.ts +205 -0
- package/dist/services/hooks/worktree-authorization-gate.js +492 -0
- package/dist/services/ide/adapters/claude-code-adapter.js +2 -2
- package/dist/services/ide/adapters/qoder-adapter.d.ts +25 -0
- package/dist/services/ide/adapters/qoder-adapter.js +57 -0
- package/dist/services/ide/adapters/tongyi-lingma-adapter.d.ts +16 -0
- package/dist/services/ide/adapters/tongyi-lingma-adapter.js +45 -0
- package/dist/services/ide/ide-registry.js +6 -0
- package/dist/services/ide/ide-types.d.ts +1 -1
- package/dist/services/job/job-types.d.ts +56 -56
- package/dist/services/job-snapshot/index.d.ts +8 -0
- package/dist/services/job-snapshot/index.js +7 -0
- package/dist/services/{job/job-resource-snapshot.d.ts → job-snapshot/snapshot.d.ts} +1 -1
- package/dist/services/job-snapshot/types.d.ts +7 -0
- package/dist/services/job-snapshot/types.js +1 -0
- package/dist/services/karpathy-cost/karpathy-cost-check-service.d.ts +67 -0
- package/dist/services/karpathy-cost/karpathy-cost-check-service.js +108 -0
- package/dist/services/log/retention.d.ts +16 -0
- package/dist/services/log/retention.js +17 -0
- package/dist/services/loop/loop-bee-relation-types.d.ts +6 -6
- package/dist/services/loop/loop-release-types.d.ts +24 -24
- package/dist/services/loop/monotonic-runner.d.ts +17 -11
- package/dist/services/loop/monotonic-runner.js +118 -79
- package/dist/services/memory/project-memory-service/index/kind-dispatch.d.ts +8 -0
- package/dist/services/memory/project-memory-service/index/kind-dispatch.js +253 -0
- package/dist/services/memory/project-memory-service/index/ranking.d.ts +6 -0
- package/dist/services/memory/project-memory-service/index/ranking.js +171 -0
- package/dist/services/memory/project-memory-service/index/search.d.ts +34 -0
- package/dist/services/memory/project-memory-service/index/search.js +194 -0
- package/dist/services/memory/project-memory-service/index.d.ts +9 -0
- package/dist/services/memory/project-memory-service/index.js +24 -0
- package/dist/services/memory/project-memory-service/parsers/frontmatter.d.ts +9 -0
- package/dist/services/memory/project-memory-service/parsers/frontmatter.js +106 -0
- package/dist/services/memory/project-memory-service/parsers/markdown-pure.d.ts +7 -0
- package/dist/services/memory/project-memory-service/parsers/markdown-pure.js +96 -0
- package/dist/services/memory/project-memory-service/store/atomic-write.d.ts +5 -0
- package/dist/services/memory/project-memory-service/store/atomic-write.js +56 -0
- package/dist/services/memory/project-memory-service/store/paths.d.ts +8 -0
- package/dist/services/memory/project-memory-service/store/paths.js +116 -0
- package/dist/services/memory/project-memory-service/types.d.ts +128 -0
- package/dist/services/memory/project-memory-service/types.js +9 -0
- package/dist/services/memory/project-memory-service.d.ts +1 -167
- package/dist/services/memory/project-memory-service.js +19 -816
- package/dist/services/migrate-skill-name/schema.d.ts +2 -2
- package/dist/services/observability/aggregation.d.ts +27 -0
- package/dist/services/observability/aggregation.js +72 -0
- package/dist/services/observability/observability-service.d.ts +73 -7
- package/dist/services/observability/observability-service.js +87 -1
- package/dist/services/openspec/artifact-boundary.d.ts +138 -0
- package/dist/services/openspec/artifact-boundary.js +150 -0
- package/dist/services/openspec/coverage-evidence-reader.d.ts +191 -0
- package/dist/services/openspec/coverage-evidence-reader.js +386 -0
- package/dist/services/openspec/openspec-archive-service.d.ts +70 -0
- package/dist/services/openspec/openspec-archive-service.js +320 -8
- package/dist/services/openspec/openspec-bridge-service.js +1 -1
- package/dist/services/openspec/openspec-init-service.js +1 -1
- package/dist/services/openspec/openspec-propose-from-doctor-service.js +1 -1
- package/dist/services/openspec/openspec-render-service.js +7 -4
- package/dist/services/openspec/openspec-scan-service.js +1 -1
- package/dist/services/openspec/openspec-validate-service.js +5 -4
- package/dist/services/preferences/preferences-service.js +10 -0
- package/dist/services/preferences/preferences-types.d.ts +13 -0
- package/dist/services/preferences/preferences-types.js +11 -0
- package/dist/services/qa/screenshot-archive-service.d.ts +51 -0
- package/dist/services/qa/screenshot-archive-service.js +134 -0
- package/dist/services/rd/rd-service.js +10 -11
- package/dist/services/rd/types.d.ts +32 -32
- package/dist/services/rd-swarm/rd-swarm-service.d.ts +60 -0
- package/dist/services/rd-swarm/rd-swarm-service.js +93 -0
- package/dist/services/recommendations/capability-seed-items.js +0 -1
- package/dist/services/recommendations/capability-seed-mappings.js +0 -1
- package/dist/services/recommendations/capability-seed-sources.js +0 -1
- package/dist/services/release/version-precheck-service.d.ts +51 -0
- package/dist/services/release/version-precheck-service.js +257 -0
- package/dist/services/scan/acceptance-coverage-service.js +1 -1
- package/dist/services/scan/archetype-service.js +1 -1
- package/dist/services/scan/existing-system-service.js +1 -1
- package/dist/services/scan/libraries-service.js +1 -1
- package/dist/services/sediment/json-schema.d.ts +40 -40
- package/dist/services/share/bundle-types.d.ts +12 -12
- package/dist/services/share/run-state-contract.d.ts +2 -2
- package/dist/services/skill/skill-search-service.d.ts +12 -7
- package/dist/services/skill/skill-search-service.js +8 -4
- package/dist/services/skillhub/migrations/001-initial.sql +71 -0
- package/dist/services/skillhub/migrations/002-loop-release.sql +32 -0
- package/dist/services/skillhub/migrations/003-loop-bee-relation.sql +35 -0
- package/dist/services/skillhub/migrations/004-loop-bee-extension.sql +65 -0
- package/dist/services/skillhub/migrations/005-evolution-evaluation.sql +81 -0
- package/dist/services/skillhub/migrations/006-crystallization-event.sql +92 -0
- package/dist/services/skills/hooks-settings-service.d.ts +75 -0
- package/dist/services/skills/hooks-settings-service.js +230 -2
- package/dist/services/skills/skill-registry.d.ts +1 -0
- package/dist/services/skills/skill-registry.js +6 -4
- package/dist/services/skills/skill-runbook-service.js +1 -1
- package/dist/services/slice/slice-check-service.js +1 -1
- package/dist/services/standards/main-session-monitor-ban-hook.d.ts +14 -0
- package/dist/services/standards/main-session-monitor-ban-hook.js +19 -0
- package/dist/services/standards/missing-standards-detector.d.ts +25 -0
- package/dist/services/standards/missing-standards-detector.js +43 -12
- package/dist/services/tech/tech-change-id-service.d.ts +82 -0
- package/dist/services/tech/tech-change-id-service.js +117 -0
- package/dist/services/understand/understand-hybrid-service.js +1 -1
- package/dist/services/understand/understand-scan-service.js +2 -2
- package/dist/services/upgrade/upgrade-service.js +4 -3
- package/dist/services/verdict/envelopes.d.ts +2 -2
- package/dist/services/verdict/envelopes.js +2 -2
- package/dist/services/verdict/verdict-aggregator.d.ts +3 -3
- package/dist/services/vm/vm-lease.d.ts +40 -0
- package/dist/services/vm/vm-lease.js +137 -0
- package/dist/services/workflow/autonomous-resume-writer.js +1 -1
- package/dist/services/workflow/pipeline-verify-gate-support.d.ts +47 -0
- package/dist/services/workflow/pipeline-verify-gate-support.js +194 -0
- package/dist/services/workflow/pipeline-verify-service.d.ts +17 -81
- package/dist/services/workflow/pipeline-verify-service.js +42 -218
- package/dist/services/workflow/pipeline-verify-types.d.ts +90 -0
- package/dist/services/workflow/pipeline-verify-types.js +10 -0
- package/dist/services/workflow/plan-reader.d.ts +1 -1
- package/dist/services/workflow/plan-reader.js +1 -1
- package/dist/services/workflow/plan-refresher.d.ts +1 -1
- package/dist/services/workflow/plan-refresher.js +1 -1
- package/dist/services/workflow/plan-trigger-detector.d.ts +1 -1
- package/dist/services/workflow/plan-trigger-detector.js +1 -1
- package/dist/services/workflow/workflow-autonomous-resume-helpers.d.ts +1 -1
- package/dist/services/workflow/workflow-autonomous-service.d.ts +2 -98
- package/dist/services/workflow/workflow-autonomous-types.d.ts +114 -0
- package/dist/services/workflow/workflow-autonomous-types.js +21 -0
- package/dist/services/workflow/workflow-router-service.js +18 -16
- package/dist/services/workflow/workflow-spec-lint.d.ts +13 -0
- package/dist/services/workflow/workflow-spec-lint.js +75 -0
- package/dist/services/workflow/workflow-spec-types.d.ts +100 -0
- package/dist/services/workflow/workflow-spec-types.js +13 -0
- package/dist/services/workflow/workflow-spec-yaml.d.ts +17 -0
- package/dist/services/workflow/workflow-spec-yaml.js +88 -0
- package/dist/services/workflow/workflow-spec.d.ts +11 -91
- package/dist/services/workflow/workflow-spec.js +16 -145
- package/dist/services/workspace/migrate-service.js +1 -1
- package/dist/services/workspace/workspace-service.js +1 -1
- package/dist/services/worktree/worktree-lease.d.ts +170 -0
- package/dist/services/worktree/worktree-lease.js +242 -0
- package/package.json +47 -51
- package/scripts/clean-dist.mjs +31 -1
- package/scripts/copy-templates.mjs +16 -0
- package/scripts/sync-version.mjs +53 -2
- package/skills/bee/peaks-perf-audit/SKILL.md +17 -0
- package/skills/bee/peaks-prd/SKILL.md +16 -0
- package/skills/bee/peaks-prd/test-prompts.json +12 -0
- package/skills/bee/peaks-qa/SKILL.md +16 -1
- package/skills/bee/peaks-qa/references/qa-sub-agent-dispatch.md +22 -0
- package/skills/bee/peaks-qa/test-prompts.json +12 -0
- package/skills/bee/peaks-rd/SKILL.md +29 -20
- package/skills/bee/peaks-rd/references/rd-sub-agent-dispatch.md +39 -0
- package/skills/bee/peaks-rd/test-prompts.json +12 -0
- package/skills/bee/peaks-reviewer/SKILL.md +17 -0
- package/skills/bee/peaks-sc/SKILL.md +16 -0
- package/skills/bee/peaks-security-audit/SKILL.md +17 -0
- package/skills/bee/peaks-txt/SKILL.md +16 -0
- package/skills/bee/peaks-txt/test-prompts.json +12 -0
- package/skills/bee/peaks-ui/SKILL.md +49 -43
- package/skills/bee/peaks-ui/test-prompts.json +12 -0
- package/skills/peaks-code/SKILL.md +54 -109
- package/skills/peaks-code/references/boundaries.md +15 -1
- package/skills/peaks-code/references/cron-scheduler-deployment.md +313 -0
- package/skills/peaks-code/references/external-skill-invocation.md +27 -0
- package/skills/peaks-code/references/lease-dashboard.html +224 -0
- package/skills/peaks-code/references/lease-stats.sample.json +26 -0
- package/skills/peaks-code/references/peaks-worktree-l2-enforcers.md +208 -0
- package/skills/peaks-code/references/periodic-checkpoint.md +4 -4
- package/skills/peaks-code/references/runbook.md +63 -1
- package/skills/peaks-code/references/startup-sequence.md +110 -0
- package/skills/peaks-code/references/step-0-8-gate.md +1 -1
- package/skills/peaks-code/references/sub-agent-dispatch.md +92 -1
- package/skills/peaks-code/references/worktree-governance.md +123 -0
- package/skills/peaks-code/test-prompts.json +12 -0
- package/skills/peaks-doctor/SKILL.md +1 -1
- package/skills/peaks-ide/SKILL.md +1 -1
- package/skills/peaks-solo/SKILL.md +21 -0
- package/skills/peaks-solo/references/triage-decision-table.md +6 -0
- package/skills/peaks-sop/test-prompts.json +17 -0
- package/dist/cli/commands/agent-commands.d.ts +0 -20
- package/dist/cli/commands/agent-commands.js +0 -48
- package/dist/cli/commands/classify-classify-commands.d.ts +0 -19
- package/dist/cli/commands/classify-classify-commands.js +0 -151
- package/dist/cli/commands/contract-commands.d.ts +0 -26
- package/dist/cli/commands/contract-commands.js +0 -114
- package/dist/cli/commands/session-auto-compact-hook-command.d.ts +0 -37
- package/dist/cli/commands/session-auto-compact-hook-command.js +0 -127
- package/dist/cli/commands/worker-commands.d.ts +0 -3
- package/dist/cli/commands/worker-commands.js +0 -52
- package/dist/services/agent/ecc-agent-service.d.ts +0 -47
- package/dist/services/agent/ecc-agent-service.js +0 -143
- package/dist/services/config/provider-service.d.ts +0 -48
- package/dist/services/config/provider-service.js +0 -143
- package/dist/services/context/dispatch-context-guard.d.ts +0 -27
- package/dist/services/context/dispatch-context-guard.js +0 -192
- package/dist/services/context/shared-channel.d.ts +0 -93
- package/dist/services/context/shared-channel.js +0 -308
- package/dist/services/filesystem/file-lock.d.ts +0 -11
- package/dist/services/filesystem/file-lock.js +0 -152
- package/dist/services/mut/assert-scanner.d.ts +0 -6
- package/dist/services/mut/assert-scanner.js +0 -116
- package/dist/services/mut/index.d.ts +0 -8
- package/dist/services/mut/index.js +0 -7
- package/dist/services/mut/mut-runner.d.ts +0 -39
- package/dist/services/mut/mut-runner.js +0 -29
- package/dist/services/mut/production-stryker.d.ts +0 -2
- package/dist/services/mut/production-stryker.js +0 -75
- package/dist/services/mut/report-builder.d.ts +0 -11
- package/dist/services/mut/report-builder.js +0 -110
- package/dist/services/mut/report-loader.d.ts +0 -31
- package/dist/services/mut/report-loader.js +0 -78
- package/dist/services/mut/thresholds.d.ts +0 -21
- package/dist/services/mut/thresholds.js +0 -22
- package/dist/services/mut/types.d.ts +0 -336
- package/dist/services/mut/types.js +0 -59
- package/dist/services/providers/minimax-provider-service.d.ts +0 -24
- package/dist/services/providers/minimax-provider-service.js +0 -143
- package/dist/services/providers/minimax-worker-service.d.ts +0 -21
- package/dist/services/providers/minimax-worker-service.js +0 -83
- package/dist/shared/fs.d.ts +0 -4
- package/dist/shared/fs.js +0 -26
- package/dist/shared/paths.d.ts +0 -6
- package/dist/shared/paths.js +0 -50
- package/dist/shared/result.d.ts +0 -22
- package/dist/shared/result.js +0 -46
- package/dist/shared/version.d.ts +0 -1
- package/dist/shared/version.js +0 -1
- package/examples/video-demo/README.md +0 -142
- package/examples/video-demo/out/en-closing-960.png +0 -0
- package/examples/video-demo/out/zh-closing-960.png +0 -0
- package/examples/video-demo/preview/peaks-loop-demo-en.mp4 +0 -0
- package/examples/video-demo/preview/peaks-loop-demo.mp4 +0 -0
- /package/dist/services/{job/job-resource-snapshot.js → job-snapshot/snapshot.js} +0 -0
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `peaks session 24h-mode` — state-only CLI for the 24h mode backbone.
|
|
3
|
+
*
|
|
4
|
+
* Rid-020a (state-only slice). Exposes four sub-actions so the LLM
|
|
5
|
+
* orchestrator can introspect, transition, audit retry attempts, and
|
|
6
|
+
* reset the 24h state machine without touching the JSON file
|
|
7
|
+
* directly. The LLM is the decision-maker; the CLI is the muscle
|
|
8
|
+
* (same contract as `peaks session checkpoint`).
|
|
9
|
+
*
|
|
10
|
+
* Sub-actions (all accept --json for machine-readable envelopes):
|
|
11
|
+
* - `peaks session 24h-mode state` — read snapshot
|
|
12
|
+
* - `peaks session 24h-mode transition` — move to a new state
|
|
13
|
+
* - `peaks session 24h-mode attempts` — read attempts map
|
|
14
|
+
* - `peaks session 24h-mode reset` — wipe the snapshot
|
|
15
|
+
*
|
|
16
|
+
* peaks-code is the skill that should drive this CLI; we do not
|
|
17
|
+
* add a new top-level verb (peaks-loop is enhancement, not a new
|
|
18
|
+
* CLI surface — see `.peaks/memory/peaks-loop-is-enhancement-not-new-cli.md`).
|
|
19
|
+
*/
|
|
20
|
+
import { resolveCanonicalProjectRoot } from '../../services/config/config-service.js';
|
|
21
|
+
import { getErrorMessage } from '../cli-helpers.js';
|
|
22
|
+
import { HANDOFF_EXIT_CONDITIONS, STATES, emptySnapshot, isHandoffExitCondition, isState, read24hState, write24hState } from '../../services/24h-mode/index.js';
|
|
23
|
+
function splitList(value) {
|
|
24
|
+
if (!value)
|
|
25
|
+
return [];
|
|
26
|
+
return value
|
|
27
|
+
.split(/[,\r\n]/)
|
|
28
|
+
.map((s) => s.trim())
|
|
29
|
+
.filter((s) => s.length > 0);
|
|
30
|
+
}
|
|
31
|
+
function printJson(io, payload, options) {
|
|
32
|
+
if (options.json === true) {
|
|
33
|
+
io.stdout(JSON.stringify(payload) + '\n');
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
io.stdout(JSON.stringify(payload, null, 2) + '\n');
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
function printError(io, code, message, options) {
|
|
40
|
+
if (options.json === true) {
|
|
41
|
+
io.stderr(JSON.stringify({ ok: false, code, error: message }) + '\n');
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
io.stderr(`${code}: ${message}\n`);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Resolve the session id from the parent options; falls back to the
|
|
49
|
+
* canonical session-manager binding if `--session-id` is not set.
|
|
50
|
+
* The dynamic import keeps the static dependency graph clean (no
|
|
51
|
+
* top-level cycle with `session-manager.ts`).
|
|
52
|
+
*/
|
|
53
|
+
async function resolveSessionIdAsync(opts) {
|
|
54
|
+
if (opts.sessionId)
|
|
55
|
+
return opts.sessionId;
|
|
56
|
+
const projectRoot = resolveCanonicalProjectRoot(opts.project ?? process.cwd());
|
|
57
|
+
const { getSessionIdCanonical } = await import('../../services/session/session-manager.js');
|
|
58
|
+
return getSessionIdCanonical(projectRoot);
|
|
59
|
+
}
|
|
60
|
+
export function registerSession24hModeCommand(session, io) {
|
|
61
|
+
const cmd = session
|
|
62
|
+
.command('24h-mode')
|
|
63
|
+
.description('24h mode state machine (rid-020a). Sub-actions: state, transition, attempts, reset. ' +
|
|
64
|
+
'persists to .peaks/_runtime/<sessionId>/24h-state.json.')
|
|
65
|
+
.option('--json', 'emit machine-readable JSON envelope')
|
|
66
|
+
.option('--project <path>', 'project root (defaults to current directory)', process.cwd())
|
|
67
|
+
.option('--session-id <sessionId>', 'explicit session id (defaults to canonical binding)');
|
|
68
|
+
// sub-action: state (read snapshot)
|
|
69
|
+
cmd
|
|
70
|
+
.command('state')
|
|
71
|
+
.description('Read the current 24h mode state snapshot')
|
|
72
|
+
.action(async (subOpts) => {
|
|
73
|
+
const parentOpts = cmd.opts();
|
|
74
|
+
const merged = { ...parentOpts, ...subOpts };
|
|
75
|
+
const projectRoot = resolveCanonicalProjectRoot(merged.project ?? process.cwd());
|
|
76
|
+
const sid = await resolveSessionIdAsync(merged);
|
|
77
|
+
if (!sid) {
|
|
78
|
+
printError(io, 'NO_ACTIVE_SESSION', 'no --session-id and no canonical binding', merged);
|
|
79
|
+
process.exitCode = 1;
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
try {
|
|
83
|
+
const snapshot = read24hState(projectRoot, sid);
|
|
84
|
+
printJson(io, { ok: true, data: snapshot }, merged);
|
|
85
|
+
}
|
|
86
|
+
catch (error) {
|
|
87
|
+
printError(io, '24H_STATE_READ_FAILED', getErrorMessage(error), merged);
|
|
88
|
+
process.exitCode = 1;
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
// sub-action: transition (move to a new state)
|
|
92
|
+
cmd
|
|
93
|
+
.command('transition')
|
|
94
|
+
.description('Move the state machine to a new state')
|
|
95
|
+
.requiredOption('--state <state>', `target state (one of: ${STATES.join(', ')})`)
|
|
96
|
+
.option('--reason <text>', 'human-readable reason for the transition')
|
|
97
|
+
.option('--exit-condition <condition>', `HANDOFF exit condition (one of: ${HANDOFF_EXIT_CONDITIONS.join(', ')})`)
|
|
98
|
+
.option('--active-slices <list>', 'comma-separated active slice ids (e.g. "rid-020a,rid-020b")')
|
|
99
|
+
.action(async (subOpts) => {
|
|
100
|
+
const parentOpts = cmd.opts();
|
|
101
|
+
const merged = { ...parentOpts, ...subOpts };
|
|
102
|
+
const projectRoot = resolveCanonicalProjectRoot(merged.project ?? process.cwd());
|
|
103
|
+
const sid = await resolveSessionIdAsync(merged);
|
|
104
|
+
if (!sid) {
|
|
105
|
+
printError(io, 'NO_ACTIVE_SESSION', 'no --session-id and no canonical binding', merged);
|
|
106
|
+
process.exitCode = 1;
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
if (!merged.state || !isState(merged.state)) {
|
|
110
|
+
printError(io, 'INVALID_STATE', `--state must be one of ${STATES.join(', ')} (got ${JSON.stringify(merged.state)})`, merged);
|
|
111
|
+
process.exitCode = 1;
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
const target = merged.state;
|
|
115
|
+
if (merged.exitCondition !== undefined && !isHandoffExitCondition(merged.exitCondition)) {
|
|
116
|
+
printError(io, 'INVALID_EXIT_CONDITION', `--exit-condition must be one of ${HANDOFF_EXIT_CONDITIONS.join(', ')}`, merged);
|
|
117
|
+
process.exitCode = 1;
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
if (target === 'HANDOFF' && !merged.exitCondition) {
|
|
121
|
+
printError(io, 'HANDOFF_REQUIRES_EXIT_CONDITION', 'transitioning to HANDOFF requires --exit-condition', merged);
|
|
122
|
+
process.exitCode = 1;
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
try {
|
|
126
|
+
const current = read24hState(projectRoot, sid);
|
|
127
|
+
const now = new Date().toISOString();
|
|
128
|
+
const sliceList = splitList(merged.activeSlices);
|
|
129
|
+
const next = {
|
|
130
|
+
...current,
|
|
131
|
+
state: target,
|
|
132
|
+
enteredAt: now,
|
|
133
|
+
enteredFrom: current.state,
|
|
134
|
+
activeSlices: sliceList.length > 0 ? sliceList : current.activeSlices,
|
|
135
|
+
exitCondition: target === 'HANDOFF' ? (merged.exitCondition ?? null) : current.exitCondition
|
|
136
|
+
};
|
|
137
|
+
const result = write24hState(projectRoot, sid, next);
|
|
138
|
+
printJson(io, { ok: true, data: { ...next, path: result.path } }, merged);
|
|
139
|
+
}
|
|
140
|
+
catch (error) {
|
|
141
|
+
printError(io, '24H_STATE_WRITE_FAILED', getErrorMessage(error), merged);
|
|
142
|
+
process.exitCode = 1;
|
|
143
|
+
}
|
|
144
|
+
});
|
|
145
|
+
// sub-action: attempts (read attempts map)
|
|
146
|
+
cmd
|
|
147
|
+
.command('attempts')
|
|
148
|
+
.description('Read the B3 attempts map (per-key retry counts)')
|
|
149
|
+
.action(async (subOpts) => {
|
|
150
|
+
const parentOpts = cmd.opts();
|
|
151
|
+
const merged = { ...parentOpts, ...subOpts };
|
|
152
|
+
const projectRoot = resolveCanonicalProjectRoot(merged.project ?? process.cwd());
|
|
153
|
+
const sid = await resolveSessionIdAsync(merged);
|
|
154
|
+
if (!sid) {
|
|
155
|
+
printError(io, 'NO_ACTIVE_SESSION', 'no --session-id and no canonical binding', merged);
|
|
156
|
+
process.exitCode = 1;
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
try {
|
|
160
|
+
const snapshot = read24hState(projectRoot, sid);
|
|
161
|
+
printJson(io, { ok: true, data: { state: snapshot.state, attempts: snapshot.attempts } }, merged);
|
|
162
|
+
}
|
|
163
|
+
catch (error) {
|
|
164
|
+
printError(io, '24H_STATE_READ_FAILED', getErrorMessage(error), merged);
|
|
165
|
+
process.exitCode = 1;
|
|
166
|
+
}
|
|
167
|
+
});
|
|
168
|
+
// sub-action: reset (wipe the snapshot)
|
|
169
|
+
cmd
|
|
170
|
+
.command('reset')
|
|
171
|
+
.description('Reset the 24h state snapshot to IDLE (fresh start)')
|
|
172
|
+
.action(async (subOpts) => {
|
|
173
|
+
const parentOpts = cmd.opts();
|
|
174
|
+
const merged = { ...parentOpts, ...subOpts };
|
|
175
|
+
const projectRoot = resolveCanonicalProjectRoot(merged.project ?? process.cwd());
|
|
176
|
+
const sid = await resolveSessionIdAsync(merged);
|
|
177
|
+
if (!sid) {
|
|
178
|
+
printError(io, 'NO_ACTIVE_SESSION', 'no --session-id and no canonical binding', merged);
|
|
179
|
+
process.exitCode = 1;
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
try {
|
|
183
|
+
const fresh = emptySnapshot();
|
|
184
|
+
const result = write24hState(projectRoot, sid, fresh);
|
|
185
|
+
printJson(io, { ok: true, data: { ...fresh, path: result.path } }, merged);
|
|
186
|
+
}
|
|
187
|
+
catch (error) {
|
|
188
|
+
printError(io, '24H_STATE_WRITE_FAILED', getErrorMessage(error), merged);
|
|
189
|
+
process.exitCode = 1;
|
|
190
|
+
}
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
export const SESSION_24H_MODE_CONSTANTS = {
|
|
194
|
+
STATES,
|
|
195
|
+
HANDOFF_EXIT_CONDITIONS
|
|
196
|
+
};
|
|
@@ -15,3 +15,22 @@ import { type ProgramIO } from '../cli-helpers.js';
|
|
|
15
15
|
export declare function registerShareCommand(parent: Command, io: ProgramIO): void;
|
|
16
16
|
export declare function registerSharedReadCommand(parent: Command, io: ProgramIO): void;
|
|
17
17
|
export declare function registerAwaitCommand(parent: Command, io: ProgramIO): void;
|
|
18
|
+
/**
|
|
19
|
+
* Slice 2026-07-17-D21: peaks sub-agent finalize — LLM-side completion
|
|
20
|
+
* signal. Without this, dispatch records stay queued forever.
|
|
21
|
+
*
|
|
22
|
+
* Contract:
|
|
23
|
+
* - LLM MUST call once per dispatched Task, in post-completion branch.
|
|
24
|
+
* - --all-stale bulk-marks every queued record for this session (crash recovery).
|
|
25
|
+
*/
|
|
26
|
+
export interface FinalizeOptions {
|
|
27
|
+
batch?: string;
|
|
28
|
+
requestId?: string;
|
|
29
|
+
outcome?: string;
|
|
30
|
+
error?: string;
|
|
31
|
+
allStale?: boolean;
|
|
32
|
+
project?: string;
|
|
33
|
+
sessionId?: string;
|
|
34
|
+
json?: boolean;
|
|
35
|
+
}
|
|
36
|
+
export declare function registerFinalizeCommand(parent: Command, io: ProgramIO): void;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { resolve } from 'node:path';
|
|
2
|
+
import { fail, getErrorMessage, ok } from 'peaks-loop-shared/result';
|
|
2
3
|
import { addJsonOption, printResult } from '../cli-helpers.js';
|
|
3
|
-
import { readSharedChannel, writeSharedEntry, SHARED_CHANNEL_SOFT_VALUE_WARN } from '
|
|
4
|
+
import { readSharedChannel, writeSharedEntry, SHARED_CHANNEL_SOFT_VALUE_WARN } from 'peaks-loop-shared-channel';
|
|
4
5
|
import { writeLogEntry } from '../../services/log/logger.js';
|
|
5
6
|
import { getCurrentSessionId } from '../../services/skills/skill-presence-service.js';
|
|
6
7
|
import { summarizeBatchResults } from './sub-agent-shared.js';
|
|
@@ -294,3 +295,121 @@ function awaitErrorNextActions(code) {
|
|
|
294
295
|
}
|
|
295
296
|
return 'See error message; check that --batch matches the dispatch envelope and --timeout is a positive integer ms.';
|
|
296
297
|
}
|
|
298
|
+
export function registerFinalizeCommand(parent, io) {
|
|
299
|
+
addJsonOption(parent
|
|
300
|
+
.command('finalize')
|
|
301
|
+
.description('D21: signal that a dispatched sub-agent has finished (success/failure/cancellation). Pass --all-stale for crash-recovery sweep.')
|
|
302
|
+
.option('--batch <batchId>', 'batchId from dispatch envelope')
|
|
303
|
+
.option('--request-id <rid>', 'requestId from dispatch envelope')
|
|
304
|
+
.option('--outcome <state>', 'done | failed | cancelled (default: done)')
|
|
305
|
+
.option('--error <msg>', 'error message (when --outcome=failed)')
|
|
306
|
+
.option('--all-stale', 'bulk-mark every queued record for this session as done')
|
|
307
|
+
.option('--project <path>', 'target project root (defaults to cwd)')
|
|
308
|
+
.option('--session-id <sid>', 'override active session id')).action((options) => {
|
|
309
|
+
void (async () => {
|
|
310
|
+
const asJson = options.json === true;
|
|
311
|
+
try {
|
|
312
|
+
const projectRoot = resolve(options.project ?? process.cwd());
|
|
313
|
+
const sessionId = options.sessionId ?? getCurrentSessionId(projectRoot) ?? 'unknown-sid';
|
|
314
|
+
if (!options.allStale && !options.requestId && !options.batch) {
|
|
315
|
+
printResult(io, fail('sub-agent.finalize', 'MISSING_TARGET', 'Pass --request-id or --batch (or --all-stale)', { ok: false }, ['Call finalize after each Task completes.']), asJson);
|
|
316
|
+
process.exitCode = 1;
|
|
317
|
+
return;
|
|
318
|
+
}
|
|
319
|
+
const outcome = (options.outcome ?? 'done');
|
|
320
|
+
const writerMod = await import('../../services/dispatch/dispatch-record-writer.js');
|
|
321
|
+
const { readRecord, markCompleted, readActiveDispatchIndex } = writerMod;
|
|
322
|
+
// map outcome -> (status, outcome)
|
|
323
|
+
const outcomeMap = {
|
|
324
|
+
done: { status: 'done', outcome: 'success' },
|
|
325
|
+
failed: { status: 'failed', outcome: 'failed' },
|
|
326
|
+
cancelled: { status: 'cancelled', outcome: 'cancelled' },
|
|
327
|
+
};
|
|
328
|
+
const mapped = outcomeMap[outcome] ?? outcomeMap['done'];
|
|
329
|
+
const finalized = [];
|
|
330
|
+
const skipped = [];
|
|
331
|
+
const errors = [];
|
|
332
|
+
const applyOutcome = (recordPath, rid) => {
|
|
333
|
+
markCompleted({ recordPath, now: () => new Date(), status: mapped.status, outcome: mapped.outcome, projectRoot });
|
|
334
|
+
finalized.push({ recordPath, requestId: rid, status: mapped.status });
|
|
335
|
+
};
|
|
336
|
+
if (options.allStale) {
|
|
337
|
+
const index = readActiveDispatchIndex(projectRoot, sessionId);
|
|
338
|
+
for (const [recordPath, entry] of Object.entries(index)) {
|
|
339
|
+
if (entry.status !== 'queued') {
|
|
340
|
+
skipped.push({ recordPath, reason: 'status is ' + entry.status });
|
|
341
|
+
continue;
|
|
342
|
+
}
|
|
343
|
+
try {
|
|
344
|
+
applyOutcome(recordPath, entry.requestId);
|
|
345
|
+
}
|
|
346
|
+
catch (e) {
|
|
347
|
+
errors.push({ recordPath, error: getErrorMessage(e) });
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
else if (options.requestId) {
|
|
352
|
+
const fs2 = await import('node:fs');
|
|
353
|
+
const path2 = await import('node:path');
|
|
354
|
+
const dir = path2.resolve(projectRoot, '.peaks', '_sub_agents', sessionId);
|
|
355
|
+
let resolvedPath = null;
|
|
356
|
+
if (fs2.existsSync(dir)) {
|
|
357
|
+
for (const f of fs2.readdirSync(dir)) {
|
|
358
|
+
if (!f.endsWith('.json'))
|
|
359
|
+
continue;
|
|
360
|
+
const p = path2.join(dir, f);
|
|
361
|
+
const r = readRecord(p);
|
|
362
|
+
if (r.requestId === options.requestId) {
|
|
363
|
+
resolvedPath = p;
|
|
364
|
+
break;
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
if (!resolvedPath) {
|
|
369
|
+
printResult(io, fail('sub-agent.finalize', 'RECORD_NOT_FOUND', 'No dispatch record for requestId=' + options.requestId, { ok: false }, ['Check --request-id matches the dispatch envelope.']), asJson);
|
|
370
|
+
process.exitCode = 1;
|
|
371
|
+
return;
|
|
372
|
+
}
|
|
373
|
+
try {
|
|
374
|
+
applyOutcome(resolvedPath, options.requestId);
|
|
375
|
+
}
|
|
376
|
+
catch (e) {
|
|
377
|
+
errors.push({ recordPath: resolvedPath, error: getErrorMessage(e) });
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
else {
|
|
381
|
+
const fs2 = await import('node:fs');
|
|
382
|
+
const path2 = await import('node:path');
|
|
383
|
+
const dir = path2.resolve(projectRoot, '.peaks', '_sub_agents', sessionId);
|
|
384
|
+
if (fs2.existsSync(dir)) {
|
|
385
|
+
for (const f of fs2.readdirSync(dir)) {
|
|
386
|
+
if (!f.startsWith('dispatch-') || !f.endsWith('.json'))
|
|
387
|
+
continue;
|
|
388
|
+
const p = path2.join(dir, f);
|
|
389
|
+
const r = readRecord(p);
|
|
390
|
+
if (r.batchId !== options.batch)
|
|
391
|
+
continue;
|
|
392
|
+
if (r.status !== 'queued') {
|
|
393
|
+
skipped.push({ recordPath: p, reason: 'status is ' + r.status });
|
|
394
|
+
continue;
|
|
395
|
+
}
|
|
396
|
+
try {
|
|
397
|
+
applyOutcome(p, r.requestId);
|
|
398
|
+
}
|
|
399
|
+
catch (e) {
|
|
400
|
+
errors.push({ recordPath: p, error: getErrorMessage(e) });
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
printResult(io, ok('sub-agent.finalize', { finalized, skipped, errors, sessionId, outcome }, errors.length > 0 ? [errors.length + ' failed'] : [], errors.length > 0 ? ['Re-run after fixing.'] : ['All targeted records transitioned out of queued.']), asJson);
|
|
406
|
+
if (errors.length > 0)
|
|
407
|
+
process.exitCode = 1;
|
|
408
|
+
}
|
|
409
|
+
catch (error) {
|
|
410
|
+
printResult(io, fail('sub-agent.finalize', 'FINALIZE_ERROR', getErrorMessage(error), { ok: false }, ['Inspect the error.']), asJson);
|
|
411
|
+
process.exitCode = 1;
|
|
412
|
+
}
|
|
413
|
+
})();
|
|
414
|
+
});
|
|
415
|
+
}
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import { auditSkillConformance } from '../../services/skills/skill-conformance-service.js';
|
|
8
8
|
import { getErrorMessage, printResult } from '../cli-helpers.js';
|
|
9
|
-
import { fail, ok } from '
|
|
9
|
+
import { fail, ok } from 'peaks-loop-shared/result';
|
|
10
10
|
export function registerSkillConformanceCommands(program, io) {
|
|
11
11
|
program
|
|
12
12
|
.command('skills:audit-conformance')
|
|
@@ -36,7 +36,7 @@ import { readFileSync, existsSync, statSync } from 'node:fs';
|
|
|
36
36
|
import { join, resolve } from 'node:path';
|
|
37
37
|
import { lintSkillLoopEngineeringReadiness, } from '../../services/standards/loop-engineering-readiness-lint.js';
|
|
38
38
|
import { addJsonOption, getErrorMessage, printResult } from '../cli-helpers.js';
|
|
39
|
-
import { fail, ok } from '
|
|
39
|
+
import { fail, ok } from 'peaks-loop-shared/result';
|
|
40
40
|
export const LOOP_ENGINEERING_READINESS_CATEGORY = 'loop-engineering-readiness';
|
|
41
41
|
/**
|
|
42
42
|
* Resolve the SKILL.md file path from a `--path <skill-dir>` value.
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { searchSkills, SkillSearchInputSchema } from '../../services/skill/skill-search-service.js';
|
|
2
|
-
import { getErrorMessage } from '
|
|
2
|
+
import { getErrorMessage } from 'peaks-loop-shared/result';
|
|
3
3
|
/**
|
|
4
4
|
* Validate the raw CLI flags, call the service, and emit a JSON
|
|
5
5
|
* envelope on stdout. Errors flow through stderr + non-zero exit
|
|
@@ -28,6 +28,7 @@ export function registerSkillSearchCommand(program, io) {
|
|
|
28
28
|
.option('-t, --tag <tag>', 'exact match on metadata.tags (e.g. "orchestrator", "loop-engineering")')
|
|
29
29
|
.option('-d, --domain <domain>', 'exact match on metadata.domain (locked enum: code | content | doctor | research | triage | sop | audit | final-review | resume | status | test | ide | slice-decompose | issue-fix-orchestrator | perf-audit | security-audit | reviewer)')
|
|
30
30
|
.option('-l, --limit <n>', 'max results returned (1..100, default 20)', (v) => Number.parseInt(v, 10))
|
|
31
|
+
.option('--include-internal', 'include skills with visibility: internal (default: hide them)')
|
|
31
32
|
.action(async (options) => {
|
|
32
33
|
// 1) Coerce + validate input via the service's Zod schema.
|
|
33
34
|
// The schema's refine rejects empty input — that is the
|
|
@@ -41,6 +42,8 @@ export function registerSkillSearchCommand(program, io) {
|
|
|
41
42
|
raw['domain'] = options.domain;
|
|
42
43
|
if (options.limit !== undefined)
|
|
43
44
|
raw['limit'] = options.limit;
|
|
45
|
+
if (options.includeInternal === true)
|
|
46
|
+
raw['includeInternal'] = true;
|
|
44
47
|
const parsed = SkillSearchInputSchema.safeParse(raw);
|
|
45
48
|
if (!parsed.success) {
|
|
46
49
|
// Exit code 1 = invalid args. Emit a human-readable message
|
|
@@ -7,7 +7,7 @@ import { decomposeSlicesWithBenchmark } from '../../services/slice/slice-benchma
|
|
|
7
7
|
import { pickSlicesInteractive } from '../../services/slice/slice-pick-service.js';
|
|
8
8
|
import { decompose as multiPassDecompose } from '../../services/slice/multi-pass-orchestrator.js';
|
|
9
9
|
import { readResult as readDecompositionResult, writeResult as writeSchemaResult } from '../../services/slice/schema-router.js';
|
|
10
|
-
import { fail, ok } from '
|
|
10
|
+
import { fail, ok } from 'peaks-loop-shared/result';
|
|
11
11
|
import { addJsonOption, getErrorMessage, printResult } from '../cli-helpers.js';
|
|
12
12
|
export function registerSliceCommands(program, io) {
|
|
13
13
|
const slice = program.command('slice').description('Slice lifecycle: check (boundary), decompose (PRD -> 6-stage algorithm), ' +
|
|
@@ -10,7 +10,7 @@ import { existsSync, readFileSync } from 'node:fs';
|
|
|
10
10
|
import { join, resolve } from 'node:path';
|
|
11
11
|
import { getCurrentSessionId } from '../../services/skills/skill-presence-service.js';
|
|
12
12
|
import { integrateSlices } from '../../services/slice/slice-integration.js';
|
|
13
|
-
import { fail, ok } from '
|
|
13
|
+
import { fail, ok } from 'peaks-loop-shared/result';
|
|
14
14
|
import { addJsonOption, printResult } from '../cli-helpers.js';
|
|
15
15
|
function loadContractsForSlices(projectRoot, sessionId, sliceIds) {
|
|
16
16
|
const dir = resolve(projectRoot, '.peaks', '_runtime', sessionId, 'dispatch', 'contracts');
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
import { findProjectRoot } from '../../services/config/config-safety.js';
|
|
22
22
|
import { getCurrentSessionId } from '../../services/skills/skill-presence-service.js';
|
|
23
23
|
import { acceptReview, buildEmptySliceReview, DEFAULT_REVIEW_ITEMS, deriveDecision, readSliceReview, rejectReview, renderChecklist, scoreItem, writeSliceReview } from '../../services/slice/slice-review-state.js';
|
|
24
|
-
import { fail, ok } from '
|
|
24
|
+
import { fail, ok } from 'peaks-loop-shared/result';
|
|
25
25
|
import { addJsonOption, printResult } from '../cli-helpers.js';
|
|
26
26
|
export function registerSliceReviewCommands(program, io) {
|
|
27
27
|
// G1 commands registered as TOP-LEVEL commands prefixed with `slice-review-`
|
|
@@ -18,7 +18,7 @@ import { readFileSync } from 'node:fs';
|
|
|
18
18
|
import { resolve as resolvePath } from 'node:path';
|
|
19
19
|
import { findProjectRoot } from '../../services/config/config-safety.js';
|
|
20
20
|
import { addCriticalPath, CRITICAL_PATH_SOURCES, EMPTY_SMOKE_STATE, isCriticalPathSource, makeCriticalPathId, readSmokeState, recordRun, summarizeState, writeSmokeState } from '../../services/smoke/smoke-paths-state.js';
|
|
21
|
-
import { fail, ok } from '
|
|
21
|
+
import { fail, ok } from 'peaks-loop-shared/result';
|
|
22
22
|
import { addJsonOption, printResult } from '../cli-helpers.js';
|
|
23
23
|
const RUN_STATUSES = ['pending', 'pass', 'fail'];
|
|
24
24
|
export function registerSmokeCommands(program, io) {
|
|
@@ -6,7 +6,7 @@ import { advanceSop, SopAdvanceError, SopGateBlockedError, SopPhaseSkipError } f
|
|
|
6
6
|
import { sopStateDir } from '../../services/sop/sop-paths.js';
|
|
7
7
|
import { getSkillPresence } from '../../services/skills/skill-presence-service.js';
|
|
8
8
|
import { recordBypass, isBypassLimitReached, MAX_BYPASSES_PER_SESSION } from '../../services/mode/bypass-tracker.js';
|
|
9
|
-
import { fail, ok } from '
|
|
9
|
+
import { fail, ok } from 'peaks-loop-shared/result';
|
|
10
10
|
import { addJsonOption, getErrorMessage, printResult } from '../cli-helpers.js';
|
|
11
11
|
export function registerSopCommands(program, io) {
|
|
12
12
|
const sop = program.command('sop').description('Author and validate user-defined SOP skills');
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rid-032: opt-in spill/hydrate round-trip for 24h mode.
|
|
3
|
+
* This demo command is additive; existing deferral behavior is unchanged.
|
|
4
|
+
*/
|
|
5
|
+
import type { Command } from 'commander';
|
|
6
|
+
import { type ProgramIO } from '../cli-helpers.js';
|
|
7
|
+
export declare function registerSpillDemoCommand(parent: Command, io: ProgramIO): void;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { ok } from 'peaks-loop-shared/result';
|
|
2
|
+
import { hydrate, listSpills, spill, spillDir } from '../../services/context/spillover-store.js';
|
|
3
|
+
import { getSessionIdCanonical } from '../../services/session/session-manager.js';
|
|
4
|
+
import { addJsonOption, printResult } from '../cli-helpers.js';
|
|
5
|
+
export function registerSpillDemoCommand(parent, io) {
|
|
6
|
+
addJsonOption(parent
|
|
7
|
+
.command('spill-demo')
|
|
8
|
+
.description('Demonstrate the opt-in spill/hydrate round-trip for 24h mode.')
|
|
9
|
+
.option('--session-id <sessionId>', 'explicit session id (defaults to canonical binding)')
|
|
10
|
+
.option('--project <path>', 'project root', process.cwd())
|
|
11
|
+
.option('--batch-id <batchId>', 'optional in-flight batch id')).action((options) => {
|
|
12
|
+
const sessionId = options.sessionId ?? getSessionIdCanonical(options.project);
|
|
13
|
+
if (sessionId === null) {
|
|
14
|
+
throw new Error('No active session; provide --session-id or bind a canonical session');
|
|
15
|
+
}
|
|
16
|
+
const spilled = spill({
|
|
17
|
+
sessionId,
|
|
18
|
+
projectRoot: options.project,
|
|
19
|
+
...(options.batchId === undefined ? {} : { batchId: options.batchId })
|
|
20
|
+
}, { llm: { turn: 1, context: ['sample'] } });
|
|
21
|
+
const allSpills = listSpills(options.project, sessionId);
|
|
22
|
+
const hydrated = hydrate(options.project, sessionId, spilled.spillId);
|
|
23
|
+
printResult(io, ok('session.spill-demo', {
|
|
24
|
+
spilled: spilled.spillId,
|
|
25
|
+
totalSpills: allSpills.length,
|
|
26
|
+
hydrated
|
|
27
|
+
}, [], [`Spill directory: ${spillDir(options.project, sessionId)}`]), options.json === true);
|
|
28
|
+
});
|
|
29
|
+
}
|
|
@@ -1,3 +1,15 @@
|
|
|
1
1
|
import { Command } from 'commander';
|
|
2
2
|
import { type ProgramIO } from '../cli-helpers.js';
|
|
3
|
+
type RenderOptions = {
|
|
4
|
+
project?: string;
|
|
5
|
+
json?: boolean;
|
|
6
|
+
};
|
|
7
|
+
/**
|
|
8
|
+
* Default-statusline render body. Reused by both the top-level default
|
|
9
|
+
* action (Bug-02 dispatch) and the explicit `render` subcommand. Exported
|
|
10
|
+
* so a unit test can exercise the JSON / text output paths without going
|
|
11
|
+
* through commander.
|
|
12
|
+
*/
|
|
13
|
+
export declare function runDefaultStatuslineRender(options: RenderOptions, io: ProgramIO): Promise<void>;
|
|
3
14
|
export declare function registerStatusLineCommands(program: Command, io: ProgramIO): void;
|
|
15
|
+
export {};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { fail, ok } from '
|
|
1
|
+
import { fail, ok } from 'peaks-loop-shared/result';
|
|
2
2
|
import { addJsonOption, printResult, getErrorMessage } from '../cli-helpers.js';
|
|
3
3
|
import { findProjectRoot } from '../../services/config/config-safety.js';
|
|
4
4
|
import { buildStatusLineModel, parseStatusLineStdin } from '../../services/skills/skill-statusline-service.js';
|
|
@@ -6,6 +6,8 @@ import { renderStatusLine } from '../../services/skills/skill-statusline-rendere
|
|
|
6
6
|
import { applyStatusLineInstall, planStatusLineInstall, removeStatusLineInstall } from '../../services/skills/statusline-settings-service.js';
|
|
7
7
|
import { readHookStatus as readSettingsStatus } from '../../services/skills/hooks-settings-service.js';
|
|
8
8
|
import { detectIdeFromContext } from '../../services/ide/hook-translator.js';
|
|
9
|
+
import { decideCompactStatusline, renderCompactStatusline, } from '../../services/compact-statusline/compact-statusline-service.js';
|
|
10
|
+
import { getSessionIdCanonical } from '../../services/session/session-manager.js';
|
|
9
11
|
const STDIN_READ_TIMEOUT_MS = 250;
|
|
10
12
|
/** Read piped stdin if present; resolve quickly with '' when attached to a TTY. */
|
|
11
13
|
function readStdin() {
|
|
@@ -54,6 +56,26 @@ function resolveIdeForCommand(options, projectRoot) {
|
|
|
54
56
|
}
|
|
55
57
|
return detectIdeFromContext({ env: process.env, cwd: projectRoot ?? process.cwd(), parsedStdin: null });
|
|
56
58
|
}
|
|
59
|
+
/**
|
|
60
|
+
* Default-statusline render body. Reused by both the top-level default
|
|
61
|
+
* action (Bug-02 dispatch) and the explicit `render` subcommand. Exported
|
|
62
|
+
* so a unit test can exercise the JSON / text output paths without going
|
|
63
|
+
* through commander.
|
|
64
|
+
*/
|
|
65
|
+
export async function runDefaultStatuslineRender(options, io) {
|
|
66
|
+
const raw = await readStdin();
|
|
67
|
+
const stdin = parseStatusLineStdin(raw);
|
|
68
|
+
const seeded = options.project
|
|
69
|
+
? { ...(stdin ?? {}), workspace: { current_dir: options.project } }
|
|
70
|
+
: stdin;
|
|
71
|
+
const model = buildStatusLineModel(seeded, Date.now());
|
|
72
|
+
const text = renderStatusLine(model);
|
|
73
|
+
if (options.json === true) {
|
|
74
|
+
io.stdout(JSON.stringify({ ok: true, command: 'statusline.render', data: { text } }, null, 2));
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
io.stdout(text);
|
|
78
|
+
}
|
|
57
79
|
export function registerStatusLineCommands(program, io) {
|
|
58
80
|
// Top-level `peaks statusline` — register as a group with subcommands
|
|
59
81
|
// (install | uninstall | status). When the user runs `peaks statusline` with
|
|
@@ -65,27 +87,31 @@ export function registerStatusLineCommands(program, io) {
|
|
|
65
87
|
// option-shadowing bug.
|
|
66
88
|
const statusline = addJsonOption(program
|
|
67
89
|
.command('statusline')
|
|
68
|
-
.description('Render the Peaks skill status line for the current session, or manage the adapter-driven statusLine entry. Run with no subcommand to render; with a subcommand (install | uninstall | status) to manage.')
|
|
69
|
-
|
|
70
|
-
// `peaks statusline` with no
|
|
71
|
-
//
|
|
90
|
+
.description('Render the Peaks skill status line for the current session, or manage the adapter-driven statusLine entry. Run with no subcommand to render; with a subcommand (install | uninstall | status) to manage.')
|
|
91
|
+
.option('--project <path>', 'project root path (used to label the status line when stdin is absent; applies to the default render path)'));
|
|
92
|
+
// Default behavior: when the user types `peaks statusline` with no
|
|
93
|
+
// subcommand, render the status line. Without this default action,
|
|
94
|
+
// commander falls back to printing usage (Bug-02, ice-cola surface check
|
|
95
|
+
// 2026-07-22). The hidden `render` subcommand is preserved so callers
|
|
96
|
+
// can still invoke it explicitly.
|
|
97
|
+
//
|
|
98
|
+
// Note (commander 12.x): when both a top-level `.action(...)` and
|
|
99
|
+
// subcommands exist, commander's option parser can conflate parent and
|
|
100
|
+
// child flags. We therefore parse `process.argv` for the bare `statusline`
|
|
101
|
+
// invocation here, and otherwise let the subcommand machinery handle the
|
|
102
|
+
// rest. The implementation is wrapped in `peekDefaultStatuslineRender` so
|
|
103
|
+
// it can be exercised in isolation by unit tests.
|
|
104
|
+
statusline.action(async (_parentOptions, command) => {
|
|
105
|
+
await runDefaultStatuslineRender(command.opts(), io);
|
|
106
|
+
});
|
|
107
|
+
// Hidden render subcommand. Preserved for callers that want to invoke
|
|
108
|
+
// render explicitly without going through the default-action dispatch.
|
|
72
109
|
statusline
|
|
73
110
|
.command('render', { hidden: true })
|
|
74
111
|
.description('Render the Peaks skill status line for the current session (reads session JSON on stdin; honors --project for the project label).')
|
|
75
112
|
.option('--project <path>', 'project root path (used to label the status line when stdin is absent)')
|
|
76
113
|
.action(async (options) => {
|
|
77
|
-
|
|
78
|
-
const stdin = parseStatusLineStdin(raw);
|
|
79
|
-
const seeded = options.project
|
|
80
|
-
? { ...(stdin ?? {}), workspace: { current_dir: options.project } }
|
|
81
|
-
: stdin;
|
|
82
|
-
const model = buildStatusLineModel(seeded, Date.now());
|
|
83
|
-
const text = renderStatusLine(model);
|
|
84
|
-
if (options.json === true) {
|
|
85
|
-
io.stdout(JSON.stringify({ ok: true, command: 'statusline.render', data: { text } }, null, 2));
|
|
86
|
-
return;
|
|
87
|
-
}
|
|
88
|
-
io.stdout(text);
|
|
114
|
+
await runDefaultStatuslineRender(options, io);
|
|
89
115
|
});
|
|
90
116
|
addJsonOption(statusline
|
|
91
117
|
.command('install')
|
|
@@ -166,4 +192,40 @@ export function registerStatusLineCommands(program, io) {
|
|
|
166
192
|
process.exitCode = 1;
|
|
167
193
|
}
|
|
168
194
|
});
|
|
195
|
+
// peaks statusline compact (slice 2026-07-30-compact-visibility)
|
|
196
|
+
addJsonOption(statusline
|
|
197
|
+
.command('compact')
|
|
198
|
+
.description('Render the single-line auto-compact indicator the LLM embeds ' +
|
|
199
|
+
"in Claude Code's statusline. Default output is plain text; " +
|
|
200
|
+
'pass --json for the structured envelope.')
|
|
201
|
+
.option('--project <path>', 'project root (auto-detected from cwd when omitted)')
|
|
202
|
+
.option('--session-id <sid>', 'override the active session id (defaults to the canonical binding)')
|
|
203
|
+
.action((options) => {
|
|
204
|
+
try {
|
|
205
|
+
const projectRoot = options.project !== undefined
|
|
206
|
+
? options.project
|
|
207
|
+
: (findProjectRoot(process.cwd()) ?? process.cwd());
|
|
208
|
+
const sid = options.sessionId ?? getSessionIdCanonical(projectRoot) ?? null;
|
|
209
|
+
const state = decideCompactStatusline({
|
|
210
|
+
projectRoot,
|
|
211
|
+
sessionId: sid,
|
|
212
|
+
now: Date.now(),
|
|
213
|
+
});
|
|
214
|
+
const label = renderCompactStatusline(state);
|
|
215
|
+
// For non-JSON mode we print the LABEL DIRECTLY to stdout
|
|
216
|
+
// (no envelope wrapping) because the consumer is the IDE
|
|
217
|
+
// statusline, not a peaks-Loop caller.
|
|
218
|
+
if (options.json === true) {
|
|
219
|
+
printResult(io, ok('statusline.compact', { label, state }), options.json);
|
|
220
|
+
}
|
|
221
|
+
else {
|
|
222
|
+
process.stdout.write(`${label}\n`);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
catch (error) {
|
|
226
|
+
const message = getErrorMessage(error);
|
|
227
|
+
printResult(io, fail('statusline.compact', 'STATUSLINE_COMPACT_FAILED', message, {}, [message]), options.json);
|
|
228
|
+
process.exitCode = 1;
|
|
229
|
+
}
|
|
230
|
+
}));
|
|
169
231
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { registerDispatchCommand } from './dispatch-commands.js';
|
|
2
2
|
import { registerHeartbeatCommand } from './heartbeat-commands.js';
|
|
3
|
-
import { registerShareCommand, registerSharedReadCommand, registerAwaitCommand } from './share-commands.js';
|
|
3
|
+
import { registerShareCommand, registerSharedReadCommand, registerAwaitCommand, registerFinalizeCommand } from './share-commands.js';
|
|
4
4
|
// Re-export `validateRole` for backward compat — the integration test
|
|
5
5
|
// suite and any external callers still import it from this entry file.
|
|
6
6
|
// The canonical implementation now lives in `sub-agent-shared.ts`.
|
|
@@ -16,4 +16,5 @@ export function registerSubAgentCommands(program, io) {
|
|
|
16
16
|
registerShareCommand(subAgent, io);
|
|
17
17
|
registerSharedReadCommand(subAgent, io);
|
|
18
18
|
registerAwaitCommand(subAgent, io);
|
|
19
|
+
registerFinalizeCommand(subAgent, io); // D21
|
|
19
20
|
}
|