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
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
*
|
|
10
10
|
* Per-IDE contract: given a sub-agent role + prompt + request/session ids,
|
|
11
11
|
* return a tool-call descriptor that the calling LLM should execute in
|
|
12
|
-
* its
|
|
12
|
+
* its own environment. The CLI is IDE-agnostic; per-IDE tool names
|
|
13
13
|
* (Claude Code's `Task`, Trae's UNVERIFIED placeholder) are encapsulated
|
|
14
14
|
* here, never leaked to SKILL.md.
|
|
15
15
|
*
|
|
@@ -27,6 +27,13 @@
|
|
|
27
27
|
* Cross-reference: PRD #002 G1 (AC-1..AC-5); RD tech-doc-002 §2.
|
|
28
28
|
*/
|
|
29
29
|
import { existsSync, readFileSync } from 'node:fs';
|
|
30
|
+
// Slice 2026-07-29-dispatch-stall-governance / S4 — the two near-
|
|
31
|
+
// identical poll loops in this file are now thin wrappers around
|
|
32
|
+
// `awaitBatch` (the unified implementation in ./await-batch.ts). The
|
|
33
|
+
// back-compat envelopes are preserved so the pre-S4 S3 character-
|
|
34
|
+
// ization tests + the existing call sites do not have to migrate in
|
|
35
|
+
// the same slice.
|
|
36
|
+
import { awaitBatch as awaitBatchUnified } from './await-batch.js';
|
|
30
37
|
/**
|
|
31
38
|
* Claude Code dispatcher. Real, byte-level implementation.
|
|
32
39
|
*
|
|
@@ -233,52 +240,26 @@ const claudeCodeBatchAwaiters = new Map();
|
|
|
233
240
|
* for the MVP; the real cross-process version uses heartbeat polling).
|
|
234
241
|
*/
|
|
235
242
|
export async function awaitClaudeCodeBatch(input) {
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
//
|
|
245
|
-
//
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
}
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
const outcome = readDispatchOutcome(slot.recordPath);
|
|
257
|
-
if (outcome === null)
|
|
258
|
-
continue;
|
|
259
|
-
slot.status = outcome.status;
|
|
260
|
-
slot.note = outcome.note;
|
|
261
|
-
slot.finishedAt = Date.now();
|
|
262
|
-
}
|
|
263
|
-
if (Array.from(remaining.values()).every((s) => s.finishedAt !== null))
|
|
264
|
-
break;
|
|
265
|
-
await new Promise((r) => setTimeout(r, pollIntervalMs));
|
|
266
|
-
}
|
|
267
|
-
for (const [idx, slot] of remaining) {
|
|
268
|
-
const finishedAt = slot.finishedAt ?? startedAt + capped;
|
|
269
|
-
results.push({
|
|
270
|
-
dispatchIndex: idx,
|
|
271
|
-
recordPath: slot.recordPath,
|
|
272
|
-
status: slot.status,
|
|
273
|
-
durationMs: finishedAt - startedAt,
|
|
274
|
-
note: slot.note
|
|
275
|
-
});
|
|
276
|
-
}
|
|
277
|
-
results.sort((a, b) => a.dispatchIndex - b.dispatchIndex);
|
|
278
|
-
// Touch batchId so the parameter is "used" — keeps the linter happy when
|
|
279
|
-
// the in-process queue (claudeCodeBatchAwaiters) is later wired up.
|
|
280
|
-
void batchId;
|
|
281
|
-
return results;
|
|
243
|
+
// Slice 2026-07-29-dispatch-stall-governance / S4 (G8) — this
|
|
244
|
+
// function is now a thin wrapper around the unified `awaitBatch`
|
|
245
|
+
// service. The back-compat envelope shape is preserved (one
|
|
246
|
+
// `SubAgentBatchResult` per record path) so the S3 characterization
|
|
247
|
+
// test stays green; the underlying loop is identical to the trae /
|
|
248
|
+
// trae-cn / codex / cursor wrappers below. The new typed outcome
|
|
249
|
+
// lives on the unified service; the S4 fail-fast test pins it.
|
|
250
|
+
//
|
|
251
|
+
// Slice 2026-07-30-nightshift: claude-code does NOT use a
|
|
252
|
+
// per-IDE note prefix. The 1.4 dogfood contract says the done
|
|
253
|
+
// note is `null` (raw outcome) and the failed note is the raw
|
|
254
|
+
// `outcome` string with no prefix. The 4 non-Claude IDEs
|
|
255
|
+
// (trae / trae-cn / codex / cursor) prefix the note with their
|
|
256
|
+
// per-IDE label so cross-IDE attribution is visible to the LLM.
|
|
257
|
+
// Passing no `notePrefix` here keeps the legacy contract.
|
|
258
|
+
const unified = await awaitBatchUnified(input.dispatchCount, input.recordPaths, input.timeoutMs, { defaultTimeoutMs: 60_000 });
|
|
259
|
+
// Touch batchId so the parameter remains in scope for any future
|
|
260
|
+
// in-process queue wiring.
|
|
261
|
+
void input.batchId;
|
|
262
|
+
return unified.results;
|
|
282
263
|
}
|
|
283
264
|
/** Best-effort outcome read for a dispatch record. Returns null if pending. */
|
|
284
265
|
function readDispatchOutcome(recordPath) {
|
|
@@ -305,48 +286,18 @@ function readDispatchOutcome(recordPath) {
|
|
|
305
286
|
}
|
|
306
287
|
}
|
|
307
288
|
export async function pollDispatchRecords(input, opts) {
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
const
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
remaining.set(i, { recordPath, status: 'timeout', note: null, finishedAt: null });
|
|
321
|
-
}
|
|
322
|
-
while (remaining.size > 0 && Date.now() - startedAt < capped) {
|
|
323
|
-
for (const [idx, slot] of remaining) {
|
|
324
|
-
if (slot.finishedAt !== null)
|
|
325
|
-
continue;
|
|
326
|
-
const outcome = readDispatchOutcome(slot.recordPath);
|
|
327
|
-
if (outcome === null)
|
|
328
|
-
continue;
|
|
329
|
-
slot.status = outcome.status;
|
|
330
|
-
slot.note = outcome.note;
|
|
331
|
-
slot.finishedAt = Date.now();
|
|
332
|
-
}
|
|
333
|
-
if (Array.from(remaining.values()).every((s) => s.finishedAt !== null))
|
|
334
|
-
break;
|
|
335
|
-
await new Promise((r) => setTimeout(r, pollIntervalMs));
|
|
336
|
-
}
|
|
337
|
-
for (const [idx, slot] of remaining) {
|
|
338
|
-
const finishedAt = slot.finishedAt ?? startedAt + capped;
|
|
339
|
-
const baseNote = slot.status === 'timeout' ? `${opts.notePrefix} (timeout)` : opts.notePrefix;
|
|
340
|
-
results.push({
|
|
341
|
-
dispatchIndex: idx,
|
|
342
|
-
recordPath: slot.recordPath,
|
|
343
|
-
status: slot.status,
|
|
344
|
-
durationMs: finishedAt - startedAt,
|
|
345
|
-
note: slot.note !== null ? `${baseNote} — ${slot.note}` : baseNote
|
|
346
|
-
});
|
|
347
|
-
}
|
|
348
|
-
results.sort((a, b) => a.dispatchIndex - b.dispatchIndex);
|
|
349
|
-
return results;
|
|
289
|
+
// Slice 2026-07-29-dispatch-stall-governance / S4 (G8) — this
|
|
290
|
+
// function is now a thin wrapper around the unified `awaitBatch`
|
|
291
|
+
// service. Pre-S4 it diverged from `awaitClaudeCodeBatch` in
|
|
292
|
+
// (a) the default-fallback source and (b) the `Math.max(deadline, 0)`
|
|
293
|
+
// step; the divergence is gone. The back-compat envelope (one
|
|
294
|
+
// `SubAgentBatchResult` per record path, with the IDE-prefixed
|
|
295
|
+
// note) is preserved.
|
|
296
|
+
const unified = await awaitBatchUnified(input.dispatchCount, input.recordPaths, input.timeoutMs, {
|
|
297
|
+
defaultTimeoutMs: opts.defaultTimeoutMs,
|
|
298
|
+
notePrefix: opts.notePrefix
|
|
299
|
+
});
|
|
300
|
+
return unified.results;
|
|
350
301
|
}
|
|
351
302
|
/**
|
|
352
303
|
* 1.2 fallback for trae / trae-cn / codex / cursor. Deprecated by
|
|
@@ -27,10 +27,34 @@
|
|
|
27
27
|
* the dispatch CLI always prepends it. This is a guarantee, not a
|
|
28
28
|
* suggestion.
|
|
29
29
|
*/
|
|
30
|
-
export declare const TEST_TOOL_DETECTION_BLOCK = "## Test Tool Detection (mandatory)\n\nBefore running any test, read `package.json#scripts.test` to identify the project's test framework. Use the project-local runner \u2014 do NOT invoke `npx <runner>`:\n\n- **vitest** \u2192 `./node_modules/.bin/vitest run <file>` (or `pnpm test -- <file>`)\n- **jest** \u2192 `./node_modules/.bin/jest <file>` (or `pnpm test -- <file>`)\n- **mocha** \u2192 `./node_modules/.bin/mocha <file>` (or `pnpm test -- <file>`)\n\nIf unsure which framework the consumer project uses, run `peaks test --json` first to introspect the resolved framework + argv. Only as a last resort, ask the user before assuming a runner. The CLI command `peaks test <file>` already resolves the local binary for you (Windows-aware).";
|
|
30
|
+
export declare const TEST_TOOL_DETECTION_BLOCK = "## Test Tool Detection (mandatory)\n\nBefore running any test, read `package.json#scripts.test` to identify the project's test framework. Use the project-local runner \u2014 do NOT invoke `npx <runner>`:\n\n- **vitest** \u2192 `./node_modules/.bin/vitest run <file>` (or `pnpm test -- <file>`)\n- **jest** \u2192 `./node_modules/.bin/jest <file>` (or `pnpm test -- <file>`)\n- **mocha** \u2192 `./node_modules/.bin/mocha <file>` (or `pnpm test -- <file>`)\n\n## Test Scope (mandatory)\n\nThe dispatched test command MUST be **scoped** to a single file or pattern. An unscoped `./node_modules/.bin/vitest run` (no path filter) is **refused** because the 483-file suite is one keystroke from a 36-minute wall clock:\n\n- **scoped** \u2192 `./node_modules/.bin/vitest run tests/unit/foo.test.ts` (or any explicit file/pattern)\n- **intentional full run** \u2192 prefix with the explicit opt-in token `PEAKS_FULL_TEST=1` to override the scope gate. Use only for CI / release verification, never for routine verification during a slice.\n- **refused** \u2192 bare `./node_modules/.bin/vitest run` (no argument after `run`) without the opt-in token.\n\n`pnpm test` / `pnpm test:unit` / `pnpm test:cli` / `pnpm test:integration` and any repo-defined `test*` script remain the **human / LLM direct path** and are not gated by this rule (PB-5).\n\nIf unsure which framework the consumer project uses, run `peaks test --json` first to introspect the resolved framework + argv. Only as a last resort, ask the user before assuming a runner. The CLI command `peaks test <file>` already resolves the local binary for you (Windows-aware).";
|
|
31
31
|
/**
|
|
32
32
|
* Pure helper that returns the block. Exists as a function (not just an
|
|
33
33
|
* exported constant) so future variants can take a runtime parameter
|
|
34
34
|
* (e.g. projectRoot for context) without churning every call site.
|
|
35
35
|
*/
|
|
36
36
|
export declare function formatTestToolDetection(): string;
|
|
37
|
+
/**
|
|
38
|
+
* Slice 2026-07-29-dispatch-stall-governance / S5 (AC-4.1 / AC-4.2) —
|
|
39
|
+
* pure scope classifier. Returns a typed result so callers (the
|
|
40
|
+
* dispatch prompt template, future test-runner bridges) can decide
|
|
41
|
+
* whether the command is allowed, refused, or requires the explicit
|
|
42
|
+
* opt-in.
|
|
43
|
+
*
|
|
44
|
+
* - 'scoped' — the command names a file/pattern after `run`
|
|
45
|
+
* - 'opt-in' — the user/LLM set PEAKS_FULL_TEST=1 to override
|
|
46
|
+
* - 'refused' — bare `vitest run` with no path and no opt-in
|
|
47
|
+
* - 'unsupported' — the command is not a vitest/jest/mocha run at
|
|
48
|
+
* all (the static block does not gate it; the caller decides)
|
|
49
|
+
*
|
|
50
|
+
* Pure: no I/O, no process spawn, no env reads. The dispatcher
|
|
51
|
+
* passes `env` explicitly so the test seam can assert behavior
|
|
52
|
+
* without mutating process.env.
|
|
53
|
+
*/
|
|
54
|
+
export type TestScopeClassification = 'scoped' | 'opt-in' | 'refused' | 'unsupported';
|
|
55
|
+
export interface TestScopeDecision {
|
|
56
|
+
readonly classification: TestScopeClassification;
|
|
57
|
+
readonly reason: string;
|
|
58
|
+
readonly extractedPath: string | null;
|
|
59
|
+
}
|
|
60
|
+
export declare function classifyTestCommand(command: string, env?: Readonly<Record<string, string | undefined>>): TestScopeDecision;
|
|
@@ -35,6 +35,16 @@ Before running any test, read \`package.json#scripts.test\` to identify the proj
|
|
|
35
35
|
- **jest** → \`./node_modules/.bin/jest <file>\` (or \`pnpm test -- <file>\`)
|
|
36
36
|
- **mocha** → \`./node_modules/.bin/mocha <file>\` (or \`pnpm test -- <file>\`)
|
|
37
37
|
|
|
38
|
+
## Test Scope (mandatory)
|
|
39
|
+
|
|
40
|
+
The dispatched test command MUST be **scoped** to a single file or pattern. An unscoped \`./node_modules/.bin/vitest run\` (no path filter) is **refused** because the 483-file suite is one keystroke from a 36-minute wall clock:
|
|
41
|
+
|
|
42
|
+
- **scoped** → \`./node_modules/.bin/vitest run tests/unit/foo.test.ts\` (or any explicit file/pattern)
|
|
43
|
+
- **intentional full run** → prefix with the explicit opt-in token \`PEAKS_FULL_TEST=1\` to override the scope gate. Use only for CI / release verification, never for routine verification during a slice.
|
|
44
|
+
- **refused** → bare \`./node_modules/.bin/vitest run\` (no argument after \`run\`) without the opt-in token.
|
|
45
|
+
|
|
46
|
+
\`pnpm test\` / \`pnpm test:unit\` / \`pnpm test:cli\` / \`pnpm test:integration\` and any repo-defined \`test*\` script remain the **human / LLM direct path** and are not gated by this rule (PB-5).
|
|
47
|
+
|
|
38
48
|
If unsure which framework the consumer project uses, run \`peaks test --json\` first to introspect the resolved framework + argv. Only as a last resort, ask the user before assuming a runner. The CLI command \`peaks test <file>\` already resolves the local binary for you (Windows-aware).`;
|
|
39
49
|
/**
|
|
40
50
|
* Pure helper that returns the block. Exists as a function (not just an
|
|
@@ -44,3 +54,73 @@ If unsure which framework the consumer project uses, run \`peaks test --json\` f
|
|
|
44
54
|
export function formatTestToolDetection() {
|
|
45
55
|
return TEST_TOOL_DETECTION_BLOCK;
|
|
46
56
|
}
|
|
57
|
+
export function classifyTestCommand(command, env = process.env) {
|
|
58
|
+
if (typeof command !== 'string') {
|
|
59
|
+
return {
|
|
60
|
+
classification: 'unsupported',
|
|
61
|
+
reason: 'command is not a string',
|
|
62
|
+
extractedPath: null
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
const trimmed = command.trim();
|
|
66
|
+
// Only vitest / jest / mocha runner invocations are in scope; other
|
|
67
|
+
// commands (e.g. node, curl) are out of the scope-rule's reach
|
|
68
|
+
// (PB-5: ordinary direct human project scripts are not gated).
|
|
69
|
+
const lower = trimmed.toLowerCase();
|
|
70
|
+
const isRunnerInvocation = /(?:\.\/node_modules\/\.bin\/|\b)(?:vitest|jest|mocha)\b/.test(lower);
|
|
71
|
+
if (!isRunnerInvocation) {
|
|
72
|
+
return {
|
|
73
|
+
classification: 'unsupported',
|
|
74
|
+
reason: 'command is not a vitest/jest/mocha runner invocation',
|
|
75
|
+
extractedPath: null
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
// Split into tokens. Quoted paths (e.g. "tests/unit/foo bar.test.ts")
|
|
79
|
+
// are preserved as a single token by the simple `match(/(?:[^\s"']+|"[^"]*"|'[^']*')+/g)`
|
|
80
|
+
// approach; the static block does not need shell-level fidelity,
|
|
81
|
+
// only the existence of at least one non-flag, non-runner path
|
|
82
|
+
// token.
|
|
83
|
+
const tokens = trimmed.match(/(?:[^\s"']+|"[^"]*"|'[^']*')+/g) ?? [];
|
|
84
|
+
// Find the runner token and look for arguments after it.
|
|
85
|
+
const runnerIdx = tokens.findIndex((t) => /(^|\/)(vitest|jest|mocha)(\.cmd|\.exe)?$/.test(t.toLowerCase()));
|
|
86
|
+
if (runnerIdx < 0) {
|
|
87
|
+
return {
|
|
88
|
+
classification: 'unsupported',
|
|
89
|
+
reason: 'runner token not found in command',
|
|
90
|
+
extractedPath: null
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
const after = tokens.slice(runnerIdx + 1);
|
|
94
|
+
// Strip flags (e.g. --config, --reporter, --coverage). A flag is
|
|
95
|
+
// any token starting with `-`. The path we care about is the first
|
|
96
|
+
// non-flag, non-runner, non-keyword token after the runner.
|
|
97
|
+
const PATH_KEYWORDS = new Set(['run', 'watch', 'test', 'c', 'ci', 'r', 'reporter', 't', 'u', 'coverage']);
|
|
98
|
+
const pathTokens = [];
|
|
99
|
+
for (const tok of after) {
|
|
100
|
+
if (tok.startsWith('-'))
|
|
101
|
+
continue;
|
|
102
|
+
if (PATH_KEYWORDS.has(tok.toLowerCase()))
|
|
103
|
+
continue;
|
|
104
|
+
pathTokens.push(tok);
|
|
105
|
+
}
|
|
106
|
+
if (pathTokens.length === 0) {
|
|
107
|
+
// No path at all. The opt-in token flips this to 'opt-in'.
|
|
108
|
+
if (env.PEAKS_FULL_TEST === '1' || env.PEAKS_FULL_TEST === 'true') {
|
|
109
|
+
return {
|
|
110
|
+
classification: 'opt-in',
|
|
111
|
+
reason: 'bare run command with PEAKS_FULL_TEST=1 opt-in',
|
|
112
|
+
extractedPath: null
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
return {
|
|
116
|
+
classification: 'refused',
|
|
117
|
+
reason: 'bare runner invocation with no path filter and no PEAKS_FULL_TEST opt-in',
|
|
118
|
+
extractedPath: null
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
return {
|
|
122
|
+
classification: 'scoped',
|
|
123
|
+
reason: `runner invocation scoped to ${pathTokens.length} path token(s)`,
|
|
124
|
+
extractedPath: pathTokens[0] ?? null
|
|
125
|
+
};
|
|
126
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Check: every emitted check ID matches the `doctor-report.schema.json`
|
|
3
|
+
* check.id pattern (`doctor-self:check-id-pattern`).
|
|
4
|
+
*
|
|
5
|
+
* Self-validation gate that runs after every other check so it can
|
|
6
|
+
* observe the full list of emitted IDs. Fails when:
|
|
7
|
+
* - The schema file is missing / unreadable.
|
|
8
|
+
* - The schema does not declare a `checks.items.properties.id.pattern`.
|
|
9
|
+
* - Any emitted check ID does not match the declared pattern.
|
|
10
|
+
*
|
|
11
|
+
* The accumulator is passed via the `DoctorContext` (see types.ts:
|
|
12
|
+
* `accumulatedChecks`). The plugin dispatcher in `index.ts` builds
|
|
13
|
+
* the accumulator incrementally and updates it before each plugin
|
|
14
|
+
* runs, so by the time this check fires every prior check's IDs are
|
|
15
|
+
* visible.
|
|
16
|
+
*/
|
|
17
|
+
import type { DoctorCheckPlugin } from '../types.js';
|
|
18
|
+
export declare const check: DoctorCheckPlugin;
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Check: every emitted check ID matches the `doctor-report.schema.json`
|
|
3
|
+
* check.id pattern (`doctor-self:check-id-pattern`).
|
|
4
|
+
*
|
|
5
|
+
* Self-validation gate that runs after every other check so it can
|
|
6
|
+
* observe the full list of emitted IDs. Fails when:
|
|
7
|
+
* - The schema file is missing / unreadable.
|
|
8
|
+
* - The schema does not declare a `checks.items.properties.id.pattern`.
|
|
9
|
+
* - Any emitted check ID does not match the declared pattern.
|
|
10
|
+
*
|
|
11
|
+
* The accumulator is passed via the `DoctorContext` (see types.ts:
|
|
12
|
+
* `accumulatedChecks`). The plugin dispatcher in `index.ts` builds
|
|
13
|
+
* the accumulator incrementally and updates it before each plugin
|
|
14
|
+
* runs, so by the time this check fires every prior check's IDs are
|
|
15
|
+
* visible.
|
|
16
|
+
*/
|
|
17
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
18
|
+
import { join } from 'node:path';
|
|
19
|
+
import { getErrorMessage } from 'peaks-loop-shared/result';
|
|
20
|
+
function runSelfCheck(schemaRoot, emittedIds) {
|
|
21
|
+
const schemaPath = join(schemaRoot, 'doctor-report.schema.json');
|
|
22
|
+
if (!existsSync(schemaPath)) {
|
|
23
|
+
return [{
|
|
24
|
+
id: 'doctor-self:check-id-pattern',
|
|
25
|
+
ok: false,
|
|
26
|
+
message: `Failed to load doctor-report.schema.json for self-validation: ${getErrorMessage(new Error(`ENOENT: ${schemaPath}`))}`
|
|
27
|
+
}];
|
|
28
|
+
}
|
|
29
|
+
try {
|
|
30
|
+
const schemaText = readFileSync(schemaPath, 'utf8');
|
|
31
|
+
const schema = JSON.parse(schemaText);
|
|
32
|
+
const patternSource = schema.properties?.checks?.items?.properties?.id?.pattern;
|
|
33
|
+
if (typeof patternSource !== 'string') {
|
|
34
|
+
return [{
|
|
35
|
+
id: 'doctor-self:check-id-pattern',
|
|
36
|
+
ok: false,
|
|
37
|
+
message: 'doctor-report.schema.json does not declare a check.id pattern'
|
|
38
|
+
}];
|
|
39
|
+
}
|
|
40
|
+
const pattern = new RegExp(patternSource);
|
|
41
|
+
const mismatches = emittedIds.filter((id) => !pattern.test(id));
|
|
42
|
+
return [{
|
|
43
|
+
id: 'doctor-self:check-id-pattern',
|
|
44
|
+
ok: mismatches.length === 0,
|
|
45
|
+
message: mismatches.length === 0
|
|
46
|
+
? 'All doctor check IDs match the doctor-report schema pattern'
|
|
47
|
+
: `Doctor check IDs missing from schema pattern: ${mismatches.join(', ')}`
|
|
48
|
+
}];
|
|
49
|
+
}
|
|
50
|
+
catch (error) {
|
|
51
|
+
return [{
|
|
52
|
+
id: 'doctor-self:check-id-pattern',
|
|
53
|
+
ok: false,
|
|
54
|
+
message: `Failed to load doctor-report.schema.json for self-validation: ${getErrorMessage(error)}`
|
|
55
|
+
}];
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
function run({ schemaRoot, accumulatedChecks }) {
|
|
59
|
+
return runSelfCheck(schemaRoot, accumulatedChecks.map((check) => check.id));
|
|
60
|
+
}
|
|
61
|
+
export const check = {
|
|
62
|
+
name: 'check-id-schema',
|
|
63
|
+
run
|
|
64
|
+
};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Check: codegraph capability (`capability:codegraph`).
|
|
3
|
+
*
|
|
4
|
+
* Verifies that `@colbymchenry/codegraph` resolves at the pinned
|
|
5
|
+
* version AND that the binary exists at the expected on-disk path.
|
|
6
|
+
* Fails when the version drifts, when the binary is missing, or
|
|
7
|
+
* when the package is not resolvable at all.
|
|
8
|
+
*
|
|
9
|
+
* The probe is injected so tests do not depend on the real
|
|
10
|
+
* `node_modules` resolution; the default probe uses
|
|
11
|
+
* `createRequire(import.meta.url)` to find the package.
|
|
12
|
+
*/
|
|
13
|
+
import type { DoctorCheckPlugin } from '../types.js';
|
|
14
|
+
export declare const check: DoctorCheckPlugin;
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Check: codegraph capability (`capability:codegraph`).
|
|
3
|
+
*
|
|
4
|
+
* Verifies that `@colbymchenry/codegraph` resolves at the pinned
|
|
5
|
+
* version AND that the binary exists at the expected on-disk path.
|
|
6
|
+
* Fails when the version drifts, when the binary is missing, or
|
|
7
|
+
* when the package is not resolvable at all.
|
|
8
|
+
*
|
|
9
|
+
* The probe is injected so tests do not depend on the real
|
|
10
|
+
* `node_modules` resolution; the default probe uses
|
|
11
|
+
* `createRequire(import.meta.url)` to find the package.
|
|
12
|
+
*/
|
|
13
|
+
import { existsSync } from 'node:fs';
|
|
14
|
+
import { dirname, resolve as resolvePath } from 'node:path';
|
|
15
|
+
import { createRequire } from 'node:module';
|
|
16
|
+
import { getErrorMessage } from 'peaks-loop-shared/result';
|
|
17
|
+
const CODEGRAPH_EXPECTED_VERSION = '0.7.10';
|
|
18
|
+
function defaultCodegraphProbe() {
|
|
19
|
+
const require = createRequire(import.meta.url);
|
|
20
|
+
const packagePath = require.resolve('@colbymchenry/codegraph/package.json');
|
|
21
|
+
const pkg = require(packagePath);
|
|
22
|
+
const binaryPath = resolvePath(dirname(packagePath), 'dist', 'bin', 'codegraph.js');
|
|
23
|
+
return {
|
|
24
|
+
packagePath,
|
|
25
|
+
version: pkg.version ?? 'unknown',
|
|
26
|
+
binaryPath,
|
|
27
|
+
binaryExists: existsSync(binaryPath)
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
function runCheck(probe) {
|
|
31
|
+
try {
|
|
32
|
+
const result = probe();
|
|
33
|
+
const versionOk = result.version === CODEGRAPH_EXPECTED_VERSION;
|
|
34
|
+
if (!versionOk) {
|
|
35
|
+
return [{
|
|
36
|
+
id: 'capability:codegraph',
|
|
37
|
+
ok: false,
|
|
38
|
+
message: `@colbymchenry/codegraph version mismatch: expected ${CODEGRAPH_EXPECTED_VERSION}, resolved ${result.version} at ${result.packagePath}`
|
|
39
|
+
}];
|
|
40
|
+
}
|
|
41
|
+
if (!result.binaryExists) {
|
|
42
|
+
return [{
|
|
43
|
+
id: 'capability:codegraph',
|
|
44
|
+
ok: false,
|
|
45
|
+
message: `@colbymchenry/codegraph@${result.version} resolved at ${result.packagePath} but binary is missing at ${result.binaryPath}`
|
|
46
|
+
}];
|
|
47
|
+
}
|
|
48
|
+
return [{
|
|
49
|
+
id: 'capability:codegraph',
|
|
50
|
+
ok: true,
|
|
51
|
+
message: `@colbymchenry/codegraph@${result.version} resolves with binary at ${result.binaryPath}`
|
|
52
|
+
}];
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
return [{
|
|
56
|
+
id: 'capability:codegraph',
|
|
57
|
+
ok: false,
|
|
58
|
+
message: `@colbymchenry/codegraph not resolvable: ${getErrorMessage(error)}`
|
|
59
|
+
}];
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
function run({ options }) {
|
|
63
|
+
const probe = options.codegraphProbe ?? defaultCodegraphProbe;
|
|
64
|
+
return runCheck(probe);
|
|
65
|
+
}
|
|
66
|
+
export const check = {
|
|
67
|
+
name: 'codegraph-capability',
|
|
68
|
+
run
|
|
69
|
+
};
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Check: dist CLI_VERSION matches source `package.json#version`
|
|
3
|
+
* (`build:dist-version-matches-source`).
|
|
4
|
+
*
|
|
5
|
+
* Build-hygiene check that surfaces the silent-stale-CLI failure
|
|
6
|
+
* mode where the user runs `npx peaks` / `node bin/peaks.js` after
|
|
7
|
+
* `pnpm install` but before `pnpm build`. A missing dist/ is treated
|
|
8
|
+
* as informational (fresh clone, not broken) so the check does not
|
|
9
|
+
* flip the summary to red on a clean checkout.
|
|
10
|
+
*
|
|
11
|
+
* IMPORTANT: the on-disk path is `dist/shared/version.js` (NOT
|
|
12
|
+
* `dist/src/shared/version.js`) because `tsconfig.build.json#rootDir
|
|
13
|
+
* = "src"` trims the `src/` segment from emitted output.
|
|
14
|
+
*
|
|
15
|
+
* The pure compare helper is exported as `compareDistVersion` so
|
|
16
|
+
* tests can drive the filesystem reads without monkey-patching
|
|
17
|
+
* `process.cwd()`.
|
|
18
|
+
*/
|
|
19
|
+
import type { DistVersionComparison, DoctorCheckPlugin } from '../types.js';
|
|
20
|
+
/**
|
|
21
|
+
* Pure helper that compares the published dist `CLI_VERSION` against
|
|
22
|
+
* the source-of-truth `package.json#version`. Default readers fail-
|
|
23
|
+
* soft to `null` on missing/unreadable/malformed input. Exported so
|
|
24
|
+
* tests can drive the filesystem reads without monkey-patching
|
|
25
|
+
* `process.cwd()`.
|
|
26
|
+
*/
|
|
27
|
+
export declare function compareDistVersion(opts: {
|
|
28
|
+
projectRoot: string;
|
|
29
|
+
distVersionReader?: (root: string) => string | null;
|
|
30
|
+
sourceVersionReader?: (root: string) => string | null;
|
|
31
|
+
}): DistVersionComparison;
|
|
32
|
+
export declare const check: DoctorCheckPlugin;
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Check: dist CLI_VERSION matches source `package.json#version`
|
|
3
|
+
* (`build:dist-version-matches-source`).
|
|
4
|
+
*
|
|
5
|
+
* Build-hygiene check that surfaces the silent-stale-CLI failure
|
|
6
|
+
* mode where the user runs `npx peaks` / `node bin/peaks.js` after
|
|
7
|
+
* `pnpm install` but before `pnpm build`. A missing dist/ is treated
|
|
8
|
+
* as informational (fresh clone, not broken) so the check does not
|
|
9
|
+
* flip the summary to red on a clean checkout.
|
|
10
|
+
*
|
|
11
|
+
* IMPORTANT: the on-disk path is `dist/shared/version.js` (NOT
|
|
12
|
+
* `dist/src/shared/version.js`) because `tsconfig.build.json#rootDir
|
|
13
|
+
* = "src"` trims the `src/` segment from emitted output.
|
|
14
|
+
*
|
|
15
|
+
* The pure compare helper is exported as `compareDistVersion` so
|
|
16
|
+
* tests can drive the filesystem reads without monkey-patching
|
|
17
|
+
* `process.cwd()`.
|
|
18
|
+
*/
|
|
19
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
20
|
+
import { join } from 'node:path';
|
|
21
|
+
import { getErrorMessage } from 'peaks-loop-shared/result';
|
|
22
|
+
/**
|
|
23
|
+
* Pure helper that compares the published dist `CLI_VERSION` against
|
|
24
|
+
* the source-of-truth `package.json#version`. Default readers fail-
|
|
25
|
+
* soft to `null` on missing/unreadable/malformed input. Exported so
|
|
26
|
+
* tests can drive the filesystem reads without monkey-patching
|
|
27
|
+
* `process.cwd()`.
|
|
28
|
+
*/
|
|
29
|
+
export function compareDistVersion(opts) {
|
|
30
|
+
const distReader = opts.distVersionReader ?? defaultDistVersionReader;
|
|
31
|
+
const sourceReader = opts.sourceVersionReader ?? defaultSourceVersionReader;
|
|
32
|
+
const dist = safeRead(() => distReader(opts.projectRoot));
|
|
33
|
+
const source = safeRead(() => sourceReader(opts.projectRoot)) ?? 'unknown';
|
|
34
|
+
const distReadable = dist !== null;
|
|
35
|
+
return {
|
|
36
|
+
dist,
|
|
37
|
+
source,
|
|
38
|
+
match: distReadable && dist === source,
|
|
39
|
+
distReadable
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
function safeRead(reader) {
|
|
43
|
+
try {
|
|
44
|
+
return reader();
|
|
45
|
+
}
|
|
46
|
+
catch { // TODO(g2): legacy silent catch — grace: 1 minor release (v2.14.0)
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
function defaultDistVersionReader(projectRoot) {
|
|
51
|
+
const distPath = join(projectRoot, 'dist', 'shared', 'version.js');
|
|
52
|
+
if (!existsSync(distPath)) {
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
const body = readFileSync(distPath, 'utf8');
|
|
56
|
+
const match = /export\s+const\s+CLI_VERSION\s*=\s*["']([^"']+)["']/.exec(body);
|
|
57
|
+
return match?.[1] ?? null;
|
|
58
|
+
}
|
|
59
|
+
function defaultSourceVersionReader(projectRoot) {
|
|
60
|
+
const pkgPath = join(projectRoot, 'package.json');
|
|
61
|
+
if (!existsSync(pkgPath)) {
|
|
62
|
+
return null;
|
|
63
|
+
}
|
|
64
|
+
const body = readFileSync(pkgPath, 'utf8');
|
|
65
|
+
const parsed = JSON.parse(body);
|
|
66
|
+
return typeof parsed.version === 'string' ? parsed.version : null;
|
|
67
|
+
}
|
|
68
|
+
function defaultDistVersionProbe(projectRootResolver) {
|
|
69
|
+
const projectRoot = projectRootResolver();
|
|
70
|
+
if (projectRoot === null) {
|
|
71
|
+
return { dist: null, source: 'unknown', match: false, distReadable: false };
|
|
72
|
+
}
|
|
73
|
+
return compareDistVersion({ projectRoot });
|
|
74
|
+
}
|
|
75
|
+
function run({ options, projectRootResolver }) {
|
|
76
|
+
const probe = options.distVersionProbe ?? (() => defaultDistVersionProbe(projectRootResolver));
|
|
77
|
+
try {
|
|
78
|
+
const result = probe();
|
|
79
|
+
if (!result.distReadable) {
|
|
80
|
+
return [{
|
|
81
|
+
id: 'build:dist-version-matches-source',
|
|
82
|
+
ok: true,
|
|
83
|
+
message: `dist/ is not present; run \`pnpm build\` to populate dist/shared/version.js (source version ${result.source})`
|
|
84
|
+
}];
|
|
85
|
+
}
|
|
86
|
+
if (result.match) {
|
|
87
|
+
return [{
|
|
88
|
+
id: 'build:dist-version-matches-source',
|
|
89
|
+
ok: true,
|
|
90
|
+
message: `dist/shared/version.js ships CLI_VERSION ${result.dist} matching source ${result.source}`
|
|
91
|
+
}];
|
|
92
|
+
}
|
|
93
|
+
return [{
|
|
94
|
+
id: 'build:dist-version-matches-source',
|
|
95
|
+
ok: false,
|
|
96
|
+
message: `dist/shared/version.js ships CLI_VERSION ${result.dist} but source ${result.source} is in src/shared/version.ts; run \`pnpm build\` to refresh dist/`
|
|
97
|
+
}];
|
|
98
|
+
}
|
|
99
|
+
catch (error) {
|
|
100
|
+
return [{
|
|
101
|
+
id: 'build:dist-version-matches-source',
|
|
102
|
+
ok: false,
|
|
103
|
+
message: `dist version check failed: ${getErrorMessage(error)}`
|
|
104
|
+
}];
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
export const check = {
|
|
108
|
+
name: 'dist-source-version',
|
|
109
|
+
run
|
|
110
|
+
};
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Check: gateguard-fact-force hook does not intercept `.peaks/`
|
|
3
|
+
* writes (`integration:gateguard-peaks-conflict`).
|
|
4
|
+
*
|
|
5
|
+
* 2026-06-10 — the `gateguard-fact-force` hook is a third-party
|
|
6
|
+
* PreToolUse hook (NOT peaks-loop) that fires on Edit/Write and
|
|
7
|
+
* demands a 4-fact questionnaire before allowing the edit. When
|
|
8
|
+
* the LLM is in a peaks-qa flow and edits
|
|
9
|
+
* `.peaks/_runtime/<sid>/qa/requests/*.md`, the questionnaire
|
|
10
|
+
* demands facts that do not apply. We warn when the hook is
|
|
11
|
+
* installed and no `.peaks/**` skip is configured.
|
|
12
|
+
*
|
|
13
|
+
* Probing is split out of the check so the check itself stays a
|
|
14
|
+
* pure mapping over `GateguardProbeResult`. Tests inject the probe
|
|
15
|
+
* to keep `~/.claude/settings.json` from leaking into fixtures.
|
|
16
|
+
*/
|
|
17
|
+
import type { DoctorCheckPlugin, GateguardHookLocation, GateguardProbeResult } from '../types.js';
|
|
18
|
+
/**
|
|
19
|
+
* Pure mapping over a `GateguardProbeResult`. Exported so tests
|
|
20
|
+
* can drive the entry extraction without monkey-patching
|
|
21
|
+
* `~/.claude/settings.json`.
|
|
22
|
+
*/
|
|
23
|
+
export declare function collectGateguardEntries(probe: GateguardProbeResult): GateguardHookLocation[];
|
|
24
|
+
export declare const check: DoctorCheckPlugin;
|