@joshuafolkken/kit 1.1471.0 → 1.1784.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/settings.json +6 -6
- package/.claude/skills/epic-commands/SKILL.md +26 -77
- package/.claude/skills/epic-commands/epic-bundle.md +12 -6
- package/.claude/skills/epic-commands/execution-waves.md +1 -2
- package/.claude/skills/verify-ui/SKILL.md +1 -2
- package/.claude/skills/workflow-commands/SKILL.md +12 -14
- package/.claude/skills/workflow-commands/background-commands.md +8 -12
- package/.claude/skills/workflow-commands/backlogrun-child.md +13 -18
- package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +7 -25
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +23 -28
- package/.claude/skills/workflow-commands/backlogrun-park.md +16 -31
- package/.claude/skills/workflow-commands/backlogrun-progress.md +12 -21
- package/.claude/skills/workflow-commands/backlogrun-recovery.md +12 -12
- package/.claude/skills/workflow-commands/backlogrun-steps.md +12 -20
- package/.claude/skills/workflow-commands/backlogrun.md +32 -51
- package/.claude/skills/workflow-commands/chain-rule.md +18 -11
- package/.claude/skills/workflow-commands/delegation.md +13 -8
- package/.claude/skills/workflow-commands/entry-sequence.md +10 -12
- package/.claude/skills/workflow-commands/followup.md +10 -35
- package/.claude/skills/workflow-commands/fullrun-steps.md +38 -49
- package/.claude/skills/workflow-commands/fullrun.md +6 -8
- package/.claude/skills/workflow-commands/halfrun.md +20 -32
- package/.claude/skills/workflow-commands/into-target.md +1 -2
- package/.claude/skills/workflow-commands/issue-comments.md +19 -15
- package/.claude/skills/workflow-commands/issue-scout.md +5 -4
- package/.claude/skills/workflow-commands/kickoff.md +24 -23
- package/.claude/skills/workflow-commands/latest-gate.md +9 -18
- package/.claude/skills/workflow-commands/needs-human-review.md +11 -19
- package/.claude/skills/workflow-commands/observation-filing.md +4 -50
- package/.claude/skills/workflow-commands/observation-ledger.md +5 -10
- package/.claude/skills/workflow-commands/pre-gate-cut.md +22 -44
- package/.claude/skills/workflow-commands/prerequisite.md +11 -18
- package/.claude/skills/workflow-commands/progress-watcher.md +3 -8
- package/.claude/skills/workflow-commands/prrun.md +6 -12
- package/.claude/skills/workflow-commands/retrospective.md +5 -5
- package/.claude/skills/workflow-commands/split-assessment.md +14 -4
- package/.claude/skills/workflow-commands/target-repository.md +1 -2
- package/.claude/skills/workflow-commands/working-tree-hold.md +11 -13
- package/.codex/hooks.json +6 -6
- package/.github/actions/setup-node/action.yml +10 -1
- package/.github/actions/setup-pnpm/action.yml +1 -1
- package/.github/dependabot.yml +16 -0
- package/.github/release.yml +0 -2
- package/.github/workflows/ci.yml +121 -11
- package/.github/workflows/publish.yml +10 -3
- package/.github/workflows/sonar-qube.yml +1 -0
- package/.prettierignore +2 -0
- package/.vscode/tasks.json +1 -2
- package/CLAUDE.md +4 -8
- package/README.md +4 -2
- package/SECURITY.md +1 -1
- package/cspell/index.yaml +7 -0
- package/dist/CLAUDE.md +4 -8
- package/dist/commands/document-read-cli.js +882 -0
- package/dist/commands/{document-section-cli.js → document-section-main.js} +137 -62
- package/dist/commands/read-set-cli.js +1867 -0
- package/dist/commands/run-prep-main.js +21653 -0
- package/dist/commands/run-step-cli.js +23880 -0
- package/dist/config-merge/index.js +5 -1
- package/dist/hooks/audit-provision.js +20 -35
- package/dist/hooks/{chunk-DGT54IH5.js → chunk-AZX4FGQ3.js} +63 -17
- package/dist/hooks/chunk-CWMBGKYW.js +6483 -0
- package/dist/hooks/chunk-O2YBIDSI.js +4306 -0
- package/dist/hooks/{chunk-AS74OU3D.js → chunk-PT5R6UJD.js} +4582 -2118
- package/dist/hooks/chunk-TUIFS5E7.js +72 -0
- package/dist/hooks/{chunk-723HKZO5.js → chunk-VWWCFGWK.js} +1 -1
- package/dist/hooks/{chunk-E7OIKX5Z.js → chunk-WR2KQAYZ.js} +1863 -382
- package/dist/hooks/{chunk-KC5AK2GF.js → chunk-XGBNSWEI.js} +248 -46
- package/dist/hooks/chunk-YCDOIR3I.js +3456 -0
- package/dist/hooks/codex-hook-adapter.js +10 -19
- package/dist/hooks/format-edited.js +5 -5
- package/dist/hooks/inputs.json +436 -257
- package/dist/hooks/pretool-guard.js +7 -22
- package/dist/hooks/session-lang.js +380 -42
- package/dist/hooks/stop-guard.js +8711 -782
- package/dist/josh.js +5263 -997
- package/dist/self-sync-guard/index.js +74 -10
- package/dist/version/index.js +115 -406
- package/eslint/base.js +1 -1
- package/lefthook/base.yml +8 -4
- package/package.json +17 -53
- package/pnpm-workspace.yaml +4 -2
- package/prompts/coding-standards.md +1 -1
- package/prompts/collaboration-workflow/file-edits.md +1 -9
- package/prompts/collaboration-workflow/gh-rest.md +1 -2
- package/prompts/collaboration-workflow/issue-citation.md +2 -4
- package/prompts/collaboration-workflow/issue-template.md +42 -17
- package/prompts/collaboration-workflow/lane-instructions.md +34 -0
- package/prompts/collaboration-workflow/measurement.md +37 -0
- package/prompts/collaboration-workflow/operating-rules.md +6 -12
- package/prompts/collaboration-workflow/output-bounds.md +4 -9
- package/prompts/collaboration-workflow/overview.md +1 -1
- package/prompts/collaboration-workflow/plan-comment.md +3 -42
- package/prompts/collaboration-workflow/principles.md +19 -8
- package/prompts/collaboration-workflow/report-format.md +37 -57
- package/prompts/collaboration-workflow/residency.md +12 -8
- package/prompts/collaboration-workflow/rule-delivery.md +3 -11
- package/prompts/collaboration-workflow/shell-body.md +8 -18
- package/prompts/collaboration-workflow/turn-batching.md +4 -6
- package/prompts/collaboration-workflow/upstream-interrupt.md +16 -6
- package/prompts/collaboration-workflow/wip-cap.md +7 -7
- package/prompts/collaboration-workflow.md +4 -7
- package/prompts/refactoring.md +1 -1
- package/prompts/review-rubric.md +1 -2
- package/prompts/review.md +45 -26
- package/prompts/testing-guide.md +10 -45
- package/scripts/agent/agent-argv.ts +20 -4
- package/scripts/agent/agent-event.ts +15 -15
- package/scripts/agent/agent-exit-record.ts +13 -1
- package/scripts/agent/agent-role-profile.ts +101 -45
- package/scripts/agent/agent-safe-text.ts +60 -0
- package/scripts/agent/api-auth.ts +41 -0
- package/scripts/agent/api-outage.ts +1 -1
- package/scripts/agent/claude-agent-argv.ts +14 -0
- package/scripts/agent/codex-agent-argv.ts +2 -0
- package/scripts/agent/lane-instructions.ts +144 -0
- package/scripts/auto-ok/auto-ok-cli.ts +14 -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 +6 -7
- package/scripts/backlog/backlog-defect-priority.ts +4 -3
- 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 +113 -28
- package/scripts/backlog/backlog-drive-hold.ts +162 -0
- package/scripts/backlog/backlog-drive-idle.ts +151 -0
- package/scripts/backlog/backlog-drive-judge.ts +25 -0
- package/scripts/backlog/backlog-drive-memory.ts +126 -0
- package/scripts/backlog/backlog-drive-named-offer.ts +5 -10
- package/scripts/backlog/backlog-drive-named.ts +54 -7
- package/scripts/backlog/backlog-drive-offer-argv.ts +3 -8
- package/scripts/backlog/backlog-drive-paused.ts +169 -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 +79 -75
- package/scripts/backlog/backlog-next-main.ts +16 -0
- package/scripts/backlog/backlog-next-shared.ts +73 -0
- package/scripts/backlog/backlog-next.ts +48 -16
- package/scripts/backlog/backlog-occupied.ts +69 -0
- 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 +22 -4
- package/scripts/backlog/backlog-plan-read.ts +6 -2
- package/scripts/backlog/backlog-plan.ts +18 -4
- package/scripts/backlog/backlog-pool.ts +10 -10
- package/scripts/backlog/backlog-rank.ts +10 -2
- package/scripts/backlog/backlog-ready.ts +137 -18
- package/scripts/backlog/backlog-stalled-detect.ts +109 -36
- package/scripts/backlog/backlog-stalled.ts +52 -16
- package/scripts/backlog/backlog-wait-cause.ts +86 -0
- package/scripts/backlog/backlog-waves.ts +39 -13
- package/scripts/backlog/backlogrun-args.ts +19 -7
- package/scripts/backlog/backlogrun-cli.ts +19 -5
- package/scripts/backlog/backlogrun-launch.ts +6 -0
- 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/cost-blocks.ts +22 -37
- package/scripts/cost-runtime/cost-cli.ts +31 -14
- package/scripts/cost-runtime/cost-main.ts +12 -0
- package/scripts/cost-runtime/cost-transcript.ts +1 -0
- package/scripts/delegation/delegation-policy.ts +17 -4
- package/scripts/delegation/duplicate-read-guard.ts +2 -10
- package/scripts/delegation/investigation-guard.ts +15 -73
- package/scripts/delegation/investigation-reads.ts +3 -5
- package/scripts/dependabot/dependabot-cooldown.ts +194 -0
- package/scripts/discovery/repo-discovery.ts +24 -6
- package/scripts/doctor/doctor-consumer.ts +2 -5
- package/scripts/document/document-byte-budget.ts +9 -6
- package/scripts/document/document-scan.ts +1 -1
- package/scripts/document/document-section-cli.ts +17 -13
- package/scripts/document/document-section-main.ts +12 -0
- package/scripts/document/entry-read-budget.ts +2 -2
- package/scripts/document/read-set-cli.ts +4 -1
- package/scripts/epic/epic-audit-cli.ts +12 -6
- package/scripts/epic/epic-audit-orphans.ts +5 -8
- package/scripts/epic/epic-audit.ts +52 -1
- package/scripts/epic/epic-bundle-apply.ts +137 -0
- package/scripts/epic/epic-bundle-cli.ts +32 -121
- package/scripts/epic/epic-bundle-evidence.ts +49 -26
- package/scripts/epic/epic-bundle-format.ts +116 -0
- package/scripts/epic/epic-bundle-main.ts +17 -0
- package/scripts/epic/epic-bundle-referenced.ts +14 -3
- package/scripts/epic/epic-bundle.ts +17 -9
- package/scripts/epic/epic-busy.ts +5 -12
- package/scripts/epic/epic-classify.ts +24 -15
- package/scripts/epic/epic-cli-argv.ts +31 -0
- 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 +4 -0
- package/scripts/epic/epic-graph.ts +2 -0
- package/scripts/epic/epic-issue.ts +5 -1
- 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-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-cli.ts +2 -2
- package/scripts/followup/followup-checks-event.ts +8 -3
- package/scripts/followup/followup-coderabbit-wait.ts +82 -0
- package/scripts/followup/followup-review-gates.ts +81 -0
- package/scripts/followup/git-followup-stages.ts +13 -3
- package/scripts/followup/git-followup-workflow.ts +31 -60
- package/scripts/followup/git-pr-followup-wrapup.ts +9 -14
- package/scripts/followup/git-pr-followup.ts +36 -8
- package/scripts/fresh-machine/fresh-machine-cli.ts +1 -1
- package/scripts/fresh-machine/fresh-machine-run.ts +8 -8
- package/scripts/fresh-machine/specs/kit-test-backlogrun.json +1 -1
- package/scripts/gate/busy-average.ts +58 -0
- package/scripts/gate/check-cpu.ts +60 -0
- package/scripts/gate/check-inputs.ts +73 -0
- package/scripts/gate/check-reuse.ts +141 -0
- package/scripts/gate/command-memory.ts +192 -0
- package/scripts/gate/core-admission.ts +218 -28
- package/scripts/gate/core-budget-timing.ts +37 -0
- package/scripts/gate/core-budget.ts +150 -119
- package/scripts/gate/core-wait-record.ts +48 -0
- package/scripts/gate/core-wait.ts +162 -0
- package/scripts/gate/core-weights.ts +86 -0
- package/scripts/gate/free-cores.ts +72 -0
- package/scripts/gate/gate-ledger.ts +49 -7
- package/scripts/gate/gate-plan.ts +44 -15
- package/scripts/gate/gate-report.ts +29 -4
- package/scripts/gate/gate-run-steps.ts +195 -0
- package/scripts/gate/gate-skip.ts +12 -2
- package/scripts/gate/gate-steps.ts +12 -1
- package/scripts/gate/held-mark.ts +55 -0
- package/scripts/gate/input-fingerprint.ts +42 -0
- package/scripts/gate/machine-capacity.ts +124 -31
- package/scripts/gate/moved-paths.ts +67 -0
- package/scripts/gate/pre-commit-type-check.ts +14 -1
- package/scripts/gate/project-checks.ts +5 -12
- package/scripts/gate/scoped-green.ts +12 -8
- package/scripts/gate/since-green.ts +62 -0
- package/scripts/gate/toolchain-inputs.ts +115 -0
- package/scripts/gate/verification-gate.ts +65 -129
- package/scripts/gate/verification-inputs.ts +250 -0
- package/scripts/gh/gh-author-association.ts +96 -9
- package/scripts/gh/git-ai-review-scan.ts +4 -2
- package/scripts/gh/git-gh-api-path.ts +15 -0
- package/scripts/gh/git-gh-branch-rules.ts +73 -0
- package/scripts/gh/git-gh-conditional.ts +5 -2
- package/scripts/gh/git-gh-issue-read.ts +5 -1
- package/scripts/gh/git-gh-issue-rest.ts +1 -0
- package/scripts/gh/git-gh-issue-write.ts +77 -17
- package/scripts/gh/git-gh-issue.ts +7 -3
- package/scripts/gh/git-gh-poll-read.ts +89 -0
- package/scripts/gh/git-gh-pr-auto-merge.ts +8 -3
- package/scripts/gh/git-gh-pr-rest.ts +1 -1
- package/scripts/gh/git-gh-pr-snapshot.ts +33 -20
- package/scripts/gh/git-gh-pr.ts +27 -15
- package/scripts/gh/git-pr-checks-eval.ts +39 -7
- package/scripts/gh/git-pr-checks-parse.ts +39 -9
- package/scripts/gh/git-pr-merge-checked.ts +80 -0
- package/scripts/gh/git-pr.ts +13 -1
- package/scripts/git/base-tree.ts +19 -2
- package/scripts/git/changed-file-scope.ts +6 -4
- package/scripts/git/changed-paths.ts +18 -1
- package/scripts/git/git-diff-reads.ts +27 -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 +17 -7
- package/scripts/git/git-spawn.ts +1 -2
- package/scripts/git/git-status.ts +4 -4
- package/scripts/git/main-merge-main.ts +12 -0
- package/scripts/git/main-merge-regenerate.ts +78 -0
- package/scripts/git/main-merge.ts +39 -14
- package/scripts/git/main-sync-main.ts +12 -0
- package/scripts/git/main-sync.ts +0 -9
- package/scripts/git/stash/git-stash.ts +27 -4
- 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 +76 -0
- package/scripts/git/stash/stash-push-main.ts +12 -0
- package/scripts/hooks/batch-guard.ts +5 -16
- package/scripts/hooks/check-commit-message-main.ts +8 -0
- package/scripts/hooks/check-commit-message.ts +4 -7
- package/scripts/hooks/format-edited-file.ts +8 -24
- package/scripts/hooks/pre-commit-lint.ts +118 -0
- package/scripts/hooks/pre-push-unit.ts +4 -2
- package/scripts/hooks/pretool-guard-cli.ts +1 -8
- package/scripts/hooks/pretool-guard.ts +57 -69
- package/scripts/hooks/reserved-run.ts +67 -8
- package/scripts/hooks/run-hook.sh +18 -11
- package/scripts/hooks/shell-rules-notice.ts +37 -0
- package/scripts/hooks/stop-actions.ts +185 -0
- package/scripts/hooks/stop-guard.ts +72 -27
- package/scripts/init/hook-command-rewrite.ts +19 -5
- package/scripts/init/hook-launch.ts +15 -12
- 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/defect-origin-cli.ts +106 -0
- package/scripts/issue/defect-origin-line.ts +60 -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 +34 -78
- 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/expected-effect-lint.ts +60 -0
- package/scripts/issue/issue-already-done-cli.ts +62 -0
- package/scripts/issue/issue-body-or-comment.ts +40 -0
- package/scripts/issue/issue-cite-cli.ts +33 -22
- package/scripts/issue/issue-cite-main.ts +12 -0
- package/scripts/issue/issue-classification.ts +13 -8
- 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 +100 -0
- package/scripts/issue/issue-file-cli.ts +29 -7
- package/scripts/issue/issue-file.ts +19 -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 +81 -90
- package/scripts/issue/issue-lint-cli.ts +7 -13
- package/scripts/issue/issue-lint-main.ts +12 -0
- package/scripts/issue/issue-measured-cli.ts +56 -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 +111 -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.ts +151 -0
- package/scripts/issue/issue-rank.ts +7 -1
- package/scripts/issue/issue-read-cli.ts +3 -10
- package/scripts/issue/issue-read-main.ts +12 -0
- package/scripts/issue/issue-read.ts +29 -5
- 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 +192 -0
- package/scripts/issue/issue-sample-source.ts +76 -0
- package/scripts/issue/issue-scout-cli.ts +19 -25
- package/scripts/issue/issue-scout-main.ts +14 -0
- package/scripts/issue/issue-state-cli.ts +0 -10
- package/scripts/issue/issue-state-main.ts +12 -0
- package/scripts/issue/issue-watch-diff.ts +56 -15
- package/scripts/issue/issue-watch.ts +2 -1
- package/scripts/issue/issue-wip.ts +2 -7
- package/scripts/issue/markdown-section.ts +19 -5
- package/scripts/issue/measure-rerun-cli.ts +13 -8
- 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 +55 -0
- package/scripts/issue/plan-consumers.ts +127 -0
- package/scripts/josh/agent-session-environment.ts +1 -1
- package/scripts/josh/command-usage.ts +82 -0
- package/scripts/josh/file-map-stamp.ts +49 -16
- package/scripts/josh/hook-decision.ts +32 -20
- package/scripts/josh/josh-command-map.ts +6 -1
- package/scripts/josh/josh-command-types.ts +65 -13
- package/scripts/josh/josh-commands-agent-hooks.ts +83 -0
- package/scripts/josh/josh-commands-ai.ts +169 -157
- 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 +111 -71
- 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 +31 -2
- package/scripts/josh/josh-commands-issue-write.ts +181 -0
- package/scripts/josh/josh-commands-issue.ts +124 -24
- package/scripts/josh/josh-commands-lane.ts +112 -2
- package/scripts/josh/josh-commands-lint.ts +19 -8
- package/scripts/josh/josh-commands-maintenance.ts +112 -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 +124 -0
- package/scripts/josh/josh-commands-run.ts +211 -23
- package/scripts/josh/josh-commands-ship.ts +169 -0
- package/scripts/josh/josh-commands-split.ts +9 -0
- package/scripts/josh/josh-commands-versioning.ts +49 -2
- package/scripts/josh/josh-commands-workflow.ts +149 -6
- package/scripts/josh/josh-logic.ts +11 -27
- package/scripts/josh/josh.ts +14 -5
- package/scripts/josh/package-directory.ts +18 -0
- package/scripts/josh/process-identity.ts +13 -4
- 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 +9 -15
- package/scripts/lane/lane-await.ts +51 -12
- package/scripts/lane/lane-cache.ts +5 -30
- package/scripts/lane/lane-capacity.ts +19 -22
- package/scripts/lane/lane-check-stats.ts +97 -0
- package/scripts/lane/lane-child-invocation.ts +43 -4
- package/scripts/lane/lane-cli.ts +15 -5
- package/scripts/lane/lane-close.ts +86 -18
- package/scripts/lane/lane-core-wait-stats.ts +66 -0
- package/scripts/lane/lane-dispatch.ts +27 -6
- package/scripts/lane/lane-gap-stats.ts +156 -0
- package/scripts/lane/lane-guard-policy.ts +2 -2
- package/scripts/lane/lane-handoff.ts +76 -1
- package/scripts/lane/lane-held-stats.ts +129 -0
- package/scripts/lane/lane-install.ts +16 -15
- package/scripts/lane/lane-launch-cli.ts +0 -9
- package/scripts/lane/lane-launch-main.ts +12 -0
- package/scripts/lane/lane-ledger-schema.ts +266 -0
- package/scripts/lane/lane-ledger.ts +108 -97
- package/scripts/lane/lane-limit-cli.ts +19 -9
- package/scripts/lane/lane-measure-cli.ts +58 -10
- package/scripts/lane/lane-open.ts +9 -1
- package/scripts/lane/lane-parked.ts +3 -3
- package/scripts/lane/lane-pause-cli.ts +130 -0
- package/scripts/lane/lane-pause.ts +158 -0
- package/scripts/lane/lane-preserve.ts +29 -1
- 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 +33 -10
- package/scripts/lane/lane-residents.ts +162 -0
- package/scripts/lane/lane-restart.ts +26 -27
- package/scripts/lane/lane-round-two-stats.ts +49 -0
- package/scripts/lane/lane-sampler.ts +4 -0
- package/scripts/lane/lane-session-action.ts +160 -0
- package/scripts/lane/lane-session-broker.ts +134 -134
- package/scripts/lane/lane-snapshot-trace.ts +84 -0
- package/scripts/lane/lane-spans.ts +51 -0
- package/scripts/lane/lane-spent.ts +6 -3
- package/scripts/lane/lane-stage-stats.ts +7 -2
- package/scripts/lane/lane-state.ts +302 -0
- package/scripts/lane/lane-stats.ts +58 -4
- package/scripts/lane/lane-stop-stats.ts +113 -37
- package/scripts/lane/lane-test-related-stats.ts +127 -0
- package/scripts/lane/lane-transcript-calls.ts +145 -0
- package/scripts/lane/lane-transcript-stats.ts +168 -0
- package/scripts/lane/lane-vacant.ts +13 -3
- package/scripts/lane/lane-withdraw-cli.ts +72 -0
- package/scripts/lane/lane-withdraw.ts +183 -0
- 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/read-file.ts +3 -1
- 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/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.ts +265 -0
- package/scripts/lint/format.ts +14 -5
- package/scripts/lint/import-graph.ts +279 -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 +72 -33
- package/scripts/lint/lint-related-scope.ts +33 -24
- package/scripts/lint/lint-related.ts +38 -6
- package/scripts/notify/confirmation-options.ts +1 -2
- package/scripts/notify/telegram-notify.ts +20 -20
- package/scripts/notify/telegram-test-logic.ts +0 -1
- package/scripts/notify/telegram-test-main.ts +8 -0
- package/scripts/notify/telegram-test.ts +12 -11
- package/scripts/observations/observation-ledger.ts +13 -0
- package/scripts/observations/observations-flush-landing.ts +5 -3
- package/scripts/observations/observations-flush.ts +6 -1
- package/scripts/overrides/overrides-check.ts +2 -5
- 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 +18 -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 +6 -15
- package/scripts/report/report-format-reference.ts +4 -0
- package/scripts/report/report-labels.ts +155 -0
- package/scripts/report/report-lint-cli.ts +3 -0
- package/scripts/report/report-lint.ts +85 -110
- package/scripts/report/report-template-cli.ts +59 -0
- package/scripts/report/report-template.ts +112 -0
- package/scripts/review/acceptance-map-check.ts +61 -0
- package/scripts/review/acceptance-map.ts +206 -0
- package/scripts/review/removed-tests-check.ts +86 -0
- package/scripts/review/removed-tests.ts +149 -0
- package/scripts/review/review-brief-cli.ts +82 -16
- package/scripts/review/review-brief-main.ts +12 -0
- package/scripts/review/review-brief.ts +31 -3
- package/scripts/review/review-code-tree.ts +10 -6
- package/scripts/review/review-comment-round.ts +26 -8
- package/scripts/review/review-finding-ledger.ts +30 -15
- package/scripts/review/review-interaction.ts +94 -0
- package/scripts/review/review-readers-scan.ts +163 -0
- package/scripts/review/review-record-cli.ts +69 -30
- package/scripts/review/review-record-main.ts +12 -0
- package/scripts/review/review-round-one-blobs.ts +221 -0
- package/scripts/review/review-round2-cli.ts +49 -12
- package/scripts/review/review-round2.ts +80 -12
- package/scripts/review/review-stamps.ts +19 -1
- package/scripts/review/review-stop-log.ts +96 -0
- package/scripts/review/review-stops-cli.ts +85 -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 +67 -0
- package/scripts/rules/bash-triggers.ts +46 -3
- package/scripts/rules/decision-oracle-batch.ts +9 -1
- package/scripts/rules/decision-oracle.ts +2 -2
- package/scripts/rules/delivered-rules.ts +90 -3
- package/scripts/rules/destructive-command.ts +8 -1
- package/scripts/rules/direct-filing.ts +10 -2
- package/scripts/rules/direct-issue-comment.ts +117 -0
- package/scripts/rules/direct-pr-create.ts +69 -3
- package/scripts/rules/early-heartbeat.ts +2 -1
- package/scripts/rules/file-body.ts +7 -0
- package/scripts/rules/filing-cap.ts +8 -0
- package/scripts/rules/firing-point.ts +6 -5
- package/scripts/rules/git-argv.ts +72 -14
- package/scripts/rules/git-force.ts +12 -2
- package/scripts/rules/guard-remedy.ts +121 -0
- package/scripts/rules/implementation-cut-verdict.ts +1 -1
- package/scripts/rules/implementation-cut.ts +11 -3
- package/scripts/rules/index-guard.ts +8 -1
- package/scripts/rules/issue-comments.ts +76 -7
- package/scripts/rules/josh-git-bare.ts +7 -0
- package/scripts/rules/lane-background.ts +67 -25
- package/scripts/rules/lane-carry-conflict.ts +6 -0
- package/scripts/rules/lane-direct-tool.ts +74 -0
- package/scripts/rules/lane-interactive-ask.ts +9 -2
- package/scripts/rules/lane-park.ts +45 -23
- package/scripts/rules/lane-split-park.ts +10 -2
- package/scripts/rules/lane-switch-main.ts +7 -0
- package/scripts/rules/last-prompt.ts +50 -5
- package/scripts/rules/oracle-consulted.ts +10 -0
- package/scripts/rules/oracle-firing.ts +1 -0
- package/scripts/rules/oracle-list-cli.ts +7 -0
- package/scripts/rules/permission-guards.ts +3 -0
- package/scripts/rules/piped-verification.ts +4 -2
- package/scripts/rules/poll-loop.ts +7 -0
- package/scripts/rules/pr-merge.ts +123 -0
- package/scripts/rules/protected-files.ts +32 -5
- package/scripts/rules/raw-field-body.ts +6 -0
- package/scripts/rules/rule-body-guard.ts +8 -0
- package/scripts/rules/rule-list.ts +12 -28
- package/scripts/rules/rule-rewrite.ts +114 -0
- package/scripts/rules/rule-value-cache.ts +4 -9
- package/scripts/rules/rule-value-cli.ts +51 -32
- package/scripts/rules/rule-value.ts +8 -2
- package/scripts/rules/shell-segments.ts +50 -0
- package/scripts/rules/stop-decision.ts +77 -0
- package/scripts/rules/stop-rule-rows.ts +64 -0
- package/scripts/rules/stop-rules.ts +150 -51
- package/scripts/rules/tail-commands.ts +15 -1
- package/scripts/rules/test-declared-commit.ts +11 -1
- package/scripts/rules/third-party-write.ts +7 -0
- package/scripts/rules/timed-rerun.ts +69 -0
- package/scripts/rules/worktree-guard.ts +13 -3
- package/scripts/run/board/run-board-app-name.ts +23 -0
- package/scripts/run/board/run-board-cli.ts +65 -30
- package/scripts/run/board/run-board-closed.ts +8 -2
- package/scripts/run/board/run-board-earlier.ts +94 -0
- package/scripts/run/board/run-board-ending-reason.ts +67 -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 +153 -36
- package/scripts/run/board/run-board-fold.ts +123 -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 +119 -31
- package/scripts/run/board/run-board-header.ts +86 -21
- 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 +118 -71
- package/scripts/run/board/run-board-lane-state.ts +109 -0
- package/scripts/run/board/run-board-lane-time.ts +122 -0
- package/scripts/run/board/run-board-layout.ts +240 -61
- package/scripts/run/board/run-board-length.ts +52 -0
- 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 +52 -31
- package/scripts/run/board/run-board-now.ts +1 -1
- package/scripts/run/board/run-board-operation.ts +15 -33
- package/scripts/run/board/run-board-phase.ts +1 -1
- package/scripts/run/board/run-board-plan-shared.ts +115 -0
- package/scripts/run/board/run-board-plan.ts +55 -3
- 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 +153 -13
- package/scripts/run/board/run-board-reason.ts +238 -45
- package/scripts/run/board/run-board-released.ts +35 -0
- package/scripts/run/board/run-board-render-checks.ts +39 -5
- package/scripts/run/board/run-board-render-condition.ts +96 -0
- package/scripts/run/board/run-board-render-drawn.ts +67 -0
- package/scripts/run/board/run-board-render-foot.ts +59 -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 +80 -0
- package/scripts/run/board/run-board-render-legend.ts +117 -47
- 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 +125 -0
- package/scripts/run/board/run-board-render.ts +206 -259
- package/scripts/run/board/run-board-roots.ts +54 -0
- package/scripts/run/board/run-board-row-yield.ts +10 -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 +2 -2
- package/scripts/run/board/run-board-state.ts +23 -29
- package/scripts/run/board/run-board-status.ts +206 -79
- package/scripts/run/board/run-board-thanks-read.ts +2 -2
- package/scripts/run/board/run-board-tick.ts +123 -104
- 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.ts +9 -4
- package/scripts/run/cut/run-cut-cli.ts +3 -2
- package/scripts/run/cut/run-cut-handoff.ts +2 -2
- package/scripts/run/cut/run-cut-report.ts +16 -0
- package/scripts/run/detached-launch.ts +23 -4
- package/scripts/run/entry/run-entry-cli.ts +8 -1
- package/scripts/run/event/run-event-cli.ts +1 -5
- package/scripts/run/event/run-event-filed.ts +12 -6
- package/scripts/run/event/run-event-follow.ts +2 -3
- package/scripts/run/event/run-event-render.ts +7 -10
- package/scripts/run/event/run-event-scope.ts +20 -2
- package/scripts/run/event/run-event-stream-emit.ts +78 -11
- package/scripts/run/event/run-event-stream.ts +37 -7
- 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-hold-session.ts +46 -0
- package/scripts/run/hold/run-hold.ts +7 -1
- package/scripts/run/hold/run-stop-notify.ts +183 -0
- package/scripts/run/launch-priority.ts +32 -0
- package/scripts/run/merge/run-merge-auth.ts +31 -0
- package/scripts/run/merge/run-merge-cli.ts +72 -107
- 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 +23 -0
- package/scripts/run/merge/run-merge-restart.ts +39 -0
- package/scripts/run/merge/run-merge-ship.ts +20 -4
- package/scripts/run/merge/run-merge-signals.ts +123 -0
- package/scripts/run/merge/run-merge-steps.ts +128 -83
- package/scripts/run/merge/run-merge.ts +53 -40
- 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.ts +2 -1
- 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 +61 -30
- package/scripts/run/run-next.ts +1 -1
- package/scripts/run/run-parent-cut-hook.ts +2 -2
- package/scripts/run/run-poll-hook.ts +157 -0
- 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 +6 -0
- package/scripts/run/run-report-cli.ts +101 -13
- package/scripts/run/run-report-handoff.ts +114 -0
- package/scripts/run/run-step-cli.ts +22 -15
- package/scripts/run/run-step-section.ts +85 -0
- package/scripts/run/run-step.ts +1 -1
- 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 +121 -0
- package/scripts/run/ship/run-ship-body-draft.ts +110 -0
- package/scripts/run/ship/run-ship-cli.ts +67 -151
- package/scripts/run/ship/run-ship-detach.ts +27 -7
- package/scripts/run/ship/run-ship-infra-retry.ts +59 -0
- package/scripts/run/ship/run-ship-next.ts +27 -3
- package/scripts/run/ship/run-ship-overlap.ts +232 -0
- package/scripts/run/ship/run-ship-place.ts +96 -0
- package/scripts/run/ship/run-ship-pre-detach-timed.ts +43 -0
- package/scripts/run/ship/run-ship-pre-detach.ts +102 -27
- package/scripts/run/ship/run-ship-preflight.ts +161 -30
- package/scripts/run/ship/run-ship-probe.ts +11 -3
- package/scripts/run/ship/run-ship-relaunch-cap.ts +70 -0
- package/scripts/run/ship/run-ship-removed-rows.ts +61 -0
- package/scripts/run/ship/run-ship-return.ts +123 -15
- package/scripts/run/ship/run-ship-review-steps.ts +105 -149
- package/scripts/run/ship/run-ship-review.ts +73 -6
- package/scripts/run/ship/run-ship-reviewer.ts +207 -0
- package/scripts/run/ship/run-ship-stage.ts +55 -6
- package/scripts/run/ship/run-ship-steps.ts +46 -15
- package/scripts/run/ship/run-ship-stop-cause.ts +135 -0
- package/scripts/run/ship/run-ship-stop-context.ts +206 -0
- package/scripts/run/ship/run-ship-stop-text.ts +11 -6
- package/scripts/run/ship/run-ship-sync.ts +57 -12
- package/scripts/run/ship/run-ship.ts +30 -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-cli.ts +119 -100
- package/scripts/run/wake/run-wake-code.ts +83 -0
- package/scripts/run/wake/run-wake-driver.ts +19 -8
- package/scripts/run/wake/run-wake-loop.ts +34 -3
- package/scripts/run/wake/run-wake-main.ts +13 -0
- package/scripts/run/wake/run-wake-ports.ts +90 -0
- package/scripts/run/wake/run-wake-takeover.ts +66 -0
- package/scripts/run/wake/run-wake.ts +2 -1
- 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 +3 -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 +12 -0
- package/scripts/security/security-audit-provision.ts +11 -26
- package/scripts/security/security-audit.ts +6 -7
- 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 +15 -0
- package/scripts/split/split-measure.ts +65 -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/test-declared-changed.ts +2 -2
- package/scripts/test/test-declared.ts +1 -1
- package/scripts/test/test-e2e-guard.ts +55 -6
- package/scripts/test/test-e2e-stamp.ts +38 -0
- package/scripts/test/test-pinned-logic.ts +145 -0
- package/scripts/test/test-pinned-main.ts +78 -0
- package/scripts/test/test-pinned.ts +100 -0
- package/scripts/test/test-read-map.ts +264 -0
- package/scripts/test/test-read-recording.ts +91 -0
- package/scripts/test/test-read-trace.ts +148 -0
- package/scripts/test/test-red-main.ts +12 -0
- package/scripts/test/test-red.ts +12 -30
- package/scripts/test/test-related-main.ts +18 -0
- package/scripts/test/test-related-record.ts +119 -0
- package/scripts/test/test-related-scope.ts +229 -43
- package/scripts/test/test-related.ts +300 -22
- package/scripts/test/test-unit-guard-main.ts +15 -0
- package/scripts/test/test-unit-guard.ts +54 -21
- package/scripts/test/unit-count-file.ts +37 -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 +71 -137
- package/scripts/test/whole-suite-files.ts +63 -0
- package/scripts/time-runtime/time-background.ts +20 -2
- package/scripts/time-runtime/time-bundles.ts +4 -3
- 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 +10 -1
- package/scripts/time-runtime/time-shell.ts +126 -14
- package/scripts/time-runtime/time-spans.ts +1 -0
- package/scripts/time-runtime/time-tool-call.ts +7 -0
- package/scripts/time-runtime/time-transcript-line.ts +49 -62
- 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/effective-upstream.ts +6 -12
- package/scripts/version/latest-corepack.ts +17 -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 +10 -3
- package/templates/pnpm-workspace.basic.yaml +1 -1
- package/templates/sonar-project.properties +3 -2
- package/templates/workflows/ci.yml +12 -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-43ZHT22P.js +0 -3495
- package/dist/hooks/chunk-CDY4NFQG.js +0 -15
- package/dist/hooks/chunk-EUMACUK2.js +0 -2038
- package/dist/hooks/chunk-H5HVWYXK.js +0 -359
- package/dist/hooks/chunk-IIGFYXKC.js +0 -7104
- package/dist/hooks/chunk-IX6TTTI6.js +0 -95
- package/dist/hooks/chunk-J47HU5H5.js +0 -237
- package/dist/hooks/chunk-K4EOONYM.js +0 -45
- package/dist/hooks/chunk-K4LMBQC2.js +0 -68
- package/dist/hooks/chunk-SHGPANFB.js +0 -56
- package/dist/hooks/chunk-YHBZAJSV.js +0 -79
- package/dist/hooks/chunk-YYPI7SJZ.js +0 -131
- package/dist/hooks/duplicate-read-guard.js +0 -30
- package/dist/hooks/investigation-guard.js +0 -32
- package/scripts/backlog/backlog-stalled-cli.ts +0 -30
- 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/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/rule-guard.ts +0 -23
- package/scripts/rules/rule-registry-rows.ts +0 -282
- package/scripts/rules/rule-registry.ts +0 -109
- package/scripts/run/run-stranded-cli.ts +0 -27
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
import { lane_ledger } from '#scripts/lane/lane-ledger'
|
|
2
|
+
import type { DriveEnd, DrivePorts, DriveState, OfferRead, PassResult } from './backlog-drive'
|
|
3
|
+
import { backlog_ready } from './backlog-ready'
|
|
4
|
+
|
|
5
|
+
// Why a free lane stayed empty, written where `josh lane:stats` reads it (joshuafolkken/kit#3995).
|
|
6
|
+
//
|
|
7
|
+
// **The driver already dispatches the moment a lane frees**: a pass that collected a child asks the
|
|
8
|
+
// offer at once (`backlog-drive.ts` → `is_offering`). What a backlog stall episode could not say is
|
|
9
|
+
// why a free lane then stayed empty — an offer that started nothing, or the driver handed back to a
|
|
10
|
+
// session that had not restarted it yet. Each such pass records its reason; the time is derived in
|
|
11
|
+
// `lane-held-stats.ts`, so a hold is told apart from a dispatch that was simply slow.
|
|
12
|
+
//
|
|
13
|
+
// **Only a free lane is a hold.** Every lane taken is the limit doing its job, not idle capacity, and a
|
|
14
|
+
// finished run — a `stop`, the drain's `watch` or `retrospective` — owes no lane a child. Either writes
|
|
15
|
+
// a `released` entry instead, which ends the hold before it: a lane opened outside this driver can
|
|
16
|
+
// fill the pool, and no dispatch of this driver's would end that hold. A full pool's release is written
|
|
17
|
+
// once per hold, so it does not add a line on every pass; the finished run's is written every time.
|
|
18
|
+
|
|
19
|
+
const NO_FREE_LANES = 0
|
|
20
|
+
const OFFER_PREFIX = 'offer'
|
|
21
|
+
const HAND_BACK_PREFIX = 'hand-back'
|
|
22
|
+
const REASON_SEPARATOR = ':'
|
|
23
|
+
// The verdict that starts nothing more: the run is finishing, so the lanes it frees are no hold.
|
|
24
|
+
const STOP_VERDICT = 'stop'
|
|
25
|
+
// The ends that finished the run: nothing is owed a lane after them.
|
|
26
|
+
const FINISHED_REASONS: ReadonlySet<string> = new Set([STOP_VERDICT, 'watch', 'retrospective'])
|
|
27
|
+
|
|
28
|
+
interface HoldRecorder {
|
|
29
|
+
hold: DrivePorts['hold']
|
|
30
|
+
end: (end: DriveEnd) => Promise<void>
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// The issues an offer that started nothing waited on, when it named them (joshuafolkken/kit#4513).
|
|
34
|
+
interface HeldWaiting {
|
|
35
|
+
waiting?: ReadonlyArray<number> | undefined
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// A hold's reason, `undefined` for the finished run, and the issues its offer waited on.
|
|
39
|
+
interface HeldDraft extends HeldWaiting {
|
|
40
|
+
reason: string | undefined
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// Whether a hold may still be open — at a driver's start, one an earlier driver's hand-back left.
|
|
44
|
+
interface HoldLedger {
|
|
45
|
+
is_open: boolean
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// The reason an offer that started nothing holds a free lane, or `undefined` for the run's stop. The
|
|
49
|
+
// offer's cause stands in for its answer, so a `run:solo` wait is `offer:watch:solo` rather than one
|
|
50
|
+
// more `offer:watch:blocked` (joshuafolkken/kit#4396), and a dependency-chain or start-condition wait is
|
|
51
|
+
// `offer:watch:chain`, `offer:watch:gate` or `offer:watch:chain+gate` (joshuafolkken/kit#4513).
|
|
52
|
+
function offer_reason(read: OfferRead): string | undefined {
|
|
53
|
+
if (read.verdict === STOP_VERDICT) return undefined
|
|
54
|
+
|
|
55
|
+
const detail = read.cause ?? read.answer
|
|
56
|
+
const parts = [OFFER_PREFIX, read.verdict, ...(detail === undefined ? [] : [detail])]
|
|
57
|
+
|
|
58
|
+
return parts.join(REASON_SEPARATOR)
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// A continuing pass after an offer that started nothing is a hold; an ended one is the hand-back's.
|
|
62
|
+
async function held(
|
|
63
|
+
result: PassResult,
|
|
64
|
+
read: OfferRead,
|
|
65
|
+
ports: Pick<DrivePorts, 'hold'>,
|
|
66
|
+
): Promise<PassResult> {
|
|
67
|
+
if (result.kind === 'continue') await ports.hold(offer_reason(read), read.waiting)
|
|
68
|
+
|
|
69
|
+
return result
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// A collection whose `run:merge` answered `stop` — the consecutive-failure guard — finishes the run as
|
|
73
|
+
// an offer's `stop` does, but no offer follows it to release the hold, so it is released here. Left
|
|
74
|
+
// open, the lanes it freed read as held until the next driver's first offer (joshuafolkken/kit#4571).
|
|
75
|
+
async function stopped(
|
|
76
|
+
before: DriveState,
|
|
77
|
+
after: DriveState,
|
|
78
|
+
ports: Pick<DrivePorts, 'hold'>,
|
|
79
|
+
): Promise<void> {
|
|
80
|
+
if (after.is_stopping && !before.is_stopping) await ports.hold(undefined)
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// The reason a driver's end leaves the lanes waiting on a session, or `undefined` for the finished run.
|
|
84
|
+
function hand_back_reason(end: DriveEnd): string | undefined {
|
|
85
|
+
if (FINISHED_REASONS.has(end.reason)) return undefined
|
|
86
|
+
|
|
87
|
+
return [HAND_BACK_PREFIX, end.reason].join(REASON_SEPARATOR)
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// The free count, or `undefined` where the lane limit is unreadable: no hold is known then. The
|
|
91
|
+
// finished run (`reason` absent) reads as a full pool — it holds no lane either way.
|
|
92
|
+
async function free_count(
|
|
93
|
+
free_lanes: () => Promise<number>,
|
|
94
|
+
reason: string | undefined,
|
|
95
|
+
): Promise<number | undefined> {
|
|
96
|
+
if (reason === undefined) return NO_FREE_LANES
|
|
97
|
+
|
|
98
|
+
try {
|
|
99
|
+
return await free_lanes()
|
|
100
|
+
} catch {
|
|
101
|
+
return undefined
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
async function release(ledger: HoldLedger): Promise<void> {
|
|
106
|
+
ledger.is_open = false
|
|
107
|
+
await lane_ledger.record_released()
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
async function release_open(ledger: HoldLedger): Promise<void> {
|
|
111
|
+
if (ledger.is_open) await release(ledger)
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// A ledger line only while a lane is free. The finished run always writes its release: children parked
|
|
115
|
+
// since a full pool's release still wait for an offer answer, and only this line ends their wait
|
|
116
|
+
// (joshuafolkken/kit#4571). A full pool releases the open hold once, not on every pass.
|
|
117
|
+
async function record(
|
|
118
|
+
ledger: HoldLedger,
|
|
119
|
+
draft: HeldDraft,
|
|
120
|
+
count: number | undefined,
|
|
121
|
+
): Promise<void> {
|
|
122
|
+
if (count === undefined) return
|
|
123
|
+
|
|
124
|
+
if (draft.reason === undefined) {
|
|
125
|
+
await release(ledger)
|
|
126
|
+
|
|
127
|
+
return
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
if (count === NO_FREE_LANES) {
|
|
131
|
+
await release_open(ledger)
|
|
132
|
+
|
|
133
|
+
return
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
ledger.is_open = true
|
|
137
|
+
await lane_ledger.record_held({ reason: draft.reason, waiting: draft.waiting })
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
// The production `hold` port and the driver's end, sharing whether a hold is open. Best-effort like
|
|
141
|
+
// every ledger write — an unreadable lane limit records nothing rather than failing the driver.
|
|
142
|
+
function recorder(
|
|
143
|
+
free_lanes: () => Promise<number> = backlog_ready.drive_free_lane_count,
|
|
144
|
+
): HoldRecorder {
|
|
145
|
+
const ledger: HoldLedger = { is_open: true }
|
|
146
|
+
|
|
147
|
+
async function write(reason: string | undefined, waiting?: ReadonlyArray<number>): Promise<void> {
|
|
148
|
+
await record(ledger, { reason, waiting }, await free_count(free_lanes, reason))
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
return {
|
|
152
|
+
hold: write,
|
|
153
|
+
end: async (end) => {
|
|
154
|
+
await write(hand_back_reason(end))
|
|
155
|
+
},
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
const backlog_drive_hold = { hand_back_reason, held, recorder, stopped }
|
|
160
|
+
|
|
161
|
+
export { backlog_drive_hold }
|
|
162
|
+
export type { HeldWaiting, HoldRecorder }
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import { auto_ok_cli } from '#scripts/auto-ok/auto-ok-cli'
|
|
2
|
+
import type { OpenIssueData } from '#scripts/git/git-schemas'
|
|
3
|
+
import { issue_cite } from '#scripts/issue/issue-cite'
|
|
4
|
+
import { has_any_label, NEEDS_DECISION_LABEL, RUN_STALLED_LABEL } from '#scripts/issue/issue-labels'
|
|
5
|
+
import { issue_not_before } from '#scripts/issue/issue-not-before'
|
|
6
|
+
import { telegram_notify } from '#scripts/notify/telegram-notify'
|
|
7
|
+
import { run_event_stream } from '#scripts/run/event/run-event-stream'
|
|
8
|
+
import { run_event_stream_emit } from '#scripts/run/event/run-event-stream-emit'
|
|
9
|
+
import type { DrivePorts, DriveState, OfferRead, PassResult } from './backlog-drive'
|
|
10
|
+
|
|
11
|
+
// The one notification an idle backlogrun sends (joshuafolkken/kit#4015): a watch with no child running
|
|
12
|
+
// is where a person's hand is wanted — a parked issue to decide, a dated one to wait out, or the next run
|
|
13
|
+
// to start. A stall was notified instead and reached nobody with anything to do, since the next dispatch
|
|
14
|
+
// resolved it; this fires only once nothing is left for the loop itself to do.
|
|
15
|
+
//
|
|
16
|
+
// **Once per idle episode**: the loop asks once a minute while it watches, so the marker on the stream
|
|
17
|
+
// (`emit_once_since_with`, reset by a `child-launch`) holds every repeat back, and the pool is read only
|
|
18
|
+
// for an episode that is new.
|
|
19
|
+
|
|
20
|
+
const WATCH_VERDICT = 'watch'
|
|
21
|
+
const BLOCKED_ANSWER = 'blocked'
|
|
22
|
+
const DECISION_HEADING = `Waiting on a decision (${NEEDS_DECISION_LABEL}):`
|
|
23
|
+
const STALLED_HEADING = `Stalled mechanically (${RUN_STALLED_LABEL}):`
|
|
24
|
+
const IDLE_HEAD = 'No child running and nothing left to dispatch.'
|
|
25
|
+
const IDLE_RECOVERY =
|
|
26
|
+
'Decide the parked issues, fix and release the stalled ones, or start the next run with `backlogrun`.'
|
|
27
|
+
|
|
28
|
+
interface IdlePorts {
|
|
29
|
+
read_issues: () => Promise<ReadonlyArray<OpenIssueData> | undefined>
|
|
30
|
+
emit: (compose: () => Promise<string>) => Promise<string | undefined>
|
|
31
|
+
send: (body: string) => Promise<boolean>
|
|
32
|
+
now_ms: () => number
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
interface IdleReading {
|
|
36
|
+
merged: number
|
|
37
|
+
// The `auto-ok` pool, or `undefined` when it could not be read.
|
|
38
|
+
issues: ReadonlyArray<OpenIssueData> | undefined
|
|
39
|
+
now_ms: number
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// Idle is any watch with nothing in flight, not only the drain: a watch over parked or dated issues
|
|
43
|
+
// alone waits on a person just the same. A `blocked` watch is not: with nothing in flight it is only a
|
|
44
|
+
// transient `retry`, which says nothing about whether work is left to dispatch.
|
|
45
|
+
function is_idle(result: PassResult, read: OfferRead): boolean {
|
|
46
|
+
if (read.answer === BLOCKED_ANSWER) return false
|
|
47
|
+
|
|
48
|
+
return read.verdict === WATCH_VERDICT && result.state.in_flight.length === 0
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
async function noticed(
|
|
52
|
+
result: PassResult,
|
|
53
|
+
read: OfferRead,
|
|
54
|
+
ports: Pick<DrivePorts, 'idle'>,
|
|
55
|
+
): Promise<PassResult> {
|
|
56
|
+
if (is_idle(result, read)) await ports.idle(result.state)
|
|
57
|
+
|
|
58
|
+
return result
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
function cited(issue: OpenIssueData, suffix = ''): string {
|
|
62
|
+
return `- ${issue_cite.plain(issue.number)} ${issue.title}${suffix}`
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// The cited issues carrying one park label. `needs-decision` and `run:stalled` are listed apart: one asks
|
|
66
|
+
// a person for a judgement, the other for a mechanical fix (`issue-labels.ts`).
|
|
67
|
+
function labelled_lines(issues: ReadonlyArray<OpenIssueData>, label: string): Array<string> {
|
|
68
|
+
return issues
|
|
69
|
+
.filter((issue) => has_any_label(issue.labels, new Set([label])))
|
|
70
|
+
.map((issue) => cited(issue))
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
function dated_lines(issues: ReadonlyArray<OpenIssueData>, now_ms: number): Array<string> {
|
|
74
|
+
const lines: Array<string> = []
|
|
75
|
+
|
|
76
|
+
for (const issue of issues) {
|
|
77
|
+
const reason = issue_not_before.waiting_reason(issue.body, now_ms)
|
|
78
|
+
|
|
79
|
+
if (reason !== undefined) lines.push(cited(issue, ` — ${reason}`))
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
return lines
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
function section(heading: string, lines: ReadonlyArray<string>): Array<string> {
|
|
86
|
+
return lines.length === 0 ? [] : [heading, ...lines]
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
function remaining_lines(reading: IdleReading): Array<string> {
|
|
90
|
+
if (reading.issues === undefined) return ['Remaining issues: unreadable']
|
|
91
|
+
|
|
92
|
+
const lines = [
|
|
93
|
+
...section(DECISION_HEADING, labelled_lines(reading.issues, NEEDS_DECISION_LABEL)),
|
|
94
|
+
...section(STALLED_HEADING, labelled_lines(reading.issues, RUN_STALLED_LABEL)),
|
|
95
|
+
...section('Waiting on a date:', dated_lines(reading.issues, reading.now_ms)),
|
|
96
|
+
]
|
|
97
|
+
|
|
98
|
+
return lines.length === 0 ? ['Nothing parked or dated is left.'] : lines
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
function describe(reading: IdleReading): string {
|
|
102
|
+
const merged = `Merged this run: ${String(reading.merged)}`
|
|
103
|
+
|
|
104
|
+
return [IDLE_HEAD, merged, ...remaining_lines(reading)].join('\n')
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
async function read_pool(): Promise<ReadonlyArray<OpenIssueData> | undefined> {
|
|
108
|
+
const read = await auto_ok_cli.fetch_opted_in()
|
|
109
|
+
|
|
110
|
+
return read.kind === 'read' ? read.issues : undefined
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
async function emit_idle(compose: () => Promise<string>): Promise<string | undefined> {
|
|
114
|
+
const { IDLE_NOTICE, CHILD_LAUNCH } = run_event_stream.EVENT_KIND
|
|
115
|
+
|
|
116
|
+
return await run_event_stream_emit.emit_once_since_with(IDLE_NOTICE, CHILD_LAUNCH, compose)
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
async function send_idle(body: string): Promise<boolean> {
|
|
120
|
+
return await telegram_notify.idle({ body, recovery: IDLE_RECOVERY })
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
const DEFAULT_PORTS: IdlePorts = {
|
|
124
|
+
read_issues: read_pool,
|
|
125
|
+
emit: emit_idle,
|
|
126
|
+
send: send_idle,
|
|
127
|
+
now_ms: () => Date.now(),
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
// The production `idle` port. Best-effort: the loop is only reporting, so a failed read or send is
|
|
131
|
+
// dropped rather than raised into the watch.
|
|
132
|
+
async function notify(state: DriveState, ports: IdlePorts = DEFAULT_PORTS): Promise<void> {
|
|
133
|
+
try {
|
|
134
|
+
const body = await ports.emit(async () =>
|
|
135
|
+
describe({
|
|
136
|
+
merged: state.exclude.length,
|
|
137
|
+
issues: await ports.read_issues(),
|
|
138
|
+
now_ms: ports.now_ms(),
|
|
139
|
+
}),
|
|
140
|
+
)
|
|
141
|
+
|
|
142
|
+
if (body !== undefined) await ports.send(body)
|
|
143
|
+
} catch {
|
|
144
|
+
// Reporting is best-effort: an idle notice we could not read or send is dropped.
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
const backlog_drive_idle = { describe, noticed, notify, read_pool }
|
|
149
|
+
|
|
150
|
+
export { backlog_drive_idle }
|
|
151
|
+
export type { IdlePorts }
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { DrivePorts, OfferRead } from './backlog-drive'
|
|
2
|
+
|
|
3
|
+
// **A free lane with nothing opted in is the open backlog's turn to be judged**
|
|
4
|
+
// (joshuafolkken/kit#3854): a watch over an exhausted pool hands back `judge` while an open issue
|
|
5
|
+
// lacking `auto-ok` still owes a judgement, ahead of the drain it would otherwise be. Once every one
|
|
6
|
+
// carries its judgement comment the count is zero and the watch is the driver's again.
|
|
7
|
+
|
|
8
|
+
const WATCH_VERDICT = 'watch'
|
|
9
|
+
const EXHAUSTED_ANSWER = 'exhausted'
|
|
10
|
+
const NO_FREE_LANES = 0
|
|
11
|
+
|
|
12
|
+
async function is_owed(
|
|
13
|
+
read: OfferRead,
|
|
14
|
+
ports: Pick<DrivePorts, 'free_lanes' | 'judgement_owed'>,
|
|
15
|
+
): Promise<boolean> {
|
|
16
|
+
const is_exhausted = read.verdict === WATCH_VERDICT && read.answer === EXHAUSTED_ANSWER
|
|
17
|
+
|
|
18
|
+
if (!is_exhausted || (await ports.free_lanes()) <= NO_FREE_LANES) return false
|
|
19
|
+
|
|
20
|
+
return (await ports.judgement_owed()) > 0
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
const backlog_drive_judge = { is_owed }
|
|
24
|
+
|
|
25
|
+
export { backlog_drive_judge }
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { machine_capacity, type MachineSample } from '#scripts/gate/machine-capacity'
|
|
2
|
+
import {
|
|
3
|
+
run_board_machine,
|
|
4
|
+
type MachineGauges,
|
|
5
|
+
type MachineMark,
|
|
6
|
+
} from '#scripts/run/board/run-board-machine'
|
|
7
|
+
import type { DrivePorts, DriveState, PassResult } from './backlog-drive'
|
|
8
|
+
|
|
9
|
+
// Whether the machine has room for one more lane (joshuafolkken/kit#4084). The lane limit counts lanes,
|
|
10
|
+
// not memory, so a lane opened while the machine swapped slowed every gate already running.
|
|
11
|
+
//
|
|
12
|
+
// **The reading is `run:board`'s own** (`run-board-machine.ts`): 🧠 and 💾 are the figures a person
|
|
13
|
+
// sees beside the waiting row, and the thresholds are the gauges' red and yellow.
|
|
14
|
+
//
|
|
15
|
+
// **Stopping is looser than resuming, so a machine near one threshold does not open and stop in turn.**
|
|
16
|
+
// A lane stops being opened when the kernel calls the memory critical, 🧠 turns red or 💾 swaps at a
|
|
17
|
+
// red rate. It resumes only once the kernel reads under critical and 🧠 and 💾 are both back under
|
|
18
|
+
// yellow. The kernel's warning is no hold (joshuafolkken/kit#4199): macOS keeps it long after the
|
|
19
|
+
// pressure passed, so a run held on it never resumed.
|
|
20
|
+
//
|
|
21
|
+
// **The 🧠 resume bar stays at yellow (70%) on measurement** (joshuafolkken/kit#4529). Across the
|
|
22
|
+
// 2026-10-22 run on an 18 GB machine (106 one-minute samples, 24 after the whole-suite and vitest-worker
|
|
23
|
+
// cuts merged) 🧠 never reached 70%, peaking at 67%; every memory hold, 1.3 minutes in all, came with a
|
|
24
|
+
// swap burst. 💾 is what holds a lane, so a lower 🧠 bar would admit nothing sooner and only risk swap.
|
|
25
|
+
//
|
|
26
|
+
// **A figure that could not be read is no limit**, as in the gate's core budget: a machine without
|
|
27
|
+
// `sysctl` dispatches as it did before memory was read.
|
|
28
|
+
|
|
29
|
+
const { MEMORY_RED, MEMORY_YELLOW, SWAP_RED_MB_PER_S, SWAP_YELLOW_MB_PER_S } = run_board_machine
|
|
30
|
+
const { PRESSURE_HOLD } = machine_capacity
|
|
31
|
+
// Two readings closer than this give no swap rate: a page swapped in a few milliseconds is no rate.
|
|
32
|
+
const MIN_RATE_MS = 1000
|
|
33
|
+
// The `hold` reason a pass held by memory records, read back by `run:board` and `lane:stats`.
|
|
34
|
+
const HOLD_REASON = 'memory'
|
|
35
|
+
|
|
36
|
+
type MemoryGauges = Pick<MachineGauges, 'memory_percent' | 'swap_mb_per_s' | 'memory_pressure'>
|
|
37
|
+
|
|
38
|
+
function is_kernel_pressured(gauges: MemoryGauges): boolean {
|
|
39
|
+
return (gauges.memory_pressure ?? 0) >= PRESSURE_HOLD
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function is_stop(gauges: MemoryGauges): boolean {
|
|
43
|
+
return (
|
|
44
|
+
is_kernel_pressured(gauges) ||
|
|
45
|
+
(gauges.memory_percent ?? 0) >= MEMORY_RED ||
|
|
46
|
+
(gauges.swap_mb_per_s ?? 0) >= SWAP_RED_MB_PER_S
|
|
47
|
+
)
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
function is_resume(gauges: MemoryGauges): boolean {
|
|
51
|
+
return (
|
|
52
|
+
!is_kernel_pressured(gauges) &&
|
|
53
|
+
(gauges.memory_percent ?? 0) < MEMORY_YELLOW &&
|
|
54
|
+
(gauges.swap_mb_per_s ?? 0) < SWAP_YELLOW_MB_PER_S
|
|
55
|
+
)
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
interface GaugePorts {
|
|
59
|
+
read: () => Promise<MachineSample>
|
|
60
|
+
now: () => number
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
const PRODUCTION: GaugePorts = { read: machine_capacity.read_sample, now: Date.now }
|
|
64
|
+
|
|
65
|
+
// What one gauge carries between calls.
|
|
66
|
+
interface GaugeMemo {
|
|
67
|
+
last: MachineMark | undefined
|
|
68
|
+
// The last swap rate measured, kept for a reading too close to the last to measure its own.
|
|
69
|
+
swap_mb_per_s: number | undefined
|
|
70
|
+
is_held: boolean
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// The reading's gauges, the rate measured from the last reading at least `MIN_RATE_MS` old; the last
|
|
74
|
+
// moves on only then, so two close calls keep measuring from the same one. A reading too close to
|
|
75
|
+
// measure keeps the last rate measured, so a held machine still swapping does not read 0 and resume.
|
|
76
|
+
function is_rate_of(last: MachineMark | undefined, mark: MachineMark): last is MachineMark {
|
|
77
|
+
return last !== undefined && mark.at_ms - last.at_ms >= MIN_RATE_MS
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
function rated(memo: GaugeMemo, mark: MachineMark): MemoryGauges {
|
|
81
|
+
const { last } = memo
|
|
82
|
+
const is_rated = is_rate_of(last, mark)
|
|
83
|
+
|
|
84
|
+
if (last === undefined || is_rated) memo.last = mark
|
|
85
|
+
|
|
86
|
+
const gauges = run_board_machine.gauges_of(is_rated ? last : undefined, mark)
|
|
87
|
+
|
|
88
|
+
if (is_rated) memo.swap_mb_per_s = gauges.swap_mb_per_s
|
|
89
|
+
|
|
90
|
+
return { ...gauges, swap_mb_per_s: memo.swap_mb_per_s }
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// The production `memory_held` port: each call reads the machine once, and the hold is carried
|
|
94
|
+
// between calls — a held machine waits for the resume, a free one for the stop.
|
|
95
|
+
function gauge(ports: GaugePorts = PRODUCTION): () => Promise<boolean> {
|
|
96
|
+
const memo: GaugeMemo = { last: undefined, swap_mb_per_s: undefined, is_held: false }
|
|
97
|
+
|
|
98
|
+
return async function memory_held(): Promise<boolean> {
|
|
99
|
+
const gauges = rated(memo, { sample: await ports.read(), at_ms: ports.now() })
|
|
100
|
+
|
|
101
|
+
memo.is_held = memo.is_held ? !is_resume(gauges) : is_stop(gauges)
|
|
102
|
+
|
|
103
|
+
return memo.is_held
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// An offer that answered `run` on a machine with no room: nothing launches, the pass records why, and
|
|
108
|
+
// the loop polls the memory until it clears.
|
|
109
|
+
async function held(state: DriveState, ports: Pick<DrivePorts, 'hold'>): Promise<PassResult> {
|
|
110
|
+
await ports.hold(HOLD_REASON)
|
|
111
|
+
|
|
112
|
+
return { kind: 'continue', state: { ...state, is_memory_held: true } }
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// Whether a held run's memory cleared since: the pass asks the offer again, not waiting out its interval.
|
|
116
|
+
async function is_cleared(
|
|
117
|
+
state: DriveState,
|
|
118
|
+
ports: Pick<DrivePorts, 'memory_held'>,
|
|
119
|
+
): Promise<boolean> {
|
|
120
|
+
return state.is_memory_held === true && !(await ports.memory_held())
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
const backlog_drive_memory = { HOLD_REASON, gauge, held, is_cleared }
|
|
124
|
+
|
|
125
|
+
export { backlog_drive_memory }
|
|
126
|
+
export type { MemoryGauges }
|
|
@@ -1,11 +1,9 @@
|
|
|
1
1
|
import { issue_cite } from '#scripts/issue/issue-cite'
|
|
2
|
-
import { EPIC_LABEL, has_label_name,
|
|
2
|
+
import { EPIC_LABEL, has_label_name, has_parked_label } from '#scripts/issue/issue-labels'
|
|
3
3
|
import type { IssueState } from '#scripts/issue/issue-state'
|
|
4
4
|
import { issue_state_cli } from '#scripts/issue/issue-state-cli'
|
|
5
5
|
import type { RunCarry } from '#scripts/run/carry/run-carry'
|
|
6
|
-
import { run_carry_added } from '#scripts/run/carry/run-carry-added'
|
|
7
6
|
import type { MergeResult } from '#scripts/run/merge/run-merge-cli'
|
|
8
|
-
import { run_invocation } from '#scripts/run/run-invocation'
|
|
9
7
|
import { backlog_budget } from './backlog-budget'
|
|
10
8
|
import type { DriveState, OfferRead } from './backlog-drive'
|
|
11
9
|
import { backlog_drive_epic } from './backlog-drive-epic'
|
|
@@ -52,12 +50,12 @@ function budget_offer(
|
|
|
52
50
|
}
|
|
53
51
|
|
|
54
52
|
// The outcome a named issue has already reached without this run dispatching it: closed is merged, and
|
|
55
|
-
// a `
|
|
56
|
-
// Either is booked done rather than offered.
|
|
53
|
+
// a park (`PARKED_LABELS`) waits on a person, so re-dispatching it only repeats the stop it parked on.
|
|
54
|
+
// Either is booked done rather than offered — the same reading `run:merge` gives a parked child.
|
|
57
55
|
function settled_outcome(state: IssueState): MergeResult['outcome'] | undefined {
|
|
58
56
|
if (state.state.toUpperCase() === 'CLOSED') return 'merged'
|
|
59
57
|
|
|
60
|
-
return
|
|
58
|
+
return has_parked_label(state.labels) ? 'parked' : undefined
|
|
61
59
|
}
|
|
62
60
|
|
|
63
61
|
async function classify(
|
|
@@ -102,10 +100,7 @@ async function is_unmerged(issue: number, merged: ReadonlyArray<number>): Promis
|
|
|
102
100
|
// The issues `run:add` put in count too: one that parked is no more a merge
|
|
103
101
|
// than a declared one.
|
|
104
102
|
async function unmerged_of(carry: RunCarry): Promise<Array<number>> {
|
|
105
|
-
const declared =
|
|
106
|
-
run_invocation.issue_numbers(carry.invocation) ?? [],
|
|
107
|
-
carry.added,
|
|
108
|
-
)
|
|
103
|
+
const declared = backlog_drive_named.named_issues(carry)
|
|
109
104
|
const merged = carry.merged_issues ?? []
|
|
110
105
|
const flags = await Promise.all(declared.map(async (issue) => await is_unmerged(issue, merged)))
|
|
111
106
|
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { lane_parked } from '#scripts/lane/lane-parked'
|
|
2
2
|
import { run_carry, type RunCarry } from '#scripts/run/carry/run-carry'
|
|
3
|
+
import { run_carry_added } from '#scripts/run/carry/run-carry-added'
|
|
3
4
|
import type { RunEvent } from '#scripts/run/event/run-event-stream'
|
|
4
5
|
import type { MergeResult } from '#scripts/run/merge/run-merge-cli'
|
|
5
6
|
import { run_merge_token } from '#scripts/run/merge/run-merge-token'
|
|
@@ -12,7 +13,7 @@ const { MERGE_TOKEN } = run_merge_token
|
|
|
12
13
|
|
|
13
14
|
const NO_RETRIES = 0
|
|
14
15
|
const FIRST = 0
|
|
15
|
-
const TERMINAL_OUTCOMES: ReadonlySet<string> = new Set(['merged', 'parked', 'split'])
|
|
16
|
+
const TERMINAL_OUTCOMES: ReadonlySet<string> = new Set(['merged', 'parked', 'split', 'withdrawn'])
|
|
16
17
|
|
|
17
18
|
// The skip follows the declared order alone: an issue `run:add` put in was
|
|
18
19
|
// asked for on its own, so its failure skips nothing and a declared failure does not skip it.
|
|
@@ -23,18 +24,37 @@ function is_declared(carry: RunCarry, issue: string): boolean {
|
|
|
23
24
|
// An issue `run:add` put in that is already in flight holds nothing up: it was
|
|
24
25
|
// asked for on its own, so the declared item behind it — an epic whose children fill the free lanes —
|
|
25
26
|
// is offered beside it. A declared issue in flight still holds the ones declared after it.
|
|
26
|
-
function is_held(carry: RunCarry,
|
|
27
|
-
return !
|
|
27
|
+
function is_held(carry: RunCarry, in_flight: ReadonlyArray<string>, issue: number): boolean {
|
|
28
|
+
return !in_flight.includes(String(issue)) || is_declared(carry, String(issue))
|
|
28
29
|
}
|
|
29
30
|
|
|
30
|
-
function next_of(carry: RunCarry,
|
|
31
|
+
function next_of(carry: RunCarry, in_flight: ReadonlyArray<string>): number | undefined {
|
|
31
32
|
const remaining = run_carry.remaining_of(carry) ?? []
|
|
32
33
|
|
|
33
|
-
return remaining.find((issue) => is_held(carry,
|
|
34
|
+
return remaining.find((issue) => is_held(carry, in_flight, issue)) ?? remaining[FIRST]
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// The declared issue `issue` starts after while the declared order holds it: the one declared just
|
|
38
|
+
// before it, once it is behind `next_of` — what `offer` runs or waits on — whether that has started yet
|
|
39
|
+
// or not (joshuafolkken/kit#4279). `run:board` names it on the queued row; an issue `run:add` put in, or
|
|
40
|
+
// one already in flight, is held by nothing.
|
|
41
|
+
function held_after(
|
|
42
|
+
carry: RunCarry,
|
|
43
|
+
in_flight: ReadonlyArray<string>,
|
|
44
|
+
issue: number,
|
|
45
|
+
): number | undefined {
|
|
46
|
+
const next = next_of(carry, in_flight)
|
|
47
|
+
if (next === undefined || in_flight.includes(String(issue))) return undefined
|
|
48
|
+
const declared = (run_carry.remaining_of(carry) ?? []).filter((number) =>
|
|
49
|
+
is_declared(carry, String(number)),
|
|
50
|
+
)
|
|
51
|
+
const index = declared.indexOf(issue)
|
|
52
|
+
|
|
53
|
+
return index > declared.indexOf(next) ? declared[index - 1] : undefined
|
|
34
54
|
}
|
|
35
55
|
|
|
36
56
|
function offer(carry: RunCarry, state: DriveState, is_only: boolean): OfferRead | undefined {
|
|
37
|
-
const next = next_of(carry, state)
|
|
57
|
+
const next = next_of(carry, state.in_flight)
|
|
38
58
|
|
|
39
59
|
if (next !== undefined) {
|
|
40
60
|
const issue = String(next)
|
|
@@ -129,4 +149,31 @@ async function reconcile(
|
|
|
129
149
|
}
|
|
130
150
|
}
|
|
131
151
|
|
|
132
|
-
|
|
152
|
+
// The issues the run names: the declared list in its order, with the ones `run:add` put in.
|
|
153
|
+
function named_issues(carry: RunCarry): ReadonlyArray<number> {
|
|
154
|
+
return run_carry_added.ordered(run_invocation.issue_numbers(carry.invocation) ?? [], carry.added)
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
// **A `--only` run adopts only the carried lanes it names** (joshuafolkken/kit#4282): it drains
|
|
158
|
+
// nothing, and its stop waits for every lane in flight, so a lane an earlier invocation dispatched for
|
|
159
|
+
// another issue would hold the run's end until that issue settled. The next draining run collects it.
|
|
160
|
+
function own_carried(
|
|
161
|
+
carry: RunCarry,
|
|
162
|
+
dispatched: ReadonlyArray<string>,
|
|
163
|
+
is_only: boolean,
|
|
164
|
+
): ReadonlyArray<string> {
|
|
165
|
+
if (!is_only) return dispatched
|
|
166
|
+
const named = named_issues(carry)
|
|
167
|
+
|
|
168
|
+
return dispatched.filter((issue) => named.includes(Number(issue)))
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
export const backlog_drive_named = {
|
|
172
|
+
next_of,
|
|
173
|
+
offer,
|
|
174
|
+
held_after,
|
|
175
|
+
mark_done,
|
|
176
|
+
named_issues,
|
|
177
|
+
own_carried,
|
|
178
|
+
reconcile,
|
|
179
|
+
}
|
|
@@ -1,21 +1,16 @@
|
|
|
1
1
|
import type { RunCarry } from '#scripts/run/carry/run-carry'
|
|
2
2
|
import type { DriveState } from './backlog-drive'
|
|
3
|
-
|
|
4
|
-
const LIST_SEPARATOR = ','
|
|
3
|
+
import { backlog_offer_exclude } from './backlog-offer-exclude'
|
|
5
4
|
|
|
6
5
|
// **A child in flight is never offered**. A lane child merges its own PR and
|
|
7
6
|
// drops `in-progress` before GitHub closes the issue and before the loop collects it, so `backlog:next`
|
|
8
7
|
// can offer it again; launching it then is refused by its still-open lane and handed to an AI session.
|
|
9
|
-
function excluded(state: DriveState): ReadonlyArray<string> {
|
|
10
|
-
return [...new Set([...state.exclude, ...state.in_flight])]
|
|
11
|
-
}
|
|
12
|
-
|
|
13
8
|
function offer_argv(
|
|
14
9
|
state: DriveState,
|
|
15
10
|
carry: RunCarry,
|
|
16
11
|
forwarded: ReadonlyArray<string>,
|
|
17
12
|
): ReadonlyArray<string> {
|
|
18
|
-
const exclude =
|
|
13
|
+
const exclude = backlog_offer_exclude.exclude_of(state.exclude, state.in_flight)
|
|
19
14
|
|
|
20
15
|
return [
|
|
21
16
|
'backlog:offer',
|
|
@@ -30,7 +25,7 @@ function offer_argv(
|
|
|
30
25
|
String(state.in_flight.length),
|
|
31
26
|
'--retries',
|
|
32
27
|
String(state.retries),
|
|
33
|
-
...(exclude
|
|
28
|
+
...backlog_offer_exclude.exclude_argv(exclude),
|
|
34
29
|
...forwarded,
|
|
35
30
|
]
|
|
36
31
|
}
|