peaks-loop 4.0.0-beta.9 → 4.0.3
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 +572 -234
- package/README-en.md +67 -30
- package/README.md +67 -30
- 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 +91 -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,231 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `peaks lease-metrics` — slice 2026-07-29-worktree-l2-extended Part 4.A + Part 5.
|
|
3
|
+
*
|
|
4
|
+
* Part 4.A: aggregate lease-kind observability events for one session,
|
|
5
|
+
* render per-kind counts + a 5-event chronological tail.
|
|
6
|
+
*
|
|
7
|
+
* Part 5 adds:
|
|
8
|
+
* - `--rate` : leak-rate computation (spawn - release - gc)
|
|
9
|
+
* plus lifetime stats (avg / p99) per lease id.
|
|
10
|
+
* - `--all-sessions` : aggregate across every session under
|
|
11
|
+
* `.peaks/_runtime/<sid>/metrics/slices.jsonl`
|
|
12
|
+
* for the given project root. Useful for
|
|
13
|
+
* cross-session dashboards.
|
|
14
|
+
*
|
|
15
|
+
* Aggregation is pure (operates on already-read ObservabilityEvent[]);
|
|
16
|
+
* the IO layer is the JSONL read at the call site. The reader filters
|
|
17
|
+
* on `category === 'lease'`; the schema is the same as every other
|
|
18
|
+
* observability event (Part 4.A reused the existing schema v1).
|
|
19
|
+
*/
|
|
20
|
+
import { existsSync, readdirSync, statSync } from 'node:fs';
|
|
21
|
+
import { join } from 'node:path';
|
|
22
|
+
import { fail, ok } from 'peaks-loop-shared/result';
|
|
23
|
+
import { addJsonOption, printResult } from '../cli-helpers.js';
|
|
24
|
+
import { findProjectRoot } from '../../services/config/config-safety.js';
|
|
25
|
+
import { getCurrentSessionId } from '../../services/skills/skill-presence-service.js';
|
|
26
|
+
import { readObservabilityEvents } from '../../services/observability/observability-service.js';
|
|
27
|
+
const EMPTY_COUNTS = {
|
|
28
|
+
spawn: 0,
|
|
29
|
+
renew: 0,
|
|
30
|
+
release: 0,
|
|
31
|
+
gc: 0,
|
|
32
|
+
autoRelease: 0,
|
|
33
|
+
'autoRelease-failed': 0,
|
|
34
|
+
'autoRelease-skipped': 0
|
|
35
|
+
};
|
|
36
|
+
/** Compute per-kind counts + chronological tail from a list of events. */
|
|
37
|
+
function aggregateLeaseEvents(leaseEvents) {
|
|
38
|
+
const counts = { ...EMPTY_COUNTS };
|
|
39
|
+
const recent = [];
|
|
40
|
+
for (const ev of leaseEvents) {
|
|
41
|
+
const detail = (ev.detail ?? {});
|
|
42
|
+
const kind = typeof detail['kind'] === 'string' ? detail['kind'] : 'unknown';
|
|
43
|
+
const leaseId = typeof detail['leaseId'] === 'string' ? detail['leaseId'] : '';
|
|
44
|
+
const rid = typeof detail['rid'] === 'string' ? detail['rid'] : null;
|
|
45
|
+
const reason = typeof detail['reason'] === 'string' ? detail['reason'] : null;
|
|
46
|
+
if (kind in counts) {
|
|
47
|
+
counts[kind] = (counts[kind] ?? 0) + 1;
|
|
48
|
+
}
|
|
49
|
+
recent.push({ ts: ev.ts, kind, leaseId, rid, reason });
|
|
50
|
+
}
|
|
51
|
+
recent.sort((a, b) => b.ts.localeCompare(a.ts));
|
|
52
|
+
return { counts: counts, tail: recent.slice(0, 5) };
|
|
53
|
+
}
|
|
54
|
+
export function recomputeRate(leaseEvents) {
|
|
55
|
+
// Count per-kind in one pass.
|
|
56
|
+
const counts = { ...EMPTY_COUNTS };
|
|
57
|
+
for (const ev of leaseEvents) {
|
|
58
|
+
const detail = (ev.detail ?? {});
|
|
59
|
+
const kind = typeof detail['kind'] === 'string' ? detail['kind'] : 'unknown';
|
|
60
|
+
if (kind in counts) {
|
|
61
|
+
counts[kind] = (counts[kind] ?? 0) + 1;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
const totalSpawn = counts['spawn'] ?? 0;
|
|
65
|
+
const totalRelease = (counts['release'] ?? 0) + (counts['gc'] ?? 0) + (counts['autoRelease'] ?? 0);
|
|
66
|
+
const estimatedActive = Math.max(0, totalSpawn - totalRelease);
|
|
67
|
+
const estimatedLeaked = Math.max(0, estimatedActive - (counts['autoRelease-failed'] ?? 0));
|
|
68
|
+
// Pair each lease id: first spawn → first terminal.
|
|
69
|
+
const firstSpawn = new Map();
|
|
70
|
+
const firstTerminal = new Map();
|
|
71
|
+
const tsOf = (ev) => Date.parse(ev.ts);
|
|
72
|
+
const leaseIdOf = (ev) => {
|
|
73
|
+
const d = (ev.detail ?? {});
|
|
74
|
+
return typeof d['leaseId'] === 'string' ? d['leaseId'] : '';
|
|
75
|
+
};
|
|
76
|
+
const kindOf = (ev) => {
|
|
77
|
+
const d = (ev.detail ?? {});
|
|
78
|
+
return typeof d['kind'] === 'string' ? d['kind'] : 'unknown';
|
|
79
|
+
};
|
|
80
|
+
for (const ev of leaseEvents) {
|
|
81
|
+
const id = leaseIdOf(ev);
|
|
82
|
+
if (id === '')
|
|
83
|
+
continue;
|
|
84
|
+
const t = tsOf(ev);
|
|
85
|
+
const k = kindOf(ev);
|
|
86
|
+
if (k === 'spawn' && !firstSpawn.has(id)) {
|
|
87
|
+
firstSpawn.set(id, t);
|
|
88
|
+
}
|
|
89
|
+
else if (k === 'release' || k === 'gc' || k === 'autoRelease' || k === 'autoRelease-failed') {
|
|
90
|
+
if (!firstTerminal.has(id))
|
|
91
|
+
firstTerminal.set(id, t);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
const lifetimes = [];
|
|
95
|
+
for (const [id, start] of firstSpawn) {
|
|
96
|
+
const end = firstTerminal.get(id);
|
|
97
|
+
if (end === undefined)
|
|
98
|
+
continue;
|
|
99
|
+
const dt = end - start;
|
|
100
|
+
if (dt >= 0)
|
|
101
|
+
lifetimes.push(dt);
|
|
102
|
+
}
|
|
103
|
+
lifetimes.sort((a, b) => a - b);
|
|
104
|
+
const avg = lifetimes.length === 0 ? null : Math.round(lifetimes.reduce((s, v) => s + v, 0) / lifetimes.length);
|
|
105
|
+
const p99 = lifetimes.length === 0
|
|
106
|
+
? null
|
|
107
|
+
: lifetimes[Math.min(lifetimes.length - 1, Math.floor(lifetimes.length * 0.99))] ?? null;
|
|
108
|
+
return {
|
|
109
|
+
totalSpawn,
|
|
110
|
+
totalTerminal: totalRelease,
|
|
111
|
+
estimatedActive,
|
|
112
|
+
estimatedLeaked,
|
|
113
|
+
completedLifetimes: lifetimes.length,
|
|
114
|
+
avgLifetimeMs: avg,
|
|
115
|
+
p99LifetimeMs: p99
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Part 5: enumerate every session under `.peaks/_runtime/` for a
|
|
120
|
+
* project root and aggregate their lease events. Sessions without
|
|
121
|
+
* a `metrics/slices.jsonl` are skipped silently (a clean project
|
|
122
|
+
* has no lease events to report; that's not an error).
|
|
123
|
+
*/
|
|
124
|
+
export function readAllSessionLeaseEvents(projectRoot) {
|
|
125
|
+
const runtimeDir = join(projectRoot, '.peaks', '_runtime');
|
|
126
|
+
if (!existsSync(runtimeDir))
|
|
127
|
+
return { sessions: [], missingSessions: 0 };
|
|
128
|
+
let entries;
|
|
129
|
+
try {
|
|
130
|
+
entries = readdirSync(runtimeDir);
|
|
131
|
+
}
|
|
132
|
+
catch {
|
|
133
|
+
return { sessions: [], missingSessions: 0 };
|
|
134
|
+
}
|
|
135
|
+
const sessions = [];
|
|
136
|
+
let missing = 0;
|
|
137
|
+
for (const sid of entries) {
|
|
138
|
+
const sessionDir = join(runtimeDir, sid);
|
|
139
|
+
try {
|
|
140
|
+
if (!statSync(sessionDir).isDirectory())
|
|
141
|
+
continue;
|
|
142
|
+
}
|
|
143
|
+
catch {
|
|
144
|
+
continue;
|
|
145
|
+
}
|
|
146
|
+
try {
|
|
147
|
+
const all = readObservabilityEvents(projectRoot, sid);
|
|
148
|
+
const leaseEvents = all.filter((e) => e.category === 'lease');
|
|
149
|
+
if (leaseEvents.length === 0) {
|
|
150
|
+
missing++;
|
|
151
|
+
continue;
|
|
152
|
+
}
|
|
153
|
+
sessions.push({ sessionId: sid, events: leaseEvents });
|
|
154
|
+
}
|
|
155
|
+
catch {
|
|
156
|
+
missing++;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
return { sessions, missingSessions: missing };
|
|
160
|
+
}
|
|
161
|
+
export function registerLeaseMetricsCommand(parent, io) {
|
|
162
|
+
addJsonOption(parent
|
|
163
|
+
.command('lease-metrics')
|
|
164
|
+
.description('Aggregate lease-kind observability events. Default: per-kind counts + 5-event tail for the current session. --rate: leak rate + lifetime stats. --all-sessions: aggregate across every session under .peaks/_runtime/.')
|
|
165
|
+
.option('--session <sid>', 'override session id (default: read .peaks/_runtime/session.json)')
|
|
166
|
+
.option('--project <path>', 'project root (default: findProjectRoot(cwd))')
|
|
167
|
+
.option('--rate', 'compute leak rate (spawn - terminal) + lifetime stats (avg / p99)')
|
|
168
|
+
.option('--all-sessions', 'aggregate across every session under .peaks/_runtime/ (ignores --session)')).action((options) => {
|
|
169
|
+
try {
|
|
170
|
+
const projectRoot = options.project ?? findProjectRoot(process.cwd()) ?? process.cwd();
|
|
171
|
+
const allSessions = options.allSessions === true;
|
|
172
|
+
const showRate = options.rate === true;
|
|
173
|
+
if (allSessions) {
|
|
174
|
+
// Aggregate across every session.
|
|
175
|
+
const { sessions, missingSessions } = readAllSessionLeaseEvents(projectRoot);
|
|
176
|
+
const allEvents = sessions.flatMap((s) => s.events);
|
|
177
|
+
const { counts, tail } = aggregateLeaseEvents(allEvents);
|
|
178
|
+
const rate = showRate ? recomputeRate(allEvents) : null;
|
|
179
|
+
const envelope = {
|
|
180
|
+
mode: 'all-sessions',
|
|
181
|
+
projectRoot,
|
|
182
|
+
sessionCount: sessions.length,
|
|
183
|
+
missingSessions,
|
|
184
|
+
sessions: sessions.map((s) => ({ sessionId: s.sessionId, leaseEvents: s.events.length })),
|
|
185
|
+
totalEvents: allEvents.length,
|
|
186
|
+
counts,
|
|
187
|
+
tail
|
|
188
|
+
};
|
|
189
|
+
if (rate !== null)
|
|
190
|
+
envelope['rate'] = rate;
|
|
191
|
+
printResult(io, ok('lease.metrics', envelope, [], [
|
|
192
|
+
`${sessions.length} session(s) reported lease events; ${missingSessions} session(s) had no events.`,
|
|
193
|
+
showRate && rate !== null
|
|
194
|
+
? `${rate.estimatedActive} estimated active, ${rate.estimatedLeaked} estimated leaked across sessions.`
|
|
195
|
+
: 'Pass --rate to see leak-rate + lifetime stats.'
|
|
196
|
+
]), options.json);
|
|
197
|
+
return;
|
|
198
|
+
}
|
|
199
|
+
// Single-session path (the Part 4.A default).
|
|
200
|
+
const sessionId = options.session ?? process.env.PEAKS_SESSION_ID ?? getCurrentSessionId(projectRoot) ?? 'unknown-sid';
|
|
201
|
+
const allEvents = readObservabilityEvents(projectRoot, sessionId);
|
|
202
|
+
const leaseEvents = allEvents.filter((e) => e.category === 'lease');
|
|
203
|
+
const { counts, tail } = aggregateLeaseEvents(leaseEvents);
|
|
204
|
+
const rate = showRate ? recomputeRate(leaseEvents) : null;
|
|
205
|
+
const envelope = {
|
|
206
|
+
mode: 'single-session',
|
|
207
|
+
sessionId,
|
|
208
|
+
projectRoot,
|
|
209
|
+
totalEvents: allEvents.length,
|
|
210
|
+
leaseEvents: leaseEvents.length,
|
|
211
|
+
counts,
|
|
212
|
+
tail
|
|
213
|
+
};
|
|
214
|
+
if (rate !== null)
|
|
215
|
+
envelope['rate'] = rate;
|
|
216
|
+
printResult(io, ok('lease.metrics', envelope, [], [
|
|
217
|
+
`${leaseEvents.length} lease-kind events recorded for session ${sessionId}.`,
|
|
218
|
+
showRate && rate !== null
|
|
219
|
+
? `${rate.estimatedActive} estimated active, ${rate.estimatedLeaked} estimated leaked.`
|
|
220
|
+
: 'Run `peaks audit metrics --project .` for the full observability dashboard, or pass --rate / --all-sessions.'
|
|
221
|
+
]), options.json);
|
|
222
|
+
}
|
|
223
|
+
catch (err) {
|
|
224
|
+
printResult(io, fail('lease.metrics', 'METRICS_READ_FAILED', err instanceof Error ? err.message : String(err), { sessionId: options.session }, [
|
|
225
|
+
'Verify the project root + session id are correct.',
|
|
226
|
+
'For the full observability stream, run `peaks audit metrics --project .`.'
|
|
227
|
+
]), options.json);
|
|
228
|
+
process.exitCode = 1;
|
|
229
|
+
}
|
|
230
|
+
});
|
|
231
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `peaks lease-stats` — slice 2026-07-29-worktree-l2-extended Part 6.
|
|
3
|
+
*
|
|
4
|
+
* Single top-level command that aggregates lease observability for
|
|
5
|
+
* the whole project root and returns a summary envelope suitable
|
|
6
|
+
* for dashboards / pipelines:
|
|
7
|
+
*
|
|
8
|
+
* - per-kind counts (same as peaks lease-metrics)
|
|
9
|
+
* - leak rate (estimatedActive / estimatedLeaked)
|
|
10
|
+
* - per-rid breakdown: which request ids are still "alive"
|
|
11
|
+
* (i.e. the rid has a spawn event with no terminal)
|
|
12
|
+
* - per-role breakdown: lease spawns split by role
|
|
13
|
+
* - per-isolation breakdown: 'worktree' | 'container' | 'none'
|
|
14
|
+
* (Part 8 adds 'container')
|
|
15
|
+
*
|
|
16
|
+
* The per-rid / per-role / per-isolation breakdowns use the
|
|
17
|
+
* `rid` / `role` fields on the observability detail (Part 4.A
|
|
18
|
+
* emitter passes these). The 'isolation' field is read off the
|
|
19
|
+
* underlying dispatch record via the readObservabilityEvents
|
|
20
|
+
* reader — but the events themselves don't carry isolation
|
|
21
|
+
* mode. To get that, we walk the dispatch records (not events)
|
|
22
|
+
* and join on the dispatch's `isolation` field. This is a
|
|
23
|
+
* cross-file read but the operation is cheap (each session's
|
|
24
|
+
* dispatch records are a small JSON set).
|
|
25
|
+
*
|
|
26
|
+
* Why this is a separate command from `peaks lease-metrics`:
|
|
27
|
+
* `lease-metrics` answers "what events did I record?" (event
|
|
28
|
+
* stream semantics). `lease-stats` answers "what's the project
|
|
29
|
+
* status right now?" (state semantics). The two compose:
|
|
30
|
+
* `lease-metrics --all-sessions` is the input, `lease-stats`
|
|
31
|
+
* is the answer.
|
|
32
|
+
*/
|
|
33
|
+
import { Command } from 'commander';
|
|
34
|
+
import { type ProgramIO } from '../cli-helpers.js';
|
|
35
|
+
import { type RateStats } from './lease-metrics-commands.js';
|
|
36
|
+
type RidCount = {
|
|
37
|
+
rid: string;
|
|
38
|
+
count: number;
|
|
39
|
+
};
|
|
40
|
+
type RoleCount = {
|
|
41
|
+
role: string;
|
|
42
|
+
count: number;
|
|
43
|
+
};
|
|
44
|
+
type IsolationCount = {
|
|
45
|
+
isolation: 'worktree' | 'container' | 'none';
|
|
46
|
+
count: number;
|
|
47
|
+
};
|
|
48
|
+
type LeaseStats = {
|
|
49
|
+
readonly projectRoot: string;
|
|
50
|
+
readonly sessionCount: number;
|
|
51
|
+
readonly totalLeaseEvents: number;
|
|
52
|
+
readonly rate: RateStats;
|
|
53
|
+
readonly perRid: ReadonlyArray<RidCount>;
|
|
54
|
+
readonly perRole: ReadonlyArray<RoleCount>;
|
|
55
|
+
readonly perIsolation: ReadonlyArray<IsolationCount>;
|
|
56
|
+
};
|
|
57
|
+
export declare function computeLeaseStats(args: {
|
|
58
|
+
projectRoot: string;
|
|
59
|
+
eventsBySession: ReadonlyArray<{
|
|
60
|
+
sessionId: string;
|
|
61
|
+
events: ReadonlyArray<unknown>;
|
|
62
|
+
}>;
|
|
63
|
+
}): LeaseStats;
|
|
64
|
+
export declare function registerLeaseStatsCommand(parent: Command, io: ProgramIO): void;
|
|
65
|
+
export {};
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `peaks lease-stats` — slice 2026-07-29-worktree-l2-extended Part 6.
|
|
3
|
+
*
|
|
4
|
+
* Single top-level command that aggregates lease observability for
|
|
5
|
+
* the whole project root and returns a summary envelope suitable
|
|
6
|
+
* for dashboards / pipelines:
|
|
7
|
+
*
|
|
8
|
+
* - per-kind counts (same as peaks lease-metrics)
|
|
9
|
+
* - leak rate (estimatedActive / estimatedLeaked)
|
|
10
|
+
* - per-rid breakdown: which request ids are still "alive"
|
|
11
|
+
* (i.e. the rid has a spawn event with no terminal)
|
|
12
|
+
* - per-role breakdown: lease spawns split by role
|
|
13
|
+
* - per-isolation breakdown: 'worktree' | 'container' | 'none'
|
|
14
|
+
* (Part 8 adds 'container')
|
|
15
|
+
*
|
|
16
|
+
* The per-rid / per-role / per-isolation breakdowns use the
|
|
17
|
+
* `rid` / `role` fields on the observability detail (Part 4.A
|
|
18
|
+
* emitter passes these). The 'isolation' field is read off the
|
|
19
|
+
* underlying dispatch record via the readObservabilityEvents
|
|
20
|
+
* reader — but the events themselves don't carry isolation
|
|
21
|
+
* mode. To get that, we walk the dispatch records (not events)
|
|
22
|
+
* and join on the dispatch's `isolation` field. This is a
|
|
23
|
+
* cross-file read but the operation is cheap (each session's
|
|
24
|
+
* dispatch records are a small JSON set).
|
|
25
|
+
*
|
|
26
|
+
* Why this is a separate command from `peaks lease-metrics`:
|
|
27
|
+
* `lease-metrics` answers "what events did I record?" (event
|
|
28
|
+
* stream semantics). `lease-stats` answers "what's the project
|
|
29
|
+
* status right now?" (state semantics). The two compose:
|
|
30
|
+
* `lease-metrics --all-sessions` is the input, `lease-stats`
|
|
31
|
+
* is the answer.
|
|
32
|
+
*/
|
|
33
|
+
import { fail, ok } from 'peaks-loop-shared/result';
|
|
34
|
+
import { addJsonOption, printResult } from '../cli-helpers.js';
|
|
35
|
+
import { findProjectRoot } from '../../services/config/config-safety.js';
|
|
36
|
+
import { readAllSessionLeaseEvents, recomputeRate } from './lease-metrics-commands.js';
|
|
37
|
+
function tallyByField(events, field) {
|
|
38
|
+
const out = new Map();
|
|
39
|
+
for (const ev of events) {
|
|
40
|
+
const v = ev.detail[field];
|
|
41
|
+
if (typeof v !== 'string' || v.length === 0)
|
|
42
|
+
continue;
|
|
43
|
+
out.set(v, (out.get(v) ?? 0) + 1);
|
|
44
|
+
}
|
|
45
|
+
return out;
|
|
46
|
+
}
|
|
47
|
+
export function computeLeaseStats(args) {
|
|
48
|
+
// The events pass through `tallyByField` (which only reads
|
|
49
|
+
// `detail`) and through `recomputeRate` (which reads `detail` +
|
|
50
|
+
// `ts`). The interface is widened to `unknown` here so the
|
|
51
|
+
// caller can pass any observability-event-shaped object;
|
|
52
|
+
// `recomputeRate`'s parameter type is the canonical
|
|
53
|
+
// `ObservabilityEvent[]`, so we cast at the boundary.
|
|
54
|
+
const allEvents = args.eventsBySession.flatMap((s) => s.events);
|
|
55
|
+
const rate = recomputeRate(allEvents);
|
|
56
|
+
const ridTally = tallyByField(allEvents, 'rid');
|
|
57
|
+
const roleTally = tallyByField(allEvents, 'role');
|
|
58
|
+
const isoTally = new Map();
|
|
59
|
+
for (const ev of allEvents) {
|
|
60
|
+
const detail = ev.detail;
|
|
61
|
+
const iso = typeof detail['isolation'] === 'string' ? detail['isolation'] : 'none';
|
|
62
|
+
isoTally.set(iso, (isoTally.get(iso) ?? 0) + 1);
|
|
63
|
+
}
|
|
64
|
+
return {
|
|
65
|
+
projectRoot: args.projectRoot,
|
|
66
|
+
sessionCount: args.eventsBySession.length,
|
|
67
|
+
totalLeaseEvents: allEvents.length,
|
|
68
|
+
rate,
|
|
69
|
+
perRid: Array.from(ridTally.entries())
|
|
70
|
+
.map(([rid, count]) => ({ rid, count }))
|
|
71
|
+
.sort((a, b) => b.count - a.count)
|
|
72
|
+
.slice(0, 20),
|
|
73
|
+
perRole: Array.from(roleTally.entries())
|
|
74
|
+
.map(([role, count]) => ({ role, count }))
|
|
75
|
+
.sort((a, b) => b.count - a.count),
|
|
76
|
+
perIsolation: Array.from(isoTally.entries())
|
|
77
|
+
.map(([isolation, count]) => ({ isolation: isolation, count }))
|
|
78
|
+
.sort((a, b) => b.count - a.count)
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
export function registerLeaseStatsCommand(parent, io) {
|
|
82
|
+
addJsonOption(parent
|
|
83
|
+
.command('lease-stats')
|
|
84
|
+
.description('Project-wide lease summary: counts, leak rate, per-rid / per-role / per-isolation breakdown. Always aggregates across every session in the project root.')
|
|
85
|
+
.option('--project <path>', 'project root (default: findProjectRoot(cwd))')).action((options) => {
|
|
86
|
+
try {
|
|
87
|
+
const projectRoot = options.project ?? findProjectRoot(process.cwd()) ?? process.cwd();
|
|
88
|
+
const { sessions } = readAllSessionLeaseEvents(projectRoot);
|
|
89
|
+
const eventsBySession = sessions.map((s) => ({
|
|
90
|
+
sessionId: s.sessionId,
|
|
91
|
+
events: s.events.map((e) => ({ detail: (e.detail ?? {}) }))
|
|
92
|
+
}));
|
|
93
|
+
const stats = computeLeaseStats({ projectRoot, eventsBySession });
|
|
94
|
+
printResult(io, ok('lease.stats', stats, [], [
|
|
95
|
+
`${stats.totalLeaseEvents} lease events across ${stats.sessionCount} session(s); ${stats.rate.estimatedActive} estimated active, ${stats.rate.estimatedLeaked} estimated leaked.`,
|
|
96
|
+
stats.perRid.length > 0 ? `Top rid: ${stats.perRid[0]?.rid} (${stats.perRid[0]?.count} events).` : '',
|
|
97
|
+
'Pipe to `jq` or paste into a dashboard for visual rendering.'
|
|
98
|
+
].filter(Boolean)), options.json);
|
|
99
|
+
}
|
|
100
|
+
catch (err) {
|
|
101
|
+
printResult(io, fail('lease.stats', 'STATS_READ_FAILED', err instanceof Error ? err.message : String(err), { projectRoot: options.project }, [
|
|
102
|
+
'Verify the project root is correct.'
|
|
103
|
+
]), options.json);
|
|
104
|
+
process.exitCode = 1;
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
}
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
*/
|
|
9
9
|
import { findProjectRoot } from '../../services/config/config-safety.js';
|
|
10
10
|
import { detectLegacy } from '../../services/legacy/legacy-detector.js';
|
|
11
|
-
import { ok } from '
|
|
11
|
+
import { ok } from 'peaks-loop-shared/result';
|
|
12
12
|
import { addJsonOption, printResult } from '../cli-helpers.js';
|
|
13
13
|
export function registerLegacyCommands(program, io) {
|
|
14
14
|
addJsonOption(program
|
|
@@ -16,7 +16,7 @@ import { join } from 'node:path';
|
|
|
16
16
|
import { homedir } from 'node:os';
|
|
17
17
|
import { tailLog, listLogFiles } from '../../services/log/log-commands-service.js';
|
|
18
18
|
import { getErrorMessage, printResult, addJsonOption } from '../cli-helpers.js';
|
|
19
|
-
import { ok, fail } from '
|
|
19
|
+
import { ok, fail } from 'peaks-loop-shared/result';
|
|
20
20
|
export function registerLogCommands(program, io) {
|
|
21
21
|
const log = program
|
|
22
22
|
.command('log')
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
import { existsSync, mkdirSync } from 'node:fs';
|
|
26
26
|
import { join } from 'node:path';
|
|
27
27
|
import { addJsonOption, getErrorMessage, printResult } from '../cli-helpers.js';
|
|
28
|
-
import { fail, ok } from '
|
|
28
|
+
import { fail, ok } from 'peaks-loop-shared/result';
|
|
29
29
|
import { findProjectRoot } from '../../services/config/config-safety.js';
|
|
30
30
|
import { openStateDb } from '../../services/skillhub/sqlite-store.js';
|
|
31
31
|
import { writeBundle, BundleNotShareableError, BundleAssetNotFoundError, } from '../../services/share/bundle-writer.js';
|
|
@@ -7,7 +7,7 @@ import { runMonotonicCheck, resolveMonotonicContext } from '../../services/loop/
|
|
|
7
7
|
import { resolveLoopSpec, persistSpec, buildSpec, lintLoopSpec, lintSpecFile, specPath, MONOTONIC_TERMINATION, DEFAULT_MAX_CYCLES } from '../../services/loop/spec-service.js';
|
|
8
8
|
import { runLoop, resolveRunContext } from '../../services/loop/run-driver.js';
|
|
9
9
|
import { addJsonOption, getErrorMessage, printResult } from '../cli-helpers.js';
|
|
10
|
-
import { fail, ok } from '
|
|
10
|
+
import { fail, ok } from 'peaks-loop-shared/result';
|
|
11
11
|
import { findProjectRoot } from '../../services/config/config-safety.js';
|
|
12
12
|
const VALID_EVALUATORS = new Set([
|
|
13
13
|
'karpathy',
|
|
@@ -2,7 +2,7 @@ import { findProjectRoot } from '../../services/config/config-safety.js';
|
|
|
2
2
|
import { resolveCanonicalProjectRoot } from '../../services/config/config-service.js';
|
|
3
3
|
import { loadMemoryIndex, searchMemoryWithResults } from '../../services/memory/memory-search-service.js';
|
|
4
4
|
import { pickFromList } from '../../services/fuzzy-matching/fzf-pick-service.js';
|
|
5
|
-
import { fail, ok } from '
|
|
5
|
+
import { fail, ok } from 'peaks-loop-shared/result';
|
|
6
6
|
import { getErrorMessage, printResult } from '../cli-helpers.js';
|
|
7
7
|
import { join } from 'node:path';
|
|
8
8
|
const VALID_KINDS = [
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* `.peaks/_runtime/<sid>/<role>/<file>.md` path. Default is dry-run; pass
|
|
7
7
|
* `--apply` to actually `rename` the files and remove emptied legacy dirs.
|
|
8
8
|
*/
|
|
9
|
-
import { ok, fail } from '
|
|
9
|
+
import { ok, fail } from 'peaks-loop-shared/result';
|
|
10
10
|
import { resolveCanonicalProjectRoot } from '../../services/config/config-service.js';
|
|
11
11
|
import { addJsonOption } from '../cli-helpers.js';
|
|
12
12
|
import { planMigrate1_4_1, applyMigrate1_4_1 } from '../../services/workspace/migrate-1-4-1-service.js';
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
import { addJsonOption } from '../cli-helpers.js';
|
|
19
19
|
import { resolveCanonicalProjectRoot } from '../../services/config/config-service.js';
|
|
20
20
|
import { planV2ToV11Migration, applyV2ToV11Migration, dryRunV2ToV11Migration } from '../../services/migration/v2-10-to-v2-11-service.js';
|
|
21
|
-
import { ok, fail } from '
|
|
21
|
+
import { ok, fail } from 'peaks-loop-shared/result';
|
|
22
22
|
export function registerMigrateV2ToV11Command(workspace, io) {
|
|
23
23
|
addJsonOption(workspace
|
|
24
24
|
.command('migrate-v2-10-to-v2-11')
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Command } from 'commander';
|
|
2
|
-
import { type StrykerInvoker } from '
|
|
2
|
+
import { type StrykerInvoker } from 'peaks-loop-mut';
|
|
3
3
|
import type { ProgramIO } from '../cli-helpers.js';
|
|
4
4
|
export interface MutCommandsOptions {
|
|
5
5
|
readonly invokeStryker: StrykerInvoker;
|
|
@@ -15,11 +15,7 @@
|
|
|
15
15
|
*/
|
|
16
16
|
import { readFile } from 'node:fs/promises';
|
|
17
17
|
import { Command } from 'commander';
|
|
18
|
-
import { scanAssertions } from '
|
|
19
|
-
import { runMutation } from '../../services/mut/mut-runner.js';
|
|
20
|
-
import { buildMutReport } from '../../services/mut/report-builder.js';
|
|
21
|
-
import { createProductionStrykerInvoker } from '../../services/mut/production-stryker.js';
|
|
22
|
-
import { MutReportSchema } from '../../services/mut/types.js';
|
|
18
|
+
import { scanAssertions, runMutation, buildMutReport, createProductionStrykerInvoker, MutReportSchema, } from 'peaks-loop-mut';
|
|
23
19
|
/**
|
|
24
20
|
* Pure helper: a stub AssertionsReport used when only Stryker ran.
|
|
25
21
|
* The mutants-only path does NOT touch the AST scanner; we still need
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
*/
|
|
20
20
|
import { findProjectRoot } from '../../services/config/config-safety.js';
|
|
21
21
|
import { resolveCanonicalProjectRoot } from '../../services/config/config-service.js';
|
|
22
|
-
import { fail, ok } from '
|
|
22
|
+
import { fail, ok } from 'peaks-loop-shared/result';
|
|
23
23
|
import { getSessionIdCanonical } from '../../services/session/session-manager.js';
|
|
24
24
|
import { addJsonOption, getErrorMessage, printResult } from '../cli-helpers.js';
|
|
25
25
|
import { aggregateFanout, aggregateRepairCycles, aggregateSlices, aggregateStatus, filterByPeriod, periodStartIso, readAllSessionEvents, readSessionEvents } from '../../services/observability/aggregation.js';
|
|
@@ -3,11 +3,11 @@ import { loadOpenSpecChange, scanOpenSpec } from '../../services/openspec/opensp
|
|
|
3
3
|
import { projectOpenSpecToRdInput } from '../../services/openspec/openspec-bridge-service.js';
|
|
4
4
|
import { renderOpenSpecChange } from '../../services/openspec/openspec-render-service.js';
|
|
5
5
|
import { validateOpenSpecChange } from '../../services/openspec/openspec-validate-service.js';
|
|
6
|
-
import { archiveOpenSpecChange } from '../../services/openspec/openspec-archive-service.js';
|
|
6
|
+
import { archiveOpenSpecChange, OpenSpecArchiveError } from '../../services/openspec/openspec-archive-service.js';
|
|
7
7
|
import { executeOpenSpecInit } from '../../services/openspec/openspec-init-service.js';
|
|
8
8
|
import { proposeFromDoctor } from '../../services/openspec/openspec-propose-from-doctor-service.js';
|
|
9
|
-
import { runDoctor } from '../../services/doctor/
|
|
10
|
-
import { fail, ok } from '
|
|
9
|
+
import { runDoctor } from '../../services/doctor/index.js';
|
|
10
|
+
import { fail, ok } from 'peaks-loop-shared/result';
|
|
11
11
|
import { addJsonOption, getErrorMessage, printResult } from '../cli-helpers.js';
|
|
12
12
|
function resolveScanOptions(project) {
|
|
13
13
|
if (project === undefined) {
|
|
@@ -143,6 +143,8 @@ export function registerOpenSpecCommands(program, io) {
|
|
|
143
143
|
.argument('<changeId>', 'OpenSpec change directory name under openspec/changes')
|
|
144
144
|
.option('--project <path>', 'project root containing an openspec/ directory')
|
|
145
145
|
.option('--apply', 'actually move the change directory')
|
|
146
|
+
.option('--force', 'bypass the Pre-cond 2 Coverage Evidence gate (use only after confirming the gap is acceptable for this archive)')
|
|
147
|
+
.option('--coverage-summary <path>', 'override coverage-summary.json discovery (Fix-6B). Default: <projectRoot>/coverage/coverage-summary.json, then <projectRoot>/openspec/coverage-summary.json')
|
|
146
148
|
.option('--archive-dir <name>', 'archive subdirectory name (default: archive)')).action(async (changeId, options) => {
|
|
147
149
|
try {
|
|
148
150
|
const scan = resolveScanOptions(options.project);
|
|
@@ -153,6 +155,12 @@ export function registerOpenSpecCommands(program, io) {
|
|
|
153
155
|
if (options.apply === true) {
|
|
154
156
|
archiveOptions.apply = true;
|
|
155
157
|
}
|
|
158
|
+
if (options.force === true) {
|
|
159
|
+
archiveOptions.force = true;
|
|
160
|
+
}
|
|
161
|
+
if (options.coverageSummary !== undefined) {
|
|
162
|
+
archiveOptions.coverageSummaryPath = options.coverageSummary;
|
|
163
|
+
}
|
|
156
164
|
if (options.archiveDir !== undefined) {
|
|
157
165
|
archiveOptions.archiveDirName = options.archiveDir;
|
|
158
166
|
}
|
|
@@ -162,9 +170,21 @@ export function registerOpenSpecCommands(program, io) {
|
|
|
162
170
|
process.exitCode = 1;
|
|
163
171
|
return;
|
|
164
172
|
}
|
|
165
|
-
|
|
173
|
+
const warnings = [];
|
|
174
|
+
if (result.coverageGateBypassed === true) {
|
|
175
|
+
warnings.push('Coverage gate bypassed via --force; archived with at least one uncovered requirement.');
|
|
176
|
+
}
|
|
177
|
+
if (result.coverageMismatchBypassed === true) {
|
|
178
|
+
warnings.push('Coverage summary mismatch bypassed via --force; archived with at least one capability below 100%.');
|
|
179
|
+
}
|
|
180
|
+
printResult(io, ok('openspec.archive', result, warnings, result.applied ? [] : [`Re-run with --apply to move ${result.from} → ${result.to}`]), options.json);
|
|
166
181
|
}
|
|
167
182
|
catch (error) {
|
|
183
|
+
if (error instanceof OpenSpecArchiveError) {
|
|
184
|
+
printResult(io, fail('openspec.archive', error.code, getErrorMessage(error), error.detail, nextActionsForArchiveError(error.code)), options.json);
|
|
185
|
+
process.exitCode = 1;
|
|
186
|
+
return;
|
|
187
|
+
}
|
|
168
188
|
printResult(io, fail('openspec.archive', 'OPENSPEC_ARCHIVE_FAILED', getErrorMessage(error), { changeId }, ['Check the project path and openspec/ layout before retrying']), options.json);
|
|
169
189
|
process.exitCode = 1;
|
|
170
190
|
}
|
|
@@ -235,3 +255,44 @@ export function registerOpenSpecCommands(program, io) {
|
|
|
235
255
|
}
|
|
236
256
|
});
|
|
237
257
|
}
|
|
258
|
+
/**
|
|
259
|
+
* Per-error-code remediation hints for the archive gate.
|
|
260
|
+
* Centralized here so the catch block stays readable and the next-actions
|
|
261
|
+
* can be reviewed in isolation.
|
|
262
|
+
*/
|
|
263
|
+
function nextActionsForArchiveError(code) {
|
|
264
|
+
switch (code) {
|
|
265
|
+
case 'OPENSPEC_COVERAGE_GATE_PARTIAL':
|
|
266
|
+
return [
|
|
267
|
+
'Update the Coverage Evidence table to mark each failing requirement as covered',
|
|
268
|
+
'Or re-run with --force to bypass the gate after confirming the gap is acceptable'
|
|
269
|
+
];
|
|
270
|
+
case 'OPENSPEC_COVERAGE_GATE_FAILED':
|
|
271
|
+
return [
|
|
272
|
+
'Add the missing Coverage Evidence or Capability Mapping block to proposal.md (see error.message)',
|
|
273
|
+
'Or re-run with --force to bypass the gate after confirming the gap is acceptable'
|
|
274
|
+
];
|
|
275
|
+
case 'OPENSPEC_COVERAGE_EVIDENCE_MALFORMED':
|
|
276
|
+
return [
|
|
277
|
+
'Fix the proposal.md Coverage Evidence table — the heading exists but no parsable rows were found',
|
|
278
|
+
'Expected shape: | capability | requirement | status | testAnchor | with status in {covered, partial, uncovered}'
|
|
279
|
+
];
|
|
280
|
+
case 'OPENSPEC_COVERAGE_EVIDENCE_MISSING':
|
|
281
|
+
return [
|
|
282
|
+
'Run `pnpm test:coverage` (which invokes scripts/coverage-c8.mjs) to generate coverage-summary.json',
|
|
283
|
+
'Or pass --coverage-summary <path> to point at an existing summary',
|
|
284
|
+
'Or re-run with --force to bypass the gate'
|
|
285
|
+
];
|
|
286
|
+
case 'OPENSPEC_COVERAGE_EVIDENCE_STALE':
|
|
287
|
+
return [
|
|
288
|
+
'Re-run `pnpm test:coverage` to refresh coverage-summary.json',
|
|
289
|
+
'Or re-run with --force to bypass the gate after confirming the source delta is acceptable'
|
|
290
|
+
];
|
|
291
|
+
case 'OPENSPEC_COVERAGE_EVIDENCE_MISMATCH':
|
|
292
|
+
return [
|
|
293
|
+
'Inspect error.detail.mismatches[] — each entry lists the failing capability, file, and actual pct',
|
|
294
|
+
'Close the coverage gap (add tests or update the Capability Mapping block in proposal.md)',
|
|
295
|
+
'Or re-run with --force to bypass the gate after confirming the gap is acceptable'
|
|
296
|
+
];
|
|
297
|
+
}
|
|
298
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { readFileSync } from 'node:fs';
|
|
2
|
-
import { detectPerfAudit, isPerfAuditEnvelope, runPerfAudit, } from '../../services/audit-independent/
|
|
2
|
+
import { detectPerfAudit, isPerfAuditEnvelope, runPerfAudit, } from '../../services/audit-independent/index.js';
|
|
3
3
|
import { addJsonOption, getErrorMessage, printResult } from '../cli-helpers.js';
|
|
4
|
-
import { fail, ok } from '
|
|
4
|
+
import { fail, ok } from 'peaks-loop-shared/result';
|
|
5
5
|
function resolveEnvelope(envelopePath) {
|
|
6
6
|
if (envelopePath === undefined || envelopePath === '-') {
|
|
7
7
|
// Read from stdin
|
|
@@ -36,7 +36,7 @@ function readStdinSync() {
|
|
|
36
36
|
}
|
|
37
37
|
export function registerPerfAuditCommands(program, io) {
|
|
38
38
|
const perfAudit = program
|
|
39
|
-
.command('perf-audit')
|
|
39
|
+
.command('perf-audit', { hidden: true })
|
|
40
40
|
.description('Independent performance audit skill driver. Reads the immutable peaks-prd handoff (sha256-locked) + the project-level perf-template.md, then writes a structured perf-<rid>.md artifact. Decoupled from peaks-rd 5-way fan-out per slice v2.12.0 (Group A, Tier 3). See skills/bee/peaks-perf-audit/SKILL.md for the full workflow.');
|
|
41
41
|
addJsonOption(perfAudit
|
|
42
42
|
.command('detect')
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { executePerfBaselineInit, resolveProjectRootFromCwd } from '../../services/perf/perf-baseline-service.js';
|
|
2
|
-
import { fail, ok } from '
|
|
2
|
+
import { fail, ok } from 'peaks-loop-shared/result';
|
|
3
3
|
import { addJsonOption, getErrorMessage, printResult } from '../cli-helpers.js';
|
|
4
4
|
export function registerPerfCommands(program, io) {
|
|
5
5
|
const perf = program.command('perf').description('Manage performance baseline scaffolding for the RD stage');
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { existsSync } from 'node:fs';
|
|
2
2
|
import { addJsonOption, printResult } from '../cli-helpers.js';
|
|
3
|
-
import { fail, ok, getErrorMessage } from '
|
|
3
|
+
import { fail, ok, getErrorMessage } from 'peaks-loop-shared/result';
|
|
4
4
|
import { PolyrepoService } from '../../services/polyrepo/polyrepo-service.js';
|
|
5
5
|
function parseChildren(raw) {
|
|
6
6
|
if (raw === undefined || raw.length === 0)
|