@joshuafolkken/kit 1.1514.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 +5 -5
- package/.claude/skills/epic-commands/SKILL.md +26 -65
- package/.claude/skills/epic-commands/epic-bundle.md +3 -1
- package/.claude/skills/workflow-commands/SKILL.md +5 -5
- package/.claude/skills/workflow-commands/background-commands.md +5 -5
- package/.claude/skills/workflow-commands/backlogrun-child.md +10 -8
- package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +7 -25
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +17 -13
- package/.claude/skills/workflow-commands/backlogrun-park.md +14 -23
- package/.claude/skills/workflow-commands/backlogrun-progress.md +2 -2
- package/.claude/skills/workflow-commands/backlogrun-recovery.md +5 -5
- package/.claude/skills/workflow-commands/backlogrun-steps.md +10 -10
- package/.claude/skills/workflow-commands/backlogrun.md +1 -1
- package/.claude/skills/workflow-commands/chain-rule.md +13 -7
- package/.claude/skills/workflow-commands/delegation.md +6 -5
- package/.claude/skills/workflow-commands/entry-sequence.md +9 -9
- package/.claude/skills/workflow-commands/followup.md +9 -31
- package/.claude/skills/workflow-commands/fullrun-steps.md +36 -45
- package/.claude/skills/workflow-commands/fullrun.md +2 -2
- package/.claude/skills/workflow-commands/halfrun.md +17 -25
- package/.claude/skills/workflow-commands/issue-comments.md +16 -12
- package/.claude/skills/workflow-commands/issue-scout.md +2 -2
- package/.claude/skills/workflow-commands/kickoff.md +24 -23
- package/.claude/skills/workflow-commands/latest-gate.md +7 -12
- package/.claude/skills/workflow-commands/needs-human-review.md +9 -14
- package/.claude/skills/workflow-commands/observation-filing.md +4 -36
- package/.claude/skills/workflow-commands/observation-ledger.md +1 -1
- package/.claude/skills/workflow-commands/pre-gate-cut.md +13 -30
- package/.claude/skills/workflow-commands/prerequisite.md +10 -16
- package/.claude/skills/workflow-commands/progress-watcher.md +1 -1
- package/.claude/skills/workflow-commands/prrun.md +3 -7
- package/.claude/skills/workflow-commands/retrospective.md +1 -1
- package/.claude/skills/workflow-commands/split-assessment.md +13 -1
- package/.claude/skills/workflow-commands/working-tree-hold.md +9 -9
- package/.codex/hooks.json +5 -5
- package/.github/actions/setup-node/action.yml +9 -0
- package/.github/actions/setup-pnpm/action.yml +1 -1
- package/.github/dependabot.yml +16 -0
- package/.github/release.yml +0 -2
- package/.github/workflows/ci.yml +120 -10
- package/.github/workflows/publish.yml +8 -1
- package/.github/workflows/sonar-qube.yml +1 -0
- package/.prettierignore +2 -0
- package/.vscode/tasks.json +1 -2
- package/CLAUDE.md +3 -7
- package/README.md +4 -2
- package/SECURITY.md +1 -1
- package/dist/CLAUDE.md +3 -7
- package/dist/commands/document-read-cli.js +882 -0
- package/dist/commands/{document-section-cli.js → document-section-main.js} +79 -37
- 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-TNUMY6NL.js → chunk-PT5R6UJD.js} +4193 -1900
- package/dist/hooks/chunk-TUIFS5E7.js +72 -0
- package/dist/hooks/{chunk-723HKZO5.js → chunk-VWWCFGWK.js} +1 -1
- package/dist/hooks/{chunk-APUO6U4J.js → chunk-WR2KQAYZ.js} +1843 -440
- package/dist/hooks/{chunk-O6GDRNJB.js → chunk-XGBNSWEI.js} +248 -46
- package/dist/hooks/chunk-YCDOIR3I.js +3456 -0
- package/dist/hooks/codex-hook-adapter.js +10 -22
- package/dist/hooks/format-edited.js +5 -6
- package/dist/hooks/inputs.json +443 -317
- package/dist/hooks/pretool-guard.js +7 -25
- package/dist/hooks/session-lang.js +44 -51
- package/dist/hooks/stop-guard.js +7716 -2187
- package/dist/josh.js +6002 -3583
- 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 +3 -1
- package/package.json +10 -48
- package/pnpm-workspace.yaml +4 -2
- package/prompts/coding-standards.md +1 -1
- package/prompts/collaboration-workflow/file-edits.md +1 -7
- package/prompts/collaboration-workflow/issue-citation.md +1 -1
- package/prompts/collaboration-workflow/issue-template.md +33 -16
- package/prompts/collaboration-workflow/lane-instructions.md +1 -2
- package/prompts/collaboration-workflow/measurement.md +37 -0
- package/prompts/collaboration-workflow/operating-rules.md +4 -6
- package/prompts/collaboration-workflow/output-bounds.md +2 -7
- package/prompts/collaboration-workflow/plan-comment.md +3 -42
- package/prompts/collaboration-workflow/principles.md +5 -0
- package/prompts/collaboration-workflow/report-format.md +31 -60
- package/prompts/collaboration-workflow/residency.md +2 -2
- package/prompts/collaboration-workflow/shell-body.md +6 -16
- package/prompts/collaboration-workflow/turn-batching.md +0 -2
- package/prompts/collaboration-workflow/upstream-interrupt.md +14 -4
- package/prompts/collaboration-workflow/wip-cap.md +1 -1
- package/prompts/collaboration-workflow.md +3 -7
- package/prompts/refactoring.md +1 -1
- package/prompts/review-rubric.md +1 -2
- package/prompts/review.md +41 -21
- package/prompts/testing-guide.md +8 -43
- package/scripts/agent/agent-event.ts +15 -15
- package/scripts/agent/agent-exit-record.ts +13 -1
- package/scripts/agent/api-auth.ts +41 -0
- package/scripts/agent/api-outage.ts +1 -1
- 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 +2 -3
- 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 +53 -6
- 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 +30 -7
- 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 +52 -39
- package/scripts/backlog/backlog-offer-cli.ts +6 -21
- package/scripts/backlog/backlog-offer-exclude.ts +15 -0
- package/scripts/backlog/backlog-offer-main.ts +12 -0
- package/scripts/backlog/backlog-offer.ts +36 -3
- package/scripts/backlog/backlog-overlap.ts +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 +112 -30
- 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 +0 -8
- package/scripts/delegation/investigation-guard.ts +0 -8
- package/scripts/delegation/investigation-reads.ts +3 -4
- 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 +8 -6
- package/scripts/document/document-scan.ts +1 -1
- package/scripts/document/document-section-cli.ts +0 -8
- package/scripts/document/document-section-main.ts +12 -0
- package/scripts/epic/epic-audit-cli.ts +12 -6
- package/scripts/epic/epic-bundle-apply.ts +137 -0
- package/scripts/epic/epic-bundle-cli.ts +32 -121
- package/scripts/epic/epic-bundle-format.ts +116 -0
- package/scripts/epic/epic-bundle-main.ts +17 -0
- package/scripts/epic/epic-busy.ts +5 -12
- package/scripts/epic/epic-classify.ts +24 -15
- package/scripts/epic/epic-cli-argv.ts +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 +19 -66
- 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 +39 -95
- package/scripts/gate/check-reuse.ts +33 -54
- 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 +80 -98
- package/scripts/gate/core-wait-record.ts +48 -0
- package/scripts/gate/core-wait.ts +37 -5
- package/scripts/gate/core-weights.ts +86 -0
- package/scripts/gate/free-cores.ts +27 -4
- package/scripts/gate/gate-ledger.ts +32 -4
- package/scripts/gate/gate-plan.ts +41 -34
- package/scripts/gate/gate-report.ts +14 -2
- package/scripts/gate/gate-run-steps.ts +53 -8
- package/scripts/gate/gate-skip.ts +12 -2
- package/scripts/gate/gate-steps.ts +12 -1
- package/scripts/gate/input-fingerprint.ts +42 -0
- package/scripts/gate/machine-capacity.ts +65 -31
- package/scripts/gate/moved-paths.ts +67 -0
- 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 +27 -24
- 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-write.ts +67 -29
- 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/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 +2 -2
- package/scripts/git/main-merge.ts +25 -9
- 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 +0 -8
- 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 +30 -3
- package/scripts/hooks/pre-push-unit.ts +4 -2
- package/scripts/hooks/pretool-guard-cli.ts +1 -8
- package/scripts/hooks/pretool-guard.ts +32 -19
- package/scripts/hooks/reserved-run.ts +67 -9
- package/scripts/hooks/run-hook.sh +13 -4
- package/scripts/hooks/shell-rules-notice.ts +37 -0
- package/scripts/hooks/stop-actions.ts +2 -21
- package/scripts/hooks/stop-guard.ts +13 -9
- package/scripts/init/hook-command-rewrite.ts +19 -5
- package/scripts/init/hook-launch.ts +15 -17
- package/scripts/init/init-actions.ts +0 -6
- package/scripts/init/init-ai-copy.ts +10 -36
- package/scripts/init/init-bootstrap.ts +9 -8
- package/scripts/init/init-dry-run-report.ts +1 -1
- package/scripts/init/init-dry-run.ts +1 -1
- package/scripts/init/init-file-action.ts +7 -9
- package/scripts/init/init-logic-json-merge.ts +2 -2
- package/scripts/init/init-logic-migrate.ts +9 -82
- package/scripts/init/init-logic.ts +3 -2
- package/scripts/init/init-main.ts +12 -0
- package/scripts/init/init.ts +5 -12
- package/scripts/init/kit-development-versions.ts +3 -7
- package/scripts/init/kit-written-paths.ts +2 -2
- package/scripts/init/project-profile.ts +5 -4
- package/scripts/init/tsconfig-preset-migration.ts +2 -1
- package/scripts/init/vscode-tasks.ts +1 -1
- package/scripts/issue/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 +1 -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 +0 -9
- package/scripts/issue/issue-cite-main.ts +12 -0
- package/scripts/issue/issue-classification.ts +12 -7
- 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 +2 -10
- 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 +0 -11
- 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/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 +15 -43
- package/scripts/josh/file-map-stamp.ts +49 -16
- package/scripts/josh/hook-decision.ts +32 -20
- package/scripts/josh/josh-command-map.ts +4 -1
- package/scripts/josh/josh-command-types.ts +12 -6
- package/scripts/josh/josh-commands-agent-hooks.ts +83 -0
- package/scripts/josh/josh-commands-ai.ts +157 -158
- 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 +25 -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 +103 -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 +144 -6
- package/scripts/josh/josh-logic.ts +6 -13
- package/scripts/josh/package-directory.ts +2 -4
- 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 +14 -23
- package/scripts/lane/lane-check-stats.ts +62 -21
- package/scripts/lane/lane-child-invocation.ts +8 -0
- 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 +24 -3
- package/scripts/lane/lane-gap-stats.ts +156 -0
- package/scripts/lane/lane-handoff.ts +69 -1
- package/scripts/lane/lane-held-stats.ts +129 -0
- package/scripts/lane/lane-install.ts +4 -11
- 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 +92 -123
- package/scripts/lane/lane-limit-cli.ts +12 -1
- package/scripts/lane/lane-measure-cli.ts +57 -11
- 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-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 +24 -3
- package/scripts/lane/lane-residents.ts +162 -0
- package/scripts/lane/lane-restart.ts +22 -2
- 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 +19 -5
- package/scripts/lane/lane-session-broker.ts +102 -21
- 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 +5 -4
- package/scripts/lane/lane-withdraw.ts +50 -49
- 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 +11 -2
- 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 +62 -30
- package/scripts/lint/lint-related-scope.ts +30 -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 +2 -6
- 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 +2 -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.ts +1 -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 +81 -15
- 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 +8 -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 +80 -2
- 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 +7 -0
- package/scripts/rules/git-argv.ts +72 -14
- package/scripts/rules/git-force.ts +12 -2
- package/scripts/rules/guard-remedy.ts +4 -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 +9 -1
- 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/oracle-consulted.ts +10 -0
- package/scripts/rules/oracle-firing.ts +1 -0
- package/scripts/rules/permission-guards.ts +3 -0
- package/scripts/rules/piped-verification.ts +1 -1
- 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 +9 -28
- package/scripts/rules/rule-value-cache.ts +4 -9
- package/scripts/rules/rule-value-cli.ts +51 -32
- package/scripts/rules/rule-value.ts +1 -1
- package/scripts/rules/shell-segments.ts +35 -0
- package/scripts/rules/stop-rule-rows.ts +64 -0
- package/scripts/rules/stop-rules.ts +3 -4
- 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 -32
- 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 +118 -38
- package/scripts/run/board/run-board-header.ts +82 -20
- package/scripts/run/board/run-board-keys.ts +58 -0
- package/scripts/run/board/run-board-kind.ts +20 -6
- package/scripts/run/board/run-board-labels.ts +116 -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 +239 -60
- 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 +151 -27
- package/scripts/run/board/run-board-reason.ts +235 -51
- 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 -48
- package/scripts/run/board/run-board-render-notes.ts +156 -29
- package/scripts/run/board/run-board-render-processes.ts +196 -0
- package/scripts/run/board/run-board-render-section.ts +119 -0
- package/scripts/run/board/run-board-render-slot.ts +3 -36
- package/scripts/run/board/run-board-render-tail.ts +115 -48
- package/scripts/run/board/run-board-render-time.ts +56 -0
- package/scripts/run/board/run-board-render-title.ts +117 -24
- package/scripts/run/board/run-board-render-waits.ts +104 -20
- package/scripts/run/board/run-board-render.ts +207 -265
- package/scripts/run/board/run-board-roots.ts +54 -0
- package/scripts/run/board/run-board-row-yield.ts +9 -4
- package/scripts/run/board/run-board-setup.ts +1 -12
- package/scripts/run/board/run-board-snapshot.ts +111 -0
- package/scripts/run/board/run-board-spin.ts +2 -2
- package/scripts/run/board/run-board-state.ts +22 -33
- package/scripts/run/board/run-board-status.ts +147 -71
- package/scripts/run/board/run-board-thanks-read.ts +2 -2
- package/scripts/run/board/run-board-tick.ts +122 -107
- 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-handoff.ts +2 -2
- 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 +6 -10
- package/scripts/run/event/run-event-scope.ts +2 -2
- package/scripts/run/event/run-event-stream-emit.ts +82 -22
- package/scripts/run/event/run-event-stream.ts +34 -8
- package/scripts/run/hold/run-hold-adopt.ts +65 -0
- package/scripts/run/hold/run-hold-cli.ts +93 -22
- package/scripts/run/hold/run-hold-main.ts +12 -0
- package/scripts/run/hold/run-hold-member.ts +37 -0
- package/scripts/run/hold/run-stop-notify.ts +183 -0
- package/scripts/run/merge/run-merge-auth.ts +31 -0
- package/scripts/run/merge/run-merge-cli.ts +62 -48
- 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 +33 -9
- package/scripts/run/merge/run-merge-steps.ts +120 -85
- package/scripts/run/merge/run-merge.ts +38 -37
- 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 +60 -29
- package/scripts/run/run-next.ts +1 -1
- package/scripts/run/run-parent-cut-hook.ts +2 -2
- 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.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 +63 -140
- package/scripts/run/ship/run-ship-detach.ts +19 -8
- package/scripts/run/ship/run-ship-infra-retry.ts +59 -0
- package/scripts/run/ship/run-ship-next.ts +18 -2
- package/scripts/run/ship/run-ship-overlap.ts +42 -5
- 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 +81 -24
- package/scripts/run/ship/run-ship-preflight.ts +137 -32
- 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 +107 -23
- package/scripts/run/ship/run-ship-review-steps.ts +105 -151
- 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-text.ts +11 -6
- package/scripts/run/ship/run-ship-sync.ts +43 -6
- 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 +25 -1
- 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 +42 -24
- 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 +61 -149
- 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 +97 -10
- 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 +4 -1
- 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-4KKD2UTK.js +0 -66
- package/dist/hooks/chunk-6TS2JD6D.js +0 -237
- package/dist/hooks/chunk-7DSBJVFH.js +0 -50
- package/dist/hooks/chunk-A65Y4YOR.js +0 -79
- package/dist/hooks/chunk-CDY4NFQG.js +0 -15
- package/dist/hooks/chunk-EFXE6C37.js +0 -81
- package/dist/hooks/chunk-GP4IEC4O.js +0 -20
- package/dist/hooks/chunk-JP45SOCJ.js +0 -56
- package/dist/hooks/chunk-LAOV7NLM.js +0 -45
- package/dist/hooks/chunk-M4HGZV7U.js +0 -83
- package/dist/hooks/chunk-PF2NZL2A.js +0 -131
- package/dist/hooks/chunk-PTICX4OL.js +0 -358
- package/dist/hooks/chunk-RT27QRJW.js +0 -6247
- package/dist/hooks/chunk-SYOTDYCI.js +0 -3533
- package/dist/hooks/chunk-UPUZF3AN.js +0 -279
- package/dist/hooks/chunk-WK6SMBIC.js +0 -3180
- package/dist/hooks/duplicate-read-guard.js +0 -30
- package/dist/hooks/investigation-guard.js +0 -29
- package/scripts/backlog/backlog-stalled-cli.ts +0 -30
- package/scripts/cost-runtime/cost-format.ts +0 -29
- package/scripts/init/basic-path-migration.ts +0 -24
- package/scripts/issue/issue-backlinks-cli.ts +0 -93
- package/scripts/josh/josh-commands-guard.ts +0 -38
- package/scripts/josh/josh-usage-automation.ts +0 -121
- package/scripts/josh/josh-usage-backlog.ts +0 -180
- package/scripts/josh/josh-usage-developer.ts +0 -230
- package/scripts/josh/josh-usage-hooks.ts +0 -38
- package/scripts/josh/josh-usage-issue.ts +0 -205
- package/scripts/josh/josh-usage-review.ts +0 -101
- package/scripts/josh/josh-usage-run.ts +0 -252
- package/scripts/josh/josh-usage-session.ts +0 -238
- package/scripts/josh/josh-usage-workflow.ts +0 -212
- package/scripts/lint/cross-file-recheck.ts +0 -155
- package/scripts/registry-migration/migrate-logic.ts +0 -237
- package/scripts/registry-migration/migrate.ts +0 -292
- package/scripts/registry-migration/user-npmrc.ts +0 -15
- package/scripts/rules/rule-guard.ts +0 -23
- package/scripts/rules/rule-registry-rows.ts +0 -292
- package/scripts/rules/rule-registry.ts +0 -112
- package/scripts/run/run-stranded-cli.ts +0 -27
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
#!/usr/bin/env tsx
|
|
2
|
-
import { fileURLToPath } from 'node:url'
|
|
3
1
|
import { CONTEXT_CUT_THRESHOLD } from '#scripts/cost-runtime/context-cut-threshold'
|
|
4
2
|
import { issue_cite } from '#scripts/issue/issue-cite'
|
|
3
|
+
import { RUN_STALLED_LABEL } from '#scripts/issue/issue-labels'
|
|
5
4
|
import { issue_number_shape } from '#scripts/issue/issue-number-shape'
|
|
6
5
|
import { issue_state_cli } from '#scripts/issue/issue-state-cli'
|
|
7
6
|
import { lane_handoff } from '#scripts/lane/lane-handoff'
|
|
@@ -10,8 +9,10 @@ import { cli_flags } from '#scripts/lib/cli-flags'
|
|
|
10
9
|
import { run_carry, type CarryOwner, type RunCarry } from '#scripts/run/carry/run-carry'
|
|
11
10
|
import { run_event_stream } from '#scripts/run/event/run-event-stream'
|
|
12
11
|
import { run_event_stream_emit } from '#scripts/run/event/run-event-stream-emit'
|
|
13
|
-
import {
|
|
12
|
+
import { run_stalled, type StallCause } from '#scripts/run/park/run-stalled'
|
|
14
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'
|
|
15
16
|
import { run_merge_signals } from './run-merge-signals'
|
|
16
17
|
import { run_merge_steps, type FailedResult, type MergeContext } from './run-merge-steps'
|
|
17
18
|
import { run_merge_token, type MergeToken } from './run-merge-token'
|
|
@@ -26,15 +27,12 @@ import { run_merge_token, type MergeToken } from './run-merge-token'
|
|
|
26
27
|
// (stop — the child's own ending), `stop` (the consecutive-failure guard tripped, or a failed child could not be parked) and `retry` (the
|
|
27
28
|
// child's state could not be read; re-read before deciding).
|
|
28
29
|
|
|
29
|
-
const ARGV_OFFSET = 2
|
|
30
30
|
const SUCCESS_EXIT_CODE = 0
|
|
31
31
|
const FAILURE_EXIT_CODE = 1
|
|
32
32
|
const FIRST = 0
|
|
33
33
|
const MIN_PID = 1
|
|
34
34
|
const { MERGE_TOKEN } = run_merge_token
|
|
35
|
-
const PARK_FAILURE_NOTE =
|
|
36
|
-
// The same digit shape `run-carry-args.ts` reads an owner pid under; a count is a bare run of digits.
|
|
37
|
-
const DIGITS = /^\d+$/u
|
|
35
|
+
const PARK_FAILURE_NOTE = `The failed child could not be parked with ${RUN_STALLED_LABEL}; stopping.`
|
|
38
36
|
// A GitHub `owner/repo` slug: an owner and a repository name around a single slash, each starting with
|
|
39
37
|
// an alphanumeric so neither half can begin with `-`. `epic` and `repo` flow into `pnpm josh`
|
|
40
38
|
// subprocess arguments, so a value shaped like an option (`--foo`, or `--evil/x`) would be read as a
|
|
@@ -43,9 +41,10 @@ const DIGITS = /^\d+$/u
|
|
|
43
41
|
// itself forbids (names cannot start with a hyphen) and which the taint analyzer keeps flagging.
|
|
44
42
|
const REPO_PATTERN = /^[A-Za-z0-9][\w.-]*\/[A-Za-z0-9][\w.-]*$/u
|
|
45
43
|
const USAGE =
|
|
46
|
-
'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]'
|
|
47
45
|
|
|
48
46
|
const OPTIONS = {
|
|
47
|
+
driver: { type: 'boolean' },
|
|
49
48
|
epic: { type: 'string' },
|
|
50
49
|
output: { type: 'string' },
|
|
51
50
|
over: { type: 'string' },
|
|
@@ -55,7 +54,9 @@ const OPTIONS = {
|
|
|
55
54
|
|
|
56
55
|
interface ParsedArguments {
|
|
57
56
|
positionals: ReadonlyArray<string>
|
|
58
|
-
values: Partial<Record<'epic' | 'output' | 'over' | 'owner' | 'repo', string>>
|
|
57
|
+
values: Partial<Record<'epic' | 'output' | 'over' | 'owner' | 'repo', string>> & {
|
|
58
|
+
driver?: boolean
|
|
59
|
+
}
|
|
59
60
|
}
|
|
60
61
|
|
|
61
62
|
// Absent owner is "no owner declared", which the carry guard reads as not provably foreign; a present
|
|
@@ -63,11 +64,10 @@ interface ParsedArguments {
|
|
|
63
64
|
function to_owner(raw: string | undefined): CarryOwner | undefined {
|
|
64
65
|
if (raw === undefined) return run_carry.NO_OWNER
|
|
65
66
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
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)
|
|
69
69
|
|
|
70
|
-
return pid < MIN_PID ? undefined : run_carry.owner_of(pid)
|
|
70
|
+
return pid === undefined || pid < MIN_PID ? undefined : run_carry.owner_of(pid)
|
|
71
71
|
}
|
|
72
72
|
|
|
73
73
|
// The epic form needs a repository (`epic:next --lanes` refuses without one), so an epic named with
|
|
@@ -116,7 +116,7 @@ function has_invalid_offer(values: ParsedArguments['values']): boolean {
|
|
|
116
116
|
function has_invalid_legacy_over(raw: string | undefined): boolean {
|
|
117
117
|
if (raw === undefined) return false
|
|
118
118
|
|
|
119
|
-
return
|
|
119
|
+
return cli_flags.to_count(raw) === undefined
|
|
120
120
|
}
|
|
121
121
|
|
|
122
122
|
function valid_child(parsed: ParsedArguments): string | undefined {
|
|
@@ -127,6 +127,11 @@ function valid_child(parsed: ParsedArguments): string | undefined {
|
|
|
127
127
|
return issue_number_shape.ISSUE_NUMBER_PATTERN.test(child) ? child : undefined
|
|
128
128
|
}
|
|
129
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
|
+
|
|
130
135
|
function to_context(parsed: ParsedArguments): MergeContext | undefined {
|
|
131
136
|
if (has_invalid_offer(parsed.values) || has_invalid_legacy_over(parsed.values.over)) {
|
|
132
137
|
return undefined
|
|
@@ -144,7 +149,7 @@ function to_context(parsed: ParsedArguments): MergeContext | undefined {
|
|
|
144
149
|
child,
|
|
145
150
|
epic: valid_epic(parsed.values.epic),
|
|
146
151
|
repo: valid_repo(parsed.values.repo),
|
|
147
|
-
over:
|
|
152
|
+
over: threshold_of(parsed.values),
|
|
148
153
|
owner,
|
|
149
154
|
output: parsed.values.output,
|
|
150
155
|
}
|
|
@@ -156,8 +161,8 @@ function parse(argv: ReadonlyArray<string>): MergeContext | undefined {
|
|
|
156
161
|
return parsed === undefined ? undefined : to_context(parsed)
|
|
157
162
|
}
|
|
158
163
|
|
|
159
|
-
// One handled return: the stdout token and the exit code. Returned rather than printed, so
|
|
160
|
-
//
|
|
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.
|
|
161
166
|
interface ControlVerdict {
|
|
162
167
|
token: MergeToken
|
|
163
168
|
code: number
|
|
@@ -183,8 +188,13 @@ function emit(token: MergeToken, code: number): ControlVerdict {
|
|
|
183
188
|
return { token, code, is_offer: false }
|
|
184
189
|
}
|
|
185
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).
|
|
186
193
|
async function offered(ctx: MergeContext): Promise<OfferVerdict> {
|
|
187
|
-
|
|
194
|
+
const token =
|
|
195
|
+
ctx.over === undefined ? run_merge_driver.DEFERRED_OFFER : await run_merge_steps.ask_next(ctx)
|
|
196
|
+
|
|
197
|
+
return { token, code: SUCCESS_EXIT_CODE, is_offer: true }
|
|
188
198
|
}
|
|
189
199
|
|
|
190
200
|
// A refused count means this session is not the carry record's owner, so the whole operation is
|
|
@@ -197,7 +207,8 @@ function report_count_refused(carry: RunCarry | undefined): MergeVerdict {
|
|
|
197
207
|
|
|
198
208
|
// A merged child counted and its lane closed, the merge put on the stream and in the ledger. Returns the
|
|
199
209
|
// carry when the ownership check refused it, `undefined` once recorded. `run:carry --end` records the
|
|
200
|
-
// 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).
|
|
201
212
|
async function record_merged(ctx: MergeContext): Promise<RunCarry | undefined> {
|
|
202
213
|
const refused = await run_merge_steps.do_merged(ctx)
|
|
203
214
|
|
|
@@ -226,16 +237,13 @@ async function on_merged(ctx: MergeContext): Promise<MergeVerdict> {
|
|
|
226
237
|
return await offered(ctx)
|
|
227
238
|
}
|
|
228
239
|
|
|
229
|
-
// A child released to wait on its open blockers: settled for this run like a parked
|
|
230
|
-
// the stream the same way, but nothing was counted — the failure guard is not read,
|
|
231
|
-
// is offered.
|
|
232
|
-
async function on_waiting(
|
|
233
|
-
ctx: MergeContext,
|
|
234
|
-
blockers: ReadonlyArray<string>,
|
|
235
|
-
): 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> {
|
|
236
244
|
await run_event_stream_emit.emit(
|
|
237
245
|
run_event_stream.EVENT_KIND.PARK,
|
|
238
|
-
`${issue_cite.plain(ctx.child)} waiting on ${
|
|
246
|
+
`${issue_cite.plain(ctx.child)} waiting on ${waits.join(', ')}`,
|
|
239
247
|
)
|
|
240
248
|
|
|
241
249
|
return await offered(ctx)
|
|
@@ -248,9 +256,11 @@ async function on_parked_failure(ctx: MergeContext, result: FailedResult): Promi
|
|
|
248
256
|
return emit(MERGE_TOKEN.STOP, FAILURE_EXIT_CODE)
|
|
249
257
|
}
|
|
250
258
|
|
|
259
|
+
const cause = result.cause ?? run_stalled.SESSION_UNFINISHED.short
|
|
260
|
+
|
|
251
261
|
await run_event_stream_emit.emit(
|
|
252
262
|
run_event_stream.EVENT_KIND.PARK,
|
|
253
|
-
|
|
263
|
+
run_stalled.park_event(ctx.child, cause),
|
|
254
264
|
)
|
|
255
265
|
|
|
256
266
|
if (result.carry !== undefined && run_merge.is_guard_tripped(result.carry.failures)) {
|
|
@@ -260,12 +270,12 @@ async function on_parked_failure(ctx: MergeContext, result: FailedResult): Promi
|
|
|
260
270
|
return await offered(ctx)
|
|
261
271
|
}
|
|
262
272
|
|
|
263
|
-
async function on_failed(ctx: MergeContext, cause?:
|
|
273
|
+
async function on_failed(ctx: MergeContext, cause?: StallCause): Promise<MergeVerdict> {
|
|
264
274
|
const result = await run_merge_steps.do_failed(ctx, cause)
|
|
265
275
|
|
|
266
276
|
if (result.is_refused) return report_count_refused(result.carry)
|
|
267
277
|
|
|
268
|
-
if (result.
|
|
278
|
+
if (result.waits.length > 0) return await on_waiting(ctx, result.waits)
|
|
269
279
|
|
|
270
280
|
return await on_parked_failure(ctx, result)
|
|
271
281
|
}
|
|
@@ -290,6 +300,14 @@ async function on_outage(ctx: MergeContext): Promise<MergeVerdict> {
|
|
|
290
300
|
return await offered(ctx)
|
|
291
301
|
}
|
|
292
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
|
+
|
|
293
311
|
// A child that ended its session with a cut no successor adopted: its successor is relaunched,
|
|
294
312
|
// nothing is counted and nothing is parked, and `resumed` tells the parent to await the same lane
|
|
295
313
|
// again rather than dispatch into it. A successor that could not be started — or a cut the
|
|
@@ -301,7 +319,7 @@ async function on_cut(ctx: MergeContext): Promise<MergeVerdict> {
|
|
|
301
319
|
if (refused !== undefined) return report_count_refused(refused)
|
|
302
320
|
|
|
303
321
|
if (!(await run_merge_steps.resume_cut(ctx.child))) {
|
|
304
|
-
return await on_failed(ctx,
|
|
322
|
+
return await on_failed(ctx, run_stalled.CUT_NOT_RELAUNCHED)
|
|
305
323
|
}
|
|
306
324
|
|
|
307
325
|
await run_event_stream_emit.emit(
|
|
@@ -314,10 +332,10 @@ async function on_cut(ctx: MergeContext): Promise<MergeVerdict> {
|
|
|
314
332
|
|
|
315
333
|
// A child that parked itself: nothing is counted, but the park is written to the stream as a failed
|
|
316
334
|
// child's is, so a reader restoring the run from its events sees the child settled. Its `in-progress`
|
|
317
|
-
// is dropped as a failed child's is: left on, it would outlive the
|
|
318
|
-
// 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.
|
|
319
337
|
async function on_parked(ctx: MergeContext): Promise<MergeVerdict> {
|
|
320
|
-
await
|
|
338
|
+
await run_merge_steps.release_child(ctx.child)
|
|
321
339
|
await run_event_stream_emit.emit(
|
|
322
340
|
run_event_stream.EVENT_KIND.PARK,
|
|
323
341
|
`${issue_cite.plain(ctx.child)} parked`,
|
|
@@ -338,9 +356,9 @@ async function on_skipped(ctx: MergeContext): Promise<MergeVerdict> {
|
|
|
338
356
|
return await offered(ctx)
|
|
339
357
|
}
|
|
340
358
|
|
|
341
|
-
// A child a person withdrew with `lane:withdraw`: the withdrawal already stopped it, closed its
|
|
342
|
-
// and
|
|
343
|
-
// next child.
|
|
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.
|
|
344
362
|
async function on_withdrawn(ctx: MergeContext): Promise<MergeVerdict> {
|
|
345
363
|
return await offered(ctx)
|
|
346
364
|
}
|
|
@@ -366,6 +384,7 @@ const HANDLERS: Readonly<Record<ChildOutcome, (ctx: MergeContext) => Promise<Mer
|
|
|
366
384
|
'human-review': on_human_review,
|
|
367
385
|
merged: on_merged,
|
|
368
386
|
outage: on_outage,
|
|
387
|
+
unauthenticated: on_unauthenticated,
|
|
369
388
|
parked: on_parked,
|
|
370
389
|
split: on_skipped,
|
|
371
390
|
unresolved: on_unresolved,
|
|
@@ -373,8 +392,9 @@ const HANDLERS: Readonly<Record<ChildOutcome, (ctx: MergeContext) => Promise<Mer
|
|
|
373
392
|
withdrawn: on_withdrawn,
|
|
374
393
|
}
|
|
375
394
|
|
|
376
|
-
// The whole merge event for one returned child
|
|
377
|
-
//
|
|
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.
|
|
378
398
|
async function merge_child(ctx: MergeContext): Promise<MergeResult> {
|
|
379
399
|
if (lane_handoff.is_ship_running(ctx.child, process.cwd())) {
|
|
380
400
|
return { outcome: 'shipping', ...(await on_shipping()) }
|
|
@@ -384,9 +404,9 @@ async function merge_child(ctx: MergeContext): Promise<MergeResult> {
|
|
|
384
404
|
const signals = await run_merge_signals.read_signals(ctx, read)
|
|
385
405
|
const outcome = run_merge_signals.outcome_of(read, signals)
|
|
386
406
|
|
|
387
|
-
const { merged_pr,
|
|
407
|
+
const { merged_pr, is_streak_exempt } = signals
|
|
388
408
|
|
|
389
|
-
return { outcome, ...(await HANDLERS[outcome]({ ...ctx, merged_pr,
|
|
409
|
+
return { outcome, ...(await HANDLERS[outcome]({ ...ctx, merged_pr, is_streak_exempt })) }
|
|
390
410
|
}
|
|
391
411
|
|
|
392
412
|
async function run(argv: ReadonlyArray<string>): Promise<number> {
|
|
@@ -400,15 +420,11 @@ async function run(argv: ReadonlyArray<string>): Promise<number> {
|
|
|
400
420
|
|
|
401
421
|
const result = await merge_child(ctx)
|
|
402
422
|
|
|
403
|
-
console.info(result
|
|
423
|
+
console.info(run_merge_driver.printed(argv, result))
|
|
404
424
|
|
|
405
425
|
return result.code
|
|
406
426
|
}
|
|
407
427
|
|
|
408
|
-
async function main(argv: ReadonlyArray<string>): Promise<void> {
|
|
409
|
-
process.exitCode = await run(argv)
|
|
410
|
-
}
|
|
411
|
-
|
|
412
428
|
const run_merge_cli = {
|
|
413
429
|
merge_child,
|
|
414
430
|
parse,
|
|
@@ -417,7 +433,5 @@ const run_merge_cli = {
|
|
|
417
433
|
run,
|
|
418
434
|
}
|
|
419
435
|
|
|
420
|
-
if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
|
|
421
|
-
|
|
422
436
|
export type { MergeResult }
|
|
423
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 }
|
|
@@ -3,8 +3,10 @@ import { lane_registry } from '#scripts/lane/lane-registry'
|
|
|
3
3
|
import { lane_relaunch } from '#scripts/lane/lane-relaunch'
|
|
4
4
|
import { run_event_scope } from '#scripts/run/event/run-event-scope'
|
|
5
5
|
import { run_event_stream, type RunEvent } from '#scripts/run/event/run-event-stream'
|
|
6
|
+
import type { StallCause } from '#scripts/run/park/run-stalled'
|
|
6
7
|
import { run_ending } from '#scripts/run/run-ending'
|
|
7
8
|
import { run_ship_detach } from '#scripts/run/ship/run-ship-detach'
|
|
9
|
+
import { run_ship_stop_text } from '#scripts/run/ship/run-ship-stop-text'
|
|
8
10
|
|
|
9
11
|
// Why `run:merge` parks a child whose detached ship has already ended (joshuafolkken/kit#3808).
|
|
10
12
|
//
|
|
@@ -35,7 +37,18 @@ function since_ship_launch(events: Events, child: string): Events | undefined {
|
|
|
35
37
|
return launched_at === -1 ? undefined : own.slice(launched_at + 1)
|
|
36
38
|
}
|
|
37
39
|
|
|
38
|
-
|
|
40
|
+
// The stopped stage names the cause's short form (`review failed`); a stop text in no known shape is
|
|
41
|
+
// still a ship stop.
|
|
42
|
+
function stop_cause(stop: RunEvent): StallCause {
|
|
43
|
+
const stage = run_ship_stop_text.reason_of(stop.text)
|
|
44
|
+
|
|
45
|
+
return {
|
|
46
|
+
short: stage === undefined ? 'ship stopped' : `${stage} failed`,
|
|
47
|
+
why: `its detached ship stopped and was not fixed: ${stop.text}.`,
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function cause_of(ending: ShipEnding, events: Events, child: string): StallCause | undefined {
|
|
39
52
|
if (ending === undefined || !ENDED_RESULTS.has(ending.result)) return undefined
|
|
40
53
|
|
|
41
54
|
const attempt = since_ship_launch(events, child)
|
|
@@ -43,14 +56,17 @@ function cause_of(ending: ShipEnding, events: Events, child: string): string | u
|
|
|
43
56
|
|
|
44
57
|
const stop = attempt.findLast((event) => event.kind === run_event_stream.EVENT_KIND.SHIP_STOP)
|
|
45
58
|
|
|
46
|
-
if (stop !== undefined) return
|
|
59
|
+
if (stop !== undefined) return stop_cause(stop)
|
|
47
60
|
|
|
48
|
-
return
|
|
61
|
+
return {
|
|
62
|
+
short: `ship ${ending.result}`,
|
|
63
|
+
why: `its detached ship ended ${ending.result} before recording a stopped stage — pnpm josh ship --log ${child}.`,
|
|
64
|
+
}
|
|
49
65
|
}
|
|
50
66
|
|
|
51
67
|
// The ship's cause for `child`'s park, read from the record and the stream this checkout's repository
|
|
52
68
|
// keys on, or `undefined` when the child handed nothing to a ship or its ship succeeded.
|
|
53
|
-
function cause(child: string, directory: string = process.cwd()):
|
|
69
|
+
function cause(child: string, directory: string = process.cwd()): StallCause | undefined {
|
|
54
70
|
const repository = git_common_directory.repository(directory)
|
|
55
71
|
if (repository === undefined) return undefined
|
|
56
72
|
|