@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
|
@@ -1,22 +1,19 @@
|
|
|
1
|
-
#!/usr/bin/env tsx
|
|
2
|
-
import { fileURLToPath } from 'node:url'
|
|
3
|
-
import { api_outage } from '#scripts/agent/api-outage'
|
|
4
1
|
import { CONTEXT_CUT_THRESHOLD } from '#scripts/cost-runtime/context-cut-threshold'
|
|
5
2
|
import { issue_cite } from '#scripts/issue/issue-cite'
|
|
6
|
-
import {
|
|
3
|
+
import { RUN_STALLED_LABEL } from '#scripts/issue/issue-labels'
|
|
7
4
|
import { issue_number_shape } from '#scripts/issue/issue-number-shape'
|
|
8
5
|
import { issue_state_cli } from '#scripts/issue/issue-state-cli'
|
|
9
6
|
import { lane_handoff } from '#scripts/lane/lane-handoff'
|
|
10
7
|
import { lane_ledger } from '#scripts/lane/lane-ledger'
|
|
11
8
|
import { cli_flags } from '#scripts/lib/cli-flags'
|
|
12
9
|
import { run_carry, type CarryOwner, type RunCarry } from '#scripts/run/carry/run-carry'
|
|
13
|
-
import { run_event_scope } from '#scripts/run/event/run-event-scope'
|
|
14
10
|
import { run_event_stream } from '#scripts/run/event/run-event-stream'
|
|
15
11
|
import { run_event_stream_emit } from '#scripts/run/event/run-event-stream-emit'
|
|
16
|
-
import {
|
|
17
|
-
import {
|
|
18
|
-
import {
|
|
19
|
-
import {
|
|
12
|
+
import { run_stalled, type StallCause } from '#scripts/run/park/run-stalled'
|
|
13
|
+
import { run_merge, type ChildOutcome } from './run-merge'
|
|
14
|
+
import { run_merge_auth } from './run-merge-auth'
|
|
15
|
+
import { run_merge_driver } from './run-merge-driver'
|
|
16
|
+
import { run_merge_signals } from './run-merge-signals'
|
|
20
17
|
import { run_merge_steps, type FailedResult, type MergeContext } from './run-merge-steps'
|
|
21
18
|
import { run_merge_token, type MergeToken } from './run-merge-token'
|
|
22
19
|
|
|
@@ -30,15 +27,12 @@ import { run_merge_token, type MergeToken } from './run-merge-token'
|
|
|
30
27
|
// (stop — the child's own ending), `stop` (the consecutive-failure guard tripped, or a failed child could not be parked) and `retry` (the
|
|
31
28
|
// child's state could not be read; re-read before deciding).
|
|
32
29
|
|
|
33
|
-
const ARGV_OFFSET = 2
|
|
34
30
|
const SUCCESS_EXIT_CODE = 0
|
|
35
31
|
const FAILURE_EXIT_CODE = 1
|
|
36
32
|
const FIRST = 0
|
|
37
33
|
const MIN_PID = 1
|
|
38
34
|
const { MERGE_TOKEN } = run_merge_token
|
|
39
|
-
const PARK_FAILURE_NOTE =
|
|
40
|
-
// The same digit shape `run-carry-args.ts` reads an owner pid under; a count is a bare run of digits.
|
|
41
|
-
const DIGITS = /^\d+$/u
|
|
35
|
+
const PARK_FAILURE_NOTE = `The failed child could not be parked with ${RUN_STALLED_LABEL}; stopping.`
|
|
42
36
|
// A GitHub `owner/repo` slug: an owner and a repository name around a single slash, each starting with
|
|
43
37
|
// an alphanumeric so neither half can begin with `-`. `epic` and `repo` flow into `pnpm josh`
|
|
44
38
|
// subprocess arguments, so a value shaped like an option (`--foo`, or `--evil/x`) would be read as a
|
|
@@ -47,9 +41,10 @@ const DIGITS = /^\d+$/u
|
|
|
47
41
|
// itself forbids (names cannot start with a hyphen) and which the taint analyzer keeps flagging.
|
|
48
42
|
const REPO_PATTERN = /^[A-Za-z0-9][\w.-]*\/[A-Za-z0-9][\w.-]*$/u
|
|
49
43
|
const USAGE =
|
|
50
|
-
'Usage: josh run:merge <issue> [--over <deprecated>] [--epic <E> --repo <owner/repo>] [--owner <pid>] [--output <path>]'
|
|
44
|
+
'Usage: josh run:merge <issue> [--over <deprecated>] [--epic <E> --repo <owner/repo>] [--owner <pid>] [--output <path>] [--driver]'
|
|
51
45
|
|
|
52
46
|
const OPTIONS = {
|
|
47
|
+
driver: { type: 'boolean' },
|
|
53
48
|
epic: { type: 'string' },
|
|
54
49
|
output: { type: 'string' },
|
|
55
50
|
over: { type: 'string' },
|
|
@@ -59,7 +54,9 @@ const OPTIONS = {
|
|
|
59
54
|
|
|
60
55
|
interface ParsedArguments {
|
|
61
56
|
positionals: ReadonlyArray<string>
|
|
62
|
-
values: Partial<Record<'epic' | 'output' | 'over' | 'owner' | 'repo', string>>
|
|
57
|
+
values: Partial<Record<'epic' | 'output' | 'over' | 'owner' | 'repo', string>> & {
|
|
58
|
+
driver?: boolean
|
|
59
|
+
}
|
|
63
60
|
}
|
|
64
61
|
|
|
65
62
|
// Absent owner is "no owner declared", which the carry guard reads as not provably foreign; a present
|
|
@@ -67,11 +64,10 @@ interface ParsedArguments {
|
|
|
67
64
|
function to_owner(raw: string | undefined): CarryOwner | undefined {
|
|
68
65
|
if (raw === undefined) return run_carry.NO_OWNER
|
|
69
66
|
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
const pid = Number(raw)
|
|
67
|
+
// The same count shape `run-carry-args.ts` reads an owner pid under.
|
|
68
|
+
const pid = cli_flags.to_count(raw)
|
|
73
69
|
|
|
74
|
-
return pid < MIN_PID ? undefined : run_carry.owner_of(pid)
|
|
70
|
+
return pid === undefined || pid < MIN_PID ? undefined : run_carry.owner_of(pid)
|
|
75
71
|
}
|
|
76
72
|
|
|
77
73
|
// The epic form needs a repository (`epic:next --lanes` refuses without one), so an epic named with
|
|
@@ -120,7 +116,7 @@ function has_invalid_offer(values: ParsedArguments['values']): boolean {
|
|
|
120
116
|
function has_invalid_legacy_over(raw: string | undefined): boolean {
|
|
121
117
|
if (raw === undefined) return false
|
|
122
118
|
|
|
123
|
-
return
|
|
119
|
+
return cli_flags.to_count(raw) === undefined
|
|
124
120
|
}
|
|
125
121
|
|
|
126
122
|
function valid_child(parsed: ParsedArguments): string | undefined {
|
|
@@ -131,6 +127,11 @@ function valid_child(parsed: ParsedArguments): string | undefined {
|
|
|
131
127
|
return issue_number_shape.ISSUE_NUMBER_PATTERN.test(child) ? child : undefined
|
|
132
128
|
}
|
|
133
129
|
|
|
130
|
+
// `backlog:drive` has no context to cut, so its merge is never handed back `over`.
|
|
131
|
+
function threshold_of(values: ParsedArguments['values']): number | undefined {
|
|
132
|
+
return values.driver === true ? undefined : CONTEXT_CUT_THRESHOLD
|
|
133
|
+
}
|
|
134
|
+
|
|
134
135
|
function to_context(parsed: ParsedArguments): MergeContext | undefined {
|
|
135
136
|
if (has_invalid_offer(parsed.values) || has_invalid_legacy_over(parsed.values.over)) {
|
|
136
137
|
return undefined
|
|
@@ -148,7 +149,7 @@ function to_context(parsed: ParsedArguments): MergeContext | undefined {
|
|
|
148
149
|
child,
|
|
149
150
|
epic: valid_epic(parsed.values.epic),
|
|
150
151
|
repo: valid_repo(parsed.values.repo),
|
|
151
|
-
over:
|
|
152
|
+
over: threshold_of(parsed.values),
|
|
152
153
|
owner,
|
|
153
154
|
output: parsed.values.output,
|
|
154
155
|
}
|
|
@@ -160,8 +161,8 @@ function parse(argv: ReadonlyArray<string>): MergeContext | undefined {
|
|
|
160
161
|
return parsed === undefined ? undefined : to_context(parsed)
|
|
161
162
|
}
|
|
162
163
|
|
|
163
|
-
// One handled return: the stdout token and the exit code. Returned rather than printed, so
|
|
164
|
-
//
|
|
164
|
+
// One handled return: the stdout token and the exit code. Returned rather than printed, so
|
|
165
|
+
// `merge_child` carries the verdict to `run_merge_driver.printed`, which prints it.
|
|
165
166
|
interface ControlVerdict {
|
|
166
167
|
token: MergeToken
|
|
167
168
|
code: number
|
|
@@ -187,63 +188,13 @@ function emit(token: MergeToken, code: number): ControlVerdict {
|
|
|
187
188
|
return { token, code, is_offer: false }
|
|
188
189
|
}
|
|
189
190
|
|
|
191
|
+
// No threshold is `backlog:drive`, which asks `backlog:offer` itself in the pass that collected the
|
|
192
|
+
// child: `backlog:next` here would only hold back its next launch (joshuafolkken/kit#4406).
|
|
190
193
|
async function offered(ctx: MergeContext): Promise<OfferVerdict> {
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
// Whether the child's session ended through its environment — read only when `--output` named the
|
|
195
|
-
// transcript, off otherwise: its exit record shows it could not reach the API, or the session was
|
|
196
|
-
// killed inside a turn. The path is validated inside `run_ending`, so a missing output is "no".
|
|
197
|
-
function read_is_outage(output: string | undefined): boolean {
|
|
198
|
-
if (output === undefined) return false
|
|
199
|
-
|
|
200
|
-
return api_outage.is_outage(run_ending.read_exit(output)) || run_ending.ended_mid_turn(output)
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
async function child_outages(child: string): Promise<number> {
|
|
204
|
-
const events = await run_event_stream_emit.current_events()
|
|
205
|
-
|
|
206
|
-
return events.filter(
|
|
207
|
-
(event) =>
|
|
208
|
-
event.kind === run_event_stream.EVENT_KIND.OUTAGE &&
|
|
209
|
-
run_event_scope.issue_named(event) === child,
|
|
210
|
-
).length
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
// An outage child is re-dispatched only so many times: one that ends the same way on every dispatch is
|
|
214
|
-
// parked, since merges in other lanes reset the run-wide outage streak and would never stop it.
|
|
215
|
-
async function read_is_retryable(child: string, output: string | undefined): Promise<boolean> {
|
|
216
|
-
const is_interrupted =
|
|
217
|
-
read_is_outage(output) || (await run_merge_ship.is_unanswered(child, output))
|
|
218
|
-
|
|
219
|
-
if (!is_interrupted) return false
|
|
220
|
-
|
|
221
|
-
return (await child_outages(child)) < run_merge.CONSECUTIVE_OUTAGE_LIMIT
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
type IssueRead = Awaited<ReturnType<typeof issue_state_cli.read_issue>>
|
|
225
|
-
|
|
226
|
-
// The timeline is read only for an OPEN, unparked child — the one classification a merged closing pull
|
|
227
|
-
// request changes. A CLOSED child was closed by GitHub, so it must carry no `merged_pr` for
|
|
228
|
-
// `do_merged` to close again.
|
|
229
|
-
async function read_merged_pr(child: string, read: IssueRead): Promise<string | undefined> {
|
|
230
|
-
if (read.kind !== 'state' || run_merge.classify_child(read.state) !== 'failed') return undefined
|
|
194
|
+
const token =
|
|
195
|
+
ctx.over === undefined ? run_merge_driver.DEFERRED_OFFER : await run_merge_steps.ask_next(ctx)
|
|
231
196
|
|
|
232
|
-
return
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
async function read_signals(ctx: MergeContext, read: IssueRead): Promise<EndingSignals> {
|
|
236
|
-
const [is_cut, merged_pr, is_outage] = await Promise.all([
|
|
237
|
-
run_merge_steps.has_resumable_cut(ctx.child),
|
|
238
|
-
read_merged_pr(ctx.child, read),
|
|
239
|
-
read_is_retryable(ctx.child, ctx.output),
|
|
240
|
-
])
|
|
241
|
-
|
|
242
|
-
return { is_outage, is_cut, merged_pr }
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
function outcome_of(read: IssueRead, signals: EndingSignals): ChildOutcome {
|
|
246
|
-
return read.kind === 'state' ? run_merge.classify_child(read.state, signals) : 'unresolved'
|
|
197
|
+
return { token, code: SUCCESS_EXIT_CODE, is_offer: true }
|
|
247
198
|
}
|
|
248
199
|
|
|
249
200
|
// A refused count means this session is not the carry record's owner, so the whole operation is
|
|
@@ -256,7 +207,8 @@ function report_count_refused(carry: RunCarry | undefined): MergeVerdict {
|
|
|
256
207
|
|
|
257
208
|
// A merged child counted and its lane closed, the merge put on the stream and in the ledger. Returns the
|
|
258
209
|
// carry when the ownership check refused it, `undefined` once recorded. `run:carry --end` records the
|
|
259
|
-
// merges a run ended with through it too (`run-merge-collect.ts`).
|
|
210
|
+
// merges a run ended with through it too (`run-merge-collect.ts`). The lane's `ended` record is
|
|
211
|
+
// `lane:close`'s alone: an `incomplete` close leaves the lane open on it (joshuafolkken/kit#4300).
|
|
260
212
|
async function record_merged(ctx: MergeContext): Promise<RunCarry | undefined> {
|
|
261
213
|
const refused = await run_merge_steps.do_merged(ctx)
|
|
262
214
|
|
|
@@ -285,16 +237,13 @@ async function on_merged(ctx: MergeContext): Promise<MergeVerdict> {
|
|
|
285
237
|
return await offered(ctx)
|
|
286
238
|
}
|
|
287
239
|
|
|
288
|
-
// A child released to wait on its open blockers: settled for this run like a parked
|
|
289
|
-
// the stream the same way, but nothing was counted — the failure guard is not read,
|
|
290
|
-
// is offered.
|
|
291
|
-
async function on_waiting(
|
|
292
|
-
ctx: MergeContext,
|
|
293
|
-
blockers: ReadonlyArray<string>,
|
|
294
|
-
): Promise<MergeVerdict> {
|
|
240
|
+
// A child released to wait on its open blockers or its start date: settled for this run like a parked
|
|
241
|
+
// one, so it goes on the stream the same way, but nothing was counted — the failure guard is not read,
|
|
242
|
+
// and the next child is offered.
|
|
243
|
+
async function on_waiting(ctx: MergeContext, waits: ReadonlyArray<string>): Promise<MergeVerdict> {
|
|
295
244
|
await run_event_stream_emit.emit(
|
|
296
245
|
run_event_stream.EVENT_KIND.PARK,
|
|
297
|
-
`${issue_cite.plain(ctx.child)} waiting on ${
|
|
246
|
+
`${issue_cite.plain(ctx.child)} waiting on ${waits.join(', ')}`,
|
|
298
247
|
)
|
|
299
248
|
|
|
300
249
|
return await offered(ctx)
|
|
@@ -307,9 +256,11 @@ async function on_parked_failure(ctx: MergeContext, result: FailedResult): Promi
|
|
|
307
256
|
return emit(MERGE_TOKEN.STOP, FAILURE_EXIT_CODE)
|
|
308
257
|
}
|
|
309
258
|
|
|
259
|
+
const cause = result.cause ?? run_stalled.SESSION_UNFINISHED.short
|
|
260
|
+
|
|
310
261
|
await run_event_stream_emit.emit(
|
|
311
262
|
run_event_stream.EVENT_KIND.PARK,
|
|
312
|
-
|
|
263
|
+
run_stalled.park_event(ctx.child, cause),
|
|
313
264
|
)
|
|
314
265
|
|
|
315
266
|
if (result.carry !== undefined && run_merge.is_guard_tripped(result.carry.failures)) {
|
|
@@ -319,12 +270,12 @@ async function on_parked_failure(ctx: MergeContext, result: FailedResult): Promi
|
|
|
319
270
|
return await offered(ctx)
|
|
320
271
|
}
|
|
321
272
|
|
|
322
|
-
async function on_failed(ctx: MergeContext, cause?:
|
|
273
|
+
async function on_failed(ctx: MergeContext, cause?: StallCause): Promise<MergeVerdict> {
|
|
323
274
|
const result = await run_merge_steps.do_failed(ctx, cause)
|
|
324
275
|
|
|
325
276
|
if (result.is_refused) return report_count_refused(result.carry)
|
|
326
277
|
|
|
327
|
-
if (result.
|
|
278
|
+
if (result.waits.length > 0) return await on_waiting(ctx, result.waits)
|
|
328
279
|
|
|
329
280
|
return await on_parked_failure(ctx, result)
|
|
330
281
|
}
|
|
@@ -349,6 +300,14 @@ async function on_outage(ctx: MergeContext): Promise<MergeVerdict> {
|
|
|
349
300
|
return await offered(ctx)
|
|
350
301
|
}
|
|
351
302
|
|
|
303
|
+
// A child whose session could not authenticate: the run stops with nothing counted or parked
|
|
304
|
+
// (`run-merge-auth.ts`).
|
|
305
|
+
async function on_unauthenticated(ctx: MergeContext): Promise<MergeVerdict> {
|
|
306
|
+
await run_merge_auth.stop(ctx.child)
|
|
307
|
+
|
|
308
|
+
return emit(MERGE_TOKEN.ENVIRONMENT, SUCCESS_EXIT_CODE)
|
|
309
|
+
}
|
|
310
|
+
|
|
352
311
|
// A child that ended its session with a cut no successor adopted: its successor is relaunched,
|
|
353
312
|
// nothing is counted and nothing is parked, and `resumed` tells the parent to await the same lane
|
|
354
313
|
// again rather than dispatch into it. A successor that could not be started — or a cut the
|
|
@@ -360,7 +319,7 @@ async function on_cut(ctx: MergeContext): Promise<MergeVerdict> {
|
|
|
360
319
|
if (refused !== undefined) return report_count_refused(refused)
|
|
361
320
|
|
|
362
321
|
if (!(await run_merge_steps.resume_cut(ctx.child))) {
|
|
363
|
-
return await on_failed(ctx,
|
|
322
|
+
return await on_failed(ctx, run_stalled.CUT_NOT_RELAUNCHED)
|
|
364
323
|
}
|
|
365
324
|
|
|
366
325
|
await run_event_stream_emit.emit(
|
|
@@ -373,10 +332,10 @@ async function on_cut(ctx: MergeContext): Promise<MergeVerdict> {
|
|
|
373
332
|
|
|
374
333
|
// A child that parked itself: nothing is counted, but the park is written to the stream as a failed
|
|
375
334
|
// child's is, so a reader restoring the run from its events sees the child settled. Its `in-progress`
|
|
376
|
-
// is dropped as a failed child's is: left on, it would outlive the
|
|
377
|
-
// lifts, and a `run:solo` child would then hold the whole backlog.
|
|
335
|
+
// is dropped as a failed child's is: left on, it would outlive the park label a person later
|
|
336
|
+
// lifts, and a `run:solo` child would then hold the whole backlog. A lane it left empty is closed.
|
|
378
337
|
async function on_parked(ctx: MergeContext): Promise<MergeVerdict> {
|
|
379
|
-
await
|
|
338
|
+
await run_merge_steps.release_child(ctx.child)
|
|
380
339
|
await run_event_stream_emit.emit(
|
|
381
340
|
run_event_stream.EVENT_KIND.PARK,
|
|
382
341
|
`${issue_cite.plain(ctx.child)} parked`,
|
|
@@ -397,6 +356,13 @@ async function on_skipped(ctx: MergeContext): Promise<MergeVerdict> {
|
|
|
397
356
|
return await offered(ctx)
|
|
398
357
|
}
|
|
399
358
|
|
|
359
|
+
// A child a person withdrew with `lane:withdraw`: the withdrawal already stopped it, closed its lane
|
|
360
|
+
// and put itself on the stream, leaving its issue open for the next run, so nothing is counted or
|
|
361
|
+
// written here and its seat goes to the next child.
|
|
362
|
+
async function on_withdrawn(ctx: MergeContext): Promise<MergeVerdict> {
|
|
363
|
+
return await offered(ctx)
|
|
364
|
+
}
|
|
365
|
+
|
|
400
366
|
// The child's own ending: it stopped before its commit for a person to look at, so nothing is counted
|
|
401
367
|
// and no next child is offered.
|
|
402
368
|
async function on_human_review(): Promise<MergeVerdict> {
|
|
@@ -418,24 +384,29 @@ const HANDLERS: Readonly<Record<ChildOutcome, (ctx: MergeContext) => Promise<Mer
|
|
|
418
384
|
'human-review': on_human_review,
|
|
419
385
|
merged: on_merged,
|
|
420
386
|
outage: on_outage,
|
|
387
|
+
unauthenticated: on_unauthenticated,
|
|
421
388
|
parked: on_parked,
|
|
422
389
|
split: on_skipped,
|
|
423
390
|
unresolved: on_unresolved,
|
|
424
391
|
shipping: on_shipping,
|
|
392
|
+
withdrawn: on_withdrawn,
|
|
425
393
|
}
|
|
426
394
|
|
|
427
|
-
// The whole merge event for one returned child
|
|
428
|
-
//
|
|
395
|
+
// The whole merge event for one returned child: read its state, classify it, and run the handler.
|
|
396
|
+
// The CLI prints the token and the outcome; `backlog:drive` runs it as a child process
|
|
397
|
+
// (`run-merge-driver.ts`) and branches on the printed outcome.
|
|
429
398
|
async function merge_child(ctx: MergeContext): Promise<MergeResult> {
|
|
430
399
|
if (lane_handoff.is_ship_running(ctx.child, process.cwd())) {
|
|
431
400
|
return { outcome: 'shipping', ...(await on_shipping()) }
|
|
432
401
|
}
|
|
433
402
|
|
|
434
403
|
const read = await issue_state_cli.read_issue(ctx.child, ctx.repo)
|
|
435
|
-
const signals = await read_signals(ctx, read)
|
|
436
|
-
const outcome = outcome_of(read, signals)
|
|
404
|
+
const signals = await run_merge_signals.read_signals(ctx, read)
|
|
405
|
+
const outcome = run_merge_signals.outcome_of(read, signals)
|
|
437
406
|
|
|
438
|
-
|
|
407
|
+
const { merged_pr, is_streak_exempt } = signals
|
|
408
|
+
|
|
409
|
+
return { outcome, ...(await HANDLERS[outcome]({ ...ctx, merged_pr, is_streak_exempt })) }
|
|
439
410
|
}
|
|
440
411
|
|
|
441
412
|
async function run(argv: ReadonlyArray<string>): Promise<number> {
|
|
@@ -449,24 +420,18 @@ async function run(argv: ReadonlyArray<string>): Promise<number> {
|
|
|
449
420
|
|
|
450
421
|
const result = await merge_child(ctx)
|
|
451
422
|
|
|
452
|
-
console.info(result
|
|
423
|
+
console.info(run_merge_driver.printed(argv, result))
|
|
453
424
|
|
|
454
425
|
return result.code
|
|
455
426
|
}
|
|
456
427
|
|
|
457
|
-
async function main(argv: ReadonlyArray<string>): Promise<void> {
|
|
458
|
-
process.exitCode = await run(argv)
|
|
459
|
-
}
|
|
460
|
-
|
|
461
428
|
const run_merge_cli = {
|
|
462
429
|
merge_child,
|
|
463
430
|
parse,
|
|
464
|
-
read_merged_pr,
|
|
431
|
+
read_merged_pr: run_merge_signals.read_merged_pr,
|
|
465
432
|
record_merged,
|
|
466
433
|
run,
|
|
467
434
|
}
|
|
468
435
|
|
|
469
|
-
if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
|
|
470
|
-
|
|
471
436
|
export type { MergeResult }
|
|
472
437
|
export { run_merge_cli }
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { epic_close } from '#scripts/epic/epic-close'
|
|
2
|
+
import { git_followup_issue_close } from '#scripts/followup/git-followup-issue-close'
|
|
3
|
+
import { session_cite } from '#scripts/issue/session-cite'
|
|
4
|
+
|
|
5
|
+
const MERGE_CLOSER = 'pnpm josh run:merge'
|
|
6
|
+
const SINGLE_READ = { attempts: 1, interval_ms: 0 }
|
|
7
|
+
|
|
8
|
+
interface MergedChild {
|
|
9
|
+
child: string
|
|
10
|
+
// The merged pull request that closes the child, when GitHub left the child OPEN after the merge.
|
|
11
|
+
merged_pr?: string | undefined
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
// A child merged while GitHub left it OPEN is closed here, through the one close `followup` uses.
|
|
15
|
+
// The state was just read OPEN, so it is read once rather than waited on. A
|
|
16
|
+
// close that fails is reported with its recovery and does not undo the merge being counted. Answers
|
|
17
|
+
// whether the child is closed now.
|
|
18
|
+
async function close_merged_open(merged: MergedChild): Promise<boolean> {
|
|
19
|
+
if (merged.merged_pr === undefined) return true
|
|
20
|
+
|
|
21
|
+
try {
|
|
22
|
+
await git_followup_issue_close.ensure_issue_closed(
|
|
23
|
+
{ issue_number: merged.child, pr_url: merged.merged_pr, closer: MERGE_CLOSER },
|
|
24
|
+
SINGLE_READ,
|
|
25
|
+
)
|
|
26
|
+
|
|
27
|
+
return true
|
|
28
|
+
} catch {
|
|
29
|
+
console.error(
|
|
30
|
+
`${session_cite.issue(merged.child)}: could not be closed — ${git_followup_issue_close.CLOSE_RECOVERY}`,
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
return false
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// `run:merge`'s stdout carries only the next child or a verdict, so the epic auto-close's notes go to
|
|
38
|
+
// stderr for as long as it runs, beside this command's own notes.
|
|
39
|
+
function divert_info_to_stderr(): () => void {
|
|
40
|
+
const { info } = console
|
|
41
|
+
|
|
42
|
+
console.info = console.error
|
|
43
|
+
|
|
44
|
+
return function restore(): void {
|
|
45
|
+
console.info = info
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
async function with_notes_on_stderr(step: () => Promise<void>): Promise<void> {
|
|
50
|
+
const restore = divert_info_to_stderr()
|
|
51
|
+
|
|
52
|
+
try {
|
|
53
|
+
await step()
|
|
54
|
+
} finally {
|
|
55
|
+
restore()
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// Every other child `run:merge` counts as merged is already closed, whatever closed it — `followup`
|
|
60
|
+
// or `josh issue:measured` — so its epics are evaluated here, through the one entry every child close
|
|
61
|
+
// takes (`epic-close.ts`, #4560). A child still OPEN after a failed close is not: the auto-close
|
|
62
|
+
// treats the child as closed without reading it. An `already-done` child reads OPEN here and is
|
|
63
|
+
// parked; once a person closes it, the next child close sweeps its epic (`epic-close.ts`, #4564).
|
|
64
|
+
async function close_merged(merged: MergedChild): Promise<void> {
|
|
65
|
+
if (!(await close_merged_open(merged))) return
|
|
66
|
+
|
|
67
|
+
await with_notes_on_stderr(async () => {
|
|
68
|
+
await epic_close.close_completed_epics({ issue_number: merged.child, is_merged: true })
|
|
69
|
+
})
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
const run_merge_close = { close_merged }
|
|
73
|
+
|
|
74
|
+
export { run_merge_close }
|
|
@@ -1,19 +1,18 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { backlog_drive_adopt } from '#scripts/backlog/backlog-drive-adopt'
|
|
2
2
|
import { issue_merged } from '#scripts/issue/issue-merged'
|
|
3
3
|
import { issue_state_cli } from '#scripts/issue/issue-state-cli'
|
|
4
4
|
import { session_cite } from '#scripts/issue/session-cite'
|
|
5
5
|
import { lane_handoff } from '#scripts/lane/lane-handoff'
|
|
6
|
-
import {
|
|
6
|
+
import type { LaneInfo } from '#scripts/lane/lane-registry'
|
|
7
7
|
import { run_carry, type CarryOwner, type RunCarry } from '#scripts/run/carry/run-carry'
|
|
8
|
-
import { run_event_stream_emit } from '#scripts/run/event/run-event-stream-emit'
|
|
9
8
|
import { run_merge } from './run-merge'
|
|
10
9
|
import { run_merge_cli } from './run-merge-cli'
|
|
11
10
|
|
|
12
11
|
type IssueRead = Awaited<ReturnType<typeof issue_state_cli.read_issue>>
|
|
13
12
|
|
|
14
|
-
// The merges a run ends with, recorded at `run:carry --end`. `backlog:drive` collects
|
|
15
|
-
//
|
|
16
|
-
//
|
|
13
|
+
// The merges a run ends with, recorded at `run:carry --end`. `backlog:drive` collects the lanes it
|
|
14
|
+
// holds or adopts while it runs (`backlog-drive-adopt.ts`), so a lane that merged while no driver
|
|
15
|
+
// watched it never reached `run:merge`: no `merge` event, no ledger line, no merged
|
|
17
16
|
// count. Each lane still open on a child the run launched and never settled is read once more, and
|
|
18
17
|
// **only a merged one is collected** — closed by a merged pull request, or left open behind one —
|
|
19
18
|
// through the same `run:merge` recording a driver would have made.
|
|
@@ -79,13 +78,7 @@ function owner_of(carry: RunCarry): CarryOwner {
|
|
|
79
78
|
}
|
|
80
79
|
|
|
81
80
|
async function collect_carried(carry: RunCarry): Promise<void> {
|
|
82
|
-
|
|
83
|
-
await run_event_stream_emit.current_events(),
|
|
84
|
-
)
|
|
85
|
-
const lanes = await lane_registry.list_lanes()
|
|
86
|
-
const collectable = lanes.filter((lane) => !lane.is_stranded && in_flight.has(lane.issue))
|
|
87
|
-
|
|
88
|
-
await collect_all(collectable, owner_of(carry))
|
|
81
|
+
await collect_all(await backlog_drive_adopt.active_lanes(), owner_of(carry))
|
|
89
82
|
}
|
|
90
83
|
|
|
91
84
|
// Asked by `--end` before it closes the record under `directory`, the common git directory; a run with
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { json_value } from '#scripts/lib/json-value'
|
|
2
|
+
import { z } from 'zod'
|
|
3
|
+
import type { MergeResult } from './run-merge-cli'
|
|
4
|
+
import { run_merge_outcome } from './run-merge-outcome'
|
|
5
|
+
import { run_merge_token } from './run-merge-token'
|
|
6
|
+
|
|
7
|
+
// `run:merge` as `backlog:drive` runs it: a child process per merge, never an import, so a fix merged
|
|
8
|
+
// into `run:merge` after the driver started is the code its next merge runs (joshuafolkken/kit#4102).
|
|
9
|
+
// Imported in process, the driver went on parking children with the code it was started with.
|
|
10
|
+
//
|
|
11
|
+
// `--driver` asks for what the driver alone needs: no hand-off threshold — a supervisor has no context
|
|
12
|
+
// to cut — and the whole `MergeResult` as one JSON line on stdout's last line, since the outcome the
|
|
13
|
+
// driver branches on is not in the token a person reads.
|
|
14
|
+
|
|
15
|
+
const COMMAND = 'run:merge'
|
|
16
|
+
const DRIVER_FLAG = '--driver'
|
|
17
|
+
const JSON_KEY = 'merge'
|
|
18
|
+
const LINE_BREAK = '\n'
|
|
19
|
+
// The offer token `--driver` answers in place of `backlog:next`'s: the driver never reads an offer's
|
|
20
|
+
// text, only that one was printed, and asks `backlog:offer` itself (joshuafolkken/kit#4406).
|
|
21
|
+
const DEFERRED_OFFER = 'deferred'
|
|
22
|
+
|
|
23
|
+
const control_schema = z.object({
|
|
24
|
+
token: z.enum(Object.values(run_merge_token.MERGE_TOKEN)),
|
|
25
|
+
code: z.number(),
|
|
26
|
+
is_offer: z.literal(false),
|
|
27
|
+
outcome: z.enum(run_merge_outcome.CHILD_OUTCOMES),
|
|
28
|
+
})
|
|
29
|
+
const offer_schema = z.object({
|
|
30
|
+
token: z.string(),
|
|
31
|
+
code: z.number(),
|
|
32
|
+
is_offer: z.literal(true),
|
|
33
|
+
outcome: z.enum(run_merge_outcome.CHILD_OUTCOMES),
|
|
34
|
+
})
|
|
35
|
+
const printed_schema = z.object({
|
|
36
|
+
[JSON_KEY]: z.discriminatedUnion('is_offer', [control_schema, offer_schema]),
|
|
37
|
+
})
|
|
38
|
+
|
|
39
|
+
interface DriverMerge {
|
|
40
|
+
child: string
|
|
41
|
+
owner: string
|
|
42
|
+
output: string | undefined
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function argv_of(merge: DriverMerge): Array<string> {
|
|
46
|
+
const output = merge.output === undefined ? [] : ['--output', merge.output]
|
|
47
|
+
|
|
48
|
+
return [COMMAND, merge.child, '--owner', merge.owner, DRIVER_FLAG, ...output]
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function print(result: MergeResult): string {
|
|
52
|
+
return JSON.stringify({ [JSON_KEY]: result })
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// What `run:merge` prints: the whole result under `--driver`, else the token a person reads.
|
|
56
|
+
function printed(argv: ReadonlyArray<string>, result: MergeResult): string {
|
|
57
|
+
return argv.includes(DRIVER_FLAG) ? print(result) : result.token
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// The result on stdout's last line, or `undefined` where the child process printed none — a crash
|
|
61
|
+
// before its verdict, which the driver reads as no token.
|
|
62
|
+
function read(out: string): MergeResult | undefined {
|
|
63
|
+
const last = out.trimEnd().split(LINE_BREAK).at(-1) ?? ''
|
|
64
|
+
|
|
65
|
+
return json_value.parse_with(last, printed_schema)?.[JSON_KEY]
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
const run_merge_driver = { DEFERRED_OFFER, DRIVER_FLAG, argv_of, print, printed, read }
|
|
69
|
+
|
|
70
|
+
export type { DriverMerge }
|
|
71
|
+
export { run_merge_driver }
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
import { fileURLToPath } from 'node:url'
|
|
3
|
+
import { run_merge_cli } from './run-merge-cli'
|
|
4
|
+
|
|
5
|
+
// The `josh run:merge` entry, kept apart from `run-merge-cli.ts` because other modules import that
|
|
6
|
+
// one: a bundle is one file, so a main guard there would fire for every command that carries it
|
|
7
|
+
// (joshuafolkken/kit#4186).
|
|
8
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) {
|
|
9
|
+
const ARGV_OFFSET = 2
|
|
10
|
+
|
|
11
|
+
process.exitCode = await run_merge_cli.run(process.argv.slice(ARGV_OFFSET))
|
|
12
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
// The outcomes `run:merge` classifies a returned child as — each one's meaning is `run-merge.ts`'s.
|
|
2
|
+
// Listed as values so `run:merge --driver`'s JSON is read back against the same names
|
|
3
|
+
// (`run-merge-driver.ts`) rather than a second list.
|
|
4
|
+
const CHILD_OUTCOMES = [
|
|
5
|
+
'merged',
|
|
6
|
+
'withdrawn',
|
|
7
|
+
'human-review',
|
|
8
|
+
'parked',
|
|
9
|
+
'split',
|
|
10
|
+
'cut',
|
|
11
|
+
'outage',
|
|
12
|
+
'unauthenticated',
|
|
13
|
+
'failed',
|
|
14
|
+
'unresolved',
|
|
15
|
+
'shipping',
|
|
16
|
+
] as const
|
|
17
|
+
|
|
18
|
+
type ChildOutcome = (typeof CHILD_OUTCOMES)[number]
|
|
19
|
+
|
|
20
|
+
const run_merge_outcome = { CHILD_OUTCOMES }
|
|
21
|
+
|
|
22
|
+
export type { ChildOutcome }
|
|
23
|
+
export { run_merge_outcome }
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { uptime } from 'node:os'
|
|
2
|
+
import { agent_exit_record } from '#scripts/agent/agent-exit-record'
|
|
3
|
+
import { lane_registry } from '#scripts/lane/lane-registry'
|
|
4
|
+
import { run_ending } from '#scripts/run/run-ending'
|
|
5
|
+
|
|
6
|
+
// Whether a returned child was killed by the host restarting rather than ending on its own
|
|
7
|
+
// (joshuafolkken/kit#4540). A restart clears the temporary directory the child's transcript and the run's
|
|
8
|
+
// event stream live in, so the exit record cannot tell it apart from a failure; the lane's dispatch time,
|
|
9
|
+
// kept in its worktree, can: a child dispatched before the host booted, with no exit record of its own,
|
|
10
|
+
// did not end itself.
|
|
11
|
+
|
|
12
|
+
const MS_PER_SECOND = 1000
|
|
13
|
+
|
|
14
|
+
// When the host last booted, in epoch milliseconds.
|
|
15
|
+
function booted_ms(): number {
|
|
16
|
+
return Date.now() - uptime() * MS_PER_SECOND
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
// Whether the newest launch ended on its own exit record. The log is appended across launches, and where
|
|
20
|
+
// the temporary root survives a reboot it still holds an earlier launch's record, so only a record that
|
|
21
|
+
// is the log's last line belongs to the launch the restart may have killed.
|
|
22
|
+
function has_exit_record(output: string | undefined): boolean {
|
|
23
|
+
const transcript = output === undefined ? undefined : run_ending.read_transcript(output)
|
|
24
|
+
|
|
25
|
+
return transcript !== undefined && agent_exit_record.ends_on_exit_record(transcript)
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
async function is_host_restart(child: string, output: string | undefined): Promise<boolean> {
|
|
29
|
+
if (has_exit_record(output)) return false
|
|
30
|
+
|
|
31
|
+
const lane = await lane_registry.find_open_lane(child)
|
|
32
|
+
const dispatched_ms = lane?.dispatched_ms
|
|
33
|
+
|
|
34
|
+
return dispatched_ms !== undefined && dispatched_ms < booted_ms()
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
const run_merge_restart = { is_host_restart }
|
|
38
|
+
|
|
39
|
+
export { run_merge_restart }
|