peaks-loop 4.0.54 → 4.1.0
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 +36 -0
- package/README-en.md +16 -1
- package/README.md +15 -1
- package/config/eslint/.peaks-rules.cjs +158 -13
- package/config/eslint/tsconfig.lint.json +47 -0
- package/dist/cli/cli-envelope.d.ts +114 -0
- package/dist/cli/cli-envelope.js +85 -0
- package/dist/cli/cli-helpers.d.ts +1 -1
- package/dist/cli/cli-helpers.js +8 -4
- package/dist/cli/commands/_cli-error-envelope.js +1 -1
- package/dist/cli/commands/_register.js +85 -38
- package/dist/cli/commands/_super.js +40 -7
- package/dist/cli/commands/adapter-commands-s2a.js +8 -7
- package/dist/cli/commands/adapter-commands.d.ts +2 -2
- package/dist/cli/commands/adapter-commands.js +7 -8
- package/dist/cli/commands/api-diff-commands.js +5 -4
- package/dist/cli/commands/asset-commands.d.ts +2 -2
- package/dist/cli/commands/asset-commands.js +135 -132
- package/dist/cli/commands/audit-commands.d.ts +1 -1
- package/dist/cli/commands/audit-commands.js +75 -32
- package/dist/cli/commands/autonomous-swarm-commands.d.ts +1 -1
- package/dist/cli/commands/autonomous-swarm-commands.js +14 -8
- package/dist/cli/commands/baseline-commands.js +34 -9
- package/dist/cli/commands/bee-commands.d.ts +1 -1
- package/dist/cli/commands/bee-commands.js +18 -21
- package/dist/cli/commands/best-practice-scan-command.js +6 -34
- package/dist/cli/commands/best-practice-scan-helpers.d.ts +12 -0
- package/dist/cli/commands/best-practice-scan-helpers.js +37 -0
- package/dist/cli/commands/capability-commands.d.ts +1 -1
- package/dist/cli/commands/capability-commands.js +14 -4
- package/dist/cli/commands/capability-worker-config-sc-commands.d.ts +1 -1
- package/dist/cli/commands/changeset-commands.js +21 -18
- package/dist/cli/commands/code-gate-command.js +9 -2
- package/dist/cli/commands/code-job-shape-commands-read-job-shape.d.ts +15 -0
- package/dist/cli/commands/code-job-shape-commands-read-job-shape.js +70 -0
- package/dist/cli/commands/code-job-shape-commands.js +21 -45
- package/dist/cli/commands/code-mode-gate-commands.d.ts +15 -1
- package/dist/cli/commands/code-mode-gate-commands.js +19 -199
- package/dist/cli/commands/code-mode-gate-plan-command.d.ts +14 -0
- package/dist/cli/commands/code-mode-gate-plan-command.js +23 -0
- package/dist/cli/commands/code-mode-gate-should-pause-command.d.ts +24 -0
- package/dist/cli/commands/code-mode-gate-should-pause-command.js +137 -0
- package/dist/cli/commands/code-mode-gate-should-pause-envelope.d.ts +59 -0
- package/dist/cli/commands/code-mode-gate-should-pause-envelope.js +144 -0
- package/dist/cli/commands/code-orchestrator-can-do.js +4 -4
- package/dist/cli/commands/code-review-commands.js +18 -3
- package/dist/cli/commands/code-run-command.js +44 -7
- package/dist/cli/commands/code-runtime-commands.d.ts +17 -0
- package/dist/cli/commands/code-runtime-commands.js +105 -73
- package/dist/cli/commands/codegraph-commands.js +11 -6
- package/dist/cli/commands/codegraph-status-command.js +6 -2
- package/dist/cli/commands/compact-command.js +52 -26
- package/dist/cli/commands/complexity-commands.js +6 -7
- package/dist/cli/commands/config-commands.d.ts +1 -1
- package/dist/cli/commands/config-commands.js +33 -9
- package/dist/cli/commands/container-commands.js +39 -15
- package/dist/cli/commands/context-commands.d.ts +1 -1
- package/dist/cli/commands/context-commands.js +40 -13
- package/dist/cli/commands/core/artifacts-command.js +11 -3
- package/dist/cli/commands/core/binding-commands.js +9 -6
- package/dist/cli/commands/core/doctor-command.js +7 -4
- package/dist/cli/commands/core/memory-command.js +47 -21
- package/dist/cli/commands/core/proxy-command.js +3 -1
- package/dist/cli/commands/core/session-command.js +16 -8
- package/dist/cli/commands/core/skill-command.js +31 -16
- package/dist/cli/commands/core/standards-command.js +55 -13
- package/dist/cli/commands/cron-commands-actions.d.ts +43 -0
- package/dist/cli/commands/cron-commands-actions.js +128 -0
- package/dist/cli/commands/cron-commands-schedule.d.ts +86 -0
- package/dist/cli/commands/cron-commands-schedule.js +151 -0
- package/dist/cli/commands/cron-commands.d.ts +35 -32
- package/dist/cli/commands/cron-commands.js +167 -211
- package/dist/cli/commands/cron-scheduler-commands.js +40 -20
- package/dist/cli/commands/cron-scheduler-persist.d.ts +110 -0
- package/dist/cli/commands/cron-scheduler-persist.js +171 -0
- package/dist/cli/commands/dashboard-long-run.js +45 -14
- package/dist/cli/commands/dashboard-summary.js +15 -5
- package/dist/cli/commands/dispatch-commands.js +65 -32
- package/dist/cli/commands/dispatch-from-dag.js +9 -10
- package/dist/cli/commands/doc-commands.js +8 -9
- package/dist/cli/commands/doctor/invoke-from-code.js +1 -1
- package/dist/cli/commands/e2e-verify-env.d.ts +19 -0
- package/dist/cli/commands/e2e-verify-env.js +19 -0
- package/dist/cli/commands/e2e-verify.d.ts +3 -14
- package/dist/cli/commands/e2e-verify.js +49 -29
- package/dist/cli/commands/ecc-commands.d.ts +1 -1
- package/dist/cli/commands/ecc-commands.js +8 -17
- package/dist/cli/commands/evidence-commands.js +10 -6
- package/dist/cli/commands/evolution-commands.d.ts +2 -2
- package/dist/cli/commands/evolution-commands.js +109 -115
- package/dist/cli/commands/feedback-commands-helpers.d.ts +22 -0
- package/dist/cli/commands/feedback-commands-helpers.js +33 -0
- package/dist/cli/commands/feedback-commands.js +15 -38
- package/dist/cli/commands/final-review-commands.d.ts +1 -1
- package/dist/cli/commands/final-review-commands.js +24 -22
- package/dist/cli/commands/fixture-commands.d.ts +1 -1
- package/dist/cli/commands/fixture-commands.js +17 -6
- package/dist/cli/commands/fork-commands-sync-verify.d.ts +12 -0
- package/dist/cli/commands/fork-commands-sync-verify.js +72 -0
- package/dist/cli/commands/fork-commands.js +19 -51
- package/dist/cli/commands/fresh-context-commands.js +3 -1
- package/dist/cli/commands/gate-commands-enforce.d.ts +82 -0
- package/dist/cli/commands/gate-commands-enforce.js +210 -0
- package/dist/cli/commands/gate-commands.d.ts +1 -1
- package/dist/cli/commands/gate-commands.js +85 -205
- package/dist/cli/commands/governance-classify-contract-commands.d.ts +1 -1
- package/dist/cli/commands/governance-classify-contract-commands.js +28 -17
- package/dist/cli/commands/heartbeat-commands-action.d.ts +7 -0
- package/dist/cli/commands/heartbeat-commands-action.js +192 -0
- package/dist/cli/commands/heartbeat-commands-validation.d.ts +57 -0
- package/dist/cli/commands/heartbeat-commands-validation.js +120 -0
- package/dist/cli/commands/heartbeat-commands.d.ts +27 -6
- package/dist/cli/commands/heartbeat-commands.js +19 -198
- package/dist/cli/commands/hook-handle.d.ts +1 -1
- package/dist/cli/commands/hook-handle.js +46 -13
- package/dist/cli/commands/hooks-commands.d.ts +1 -1
- package/dist/cli/commands/hooks-commands.js +18 -6
- package/dist/cli/commands/ide-commands.d.ts +1 -1
- package/dist/cli/commands/ide-commands.js +5 -3
- package/dist/cli/commands/impact-commands.js +8 -2
- package/dist/cli/commands/job-add-slice-command.d.ts +43 -0
- package/dist/cli/commands/job-add-slice-command.js +151 -0
- package/dist/cli/commands/job-commands.d.ts +64 -0
- package/dist/cli/commands/job-commands.js +134 -63
- package/dist/cli/commands/lease-metrics-commands-support.d.ts +73 -0
- package/dist/cli/commands/lease-metrics-commands-support.js +67 -0
- package/dist/cli/commands/lease-metrics-commands.d.ts +3 -44
- package/dist/cli/commands/lease-metrics-commands.js +21 -61
- package/dist/cli/commands/lease-stats-commands.d.ts +1 -1
- package/dist/cli/commands/lease-stats-commands.js +9 -6
- package/dist/cli/commands/lint-commands.d.ts +9 -3
- package/dist/cli/commands/lint-commands.js +15 -8
- package/dist/cli/commands/log-commands.d.ts +1 -1
- package/dist/cli/commands/log-commands.js +8 -6
- package/dist/cli/commands/loop-commands.d.ts +1 -1
- package/dist/cli/commands/loop-commands.js +50 -50
- package/dist/cli/commands/loop-eval-commands.d.ts +1 -1
- package/dist/cli/commands/loop-eval-commands.js +101 -30
- package/dist/cli/commands/memory-commands.js +21 -13
- package/dist/cli/commands/migrate-1-4-1-command.js +1 -1
- package/dist/cli/commands/migrate-v2-10-to-v2-11-command.js +2 -2
- package/dist/cli/commands/mut-commands-helpers.d.ts +30 -0
- package/dist/cli/commands/mut-commands-helpers.js +43 -0
- package/dist/cli/commands/mut-commands.js +16 -58
- package/dist/cli/commands/observability-commands-queries.d.ts +37 -0
- package/dist/cli/commands/observability-commands-queries.js +113 -0
- package/dist/cli/commands/observability-commands.d.ts +1 -1
- package/dist/cli/commands/observability-commands.js +7 -92
- package/dist/cli/commands/openspec-commands.d.ts +1 -1
- package/dist/cli/commands/openspec-commands.js +20 -8
- package/dist/cli/commands/outer-cache-commands.js +18 -7
- package/dist/cli/commands/perf-audit-commands.d.ts +1 -1
- package/dist/cli/commands/perf-audit-commands.js +12 -7
- package/dist/cli/commands/perf-commands.d.ts +1 -1
- package/dist/cli/commands/perf-commands.js +5 -5
- package/dist/cli/commands/playwright-commands.d.ts +1 -1
- package/dist/cli/commands/playwright-commands.js +20 -8
- package/dist/cli/commands/polyrepo-commands.js +21 -19
- package/dist/cli/commands/prd-blocks-commands.js +1 -3
- package/dist/cli/commands/prd-commands.d.ts +1 -1
- package/dist/cli/commands/prd-commands.js +8 -4
- package/dist/cli/commands/preferences-commands.js +13 -12
- package/dist/cli/commands/primer-command.js +5 -5
- package/dist/cli/commands/project-commands.d.ts +1 -1
- package/dist/cli/commands/project-commands.js +33 -9
- package/dist/cli/commands/qa-business-review-commands.js +16 -12
- package/dist/cli/commands/qa-commands.d.ts +1 -1
- package/dist/cli/commands/qa-commands.js +3 -5
- package/dist/cli/commands/release-commands.d.ts +3 -1
- package/dist/cli/commands/release-commands.js +33 -22
- package/dist/cli/commands/request-commands.js +47 -30
- package/dist/cli/commands/request-format-helpers.js +1 -1
- package/dist/cli/commands/retrospective-commands.d.ts +18 -11
- package/dist/cli/commands/retrospective-commands.js +24 -173
- package/dist/cli/commands/retrospective-index-command.d.ts +26 -0
- package/dist/cli/commands/retrospective-index-command.js +99 -0
- package/dist/cli/commands/retrospective-project-root.d.ts +9 -0
- package/dist/cli/commands/retrospective-project-root.js +15 -0
- package/dist/cli/commands/retrospective-search-command.d.ts +27 -0
- package/dist/cli/commands/retrospective-search-command.js +97 -0
- package/dist/cli/commands/retrospective-show-command.d.ts +23 -0
- package/dist/cli/commands/retrospective-show-command.js +80 -0
- package/dist/cli/commands/reviewer-commands.d.ts +1 -1
- package/dist/cli/commands/role-commands.js +14 -9
- package/dist/cli/commands/runtime-commands.js +14 -7
- package/dist/cli/commands/sc-commands.d.ts +1 -1
- package/dist/cli/commands/sc-commands.js +39 -6
- package/dist/cli/commands/scan-commands.js +36 -13
- package/dist/cli/commands/security-audit-commands.d.ts +1 -1
- package/dist/cli/commands/security-audit-commands.js +12 -7
- package/dist/cli/commands/sediment-commands.d.ts +2 -2
- package/dist/cli/commands/sediment-commands.js +146 -139
- package/dist/cli/commands/session-24h-mode.js +15 -2
- package/dist/cli/commands/session-checkpoint-command.js +1 -1
- package/dist/cli/commands/session-migrate-skill-name.js +1 -1
- package/dist/cli/commands/shadcn-commands.d.ts +1 -1
- package/dist/cli/commands/shadcn-commands.js +3 -1
- package/dist/cli/commands/share-commands.js +38 -39
- package/dist/cli/commands/skill-conformance-commands.d.ts +1 -1
- package/dist/cli/commands/skill-conformance-commands.js +1 -1
- package/dist/cli/commands/skill-loop-engineering-readiness-commands.js +16 -17
- package/dist/cli/commands/skill-visibility.js +2 -2
- package/dist/cli/commands/slice-commands.d.ts +1 -1
- package/dist/cli/commands/slice-commands.js +36 -12
- package/dist/cli/commands/slice-integrate-commands.js +6 -7
- package/dist/cli/commands/slice-review-commands-helpers.d.ts +26 -0
- package/dist/cli/commands/slice-review-commands-helpers.js +26 -0
- package/dist/cli/commands/slice-review-commands.js +16 -24
- package/dist/cli/commands/smoke-commands-add-path.d.ts +14 -0
- package/dist/cli/commands/smoke-commands-add-path.js +39 -0
- package/dist/cli/commands/smoke-commands-define.d.ts +18 -0
- package/dist/cli/commands/smoke-commands-define.js +97 -0
- package/dist/cli/commands/smoke-commands-run.d.ts +18 -0
- package/dist/cli/commands/smoke-commands-run.js +119 -0
- package/dist/cli/commands/smoke-commands.d.ts +10 -1
- package/dist/cli/commands/smoke-commands.js +17 -179
- package/dist/cli/commands/sop-commands.d.ts +1 -1
- package/dist/cli/commands/sop-commands.js +38 -10
- package/dist/cli/commands/statusline-commands.d.ts +1 -1
- package/dist/cli/commands/statusline-commands.js +21 -10
- package/dist/cli/commands/sub-agent/detached.js +3 -3
- package/dist/cli/commands/sub-agent-dispatch-guard.d.ts +1 -1
- package/dist/cli/commands/sub-agent-shared.js +1 -1
- package/dist/cli/commands/sub-agent-shutdown-commands.js +17 -9
- package/dist/cli/commands/swarm-commands.d.ts +1 -1
- package/dist/cli/commands/swarm-commands.js +13 -6
- package/dist/cli/commands/tech-commands-helpers.d.ts +37 -0
- package/dist/cli/commands/tech-commands-helpers.js +24 -0
- package/dist/cli/commands/tech-commands.d.ts +2 -29
- package/dist/cli/commands/tech-commands.js +15 -28
- package/dist/cli/commands/test-commands.js +27 -7
- package/dist/cli/commands/upgrade-commands.d.ts +1 -1
- package/dist/cli/commands/user-touchpoint-commands.js +1 -3
- package/dist/cli/commands/verdict-aggregate-command.d.ts +1 -1
- package/dist/cli/commands/verdict-aggregate-command.js +20 -7
- package/dist/cli/commands/vm-commands.js +48 -19
- package/dist/cli/commands/wave-plan-commands.js +5 -2
- package/dist/cli/commands/web-commands.js +14 -4
- package/dist/cli/commands/web-lifecycle-commands.js +5 -3
- package/dist/cli/commands/workflow-commands.d.ts +1 -1
- package/dist/cli/commands/workflow-commands.js +64 -29
- package/dist/cli/commands/workflow-lifecycle-commands.js +19 -17
- package/dist/cli/commands/workflow-plan-commands-actions.d.ts +20 -0
- package/dist/cli/commands/workflow-plan-commands-actions.js +115 -0
- package/dist/cli/commands/workflow-plan-commands-session.d.ts +17 -0
- package/dist/cli/commands/workflow-plan-commands-session.js +59 -0
- package/dist/cli/commands/workflow-plan-commands.d.ts +10 -21
- package/dist/cli/commands/workflow-plan-commands.js +15 -141
- package/dist/cli/commands/workspace/clean-command.js +4 -1
- package/dist/cli/commands/workspace/helpers.js +2 -1
- package/dist/cli/commands/workspace/init-command.js +80 -20
- package/dist/cli/commands/workspace/reconcile-command.js +3 -1
- package/dist/cli/commands/workspace-commands.d.ts +1 -1
- package/dist/cli/commands/workspace-commands.js +1 -1
- package/dist/cli/commands/worktree-auth-commands.d.ts +1 -1
- package/dist/cli/commands/worktree-auth-commands.js +16 -169
- package/dist/cli/commands/worktree-auth-grant-command.d.ts +14 -0
- package/dist/cli/commands/worktree-auth-grant-command.js +118 -0
- package/dist/cli/commands/worktree-auth-manage-commands.d.ts +17 -0
- package/dist/cli/commands/worktree-auth-manage-commands.js +128 -0
- package/dist/cli/commands/worktree-lease-commands.d.ts +1 -1
- package/dist/cli/commands/worktree-lease-commands.js +65 -37
- package/dist/cli/index.js +6 -2
- package/dist/cli/program.js +6 -3
- package/dist/hooks/pre-tool-use-sub-agent.js +1 -6
- package/dist/reporters/bdd-reporter.js +9 -3
- package/dist/services/24h-mode/auto-engage.d.ts +19 -0
- package/dist/services/24h-mode/auto-engage.js +35 -0
- package/dist/services/24h-mode/decider.js +5 -1
- package/dist/services/24h-mode/store.js +4 -2
- package/dist/services/adapter/adapter-registry.js +20 -8
- package/dist/services/adapter/adapter.d.ts +2 -2
- package/dist/services/adapter/auto-adapter.d.ts +2 -2
- package/dist/services/adapter/auto-adapter.js +1 -1
- package/dist/services/adapter/claude-adapter.d.ts +1 -1
- package/dist/services/adapter/claude-adapter.js +8 -8
- package/dist/services/adapter/codex-adapter.d.ts +2 -2
- package/dist/services/adapter/codex-adapter.js +20 -8
- package/dist/services/adapter/copilot-adapter.d.ts +2 -2
- package/dist/services/adapter/copilot-adapter.js +20 -8
- package/dist/services/artifacts/artifact-prerequisites.js +10 -8
- package/dist/services/artifacts/artifact-service.js +3 -1
- package/dist/services/artifacts/artifact-template-bodies.d.ts +12 -0
- package/dist/services/artifacts/artifact-template-bodies.js +165 -0
- package/dist/services/artifacts/artifact-templates.js +26 -168
- package/dist/services/artifacts/request-artifact-service.js +14 -7
- package/dist/services/artifacts/request-artifact-state-helpers.d.ts +3 -2
- package/dist/services/artifacts/request-artifact-state-helpers.js +3 -5
- package/dist/services/artifacts/workspace-artifact-helpers.d.ts +28 -0
- package/dist/services/artifacts/workspace-artifact-helpers.js +54 -0
- package/dist/services/artifacts/workspace-service.d.ts +3 -22
- package/dist/services/artifacts/workspace-service.js +10 -60
- package/dist/services/audit/artifact-writer.js +21 -21
- package/dist/services/audit/audit-goal-service.js +2 -2
- package/dist/services/audit/backing-detector.js +7 -4
- package/dist/services/audit/classifier.js +3 -3
- package/dist/services/audit/decision-writer.js +13 -9
- package/dist/services/audit/enforcers/active-skill-resolver.js +15 -7
- package/dist/services/audit/enforcers/design-draft-confirm.js +4 -4
- package/dist/services/audit/enforcers/lint-audit-regression.js +10 -5
- package/dist/services/audit/enforcers/lint-bee-runtime-contract.js +16 -8
- package/dist/services/audit/enforcers/lint-catalog-governance.js +8 -4
- package/dist/services/audit/enforcers/lint-output-style.js +4 -2
- package/dist/services/audit/enforcers/lint-peaks-code-runtime.js +8 -3
- package/dist/services/audit/enforcers/lint-peaks-skill-runtime.js +8 -3
- package/dist/services/audit/enforcers/lint-peaks-ui-sc-txt-runtime.js +20 -20
- package/dist/services/audit/enforcers/lint-prd-artifact-handoff.js +5 -5
- package/dist/services/audit/enforcers/lint-prd-source-snapshot.d.ts +1 -1
- package/dist/services/audit/enforcers/lint-prd-source-snapshot.js +5 -5
- package/dist/services/audit/enforcers/lint-qa-gateguard-and-runtime.js +10 -10
- package/dist/services/audit/enforcers/lint-rd-handoff-coverage.js +10 -8
- package/dist/services/audit/enforcers/lint-reference-shape.js +50 -18
- package/dist/services/audit/enforcers/lint-skill-presence-mandatory.js +5 -5
- package/dist/services/audit/enforcers/lint-style.js +44 -11
- package/dist/services/audit/enforcers/lint-workflow-shape.js +4 -2
- package/dist/services/audit/enforcers/login-gate.js +2 -6
- package/dist/services/audit/enforcers/mock-placement.js +2 -2
- package/dist/services/audit/enforcers/no-root-pollution.js +38 -9
- package/dist/services/audit/enforcers/pre-rd-scan.js +1 -1
- package/dist/services/audit/enforcers/prototype-fidelity.js +1 -1
- package/dist/services/audit/enforcers/resume-detection.js +5 -4
- package/dist/services/audit/prose-ratio-calculator.js +1 -1
- package/dist/services/audit/red-line-catalog-p2-a-bee-runtime.d.ts +39 -0
- package/dist/services/audit/red-line-catalog-p2-a-bee-runtime.js +205 -0
- package/dist/services/audit/red-line-catalog-p2-a-lint-style.d.ts +52 -0
- package/dist/services/audit/red-line-catalog-p2-a-lint-style.js +205 -0
- package/dist/services/audit/red-line-catalog-p2-a.js +3 -374
- package/dist/services/audit/red-line-catalog-p2-b.js +26 -26
- package/dist/services/audit/red-line-catalog.js +26 -38
- package/dist/services/audit/red-lines-service.js +64 -49
- package/dist/services/audit/scanners/openspec-scanner.js +2 -2
- package/dist/services/audit/scanners/rules-tree-scanner.js +2 -2
- package/dist/services/audit/scanners/skills-tree-scanner.js +2 -2
- package/dist/services/audit/static-service.js +3 -3
- package/dist/services/audit-independent/index.d.ts +2 -2
- package/dist/services/audit-independent/index.js +2 -2
- package/dist/services/audit-independent/perf-audit-service.js +19 -8
- package/dist/services/audit-independent/security-audit-service.js +31 -16
- package/dist/services/autonomous-swarm/autonomous-swarm-service.js +75 -46
- package/dist/services/best-practice/output-formatter.js +7 -1
- package/dist/services/capability-audit-service/cross-check.js +11 -5
- package/dist/services/capability-audit-service/runner.js +15 -7
- package/dist/services/capability-baseline/store.js +16 -4
- package/dist/services/capability-baseline/types.js +15 -3
- package/dist/services/capability-baseline/validator.js +43 -7
- package/dist/services/capability-guard-runner/contracts/J02.js +36 -6
- package/dist/services/capability-guard-runner/contracts/J03.js +20 -11
- package/dist/services/capability-guard-runner/contracts/J04.js +24 -15
- package/dist/services/capability-guard-runner/contracts/J05.js +26 -10
- package/dist/services/capability-guard-runner/contracts/J07.js +8 -2
- package/dist/services/capability-guard-runner/contracts/J08.js +22 -5
- package/dist/services/capability-guard-runner/contracts/J10.js +6 -2
- package/dist/services/capability-guard-runner/contracts/J11.d.ts +5 -0
- package/dist/services/capability-guard-runner/contracts/J11.js +14 -2
- package/dist/services/capability-guard-runner/contracts/J12.js +12 -3
- package/dist/services/capability-guard-runner/diff.js +1 -5
- package/dist/services/changeset/changeset-check-service.js +1 -3
- package/dist/services/classify/classify-service.js +20 -8
- package/dist/services/classify/classify-types.js +22 -9
- package/dist/services/code/auto-compact-lifecycle.js +62 -39
- package/dist/services/code/auto-compact-modes.js +2 -2
- package/dist/services/code/auto-compact-orchestrator.js +14 -9
- package/dist/services/code/batch-heartbeat-poller.d.ts +10 -0
- package/dist/services/code/batch-heartbeat-poller.js +17 -1
- package/dist/services/code/compact-event-settle-types.d.ts +80 -0
- package/dist/services/code/compact-event-settle-types.js +20 -0
- package/dist/services/code/compact-event-settle.d.ts +3 -68
- package/dist/services/code/compact-event-settle.js +14 -10
- package/dist/services/code/dag-orchestrator.js +32 -26
- package/dist/services/code/job-shape-decision.js +3 -1
- package/dist/services/code/mode-gate-types.d.ts +57 -0
- package/dist/services/code/mode-gate-types.js +67 -0
- package/dist/services/code/mode-gate.d.ts +4 -58
- package/dist/services/code/mode-gate.js +24 -60
- package/dist/services/code/orchestrator-can-do-advisories.d.ts +30 -0
- package/dist/services/code/orchestrator-can-do-advisories.js +81 -0
- package/dist/services/code/orchestrator-can-do-probes.d.ts +30 -0
- package/dist/services/code/orchestrator-can-do-probes.js +77 -0
- package/dist/services/code/orchestrator-can-do.d.ts +11 -22
- package/dist/services/code/orchestrator-can-do.js +37 -137
- package/dist/services/code/post-compact-checkpoint.d.ts +28 -0
- package/dist/services/code/post-compact-checkpoint.js +57 -0
- package/dist/services/code/post-compact-detector.js +16 -48
- package/dist/services/code/step-08-gate.d.ts +4 -3
- package/dist/services/code/step-08-gate.js +21 -9
- package/dist/services/code-review/ecc-bridge.js +23 -23
- package/dist/services/codegraph/codegraph-autorefresh.js +56 -39
- package/dist/services/codegraph/codegraph-config-repair-writer.js +4 -1
- package/dist/services/codegraph/codegraph-exclude-integrity.js +4 -1
- package/dist/services/codegraph/codegraph-exclude-repair.js +1 -2
- package/dist/services/codegraph/codegraph-index-integrity.js +1 -1
- package/dist/services/codegraph/codegraph-preflight-service.d.ts +3 -26
- package/dist/services/codegraph/codegraph-preflight-service.js +16 -37
- package/dist/services/codegraph/codegraph-preflight-structure.d.ts +32 -0
- package/dist/services/codegraph/codegraph-preflight-structure.js +33 -0
- package/dist/services/codegraph/codegraph-process-runner.js +12 -1
- package/dist/services/codegraph/codegraph-service.js +9 -1
- package/dist/services/compact/request-transition-hook.js +2 -1
- package/dist/services/compact/suggest-service.d.ts +3 -61
- package/dist/services/compact/suggest-service.js +9 -12
- package/dist/services/compact/suggest-types.d.ts +76 -0
- package/dist/services/compact/suggest-types.js +10 -0
- package/dist/services/compact-history/compact-history-service.js +2 -2
- package/dist/services/compact-statusline/compact-lifecycle-store.d.ts +2 -32
- package/dist/services/compact-statusline/compact-lifecycle-store.js +7 -12
- package/dist/services/compact-statusline/compact-lifecycle-types.d.ts +32 -0
- package/dist/services/compact-statusline/compact-lifecycle-types.js +8 -0
- package/dist/services/compact-statusline/compact-statusline-cell-table.d.ts +42 -0
- package/dist/services/compact-statusline/compact-statusline-cell-table.js +63 -0
- package/dist/services/compact-statusline/compact-statusline-service.d.ts +4 -21
- package/dist/services/compact-statusline/compact-statusline-service.js +9 -101
- package/dist/services/compact-statusline/compact-statusline-state.d.ts +4 -0
- package/dist/services/compact-statusline/compact-statusline-state.js +50 -0
- package/dist/services/config/config-migration.js +2 -2
- package/dist/services/config/config-restore.js +1 -1
- package/dist/services/config/config-rollback.js +1 -1
- package/dist/services/config/config-safety.js +28 -10
- package/dist/services/config/config-service.js +114 -31
- package/dist/services/config/model-routing.js +5 -2
- package/dist/services/config/proxy-service.js +6 -1
- package/dist/services/config/workspace-state-service.js +17 -5
- package/dist/services/context/auto-compact-dispatcher-input.d.ts +38 -0
- package/dist/services/context/auto-compact-dispatcher-input.js +9 -0
- package/dist/services/context/auto-compact-dispatcher.d.ts +2 -30
- package/dist/services/context/auto-compact-reader-input.d.ts +30 -0
- package/dist/services/context/auto-compact-reader-input.js +8 -0
- package/dist/services/context/auto-compact-reader.d.ts +2 -24
- package/dist/services/context/auto-compact-reader.js +4 -1
- package/dist/services/context/auto-compact-thresholds.d.ts +54 -0
- package/dist/services/context/auto-compact-thresholds.js +19 -0
- package/dist/services/context/auto-compact-types.d.ts +2 -46
- package/dist/services/context/auto-compact-types.js +1 -11
- package/dist/services/context/build-dispatch-system-prompt.js +2 -2
- package/dist/services/context/collector.js +8 -10
- package/dist/services/context/context-audit-hint.js +7 -5
- package/dist/services/context/context-audit-keys.d.ts +15 -0
- package/dist/services/context/context-audit-keys.js +77 -0
- package/dist/services/context/context-audit-limits.d.ts +20 -0
- package/dist/services/context/context-audit-limits.js +31 -0
- package/dist/services/context/context-audit-scan.d.ts +19 -0
- package/dist/services/context/context-audit-scan.js +246 -0
- package/dist/services/context/context-audit-types.d.ts +65 -0
- package/dist/services/context/context-audit-types.js +10 -0
- package/dist/services/context/context-audit.d.ts +13 -59
- package/dist/services/context/context-audit.js +38 -254
- package/dist/services/context/context-builder.js +4 -4
- package/dist/services/context/context-schema.d.ts +1 -1
- package/dist/services/context/context-schema.js +13 -13
- package/dist/services/context/doc-retriever.js +2 -2
- package/dist/services/context/harness-context-witness.js +43 -24
- package/dist/services/context/harness-window-config.js +27 -7
- package/dist/services/context/ide-detect.js +2 -1
- package/dist/services/context/index.d.ts +1 -1
- package/dist/services/context/memory-index-reader.js +3 -9
- package/dist/services/context/memory-preflight-config.js +3 -5
- package/dist/services/context/memory-preflight-service.d.ts +2 -20
- package/dist/services/context/memory-preflight-service.js +37 -68
- package/dist/services/context/memory-preflight-support.d.ts +48 -0
- package/dist/services/context/memory-preflight-support.js +56 -0
- package/dist/services/context/post-compact-reinjection.js +3 -3
- package/dist/services/context/renderer.js +7 -3
- package/dist/services/context/spillover-store.js +3 -1
- package/dist/services/context/summary-view.js +1 -1
- package/dist/services/context/threshold.js +2 -2
- package/dist/services/context/tokenizer.js +3 -3
- package/dist/services/crystallization/crystallization-brief-schema.d.ts +80 -0
- package/dist/services/crystallization/crystallization-brief-schema.js +159 -0
- package/dist/services/crystallization/crystallization-service.d.ts +7 -7
- package/dist/services/crystallization/crystallization-service.js +56 -55
- package/dist/services/crystallization/crystallization-store.d.ts +2 -2
- package/dist/services/crystallization/crystallization-store.js +37 -20
- package/dist/services/crystallization/crystallization-types.d.ts +4 -56
- package/dist/services/crystallization/crystallization-types.js +31 -184
- package/dist/services/crystallization/evidence-brief-builder.d.ts +3 -3
- package/dist/services/crystallization/evidence-brief-builder.js +32 -38
- package/dist/services/crystallization/index.d.ts +4 -4
- package/dist/services/crystallization/index.js +4 -4
- package/dist/services/dashboard/project-dashboard-service.js +7 -1
- package/dist/services/dispatch/await-batch-helpers.d.ts +55 -0
- package/dist/services/dispatch/await-batch-helpers.js +206 -0
- package/dist/services/dispatch/await-batch.d.ts +50 -7
- package/dist/services/dispatch/await-batch.js +97 -194
- package/dist/services/dispatch/batch-counter.js +2 -1
- package/dist/services/dispatch/conflict-replay.js +2 -2
- package/dist/services/dispatch/contract-store.js +5 -2
- package/dist/services/dispatch/dispatch-record-input-types.d.ts +81 -0
- package/dist/services/dispatch/dispatch-record-input-types.js +1 -0
- package/dist/services/dispatch/dispatch-record-types.d.ts +6 -73
- package/dist/services/dispatch/dispatch-record-upgrade-fields.d.ts +72 -0
- package/dist/services/dispatch/dispatch-record-upgrade-fields.js +242 -0
- package/dist/services/dispatch/dispatch-record-upgrade-guards.d.ts +15 -0
- package/dist/services/dispatch/dispatch-record-upgrade-guards.js +55 -0
- package/dist/services/dispatch/dispatch-record-upgrade.d.ts +2 -4
- package/dist/services/dispatch/dispatch-record-upgrade.js +21 -213
- package/dist/services/dispatch/dispatch-record-writer.js +54 -26
- package/dist/services/dispatch/dispatch-sub-agent.js +7 -2
- package/dist/services/dispatch/e2e-fixtures.js +1 -1
- package/dist/services/dispatch/isolation-lease.js +39 -17
- package/dist/services/dispatch/merge-back-runner.js +51 -11
- package/dist/services/dispatch/service-shutdown.js +4 -1
- package/dist/services/dispatch/slice-dag-types.d.ts +116 -0
- package/dist/services/dispatch/slice-dag-types.js +41 -0
- package/dist/services/dispatch/slice-dag.d.ts +3 -109
- package/dist/services/dispatch/slice-dag.js +13 -36
- package/dist/services/dispatch/sub-agent-batch-await.d.ts +47 -0
- package/dist/services/dispatch/sub-agent-batch-await.js +73 -0
- package/dist/services/dispatch/sub-agent-dispatcher-types.d.ts +122 -0
- package/dist/services/dispatch/sub-agent-dispatcher-types.js +12 -0
- package/dist/services/dispatch/sub-agent-dispatcher.d.ts +3 -145
- package/dist/services/dispatch/sub-agent-dispatcher.js +14 -70
- package/dist/services/dispatch/test-tool-detection.js +12 -1
- package/dist/services/doc/doc-generator.js +19 -4
- package/dist/services/doctor/doctor-service/checks/check-id-schema.js +16 -8
- package/dist/services/doctor/doctor-service/checks/codegraph-capability.d.ts +7 -2
- package/dist/services/doctor/doctor-service/checks/codegraph-capability.js +26 -8
- package/dist/services/doctor/doctor-service/checks/codegraph-exclude-integrity.js +16 -8
- package/dist/services/doctor/doctor-service/checks/codegraph-index-integrity.js +16 -8
- package/dist/services/doctor/doctor-service/checks/dist-source-version.js +18 -9
- package/dist/services/doctor/doctor-service/checks/ecc-hooks-schema-drift.js +20 -10
- package/dist/services/doctor/doctor-service/checks/gateguard-conflict.js +18 -9
- package/dist/services/doctor/doctor-service/checks/l3-memory-health.js +25 -11
- package/dist/services/doctor/doctor-service/checks/l3-orphan-sessions.js +12 -6
- package/dist/services/doctor/doctor-service/checks/multi-binary-drift.d.ts +7 -16
- package/dist/services/doctor/doctor-service/checks/multi-binary-drift.js +50 -70
- package/dist/services/doctor/doctor-service/checks/schema-validity.js +5 -1
- package/dist/services/doctor/doctor-service/checks/skill-presence.js +4 -2
- package/dist/services/doctor/doctor-service/checks/statusline-install.js +8 -4
- package/dist/services/doctor/doctor-service/checks/statusline-runtime.js +8 -4
- package/dist/services/doctor/doctor-service/checks/user-config.js +4 -2
- package/dist/services/doctor/doctor-service/checks/workspace-init.js +8 -4
- package/dist/services/doctor/doctor-service/checks/workspace-layout.js +19 -11
- package/dist/services/doctor/doctor-service/index.js +4 -2
- package/dist/services/doctor/doctor-service/multi-binary-drift-helpers.d.ts +40 -0
- package/dist/services/doctor/doctor-service/multi-binary-drift-helpers.js +49 -0
- package/dist/services/doctor/doctor-service/plugin-registry.js +1 -1
- package/dist/services/doctor/doctor-service/probe-types.d.ts +210 -0
- package/dist/services/doctor/doctor-service/probe-types.js +14 -0
- package/dist/services/doctor/doctor-service/types.d.ts +7 -197
- package/dist/services/doctor/index.d.ts +1 -1
- package/dist/services/doctor/index.js +1 -1
- package/dist/services/env/shell-probe.js +8 -2
- package/dist/services/evidence/evidence-body-builders.d.ts +23 -0
- package/dist/services/evidence/evidence-body-builders.js +197 -0
- package/dist/services/evidence/evidence-generator.js +6 -187
- package/dist/services/evolution/evolution-constraints.d.ts +43 -0
- package/dist/services/evolution/evolution-constraints.js +54 -0
- package/dist/services/evolution/evolution-evaluation-schema.d.ts +43 -0
- package/dist/services/evolution/evolution-evaluation-schema.js +43 -0
- package/dist/services/evolution/evolution-service.d.ts +6 -6
- package/dist/services/evolution/evolution-service.js +58 -58
- package/dist/services/evolution/evolution-store.d.ts +2 -2
- package/dist/services/evolution/evolution-store.js +37 -51
- package/dist/services/evolution/evolution-types.d.ts +2 -22
- package/dist/services/evolution/evolution-types.js +41 -101
- package/dist/services/evolution/independent-evaluator-runner.d.ts +3 -3
- package/dist/services/evolution/independent-evaluator-runner.js +20 -22
- package/dist/services/evolution/regression-skeptic-runner.d.ts +2 -2
- package/dist/services/evolution/regression-skeptic-runner.js +18 -18
- package/dist/services/feedback/feedback-promotion-service.js +48 -12
- package/dist/services/feedback/promotion-artifact-evidence.d.ts +2 -16
- package/dist/services/feedback/promotion-artifact-evidence.js +6 -83
- package/dist/services/feedback/promotion-artifact-json-evidence.d.ts +29 -0
- package/dist/services/feedback/promotion-artifact-json-evidence.js +39 -0
- package/dist/services/feedback/promotion-source-comments.d.ts +47 -0
- package/dist/services/feedback/promotion-source-comments.js +61 -0
- package/dist/services/final-review/final-review-contract.d.ts +26 -0
- package/dist/services/final-review/final-review-contract.js +14 -0
- package/dist/services/final-review/final-review-delivery.d.ts +63 -0
- package/dist/services/final-review/final-review-delivery.js +124 -0
- package/dist/services/final-review/final-review-evidence-budget.d.ts +125 -0
- package/dist/services/final-review/final-review-evidence-budget.js +218 -0
- package/dist/services/final-review/final-review-evidence-collect.d.ts +4 -0
- package/dist/services/final-review/final-review-evidence-collect.js +230 -0
- package/dist/services/final-review/final-review-evidence-sources.d.ts +138 -0
- package/dist/services/final-review/final-review-evidence-sources.js +139 -0
- package/dist/services/final-review/final-review-fifth-dim.d.ts +8 -0
- package/dist/services/final-review/final-review-fifth-dim.js +20 -0
- package/dist/services/final-review/final-review-gates.d.ts +119 -0
- package/dist/services/final-review/final-review-gates.js +214 -0
- package/dist/services/final-review/final-review-output-budget.d.ts +88 -0
- package/dist/services/final-review/final-review-output-budget.js +161 -0
- package/dist/services/final-review/final-review-prompt.d.ts +35 -0
- package/dist/services/final-review/final-review-prompt.js +112 -0
- package/dist/services/final-review/final-review-reviewer.d.ts +57 -0
- package/dist/services/final-review/final-review-reviewer.js +95 -0
- package/dist/services/final-review/final-review-runner.d.ts +3 -0
- package/dist/services/final-review/final-review-runner.js +158 -0
- package/dist/services/final-review/final-review-service.d.ts +119 -373
- package/dist/services/final-review/final-review-service.js +48 -1380
- package/dist/services/final-review/final-review-verdicts.d.ts +60 -0
- package/dist/services/final-review/final-review-verdicts.js +91 -0
- package/dist/services/final-review/index.d.ts +3 -3
- package/dist/services/final-review/index.js +2 -2
- package/dist/services/final-review/pre-post-diff.js +32 -29
- package/dist/services/fixture/fixture-capture-service.js +14 -6
- package/dist/services/fresh-context/trigger-scan.js +13 -2
- package/dist/services/fuzzy-matching/fuzzy-match-service.js +1 -1
- package/dist/services/fuzzy-matching/fzf-pick-service.js +6 -1
- package/dist/services/hooks/pre-tool-code-gate.js +2 -2
- package/dist/services/hooks/presence-marker-detector.js +12 -2
- package/dist/services/hooks/worktree-authorization-gate.js +21 -7
- package/dist/services/ide/adapters/claude-code-adapter.js +30 -17
- package/dist/services/ide/adapters/codex-adapter.js +3 -5
- package/dist/services/ide/adapters/cursor-adapter.js +3 -5
- package/dist/services/ide/adapters/hermes-adapter.js +2 -4
- package/dist/services/ide/adapters/openclaw-adapter.js +2 -4
- package/dist/services/ide/adapters/qoder-adapter.js +2 -4
- package/dist/services/ide/adapters/tongyi-lingma-adapter.js +1 -1
- package/dist/services/ide/adapters/trae-adapter.js +3 -5
- package/dist/services/ide/adapters/zcode-adapter.js +8 -7
- package/dist/services/ide/current-model-detector.js +2 -1
- package/dist/services/ide/ide-compact-types.d.ts +153 -0
- package/dist/services/ide/ide-compact-types.js +1 -0
- package/dist/services/ide/ide-registry.js +1 -1
- package/dist/services/ide/ide-types.d.ts +7 -145
- package/dist/services/ide/resource-profile.js +1 -1
- package/dist/services/ide/shared/atomic-json.js +2 -1
- package/dist/services/impact/impact-scan-service.js +12 -5
- package/dist/services/job/job-commit-verification.d.ts +73 -0
- package/dist/services/job/job-commit-verification.js +72 -0
- package/dist/services/job/job-orchestrator.d.ts +42 -0
- package/dist/services/job/job-orchestrator.js +110 -10
- package/dist/services/job/job-progress-store.d.ts +75 -5
- package/dist/services/job/job-progress-store.js +83 -6
- package/dist/services/job/job-rotation.d.ts +1 -1
- package/dist/services/job/job-rotation.js +5 -1
- package/dist/services/job/job-state-store.js +2 -2
- package/dist/services/job/job-types.js +49 -20
- package/dist/services/job/subagent-job-wrapper.d.ts +1 -1
- package/dist/services/job/subagent-job-wrapper.js +5 -1
- package/dist/services/job-snapshot/snapshot.js +2 -2
- package/dist/services/karpathy-cost/karpathy-cost-check-service.js +23 -13
- package/dist/services/legacy/legacy-detector.js +51 -5
- package/dist/services/lint/detect-eslint.js +10 -4
- package/dist/services/lint/detect-ocr-18.js +11 -3
- package/dist/services/lint/eslint-runner-support.d.ts +22 -0
- package/dist/services/lint/eslint-runner-support.js +185 -0
- package/dist/services/lint/eslint-runner-types.d.ts +69 -0
- package/dist/services/lint/eslint-runner-types.js +11 -0
- package/dist/services/lint/eslint-runner.d.ts +4 -56
- package/dist/services/lint/eslint-runner.js +24 -178
- package/dist/services/lint/npx-resolver.js +1 -3
- package/dist/services/lint/ocr-18-acquire.js +15 -4
- package/dist/services/lint/ocr-multilang-adapter.js +4 -5
- package/dist/services/llm/anthropic-runner.js +4 -1
- package/dist/services/log/log-commands-service.js +2 -6
- package/dist/services/log/logger.js +15 -12
- package/dist/services/log/retention.js +3 -2
- package/dist/services/loop/evaluator-dispatcher.js +78 -42
- package/dist/services/loop/loop-bee-relation-service.d.ts +4 -4
- package/dist/services/loop/loop-bee-relation-service.js +36 -40
- package/dist/services/loop/loop-bee-relation-store.d.ts +3 -3
- package/dist/services/loop/loop-bee-relation-store.js +9 -11
- package/dist/services/loop/loop-bee-relation-types.d.ts +1 -1
- package/dist/services/loop/loop-bee-relation-types.js +14 -25
- package/dist/services/loop/loop-release-service.d.ts +2 -2
- package/dist/services/loop/loop-release-service.js +3 -3
- package/dist/services/loop/loop-release-store.d.ts +2 -2
- package/dist/services/loop/loop-release-store.js +4 -6
- package/dist/services/loop/loop-release-types.d.ts +1 -1
- package/dist/services/loop/loop-release-types.js +21 -31
- package/dist/services/loop/monotonic-guard-types.d.ts +51 -0
- package/dist/services/loop/monotonic-guard-types.js +9 -0
- package/dist/services/loop/monotonic-guard.d.ts +2 -43
- package/dist/services/loop/monotonic-runner-types.d.ts +63 -0
- package/dist/services/loop/monotonic-runner-types.js +17 -0
- package/dist/services/loop/monotonic-runner.d.ts +3 -34
- package/dist/services/loop/monotonic-runner.js +10 -20
- package/dist/services/loop/run-driver.js +16 -8
- package/dist/services/loop/spec-service.d.ts +0 -5
- package/dist/services/loop/spec-service.js +49 -9
- package/dist/services/memory/llm-reranker-core.d.ts +108 -0
- package/dist/services/memory/llm-reranker-core.js +105 -0
- package/dist/services/memory/llm-reranker.d.ts +3 -94
- package/dist/services/memory/llm-reranker.js +13 -102
- package/dist/services/memory/memory-ingest-service.d.ts +1 -22
- package/dist/services/memory/memory-ingest-service.js +29 -76
- package/dist/services/memory/memory-ingest-support.d.ts +23 -0
- package/dist/services/memory/memory-ingest-support.js +81 -0
- package/dist/services/memory/memory-rotate-service.js +41 -8
- package/dist/services/memory/memory-search-service.js +8 -4
- package/dist/services/memory/project-context-service.js +26 -5
- package/dist/services/memory/project-memory-service/index/kind-dispatch.d.ts +2 -7
- package/dist/services/memory/project-memory-service/index/kind-dispatch.js +17 -136
- package/dist/services/memory/project-memory-service/index/project-memory-plan-exec.d.ts +7 -0
- package/dist/services/memory/project-memory-service/index/project-memory-plan-exec.js +150 -0
- package/dist/services/memory/project-memory-service/index/ranking.js +6 -3
- package/dist/services/memory/project-memory-service/index/reindex.js +14 -5
- package/dist/services/memory/project-memory-service/memory-kinds.d.ts +31 -0
- package/dist/services/memory/project-memory-service/memory-kinds.js +87 -0
- package/dist/services/memory/project-memory-service/parsers/frontmatter-parse.d.ts +24 -0
- package/dist/services/memory/project-memory-service/parsers/frontmatter-parse.js +104 -0
- package/dist/services/memory/project-memory-service/parsers/frontmatter.d.ts +2 -24
- package/dist/services/memory/project-memory-service/parsers/frontmatter.js +28 -79
- package/dist/services/memory/project-memory-service/parsers/markdown-pure.js +15 -3
- package/dist/services/memory/project-memory-service/store/atomic-write.js +34 -22
- package/dist/services/memory/project-memory-service/store/paths.js +2 -1
- package/dist/services/memory/project-memory-service/types.d.ts +3 -31
- package/dist/services/memory/project-memory-service/types.js +1 -76
- package/dist/services/migrate-skill-name/migrate.js +1 -1
- package/dist/services/migrate-skill-name/schema.js +1 -1
- package/dist/services/mode/mode-enforcement.js +4 -2
- package/dist/services/mode/mode-status-service.d.ts +27 -9
- package/dist/services/mode/mode-status-service.js +64 -12
- package/dist/services/observability/aggregation-helpers.d.ts +22 -0
- package/dist/services/observability/aggregation-helpers.js +65 -0
- package/dist/services/observability/aggregation-types.d.ts +66 -0
- package/dist/services/observability/aggregation-types.js +34 -0
- package/dist/services/observability/aggregation.d.ts +5 -53
- package/dist/services/observability/aggregation.js +17 -80
- package/dist/services/observability/jsonl-store.js +2 -1
- package/dist/services/observability/observability-schema.d.ts +71 -0
- package/dist/services/observability/observability-schema.js +64 -0
- package/dist/services/observability/observability-service.d.ts +3 -56
- package/dist/services/observability/observability-service.js +9 -49
- package/dist/services/openspec/coverage-evidence-reader.js +18 -11
- package/dist/services/openspec/openspec-archive-service.js +31 -24
- package/dist/services/openspec/openspec-init-service.js +8 -2
- package/dist/services/openspec/openspec-propose-from-doctor-service.js +1 -1
- package/dist/services/openspec/openspec-scan-service.js +4 -1
- package/dist/services/openspec/openspec-validate-service.js +26 -5
- package/dist/services/perf/perf-baseline-service.js +2 -6
- package/dist/services/polyrepo/polyrepo-dispatcher.js +2 -1
- package/dist/services/polyrepo/polyrepo-scanner.js +4 -1
- package/dist/services/prd/handoff-frontmatter-shape.d.ts +42 -0
- package/dist/services/prd/handoff-frontmatter-shape.js +67 -0
- package/dist/services/prd/handoff-frontmatter.js +1 -1
- package/dist/services/prd/handoff-path-resolution.d.ts +37 -0
- package/dist/services/prd/handoff-path-resolution.js +101 -0
- package/dist/services/prd/handoff-service.d.ts +1 -37
- package/dist/services/prd/handoff-service.js +16 -148
- package/dist/services/prd/prd-blocks-checker.js +28 -8
- package/dist/services/prd/project-scan-bootstrap-service.js +1 -5
- package/dist/services/prd/project-scan-reader.js +1 -4
- package/dist/services/prd/project-scan-sediment.js +1 -4
- package/dist/services/preferences/preferences-service.js +6 -8
- package/dist/services/preferences/preferences-types.js +4 -4
- package/dist/services/qa/bdd-test-style-contract.d.ts +41 -0
- package/dist/services/qa/bdd-test-style-contract.js +37 -0
- package/dist/services/qa/bdd-test-style-verifier.d.ts +2 -24
- package/dist/services/qa/bdd-test-style-verifier.js +5 -31
- package/dist/services/qa/browser-event-logger.js +2 -1
- package/dist/services/qa/qa-business-review-state.js +20 -5
- package/dist/services/qa/screenshot-archive-service.js +1 -3
- package/dist/services/rd/ast-gate.js +2 -2
- package/dist/services/rd/impl.js +1 -1
- package/dist/services/rd/rd-service.js +117 -43
- package/dist/services/rd/reviewer-dispatch-policy.js +4 -7
- package/dist/services/rd/standards-diagnostic.js +4 -1
- package/dist/services/rd/strategy.js +10 -3
- package/dist/services/rd/tactical-stage.js +2 -2
- package/dist/services/rd/types.js +9 -7
- package/dist/services/rd-swarm/rd-swarm-service.d.ts +2 -45
- package/dist/services/rd-swarm/rd-swarm-service.js +140 -21
- package/dist/services/rd-swarm/rd-swarm-types.d.ts +54 -0
- package/dist/services/rd-swarm/rd-swarm-types.js +10 -0
- package/dist/services/recommendations/capability-map-service.js +10 -2
- package/dist/services/recommendations/capability-seed-items.js +81 -14
- package/dist/services/recommendations/capability-seed-mappings.js +420 -48
- package/dist/services/recommendations/capability-seed-sources-mcp-server.d.ts +9 -0
- package/dist/services/recommendations/capability-seed-sources-mcp-server.js +233 -0
- package/dist/services/recommendations/capability-seed-sources.js +127 -32
- package/dist/services/release/release-state.d.ts +2 -2
- package/dist/services/release/release-state.js +44 -15
- package/dist/services/release/version-precheck-layer-changeset.d.ts +2 -0
- package/dist/services/release/version-precheck-layer-changeset.js +43 -0
- package/dist/services/release/version-precheck-service.d.ts +11 -36
- package/dist/services/release/version-precheck-service.js +20 -104
- package/dist/services/release/version-precheck-support.d.ts +53 -0
- package/dist/services/release/version-precheck-support.js +64 -0
- package/dist/services/retrospective/retrospective-index.js +17 -3
- package/dist/services/retrospective/retrospective-search-service.js +6 -2
- package/dist/services/retrospective/retrospective-show.js +4 -1
- package/dist/services/reviewer/model-family.js +7 -1
- package/dist/services/reviewer/providers/anthropic.d.ts +5 -0
- package/dist/services/reviewer/providers/anthropic.js +10 -1
- package/dist/services/reviewer/providers/openai.d.ts +5 -0
- package/dist/services/reviewer/providers/openai.js +10 -1
- package/dist/services/reviewer/reviewer-config.js +4 -2
- package/dist/services/reviewer/reviewer-service.d.ts +2 -36
- package/dist/services/reviewer/reviewer-service.js +2 -1
- package/dist/services/reviewer/reviewer-types.d.ts +43 -0
- package/dist/services/reviewer/reviewer-types.js +1 -0
- package/dist/services/role/role-registry.js +9 -1
- package/dist/services/runtime/runtime-detector.js +4 -1
- package/dist/services/runtime/vendors/claude-code.js +14 -6
- package/dist/services/runtime/vendors/codex.js +11 -3
- package/dist/services/runtime/vendors/copilot.js +11 -3
- package/dist/services/sc/sc-service.js +28 -15
- package/dist/services/scan/acceptance-coverage-service.js +4 -1
- package/dist/services/scan/api-diff-openapi-schema-read.d.ts +67 -0
- package/dist/services/scan/api-diff-openapi-schema-read.js +154 -0
- package/dist/services/scan/api-diff-openapi.d.ts +16 -2
- package/dist/services/scan/api-diff-openapi.js +19 -123
- package/dist/services/scan/api-diff-recorded.js +16 -3
- package/dist/services/scan/api-diff-service.js +49 -16
- package/dist/services/scan/api-diff-types.js +12 -3
- package/dist/services/scan/api-surface-helpers.d.ts +13 -0
- package/dist/services/scan/api-surface-helpers.js +31 -0
- package/dist/services/scan/api-surface-service.d.ts +2 -45
- package/dist/services/scan/api-surface-service.js +15 -26
- package/dist/services/scan/api-surface-types.d.ts +54 -0
- package/dist/services/scan/api-surface-types.js +10 -0
- package/dist/services/scan/archetype-detection.d.ts +37 -0
- package/dist/services/scan/archetype-detection.js +142 -0
- package/dist/services/scan/archetype-service.js +36 -125
- package/dist/services/scan/diff-scope-service.js +35 -15
- package/dist/services/scan/existing-system-service.js +16 -99
- package/dist/services/scan/existing-system-visual-tokens.d.ts +20 -0
- package/dist/services/scan/existing-system-visual-tokens.js +123 -0
- package/dist/services/scan/file-size-policy.d.ts +86 -0
- package/dist/services/scan/file-size-policy.js +184 -0
- package/dist/services/scan/file-size-scan.d.ts +30 -3
- package/dist/services/scan/file-size-scan.js +47 -9
- package/dist/services/scan/karpathy-service.js +6 -1
- package/dist/services/scan/orphan-service.js +86 -20
- package/dist/services/scan/type-sanity-service.js +104 -10
- package/dist/services/sediment/dispose-confirm.d.ts +2 -2
- package/dist/services/sediment/dispose-confirm.js +2 -2
- package/dist/services/sediment/json-schema.d.ts +1 -1
- package/dist/services/sediment/json-schema.js +25 -13
- package/dist/services/sediment/manifest-lint.d.ts +1 -12
- package/dist/services/sediment/manifest-lint.js +1 -7
- package/dist/services/sediment/pool-paths.js +13 -9
- package/dist/services/sediment/pool-read.d.ts +1 -1
- package/dist/services/sediment/pool-read.js +42 -18
- package/dist/services/sediment/pool-rebuild-index.d.ts +1 -1
- package/dist/services/sediment/pool-rebuild-index.js +5 -5
- package/dist/services/sediment/pool-write.d.ts +1 -1
- package/dist/services/sediment/pool-write.js +7 -7
- package/dist/services/sediment/promotion-gate.d.ts +1 -1
- package/dist/services/sediment/promotion-gate.js +9 -9
- package/dist/services/sediment/types.d.ts +8 -8
- package/dist/services/session/binding-status-service.js +14 -4
- package/dist/services/session/caller-binding-service.js +2 -1
- package/dist/services/session/getSessionDir.js +4 -1
- package/dist/services/session/index.d.ts +1 -1
- package/dist/services/session/index.js +1 -1
- package/dist/services/session/resolve-caller-id.js +7 -5
- package/dist/services/session/session-binding-bridge.js +26 -25
- package/dist/services/session/session-checkpoint-service.js +1 -1
- package/dist/services/session/session-file-schema.d.ts +70 -0
- package/dist/services/session/session-file-schema.js +68 -0
- package/dist/services/session/session-manager.d.ts +6 -6
- package/dist/services/session/session-manager.js +30 -29
- package/dist/services/session/session-resume-service.js +2 -1
- package/dist/services/share/bundle-format-constants.d.ts +85 -0
- package/dist/services/share/bundle-format-constants.js +100 -0
- package/dist/services/share/bundle-reader.d.ts +3 -3
- package/dist/services/share/bundle-reader.js +75 -68
- package/dist/services/share/bundle-types.d.ts +3 -70
- package/dist/services/share/bundle-types.js +38 -107
- package/dist/services/share/bundle-writer.d.ts +3 -3
- package/dist/services/share/bundle-writer.js +101 -91
- package/dist/services/share/run-state-contract.d.ts +1 -1
- package/dist/services/share/run-state-contract.js +7 -13
- package/dist/services/signal/cancel-handler.js +2 -1
- package/dist/services/skill/resume-detector.js +6 -4
- package/dist/services/skill/skill-scheduler.js +3 -1
- package/dist/services/skill/skill-search-service.js +4 -4
- package/dist/services/skillhub/release-diff.d.ts +2 -2
- package/dist/services/skillhub/release-diff.js +6 -10
- package/dist/services/skillhub/release-export.d.ts +2 -2
- package/dist/services/skillhub/release-export.js +15 -17
- package/dist/services/skillhub/release-gc-blobs.d.ts +2 -2
- package/dist/services/skillhub/release-gc-blobs.js +4 -4
- package/dist/services/skillhub/release-import.d.ts +2 -2
- package/dist/services/skillhub/release-import.js +13 -12
- package/dist/services/skillhub/release-retain.d.ts +3 -3
- package/dist/services/skillhub/release-retain.js +22 -22
- package/dist/services/skillhub/sqlite-store.d.ts +1 -1
- package/dist/services/skillhub/sqlite-store.js +12 -11
- package/dist/services/skillhub/tar-runtime.js +15 -15
- package/dist/services/skillhub/types.d.ts +4 -4
- package/dist/services/skills/hooks-codegate-superpowers.js +16 -7
- package/dist/services/skills/hooks-settings-service.js +61 -19
- package/dist/services/skills/presence-lease-service.js +26 -16
- package/dist/services/skills/presence-lease-types.d.ts +1 -1
- package/dist/services/skills/presence-lease-types.js +1 -1
- package/dist/services/skills/skill-conformance-service.js +40 -8
- package/dist/services/skills/skill-presence-service.js +16 -14
- package/dist/services/skills/skill-runbook-service.js +2 -1
- package/dist/services/skills/skill-statusline-model.d.ts +128 -0
- package/dist/services/skills/skill-statusline-model.js +163 -0
- package/dist/services/skills/skill-statusline-renderer.js +4 -3
- package/dist/services/skills/skill-statusline-service.d.ts +3 -100
- package/dist/services/skills/skill-statusline-service.js +56 -163
- package/dist/services/skills/statusline-palette.js +11 -6
- package/dist/services/skills/statusline-settings-service.js +2 -1
- package/dist/services/skills/sync-service-support.d.ts +65 -0
- package/dist/services/skills/sync-service-support.js +50 -0
- package/dist/services/skills/sync-service.d.ts +3 -66
- package/dist/services/skills/sync-service.js +15 -53
- package/dist/services/slice/calibration-store.js +8 -2
- package/dist/services/slice/cross-pass-edge-merger.d.ts +3 -28
- package/dist/services/slice/cross-pass-edge-merger.js +13 -63
- package/dist/services/slice/cross-pass-edge-static-scan-support.d.ts +69 -0
- package/dist/services/slice/cross-pass-edge-static-scan-support.js +74 -0
- package/dist/services/slice/granularity-decider.js +2 -2
- package/dist/services/slice/slice-archive-service.js +8 -3
- package/dist/services/slice/slice-check-service.js +19 -8
- package/dist/services/slice/slice-decompose-runners.js +61 -23
- package/dist/services/slice/slice-decompose-service.js +4 -4
- package/dist/services/slice/slice-review-state.js +8 -2
- package/dist/services/smoke/smoke-paths-state.js +9 -2
- package/dist/services/sop/gate-enforce-service.js +9 -2
- package/dist/services/sop/sop-advance-service.js +14 -2
- package/dist/services/sop/sop-check-service.js +16 -4
- package/dist/services/sop/sop-paths.js +3 -1
- package/dist/services/sop/sop-registry-service.js +5 -1
- package/dist/services/sop/sop-service.js +29 -7
- package/dist/services/sop/sop-types.js +5 -1
- package/dist/services/standards/ide-aware-standards-service.js +2 -2
- package/dist/services/standards/loop-engineering-lint.js +12 -5
- package/dist/services/standards/loop-engineering-readiness-lint.js +5 -5
- package/dist/services/standards/migrate-claude-rules-service.js +9 -7
- package/dist/services/standards/missing-standards-detector.js +1 -3
- package/dist/services/standards/project-context-support.d.ts +50 -0
- package/dist/services/standards/project-context-support.js +244 -0
- package/dist/services/standards/project-context-types.d.ts +30 -0
- package/dist/services/standards/project-context-types.js +11 -0
- package/dist/services/standards/project-context.d.ts +10 -22
- package/dist/services/standards/project-context.js +27 -214
- package/dist/services/standards/project-standards-service.js +43 -12
- package/dist/services/standards/standards-render-common.d.ts +15 -0
- package/dist/services/standards/standards-render-common.js +49 -0
- package/dist/services/standards/standards-render.d.ts +1 -2
- package/dist/services/standards/standards-render.js +31 -58
- package/dist/services/standards/ui-library-dispatch-block.js +1 -1
- package/dist/services/tech/tech-change-id-service.js +7 -7
- package/dist/services/tech/tech-service.js +73 -26
- package/dist/services/test-cache/test-cache-service.js +8 -3
- package/dist/services/upgrade/1x-detector-service.js +5 -3
- package/dist/services/upgrade/gitignore-migrate-service.js +5 -5
- package/dist/services/upgrade/upgrade-service.js +36 -13
- package/dist/services/verdict/envelope-parsers.d.ts +84 -0
- package/dist/services/verdict/envelope-parsers.js +146 -0
- package/dist/services/verdict/envelopes.d.ts +50 -60
- package/dist/services/verdict/envelopes.js +18 -156
- package/dist/services/verdict/verdict-aggregator.js +27 -3
- package/dist/services/vm/vm-lease.js +15 -3
- package/dist/services/web/aria-node.d.ts +27 -0
- package/dist/services/web/aria-node.js +1 -0
- package/dist/services/web/browser-acquire.js +3 -1
- package/dist/services/web/browser-cache-probe.d.ts +18 -0
- package/dist/services/web/browser-cache-probe.js +110 -0
- package/dist/services/web/browser-session-manager.js +6 -2
- package/dist/services/web/daemon-registry.js +4 -1
- package/dist/services/web/playwright-loader.d.ts +2 -70
- package/dist/services/web/playwright-types.d.ts +75 -0
- package/dist/services/web/playwright-types.js +1 -0
- package/dist/services/web/snapshot-pruner.d.ts +2 -23
- package/dist/services/web/snapshot-pruner.js +8 -3
- package/dist/services/web/web-daemon-service.js +1 -3
- package/dist/services/web/web-install-service.d.ts +3 -32
- package/dist/services/web/web-install-service.js +21 -100
- package/dist/services/web/web-install-types.d.ts +31 -0
- package/dist/services/web/web-install-types.js +13 -0
- package/dist/services/web/web-login-profile.js +7 -5
- package/dist/services/web/web-protocol.js +3 -1
- package/dist/services/workflow/pipeline-verify-gate-support.js +63 -17
- package/dist/services/workflow/pipeline-verify-service.js +17 -6
- package/dist/services/workflow/plan-reader.js +5 -1
- package/dist/services/workflow/plan-refresher.js +20 -6
- package/dist/services/workflow/plan-trigger-detector.js +31 -8
- package/dist/services/workflow/provision-dispatch-node.js +8 -3
- package/dist/services/workflow/workflow-autonomous-resume-helpers.d.ts +3 -1
- package/dist/services/workflow/workflow-autonomous-resume-helpers.js +35 -144
- package/dist/services/workflow/workflow-autonomous-resume-validation.d.ts +16 -0
- package/dist/services/workflow/workflow-autonomous-resume-validation.js +155 -0
- package/dist/services/workflow/workflow-autonomous-service.js +25 -13
- package/dist/services/workflow/workflow-graph-store-helpers.d.ts +51 -0
- package/dist/services/workflow/workflow-graph-store-helpers.js +111 -0
- package/dist/services/workflow/workflow-graph-store.d.ts +2 -35
- package/dist/services/workflow/workflow-graph-store.js +30 -107
- package/dist/services/workflow/workflow-graph-types.js +3 -3
- package/dist/services/workflow/workflow-inflight-probe.js +14 -7
- package/dist/services/workflow/workflow-loader.js +5 -1
- package/dist/services/workflow/workflow-node-lifecycle.js +22 -21
- package/dist/services/workflow/workflow-presence-lifecycle-types.d.ts +50 -0
- package/dist/services/workflow/workflow-presence-lifecycle-types.js +1 -0
- package/dist/services/workflow/workflow-presence-lifecycle.d.ts +2 -42
- package/dist/services/workflow/workflow-presence-lifecycle.js +19 -21
- package/dist/services/workflow/workflow-router-service.js +169 -27
- package/dist/services/workflow/workflow-skip-service.js +14 -4
- package/dist/services/workflow/workflow-spec-builders.d.ts +15 -0
- package/dist/services/workflow/workflow-spec-builders.js +121 -0
- package/dist/services/workflow/workflow-spec.d.ts +7 -6
- package/dist/services/workflow/workflow-spec.js +22 -116
- package/dist/services/workflow/workflow-state-store.js +2 -1
- package/dist/services/workspace/migrate-1-4-1-service.js +80 -14
- package/dist/services/workspace/migrate-service.js +66 -16
- package/dist/services/workspace/reconcile-migrate.js +6 -2
- package/dist/services/workspace/reconcile-service.js +37 -16
- package/dist/services/workspace/workspace-claude-settings-materializer.js +7 -5
- package/dist/services/workspace/workspace-clean-service.js +4 -1
- package/dist/services/workspace/workspace-service.js +11 -3
- package/dist/services/workspace/workspace-state-service.js +1 -1
- package/dist/services/worktree/git-worktree-parser.js +13 -3
- package/dist/services/worktree/host-worktree-reconciler.js +8 -4
- package/dist/services/worktree/long-path-cleanup.js +23 -6
- package/dist/services/worktree/worktree-gc-guard.js +3 -1
- package/dist/services/worktree/worktree-lease-types.d.ts +53 -0
- package/dist/services/worktree/worktree-lease-types.js +10 -0
- package/dist/services/worktree/worktree-lease.d.ts +2 -44
- package/dist/shared/array-guards.d.ts +30 -0
- package/dist/shared/array-guards.js +32 -0
- package/dist/shared/format-md-compact-internals.d.ts +26 -0
- package/dist/shared/format-md-compact-internals.js +125 -0
- package/dist/shared/format-md-compact.js +1 -117
- package/dist/shared/fs-utils.js +2 -1
- package/dist/shared/incrementing-number.js +3 -3
- package/dist/shared/json-parse.d.ts +71 -0
- package/dist/shared/json-parse.js +32 -0
- package/dist/shared/json-schema-mini.js +3 -1
- package/dist/shared/path-safety.js +3 -1
- package/dist/shared/path-utils.d.ts +20 -0
- package/dist/shared/path-utils.js +26 -0
- package/dist/shared/planner-response.js +3 -3
- package/dist/shared/stale-policy.js +1 -3
- package/dist/skills/peaks-maker/index.js +11 -11
- package/package.json +31 -8
- package/scripts/clean-dist.mjs +1 -2
- package/scripts/copy-templates.mjs +2 -4
- package/scripts/install-skills.mjs +305 -125
- package/scripts/sync-version.mjs +25 -8
- package/scripts/watch.mjs +8 -2
- package/skills/peaks-code/SKILL.md +1 -1
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The ONE writer of `lastRunAt` in this repo — rid `2026-10-01-cron-last-run-at-01`
|
|
3
|
+
* (backlog §2.24), repair cycle 1 (review F1/F4/F5). Lives in its own file because
|
|
4
|
+
* `cron-commands.ts` sits at 287 of its 300 raw-line cap and
|
|
5
|
+
* `cron-scheduler-commands.ts` is already over its own; the rule below is small
|
|
6
|
+
* enough to be read, tested and quoted from here.
|
|
7
|
+
*
|
|
8
|
+
* WHO CALLS THIS (3 call sites, one rule): the daemon tick
|
|
9
|
+
* (`cron-scheduler-commands.ts:369`), `cron-scheduler run-once` (:304), and
|
|
10
|
+
* `peaks cron run` (`cron-commands-actions.ts:175`). The third site is the repair:
|
|
11
|
+
* at `9badd1ac` `peaks cron run` folded its own snapshot and stamped EVERY record,
|
|
12
|
+
* killed ones included (`cron-commands-actions.ts:174` of that commit, no `killed`
|
|
13
|
+
* test), while this file skipped them. The same killed fire therefore stayed due
|
|
14
|
+
* under the daemon and went silent for a full `intervalMs` under `cron run` — the
|
|
15
|
+
* documented runbook / external-crontab path. There is now one fold, so there is one
|
|
16
|
+
* outcome per fire, whichever command ran it.
|
|
17
|
+
*
|
|
18
|
+
* WHY IT EXISTS (measured, not inferred). Before the slice the daemon tick (the
|
|
19
|
+
* `for (const task of due) { runTask(…); }` body at `9badd1ac`) discarded the
|
|
20
|
+
* `RunRecord`, and `listDueTasks` keeps an entry due whenever `lastRunAt` is
|
|
21
|
+
* null (`cron-commands-schedule.ts:212`, `if (e.lastRunAt === null) return true;`).
|
|
22
|
+
* Measured by `tests/unit/cli/commands/cron-last-run-at.test.ts`: **6 `runTask`
|
|
23
|
+
* invocations across 6 ticks** for one entry with `intervalMs` 86,400,000 at the
|
|
24
|
+
* 60,000 ms daemon period — a 1440× rate error against the declared interval, and the
|
|
25
|
+
* rate half of
|
|
26
|
+
* `.peaks/docs/diagnosis-2026-10-01-worktree-list-population.md` §9. The same
|
|
27
|
+
* test observes **1** once the write-back below runs.
|
|
28
|
+
*
|
|
29
|
+
* THE RULE (persist AFTER the run, from the record's `finishedAt`):
|
|
30
|
+
* 1. a run that reached a conclusion — exit code 0 or non-zero, not killed —
|
|
31
|
+
* advances `lastRunAt` to `record.finishedAt`, so the entry goes quiet for
|
|
32
|
+
* exactly its own `intervalMs` and not one ms longer;
|
|
33
|
+
* 2. a run carrying `killed: true` does NOT advance it, in EITHER entry point.
|
|
34
|
+
* Work cut off mid-flight is not a day's work, so the task stays due and is
|
|
35
|
+
* retried. What that costs is NOT uniform across platforms, and F3 of the
|
|
36
|
+
* review is the reason this paragraph is platform-shaped instead of global:
|
|
37
|
+
* - win32: the only fire shape that reaches `killed: true` here is the exec
|
|
38
|
+
* timeout (`cron-commands.ts:178-185`, spawnSync's `error.code ===
|
|
39
|
+
* 'ETIMEDOUT'` branch), and that fire BLOCKS its caller for the whole
|
|
40
|
+
* injected timeout — measured at 3,019 ms and 3,020 ms of block for an injected
|
|
41
|
+
* 3,000 ms timeout (`tests/unit/cli/commands/cron-exec-timeout.test.ts`, whose
|
|
42
|
+
* positive control brings the same wiring back in 67-71 ms when the child
|
|
43
|
+
* concludes), and the production value is `EXEC_TIMEOUT_MS = 300_000`
|
|
44
|
+
* (`cron-commands.ts:74`). The
|
|
45
|
+
* tick is a synchronous callback on one `setInterval`
|
|
46
|
+
* (`cron-scheduler-commands.ts:378`), so fires serialize and a permanently
|
|
47
|
+
* stuck entry costs at most 3,600,000 / 300,000 = **12 fires per hour**, not
|
|
48
|
+
* one per 60,000 ms tick. A child killed from OUTSIDE does not carry `killed`
|
|
49
|
+
* on this platform: the review measured a `taskkill /F`-terminated child
|
|
50
|
+
* returning `status 1` in 419 ms, and the same shape driven through `runTask`
|
|
51
|
+
* against `dist/` at repair time came back `exitCode 1` with NO `killed` key in
|
|
52
|
+
* 383 ms and 410 ms — which takes the CONCLUDED branch
|
|
53
|
+
* (`cron-commands.ts:193-199`) and is therefore STAMPED. Both writers now
|
|
54
|
+
* agree about that class (it is stamped by both), and neither pretends rule 2
|
|
55
|
+
* can see it on win32.
|
|
56
|
+
* - POSIX: an external signal death has no status and no timeout error, so it
|
|
57
|
+
* does hit `cron-commands.ts:200-206` and carry `killed: true`, and `runTask`
|
|
58
|
+
* returns as soon as the child dies. That class re-fires once per 60,000 ms
|
|
59
|
+
* tick — the deliberate price of not silencing unfinished work, and the shape
|
|
60
|
+
* this host cannot produce.
|
|
61
|
+
* Timestamping at `startedAt` was rejected (goal §alternatives): it would mark a
|
|
62
|
+
* killed run as done and silence it.
|
|
63
|
+
* 3. every entry the file holds survives the write. Parsed entries are re-written
|
|
64
|
+
* from a schedule that is RE-READ at write time, so a task an operator added
|
|
65
|
+
* while the daemon was busy is preserved field-for-field
|
|
66
|
+
* (`cron-last-run-at.test.ts`, "when an operator adds a task while the daemon is
|
|
67
|
+
* running one…"); and entries `toScheduleEntry`
|
|
68
|
+
* (`cron-commands-schedule.ts:129-150`) REJECTS — a hand-edited entry missing
|
|
69
|
+
* `name`, say — are carried through as the raw JSON they were written as,
|
|
70
|
+
* appended after the parsed ones. F5 of the review: before this they were
|
|
71
|
+
* silently DELETED by the daemon's first write, which is data loss on a
|
|
72
|
+
* long-lived process nobody is watching. An unparseable entry with the same `id`
|
|
73
|
+
* as a parsed one is the one thing still dropped, because two entries under one
|
|
74
|
+
* id would make the fold ambiguous.
|
|
75
|
+
*
|
|
76
|
+
* WINDOWS, NAMED (F4 + the lock that does not exist):
|
|
77
|
+
* - Inside this function the read→write sequence has no `await` and no yield point,
|
|
78
|
+
* so within one process the window is nil; it is cross-process only.
|
|
79
|
+
* - `peaks cron run` used to be the wide window: at `9badd1ac` it read the whole
|
|
80
|
+
* schedule (`cron-commands-actions.ts:143`), ran each target synchronously for up
|
|
81
|
+
* to `EXEC_TIMEOUT_MS` (300,000 ms) per task (:172), then rewrote the file from
|
|
82
|
+
* that PRE-RUN snapshot (:156) — which reverted any stamp the daemon had
|
|
83
|
+
* landed in between, back to `null`, i.e. permanently due, §2.24 re-opened until
|
|
84
|
+
* the next concluded run. It calls this function now, so its write is a write-time
|
|
85
|
+
* re-read like this one's; `cron-last-run-at.test.ts` ("…another writer stamps…")
|
|
86
|
+
* measures the revert case.
|
|
87
|
+
* - What is still open, stated rather than implied: there is NO lock on
|
|
88
|
+
* `schedule.json`, and `writeSchedule` is a plain `writeFileSync`
|
|
89
|
+
* (`cron-commands-schedule.ts:170-174`). Last-writer-wins on the VALUE across two
|
|
90
|
+
* processes that both land inside this function's own re-read→write tail remains,
|
|
91
|
+
* and a host failure mid-write still truncates the file. That needs the
|
|
92
|
+
* locking/atomic-write framework this slice deliberately does not take on.
|
|
93
|
+
* - One write per BATCH, not per record (F6, not fixed here): `runTask` throws for fs
|
|
94
|
+
* failure inside `appendHistory` (`cron-commands-schedule.ts:176-188` does a
|
|
95
|
+
* read+write of the whole history per record), so a throw at task k loses the
|
|
96
|
+
* stamps for tasks 1..k-1 and the tick's catch turns it into one stderr line; those
|
|
97
|
+
* already-concluded tasks are due again next tick. Reachability is documented at
|
|
98
|
+
* `skills/peaks-code/references/cron-scheduler-deployment.md:98-101` (a read-only
|
|
99
|
+
* `.peaks/cron`).
|
|
100
|
+
*/
|
|
101
|
+
import { type RunRecord } from './cron-commands-schedule.js';
|
|
102
|
+
/**
|
|
103
|
+
* Fold a batch of finished runs into `schedule.json`.
|
|
104
|
+
*
|
|
105
|
+
* `records` is what `runTask` returned for the tasks this batch ran; a record whose
|
|
106
|
+
* task id is no longer in the schedule (an operator removed the entry mid-flight) is
|
|
107
|
+
* dropped rather than resurrected. When nothing is left to change — every run
|
|
108
|
+
* killed, or the whole batch stale — the file is not rewritten.
|
|
109
|
+
*/
|
|
110
|
+
export declare function persistLastRunAt(projectRoot: string, records: ReadonlyArray<RunRecord>): void;
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The ONE writer of `lastRunAt` in this repo — rid `2026-10-01-cron-last-run-at-01`
|
|
3
|
+
* (backlog §2.24), repair cycle 1 (review F1/F4/F5). Lives in its own file because
|
|
4
|
+
* `cron-commands.ts` sits at 287 of its 300 raw-line cap and
|
|
5
|
+
* `cron-scheduler-commands.ts` is already over its own; the rule below is small
|
|
6
|
+
* enough to be read, tested and quoted from here.
|
|
7
|
+
*
|
|
8
|
+
* WHO CALLS THIS (3 call sites, one rule): the daemon tick
|
|
9
|
+
* (`cron-scheduler-commands.ts:369`), `cron-scheduler run-once` (:304), and
|
|
10
|
+
* `peaks cron run` (`cron-commands-actions.ts:175`). The third site is the repair:
|
|
11
|
+
* at `9badd1ac` `peaks cron run` folded its own snapshot and stamped EVERY record,
|
|
12
|
+
* killed ones included (`cron-commands-actions.ts:174` of that commit, no `killed`
|
|
13
|
+
* test), while this file skipped them. The same killed fire therefore stayed due
|
|
14
|
+
* under the daemon and went silent for a full `intervalMs` under `cron run` — the
|
|
15
|
+
* documented runbook / external-crontab path. There is now one fold, so there is one
|
|
16
|
+
* outcome per fire, whichever command ran it.
|
|
17
|
+
*
|
|
18
|
+
* WHY IT EXISTS (measured, not inferred). Before the slice the daemon tick (the
|
|
19
|
+
* `for (const task of due) { runTask(…); }` body at `9badd1ac`) discarded the
|
|
20
|
+
* `RunRecord`, and `listDueTasks` keeps an entry due whenever `lastRunAt` is
|
|
21
|
+
* null (`cron-commands-schedule.ts:212`, `if (e.lastRunAt === null) return true;`).
|
|
22
|
+
* Measured by `tests/unit/cli/commands/cron-last-run-at.test.ts`: **6 `runTask`
|
|
23
|
+
* invocations across 6 ticks** for one entry with `intervalMs` 86,400,000 at the
|
|
24
|
+
* 60,000 ms daemon period — a 1440× rate error against the declared interval, and the
|
|
25
|
+
* rate half of
|
|
26
|
+
* `.peaks/docs/diagnosis-2026-10-01-worktree-list-population.md` §9. The same
|
|
27
|
+
* test observes **1** once the write-back below runs.
|
|
28
|
+
*
|
|
29
|
+
* THE RULE (persist AFTER the run, from the record's `finishedAt`):
|
|
30
|
+
* 1. a run that reached a conclusion — exit code 0 or non-zero, not killed —
|
|
31
|
+
* advances `lastRunAt` to `record.finishedAt`, so the entry goes quiet for
|
|
32
|
+
* exactly its own `intervalMs` and not one ms longer;
|
|
33
|
+
* 2. a run carrying `killed: true` does NOT advance it, in EITHER entry point.
|
|
34
|
+
* Work cut off mid-flight is not a day's work, so the task stays due and is
|
|
35
|
+
* retried. What that costs is NOT uniform across platforms, and F3 of the
|
|
36
|
+
* review is the reason this paragraph is platform-shaped instead of global:
|
|
37
|
+
* - win32: the only fire shape that reaches `killed: true` here is the exec
|
|
38
|
+
* timeout (`cron-commands.ts:178-185`, spawnSync's `error.code ===
|
|
39
|
+
* 'ETIMEDOUT'` branch), and that fire BLOCKS its caller for the whole
|
|
40
|
+
* injected timeout — measured at 3,019 ms and 3,020 ms of block for an injected
|
|
41
|
+
* 3,000 ms timeout (`tests/unit/cli/commands/cron-exec-timeout.test.ts`, whose
|
|
42
|
+
* positive control brings the same wiring back in 67-71 ms when the child
|
|
43
|
+
* concludes), and the production value is `EXEC_TIMEOUT_MS = 300_000`
|
|
44
|
+
* (`cron-commands.ts:74`). The
|
|
45
|
+
* tick is a synchronous callback on one `setInterval`
|
|
46
|
+
* (`cron-scheduler-commands.ts:378`), so fires serialize and a permanently
|
|
47
|
+
* stuck entry costs at most 3,600,000 / 300,000 = **12 fires per hour**, not
|
|
48
|
+
* one per 60,000 ms tick. A child killed from OUTSIDE does not carry `killed`
|
|
49
|
+
* on this platform: the review measured a `taskkill /F`-terminated child
|
|
50
|
+
* returning `status 1` in 419 ms, and the same shape driven through `runTask`
|
|
51
|
+
* against `dist/` at repair time came back `exitCode 1` with NO `killed` key in
|
|
52
|
+
* 383 ms and 410 ms — which takes the CONCLUDED branch
|
|
53
|
+
* (`cron-commands.ts:193-199`) and is therefore STAMPED. Both writers now
|
|
54
|
+
* agree about that class (it is stamped by both), and neither pretends rule 2
|
|
55
|
+
* can see it on win32.
|
|
56
|
+
* - POSIX: an external signal death has no status and no timeout error, so it
|
|
57
|
+
* does hit `cron-commands.ts:200-206` and carry `killed: true`, and `runTask`
|
|
58
|
+
* returns as soon as the child dies. That class re-fires once per 60,000 ms
|
|
59
|
+
* tick — the deliberate price of not silencing unfinished work, and the shape
|
|
60
|
+
* this host cannot produce.
|
|
61
|
+
* Timestamping at `startedAt` was rejected (goal §alternatives): it would mark a
|
|
62
|
+
* killed run as done and silence it.
|
|
63
|
+
* 3. every entry the file holds survives the write. Parsed entries are re-written
|
|
64
|
+
* from a schedule that is RE-READ at write time, so a task an operator added
|
|
65
|
+
* while the daemon was busy is preserved field-for-field
|
|
66
|
+
* (`cron-last-run-at.test.ts`, "when an operator adds a task while the daemon is
|
|
67
|
+
* running one…"); and entries `toScheduleEntry`
|
|
68
|
+
* (`cron-commands-schedule.ts:129-150`) REJECTS — a hand-edited entry missing
|
|
69
|
+
* `name`, say — are carried through as the raw JSON they were written as,
|
|
70
|
+
* appended after the parsed ones. F5 of the review: before this they were
|
|
71
|
+
* silently DELETED by the daemon's first write, which is data loss on a
|
|
72
|
+
* long-lived process nobody is watching. An unparseable entry with the same `id`
|
|
73
|
+
* as a parsed one is the one thing still dropped, because two entries under one
|
|
74
|
+
* id would make the fold ambiguous.
|
|
75
|
+
*
|
|
76
|
+
* WINDOWS, NAMED (F4 + the lock that does not exist):
|
|
77
|
+
* - Inside this function the read→write sequence has no `await` and no yield point,
|
|
78
|
+
* so within one process the window is nil; it is cross-process only.
|
|
79
|
+
* - `peaks cron run` used to be the wide window: at `9badd1ac` it read the whole
|
|
80
|
+
* schedule (`cron-commands-actions.ts:143`), ran each target synchronously for up
|
|
81
|
+
* to `EXEC_TIMEOUT_MS` (300,000 ms) per task (:172), then rewrote the file from
|
|
82
|
+
* that PRE-RUN snapshot (:156) — which reverted any stamp the daemon had
|
|
83
|
+
* landed in between, back to `null`, i.e. permanently due, §2.24 re-opened until
|
|
84
|
+
* the next concluded run. It calls this function now, so its write is a write-time
|
|
85
|
+
* re-read like this one's; `cron-last-run-at.test.ts` ("…another writer stamps…")
|
|
86
|
+
* measures the revert case.
|
|
87
|
+
* - What is still open, stated rather than implied: there is NO lock on
|
|
88
|
+
* `schedule.json`, and `writeSchedule` is a plain `writeFileSync`
|
|
89
|
+
* (`cron-commands-schedule.ts:170-174`). Last-writer-wins on the VALUE across two
|
|
90
|
+
* processes that both land inside this function's own re-read→write tail remains,
|
|
91
|
+
* and a host failure mid-write still truncates the file. That needs the
|
|
92
|
+
* locking/atomic-write framework this slice deliberately does not take on.
|
|
93
|
+
* - One write per BATCH, not per record (F6, not fixed here): `runTask` throws for fs
|
|
94
|
+
* failure inside `appendHistory` (`cron-commands-schedule.ts:176-188` does a
|
|
95
|
+
* read+write of the whole history per record), so a throw at task k loses the
|
|
96
|
+
* stamps for tasks 1..k-1 and the tick's catch turns it into one stderr line; those
|
|
97
|
+
* already-concluded tasks are due again next tick. Reachability is documented at
|
|
98
|
+
* `skills/peaks-code/references/cron-scheduler-deployment.md:98-101` (a read-only
|
|
99
|
+
* `.peaks/cron`).
|
|
100
|
+
*/
|
|
101
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
102
|
+
import { readSchedule, schedulePath, SCHEDULE_VERSION, toScheduleEntry, writeSchedule } from './cron-commands-schedule.js';
|
|
103
|
+
/**
|
|
104
|
+
* Fold a batch of finished runs into `schedule.json`.
|
|
105
|
+
*
|
|
106
|
+
* `records` is what `runTask` returned for the tasks this batch ran; a record whose
|
|
107
|
+
* task id is no longer in the schedule (an operator removed the entry mid-flight) is
|
|
108
|
+
* dropped rather than resurrected. When nothing is left to change — every run
|
|
109
|
+
* killed, or the whole batch stale — the file is not rewritten.
|
|
110
|
+
*/
|
|
111
|
+
export function persistLastRunAt(projectRoot, records) {
|
|
112
|
+
const concludedAt = new Map();
|
|
113
|
+
for (const record of records) {
|
|
114
|
+
if (record.killed === true)
|
|
115
|
+
continue;
|
|
116
|
+
concludedAt.set(record.taskId, record.finishedAt);
|
|
117
|
+
}
|
|
118
|
+
if (concludedAt.size === 0)
|
|
119
|
+
return;
|
|
120
|
+
const current = readSchedule(projectRoot);
|
|
121
|
+
const entries = [];
|
|
122
|
+
let stamped = 0;
|
|
123
|
+
for (const entry of current.entries) {
|
|
124
|
+
const finishedAt = concludedAt.get(entry.id);
|
|
125
|
+
if (finishedAt === undefined) {
|
|
126
|
+
entries.push(entry);
|
|
127
|
+
continue;
|
|
128
|
+
}
|
|
129
|
+
entries.push({ ...entry, lastRunAt: finishedAt });
|
|
130
|
+
stamped += 1;
|
|
131
|
+
}
|
|
132
|
+
if (stamped === 0)
|
|
133
|
+
return;
|
|
134
|
+
writeSchedule(projectRoot, {
|
|
135
|
+
version: SCHEDULE_VERSION,
|
|
136
|
+
entries: [...entries, ...unrepresentedEntries(projectRoot, current.entries)]
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* The raw JSON of every entry on disk that `toScheduleEntry` refused, so this write
|
|
141
|
+
* preserves what it cannot represent (F5) instead of deleting it.
|
|
142
|
+
*
|
|
143
|
+
* Two reads of one file, deliberately: `readSchedule` above is the validating one
|
|
144
|
+
* (it owns the version check and the throw on malformed JSON), and this one is the
|
|
145
|
+
* byte-preserving one. They are not a snapshot of each other — a file clobbered
|
|
146
|
+
* between them throws here and the write does not happen, which is the safe answer
|
|
147
|
+
* for a schedule the reader can no longer parse.
|
|
148
|
+
*/
|
|
149
|
+
function unrepresentedEntries(projectRoot, parsed) {
|
|
150
|
+
const path = schedulePath(projectRoot);
|
|
151
|
+
if (!existsSync(path))
|
|
152
|
+
return [];
|
|
153
|
+
const raw = JSON.parse(readFileSync(path, 'utf8'));
|
|
154
|
+
// `Array.isArray` narrows `unknown` to `any[]`; this assertion is what makes the
|
|
155
|
+
// elements `unknown` again, so nothing below inherits an untyped value.
|
|
156
|
+
const listed = Array.isArray(raw.entries) ? raw.entries : [];
|
|
157
|
+
const ids = new Set(parsed.map((entry) => entry.id));
|
|
158
|
+
return listed.filter((entry) => typeof entry === 'object' &&
|
|
159
|
+
entry !== null &&
|
|
160
|
+
toScheduleEntry(entry) === null &&
|
|
161
|
+
!sharesIdWithAParsedEntry(entry, ids));
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* An unparseable entry that carries the `id` of a parseable one is the single case
|
|
165
|
+
* this write still drops: two entries under one id would make the fold above
|
|
166
|
+
* ambiguous about which one it just stamped.
|
|
167
|
+
*/
|
|
168
|
+
function sharesIdWithAParsedEntry(entry, ids) {
|
|
169
|
+
const id = entry.id;
|
|
170
|
+
return typeof id === 'string' && ids.has(id);
|
|
171
|
+
}
|
|
@@ -21,7 +21,13 @@ function parseSince(raw) {
|
|
|
21
21
|
if (!Number.isFinite(value) || value < 0)
|
|
22
22
|
return { ok: false, error: `--since must be a non-negative integer (got ${raw})` };
|
|
23
23
|
const unit = (match[2] ?? 'h').toLowerCase();
|
|
24
|
-
const multiplier = unit === 'd'
|
|
24
|
+
const multiplier = unit === 'd'
|
|
25
|
+
? MS_PER_DAY
|
|
26
|
+
: unit === 'h'
|
|
27
|
+
? MS_PER_HOUR
|
|
28
|
+
: unit === 'm'
|
|
29
|
+
? MS_PER_MINUTE
|
|
30
|
+
: MS_PER_SECOND;
|
|
25
31
|
return { ok: true, ms: Math.min(WINDOW_CAP_MS, value * multiplier) };
|
|
26
32
|
}
|
|
27
33
|
function readSlices(projectRoot, sessionId) {
|
|
@@ -34,7 +40,9 @@ function readSlices(projectRoot, sessionId) {
|
|
|
34
40
|
if (!existsSync(path))
|
|
35
41
|
return 0;
|
|
36
42
|
try {
|
|
37
|
-
return readFileSync(path, 'utf8')
|
|
43
|
+
return readFileSync(path, 'utf8')
|
|
44
|
+
.split('\n')
|
|
45
|
+
.filter((line) => line.trim().length > 0).length;
|
|
38
46
|
}
|
|
39
47
|
catch {
|
|
40
48
|
return 0;
|
|
@@ -55,7 +63,13 @@ function boundaryLabel(raw) {
|
|
|
55
63
|
return { key: 'valid', message: 'unparseable' };
|
|
56
64
|
const value = Number(match[1]);
|
|
57
65
|
const unit = (match[2] ?? 'h').toLowerCase();
|
|
58
|
-
const multiplier = unit === 'd'
|
|
66
|
+
const multiplier = unit === 'd'
|
|
67
|
+
? MS_PER_DAY
|
|
68
|
+
: unit === 'h'
|
|
69
|
+
? MS_PER_HOUR
|
|
70
|
+
: unit === 'm'
|
|
71
|
+
? MS_PER_MINUTE
|
|
72
|
+
: MS_PER_SECOND;
|
|
59
73
|
if (value * multiplier > WINDOW_CAP_MS) {
|
|
60
74
|
return { key: 'cap', message: 'since>24h is capped to the 24h window' };
|
|
61
75
|
}
|
|
@@ -79,14 +93,19 @@ export function registerDashboardLongRunCommand(dashboard, io) {
|
|
|
79
93
|
process.exitCode = 1;
|
|
80
94
|
return;
|
|
81
95
|
}
|
|
82
|
-
const sid = options.sessionId ??
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
96
|
+
const sid = options.sessionId ??
|
|
97
|
+
(await (async () => {
|
|
98
|
+
const { getSessionIdCanonical } = await import('../../services/session/session-manager.js');
|
|
99
|
+
return getSessionIdCanonical(projectRoot);
|
|
100
|
+
})());
|
|
86
101
|
if (!sid) {
|
|
87
|
-
io.stdout(
|
|
88
|
-
? JSON.stringify({
|
|
89
|
-
|
|
102
|
+
io.stdout(options.json === true
|
|
103
|
+
? JSON.stringify({
|
|
104
|
+
ok: false,
|
|
105
|
+
code: 'NO_ACTIVE_SESSION',
|
|
106
|
+
message: 'no --session-id and no canonical binding'
|
|
107
|
+
})
|
|
108
|
+
: 'NO_ACTIVE_SESSION: no --session-id and no canonical binding\n');
|
|
90
109
|
process.exitCode = 1;
|
|
91
110
|
return;
|
|
92
111
|
}
|
|
@@ -96,7 +115,9 @@ export function registerDashboardLongRunCommand(dashboard, io) {
|
|
|
96
115
|
const sliceCount = readSlices(projectRoot, sid);
|
|
97
116
|
const checkpointAgeMs = readLastCheckpointAgeMs(snapshot);
|
|
98
117
|
const checkpointFrequency = snapshot.checkpoints > 0 && snapshot.enteredAt
|
|
99
|
-
? Math.max(1, Math.round((Date.now() - Date.parse(snapshot.enteredAt)) /
|
|
118
|
+
? Math.max(1, Math.round((Date.now() - Date.parse(snapshot.enteredAt)) /
|
|
119
|
+
snapshot.checkpoints /
|
|
120
|
+
MS_PER_MINUTE))
|
|
100
121
|
: null;
|
|
101
122
|
const indicators = {
|
|
102
123
|
dispatchCount: sliceCount,
|
|
@@ -113,16 +134,26 @@ export function registerDashboardLongRunCommand(dashboard, io) {
|
|
|
113
134
|
sinceMs: parsed.ms,
|
|
114
135
|
sinceCapped: parsed.ms === WINDOW_CAP_MS && boundary.key === 'cap',
|
|
115
136
|
boundary: boundary.key,
|
|
116
|
-
snapshot: {
|
|
137
|
+
snapshot: {
|
|
138
|
+
state: snapshot.state,
|
|
139
|
+
enteredAt: snapshot.enteredAt,
|
|
140
|
+
lastCheckpointAt: snapshot.lastCheckpointAt
|
|
141
|
+
},
|
|
117
142
|
indicators,
|
|
118
143
|
checkpointAgeMs
|
|
119
144
|
}
|
|
120
145
|
};
|
|
121
|
-
io.stdout((options.json === true
|
|
146
|
+
io.stdout((options.json === true
|
|
147
|
+
? JSON.stringify(payload)
|
|
148
|
+
: JSON.stringify(payload.data, null, 2)) + '\n');
|
|
122
149
|
}
|
|
123
150
|
catch (error) {
|
|
124
151
|
io.stdout((options.json === true
|
|
125
|
-
? JSON.stringify({
|
|
152
|
+
? JSON.stringify({
|
|
153
|
+
ok: false,
|
|
154
|
+
code: 'LONG_RUN_READ_FAILED',
|
|
155
|
+
message: getErrorMessage(error)
|
|
156
|
+
})
|
|
126
157
|
: `LONG_RUN_READ_FAILED: ${getErrorMessage(error)}\n`) + '\n');
|
|
127
158
|
process.exitCode = 1;
|
|
128
159
|
}
|
|
@@ -28,9 +28,13 @@ export function registerDashboardSummaryCommand(dashboard, io) {
|
|
|
28
28
|
sid = await getSessionIdCanonical(projectRoot);
|
|
29
29
|
}
|
|
30
30
|
if (!sid) {
|
|
31
|
-
io.stdout(
|
|
32
|
-
? JSON.stringify({
|
|
33
|
-
|
|
31
|
+
io.stdout(options.json === true
|
|
32
|
+
? JSON.stringify({
|
|
33
|
+
ok: false,
|
|
34
|
+
code: 'NO_ACTIVE_SESSION',
|
|
35
|
+
message: 'no --session-id and no canonical binding'
|
|
36
|
+
})
|
|
37
|
+
: 'NO_ACTIVE_SESSION: no --session-id and no canonical binding\n');
|
|
34
38
|
process.exitCode = 1;
|
|
35
39
|
return;
|
|
36
40
|
}
|
|
@@ -46,11 +50,17 @@ export function registerDashboardSummaryCommand(dashboard, io) {
|
|
|
46
50
|
metrics
|
|
47
51
|
}
|
|
48
52
|
};
|
|
49
|
-
io.stdout((options.json === true
|
|
53
|
+
io.stdout((options.json === true
|
|
54
|
+
? JSON.stringify(payload)
|
|
55
|
+
: JSON.stringify(payload.data, null, 2)) + '\n');
|
|
50
56
|
}
|
|
51
57
|
catch (error) {
|
|
52
58
|
io.stdout((options.json === true
|
|
53
|
-
? JSON.stringify({
|
|
59
|
+
? JSON.stringify({
|
|
60
|
+
ok: false,
|
|
61
|
+
code: 'SUMMARY_READ_FAILED',
|
|
62
|
+
message: getErrorMessage(error)
|
|
63
|
+
})
|
|
54
64
|
: `SUMMARY_READ_FAILED: ${getErrorMessage(error)}\n`) + '\n');
|
|
55
65
|
process.exitCode = 1;
|
|
56
66
|
}
|
|
@@ -42,7 +42,7 @@ import { buildDispatchSystemPrompt } from '../../services/context/build-dispatch
|
|
|
42
42
|
import { readSessionCapsule } from '../../services/dispatch/session-capsule.js';
|
|
43
43
|
import { computeUiLibraryDispatchBlock } from '../../services/standards/ui-library-dispatch-block.js';
|
|
44
44
|
import { readFreshContextBlock } from '../../services/fresh-context/fresh-context-block.js';
|
|
45
|
-
import { createDispatchProvenanceToken, DISPATCH_PROVENANCE_ENV, writeDispatchProvenance
|
|
45
|
+
import { createDispatchProvenanceToken, DISPATCH_PROVENANCE_ENV, writeDispatchProvenance } from '../../services/worktree/dispatch-provenance.js';
|
|
46
46
|
import { spawnWorktreeLease, spawnContainerLease } from '../../services/dispatch/isolation-lease.js';
|
|
47
47
|
import { runGitLsFiles } from '../../services/dispatch/dispatch-sub-agent.js';
|
|
48
48
|
export function registerDispatchCommand(parent, io) {
|
|
@@ -123,9 +123,11 @@ export function registerDispatchCommand(parent, io) {
|
|
|
123
123
|
project: projectRoot,
|
|
124
124
|
json: asJson,
|
|
125
125
|
...(options.noThrottle === true ? { noThrottle: true } : {}),
|
|
126
|
-
...(typeof maxConcurrent === 'number' &&
|
|
126
|
+
...(typeof maxConcurrent === 'number' &&
|
|
127
|
+
Number.isInteger(maxConcurrent) &&
|
|
128
|
+
maxConcurrent > 0
|
|
127
129
|
? { maxConcurrent }
|
|
128
|
-
: {})
|
|
130
|
+
: {})
|
|
129
131
|
});
|
|
130
132
|
// The handler's `ok` is the launch outcome (a vendor CLI that is not
|
|
131
133
|
// installed is a failure, not a footnote) — the caller must not
|
|
@@ -177,7 +179,12 @@ export function registerDispatchCommand(parent, io) {
|
|
|
177
179
|
// so `peaks sub-agent dispatch agent --help` continues to
|
|
178
180
|
// exit 0 with the help text — that is intentional, not a bug.
|
|
179
181
|
if (role === 'agent') {
|
|
180
|
-
printResult(io, fail('sub-agent.dispatch', 'ROLE_REMOVED', 'The agent role was removed in Slice 3', {
|
|
182
|
+
printResult(io, fail('sub-agent.dispatch', 'ROLE_REMOVED', 'The agent role was removed in Slice 3', {
|
|
183
|
+
role,
|
|
184
|
+
reason: 'role-removed-in-slice-3',
|
|
185
|
+
toolCall: null,
|
|
186
|
+
dispatchRecordPath: null
|
|
187
|
+
}, []), asJson);
|
|
181
188
|
process.exitCode = 1;
|
|
182
189
|
return;
|
|
183
190
|
}
|
|
@@ -234,10 +241,10 @@ export function registerDispatchCommand(parent, io) {
|
|
|
234
241
|
// of the `unknown-sid` fallback. The unknown-sid branch is preserved
|
|
235
242
|
// as the last-resort so callers without a bound session (e.g. an
|
|
236
243
|
// ad-hoc dispatch in a fresh tree) still get a deterministic path.
|
|
237
|
-
const sid = options.sessionId
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
244
|
+
const sid = options.sessionId ??
|
|
245
|
+
process.env.PEAKS_SESSION_ID ??
|
|
246
|
+
getCurrentSessionId(projectRoot) ??
|
|
247
|
+
'unknown-sid';
|
|
241
248
|
const rid = options.requestId ?? 'unknown-rid';
|
|
242
249
|
const batchId = options.batchId ?? randomUUID();
|
|
243
250
|
// Slice 2026-07-29-worktree-l2-extended Part 2.C: --isolation worktree
|
|
@@ -251,12 +258,16 @@ export function registerDispatchCommand(parent, io) {
|
|
|
251
258
|
let worktreePath = null;
|
|
252
259
|
let worktreeBranch = null;
|
|
253
260
|
if (typeof options.isolation === 'string' && options.isolation.length > 0) {
|
|
254
|
-
if (options.isolation !== 'worktree' &&
|
|
261
|
+
if (options.isolation !== 'worktree' &&
|
|
262
|
+
options.isolation !== 'container' &&
|
|
263
|
+
options.isolation !== 'vm') {
|
|
255
264
|
printResult(io, fail('sub-agent.dispatch', 'INVALID_ISOLATION', `--isolation only accepts "worktree" | "container" | "vm" (got "${options.isolation}")`, {
|
|
256
265
|
role,
|
|
257
266
|
toolCall: null,
|
|
258
267
|
dispatchRecordPath: null
|
|
259
|
-
}, [
|
|
268
|
+
}, [
|
|
269
|
+
'Drop --isolation or pass --isolation worktree / --isolation container / --isolation vm.'
|
|
270
|
+
]), asJson);
|
|
260
271
|
process.exitCode = 1;
|
|
261
272
|
return;
|
|
262
273
|
}
|
|
@@ -367,7 +378,8 @@ export function registerDispatchCommand(parent, io) {
|
|
|
367
378
|
try {
|
|
368
379
|
projectPrefs = loadPreferences(projectRoot);
|
|
369
380
|
}
|
|
370
|
-
catch {
|
|
381
|
+
catch {
|
|
382
|
+
// TODO(g2): legacy silent catch — grace: 1 minor release (v2.14.0)
|
|
371
383
|
// Keep default preferences.
|
|
372
384
|
}
|
|
373
385
|
const ide = detectInstalledIde(projectRoot) ?? 'claude-code';
|
|
@@ -479,7 +491,9 @@ export function registerDispatchCommand(parent, io) {
|
|
|
479
491
|
...(freshContextBlock !== undefined ? { freshContextBlock } : {}),
|
|
480
492
|
// §4: advisory session capsule pointer + precedence line.
|
|
481
493
|
...(capsuleRef !== null
|
|
482
|
-
? {
|
|
494
|
+
? {
|
|
495
|
+
capsule: { batchId: capsuleRef.batchId, key: capsuleRef.key, bytes: capsuleRef.bytes }
|
|
496
|
+
}
|
|
483
497
|
: {})
|
|
484
498
|
});
|
|
485
499
|
// Part 2.C: when --isolation worktree, prepend an isolation envelope
|
|
@@ -493,7 +507,15 @@ export function registerDispatchCommand(parent, io) {
|
|
|
493
507
|
`leaseId: ${leaseId}\n` +
|
|
494
508
|
`worktreePath: ${worktreePath}\n` +
|
|
495
509
|
`branch: ${worktreeBranch}\n` +
|
|
496
|
-
`You MAY ` +
|
|
510
|
+
`You MAY ` +
|
|
511
|
+
'`git worktree add` ' +
|
|
512
|
+
`and ` +
|
|
513
|
+
'`git worktree remove` ' +
|
|
514
|
+
`against this lease without a separate ` +
|
|
515
|
+
'`peaks worktree auth grant` ' +
|
|
516
|
+
`— the PreToolUse gate reads the lease file. Run ` +
|
|
517
|
+
'`peaks worktree release --lease-id ${leaseId}` ' +
|
|
518
|
+
`when done.\n`
|
|
497
519
|
: '';
|
|
498
520
|
// F5 follow-up: anti-fake-green gate. When `--must-ls-files <glob>`
|
|
499
521
|
// is supplied, run `git ls-files <glob>` upfront, surface the
|
|
@@ -511,13 +533,14 @@ export function registerDispatchCommand(parent, io) {
|
|
|
511
533
|
const files = runGitLsFiles(projectRoot, glob);
|
|
512
534
|
const exists = files.length > 0;
|
|
513
535
|
mustLsFilesVerification = { path: glob, exists, files };
|
|
514
|
-
mustLsFilesBlock =
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
536
|
+
mustLsFilesBlock =
|
|
537
|
+
`\n## must_ls_files enforcement (F5 anti-fake-green)\n` +
|
|
538
|
+
`glob: ${glob}\n` +
|
|
539
|
+
`verification: ${exists ? `EXISTS (${files.length} file${files.length === 1 ? '' : 's'} found)` : 'MISSING (no files matched the glob)'}\n` +
|
|
540
|
+
(exists ? `first match: ${files[0] ?? ''}\n` : '') +
|
|
541
|
+
`BEFORE any claim that work is "completed" or "PASS", you MUST run \`git ls-files ${glob}\` from the project root and ` +
|
|
542
|
+
`confirm the file exists. Anti-fake-green rule (sediment 2026-08-11-rid-001-redo-fake-green-recovery-closure §Lesson 1): ` +
|
|
543
|
+
`if the file does not exist, your verdict MUST be \`status: "blocked"\` with reason "must_ls_files_failed". Do NOT silently skip this step.\n`;
|
|
521
544
|
}
|
|
522
545
|
const effectivePrompt = `${memoryAugmentedBody}${isolationBlock}${mustLsFilesBlock}`;
|
|
523
546
|
// Slice F2 (rid-f2-ac1-wiring): deprecated reviewer slots are accepted
|
|
@@ -525,7 +548,12 @@ export function registerDispatchCommand(parent, io) {
|
|
|
525
548
|
const warnings = [...decision.warnings, ...deprecatedReviewerWarnings(role)];
|
|
526
549
|
let toolCall;
|
|
527
550
|
try {
|
|
528
|
-
toolCall = adapter.subAgentDispatcher.buildToolCall({
|
|
551
|
+
toolCall = adapter.subAgentDispatcher.buildToolCall({
|
|
552
|
+
role,
|
|
553
|
+
prompt: effectivePrompt,
|
|
554
|
+
requestId: rid,
|
|
555
|
+
sessionId: sid
|
|
556
|
+
});
|
|
529
557
|
// Part 2.C: stamp the toolCall with `isolation` + a sub-agent
|
|
530
558
|
// env block so adapters that surface it (Claude Code's Task
|
|
531
559
|
// tool) propagate the lease id to the spawned process. The
|
|
@@ -536,7 +564,7 @@ export function registerDispatchCommand(parent, io) {
|
|
|
536
564
|
const provenanceToken = createDispatchProvenanceToken({
|
|
537
565
|
sessionId: sid,
|
|
538
566
|
requestId: rid,
|
|
539
|
-
leaseId
|
|
567
|
+
leaseId
|
|
540
568
|
});
|
|
541
569
|
if (isolationMode === 'worktree') {
|
|
542
570
|
writeDispatchProvenance({
|
|
@@ -548,8 +576,8 @@ export function registerDispatchCommand(parent, io) {
|
|
|
548
576
|
requestId: rid,
|
|
549
577
|
leaseId,
|
|
550
578
|
isolation: 'worktree',
|
|
551
|
-
issuedAt: new Date().toISOString()
|
|
552
|
-
}
|
|
579
|
+
issuedAt: new Date().toISOString()
|
|
580
|
+
}
|
|
553
581
|
});
|
|
554
582
|
}
|
|
555
583
|
// Slice 2026-08-01-subagent-merge-and-e2e (Task 8): stamp the
|
|
@@ -562,7 +590,7 @@ export function registerDispatchCommand(parent, io) {
|
|
|
562
590
|
const profile = playwrightProfilePaths({
|
|
563
591
|
projectRoot,
|
|
564
592
|
sessionId: sid,
|
|
565
|
-
dispatchId: rid
|
|
593
|
+
dispatchId: rid
|
|
566
594
|
});
|
|
567
595
|
toolCall = {
|
|
568
596
|
...toolCall,
|
|
@@ -574,7 +602,9 @@ export function registerDispatchCommand(parent, io) {
|
|
|
574
602
|
PEAKS_WORKTREE_LEASE_ID: leaseId,
|
|
575
603
|
PEAKS_PLAYWRIGHT_USER_DATA_DIR: profile.userDataDir,
|
|
576
604
|
PEAKS_PLAYWRIGHT_PROFILE_NAME: profile.profileName,
|
|
577
|
-
...(isolationMode === 'worktree'
|
|
605
|
+
...(isolationMode === 'worktree'
|
|
606
|
+
? { [DISPATCH_PROVENANCE_ENV]: provenanceToken }
|
|
607
|
+
: {})
|
|
578
608
|
}
|
|
579
609
|
}
|
|
580
610
|
};
|
|
@@ -588,7 +618,9 @@ export function registerDispatchCommand(parent, io) {
|
|
|
588
618
|
// roles like 'qa-business' would otherwise drop the event
|
|
589
619
|
// through schema rejection).
|
|
590
620
|
const KNOWN_ROLES = new Set(OBSERVABILITY_SUBAGENT_ROLES);
|
|
591
|
-
const knownRole = KNOWN_ROLES.has(role)
|
|
621
|
+
const knownRole = KNOWN_ROLES.has(role)
|
|
622
|
+
? role
|
|
623
|
+
: null;
|
|
592
624
|
emitObservabilityEvent({
|
|
593
625
|
schemaVersion: 1,
|
|
594
626
|
ts: new Date().toISOString(),
|
|
@@ -604,9 +636,7 @@ export function registerDispatchCommand(parent, io) {
|
|
|
604
636
|
}
|
|
605
637
|
catch (error) {
|
|
606
638
|
if (error instanceof SubAgentNotSupportedError) {
|
|
607
|
-
printResult(io, fail('sub-agent.dispatch', 'IDE_NOT_SUPPORTED', error.message, { role, toolCall: null, dispatchRecordPath: null }, [
|
|
608
|
-
'Switch IDE or pick a role the current IDE supports.'
|
|
609
|
-
]), asJson);
|
|
639
|
+
printResult(io, fail('sub-agent.dispatch', 'IDE_NOT_SUPPORTED', error.message, { role, toolCall: null, dispatchRecordPath: null }, ['Switch IDE or pick a role the current IDE supports.']), asJson);
|
|
610
640
|
process.exitCode = 1;
|
|
611
641
|
return;
|
|
612
642
|
}
|
|
@@ -697,7 +727,9 @@ export function registerDispatchCommand(parent, io) {
|
|
|
697
727
|
});
|
|
698
728
|
const nextActions = [
|
|
699
729
|
'Tool call is dry-run; LLM must execute the tool to actually dispatch the sub-agent.',
|
|
700
|
-
'After dispatching, the sub-agent should call `peaks sub-agent heartbeat --record ' +
|
|
730
|
+
'After dispatching, the sub-agent should call `peaks sub-agent heartbeat --record ' +
|
|
731
|
+
dispatchRecordPath +
|
|
732
|
+
'` periodically.'
|
|
701
733
|
];
|
|
702
734
|
if (counter.warning) {
|
|
703
735
|
nextActions.push(`Batch is over the RL-1 limit (${BATCH_LIMIT}); consider splitting into multiple batches.`);
|
|
@@ -771,7 +803,8 @@ export function registerDispatchCommand(parent, io) {
|
|
|
771
803
|
}
|
|
772
804
|
});
|
|
773
805
|
}
|
|
774
|
-
catch {
|
|
806
|
+
catch {
|
|
807
|
+
// TODO(g2): legacy silent catch — grace: 1 minor release (v2.14.0)
|
|
775
808
|
/* best-effort */
|
|
776
809
|
}
|
|
777
810
|
}
|