@joshuafolkken/kit 1.1514.0 → 1.2114.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/.claude/agents/investigator.md +1 -1
- package/.claude/agents/reviewer-verification.md +19 -0
- package/.claude/agents/reviewer.md +19 -0
- package/.claude/settings.json +5 -6
- package/.claude/skills/dependency-update/SKILL.md +9 -10
- package/.claude/skills/epic-commands/SKILL.md +26 -65
- package/.claude/skills/epic-commands/epic-bundle.md +3 -1
- package/.claude/skills/workflow-commands/SKILL.md +11 -11
- package/.claude/skills/workflow-commands/background-commands.md +13 -10
- package/.claude/skills/workflow-commands/backlogrun-child.md +12 -8
- package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +7 -25
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +18 -14
- package/.claude/skills/workflow-commands/backlogrun-park.md +18 -24
- package/.claude/skills/workflow-commands/backlogrun-progress.md +4 -5
- package/.claude/skills/workflow-commands/backlogrun-recovery.md +6 -6
- package/.claude/skills/workflow-commands/backlogrun-steps.md +12 -11
- package/.claude/skills/workflow-commands/backlogrun.md +1 -1
- package/.claude/skills/workflow-commands/chain-rule.md +43 -28
- package/.claude/skills/workflow-commands/delegation.md +11 -10
- package/.claude/skills/workflow-commands/entry-sequence.md +10 -10
- package/.claude/skills/workflow-commands/followup.md +16 -36
- package/.claude/skills/workflow-commands/fullrun-steps.md +38 -47
- package/.claude/skills/workflow-commands/fullrun.md +3 -3
- package/.claude/skills/workflow-commands/halfrun.md +17 -25
- package/.claude/skills/workflow-commands/issue-comments.md +25 -16
- package/.claude/skills/workflow-commands/issue-fold-existing.md +2 -1
- package/.claude/skills/workflow-commands/issue-scout.md +2 -2
- package/.claude/skills/workflow-commands/kickoff.md +24 -23
- package/.claude/skills/workflow-commands/latest-gate.md +7 -12
- package/.claude/skills/workflow-commands/needs-human-review.md +9 -14
- package/.claude/skills/workflow-commands/observation-filing.md +4 -36
- package/.claude/skills/workflow-commands/observation-ledger.md +6 -4
- package/.claude/skills/workflow-commands/pre-gate-cut.md +22 -37
- package/.claude/skills/workflow-commands/prerequisite.md +11 -16
- package/.claude/skills/workflow-commands/progress-watcher.md +1 -1
- package/.claude/skills/workflow-commands/prrun.md +3 -7
- package/.claude/skills/workflow-commands/retrospective.md +2 -2
- package/.claude/skills/workflow-commands/split-assessment.md +15 -1
- package/.claude/skills/workflow-commands/working-tree-hold.md +9 -9
- package/.codex/hooks.json +5 -5
- package/.github/actions/setup-node/action.yml +9 -0
- package/.github/actions/setup-pnpm/action.yml +10 -17
- package/.github/dependabot.yml +32 -0
- package/.github/release.yml +0 -2
- package/.github/workflows/auto-tag.yml +45 -0
- package/.github/workflows/ci.yml +267 -17
- package/.github/workflows/dependabot-auto-merge.yml +63 -4
- package/.github/workflows/production.yml +8 -0
- package/.github/workflows/publish.yml +67 -46
- package/.github/workflows/sonar-qube.yml +1 -0
- package/.prettierignore +2 -0
- package/.vscode/settings.json +19 -0
- package/.vscode/tasks.json +1 -2
- package/CLAUDE.md +7 -18
- package/README.md +4 -2
- package/SECURITY.md +3 -3
- package/dist/CLAUDE.md +7 -18
- package/dist/commands/document-read-cli.js +883 -0
- package/dist/commands/{document-section-cli.js → document-section-main.js} +81 -38
- package/dist/commands/read-set-cli.js +1927 -0
- package/dist/commands/run-prep-main.js +21174 -0
- package/dist/commands/run-step-cli.js +27733 -0
- package/dist/config-merge/index.js +5 -1
- package/dist/hooks/audit-provision.js +39 -36
- package/dist/hooks/chunk-3GKE653K.js +6204 -0
- package/dist/hooks/chunk-45CJJOO7.js +1243 -0
- package/dist/hooks/chunk-5PM2JRGV.js +7780 -0
- package/dist/hooks/chunk-7SIUNQXK.js +3591 -0
- package/dist/hooks/chunk-CQD4LJE6.js +4858 -0
- package/dist/hooks/{chunk-723HKZO5.js → chunk-OPSRGWFU.js} +1 -1
- package/dist/hooks/chunk-UJ3FPMMM.js +628 -0
- package/dist/hooks/chunk-VVNYJWEI.js +30 -0
- package/dist/hooks/chunk-Z6DQJKH3.js +2806 -0
- package/dist/hooks/codex-hook-adapter.js +10 -22
- package/dist/hooks/format-edited.js +4 -6
- package/dist/hooks/inputs.json +460 -308
- package/dist/hooks/pretool-guard.js +8 -25
- package/dist/hooks/session-lang.js +135 -299
- package/dist/hooks/stop-guard.js +6496 -1799
- package/dist/josh.js +7412 -4228
- package/dist/self-sync-guard/index.js +74 -10
- package/dist/version/index.js +276 -407
- package/eslint/base.js +1 -1
- package/eslint/rules/comment-why-only.js +108 -0
- package/lefthook/base.yml +3 -1
- package/package.json +23 -54
- package/pnpm-workspace.yaml +4 -2
- package/prompts/coding-standards.md +2 -2
- package/prompts/collaboration-workflow/file-edits.md +14 -17
- package/prompts/collaboration-workflow/issue-citation.md +0 -4
- package/prompts/collaboration-workflow/issue-template.md +54 -18
- package/prompts/collaboration-workflow/lane-instructions.md +3 -2
- package/prompts/collaboration-workflow/measurement.md +44 -0
- package/prompts/collaboration-workflow/operating-rules.md +15 -8
- package/prompts/collaboration-workflow/output-bounds.md +6 -7
- package/prompts/collaboration-workflow/plan-comment.md +3 -42
- package/prompts/collaboration-workflow/principles.md +14 -0
- package/prompts/collaboration-workflow/report-format.md +31 -60
- package/prompts/collaboration-workflow/residency.md +3 -2
- package/prompts/collaboration-workflow/rule-delivery.md +13 -1
- package/prompts/collaboration-workflow/shell-body.md +6 -16
- package/prompts/collaboration-workflow/turn-batching.md +0 -2
- package/prompts/collaboration-workflow/upstream-interrupt.md +15 -5
- package/prompts/collaboration-workflow/wip-cap.md +4 -2
- package/prompts/collaboration-workflow.md +3 -7
- package/prompts/refactoring.md +1 -1
- package/prompts/review-rubric.md +9 -2
- package/prompts/review.md +65 -36
- package/prompts/testing-guide.md +9 -43
- package/scripts/agent/agent-argv.ts +14 -16
- package/scripts/agent/agent-event.ts +15 -15
- package/scripts/agent/agent-exit-record.ts +13 -1
- package/scripts/agent/agent-provider.ts +138 -0
- package/scripts/agent/agent-role-profile.ts +108 -156
- package/scripts/agent/agent-safe-text.ts +20 -5
- package/scripts/agent/api-auth.ts +41 -0
- package/scripts/agent/api-outage.ts +1 -1
- package/scripts/agent/api-usage-limit.ts +65 -0
- package/scripts/agent/claude-agent-argv.ts +19 -9
- package/scripts/agent/codex-agent-argv.ts +118 -22
- package/scripts/agent/usage-limit-reset.ts +179 -0
- package/scripts/auth/claude-token-output.ts +2 -2
- package/scripts/auto-ok/auto-ok-author.ts +53 -0
- package/scripts/auto-ok/auto-ok-cli.ts +25 -16
- package/scripts/auto-ok/auto-ok-judge-read.ts +12 -3
- package/scripts/auto-ok/auto-ok-judge-write.ts +46 -19
- package/scripts/auto-ok/auto-ok-judge.ts +13 -2
- package/scripts/auto-ok/auto-ok-main.ts +17 -0
- package/scripts/backlog/backlog-arrival.ts +14 -3
- package/scripts/backlog/backlog-budget-cli.ts +7 -33
- package/scripts/backlog/backlog-budget-main.ts +16 -0
- package/scripts/backlog/backlog-budget.ts +2 -3
- package/scripts/backlog/backlog-defect-priority.ts +5 -4
- package/scripts/backlog/backlog-drive-adopt.ts +67 -0
- package/scripts/backlog/backlog-drive-args.ts +4 -5
- package/scripts/backlog/backlog-drive-cli.ts +118 -28
- package/scripts/backlog/backlog-drive-hold.ts +162 -0
- package/scripts/backlog/backlog-drive-idle.ts +161 -0
- package/scripts/backlog/backlog-drive-judge.ts +25 -0
- package/scripts/backlog/backlog-drive-launch-pass.ts +90 -0
- package/scripts/backlog/backlog-drive-launch.ts +8 -2
- package/scripts/backlog/backlog-drive-memory.ts +126 -0
- package/scripts/backlog/backlog-drive-named-offer.ts +73 -35
- package/scripts/backlog/backlog-drive-named.ts +81 -13
- package/scripts/backlog/backlog-drive-offer-argv.ts +3 -8
- package/scripts/backlog/backlog-drive-paused.ts +170 -0
- package/scripts/backlog/backlog-drive-restore.ts +39 -8
- package/scripts/backlog/backlog-drive-seats.ts +18 -8
- package/scripts/backlog/backlog-drive-token-handling.ts +38 -0
- package/scripts/backlog/backlog-drive.ts +96 -131
- package/scripts/backlog/backlog-gate-scope.ts +61 -0
- package/scripts/backlog/backlog-measure-close.ts +112 -0
- package/scripts/backlog/backlog-next-main.ts +16 -0
- package/scripts/backlog/backlog-next-shared.ts +73 -0
- package/scripts/backlog/backlog-next.ts +78 -56
- package/scripts/backlog/backlog-occupied.ts +52 -39
- package/scripts/backlog/backlog-offer-cli.ts +6 -21
- package/scripts/backlog/backlog-offer-exclude.ts +15 -0
- package/scripts/backlog/backlog-offer-main.ts +12 -0
- package/scripts/backlog/backlog-offer.ts +36 -3
- package/scripts/backlog/backlog-overlap.ts +62 -10
- package/scripts/backlog/backlog-plan-cli.ts +4 -1
- package/scripts/backlog/backlog-plan-comment.ts +81 -0
- package/scripts/backlog/backlog-plan-read.ts +22 -5
- package/scripts/backlog/backlog-plan.ts +18 -4
- package/scripts/backlog/backlog-pool.ts +60 -22
- package/scripts/backlog/backlog-rank.ts +70 -15
- package/scripts/backlog/backlog-ready.ts +112 -30
- package/scripts/backlog/backlog-stalled-detect.ts +110 -36
- package/scripts/backlog/backlog-stalled.ts +52 -16
- package/scripts/backlog/backlog-wait-cause.ts +86 -0
- package/scripts/backlog/backlog-waves.ts +56 -15
- package/scripts/backlog/backlogrun-args.ts +19 -7
- package/scripts/backlog/backlogrun-cli.ts +19 -5
- package/scripts/backlog/backlogrun-launch.ts +13 -4
- package/scripts/backlog/backlogrun-restart.ts +97 -0
- package/scripts/backlog/backlogrun-stop.ts +79 -7
- package/scripts/behavior/behavior-cli.ts +2 -2
- package/scripts/behavior/behavior-rules.ts +47 -24
- package/scripts/build/build-bin.ts +2 -16
- package/scripts/build/build-claude-md.ts +0 -7
- package/scripts/build/build-commands.ts +0 -13
- package/scripts/build/build-hooks.ts +49 -48
- package/scripts/build/hook-bundle-stamp.ts +29 -11
- package/scripts/build/local-bin.ts +1 -1
- package/scripts/cases/cases-cli.ts +25 -13
- package/scripts/cases/cases-interaction-scan.ts +134 -0
- package/scripts/cases/cases-interaction.ts +183 -0
- package/scripts/cases/cases-logic.ts +39 -6
- package/scripts/ci/pr-classification-main.ts +18 -0
- package/scripts/ci/pr-classification.ts +10 -17
- package/scripts/clone/clone-scan.ts +1 -1
- package/scripts/cost-runtime/context-cut-payback.ts +27 -25
- package/scripts/cost-runtime/cost-blocks.ts +22 -37
- package/scripts/cost-runtime/cost-cli.ts +67 -29
- package/scripts/cost-runtime/cost-main.ts +12 -0
- package/scripts/cost-runtime/cost-pricing.ts +9 -0
- package/scripts/cost-runtime/cost-transcript.ts +1 -0
- package/scripts/cost-runtime/cost-verdict.ts +4 -1
- package/scripts/delegation/delegation-policy.ts +18 -5
- package/scripts/delegation/duplicate-read-guard.ts +1 -8
- package/scripts/delegation/investigation-guard.ts +12 -8
- package/scripts/delegation/investigation-reads.ts +48 -27
- package/scripts/dependabot/dependabot-cooldown.ts +195 -0
- package/scripts/discovery/repo-discovery.ts +24 -6
- package/scripts/discovery/repo-party.ts +80 -20
- package/scripts/discovery/session-owner-pin.ts +51 -0
- package/scripts/doctor/doctor-consumer.ts +2 -5
- package/scripts/document/capped-print.ts +1 -1
- package/scripts/document/command-reference-line-budget.ts +42 -0
- package/scripts/document/document-byte-budget.ts +18 -6
- package/scripts/document/document-checks.ts +20 -0
- package/scripts/document/document-ratchet-check.ts +101 -0
- package/scripts/document/document-scan.ts +1 -1
- package/scripts/document/document-section-cli.ts +0 -8
- package/scripts/document/document-section-main.ts +12 -0
- package/scripts/document/document-section.ts +1 -0
- package/scripts/document/entry-read-budget.ts +7 -3
- package/scripts/document/issue-citation-budget.ts +94 -0
- package/scripts/epic/epic-audit-cli.ts +12 -6
- package/scripts/epic/epic-bundle-apply.ts +137 -0
- package/scripts/epic/epic-bundle-cli.ts +32 -121
- package/scripts/epic/epic-bundle-format.ts +116 -0
- package/scripts/epic/epic-bundle-main.ts +17 -0
- package/scripts/epic/epic-busy.ts +5 -12
- package/scripts/epic/epic-classify.ts +24 -15
- package/scripts/epic/epic-cli-argv.ts +33 -2
- package/scripts/epic/epic-cli-decide.ts +42 -0
- package/scripts/epic/epic-cli.ts +6 -38
- package/scripts/epic/epic-close.ts +112 -55
- package/scripts/epic/epic-cross-repo.ts +4 -7
- package/scripts/epic/epic-decide.ts +119 -0
- package/scripts/epic/epic-decision.ts +9 -0
- package/scripts/epic/epic-fetch.ts +6 -0
- package/scripts/epic/epic-graph.ts +8 -1
- package/scripts/epic/epic-issue.ts +8 -2
- package/scripts/epic/epic-label-age.ts +1 -1
- package/scripts/epic/epic-lane-offer.ts +39 -4
- package/scripts/epic/epic-next-main.ts +24 -0
- package/scripts/epic/epic-next.ts +6 -24
- package/scripts/epic/epic-outside-blocker.ts +6 -2
- package/scripts/epic/epic-parse.ts +9 -3
- package/scripts/epic/epic-rank.ts +5 -0
- package/scripts/epic/epic-read.ts +1 -0
- package/scripts/epic/epic-reconcile.ts +39 -0
- package/scripts/epic/epic-run.ts +10 -1
- package/scripts/epic/epic-solo.ts +50 -14
- package/scripts/epic/epic.ts +41 -7
- package/scripts/exports/unused-members-check.ts +62 -0
- package/scripts/exports/unused-members-cli.ts +6 -51
- package/scripts/followup/followup-checks-event.ts +8 -3
- package/scripts/followup/followup-ci-path.ts +67 -0
- package/scripts/followup/followup-coderabbit-retrigger.ts +261 -0
- package/scripts/followup/followup-coderabbit-wait.ts +85 -0
- package/scripts/followup/followup-failed-tests.ts +160 -0
- package/scripts/followup/followup-job-needs.ts +100 -0
- package/scripts/followup/followup-job-rerun.ts +303 -0
- package/scripts/followup/followup-main-move.ts +113 -0
- package/scripts/followup/followup-review-gates.ts +81 -0
- package/scripts/followup/git-followup-finish.ts +43 -11
- package/scripts/followup/git-followup-pending.ts +3 -3
- package/scripts/followup/git-followup-stages.ts +52 -12
- package/scripts/followup/git-followup-workflow.ts +19 -66
- package/scripts/followup/git-pr-followup-checks.ts +55 -16
- package/scripts/followup/git-pr-followup-wrapup.ts +32 -18
- package/scripts/followup/git-pr-followup.ts +96 -33
- package/scripts/fresh-machine/fresh-machine-cli.ts +1 -1
- package/scripts/fresh-machine/fresh-machine-run.ts +8 -8
- package/scripts/fresh-machine/fresh-machine-script.ts +5 -9
- package/scripts/fresh-machine/specs/kit-test-backlogrun-python.json +2 -2
- package/scripts/fresh-machine/specs/kit-test-backlogrun.json +3 -3
- package/scripts/gate/busy-average.ts +90 -0
- package/scripts/gate/check-cpu.ts +60 -0
- package/scripts/gate/check-inputs.ts +39 -95
- package/scripts/gate/check-related-pinned.ts +43 -0
- package/scripts/gate/check-related-reuse.ts +64 -0
- package/scripts/gate/check-related-section.ts +57 -0
- package/scripts/gate/check-related-unplanned.ts +34 -0
- package/scripts/gate/check-related.ts +265 -0
- package/scripts/gate/check-reuse.ts +33 -54
- package/scripts/gate/command-memory.ts +192 -0
- package/scripts/gate/core-admission.ts +236 -28
- package/scripts/gate/core-budget-timing.ts +51 -0
- package/scripts/gate/core-budget.ts +111 -100
- package/scripts/gate/core-wait-record.ts +49 -0
- package/scripts/gate/core-wait.ts +62 -7
- package/scripts/gate/core-weights.ts +94 -0
- package/scripts/gate/free-cores.ts +27 -4
- package/scripts/gate/gate-labels.ts +46 -0
- package/scripts/gate/gate-ledger.ts +44 -8
- package/scripts/gate/gate-plan.ts +130 -78
- package/scripts/gate/gate-report.ts +23 -9
- package/scripts/gate/gate-run-steps.ts +77 -9
- package/scripts/gate/gate-skip.ts +57 -8
- package/scripts/gate/gate-static-group.ts +60 -0
- package/scripts/gate/gate-steps.ts +14 -2
- package/scripts/gate/gate-tree.ts +4 -2
- package/scripts/gate/hook-gate-reuse.ts +19 -2
- package/scripts/gate/input-fingerprint.ts +42 -0
- package/scripts/gate/machine-capacity.ts +65 -31
- package/scripts/gate/metrics-totals.ts +59 -0
- package/scripts/gate/moved-paths.ts +67 -0
- package/scripts/gate/project-checks.ts +5 -12
- package/scripts/gate/scoped-green.ts +76 -19
- package/scripts/gate/since-green.ts +70 -0
- package/scripts/gate/structural-checks.ts +96 -0
- package/scripts/gate/toolchain-inputs.ts +115 -0
- package/scripts/gate/verification-gate.ts +70 -32
- package/scripts/gate/verification-inputs.ts +265 -0
- package/scripts/gate/verification-tail.ts +52 -0
- package/scripts/gh/gh-author-association.ts +117 -9
- package/scripts/gh/git-ai-review-scan.ts +5 -3
- package/scripts/gh/git-gh-api-path.ts +26 -2
- package/scripts/gh/git-gh-branch-rules.ts +73 -0
- package/scripts/gh/git-gh-comments-unreadable.ts +36 -0
- package/scripts/gh/git-gh-conditional.ts +5 -2
- package/scripts/gh/git-gh-exec.ts +32 -2
- package/scripts/gh/git-gh-issue-read.ts +7 -1
- package/scripts/gh/git-gh-issue-rest.ts +1 -0
- package/scripts/gh/git-gh-issue-write.ts +75 -31
- package/scripts/gh/git-gh-issue.ts +19 -8
- package/scripts/gh/git-gh-poll-read.ts +89 -0
- package/scripts/gh/git-gh-pr-auto-merge.ts +21 -9
- package/scripts/gh/git-gh-pr-graphql-state.ts +56 -0
- package/scripts/gh/git-gh-pr-read.ts +74 -13
- package/scripts/gh/git-gh-pr-rest.ts +4 -2
- package/scripts/gh/git-gh-pr-snapshot.ts +48 -20
- package/scripts/gh/git-gh-pr-too-large.ts +20 -0
- package/scripts/gh/git-gh-pr.ts +48 -22
- package/scripts/gh/git-gh-retry.ts +141 -0
- package/scripts/gh/git-pr-ai-review.ts +15 -6
- package/scripts/gh/git-pr-checks-eval.ts +42 -7
- package/scripts/gh/git-pr-checks-parse.ts +39 -9
- package/scripts/gh/git-pr-checks.ts +5 -5
- package/scripts/gh/git-pr-merge-checked.ts +80 -0
- package/scripts/git/base-tree.ts +49 -2
- package/scripts/git/change-base.ts +4 -10
- package/scripts/git/changed-file-scope.ts +6 -4
- package/scripts/git/changed-paths-sync.ts +63 -0
- package/scripts/git/changed-paths.ts +34 -2
- package/scripts/git/git-common-directory.ts +11 -1
- package/scripts/git/git-diff-reads.ts +91 -20
- package/scripts/git/git-error.ts +9 -2
- package/scripts/git/git-grep-hits.ts +85 -0
- package/scripts/git/git-location-environment.ts +1 -1
- package/scripts/git/git-merge-conflicts.ts +83 -0
- package/scripts/git/git-preflight.ts +37 -12
- package/scripts/git/git-push-transport.ts +1 -2
- package/scripts/git/git-schemas.ts +30 -7
- package/scripts/git/git-spawn.ts +1 -2
- package/scripts/git/git-status.ts +4 -4
- package/scripts/git/git-worktree.ts +13 -0
- package/scripts/git/gone-branch.ts +4 -1
- package/scripts/git/main-merge-budget-conflict.ts +89 -0
- package/scripts/git/main-merge-guard.ts +55 -18
- package/scripts/git/main-merge-main.ts +12 -0
- package/scripts/git/main-merge-regenerate.ts +59 -25
- package/scripts/git/main-merge.ts +77 -13
- package/scripts/git/main-sync-main.ts +12 -0
- package/scripts/git/main-sync.ts +0 -9
- package/scripts/git/no-base-checkout.ts +127 -0
- package/scripts/git/stash/git-stash.ts +38 -6
- package/scripts/git/stash/{stash-pop-args.ts → stash-args.ts} +13 -10
- package/scripts/git/stash/stash-pop-cli.ts +6 -12
- package/scripts/git/stash/stash-pop-main.ts +12 -0
- package/scripts/git/stash/stash-push-cli.ts +86 -0
- package/scripts/git/stash/stash-push-main.ts +12 -0
- package/scripts/hooks/batch-guard.ts +38 -27
- package/scripts/hooks/check-commit-message-main.ts +8 -0
- package/scripts/hooks/check-commit-message.ts +4 -7
- package/scripts/hooks/edited-cspell.ts +37 -11
- package/scripts/hooks/format-edited-file.ts +29 -25
- package/scripts/hooks/lane-plan-guard.ts +50 -0
- package/scripts/hooks/pre-commit-lint-switch.ts +9 -0
- package/scripts/hooks/pre-commit-lint.ts +44 -4
- package/scripts/hooks/pre-push-related-switch.ts +10 -0
- package/scripts/hooks/pre-push-unit.ts +77 -9
- package/scripts/hooks/pretool-guard-cli.ts +1 -8
- package/scripts/hooks/pretool-guard.ts +34 -19
- package/scripts/hooks/reserved-run.ts +81 -10
- package/scripts/hooks/run-hook.sh +30 -6
- package/scripts/hooks/shell-rules-notice.ts +37 -0
- package/scripts/hooks/step-zero-notice.ts +6 -1
- package/scripts/hooks/stop-actions.ts +5 -36
- package/scripts/hooks/stop-guard.ts +20 -15
- package/scripts/init/distributed-paths.ts +1 -0
- package/scripts/init/hook-command-rewrite.ts +23 -5
- package/scripts/init/hook-launch.ts +17 -17
- package/scripts/init/init-actions.ts +0 -6
- package/scripts/init/init-ai-copy.ts +10 -36
- package/scripts/init/init-bootstrap.ts +9 -8
- package/scripts/init/init-dry-run-report.ts +1 -1
- package/scripts/init/init-dry-run.ts +1 -1
- package/scripts/init/init-file-action.ts +7 -9
- package/scripts/init/init-logic-json-merge.ts +2 -2
- package/scripts/init/init-logic-migrate.ts +9 -82
- package/scripts/init/init-logic.ts +3 -2
- package/scripts/init/init-main.ts +12 -0
- package/scripts/init/init.ts +5 -12
- package/scripts/init/kit-development-versions.ts +3 -7
- package/scripts/init/kit-written-paths.ts +2 -2
- package/scripts/init/project-profile.ts +5 -4
- package/scripts/init/tsconfig-preset-migration.ts +2 -1
- package/scripts/init/vscode-tasks.ts +1 -1
- package/scripts/issue/aggregation-split.ts +52 -0
- package/scripts/issue/defect-origin-cli.ts +106 -0
- package/scripts/issue/defect-origin-line.ts +78 -0
- package/scripts/issue/defect-origin-main.ts +11 -0
- package/scripts/issue/defect-origin.ts +114 -0
- package/scripts/issue/defect-rate-cli.ts +38 -179
- package/scripts/issue/defect-rate.ts +0 -16
- package/scripts/issue/defect-report-cli.ts +128 -0
- package/scripts/issue/defect-report-format.ts +56 -0
- package/scripts/issue/defect-report-main.ts +11 -0
- package/scripts/issue/defect-report.ts +160 -0
- package/scripts/issue/effect-audit-cli.ts +178 -0
- package/scripts/issue/effect-audit.ts +185 -0
- package/scripts/issue/expected-effect-lint.ts +65 -9
- package/scripts/issue/git-next-issues.ts +5 -0
- package/scripts/issue/issue-already-done-cli.ts +62 -0
- package/scripts/issue/issue-body-or-comment.ts +74 -0
- package/scripts/issue/issue-cite-cli.ts +1 -12
- package/scripts/issue/issue-cite-main.ts +12 -0
- package/scripts/issue/issue-classification.ts +13 -7
- package/scripts/issue/issue-closing-pr.ts +8 -1
- package/scripts/issue/issue-comment-cli.ts +10 -24
- package/scripts/issue/issue-comment-main.ts +12 -0
- package/scripts/issue/issue-evidence-exit.ts +102 -0
- package/scripts/issue/issue-file-cap.ts +58 -0
- package/scripts/issue/issue-file-cli.ts +131 -36
- package/scripts/issue/issue-file-deferral.ts +52 -0
- package/scripts/issue/issue-file-fold.ts +29 -10
- package/scripts/issue/issue-file-interrupt.ts +85 -0
- package/scripts/issue/issue-file-lane-hint.ts +30 -0
- package/scripts/issue/issue-file.ts +56 -19
- package/scripts/issue/issue-fold-cli.ts +2 -11
- package/scripts/issue/issue-fold-main.ts +12 -0
- package/scripts/issue/issue-labels.ts +97 -89
- package/scripts/issue/issue-lint-cli.ts +29 -12
- package/scripts/issue/issue-lint-main.ts +12 -0
- package/scripts/issue/issue-measured-cli.ts +34 -0
- package/scripts/issue/issue-measured-close.ts +58 -0
- package/scripts/issue/issue-merged.ts +19 -2
- package/scripts/issue/issue-not-before-label.ts +135 -0
- package/scripts/issue/issue-not-before.ts +114 -0
- package/scripts/issue/issue-number-shape.ts +15 -1
- package/scripts/issue/issue-park.ts +28 -0
- package/scripts/issue/issue-plan-cli.ts +151 -0
- package/scripts/issue/issue-priority-cli.ts +60 -0
- package/scripts/issue/issue-priority-raise.ts +55 -0
- package/scripts/issue/issue-priority.ts +282 -0
- package/scripts/issue/issue-rank.ts +27 -4
- package/scripts/issue/issue-read-cli.ts +35 -16
- package/scripts/issue/issue-read-main.ts +12 -0
- package/scripts/issue/issue-read.ts +62 -13
- package/scripts/issue/issue-release-cli.ts +0 -10
- package/scripts/issue/issue-release-main.ts +13 -0
- package/scripts/issue/issue-release.ts +7 -12
- package/scripts/issue/issue-sample-gate.ts +213 -0
- package/scripts/issue/issue-sample-prime.ts +127 -0
- package/scripts/issue/issue-sample-required.ts +57 -0
- package/scripts/issue/issue-sample-source.ts +77 -0
- package/scripts/issue/issue-scout-cli.ts +0 -11
- package/scripts/issue/issue-scout-main.ts +14 -0
- package/scripts/issue/issue-search.ts +124 -0
- package/scripts/issue/issue-state-cli.ts +0 -10
- package/scripts/issue/issue-state-main.ts +12 -0
- package/scripts/issue/issue-state.ts +13 -1
- package/scripts/issue/issue-template-section.ts +43 -0
- package/scripts/issue/issue-watch-diff.ts +87 -16
- package/scripts/issue/issue-watch-hook.ts +11 -2
- package/scripts/issue/issue-watch.ts +55 -11
- package/scripts/issue/issue-wip.ts +2 -7
- package/scripts/issue/markdown-section.ts +1 -0
- package/scripts/issue/measure-declaration.ts +121 -0
- package/scripts/issue/measure-rerun-cli.ts +7 -65
- package/scripts/issue/plan-consumers-cli.ts +39 -0
- package/scripts/issue/plan-consumers-main.ts +11 -0
- package/scripts/issue/plan-consumers-section.ts +76 -0
- package/scripts/issue/plan-consumers.ts +127 -0
- package/scripts/issue/reproduction-measure.ts +3 -1
- package/scripts/issue/size-estimate.ts +90 -0
- package/scripts/issue/trusted-measure.ts +84 -0
- package/scripts/josh/agent-session-environment.ts +1 -1
- package/scripts/josh/command-usage.ts +17 -44
- package/scripts/josh/durable-state-migrate.ts +105 -0
- package/scripts/josh/durable-state.ts +112 -0
- package/scripts/josh/file-map-stamp.ts +49 -16
- package/scripts/josh/hook-decision.ts +32 -20
- package/scripts/josh/josh-aliases.ts +95 -0
- package/scripts/josh/josh-command-map.ts +1 -79
- package/scripts/josh/josh-command-types.ts +12 -6
- package/scripts/josh/josh-commands-agent-hooks.ts +83 -0
- package/scripts/josh/josh-commands-ai.ts +160 -161
- package/scripts/josh/josh-commands-backlog.ts +82 -16
- package/scripts/josh/josh-commands-clone.ts +1 -0
- package/scripts/josh/josh-commands-development.ts +142 -101
- package/scripts/josh/josh-commands-document.ts +43 -1
- package/scripts/josh/josh-commands-epic.ts +171 -0
- package/scripts/josh/josh-commands-hooks.ts +25 -2
- package/scripts/josh/josh-commands-issue-write.ts +200 -0
- package/scripts/josh/josh-commands-issue.ts +156 -24
- package/scripts/josh/josh-commands-lane.ts +187 -3
- package/scripts/josh/josh-commands-lint.ts +34 -10
- package/scripts/josh/josh-commands-maintenance.ts +127 -4
- package/scripts/josh/josh-commands-pause.ts +29 -0
- package/scripts/josh/josh-commands-progress.ts +87 -0
- package/scripts/josh/josh-commands-project.ts +138 -9
- package/scripts/josh/josh-commands-review.ts +159 -0
- package/scripts/josh/josh-commands-run.ts +211 -23
- package/scripts/josh/josh-commands-ship.ts +217 -0
- package/scripts/josh/josh-commands-split.ts +9 -0
- package/scripts/josh/josh-commands-test-check.ts +80 -0
- package/scripts/josh/josh-commands-versioning.ts +49 -2
- package/scripts/josh/josh-commands-workflow.ts +144 -6
- package/scripts/josh/josh-environment-file.ts +43 -3
- package/scripts/josh/josh-in-process.ts +2 -2
- package/scripts/josh/josh-logic.ts +11 -16
- package/scripts/josh/josh-run.ts +19 -1
- package/scripts/josh/package-directory.ts +2 -4
- package/scripts/josh/process-identity.ts +13 -4
- package/scripts/josh/run-record-path.ts +15 -0
- package/scripts/josh/session-language-cli.ts +4 -8
- package/scripts/josh/session-language-main.ts +13 -0
- package/scripts/josh/session-language.ts +6 -1
- package/scripts/josh/shared-cache.ts +90 -0
- package/scripts/josh/stamp-file.ts +20 -17
- package/scripts/lane/lane-adopt-cli.ts +98 -0
- package/scripts/lane/lane-adopt.ts +208 -0
- package/scripts/lane/lane-await.ts +56 -20
- package/scripts/lane/lane-baseline.ts +123 -0
- package/scripts/lane/lane-breakdown-cli.ts +64 -0
- package/scripts/lane/lane-breakdown-implement.ts +170 -0
- package/scripts/lane/lane-breakdown-laps.ts +107 -0
- package/scripts/lane/lane-breakdown-pinned.ts +76 -0
- package/scripts/lane/lane-breakdown-text.ts +145 -0
- package/scripts/lane/lane-breakdown.ts +239 -0
- package/scripts/lane/lane-cache.ts +5 -30
- package/scripts/lane/lane-capacity.ts +14 -23
- package/scripts/lane/lane-check-stats.ts +84 -22
- package/scripts/lane/lane-child-invocation.ts +17 -2
- package/scripts/lane/lane-child-mark-keys.ts +12 -0
- package/scripts/lane/lane-child-marker.ts +20 -1
- package/scripts/lane/lane-ci-path-stats.ts +73 -0
- package/scripts/lane/lane-claim-stats.ts +84 -0
- package/scripts/lane/lane-cli.ts +15 -5
- package/scripts/lane/lane-close.ts +91 -18
- package/scripts/lane/lane-core-wait-stats.ts +66 -0
- package/scripts/lane/lane-dispatch-log.ts +3 -3
- package/scripts/lane/lane-dispatch.ts +26 -5
- package/scripts/lane/lane-gap-stats.ts +157 -0
- package/scripts/lane/lane-guard-policy.ts +7 -1
- package/scripts/lane/lane-handoff.ts +69 -1
- package/scripts/lane/lane-held-stats.ts +129 -0
- package/scripts/lane/lane-implement-stats.ts +207 -0
- package/scripts/lane/lane-implement-subagents.ts +90 -0
- package/scripts/lane/lane-install.ts +4 -11
- package/scripts/lane/lane-investigation-switch.ts +16 -0
- package/scripts/lane/lane-launch-cli.ts +0 -9
- package/scripts/lane/lane-launch-main.ts +12 -0
- package/scripts/lane/lane-ledger-kind.ts +31 -0
- package/scripts/lane/lane-ledger-schema-ship.ts +49 -0
- package/scripts/lane/lane-ledger-schema.ts +349 -0
- package/scripts/lane/lane-ledger-write.ts +257 -0
- package/scripts/lane/lane-ledger.ts +56 -233
- package/scripts/lane/lane-limit-cli.ts +12 -1
- package/scripts/lane/lane-load.ts +1 -1
- package/scripts/lane/lane-measure-cli.ts +193 -30
- package/scripts/lane/lane-net-read.ts +44 -0
- package/scripts/lane/lane-net-time.ts +212 -0
- package/scripts/lane/lane-open.ts +25 -8
- package/scripts/lane/lane-output.ts +2 -4
- package/scripts/lane/lane-overrun-prompt.ts +147 -0
- package/scripts/lane/lane-overrun.ts +274 -0
- package/scripts/lane/lane-parked.ts +3 -3
- package/scripts/lane/lane-paths.ts +24 -1
- package/scripts/lane/lane-pause-cli.ts +133 -0
- package/scripts/lane/lane-pause.ts +158 -0
- package/scripts/lane/lane-paused-spans.ts +97 -0
- package/scripts/lane/lane-plan-check.ts +207 -0
- package/scripts/lane/lane-plan-cli.ts +41 -0
- package/scripts/lane/lane-plan.ts +144 -0
- package/scripts/lane/lane-process-table.ts +166 -0
- package/scripts/lane/lane-reap-settle.ts +124 -0
- package/scripts/lane/lane-reap.ts +50 -15
- package/scripts/lane/lane-registry.ts +38 -4
- package/scripts/lane/lane-relaunch.ts +1 -1
- package/scripts/lane/lane-residents.ts +162 -0
- package/scripts/lane/lane-restart.ts +22 -2
- package/scripts/lane/lane-round-one-stats.ts +51 -0
- package/scripts/lane/lane-round-two-stats.ts +49 -0
- package/scripts/lane/lane-sampler.ts +26 -3
- package/scripts/lane/lane-session-action.ts +112 -23
- package/scripts/lane/lane-session-broker.ts +146 -37
- package/scripts/lane/lane-session-reread-main.ts +14 -0
- package/scripts/lane/lane-session-reread.ts +51 -0
- package/scripts/lane/lane-ship-lap-stats.ts +74 -0
- package/scripts/lane/lane-sleep.ts +58 -0
- package/scripts/lane/lane-snapshot-trace.ts +84 -0
- package/scripts/lane/lane-spans.ts +51 -0
- package/scripts/lane/lane-spent.ts +7 -4
- package/scripts/lane/lane-split-stats.ts +28 -0
- package/scripts/lane/lane-stage-stats.ts +20 -3
- package/scripts/lane/lane-state.ts +334 -0
- package/scripts/lane/lane-stats-tables.ts +58 -0
- package/scripts/lane/lane-stats.ts +74 -4
- package/scripts/lane/lane-stop-stats.ts +145 -37
- package/scripts/lane/lane-tail-stats.ts +32 -0
- package/scripts/lane/lane-test-related-stats.ts +127 -0
- package/scripts/lane/lane-transcript-calls.ts +202 -0
- package/scripts/lane/lane-transcript-stats.ts +200 -0
- package/scripts/lane/lane-vacant.ts +13 -3
- package/scripts/lane/lane-value-cell.ts +72 -0
- package/scripts/lane/lane-value.ts +118 -0
- package/scripts/lane/lane-withdraw-cli.ts +5 -4
- package/scripts/lane/lane-withdraw-closed.ts +124 -0
- package/scripts/lane/lane-withdraw.ts +149 -71
- package/scripts/lane/lane-yield.ts +85 -0
- package/scripts/lane/openai-lane-ship.ts +12 -11
- package/scripts/lane/openai-lane-supervisor-decision.ts +6 -8
- package/scripts/lane/openai-lane-supervisor-owner.ts +5 -8
- package/scripts/lane/openai-lane-supervisor.ts +5 -4
- package/scripts/lane/process-directories.ts +70 -0
- package/scripts/lane/process-lane-marks.ts +94 -0
- package/scripts/lib/atomic-write.ts +62 -0
- package/scripts/lib/buffered-process.ts +12 -5
- package/scripts/lib/cli-flags.ts +53 -0
- package/scripts/lib/figure-format.ts +63 -0
- package/scripts/lib/json-value.ts +9 -1
- package/scripts/lib/package-manifest.ts +35 -0
- package/scripts/lib/poll.ts +38 -9
- package/scripts/lib/read-file.ts +3 -1
- package/scripts/lib/settled-together.ts +10 -0
- package/scripts/lib/shell-quote.ts +21 -0
- package/scripts/lib/stamped-memo.ts +63 -0
- package/scripts/lib/stdout-on-stderr.ts +24 -0
- package/scripts/lib/timeouts.ts +9 -0
- package/scripts/lib/token-shape.ts +111 -0
- package/scripts/lib/transcript-record.ts +91 -0
- package/scripts/lines/effective-limit.ts +1 -1
- package/scripts/lint/eslint-cache-dependencies.ts +145 -0
- package/scripts/lint/eslint-daemon-sources.ts +79 -0
- package/scripts/lint/eslint-daemon.ts +304 -0
- package/scripts/lint/eslint-warm-cli.ts +7 -0
- package/scripts/lint/eslint-warm.ts +66 -0
- package/scripts/lint/format.ts +11 -2
- package/scripts/lint/import-graph.ts +409 -0
- package/scripts/lint/lint-gate-scope.ts +102 -0
- package/scripts/lint/lint-parallel-main.ts +19 -0
- package/scripts/lint/lint-parallel.ts +113 -33
- package/scripts/lint/lint-related-scope.ts +30 -24
- package/scripts/lint/lint-related.ts +183 -30
- package/scripts/lint/rename-cli.ts +179 -0
- package/scripts/lint/rename-identifier.ts +192 -0
- package/scripts/lint/type-only-imports.ts +58 -0
- package/scripts/notify/confirmation-options.ts +1 -2
- package/scripts/notify/telegram-notify.ts +32 -23
- package/scripts/notify/telegram-test-logic.ts +0 -1
- package/scripts/notify/telegram-test-main.ts +8 -0
- package/scripts/notify/telegram-test.ts +2 -6
- package/scripts/observations/observation-ledger.ts +13 -0
- package/scripts/observations/observation-record.ts +42 -16
- package/scripts/observations/observations-flush-landing.ts +5 -3
- package/scripts/observations/observations-flush.ts +38 -10
- package/scripts/overrides/overrides-check.ts +11 -6
- package/scripts/overrides/overrides-files.ts +2 -1
- package/scripts/overrides/overrides-logic.ts +3 -6
- package/scripts/package/verify-optional-eslint-install.ts +8 -6
- package/scripts/propagate/propagate-publish.ts +2 -7
- package/scripts/propagate/propagate-targets.ts +4 -12
- package/scripts/refactor/import-graph.ts +9 -7
- package/scripts/release/github-release-runs.ts +17 -6
- package/scripts/release/release-approval-prune.ts +24 -0
- package/scripts/release/release-history.ts +1 -3
- package/scripts/release/release-progress.ts +42 -22
- package/scripts/release/release-publish-run.ts +39 -0
- package/scripts/release/release-publish.ts +6 -6
- package/scripts/release/release-scope-cli.ts +0 -10
- package/scripts/release/release-scope-main.ts +12 -0
- package/scripts/repo/repo-setting.ts +3 -6
- package/scripts/repo/required-checks-logic.ts +10 -16
- package/scripts/repo/ruleset-check.ts +4 -3
- package/scripts/report/markdown-shape.ts +28 -0
- package/scripts/report/report-format-reference.ts +17 -1
- package/scripts/report/report-labels.ts +166 -0
- package/scripts/report/report-lint-child-summary.ts +94 -0
- package/scripts/report/report-lint-cli.ts +29 -7
- package/scripts/report/report-lint.ts +85 -128
- package/scripts/report/report-template-cli.ts +59 -0
- package/scripts/report/report-template.ts +112 -0
- package/scripts/review/acceptance-map.ts +1 -0
- package/scripts/review/prose-stale-cli.ts +88 -0
- package/scripts/review/prose-stale-scan.ts +152 -0
- package/scripts/review/removed-tests-check.ts +86 -0
- package/scripts/review/removed-tests.ts +149 -0
- package/scripts/review/review-attest.ts +73 -23
- package/scripts/review/review-brief-cli.ts +138 -23
- package/scripts/review/review-brief-main.ts +12 -0
- package/scripts/review/review-brief-paths.ts +22 -0
- package/scripts/review/review-brief.ts +45 -10
- package/scripts/review/review-code-tree.ts +10 -6
- package/scripts/review/review-comment-carry.ts +47 -0
- package/scripts/review/review-comment-round.ts +111 -30
- package/scripts/review/review-finding-ledger.ts +135 -18
- package/scripts/review/review-finding-text.ts +43 -0
- package/scripts/review/review-interaction.ts +105 -0
- package/scripts/review/review-lane-handover.ts +68 -0
- package/scripts/review/review-lint-cli.ts +57 -0
- package/scripts/review/review-lint-findings.ts +92 -0
- package/scripts/review/review-lint-sections.ts +80 -0
- package/scripts/review/review-lint.ts +221 -0
- package/scripts/review/review-prior-findings.ts +102 -0
- package/scripts/review/review-readers-scan.ts +165 -0
- package/scripts/review/review-record-cli.ts +236 -74
- package/scripts/review/review-record-code-round.ts +55 -0
- package/scripts/review/review-record-comment.ts +60 -0
- package/scripts/review/review-record-interaction.ts +35 -0
- package/scripts/review/review-record-main.ts +12 -0
- package/scripts/review/review-record-pinned.ts +108 -0
- package/scripts/review/review-record.ts +25 -1
- package/scripts/review/review-reviewed-tree.ts +307 -0
- package/scripts/review/review-round-one-blobs.ts +221 -0
- package/scripts/review/review-round-one-closure.ts +62 -0
- package/scripts/review/review-round-reuse.ts +106 -0
- package/scripts/review/review-round2-cli.ts +135 -36
- package/scripts/review/review-round2-skip-comment.ts +55 -0
- package/scripts/review/review-round2.ts +103 -19
- package/scripts/review/review-stamps.ts +23 -1
- package/scripts/review/review-stop-log.ts +110 -0
- package/scripts/review/review-stops-cli.ts +86 -0
- package/scripts/review/review-submit-cli.ts +101 -0
- package/scripts/review/review-tree.ts +6 -17
- package/scripts/review/review-untouched-readers.ts +146 -0
- package/scripts/review/test-titles.ts +118 -0
- package/scripts/rules/agent-model.ts +9 -1
- package/scripts/rules/bash-triggers.ts +49 -6
- package/scripts/rules/concise-reply.ts +88 -0
- package/scripts/rules/credential-body.ts +77 -0
- package/scripts/rules/decision-oracle-batch.ts +9 -1
- package/scripts/rules/decision-oracle.ts +3 -3
- package/scripts/rules/delivered-rules.ts +115 -18
- package/scripts/rules/destructive-command.ts +11 -12
- package/scripts/rules/direct-filing.ts +10 -2
- package/scripts/rules/direct-issue-comment.ts +139 -0
- package/scripts/rules/direct-issue-read.ts +191 -0
- package/scripts/rules/direct-pr-create.ts +72 -26
- package/scripts/rules/early-heartbeat.ts +4 -1
- package/scripts/rules/edit-tool.ts +27 -0
- package/scripts/rules/file-body.ts +7 -0
- package/scripts/rules/file-edit-rows.ts +17 -0
- package/scripts/rules/file-rewrite.ts +146 -0
- package/scripts/rules/firing-point.ts +3 -2
- package/scripts/rules/gh-api.ts +128 -7
- package/scripts/rules/gh-repo-selector.ts +84 -0
- package/scripts/rules/git-argv.ts +72 -14
- package/scripts/rules/git-force.ts +14 -4
- package/scripts/rules/guard-remedy.ts +17 -4
- package/scripts/rules/implementation-cut-verdict.ts +1 -1
- package/scripts/rules/implementation-cut.ts +68 -27
- package/scripts/rules/index-guard.ts +8 -1
- package/scripts/rules/investigator-foreground.ts +231 -0
- package/scripts/rules/issue-citation.ts +15 -60
- package/scripts/rules/issue-comments.ts +18 -5
- package/scripts/rules/josh-git-bare.ts +7 -0
- package/scripts/rules/lane-background.ts +103 -33
- package/scripts/rules/lane-carry-conflict.ts +6 -0
- package/scripts/rules/lane-direct-tool.ts +172 -0
- package/scripts/rules/lane-interactive-ask.ts +12 -2
- package/scripts/rules/lane-park.ts +49 -25
- package/scripts/rules/lane-spilled-read.ts +90 -0
- package/scripts/rules/lane-split-park.ts +11 -3
- package/scripts/rules/lane-switch-main.ts +11 -4
- package/scripts/rules/last-prompt.ts +20 -47
- package/scripts/rules/oracle-consulted.ts +11 -1
- package/scripts/rules/oracle-firing.ts +1 -0
- package/scripts/rules/permission-guards.ts +7 -0
- package/scripts/rules/piped-verification-shapes.ts +110 -0
- package/scripts/rules/piped-verification.ts +68 -18
- package/scripts/rules/poll-loop.ts +78 -8
- package/scripts/rules/pr-merge.ts +123 -0
- package/scripts/rules/pre-gate-cut.ts +3 -3
- package/scripts/rules/protected-files.ts +113 -22
- package/scripts/rules/raw-field-body.ts +6 -0
- package/scripts/rules/reply-language.ts +3 -17
- package/scripts/rules/reply-prose.ts +34 -0
- package/scripts/rules/repo-admin.ts +132 -0
- package/scripts/rules/reviewer-foreground.ts +88 -0
- package/scripts/rules/round-one-check-related.ts +120 -0
- package/scripts/rules/rule-body-guard.ts +13 -15
- package/scripts/rules/rule-list.ts +9 -28
- package/scripts/rules/rule-value-cache.ts +57 -14
- package/scripts/rules/rule-value-candidates.ts +84 -0
- package/scripts/rules/rule-value-cli.ts +106 -39
- package/scripts/rules/rule-value.ts +18 -5
- package/scripts/rules/run-tail-rule.ts +1 -1
- package/scripts/rules/sed-in-place.ts +196 -0
- package/scripts/rules/shell-segments.ts +43 -0
- package/scripts/rules/stop-rule-rows.ts +52 -0
- package/scripts/rules/stop-rules.ts +36 -62
- package/scripts/rules/test-declared-commit.ts +11 -1
- package/scripts/rules/third-party-write.ts +115 -21
- package/scripts/rules/timed-rerun.ts +69 -0
- package/scripts/rules/turn-filings.ts +90 -0
- package/scripts/rules/worktree-guard.ts +32 -7
- package/scripts/run/board/run-board-app-name.ts +23 -0
- package/scripts/run/board/run-board-cli.ts +65 -32
- package/scripts/run/board/run-board-earlier.ts +94 -0
- package/scripts/run/board/run-board-ending-reason.ts +71 -0
- package/scripts/run/board/run-board-estimate-schedule.ts +103 -0
- package/scripts/run/board/run-board-estimate.ts +98 -0
- package/scripts/run/board/run-board-fit.ts +177 -37
- package/scripts/run/board/run-board-fold.ts +123 -0
- package/scripts/run/board/run-board-found.ts +134 -0
- package/scripts/run/board/run-board-fresh.ts +2 -2
- package/scripts/run/board/run-board-gather-live.ts +29 -0
- package/scripts/run/board/run-board-gather-thread.ts +189 -0
- package/scripts/run/board/run-board-gather-worker.ts +29 -0
- package/scripts/run/board/run-board-gather.ts +187 -0
- package/scripts/run/board/run-board-github.ts +118 -38
- package/scripts/run/board/run-board-header.ts +90 -20
- package/scripts/run/board/run-board-keys.ts +58 -0
- package/scripts/run/board/run-board-kind.ts +20 -6
- package/scripts/run/board/run-board-labels.ts +126 -71
- package/scripts/run/board/run-board-lane-state.ts +109 -0
- package/scripts/run/board/run-board-lane-time.ts +123 -0
- package/scripts/run/board/run-board-layout.ts +239 -60
- package/scripts/run/board/run-board-length.ts +52 -0
- package/scripts/run/board/run-board-link.ts +15 -2
- package/scripts/run/board/run-board-machine.ts +8 -4
- package/scripts/run/board/run-board-main.ts +12 -0
- package/scripts/run/board/run-board-notes.ts +59 -32
- package/scripts/run/board/run-board-now.ts +1 -1
- package/scripts/run/board/run-board-operation.ts +19 -35
- package/scripts/run/board/run-board-phase.ts +3 -6
- package/scripts/run/board/run-board-plan-shared.ts +115 -0
- package/scripts/run/board/run-board-plan.ts +56 -4
- package/scripts/run/board/run-board-planning.ts +45 -0
- package/scripts/run/board/run-board-priority.ts +44 -0
- package/scripts/run/board/run-board-process-groups.ts +195 -0
- package/scripts/run/board/run-board-read.ts +197 -28
- package/scripts/run/board/run-board-reason.ts +247 -51
- package/scripts/run/board/run-board-released.ts +35 -0
- package/scripts/run/board/run-board-render-checks.ts +42 -7
- package/scripts/run/board/run-board-render-condition.ts +96 -0
- package/scripts/run/board/run-board-render-drawn.ts +78 -0
- package/scripts/run/board/run-board-render-foot.ts +59 -0
- package/scripts/run/board/run-board-render-found.ts +157 -0
- package/scripts/run/board/run-board-render-icon.ts +35 -0
- package/scripts/run/board/run-board-render-lanes.ts +145 -0
- package/scripts/run/board/run-board-render-lead.ts +89 -0
- package/scripts/run/board/run-board-render-legend.ts +136 -48
- package/scripts/run/board/run-board-render-notes.ts +156 -29
- package/scripts/run/board/run-board-render-processes.ts +196 -0
- package/scripts/run/board/run-board-render-section.ts +119 -0
- package/scripts/run/board/run-board-render-slot.ts +3 -36
- package/scripts/run/board/run-board-render-tail.ts +115 -48
- package/scripts/run/board/run-board-render-time.ts +56 -0
- package/scripts/run/board/run-board-render-title.ts +117 -24
- package/scripts/run/board/run-board-render-waits.ts +104 -20
- package/scripts/run/board/run-board-render.ts +264 -258
- package/scripts/run/board/run-board-roots.ts +54 -0
- package/scripts/run/board/run-board-row-yield.ts +9 -4
- package/scripts/run/board/run-board-setup.ts +1 -12
- package/scripts/run/board/run-board-snapshot.ts +111 -0
- package/scripts/run/board/run-board-spin.ts +3 -5
- package/scripts/run/board/run-board-state.ts +22 -33
- package/scripts/run/board/run-board-status.ts +149 -71
- package/scripts/run/board/run-board-thanks-read.ts +2 -2
- package/scripts/run/board/run-board-tick.ts +158 -114
- package/scripts/run/board/run-board-usage-board.ts +78 -0
- package/scripts/run/board/run-board-usage-lanes.ts +113 -0
- package/scripts/run/board/run-board-usage-listing.ts +93 -0
- package/scripts/run/board/run-board-usage-read.ts +120 -150
- package/scripts/run/board/run-board-usage-rusage.ts +19 -7
- package/scripts/run/board/run-board-usage-text.ts +139 -51
- package/scripts/run/board/run-board-usage-top.ts +102 -0
- package/scripts/run/board/run-board-usage.ts +89 -72
- package/scripts/run/board/run-board-usual.ts +20 -9
- package/scripts/run/carry/run-carry-args.ts +4 -7
- package/scripts/run/carry/run-carry-conversation.ts +1 -1
- package/scripts/run/carry/run-carry-ended.ts +3 -2
- package/scripts/run/carry/run-carry.ts +12 -6
- package/scripts/run/cut/run-cut-cli.ts +33 -133
- package/scripts/run/cut/run-cut-digest.ts +152 -0
- package/scripts/run/cut/run-cut-handoff.ts +54 -10
- package/scripts/run/cut/run-cut-report.ts +24 -3
- package/scripts/run/cut/run-cut-resume.ts +129 -0
- package/scripts/run/cut/run-cut-review.ts +105 -0
- package/scripts/run/cut/run-cut.ts +18 -7
- package/scripts/run/detached-launch.ts +1 -1
- package/scripts/run/entry/run-entry-cli.ts +88 -19
- package/scripts/run/entry/run-entry-spill.ts +83 -0
- package/scripts/run/entry/run-entry-stop.ts +5 -1
- package/scripts/run/entry/run-entry-trust.ts +91 -0
- package/scripts/run/event/run-event-baseline.ts +56 -0
- package/scripts/run/event/run-event-cli.ts +1 -5
- package/scripts/run/event/run-event-filed.ts +18 -6
- package/scripts/run/event/run-event-follow.ts +2 -3
- package/scripts/run/event/run-event-overrun.ts +197 -0
- package/scripts/run/event/run-event-render.ts +10 -10
- package/scripts/run/event/run-event-scope.ts +2 -2
- package/scripts/run/event/run-event-stream-emit.ts +82 -22
- package/scripts/run/event/run-event-stream.ts +58 -10
- package/scripts/run/hold/run-hold-adopt.ts +65 -0
- package/scripts/run/hold/run-hold-cli.ts +93 -22
- package/scripts/run/hold/run-hold-main.ts +12 -0
- package/scripts/run/hold/run-hold-member.ts +37 -0
- package/scripts/run/hold/run-stop-notify.ts +178 -0
- package/scripts/run/merge/run-merge-auth.ts +31 -0
- package/scripts/run/merge/run-merge-cap.ts +57 -0
- package/scripts/run/merge/run-merge-cli.ts +119 -62
- package/scripts/run/merge/run-merge-close.ts +74 -0
- package/scripts/run/merge/run-merge-collect.ts +6 -13
- package/scripts/run/merge/run-merge-driver.ts +71 -0
- package/scripts/run/merge/run-merge-main.ts +12 -0
- package/scripts/run/merge/run-merge-outcome.ts +25 -0
- package/scripts/run/merge/run-merge-restart.ts +39 -0
- package/scripts/run/merge/run-merge-ship.ts +33 -7
- package/scripts/run/merge/run-merge-signals.ts +66 -25
- package/scripts/run/merge/run-merge-steps.ts +162 -107
- package/scripts/run/merge/run-merge-usage-limit.ts +53 -0
- package/scripts/run/merge/run-merge-withdrawn.ts +53 -0
- package/scripts/run/merge/run-merge.ts +76 -48
- package/scripts/run/park/run-park-cli.ts +91 -0
- package/scripts/run/park/run-park.ts +88 -0
- package/scripts/run/park/run-stalled.ts +68 -0
- package/scripts/run/pause/run-pause-cli.ts +73 -0
- package/scripts/run/pause/run-pause.ts +251 -0
- package/scripts/run/progress/run-progress-cli.ts +4 -12
- package/scripts/run/progress/run-progress-clock.ts +1 -1
- package/scripts/run/progress/run-progress-config.ts +6 -14
- package/scripts/run/progress/run-progress-main.ts +12 -0
- package/scripts/run/progress/run-progress.ts +1 -4
- package/scripts/run/review/run-review-cli.ts +306 -20
- package/scripts/run/review/run-review-early-push.ts +121 -0
- package/scripts/run/review/run-review-join-read.ts +94 -0
- package/scripts/run/review/run-review-pinned-accepted.ts +126 -0
- package/scripts/run/review/run-review-pinned-join.ts +216 -0
- package/scripts/run/review/run-review-pinned-steps.ts +383 -0
- package/scripts/run/review/run-review-pinned-tree.ts +37 -0
- package/scripts/run/review/run-review-pinned.ts +53 -0
- package/scripts/run/review/run-review-steps.ts +70 -34
- package/scripts/run/review/run-review.ts +28 -7
- package/scripts/run/run-ending.ts +1 -0
- package/scripts/run/run-invocation.ts +5 -6
- package/scripts/run/run-liveness-cli.ts +6 -8
- package/scripts/run/run-liveness.ts +60 -29
- package/scripts/run/run-next.ts +1 -1
- package/scripts/run/run-parent-cut-hook.ts +3 -4
- package/scripts/run/run-preflight.ts +18 -3
- package/scripts/run/run-prep-cli.ts +1 -10
- package/scripts/run/run-prep-locate.ts +7 -50
- package/scripts/run/run-prep-main.ts +12 -0
- package/scripts/run/run-prep.ts +7 -0
- package/scripts/run/run-report-cli.ts +101 -13
- package/scripts/run/run-report-handoff.ts +114 -0
- package/scripts/run/run-stage-read.ts +2 -6
- package/scripts/run/run-step-cli.ts +17 -5
- package/scripts/run/run-step-lane-plan.ts +27 -0
- package/scripts/run/run-step-section.ts +26 -7
- package/scripts/run/run-step.ts +6 -3
- package/scripts/run/run-stranded-detect.ts +13 -0
- package/scripts/run/run-watcher-guard-cli.ts +1 -1
- package/scripts/run/run-watcher-guard.ts +1 -1
- package/scripts/run/ship/run-ship-args.ts +140 -0
- package/scripts/run/ship/run-ship-body-draft.ts +110 -0
- package/scripts/run/ship/run-ship-brokered-review.ts +106 -0
- package/scripts/run/ship/run-ship-cli.ts +181 -166
- package/scripts/run/ship/run-ship-conflict-probe.ts +59 -0
- package/scripts/run/ship/run-ship-detach.ts +29 -12
- package/scripts/run/ship/run-ship-handover.ts +106 -0
- package/scripts/run/ship/run-ship-infra-retry.ts +74 -0
- package/scripts/run/ship/run-ship-lap.ts +63 -0
- package/scripts/run/ship/run-ship-next.ts +44 -27
- package/scripts/run/ship/run-ship-overlap.ts +49 -7
- package/scripts/run/ship/run-ship-place.ts +103 -0
- package/scripts/run/ship/run-ship-planned.ts +92 -0
- package/scripts/run/ship/run-ship-pre-detach-pinned.ts +197 -0
- package/scripts/run/ship/run-ship-pre-detach-timed.ts +42 -0
- package/scripts/run/ship/run-ship-pre-detach.ts +144 -33
- package/scripts/run/ship/run-ship-preflight.ts +150 -33
- package/scripts/run/ship/run-ship-probe.ts +28 -6
- package/scripts/run/ship/run-ship-relaunch-cap.ts +106 -0
- package/scripts/run/ship/run-ship-relaunch.ts +51 -0
- package/scripts/run/ship/run-ship-removed-rows.ts +61 -0
- package/scripts/run/ship/run-ship-return.ts +183 -25
- package/scripts/run/ship/run-ship-review-reason.ts +24 -0
- package/scripts/run/ship/run-ship-review-steps.ts +296 -171
- package/scripts/run/ship/run-ship-review.ts +222 -35
- package/scripts/run/ship/run-ship-reviewer.ts +303 -0
- package/scripts/run/ship/run-ship-scoped.ts +39 -10
- package/scripts/run/ship/run-ship-stage.ts +101 -16
- package/scripts/run/ship/run-ship-steps.ts +68 -17
- package/scripts/run/ship/run-ship-stop-cause.ts +176 -0
- package/scripts/run/ship/run-ship-stop-context.ts +50 -13
- package/scripts/run/ship/run-ship-stop-text.ts +11 -6
- package/scripts/run/ship/run-ship-sync.ts +212 -34
- package/scripts/run/ship/run-ship-synced-scope.ts +178 -0
- package/scripts/run/ship/run-ship-wait-cli.ts +145 -0
- package/scripts/run/ship/run-ship-waiter.ts +114 -0
- package/scripts/run/ship/run-ship.ts +44 -2
- package/scripts/run/tidy/run-tidy-cli.ts +0 -4
- package/scripts/run/tidy/run-tidy-lanes.ts +3 -0
- package/scripts/run/tidy/run-tidy-main.ts +8 -0
- package/scripts/run/wake/run-wake-caffeinate.ts +48 -0
- package/scripts/run/wake/run-wake-cli.ts +121 -209
- package/scripts/run/wake/run-wake-code.ts +125 -0
- package/scripts/run/wake/run-wake-driver.ts +22 -9
- package/scripts/run/wake/run-wake-finish.ts +137 -0
- package/scripts/run/wake/run-wake-loop.ts +36 -3
- package/scripts/run/wake/run-wake-main.ts +13 -0
- package/scripts/run/wake/run-wake-ports.ts +98 -0
- package/scripts/run/wake/run-wake-session.ts +2 -0
- package/scripts/run/wake/run-wake-takeover.ts +66 -0
- package/scripts/run/wake/run-wake.ts +5 -3
- package/scripts/safe-chain/ci-installer-pin.ts +49 -8
- package/scripts/safe-chain/pack-hook.ts +2 -2
- package/scripts/safe-chain/preinstall-command.ts +2 -1
- package/scripts/safe-chain/project-config.ts +6 -11
- package/scripts/security/secretlint-scan.ts +42 -9
- package/scripts/security/security-audit-main.ts +8 -0
- package/scripts/security/security-audit-provision-logic.ts +0 -11
- package/scripts/security/security-audit-provision-main.ts +20 -0
- package/scripts/security/security-audit-provision.ts +12 -27
- package/scripts/security/security-audit.ts +27 -8
- package/scripts/security/sonar-file.ts +10 -5
- package/scripts/self-sync-guard/self-sync-guard-logic.ts +6 -13
- package/scripts/split/split-assess-cli.ts +2 -2
- package/scripts/split/split-assess.ts +25 -1
- package/scripts/split/split-early-notice.ts +116 -0
- package/scripts/split/split-measure.ts +83 -0
- package/scripts/split/split-resolution.ts +107 -0
- package/scripts/sync/claude-settings-merge.ts +8 -15
- package/scripts/sync/directory-copy-guard.ts +4 -9
- package/scripts/sync/file-content.ts +78 -8
- package/scripts/sync/sync-ai-files.ts +3 -5
- package/scripts/sync/sync-configs.ts +11 -23
- package/scripts/sync/sync-hook-safety.ts +4 -10
- package/scripts/sync/sync-main.ts +11 -0
- package/scripts/sync/sync.ts +25 -37
- package/scripts/test/direct-importers.ts +185 -0
- package/scripts/test/pure-files-entries.ts +83 -0
- package/scripts/test/related-heavy-tests.ts +81 -0
- package/scripts/test/test-declared-changed.ts +2 -2
- package/scripts/test/test-declared.ts +1 -1
- package/scripts/test/test-e2e-guard.ts +25 -1
- package/scripts/test/test-e2e-stamp.ts +38 -0
- package/scripts/test/test-no-base.ts +88 -0
- package/scripts/test/test-pinned-cache-logic.ts +363 -0
- package/scripts/test/test-pinned-cache.ts +337 -0
- package/scripts/test/test-pinned-emit.ts +49 -0
- package/scripts/test/test-pinned-functions.ts +116 -0
- package/scripts/test/test-pinned-ledger.ts +80 -0
- package/scripts/test/test-pinned-logic.ts +333 -0
- package/scripts/test/test-pinned-main.ts +144 -0
- package/scripts/test/test-pinned-pool.ts +73 -0
- package/scripts/test/test-pinned-probe.ts +254 -0
- package/scripts/test/test-pinned-prune-logic.ts +118 -0
- package/scripts/test/test-pinned-reach.ts +194 -0
- package/scripts/test/test-pinned-record.ts +196 -0
- package/scripts/test/test-pinned-rewire.ts +148 -0
- package/scripts/test/test-pinned-spawn.ts +81 -0
- package/scripts/test/test-pinned-stage.ts +70 -0
- package/scripts/test/test-pinned.ts +311 -0
- package/scripts/test/test-reach-cli.ts +61 -0
- package/scripts/test/test-read-map.ts +288 -0
- package/scripts/test/test-read-recording.ts +103 -0
- package/scripts/test/test-read-trace.ts +166 -0
- package/scripts/test/test-red-logic.ts +46 -7
- package/scripts/test/test-red-main.ts +12 -0
- package/scripts/test/test-red.ts +39 -37
- package/scripts/test/test-related-claim.ts +37 -0
- package/scripts/test/test-related-main.ts +21 -0
- package/scripts/test/test-related-moved.ts +91 -0
- package/scripts/test/test-related-record.ts +139 -0
- package/scripts/test/test-related-scope.ts +292 -41
- package/scripts/test/test-related-synced.ts +135 -0
- package/scripts/test/test-related-touched.ts +84 -0
- package/scripts/test/test-related.ts +381 -19
- package/scripts/test/test-unit-guard-main.ts +15 -0
- package/scripts/test/test-unit-guard.ts +66 -25
- package/scripts/test/unit-count-file.ts +37 -0
- package/scripts/test/unit-durations.ts +41 -0
- package/scripts/test/unit-run-marker.ts +162 -0
- package/scripts/test/unit-setup-files.ts +51 -0
- package/scripts/test/unit-worker-share.ts +64 -151
- package/scripts/test/vitest-cache-directory.ts +19 -0
- package/scripts/test/vitest-cli-excludes.ts +14 -0
- package/scripts/test/vitest-failure-summary.ts +111 -0
- package/scripts/test/whole-suite-files.ts +74 -0
- package/scripts/time-runtime/time-background.ts +20 -2
- package/scripts/time-runtime/time-batch-guard.ts +42 -4
- package/scripts/time-runtime/time-bundle-call.ts +1 -1
- package/scripts/time-runtime/time-bundles.ts +40 -8
- package/scripts/time-runtime/time-density-hook.ts +8 -6
- package/scripts/time-runtime/time-followup-stage.ts +1 -3
- package/scripts/time-runtime/time-format.ts +5 -28
- package/scripts/time-runtime/time-markers.ts +12 -3
- package/scripts/time-runtime/time-search-call.ts +38 -0
- package/scripts/time-runtime/time-shell.ts +98 -11
- package/scripts/time-runtime/time-transcript-line.ts +65 -66
- package/scripts/uninstall/uninstall.ts +1 -1
- package/scripts/version/bump-version-main.ts +12 -0
- package/scripts/version/bump-version.ts +25 -25
- package/scripts/version/development-engines-verdict.ts +124 -0
- package/scripts/version/effective-upstream.ts +6 -12
- package/scripts/version/latest-corepack.ts +19 -32
- package/scripts/version/latest-if-required-cli.ts +93 -0
- package/scripts/version/latest-lane-guard-main.ts +8 -0
- package/scripts/version/latest-lane-guard.ts +0 -4
- package/scripts/version/latest-scope-cli.ts +0 -9
- package/scripts/version/latest-scope-main.ts +12 -0
- package/scripts/version/latest-update.ts +5 -5
- package/scripts/version/npm-registry.ts +44 -6
- package/scripts/version/publishable-range-check.ts +5 -16
- package/scripts/version/release-age.ts +1 -1
- package/scripts/version/release-hold.ts +1 -1
- package/scripts/version/release-window.ts +38 -0
- package/scripts/version/running-binary.ts +1 -1
- package/scripts/version/safe-chain-version-update.ts +3 -8
- package/scripts/version/version-targets.ts +6 -28
- package/templates/dependabot.yml +29 -0
- package/templates/gitignore +6 -1
- package/templates/pnpm-workspace.basic.yaml +1 -1
- package/templates/sonar-project.properties +3 -2
- package/templates/workflows/ci.yml +53 -4
- package/templates/workflows/github-release.yml +4 -0
- package/tsconfig.sonar.json +1 -1
- package/.ncurc.json +0 -3
- package/dist/hooks/batch-guard.js +0 -29
- package/dist/hooks/chunk-4KKD2UTK.js +0 -66
- package/dist/hooks/chunk-6TS2JD6D.js +0 -237
- package/dist/hooks/chunk-7DSBJVFH.js +0 -50
- package/dist/hooks/chunk-A65Y4YOR.js +0 -79
- package/dist/hooks/chunk-APUO6U4J.js +0 -2451
- package/dist/hooks/chunk-CDY4NFQG.js +0 -15
- package/dist/hooks/chunk-DGT54IH5.js +0 -161
- package/dist/hooks/chunk-EFXE6C37.js +0 -81
- package/dist/hooks/chunk-GP4IEC4O.js +0 -20
- package/dist/hooks/chunk-JP45SOCJ.js +0 -56
- package/dist/hooks/chunk-LAOV7NLM.js +0 -45
- package/dist/hooks/chunk-M4HGZV7U.js +0 -83
- package/dist/hooks/chunk-O6GDRNJB.js +0 -343
- package/dist/hooks/chunk-PF2NZL2A.js +0 -131
- package/dist/hooks/chunk-PTICX4OL.js +0 -358
- package/dist/hooks/chunk-RT27QRJW.js +0 -6247
- package/dist/hooks/chunk-SYOTDYCI.js +0 -3533
- package/dist/hooks/chunk-TNUMY6NL.js +0 -4838
- package/dist/hooks/chunk-UPUZF3AN.js +0 -279
- package/dist/hooks/chunk-WK6SMBIC.js +0 -3180
- package/dist/hooks/duplicate-read-guard.js +0 -30
- package/dist/hooks/investigation-guard.js +0 -29
- package/scripts/backlog/backlog-stalled-cli.ts +0 -30
- package/scripts/cost-runtime/context-cut-threshold.ts +0 -11
- package/scripts/cost-runtime/cost-format.ts +0 -29
- package/scripts/init/basic-path-migration.ts +0 -24
- package/scripts/issue/issue-backlinks-cli.ts +0 -93
- package/scripts/josh/josh-commands-guard.ts +0 -38
- package/scripts/josh/josh-usage-automation.ts +0 -121
- package/scripts/josh/josh-usage-backlog.ts +0 -180
- package/scripts/josh/josh-usage-developer.ts +0 -230
- package/scripts/josh/josh-usage-hooks.ts +0 -38
- package/scripts/josh/josh-usage-issue.ts +0 -205
- package/scripts/josh/josh-usage-review.ts +0 -101
- package/scripts/josh/josh-usage-run.ts +0 -252
- package/scripts/josh/josh-usage-session.ts +0 -238
- package/scripts/josh/josh-usage-workflow.ts +0 -212
- package/scripts/lint/cross-file-recheck.ts +0 -155
- package/scripts/registry-migration/migrate-logic.ts +0 -237
- package/scripts/registry-migration/migrate.ts +0 -292
- package/scripts/registry-migration/user-npmrc.ts +0 -15
- package/scripts/rules/filing-cap.ts +0 -132
- package/scripts/rules/rule-guard.ts +0 -23
- package/scripts/rules/rule-registry-rows.ts +0 -292
- package/scripts/rules/rule-registry.ts +0 -112
- package/scripts/run/run-stranded-cli.ts +0 -27
|
@@ -1,25 +1,23 @@
|
|
|
1
|
-
#!/usr/bin/env tsx
|
|
2
|
-
import { randomUUID } from 'node:crypto'
|
|
3
1
|
import { fileURLToPath } from 'node:url'
|
|
4
2
|
import type { AgentProfile, AgentProvider } from '#scripts/agent/agent-role-profile'
|
|
5
3
|
import { backlog_budget } from '#scripts/backlog/backlog-budget'
|
|
4
|
+
import { lane_session_broker } from '#scripts/lane/lane-session-broker'
|
|
6
5
|
import { cli_flags } from '#scripts/lib/cli-flags'
|
|
7
|
-
import {
|
|
6
|
+
import { MS_PER_SECOND } from '#scripts/lib/timeouts'
|
|
8
7
|
import { run_carry, type CarryRead } from '#scripts/run/carry/run-carry'
|
|
9
|
-
import { run_event_setup } from '#scripts/run/event/run-event-setup'
|
|
10
8
|
import { run_event_stream } from '#scripts/run/event/run-event-stream'
|
|
11
9
|
import { run_event_stream_emit } from '#scripts/run/event/run-event-stream-emit'
|
|
12
|
-
import {
|
|
13
|
-
import { run_stranded_detect, type WatchedRun } from '#scripts/run/run-stranded-detect'
|
|
14
|
-
import { run_wake, type WakeStopReason, type WakeTidyResult } from './run-wake'
|
|
10
|
+
import { run_wake, type WakeTidyResult } from './run-wake'
|
|
15
11
|
import { run_wake_await } from './run-wake-await'
|
|
12
|
+
import { run_wake_code } from './run-wake-code'
|
|
16
13
|
import { run_wake_describe, type WakeContext } from './run-wake-describe'
|
|
17
|
-
import {
|
|
18
|
-
import {
|
|
19
|
-
import {
|
|
14
|
+
import { run_wake_finish } from './run-wake-finish'
|
|
15
|
+
import { run_wake_loop, type LoopStop } from './run-wake-loop'
|
|
16
|
+
import { run_wake_ports } from './run-wake-ports'
|
|
20
17
|
import { run_wake_session, type LaunchResult } from './run-wake-session'
|
|
21
18
|
import { run_wake_stop } from './run-wake-stop'
|
|
22
19
|
import { run_wake_supervise } from './run-wake-supervise'
|
|
20
|
+
import { run_wake_takeover, type TakeoverResult } from './run-wake-takeover'
|
|
23
21
|
|
|
24
22
|
// `josh run:wake --start | --list | --stop | --loop` — the supervisor that continues a cut
|
|
25
23
|
// `backlogrun` or `queue` without a person retyping the keyword. **Which invocations it may continue
|
|
@@ -29,24 +27,22 @@ import { run_wake_supervise } from './run-wake-supervise'
|
|
|
29
27
|
// The stdout/stderr split is the contract every `run:*` command shares: exactly one verdict token on
|
|
30
28
|
// stdout on every path, the reason and the advice on stderr, so a loop branches on one token.
|
|
31
29
|
//
|
|
32
|
-
// **`--start` and `--loop` are two halves of one thing.** `--start` spawns
|
|
30
|
+
// **`--start` and `--loop` are two halves of one thing.** `--start` spawns the command's entry detached
|
|
33
31
|
// with `--loop` and returns immediately, which is what leaves the supervisor outside the conversation;
|
|
34
32
|
// `--loop` is the body, and running it in the foreground is how a person watches what it does.
|
|
35
33
|
|
|
36
34
|
const SUCCESS_EXIT_CODE = 0
|
|
37
35
|
const FAILURE_EXIT_CODE = 1
|
|
38
|
-
const ARGV_OFFSET = 2
|
|
39
36
|
const ONE_GROUP = 1
|
|
40
|
-
|
|
41
|
-
//
|
|
42
|
-
// supervisor.
|
|
43
|
-
const INTERVAL_PATTERN = /^[1-9]\d*$/u
|
|
37
|
+
// The interval is whole and positive (`cli_flags.to_positive`): a zero interval is a busy loop against
|
|
38
|
+
// the temp directory, not a faster supervisor.
|
|
44
39
|
// **Bounded above as well as below, and for the same reason.** `setTimeout` clamps any delay past
|
|
45
40
|
// 2^31−1 ms to *one millisecond*, so a number large enough to look like "poll rarely" produces exactly
|
|
46
41
|
// the busy loop the lower bound exists to prevent. An hour is far past any useful polling interval and
|
|
47
42
|
// nowhere near the clamp.
|
|
48
43
|
const MAX_INTERVAL_SECONDS = 3600
|
|
49
|
-
|
|
44
|
+
// The command's entry, not this module: the guard that runs `main` lives in `run-wake-main.ts`.
|
|
45
|
+
const SCRIPT_PATH = fileURLToPath(new URL('run-wake-main.ts', import.meta.url))
|
|
50
46
|
|
|
51
47
|
const STARTED_VERDICT = 'started'
|
|
52
48
|
const RUNNING_VERDICT = 'running'
|
|
@@ -57,37 +53,16 @@ const NONE_VERDICT = 'none'
|
|
|
57
53
|
const UNKNOWN_VERDICT = 'unknown'
|
|
58
54
|
const FAILED_VERDICT = 'failed'
|
|
59
55
|
|
|
60
|
-
// **The note covers both ways `wake_argv` answers `undefined`**, because it cannot tell them apart and
|
|
61
|
-
// a message that named only the first would accuse a legitimate invocation of carrying unsafe text.
|
|
62
|
-
// The second is the one a person actually meets: a `queue` whose references carry a `owner/repo#`
|
|
63
|
-
// prefix is a grammar this supervisor does not rebuild, and `queue.md` → "The session boundary" is why
|
|
64
|
-
// such a queue begins no record in the first place.
|
|
65
|
-
const UNSAFE_INVOCATION_NOTE =
|
|
66
|
-
'the carried invocation is not one this supervisor can continue — it is neither a backlogrun nor a queue it can rebuild, or it carries text that may not be passed to a command line'
|
|
67
|
-
// The command rather than one entry point: the supervisor continues a `queue` as readily as a
|
|
68
|
-
// `backlogrun`, and a warning that named the wrong one would send the reader looking at a run that is
|
|
69
|
-
// not the one that stopped.
|
|
70
|
-
const WARNING_TITLE = 'run:wake supervisor'
|
|
71
|
-
const WARNING_RECOVERY = `Check the wake command, then restart with \`pnpm josh run:wake --start\`.`
|
|
72
|
-
// **The stop reasons that reach a person, and what each one tells them.** A reason mapped to
|
|
73
|
-
// `undefined` is one where nothing went wrong: `ended` is the run finishing through `run:carry --end`,
|
|
74
|
-
// `stopped` is a person's own `--stop` or a supervisor being superseded, and a warning channel that
|
|
75
|
-
// fired on those is one that stops being read.
|
|
76
|
-
//
|
|
77
|
-
// **`unreadable` warns**, because it ends the supervisor while a carry record is still sitting there
|
|
78
|
-
// handed off, so the run would otherwise be left asleep with nothing anywhere saying so.
|
|
79
|
-
// **Every reason is listed, and the silent two are listed as `undefined`.** A partial map would let a
|
|
80
|
-
// fifth stop reason compile straight past this and reach nobody, which is the defect class this
|
|
81
|
-
// section exists to close.
|
|
82
|
-
const STOP_BODIES: Record<WakeStopReason, string | undefined> = {
|
|
83
|
-
ended: undefined,
|
|
84
|
-
stopped: undefined,
|
|
85
|
-
failed: 'The supervisor could not continue the run and has stopped.',
|
|
86
|
-
unreadable:
|
|
87
|
-
'The carry record could not be read, so the supervisor stopped rather than guess at it.',
|
|
88
|
-
}
|
|
89
56
|
const NO_PROFILE_NOTE = 'the scheduler profile could not be resolved'
|
|
57
|
+
const RELOAD_FAILED_NOTE =
|
|
58
|
+
"The supervisor's code changed, but the supervisor to replace it did not start"
|
|
59
|
+
const TAKEOVER_NOTES: Record<Exclude<TakeoverResult, 'taken'>, string> = {
|
|
60
|
+
died: 'it exited before it claimed the run',
|
|
61
|
+
unclaimed: 'it did not claim the run in time, so it was stopped',
|
|
62
|
+
}
|
|
90
63
|
const SUPERSEDED_RESULT: WakeTidyResult = 'superseded'
|
|
64
|
+
const REMOVED_RESULT: WakeTidyResult = 'removed'
|
|
65
|
+
const STOPPED_STOP: LoopStop = { reason: 'stopped', note: undefined }
|
|
91
66
|
const SUPERSEDED_NOTE =
|
|
92
67
|
'another supervisor now holds the record, so it was left alone; this loop is the superseded one'
|
|
93
68
|
|
|
@@ -115,17 +90,15 @@ function usage(): number {
|
|
|
115
90
|
return FAILURE_EXIT_CODE
|
|
116
91
|
}
|
|
117
92
|
|
|
118
|
-
|
|
119
|
-
console.error(`wake: ${note}`)
|
|
120
|
-
}
|
|
93
|
+
const { note_to_stderr } = run_wake_ports
|
|
121
94
|
|
|
122
95
|
function to_interval_ms(value: string | boolean | undefined): number | undefined {
|
|
123
96
|
if (typeof value !== 'string') return backlog_budget.OFFER_INTERVAL_MS
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
const seconds = Number(value)
|
|
97
|
+
const seconds = cli_flags.to_positive(value)
|
|
127
98
|
|
|
128
|
-
return seconds
|
|
99
|
+
return seconds === undefined || seconds > MAX_INTERVAL_SECONDS
|
|
100
|
+
? undefined
|
|
101
|
+
: seconds * MS_PER_SECOND
|
|
129
102
|
}
|
|
130
103
|
|
|
131
104
|
// Exactly one verb, never a guessed order between two.
|
|
@@ -154,137 +127,6 @@ function refuse_without_carry(kind: CarryRead['kind']): number {
|
|
|
154
127
|
return report(NONE_VERDICT, FAILURE_EXIT_CODE)
|
|
155
128
|
}
|
|
156
129
|
|
|
157
|
-
// **A session that started is said on the stream.** The driver's `waiting on judgment` is the moment it
|
|
158
|
-
// asked; from here a session is at work on the answer, until the supervisor's next hand-off.
|
|
159
|
-
function say_session_running(context: WakeContext): void {
|
|
160
|
-
run_event_setup.emit_to(context.event_target, run_event_setup.STAGE.SESSION, new Date())
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
function wake_session(
|
|
164
|
-
context: WakeContext,
|
|
165
|
-
invocation: string,
|
|
166
|
-
profile: AgentProfile,
|
|
167
|
-
session: { id: string; material: string },
|
|
168
|
-
): LaunchResult {
|
|
169
|
-
const built = run_wake_session.wake_argv(invocation, profile, context.worktree, session)
|
|
170
|
-
|
|
171
|
-
if (built === undefined) return { kind: 'failed', note: UNSAFE_INVOCATION_NOTE }
|
|
172
|
-
if (built.kind === 'rejected') return { kind: 'failed', note: built.note }
|
|
173
|
-
|
|
174
|
-
// The headless mark is what lets the stop hook hold this session's turn open while its lanes run —
|
|
175
|
-
// under `claude -p` a turn-end is the process's end (`run-headless.ts`).
|
|
176
|
-
const environment = run_headless.environment()
|
|
177
|
-
const target = { cwd: context.worktree, env: environment, log_path: context.log_target }
|
|
178
|
-
const result = run_wake_session.launch({ argv: built.argv, ...target, profile }, note_to_stderr)
|
|
179
|
-
|
|
180
|
-
if (result.kind === 'launched') say_session_running(context)
|
|
181
|
-
|
|
182
|
-
return result
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
// **A record this supervisor owns itself is not a session at work.** A failed driver leaves the record
|
|
186
|
-
// adopted for this process, so reading that owner as live would have every restarted pass wait on
|
|
187
|
-
// itself and never drive again.
|
|
188
|
-
function ports_for(context: WakeContext, profile: AgentProfile): LoopPorts {
|
|
189
|
-
return {
|
|
190
|
-
read_carry: () => run_carry.read_carry(context.carry_target),
|
|
191
|
-
is_owner_live: (read) => read.kind === 'carried' && run_carry.is_held_by_another(read.carry),
|
|
192
|
-
has_work: async () => true,
|
|
193
|
-
new_session_id: () => randomUUID(),
|
|
194
|
-
hand_off: () => {
|
|
195
|
-
run_wake_handoff.hand_off(context.carry_target)
|
|
196
|
-
},
|
|
197
|
-
drive: async () => await run_wake_driver.drive(context.carry_target),
|
|
198
|
-
wake: (invocation, session_id, material) =>
|
|
199
|
-
wake_session(context, invocation, profile, { id: session_id, material }),
|
|
200
|
-
sleep: async (milliseconds) => {
|
|
201
|
-
await new Promise((resolve) => setTimeout(resolve, milliseconds))
|
|
202
|
-
},
|
|
203
|
-
now: () => new Date(),
|
|
204
|
-
}
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
// The log is named in the warning rather than only in `--list`, because the person reading a warning
|
|
208
|
-
// at three in the morning is the one who needs to know where to look next.
|
|
209
|
-
function log_hint(context: WakeContext): string {
|
|
210
|
-
return `The output of every session this supervisor started is in ${context.log_target}.`
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
// The log hint goes ahead of the note: the Telegram length limit cuts the tail, and a long failure note
|
|
214
|
-
// (stdout tail plus stderr tail) would otherwise take the one line that says where to look next.
|
|
215
|
-
function warning_body(stop: LoopStop, body: string, context: WakeContext): string {
|
|
216
|
-
return [body, log_hint(context), stop.note].filter(Boolean).join('\n')
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
// Whether the warning reached a person — the answer `record_failure` leaves its marker on.
|
|
220
|
-
async function warn_of_stop(stop: LoopStop, body: string, context: WakeContext): Promise<boolean> {
|
|
221
|
-
return await telegram_notify.warn({
|
|
222
|
-
issue_title: WARNING_TITLE,
|
|
223
|
-
body: warning_body(stop, body, context),
|
|
224
|
-
recovery: WARNING_RECOVERY,
|
|
225
|
-
})
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
// **A failed supervisor that leaves the run stranded says so on the stream, with its cause.** Nothing
|
|
229
|
-
// else writes there when the supervisor gives up, so a reader of the events would see the last merge
|
|
230
|
-
// and a run that looks as if it were still watching. The cause is the note's first line — the
|
|
231
|
-
// driver's own `error …` — because the rest is a stderr tail the log already holds.
|
|
232
|
-
//
|
|
233
|
-
// **Only a strand, and only one a person was told of.** A `failed` stop is not always a strand: a
|
|
234
|
-
// `run:carry --end` under a live driver fails it too, and that run ended cleanly. And the event is the
|
|
235
|
-
// marker `run_stranded_detect` holds its own notification back on, so it is left only when the warning
|
|
236
|
-
// was sent — after a failed send the stop-time detector still finds no marker, and notifies.
|
|
237
|
-
function is_strand_told(stop: LoopStop, watched: WatchedRun, is_warned: boolean): boolean {
|
|
238
|
-
if (!is_warned || stop.reason !== run_wake_loop.FAILED_REASON) return false
|
|
239
|
-
|
|
240
|
-
return run_stranded_detect.is_left_stranded(watched)
|
|
241
|
-
}
|
|
242
|
-
|
|
243
|
-
async function record_failure(
|
|
244
|
-
stop: LoopStop,
|
|
245
|
-
watched: WatchedRun,
|
|
246
|
-
is_warned: boolean,
|
|
247
|
-
): Promise<void> {
|
|
248
|
-
if (!is_strand_told(stop, watched, is_warned)) return
|
|
249
|
-
|
|
250
|
-
const [cause = ''] = (stop.note ?? '').split('\n', 1)
|
|
251
|
-
|
|
252
|
-
await run_event_stream_emit.emit(
|
|
253
|
-
run_event_stream.EVENT_KIND.STRANDED,
|
|
254
|
-
`The supervisor failed and stopped watching the run — ${cause}`,
|
|
255
|
-
)
|
|
256
|
-
}
|
|
257
|
-
|
|
258
|
-
// **Only a failed wake exits non-zero; `unreadable` warns but exits zero.** The
|
|
259
|
-
// verdict-and-exit-code table in `docs/josh-commands-automation.md` is a contract callers branch on,
|
|
260
|
-
// and what that one needs is the notification, not a different exit code.
|
|
261
|
-
function exit_code_of(reason: WakeStopReason): number {
|
|
262
|
-
return reason === run_wake_loop.FAILED_REASON ? FAILURE_EXIT_CODE : SUCCESS_EXIT_CODE
|
|
263
|
-
}
|
|
264
|
-
|
|
265
|
-
// A failure that reached nobody is the defect, so the Telegram goes out before the verdict is printed.
|
|
266
|
-
// Which stops reach a person, and what each one says — `undefined` for the two where nothing went
|
|
267
|
-
// wrong. It is a function rather than a bare lookup so the decision can be asserted for every reason
|
|
268
|
-
// the loop can end on.
|
|
269
|
-
function stop_body(reason: WakeStopReason): string | undefined {
|
|
270
|
-
return STOP_BODIES[reason]
|
|
271
|
-
}
|
|
272
|
-
|
|
273
|
-
// `started_at` is the run this supervisor took on — what `record_failure` tells an ended run by once
|
|
274
|
-
// the carry record that held it no longer reads.
|
|
275
|
-
async function finish(stop: LoopStop, context: WakeContext, started_at: string): Promise<number> {
|
|
276
|
-
const body = stop_body(stop.reason)
|
|
277
|
-
|
|
278
|
-
if (body === undefined) return report(stop.reason)
|
|
279
|
-
|
|
280
|
-
console.error(stop.note ?? body)
|
|
281
|
-
const is_warned = await warn_of_stop(stop, body, context)
|
|
282
|
-
|
|
283
|
-
await record_failure(stop, { ...context, started_at }, is_warned)
|
|
284
|
-
|
|
285
|
-
return report(stop.reason, exit_code_of(stop.reason))
|
|
286
|
-
}
|
|
287
|
-
|
|
288
130
|
function launch_supervisor(
|
|
289
131
|
context: WakeContext,
|
|
290
132
|
interval: string | undefined,
|
|
@@ -317,8 +159,12 @@ function start_for_launch(git_directory: string, provider: AgentProvider): Launc
|
|
|
317
159
|
return launch_supervisor(context_of(git_directory), undefined, resolved.profile)
|
|
318
160
|
}
|
|
319
161
|
|
|
320
|
-
function spawn_supervisor(
|
|
321
|
-
|
|
162
|
+
function spawn_supervisor(
|
|
163
|
+
context: WakeContext,
|
|
164
|
+
interval: string | undefined,
|
|
165
|
+
profile: AgentProfile | undefined,
|
|
166
|
+
): number {
|
|
167
|
+
const result = launch_supervisor(context, interval, profile)
|
|
322
168
|
|
|
323
169
|
if (result.kind === 'failed') {
|
|
324
170
|
console.error(`Could not start the supervisor: ${result.note}`)
|
|
@@ -346,7 +192,15 @@ function start(context: WakeContext, interval: string | undefined): number {
|
|
|
346
192
|
return report(RUNNING_VERDICT)
|
|
347
193
|
}
|
|
348
194
|
|
|
349
|
-
return spawn_supervisor(context, interval)
|
|
195
|
+
return spawn_supervisor(context, interval, run_wake_session.scheduler_profile())
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
// The supervisor `josh backlogrun --restart` starts in place of the one it stopped, on that one's
|
|
199
|
+
// profile, so the shell the restart was typed in does not choose it; the shell's where none was running.
|
|
200
|
+
function restart_supervisor(git_directory: string, profile: AgentProfile | undefined): number {
|
|
201
|
+
const chosen = profile ?? run_wake_session.scheduler_profile()
|
|
202
|
+
|
|
203
|
+
return spawn_supervisor(context_of(git_directory), undefined, chosen)
|
|
350
204
|
}
|
|
351
205
|
|
|
352
206
|
// **The loop removes its record on the way out, and only its own.** A loop that ended after its record
|
|
@@ -357,8 +211,78 @@ function start(context: WakeContext, interval: string | undefined): number {
|
|
|
357
211
|
// replaced would leave no trace of that anywhere. Which of the two happened is `tidy_own_wake`'s
|
|
358
212
|
// answer rather than a second read taken here — the branch that decides it belongs beside the record,
|
|
359
213
|
// where it is tested, not in a CLI that would have to re-derive it.
|
|
360
|
-
function tidy_up(target: string):
|
|
361
|
-
|
|
214
|
+
function tidy_up(target: string): WakeTidyResult {
|
|
215
|
+
const tidied = run_wake.tidy_own_wake(target)
|
|
216
|
+
|
|
217
|
+
if (tidied === SUPERSEDED_RESULT) note_to_stderr(SUPERSEDED_NOTE)
|
|
218
|
+
|
|
219
|
+
return tidied
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
// **No reload while a lane's request is being answered**: ending the broker closes every lane's server
|
|
223
|
+
// but waits out the slowest request, a review up to its limit, leaving the run unwatched and the other
|
|
224
|
+
// lanes unserved meanwhile. The check is skipped, not taken, so the moved commit is still read as
|
|
225
|
+
// stale at the first idle pass.
|
|
226
|
+
function code_check(is_stale: () => Promise<boolean>): () => Promise<boolean> {
|
|
227
|
+
return async () => !lane_session_broker.is_answering() && (await is_stale())
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
function reload_failed(note: string): LoopStop {
|
|
231
|
+
return { reason: run_wake_loop.FAILED_REASON, note: `${RELOAD_FAILED_NOTE}: ${note}` }
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
// A record removed by `--stop` or taken over while the loop ended is not this loop's to hand on.
|
|
235
|
+
function as_not_handed_on(stop: LoopStop): LoopStop {
|
|
236
|
+
return stop.reason === run_wake_loop.RELOAD_REASON ? STOPPED_STOP : stop
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
// **The successor starts only once this supervisor's broker has closed and its record is gone**
|
|
240
|
+
// (joshuafolkken/kit#4509): two brokers for one lane overwrite each other's response
|
|
241
|
+
// (`claude-lane-broker.ts`), and a record still held by a live process refuses the successor's claim.
|
|
242
|
+
// The lanes and the carry record are left as `backlogrun --restart` leaves them: untouched, for the
|
|
243
|
+
// successor to adopt. A successor that did not start leaves the run unwatched, so it fails as a warning.
|
|
244
|
+
async function reload(
|
|
245
|
+
context: WakeContext,
|
|
246
|
+
interval_ms: number,
|
|
247
|
+
profile: AgentProfile,
|
|
248
|
+
): Promise<LoopStop> {
|
|
249
|
+
const interval = String(Math.round(interval_ms / MS_PER_SECOND))
|
|
250
|
+
const result = launch_supervisor(context, interval, profile)
|
|
251
|
+
|
|
252
|
+
if (result.kind === 'failed') return reload_failed(result.note)
|
|
253
|
+
|
|
254
|
+
const ports = run_wake_takeover.ports_of(context.wake_target)
|
|
255
|
+
const takeover = await run_wake_takeover.await_takeover(result.pid, ports)
|
|
256
|
+
|
|
257
|
+
if (takeover !== 'taken') return reload_failed(TAKEOVER_NOTES[takeover])
|
|
258
|
+
|
|
259
|
+
await run_event_stream_emit.emit(
|
|
260
|
+
run_event_stream.EVENT_KIND.NOTE,
|
|
261
|
+
`The supervisor's code changed on main, so process ${String(process.pid)} handed the run to process ${String(result.pid)} on the new code.`,
|
|
262
|
+
)
|
|
263
|
+
|
|
264
|
+
return { reason: run_wake_loop.RELOAD_REASON, note: undefined }
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
async function supervised(
|
|
268
|
+
context: WakeContext,
|
|
269
|
+
interval_ms: number,
|
|
270
|
+
profile: AgentProfile,
|
|
271
|
+
): Promise<LoopStop> {
|
|
272
|
+
const source = run_wake_code.source_of(context.worktree, SCRIPT_PATH)
|
|
273
|
+
const is_stale = code_check(await run_wake_code.watch(source, lane_session_broker.take_refusal))
|
|
274
|
+
const ports = run_wake_ports.ports_for(context, profile, is_stale)
|
|
275
|
+
const stop = await run_wake_supervise.supervise({
|
|
276
|
+
context,
|
|
277
|
+
ports,
|
|
278
|
+
interval_ms,
|
|
279
|
+
note: note_to_stderr,
|
|
280
|
+
})
|
|
281
|
+
|
|
282
|
+
if (tidy_up(context.wake_target) !== REMOVED_RESULT) return as_not_handed_on(stop)
|
|
283
|
+
if (stop.reason !== run_wake_loop.RELOAD_REASON) return stop
|
|
284
|
+
|
|
285
|
+
return await reload(context, interval_ms, profile)
|
|
362
286
|
}
|
|
363
287
|
|
|
364
288
|
// A failed pass is restarted while the carry record is still resumable (`run-wake-restart.ts`), so
|
|
@@ -376,17 +300,11 @@ async function loop(context: WakeContext, interval_ms: number): Promise<number>
|
|
|
376
300
|
if (claimed.kind === 'running') return report(RUNNING_VERDICT)
|
|
377
301
|
if (claimed.kind === 'refused') return refuse_without_carry(claimed.carry_kind)
|
|
378
302
|
|
|
379
|
-
|
|
380
|
-
const stop = await run_wake_supervise.supervise({
|
|
381
|
-
context,
|
|
382
|
-
ports,
|
|
383
|
-
interval_ms,
|
|
384
|
-
note: note_to_stderr,
|
|
385
|
-
})
|
|
303
|
+
run_wake_session.keep_awake(process.pid)
|
|
386
304
|
|
|
387
|
-
|
|
305
|
+
const stop = await supervised(context, interval_ms, claimed.wake.profile ?? profile)
|
|
388
306
|
|
|
389
|
-
return await finish(stop, context, claimed.carry.started_at)
|
|
307
|
+
return await run_wake_finish.finish(stop, context, claimed.carry.started_at)
|
|
390
308
|
}
|
|
391
309
|
|
|
392
310
|
// **The verdict tracks whether the supervisor is actually running, not merely whether a record is
|
|
@@ -436,28 +354,22 @@ async function run(argv: ReadonlyArray<string>): Promise<number> {
|
|
|
436
354
|
return await dispatch(values, context, interval_ms)
|
|
437
355
|
}
|
|
438
356
|
|
|
439
|
-
async function main(argv: ReadonlyArray<string>): Promise<void> {
|
|
440
|
-
process.exitCode = await run(argv)
|
|
441
|
-
}
|
|
442
|
-
|
|
443
357
|
const run_wake_cli = {
|
|
444
358
|
FAILED_VERDICT,
|
|
445
359
|
NONE_VERDICT,
|
|
446
360
|
RUNNING_VERDICT,
|
|
361
|
+
SCRIPT_PATH,
|
|
447
362
|
STALE_VERDICT,
|
|
448
363
|
STOPPED_VERDICT,
|
|
449
364
|
SUPERVISING_VERDICT,
|
|
450
365
|
UNKNOWN_VERDICT,
|
|
451
366
|
USAGE,
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
367
|
+
RELOAD_FAILED_NOTE,
|
|
368
|
+
reload,
|
|
369
|
+
restart_supervisor,
|
|
455
370
|
run,
|
|
456
371
|
start_for_launch,
|
|
457
|
-
|
|
458
|
-
warning_body,
|
|
372
|
+
supervised,
|
|
459
373
|
}
|
|
460
374
|
|
|
461
|
-
if (process.argv[1] === SCRIPT_PATH) await main(process.argv.slice(ARGV_OFFSET))
|
|
462
|
-
|
|
463
375
|
export { run_wake_cli }
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { git_command } from '#scripts/git/git-command'
|
|
2
|
+
import { error_text } from '#scripts/lib/error-message'
|
|
3
|
+
import { import_graph } from '#scripts/lint/import-graph'
|
|
4
|
+
|
|
5
|
+
// Whether the supervisor still runs the code on disk (joshuafolkken/kit#4509). A supervisor keeps the
|
|
6
|
+
// code it started with for its whole life, while the lanes' ships run each new main — so a change to
|
|
7
|
+
// what the supervisor serves them, the broker's request format above all, stops every lane that asks.
|
|
8
|
+
//
|
|
9
|
+
// **The code is the entry's import closure, not the tree**: a merge that touched only files the
|
|
10
|
+
// supervisor never imports changes nothing it runs, and restarting on it would only cost a broker gap.
|
|
11
|
+
// The closure is hashed as the lint cache hashes it (`import-graph.ts`).
|
|
12
|
+
//
|
|
13
|
+
// **The closure is re-hashed only once the commit has moved**: hashing it reads every file it reaches,
|
|
14
|
+
// and on most passes nothing has merged since the last one.
|
|
15
|
+
|
|
16
|
+
interface CodeSource {
|
|
17
|
+
// The commit the checkout sits on; `undefined` where it cannot be read.
|
|
18
|
+
head: () => Promise<string | undefined>
|
|
19
|
+
// The hash of the entry's import closure; `undefined` where it cannot be computed.
|
|
20
|
+
closure: () => Promise<string | undefined>
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
interface CodeState {
|
|
24
|
+
head: string | undefined
|
|
25
|
+
loaded: string | undefined
|
|
26
|
+
// A suspicion taken while the closure could not be hashed, kept for the next pass.
|
|
27
|
+
is_suspect: boolean
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// **A hash that cannot be computed is never stale**: a supervisor that cannot tell keeps running, as
|
|
31
|
+
// it did before this check existed, rather than restarting on every pass. **A suspected supervisor whose
|
|
32
|
+
// start left no baseline is stale** (joshuafolkken/kit#4714): the broker refused a request, and without
|
|
33
|
+
// a baseline nothing else could ever tell it differs, so the successor reads one afresh.
|
|
34
|
+
function is_changed(
|
|
35
|
+
loaded: string | undefined,
|
|
36
|
+
current: string | undefined,
|
|
37
|
+
is_suspected: boolean,
|
|
38
|
+
): boolean {
|
|
39
|
+
if (current === undefined) return false
|
|
40
|
+
if (loaded === undefined) return is_suspected
|
|
41
|
+
|
|
42
|
+
return loaded !== current
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// **A move and a suspicion are consumed only once they were hashed**, so a closure that could not be
|
|
46
|
+
// read at them is read again at the next pass (joshuafolkken/kit#4714).
|
|
47
|
+
function consume(
|
|
48
|
+
state: CodeState,
|
|
49
|
+
read: { head: string | undefined; is_suspect: boolean },
|
|
50
|
+
current: string | undefined,
|
|
51
|
+
): void {
|
|
52
|
+
if (current === undefined) {
|
|
53
|
+
state.is_suspect = read.is_suspect
|
|
54
|
+
|
|
55
|
+
return
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
state.head = read.head
|
|
59
|
+
state.is_suspect = false
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// **A suspicion re-hashes an unmoved commit** (joshuafolkken/kit#4714).
|
|
63
|
+
async function is_stale(
|
|
64
|
+
state: CodeState,
|
|
65
|
+
source: CodeSource,
|
|
66
|
+
is_suspected: () => boolean,
|
|
67
|
+
): Promise<boolean> {
|
|
68
|
+
const head = await source.head()
|
|
69
|
+
const is_suspect = is_suspected() || state.is_suspect
|
|
70
|
+
if (!is_suspect && head === state.head) return false
|
|
71
|
+
|
|
72
|
+
const current = await source.closure()
|
|
73
|
+
|
|
74
|
+
consume(state, { head, is_suspect }, current)
|
|
75
|
+
|
|
76
|
+
return is_changed(state.loaded, current, is_suspect)
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// The baseline is read when the watch starts — at the supervisor's start, as close to the moment its
|
|
80
|
+
// modules were loaded as a reading can be. `is_suspected` answers, and clears, whether something has
|
|
81
|
+
// seen this code differ from main's since it was last asked (`lane-session-broker.ts`).
|
|
82
|
+
async function watch(
|
|
83
|
+
source: CodeSource,
|
|
84
|
+
is_suspected: () => boolean = () => false,
|
|
85
|
+
): Promise<() => Promise<boolean>> {
|
|
86
|
+
const state: CodeState = {
|
|
87
|
+
head: await source.head(),
|
|
88
|
+
loaded: await source.closure(),
|
|
89
|
+
is_suspect: false,
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
return async () => await is_stale(state, source, is_suspected)
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
async function read_head(): Promise<string | undefined> {
|
|
96
|
+
try {
|
|
97
|
+
return await git_command.head_commit()
|
|
98
|
+
} catch (error) {
|
|
99
|
+
error_text.trace_swallowed('run_wake_code.read_head', error)
|
|
100
|
+
|
|
101
|
+
return undefined
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// A fresh graph each time: one graph caches the content it read, so it would answer the old hash.
|
|
106
|
+
async function read_closure(root: string, entry: string): Promise<string | undefined> {
|
|
107
|
+
try {
|
|
108
|
+
const graph = await import_graph.create(root)
|
|
109
|
+
|
|
110
|
+
return graph?.closure_hash(entry)
|
|
111
|
+
} catch (error) {
|
|
112
|
+
error_text.trace_swallowed('run_wake_code.read_closure', error)
|
|
113
|
+
|
|
114
|
+
return undefined
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
function source_of(root: string, entry: string): CodeSource {
|
|
119
|
+
return { head: read_head, closure: async () => await read_closure(root, entry) }
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
const run_wake_code = { source_of, watch }
|
|
123
|
+
|
|
124
|
+
export type { CodeSource }
|
|
125
|
+
export { run_wake_code }
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { josh_command, type JoshResult } from '#scripts/josh/josh-run'
|
|
2
|
+
import { MS_PER_MINUTE } from '#scripts/lib/timeouts'
|
|
2
3
|
import { run_carry, type CarryRead } from '#scripts/run/carry/run-carry'
|
|
3
4
|
import { run_event_setup } from '#scripts/run/event/run-event-setup'
|
|
4
5
|
import { run_invocation } from '#scripts/run/run-invocation'
|
|
@@ -11,6 +12,12 @@ const DETAILS_TAIL_LENGTH = 2048
|
|
|
11
12
|
const TRUNCATION_MARK = '... '
|
|
12
13
|
// The prefix `backlog-drive-cli.ts` gives the exception it catches.
|
|
13
14
|
const ERROR_PREFIX = 'error '
|
|
15
|
+
// **The driver is bounded so the supervisor reaches its pass boundary between dispatches**
|
|
16
|
+
// (joshuafolkken/kit#4509): unbounded, `backlog:drive` dispatches, collects and merges lanes in its own
|
|
17
|
+
// loop until a judgment hand-off, and the code check at the pass boundary would wait for that.
|
|
18
|
+
const WINDOW_MINUTES = 5
|
|
19
|
+
const WINDOW_MS = WINDOW_MINUTES * MS_PER_MINUTE
|
|
20
|
+
const WINDOW_VERDICT = 'window'
|
|
14
21
|
|
|
15
22
|
function driver_args(invocation: string): ReadonlyArray<string> | undefined {
|
|
16
23
|
const rebuilt = run_invocation.rebuild(invocation)
|
|
@@ -21,6 +28,8 @@ function driver_args(invocation: string): ReadonlyArray<string> | undefined {
|
|
|
21
28
|
'backlog:drive',
|
|
22
29
|
'--owner',
|
|
23
30
|
String(process.pid),
|
|
31
|
+
'--window',
|
|
32
|
+
String(WINDOW_MINUTES),
|
|
24
33
|
...rebuilt.split(' ').slice(1 + named_count),
|
|
25
34
|
]
|
|
26
35
|
}
|
|
@@ -141,11 +150,11 @@ function claim_record(target: string, invocation: string): boolean {
|
|
|
141
150
|
}
|
|
142
151
|
|
|
143
152
|
// **A verdict with nothing to judge is re-driven here, never handed to a session.** A woken session
|
|
144
|
-
// met with `
|
|
145
|
-
//
|
|
146
|
-
//
|
|
147
|
-
//
|
|
148
|
-
const RERUN_VERDICTS: ReadonlyArray<string> = ['
|
|
153
|
+
// met with `merge busy` or `merge retry` could only cut and hand the loop back for the same driver to
|
|
154
|
+
// run again — a model round trip, at a cache write each, that decides nothing. The record is already
|
|
155
|
+
// this process's, so the rerun needs no fresh claim; the limit keeps a driver that never settles from
|
|
156
|
+
// holding the supervisor past its own checks.
|
|
157
|
+
const RERUN_VERDICTS: ReadonlyArray<string> = ['merge busy', 'merge retry']
|
|
149
158
|
const RERUN_LIMIT = 10
|
|
150
159
|
const RERUN_PAUSE_MS = 60_000
|
|
151
160
|
|
|
@@ -157,18 +166,21 @@ async function pause(ms: number): Promise<void> {
|
|
|
157
166
|
})
|
|
158
167
|
}
|
|
159
168
|
|
|
160
|
-
function
|
|
169
|
+
function is_verdict(result: JoshResult, entries: ReadonlyArray<string>): boolean {
|
|
161
170
|
const verdict = result.out.split('\n', 1)[FIRST_LINE] ?? ''
|
|
162
171
|
|
|
163
172
|
return (
|
|
164
173
|
result.code === SUCCESS &&
|
|
165
|
-
|
|
174
|
+
entries.some((entry) => verdict === entry || verdict.startsWith(`${entry} `))
|
|
166
175
|
)
|
|
167
176
|
}
|
|
168
177
|
|
|
169
178
|
// A record that was removed during the pause answers `undefined`: its stale verdict must not reach a
|
|
170
179
|
// session, so the supervisor's own next pass re-reads the record and ends the run as `ended` or
|
|
171
180
|
// `stopped`; a rerun would only fail on it and report the run as `failed`.
|
|
181
|
+
//
|
|
182
|
+
// **A spent window answers `undefined` too**, so the supervisor's next pass checks its code before it
|
|
183
|
+
// drives again; the restarted driver adopts the lanes still in flight.
|
|
172
184
|
async function run_driver(
|
|
173
185
|
target: string,
|
|
174
186
|
args: ReadonlyArray<string>,
|
|
@@ -176,7 +188,8 @@ async function run_driver(
|
|
|
176
188
|
remaining: number,
|
|
177
189
|
): Promise<JoshResult | undefined> {
|
|
178
190
|
const result = await josh_command.josh_run(args, true)
|
|
179
|
-
if (
|
|
191
|
+
if (is_verdict(result, [WINDOW_VERDICT])) return undefined
|
|
192
|
+
if (remaining === 0 || !is_verdict(result, RERUN_VERDICTS)) return result
|
|
180
193
|
|
|
181
194
|
await wait(RERUN_PAUSE_MS)
|
|
182
195
|
if (run_carry.read_carry(target).kind !== 'carried') return undefined
|
|
@@ -211,4 +224,4 @@ async function drive(target: string, wait: Pause = pause): Promise<DriveResult>
|
|
|
211
224
|
)
|
|
212
225
|
}
|
|
213
226
|
|
|
214
|
-
export const run_wake_driver = { RERUN_LIMIT, drive, driver_args, driver_result }
|
|
227
|
+
export const run_wake_driver = { RERUN_LIMIT, WINDOW_MS, drive, driver_args, driver_result }
|