tumwater 0.2.0 → 0.4.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/README.md +27 -13
- package/dist/build-info.json +2 -2
- package/dist/src/agent/agent-args.js +8 -9
- package/dist/src/agent/agent-backend.js +8 -6
- package/dist/src/agent/backend-traits.js +55 -25
- package/dist/src/agent/claude/claude-account.js +71 -204
- package/dist/src/agent/claude/claude-args.js +9 -6
- package/dist/src/agent/claude/claude-backend.js +10 -10
- package/dist/src/agent/claude/claude-env.js +1 -1
- package/dist/src/agent/claude/claude-stream.js +6 -4
- package/dist/src/agent/claude/claude-write-guard.js +49 -0
- package/dist/src/agent/claude/write-guard-hook.js +13 -0
- package/dist/src/agent/codex/codex-account.js +119 -0
- package/dist/src/agent/codex/codex-args.js +181 -0
- package/dist/src/agent/codex/codex-backend.js +279 -0
- package/dist/src/agent/codex/codex-catalog.js +97 -0
- package/dist/src/agent/codex/codex-env.js +18 -0
- package/dist/src/agent/codex/codex-hook-trust.js +246 -0
- package/dist/src/agent/codex/codex-patch-paths.js +36 -0
- package/dist/src/agent/codex/codex-rollout.js +179 -0
- package/dist/src/agent/codex/codex-stream.js +404 -0
- package/dist/src/agent/codex/codex-write-guard.js +86 -0
- package/dist/src/agent/codex/write-guard-hook.js +12 -0
- package/dist/src/agent/image-input.js +29 -24
- package/dist/src/agent/notes-shim.js +11 -12
- package/dist/src/agent/opencode/opencode-args.js +0 -1
- package/dist/src/agent/opencode/opencode-backend.js +12 -9
- package/dist/src/agent/opencode/opencode-catalog.js +55 -29
- package/dist/src/agent/opencode/opencode-config.js +19 -14
- package/dist/src/agent/opencode/opencode-env.js +0 -1
- package/dist/src/agent/opencode/opencode-session-id.js +1 -2
- package/dist/src/agent/opencode/opencode-stream.js +1 -1
- package/dist/src/agent/opencode/write-guard-plugin/index.js +48 -0
- package/dist/src/agent/role-notes-write.js +5 -6
- package/dist/src/agent/run-agent.js +465 -448
- package/dist/src/agent/run-settle.js +214 -0
- package/dist/src/agent/session-ledger.js +86 -16
- package/dist/src/agent/subscription-account.js +220 -0
- package/dist/src/agent/write-guard.js +148 -0
- package/dist/src/backlog/backlog-archive.js +281 -55
- package/dist/src/backlog/backlog-cli-view.js +255 -0
- package/dist/src/backlog/backlog-cli.js +91 -335
- package/dist/src/backlog/backlog-commit.js +20 -13
- package/dist/src/backlog/backlog-eligibility.js +193 -242
- package/dist/src/backlog/backlog-index.js +149 -0
- package/dist/src/backlog/backlog-md.js +54 -6
- package/dist/src/backlog/backlog-parts.js +264 -0
- package/dist/src/backlog/backlog-release.js +134 -0
- package/dist/src/backlog/backlog-render.js +27 -0
- package/dist/src/backlog/backlog-structure.js +99 -156
- package/dist/src/backlog/backlog-write.js +40 -127
- package/dist/src/backlog/backlog.js +21 -6
- package/dist/src/backlog/question-answer.js +21 -15
- package/dist/src/baseline/main-baseline.js +89 -20
- package/dist/src/baseline/main-guardrails.js +136 -0
- package/dist/src/baseline/main-red.js +153 -36
- package/dist/src/baseline/main-watch.js +232 -0
- package/dist/src/brief/brief-edit.js +12 -12
- package/dist/src/brief/brief.js +31 -51
- package/dist/src/budget/budget-fallback-view.js +288 -0
- package/dist/src/budget/budget-wiring.js +158 -0
- package/dist/src/budget/budget.js +31 -20
- package/dist/src/budget/fallback-breaker.js +26 -27
- package/dist/src/build/build-check-detect.js +23 -15
- package/dist/src/build/build-check-events.js +25 -6
- package/dist/src/build/build-check-report.js +49 -9
- package/dist/src/build/build-check-scoped.js +18 -11
- package/dist/src/build/build-check.js +2 -1
- package/dist/src/build/build-info.js +2 -3
- package/dist/src/build/build-stage.js +9 -14
- package/dist/src/build/dep-install.js +65 -3
- package/dist/src/change/change-data.js +123 -31
- package/dist/src/change/change-render.js +46 -5
- package/dist/src/cli/brief-command.js +3 -4
- package/dist/src/cli/cli-args.js +181 -33
- package/dist/src/cli/cli-command-args.js +46 -18
- package/dist/src/cli/cli-editor.js +2 -1
- package/dist/src/cli/cli-flag-specs.js +183 -45
- package/dist/src/cli/cli-init.js +51 -0
- package/dist/src/cli/cli-marker-commands.js +4 -4
- package/dist/src/cli/cli-query-commands.js +291 -598
- package/dist/src/cli/cli-repo-gate.js +11 -1
- package/dist/src/cli/cli-review-commands.js +113 -0
- package/dist/src/cli/cli-role-command.js +525 -0
- package/dist/src/cli/cli-start-summary.js +167 -0
- package/dist/src/cli/{cli-run.js → cli-start.js} +193 -237
- package/dist/src/cli/completion.js +169 -22
- package/dist/src/cli/config-commands.js +58 -26
- package/dist/src/cli/follow-view.js +75 -0
- package/dist/src/cli/help.js +258 -82
- package/dist/src/cli/log-commands.js +164 -85
- package/dist/src/cli/question-commands.js +211 -10
- package/dist/src/cli.js +173 -45
- package/dist/src/collections.js +56 -13
- package/dist/src/concurrency/check-permit.js +20 -3
- package/dist/src/concurrency/lock.js +17 -13
- package/dist/src/concurrency/provider-lease.js +44 -8
- package/dist/src/concurrency/semaphore.js +102 -26
- package/dist/src/config/config-aliases.js +0 -1
- package/dist/src/config/config-editable-keys.js +16 -1
- package/dist/src/config/config-fallbacks.js +94 -56
- package/dist/src/config/config-field-checks.js +40 -10
- package/dist/src/config/config-keys.js +30 -8
- package/dist/src/config/config-live.js +63 -24
- package/dist/src/config/config-request.js +137 -0
- package/dist/src/config/config-schema.js +31 -24
- package/dist/src/config/config-selector-checks.js +123 -0
- package/dist/src/config/config-validation-agents.js +80 -0
- package/dist/src/config/config-validation-model.js +116 -0
- package/dist/src/config/config-validation.js +169 -222
- package/dist/src/config/config-views.js +136 -54
- package/dist/src/config/config-write-core.js +135 -0
- package/dist/src/config/config-write.js +164 -265
- package/dist/src/config/config.js +53 -38
- package/dist/src/config/model-selector.js +34 -34
- package/dist/src/doctor/doctor-backlog-bugs.js +330 -0
- package/dist/src/doctor/doctor-backlog-plans.js +398 -0
- package/dist/src/doctor/doctor-backlog.js +249 -512
- package/dist/src/doctor/doctor-check-names.js +85 -0
- package/dist/src/doctor/doctor-checks.js +61 -593
- package/dist/src/doctor/doctor-claude-checks.js +142 -0
- package/dist/src/doctor/doctor-codex-checks.js +276 -0
- package/dist/src/doctor/doctor-contention-checks.js +506 -0
- package/dist/src/doctor/doctor-fallback-checks.js +130 -0
- package/dist/src/doctor/doctor-holds.js +80 -66
- package/dist/src/doctor/doctor-install.js +2 -1
- package/dist/src/doctor/doctor-model-checks.js +216 -537
- package/dist/src/doctor/doctor-notify.js +9 -5
- package/dist/src/doctor/doctor-opencode-checks.js +164 -0
- package/dist/src/doctor/doctor-orphans.js +182 -63
- package/dist/src/doctor/doctor-pi-checks.js +62 -0
- package/dist/src/doctor/doctor-project-checks.js +397 -0
- package/dist/src/doctor/doctor.js +126 -77
- package/dist/src/doctor/image-probe.js +21 -8
- package/dist/src/doctor/outcome.js +3 -2
- package/dist/src/doctor/probe.js +21 -12
- package/dist/src/events/event-format.js +185 -89
- package/dist/src/events/event-labels.js +11 -5
- package/dist/src/events/event-legacy.js +39 -15
- package/dist/src/events/event-read.js +52 -39
- package/dist/src/events/event-tally.js +16 -0
- package/dist/src/events/event-window.js +80 -26
- package/dist/src/events/events.js +30 -13
- package/dist/src/events/notify.js +7 -7
- package/dist/src/failure/failure-cluster.js +12 -12
- package/dist/src/failure/failure-data.js +65 -60
- package/dist/src/failure/failure-render.js +29 -21
- package/dist/src/failure/failure-state-change.js +17 -12
- package/dist/src/failure/time-spend.js +35 -35
- package/dist/src/files/file-queue.js +17 -0
- package/dist/src/files/files.js +111 -35
- package/dist/src/files/json-files.js +3 -3
- package/dist/src/files/json-object.js +28 -7
- package/dist/src/files/stat-cache.js +2 -2
- package/dist/src/files/tail.js +1 -1
- package/dist/src/gates/bootstrap-gates.js +4 -5
- package/dist/src/gates/budget-gates.js +88 -225
- package/dist/src/gates/disk-gate.js +1 -1
- package/dist/src/gates/gate-polls.js +101 -143
- package/dist/src/gates/maintenance-quota.js +37 -30
- package/dist/src/gates/pause-gates.js +28 -10
- package/dist/src/gates/readiness.js +7 -3
- package/dist/src/gates/role-cap-gates.js +8 -8
- package/dist/src/gates/startup-gate.js +94 -32
- package/dist/src/gates/streak-gate.js +54 -30
- package/dist/src/git/commit-message.js +89 -46
- package/dist/src/git/git-diff.js +16 -10
- package/dist/src/git/git-run.js +79 -38
- package/dist/src/git/git.js +54 -34
- package/dist/src/git/slot-salvage.js +253 -0
- package/dist/src/git/slots-state.js +6 -6
- package/dist/src/git/worktree-pool.js +132 -38
- package/dist/src/git/worktree-use.js +4 -11
- package/dist/src/git/worktree.js +94 -37
- package/dist/src/gui/gui-admin-endpoints.js +96 -0
- package/dist/src/gui/gui-args.js +79 -8
- package/dist/src/gui/gui-backlog-commands.js +43 -19
- package/dist/src/gui/gui-backlog-endpoints.js +156 -0
- package/dist/src/gui/gui-command.js +26 -13
- package/dist/src/gui/gui-config-commands.js +168 -80
- package/dist/src/gui/gui-endpoint-commands.js +5 -4
- package/dist/src/gui/gui-endpoint-common.js +4 -4
- package/dist/src/gui/gui-endpoints.js +11 -380
- package/dist/src/gui/gui-history-endpoints.js +301 -0
- package/dist/src/gui/gui-operator-commands.js +235 -13
- package/dist/src/gui/gui-prompt-commands.js +26 -20
- package/dist/src/gui/gui-report-endpoints.js +97 -0
- package/dist/src/gui/gui-server.js +26 -5
- package/dist/src/gui/gui-team-commands.js +7 -7
- package/dist/src/gui/http-body.js +1 -1
- package/dist/src/history/history-data.js +122 -234
- package/dist/src/history/history-queued.js +155 -0
- package/dist/src/history/history-render.js +42 -22
- package/dist/src/history/history.js +190 -49
- package/dist/src/inbox/inbox-attachments.js +29 -30
- package/dist/src/inbox/inbox-cancel.js +10 -11
- package/dist/src/inbox/inbox-edit.js +9 -9
- package/dist/src/inbox/inbox-submit.js +18 -18
- package/dist/src/inbox/inbox-top.js +28 -17
- package/dist/src/inbox/inbox.js +42 -43
- package/dist/src/inbox/pending-prompt.js +26 -26
- package/dist/src/inbox/prompt-commands.js +62 -49
- package/dist/src/inbox/prompt-not-before.js +2 -2
- package/dist/src/init/init-templates.js +1 -2
- package/dist/src/init/init.js +28 -23
- package/dist/src/merge/backlog-conflicts.js +215 -35
- package/dist/src/merge/merge-batch.js +14 -8
- package/dist/src/merge/merge-cancel.js +53 -0
- package/dist/src/merge/merge-check-failures.js +44 -22
- package/dist/src/merge/merge-core.js +58 -32
- package/dist/src/merge/merge-diff.js +5 -4
- package/dist/src/merge/merge-drain.js +45 -19
- package/dist/src/merge/merge-git.js +177 -38
- package/dist/src/merge/merge-pipeline.js +15 -3
- package/dist/src/merge/merge-post-review.js +214 -0
- package/dist/src/merge/merge-queue-render.js +48 -11
- package/dist/src/merge/merge-queue.js +52 -15
- package/dist/src/merge/merge-requeue.js +103 -0
- package/dist/src/merge/merge-slot.js +61 -16
- package/dist/src/merge/merge-stack.js +27 -11
- package/dist/src/merge/merge-to-main.js +77 -26
- package/dist/src/merge/merge-top.js +83 -0
- package/dist/src/merge/merge-verify.js +75 -18
- package/dist/src/notes-cli.js +35 -15
- package/dist/src/operator/operator-commands.js +192 -81
- package/dist/src/operator/operator-intent.js +69 -42
- package/dist/src/operator/operator-requests.js +35 -40
- package/dist/src/operator/retire.js +5 -6
- package/dist/src/operator/revert.js +142 -34
- package/dist/src/orchestrator/orchestrator-launch.js +60 -52
- package/dist/src/orchestrator/orchestrator-poll.js +352 -0
- package/dist/src/orchestrator/orchestrator-scheduling.js +71 -370
- package/dist/src/orchestrator/orchestrator.js +129 -369
- package/dist/src/orchestrator/retention.js +42 -8
- package/dist/src/orchestrator/scheduling-admit.js +116 -0
- package/dist/src/orchestrator/scheduling-scope.js +245 -0
- package/dist/src/orchestrator/scheduling-skip.js +195 -0
- package/dist/src/orchestrator/startup-migration-steps.js +8 -7
- package/dist/src/orchestrator/startup-migrations.js +11 -7
- package/dist/src/paths.js +126 -49
- package/dist/src/pi/command-shape.js +12 -1
- package/dist/src/pi/pi-args.js +6 -4
- package/dist/src/pi/pi-backend.js +6 -6
- package/dist/src/pi/pi-bin.js +54 -63
- package/dist/src/pi/pi-listed-models.js +53 -0
- package/dist/src/pi/pi-models.js +63 -30
- package/dist/src/pi/pi-run-result.js +1 -1
- package/dist/src/pi/pi-settings.js +1 -1
- package/dist/src/pi/pi-stream.js +6 -6
- package/dist/src/pi/pi-watchdogs.js +18 -19
- package/dist/src/pi-extension/bounded-output.js +5 -3
- package/dist/src/pi-extension/context-budget.js +2 -2
- package/dist/src/pi-extension/context-shake.js +1 -1
- package/dist/src/pi-extension/context-window.js +0 -1
- package/dist/src/pi-extension/full-output.js +3 -10
- package/dist/src/pi-extension/strip-thinking.js +0 -1
- package/dist/src/pi-extension/trim-system-prompt.js +3 -4
- package/dist/src/pi-extension/write-guard.js +37 -0
- package/dist/src/process/launch-services.js +1 -2
- package/dist/src/process/node-bin.js +16 -0
- package/dist/src/process/process-group.js +8 -18
- package/dist/src/process/process.js +41 -2
- package/dist/src/process/run-marker.js +26 -6
- package/dist/src/process/supervisor.js +22 -21
- package/dist/src/prompt/dialect.js +17 -2
- package/dist/src/prompt/gate-notes.js +203 -0
- package/dist/src/prompt/gate-prompts.js +150 -217
- package/dist/src/prompt/notes-backlog.js +184 -0
- package/dist/src/prompt/principles.js +1 -2
- package/dist/src/prompt/prompt-followup.js +19 -14
- package/dist/src/prompt/prompt.js +131 -204
- package/dist/src/redeploy/redeploy-policy.js +24 -19
- package/dist/src/redeploy/redeploy-probes.js +1 -1
- package/dist/src/redeploy/redeploy.js +2 -3
- package/dist/src/redeploy/redeployer.js +20 -20
- package/dist/src/redeploy/self-reload.js +2 -1
- package/dist/src/report/report-data.js +188 -124
- package/dist/src/report/report-fold.js +130 -54
- package/dist/src/report/report-main-red.js +55 -0
- package/dist/src/report/report-render.js +136 -65
- package/dist/src/report/report-types.js +1 -0
- package/dist/src/report/report.js +23 -9
- package/dist/src/request-timeouts.js +2 -2
- package/dist/src/review/diff-rules.js +53 -0
- package/dist/src/review/known-flakes.js +112 -1
- package/dist/src/review/post-merge-review-accept.js +51 -0
- package/dist/src/review/post-merge-review-render.js +112 -0
- package/dist/src/review/post-merge-review.js +239 -0
- package/dist/src/review/protected-edits.js +24 -10
- package/dist/src/review/quarantine-render.js +65 -0
- package/dist/src/review/review-followup.js +8 -8
- package/dist/src/review/review-precheck.js +66 -23
- package/dist/src/review/review-run.js +395 -0
- package/dist/src/review/review-verdict.js +2 -2
- package/dist/src/review/review.js +180 -401
- package/dist/src/review/secret-leaks.js +36 -16
- package/dist/src/review/suite-rerun.js +0 -1
- package/dist/src/roles/legacy-role-migration.js +80 -7
- package/dist/src/roles/role-catalog.js +127 -12
- package/dist/src/roles/role-guidance.js +65 -20
- package/dist/src/roles/role-labels.js +7 -5
- package/dist/src/roles/role-render.js +108 -56
- package/dist/src/roles/role-view.js +95 -56
- package/dist/src/roles/roles.js +33 -33
- package/dist/src/roles/runner-ids.js +97 -0
- package/dist/src/run/acceptance-greps.js +119 -0
- package/dist/src/run/ci-parity.js +121 -0
- package/dist/src/run/feedback-filings.js +51 -0
- package/dist/src/run/qa-coverage.js +125 -0
- package/dist/src/{tick/tick-apply.js → run/run-apply.js} +95 -94
- package/dist/src/run/run-detail-data.js +175 -0
- package/dist/src/run/run-detail-render.js +91 -0
- package/dist/src/run/run-detail.js +168 -0
- package/dist/src/{tick/tick-finalize.js → run/run-finalize.js} +73 -60
- package/dist/src/{tick/tick-outcome.js → run/run-outcome.js} +6 -7
- package/dist/src/{tick/tick-prompt.js → run/run-prompt.js} +122 -73
- package/dist/src/{tick/tick-resume.js → run/run-resume.js} +55 -26
- package/dist/src/{tick/tick-stage.js → run/run-stage.js} +170 -83
- package/dist/src/{tick/tick-timing.js → run/run-timing.js} +43 -41
- package/dist/src/{tick/tick-usage.js → run/run-usage.js} +45 -37
- package/dist/src/{tick/tick-verdict.js → run/run-verdict.js} +105 -57
- package/dist/src/run/selfcheck-digest.js +40 -0
- package/dist/src/run/stage-backlog-checks.js +249 -0
- package/dist/src/run/stage-check.js +178 -0
- package/dist/src/run/stage-checks-shared.js +65 -0
- package/dist/src/run/stage-name-checks.js +204 -0
- package/dist/src/run/stage-path-checks.js +231 -0
- package/dist/src/run/stage-prose-checks.js +261 -0
- package/dist/src/runner/leftover.js +216 -0
- package/dist/src/{loop → runner}/model-fallback.js +12 -12
- package/dist/src/runner/revision.js +191 -0
- package/dist/src/{loop/loop-fallback.js → runner/runner-fallback.js} +8 -8
- package/dist/src/runner/runner-outcome.js +109 -0
- package/dist/src/{loop/loop-pi.js → runner/runner-pi.js} +140 -131
- package/dist/src/{loop/loop-recovery.js → runner/runner-recovery.js} +39 -18
- package/dist/src/{loop/loop-tick.js → runner/runner-run.js} +236 -245
- package/dist/src/{loop/loop-state.js → runner/runner-state-load.js} +61 -114
- package/dist/src/runner/runner-state.js +103 -0
- package/dist/src/{loop/loop.js → runner/runner.js} +123 -120
- package/dist/src/scheduling/backoff.js +38 -38
- package/dist/src/scheduling/claim-entries.js +49 -0
- package/dist/src/scheduling/claims.js +35 -22
- package/dist/src/scheduling/once-round.js +22 -22
- package/dist/src/scheduling/quiet-hours.js +5 -6
- package/dist/src/scheduling/scheduling.js +74 -64
- package/dist/src/scheduling/work-merged-cache.js +2 -2
- package/dist/src/status/status-budget.js +55 -47
- package/dist/src/status/status-data.js +49 -17
- package/dist/src/status/status-inbox.js +2 -2
- package/dist/src/status/status-install.js +0 -1
- package/dist/src/status/status-polls.js +43 -28
- package/dist/src/status/status-roles.js +50 -13
- package/dist/src/team/error-storm.js +8 -8
- package/dist/src/team/failure-spread.js +2 -2
- package/dist/src/team/orchestrator-info.js +15 -9
- package/dist/src/team/reclaim.js +7 -8
- package/dist/src/team/team-hold.js +7 -7
- package/dist/src/team/team-polls.js +91 -50
- package/dist/src/team/team-state.js +8 -2
- package/dist/src/text/datetime.js +65 -18
- package/dist/src/text/format.js +48 -11
- package/dist/src/text/markdown.js +8 -5
- package/dist/src/text/phrases.js +60 -23
- package/dist/src/text/suggest.js +1 -1
- package/dist/src/text/text.js +78 -13
- package/dist/src/ui/badges.js +99 -38
- package/dist/src/ui/gui/gui-client-backlog.js +314 -0
- package/dist/src/ui/gui/gui-client-boot.js +89 -61
- package/dist/src/ui/gui/gui-client-composer.js +8 -9
- package/dist/src/ui/gui/gui-client-drawer-config.js +254 -0
- package/dist/src/ui/gui/gui-client-drawer.js +155 -289
- package/dist/src/ui/gui/gui-client-feed.js +271 -0
- package/dist/src/ui/gui/gui-client-history.js +437 -68
- package/dist/src/ui/gui/gui-client-labels.js +6 -3
- package/dist/src/ui/gui/gui-client-markdown.js +1 -2
- package/dist/src/ui/gui/gui-client-model.js +27 -36
- package/dist/src/ui/gui/gui-client-operator.js +60 -52
- package/dist/src/ui/gui/gui-client-pending.js +405 -24
- package/dist/src/ui/gui/gui-client-report-chart.js +492 -0
- package/dist/src/ui/gui/gui-client-report.js +105 -430
- package/dist/src/ui/gui/{gui-client-loops.js → gui-client-roles.js} +43 -44
- package/dist/src/ui/gui/gui-client-settings.js +163 -5
- package/dist/src/ui/gui/gui-client-team.js +36 -465
- package/dist/src/ui/gui/gui-client.js +38 -26
- package/dist/src/ui/gui/gui-icons.js +0 -2
- package/dist/src/ui/gui/gui-page.js +10 -7
- package/dist/src/ui/gui/gui-styles.js +38 -34
- package/dist/src/ui/progress-data.js +9 -11
- package/dist/src/ui/{tick-progress-model.js → run-progress-model.js} +33 -32
- package/dist/src/ui/status-model.js +133 -125
- package/dist/src/ui/status-payload.js +364 -49
- package/dist/src/ui/status-render.js +109 -82
- package/dist/src/ui/team-alerts.js +728 -62
- package/dist/src/ui/tone.js +12 -6
- package/dist/src/ui/transcript-run.js +58 -0
- package/dist/src/ui/transcript-tail.js +28 -20
- package/dist/src/ui/transcript.js +63 -23
- package/dist/src/ui/tui/tui-app.js +0 -1
- package/dist/src/ui/tui/tui-backlog.js +53 -14
- package/dist/src/ui/tui/tui-editor-answer.js +27 -31
- package/dist/src/ui/tui/tui-editor-attach.js +4 -12
- package/dist/src/ui/tui/tui-editor-backends.js +127 -0
- package/dist/src/ui/tui/tui-editor-brief.js +14 -36
- package/dist/src/ui/tui/tui-editor-budget.js +36 -39
- package/dist/src/ui/tui/tui-editor-check.js +29 -0
- package/dist/src/ui/tui/tui-editor-checks.js +28 -0
- package/dist/src/ui/tui/tui-editor-claude-reserve.js +24 -0
- package/dist/src/ui/tui/tui-editor-concurrency.js +25 -0
- package/dist/src/ui/tui/tui-editor-config.js +99 -0
- package/dist/src/ui/tui/tui-editor-entry.js +39 -64
- package/dist/src/ui/tui/tui-editor-fallback.js +31 -0
- package/dist/src/ui/tui/tui-editor-instances.js +46 -0
- package/dist/src/ui/tui/tui-editor-instructions.js +117 -0
- package/dist/src/ui/tui/tui-editor-interval.js +29 -16
- package/dist/src/ui/tui/tui-editor-model.js +29 -0
- package/dist/src/ui/tui/tui-editor-notes.js +9 -29
- package/dist/src/ui/tui/tui-editor-notify.js +25 -0
- package/dist/src/ui/tui/tui-editor-pause.js +48 -59
- package/dist/src/ui/tui/tui-editor-prompt.js +11 -16
- package/dist/src/ui/tui/tui-editor-provider-caps.js +27 -0
- package/dist/src/ui/tui/tui-editor-queued.js +5 -9
- package/dist/src/ui/tui/tui-editor-quiet.js +95 -41
- package/dist/src/ui/tui/tui-editor-retire.js +5 -13
- package/dist/src/ui/tui/tui-editor-role-enabled.js +126 -0
- package/dist/src/ui/tui/tui-editor-role-key.js +71 -0
- package/dist/src/ui/tui/tui-editor-role-model.js +28 -0
- package/dist/src/ui/tui/tui-editor-search.js +45 -33
- package/dist/src/ui/tui/tui-editor-session.js +101 -34
- package/dist/src/ui/tui/tui-editor-slots.js +24 -0
- package/dist/src/ui/tui/tui-editors.js +44 -2
- package/dist/src/ui/tui/tui-frame.js +68 -11
- package/dist/src/ui/tui/tui-history.js +8 -9
- package/dist/src/ui/tui/tui-input.js +13 -11
- package/dist/src/ui/tui/tui-keymap.js +0 -1
- package/dist/src/ui/tui/tui-keys.js +33 -9
- package/dist/src/ui/tui/tui-pane-activity.js +35 -19
- package/dist/src/ui/tui/tui-pane-backlog.js +198 -126
- package/dist/src/ui/tui/tui-pane-brief.js +0 -1
- package/dist/src/ui/tui/tui-pane-ctx.js +2 -2
- package/dist/src/ui/tui/tui-pane-health.js +168 -8
- package/dist/src/ui/tui/tui-pane-history.js +446 -82
- package/dist/src/ui/tui/tui-pane-pending.js +539 -15
- package/dist/src/ui/tui/tui-pane-queued.js +78 -57
- package/dist/src/ui/tui/tui-pane-report.js +54 -16
- package/dist/src/ui/tui/tui-pane-session.js +34 -6
- package/dist/src/ui/tui/tui-pane-transcript.js +111 -37
- package/dist/src/ui/tui/tui-pane.js +91 -28
- package/dist/src/ui/tui/tui-panes.js +153 -34
- package/dist/src/ui/tui/tui.js +18 -15
- package/dist/src/verdict/fix-claim.js +129 -33
- package/dist/src/verdict/no-change.js +4 -4
- package/dist/src/verdict/refusal.js +40 -16
- package/dist/src/verdict/reply-contract.js +77 -31
- package/dist/src/version.js +0 -1
- package/package.json +2 -1
- package/dist/src/loop/leftover.js +0 -130
- package/dist/src/loop/revision.js +0 -70
- package/dist/src/roles/loop-ids.js +0 -77
- package/dist/src/tick/qa-coverage.js +0 -108
- package/dist/src/tick/stage-check.js +0 -419
- package/dist/src/tick/telemetry-digest.js +0 -25
- package/dist/src/tick/tick-detail-data.js +0 -108
- package/dist/src/tick/tick-detail.js +0 -163
- package/dist/src/ui/gui/gui-client-sound.js +0 -53
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
import { shortSha } from "../text/format.js";
|
|
2
|
+
import { NEEDS_REPLAN_NOTE, NEEDS_REVIEW_NOTE } from "../roles/role-guidance.js";
|
|
3
|
+
import { baseRoleOf } from "../roles/runner-ids.js";
|
|
4
|
+
import { formatTimestamp } from "../text/datetime.js";
|
|
5
|
+
import { numberedList } from "../text/markdown.js";
|
|
6
|
+
import { SUMMARY_BLOCK, NOTHING_TO_DO } from "../verdict/reply-contract.js";
|
|
7
|
+
import { NO_REASONS } from "./gate-prompts.js";
|
|
8
|
+
/** The notes that carry the merge gate's verdicts back to the role that authored the change
|
|
9
|
+
* (runner-run.ts, run-prompt.ts, main-red.ts): a rejected review, a revision round, a claim
|
|
10
|
+
* assignment, a discarded conflict, and the red-main handoffs. The gate's own pi-run prompts —
|
|
11
|
+
* conflict resolution, the review, the stage fix — live in gate-prompts.ts, with the conflict
|
|
12
|
+
* hand-back note that shares the resolver prompt's conflict blocks. */
|
|
13
|
+
/** The note injected into a role's next run prompt after its previous change was rejected in
|
|
14
|
+
* review. Every run starts a fresh pi session, so this is the only cross-run memory of what
|
|
15
|
+
* was built and why it failed — it carries the full reasons, not a summary of them. The whole
|
|
16
|
+
* `lastReview` rides in, not just the reasons: the timestamp and reviewed head let the author
|
|
17
|
+
* weigh a stale objection against main's current state (main may have satisfied it since).
|
|
18
|
+
* buildRunPrompt renders it at the very top of the run prompt, before the role charter, and its
|
|
19
|
+
* phrasing makes fixing the objections this run's primary task (plans/reviewer-as-role.md part
|
|
20
|
+
* 4/4) — the inescapable-first note the recurring-reason runs were missing. */
|
|
21
|
+
export function buildRejectedReviewNote(review, role) {
|
|
22
|
+
const list = numberedList(review.reasons, NO_REASONS);
|
|
23
|
+
let context = "";
|
|
24
|
+
if (review.at !== undefined) {
|
|
25
|
+
context = ` (${formatTimestamp(review.at)}`;
|
|
26
|
+
if (review.head)
|
|
27
|
+
context += `, head ${shortSha(review.head)}`;
|
|
28
|
+
context += ")";
|
|
29
|
+
}
|
|
30
|
+
// On exhaustion the rejected diff is gone. Feature's rejected change often implemented a
|
|
31
|
+
// PLANS.md entry, and re-authoring the same plan from scratch is what produced the long
|
|
32
|
+
// rejection runs this note exists to end, so feature is sent to replan the entry instead.
|
|
33
|
+
// A plan-less role has no downstream role to replan for it, so it is sent to its own
|
|
34
|
+
// notes instead: it records the abandoned purpose and any instances that remain
|
|
35
|
+
// unhandled, then takes a different theme on the next run. Re-authoring the same purpose
|
|
36
|
+
// from the same objections is what restarted the round and produced the long rejection
|
|
37
|
+
// runs this note exists to end. The markdown-only replan note merges review-exempt, but a
|
|
38
|
+
// merged change clears the standing rejection (clearSupersededRejection, run-apply.ts), so
|
|
39
|
+
// the instruction does not re-inject once the note has merged. `role` is the runner id, so
|
|
40
|
+
// feature's instances (`feature-2`, …) are matched through their base role: matched bare,
|
|
41
|
+
// they got the plan-less wording while their claim kept the same entry assigned, and
|
|
42
|
+
// resolved the contradiction by refusing the plan (three Refused notes on 2026-10-21).
|
|
43
|
+
let finality = "";
|
|
44
|
+
if (review.exhausted) {
|
|
45
|
+
finality =
|
|
46
|
+
role !== undefined && baseRoleOf(role) === "feature"
|
|
47
|
+
? ` This was the change's final revision round — the same objection survived two revisions (or the chain hit its cap), so the rejected diff and ref are gone. If it implemented a PLANS.md entry, do not re-author it: append ${NEEDS_REPLAN_NOTE} under that entry's heading, with the numbered objections above quoted beneath it, and merge that markdown-only change and nothing else so the plan role can rewrite the plan. Otherwise, redo the change against current main.`
|
|
48
|
+
: " This was the change's final revision round — the same objection survived two revisions (or the chain hit its cap), so the rejected diff and ref are gone. Do not re-author it. Record the abandoned purpose and any instances of it that remain unhandled in your notes, then take a different theme on this run: re-deriving the same purpose from the same objections is what produced the long rejection runs this note exists to end.";
|
|
49
|
+
}
|
|
50
|
+
const tail = finality === "" ? "" : `\n${finality.trim()}`;
|
|
51
|
+
return `Your previous change was rejected; fix each numbered objection or drop the change — it is this run's primary task${context}:\n${list}${tail}`;
|
|
52
|
+
}
|
|
53
|
+
/** The note injected into a role's run prompt when its rejected change has been re-applied to
|
|
54
|
+
* current main as uncommitted edits (plans/revise-rejected.md, runner/revision.ts's
|
|
55
|
+
* applyRevision): this run's one task is to revise the change already in the worktree, not
|
|
56
|
+
* author a new one. The prior objections are numbered so the author can work through them; a
|
|
57
|
+
* revision round past the first also reaches here. The chain keeps revising while each round
|
|
58
|
+
* fixes the prior objection; it ends only on a repeated objection or the backstop (BUGS.md
|
|
59
|
+
* 2026-10-14). A pure function so its shape is pinned in tests. */
|
|
60
|
+
export function buildRevisionNote(review, round) {
|
|
61
|
+
const list = numberedList(review.reasons, NO_REASONS);
|
|
62
|
+
return `Your previously rejected change is already in the worktree as uncommitted edits — this
|
|
63
|
+
is revision ${round}. This run's ONE task is to revise it; do not author anything else.
|
|
64
|
+
The review objections were:\n${list}
|
|
65
|
+
Fix each numbered objection with the smallest edit that resolves it, and keep everything else as it
|
|
66
|
+
is. When an objection is about a build-check failure in a test the change does not touch that you
|
|
67
|
+
cannot reproduce, say so in RISK and keep the change as it is. Rewrite the closing block so it
|
|
68
|
+
describes the WHOLE change as it now stands:
|
|
69
|
+
${SUMMARY_BLOCK}
|
|
70
|
+
Add one Objection N: <done|dropped|unchanged-by-design because …> line to the closing block for
|
|
71
|
+
each numbered objection above (N is the objection's number): this run's commit body carries them,
|
|
72
|
+
so the re-review reads your answer to each objection beside the diff. Say "done" when the fix is in
|
|
73
|
+
this change, "dropped" when you removed what the objection targeted, or "unchanged-by-design because …"
|
|
74
|
+
when you kept it and why.
|
|
75
|
+
When an objection shows the change should not exist (its premise is disproven, it duplicates main,
|
|
76
|
+
or it has no reachable benefit), end your reply with the line ${NOTHING_TO_DO} instead, and
|
|
77
|
+
tumwater drops the change.`;
|
|
78
|
+
}
|
|
79
|
+
/** The note appended to a work instance's run prompt when it holds a claim (plans/parallel-
|
|
80
|
+
* work-instances.md "Claims", part 4/7): the harness has already picked its entry, so the
|
|
81
|
+
* charter's choosing step is replaced. A pure function so its shape is pinned in tests; the
|
|
82
|
+
* range is optional because a claim whose entry was already released still gets the note. */
|
|
83
|
+
export function buildAssignmentNote(claim, range, missingPaths = []) {
|
|
84
|
+
const where = range ? ` (${claim.file} lines ${range.start}-${range.end})` : ` (${claim.file})`;
|
|
85
|
+
const intro = claim.source === "staged"
|
|
86
|
+
? `Your change moved ONE backlog entry, so it is now your task, replacing your charter's "pick one" step:`
|
|
87
|
+
: `Tumwater has assigned you ONE backlog entry, replacing your charter's "pick one" step:`;
|
|
88
|
+
const shown = missingPaths.slice(0, 10).map((p) => `\`${p}\``).join(", ");
|
|
89
|
+
const rest = missingPaths.length - 10;
|
|
90
|
+
const missingLine = missingPaths.length === 0
|
|
91
|
+
? ""
|
|
92
|
+
: `\nThe entry names paths that do not exist in your checkout: ${shown}${rest > 0 ? `, and ${rest} more` : ""}. Each was renamed or removed after the entry was written (find its successor with \`git log --follow --name-status -- <path>\` or by grepping for the symbols the entry names), or is a file the entry asks you to create.`;
|
|
93
|
+
return `<assigned-entry>
|
|
94
|
+
${intro}
|
|
95
|
+
"${claim.title}"${where}.
|
|
96
|
+
Implement or fix only that entry. If it is too large for one run, append ${NEEDS_REVIEW_NOTE} under its heading and end your reply with that note alone. If it should not be done, append a Refused note under its heading with your objection and change nothing else. Do not edit any other backlog entry.${missingLine}
|
|
97
|
+
</assigned-entry>`;
|
|
98
|
+
}
|
|
99
|
+
/** The note appended to an unassigned work instance's prompt when siblings hold backlog entries
|
|
100
|
+
* (plans/parallel-work-instances.md "an exclusion list of held titles"): those entries are
|
|
101
|
+
* someone else's task, so choosing among the rest — or ending with nothing to do — is the
|
|
102
|
+
* instance's whole job. A pure function so its shape is pinned in tests. */
|
|
103
|
+
export function buildHeldEntriesNote(titles) {
|
|
104
|
+
return `<held-entries>
|
|
105
|
+
Sibling instances hold these backlog entries; do not pick, edit, or implement them, and do not edit their headings. If every remaining entry is held, treat the backlog as having nothing to do for you:
|
|
106
|
+
${titles.map((t) => `- "${t}"`).join("\n")}
|
|
107
|
+
</held-entries>`;
|
|
108
|
+
}
|
|
109
|
+
/** The longest title an entry list quotes: a PLANS.md heading's tail names the plan's dates and
|
|
110
|
+
* every file it touches, which its range already leads to. */
|
|
111
|
+
const LISTED_TITLE_CHARS = 100;
|
|
112
|
+
/** The capped series-part range list shared by the merged-prerequisites and waiting-parts
|
|
113
|
+
* notes: at most five `- "title"` lines, each naming the entry's heading line range in its
|
|
114
|
+
* `file` (default: the plans file) with the title cut to LISTED_TITLE_CHARS, then one
|
|
115
|
+
* `- …and N more` line for the rest, so the two notes list a part's neighbors identically. A pure
|
|
116
|
+
* function so its shape is pinned in tests (test/gate-notes.test.ts). */
|
|
117
|
+
function entryRangeLines(entries) {
|
|
118
|
+
// Cut by code point, so an astral character is never split in half.
|
|
119
|
+
const title = (t) => {
|
|
120
|
+
const cps = Array.from(t);
|
|
121
|
+
return cps.length > LISTED_TITLE_CHARS ? `${cps.slice(0, LISTED_TITLE_CHARS).join("").trimEnd()}…` : t;
|
|
122
|
+
};
|
|
123
|
+
const lines = entries.slice(0, 5).map((e) => `- "${title(e.title)}" (${e.file ?? "PLANS.md"} lines ${e.start}-${e.end})`);
|
|
124
|
+
if (entries.length > 5)
|
|
125
|
+
lines.push(`- …and ${entries.length - 5} more`);
|
|
126
|
+
return lines;
|
|
127
|
+
}
|
|
128
|
+
/** The note appended to a series part's assignment when parts it requires already merged: each
|
|
129
|
+
* one's Done heading, file (PLANS-DONE.md once archived) and line range, so the implementer reads
|
|
130
|
+
* exactly what that part changed instead of searching a history that runs to thousands of lines.
|
|
131
|
+
* Lists at most five, then a count of the rest. A pure function so its shape is pinned in tests. */
|
|
132
|
+
export function buildMergedPrerequisitesNote(entries) {
|
|
133
|
+
const lines = entryRangeLines(entries);
|
|
134
|
+
return `<merged-prerequisites>
|
|
135
|
+
Your assigned entry builds on parts that are already merged. Each one's Done entry records what it actually changed; read one by its range when your entry depends on its details, rather than searching the backlog files:
|
|
136
|
+
${lines.join("\n")}
|
|
137
|
+
</merged-prerequisites>`;
|
|
138
|
+
}
|
|
139
|
+
/** The note injected into a role's prompt after leftover recovery discarded its pinned change
|
|
140
|
+
* at MERGE_CONFLICT_LIMIT (src/runner/leftover.ts): at the cap recovery ordinarily hands the
|
|
141
|
+
* change back to its author with markers instead, so a discard means that lineage already used
|
|
142
|
+
* its hand-back. The merge failures were harness-level, so without the note the author would
|
|
143
|
+
* never learn its work is gone — or that redoing it from memory of the old diff would conflict
|
|
144
|
+
* again. A pure function so its shape is pinned in tests. */
|
|
145
|
+
export function buildConflictDiscardNote(summary, attempts) {
|
|
146
|
+
return (`Your previous change ("${summary}") was discarded without merging: it conflicted with main ` +
|
|
147
|
+
`${attempts} times and conflict resolution could not reconcile it. Main has moved on since you ` +
|
|
148
|
+
`wrote it. If the change is still needed, redo it against current main, starting from main's ` +
|
|
149
|
+
`current version of the files it touched rather than your earlier diff.`);
|
|
150
|
+
}
|
|
151
|
+
/** The note injected into the `ci` healer's prompt when main's own suite is red (PLANS.md
|
|
152
|
+
* "Red-main handoff"): the gate's warning event is harness-level and no role prompt reads it, so
|
|
153
|
+
* the one role allowed to author on a red main is told what failed and that fixing it is this
|
|
154
|
+
* run's job. The healer's normal charter is a starting point, not a fit — a red main blocks
|
|
155
|
+
* every other code role, and the gate's deterministic pre-check rejects any change that leaves
|
|
156
|
+
* the suite red, so authoring anything else first is waste. A pure function so its shape is
|
|
157
|
+
* pinned in tests; script/headline are optional because a red carries a failing script, but the
|
|
158
|
+
* note must still read sensibly if it is ever absent. */
|
|
159
|
+
export function buildMainRedNote(sha, script, headline, tail) {
|
|
160
|
+
const what = script
|
|
161
|
+
? `${script}${headline ? `: ${headline}` : ""}`
|
|
162
|
+
: (headline ?? "the project's declared check");
|
|
163
|
+
// A red baseline already carries the check's bounded clipped tail (clipBuildTail, ≤12 lines:
|
|
164
|
+
// the failing test's name, the error-message line, then the stack). Hoist it into the note so
|
|
165
|
+
// the healer starts from the actual assertion and stack instead of the one-line headline —
|
|
166
|
+
// often just the test name — and must burn its run reproducing the failure first. The tail is
|
|
167
|
+
// fenced and labeled, and never touches the directive lines above, so the failure's own text
|
|
168
|
+
// cannot read as instructions to the role. An absent, empty, or all-blank tail renders today's
|
|
169
|
+
// exact note. */
|
|
170
|
+
const output = (tail ?? []).map((l) => l.trim()).filter((l) => l !== "");
|
|
171
|
+
const tailBlock = output.length > 0
|
|
172
|
+
? `\nFailing check output (${output.length} lines):\n\`\`\`\n${output.join("\n")}\n\`\`\`\n`
|
|
173
|
+
: "";
|
|
174
|
+
return `<main-red>
|
|
175
|
+
main's own suite is red at ${shortSha(sha)} (${what}). Every code-producing role is skipping authoring and no change merges until main is green.
|
|
176
|
+
This run your job is to make main green: reproduce that failure, fix it (add a regression test where one is feasible), and merge the fix.
|
|
177
|
+
The review gate's deterministic pre-check runs main + your change, so a change that leaves the suite red is rejected — do not author anything else first.
|
|
178
|
+
If the failure is environmental — flaky, load-sensitive, or a broken local toolchain — say so plainly in your reply rather than editing unrelated code.
|
|
179
|
+
${tailBlock}</main-red>`;
|
|
180
|
+
}
|
|
181
|
+
/** The note every role but bugfix gets while main is red with named failures: the tests that
|
|
182
|
+
* already fail on main (at most 20 listed, then a `…and N more` line) and who owns them. A pure
|
|
183
|
+
* function so its shape is pinned in tests. */
|
|
184
|
+
export function buildMainKnownRedNote(failingTests) {
|
|
185
|
+
const shown = failingTests.slice(0, 20).map((t) => `- ${t}`);
|
|
186
|
+
if (failingTests.length > 20)
|
|
187
|
+
shown.push(`- …and ${failingTests.length - 20} more`);
|
|
188
|
+
return `<main-known-red>
|
|
189
|
+
${shown.join("\n")}
|
|
190
|
+
These tests already fail on main. Tumwater or the bugfix role owns them. Leave them alone unless your task is about them; a change merges when it adds no new failures.
|
|
191
|
+
</main-known-red>`;
|
|
192
|
+
}
|
|
193
|
+
/** The note appended to an assigned series part's prompt naming the later planned parts that
|
|
194
|
+
* wait on it, so the implementer sees where its part ends and leaves their share alone. At most
|
|
195
|
+
* five are listed, then a literal `- …and N more` line (the `moreSuffix` phrase renders inline,
|
|
196
|
+
* not as a list line). A pure function so its shape is pinned in tests. */
|
|
197
|
+
export function buildWaitingPartsNote(entries) {
|
|
198
|
+
const shown = entryRangeLines(entries);
|
|
199
|
+
return `<waiting-parts>
|
|
200
|
+
Later parts of your series wait for yours to land, and each one plans its own share of the work: do none of it here, and keep in place the names and files they say your part leaves behind. Read one by its range when you need to know what it expects:
|
|
201
|
+
${shown.join("\n")}
|
|
202
|
+
</waiting-parts>`;
|
|
203
|
+
}
|