@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
package/scripts/gh/git-gh-pr.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { pr_classification, type ReleaseClassification } from '#scripts/ci/pr-classification'
|
|
2
2
|
import { git_command } from '#scripts/git/git-command'
|
|
3
3
|
import { poll } from '#scripts/lib/poll'
|
|
4
|
-
import { z } from 'zod'
|
|
5
4
|
import { git_gh_api_path } from './git-gh-api-path'
|
|
6
5
|
import { git_gh_exec } from './git-gh-exec'
|
|
6
|
+
import { gh_failure } from './git-gh-failure'
|
|
7
7
|
import { git_gh_helpers } from './git-gh-helpers'
|
|
8
8
|
import { git_gh_issue_write } from './git-gh-issue-write'
|
|
9
9
|
import { forget_pr_numbers, git_gh_pr_read, read_pull, require_pr_number } from './git-gh-pr-read'
|
|
@@ -49,25 +49,27 @@ const MERGE_UNCONFIRMED_MESSAGE =
|
|
|
49
49
|
'gh api could not read the pull request back after the merge request failed'
|
|
50
50
|
const MERGE_READ_BACK_ATTEMPTS = 3
|
|
51
51
|
const MERGE_READ_BACK_INTERVAL_MS = 1000
|
|
52
|
+
// `PUT pulls/{N}/merge` with a `sha` that is no longer the branch head.
|
|
53
|
+
const HEAD_MOVED_STATUS = 409
|
|
52
54
|
const PR_NUMBER_PATTERN = /\/pull\/([1-9]\d*)$/u
|
|
53
|
-
const LABELS_SEGMENT = '/labels'
|
|
54
|
-
const PR_LABELS = z.array(z.object({ name: z.string() }))
|
|
55
55
|
|
|
56
|
+
// A pull request is an issue to the labels endpoint, so the write is the issue one: a failed answer
|
|
57
|
+
// is confirmed by reading the labels back before it is reported as a failed write.
|
|
56
58
|
async function add_pr_classification(number: string, label: ReleaseClassification): Promise<void> {
|
|
57
|
-
await
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
})
|
|
59
|
+
const write = await git_gh_issue_write.issue_apply_label(number, label)
|
|
60
|
+
|
|
61
|
+
if (!write.is_applied) throw new Error(write.reason)
|
|
61
62
|
}
|
|
62
63
|
|
|
64
|
+
// Labels that could not be read are not "no classification": answering that would add a second
|
|
65
|
+
// classification beside the one a person already put on the pull request.
|
|
63
66
|
async function pr_get_classification(
|
|
64
67
|
branch_name: string,
|
|
65
68
|
): Promise<ReleaseClassification | undefined> {
|
|
66
69
|
const number = await require_pr_number(branch_name)
|
|
67
|
-
const
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
const names = PR_LABELS.parse(JSON.parse(response)).map((label) => label.name.toLowerCase())
|
|
70
|
+
const labels = await git_gh_issue_write.read_label_names(String(number))
|
|
71
|
+
if (labels === undefined) throw new Error(`Unreadable labels on branch ${branch_name}`)
|
|
72
|
+
const names = labels.map((name) => name.toLowerCase())
|
|
71
73
|
const selected = names.filter((name) => pr_classification.is_classification(name))
|
|
72
74
|
if (selected.length === 0) return undefined
|
|
73
75
|
|
|
@@ -166,16 +168,25 @@ async function pr_update_body(branch_name: string, body: string): Promise<void>
|
|
|
166
168
|
}
|
|
167
169
|
|
|
168
170
|
// A merge moves the remembered detail read's state, so it is cleared first.
|
|
169
|
-
|
|
171
|
+
//
|
|
172
|
+
// **`sha` binds the merge to the head the checks passed on** (#4036): without it GitHub merges
|
|
173
|
+
// whatever the branch points at, so a commit pushed after the gate went green would land unverified.
|
|
174
|
+
// A head that moved is answered 409 (`is_head_moved`).
|
|
175
|
+
async function put_merge(pr_number: number, head_sha: string): Promise<void> {
|
|
170
176
|
forget_pr_numbers()
|
|
171
177
|
await git_gh_exec.exec_gh_api({
|
|
172
178
|
path: git_gh_api_path.pull_merge_api_path(String(pr_number)),
|
|
173
179
|
method: PUT_METHOD,
|
|
174
|
-
body: JSON.stringify({ merge_method: MERGE_COMMIT_METHOD }),
|
|
180
|
+
body: JSON.stringify({ merge_method: MERGE_COMMIT_METHOD, sha: head_sha }),
|
|
175
181
|
timeout_ms: MERGE_REQUEST_TIMEOUT_MS,
|
|
176
182
|
})
|
|
177
183
|
}
|
|
178
184
|
|
|
185
|
+
// GitHub's answer to a merge whose `sha` is no longer the branch head.
|
|
186
|
+
function is_head_moved(error: unknown): boolean {
|
|
187
|
+
return gh_failure.failure_of(error)?.status === HEAD_MOVED_STATUS
|
|
188
|
+
}
|
|
189
|
+
|
|
179
190
|
// `undefined` is "nobody read it", kept apart from the `false` that means "the pull request is not
|
|
180
191
|
// merged". Folding the two would report an unread state as a settled answer.
|
|
181
192
|
async function read_merge_state(pr_number: number): Promise<boolean | undefined> {
|
|
@@ -240,11 +251,11 @@ async function has_merge_landed(pr_number: number, merge_error: unknown): Promis
|
|
|
240
251
|
// made by hand between the failure and the read leaves `followup` with exactly the same work to
|
|
241
252
|
// finish. REST offers nothing that would tell the two apart without keeping the merge commit's SHA
|
|
242
253
|
// across a request that never answered.
|
|
243
|
-
async function pr_merge(branch_name: string): Promise<void> {
|
|
254
|
+
async function pr_merge(branch_name: string, head_sha: string): Promise<void> {
|
|
244
255
|
const pr_number = await require_pr_number(branch_name)
|
|
245
256
|
|
|
246
257
|
try {
|
|
247
|
-
await put_merge(pr_number)
|
|
258
|
+
await put_merge(pr_number, head_sha)
|
|
248
259
|
} catch (error) {
|
|
249
260
|
if (!(await has_merge_landed(pr_number, error))) throw error
|
|
250
261
|
}
|
|
@@ -259,6 +270,7 @@ const git_gh_pr = {
|
|
|
259
270
|
pr_comment,
|
|
260
271
|
pr_merge,
|
|
261
272
|
pr_update_body,
|
|
273
|
+
is_head_moved,
|
|
262
274
|
}
|
|
263
275
|
|
|
264
276
|
export { git_gh_pr, MERGE_COMMIT_METHOD, MERGE_REQUEST_TIMEOUT_MS, MERGE_UNCONFIRMED_MESSAGE }
|
|
@@ -2,6 +2,7 @@ import {
|
|
|
2
2
|
CHECK_STATUS_FAIL,
|
|
3
3
|
CHECK_STATUS_MISSING,
|
|
4
4
|
CHECK_STATUS_PASS,
|
|
5
|
+
CHECK_STATUS_PENDING,
|
|
5
6
|
type PrStateSnapshot,
|
|
6
7
|
type RollupCheck,
|
|
7
8
|
} from './git-pr-checks-parse'
|
|
@@ -12,7 +13,7 @@ import {
|
|
|
12
13
|
// to restore the old behavior. Revert once the fresh-context review subagent replaces it.
|
|
13
14
|
const DEFAULT_REQUIRED_CHECKS = ['SonarQube']
|
|
14
15
|
// The single source of the check name every CodeRabbit exemption is keyed on — the merge gate's
|
|
15
|
-
// `
|
|
16
|
+
// `is_unstable_only_from_optional`, the look-ahead's `is_awaited_check`, and the fixtures the two
|
|
16
17
|
// are tested from. A second literal spelling of it anywhere is how one of them silently stops
|
|
17
18
|
// matching after CodeRabbit renames its context.
|
|
18
19
|
const CODERABBIT_CHECK_NAME = 'CodeRabbit'
|
|
@@ -131,15 +132,46 @@ function is_coderabbit_rate_limited(check: RollupCheck): boolean {
|
|
|
131
132
|
)
|
|
132
133
|
}
|
|
133
134
|
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
135
|
+
function matches_any(check_name: string, required_names: ReadonlyArray<string>): boolean {
|
|
136
|
+
return required_names.some((required) => is_required_match(check_name, required))
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
// A check still running that the base branch's rules do not require — GitHub's default-setup
|
|
140
|
+
// `CodeQL`, which runs for about thirty minutes beside a six-minute CI (joshuafolkken/kit#4351).
|
|
141
|
+
// With no required context known nothing qualifies, so the gate waits for `CLEAN` as it always did.
|
|
142
|
+
function is_optional_pending(
|
|
143
|
+
check: RollupCheck,
|
|
144
|
+
required_contexts: ReadonlyArray<string>,
|
|
145
|
+
): boolean {
|
|
146
|
+
if (required_contexts.length === 0 || check.status !== CHECK_STATUS_PENDING) return false
|
|
147
|
+
|
|
148
|
+
return !matches_any(check.name, required_contexts)
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
function is_every_context_passing(
|
|
152
|
+
checks: ReadonlyArray<RollupCheck>,
|
|
153
|
+
contexts: ReadonlyArray<string>,
|
|
154
|
+
): boolean {
|
|
155
|
+
return contexts.every(
|
|
156
|
+
(context) => find_required_check(checks, context)?.status === CHECK_STATUS_PASS,
|
|
157
|
+
)
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
// GitHub reports UNSTABLE for a pull request whose required checks are green while a check outside
|
|
161
|
+
// them is pending or failing. Accept that state when every non-passing check is CodeRabbit's
|
|
162
|
+
// (temporary: CodeRabbit is not required) or an optional one still running, and every context the
|
|
163
|
+
// base branch requires has passed in the rollup itself — any other non-passing check keeps the gate
|
|
164
|
+
// strict. A failed optional check never reaches here: `collect_blocking_failures` ends the wait first.
|
|
165
|
+
function is_unstable_only_from_optional(snapshot: PrStateSnapshot): boolean {
|
|
138
166
|
if (snapshot.merge_state_status !== MERGE_STATE_UNSTABLE) return false
|
|
167
|
+
const required_contexts = snapshot.required_contexts ?? []
|
|
139
168
|
const non_passing = snapshot.rollup.filter((check) => check.status !== CHECK_STATUS_PASS)
|
|
140
169
|
if (non_passing.length === 0) return false
|
|
170
|
+
const is_tolerated = non_passing.every(
|
|
171
|
+
(check) => is_coderabbit_check(check.name) || is_optional_pending(check, required_contexts),
|
|
172
|
+
)
|
|
141
173
|
|
|
142
|
-
return
|
|
174
|
+
return is_tolerated && is_every_context_passing(snapshot.rollup, required_contexts)
|
|
143
175
|
}
|
|
144
176
|
|
|
145
177
|
function is_required_check(check_name: string): boolean {
|
|
@@ -169,7 +201,7 @@ function collect_blocking_failures(snapshot: PrStateSnapshot): Array<string> {
|
|
|
169
201
|
function is_mergeable_state(snapshot: PrStateSnapshot): boolean {
|
|
170
202
|
if (is_merge_state_clean(snapshot.merge_state_status)) return true
|
|
171
203
|
|
|
172
|
-
return
|
|
204
|
+
return is_unstable_only_from_optional(snapshot)
|
|
173
205
|
}
|
|
174
206
|
|
|
175
207
|
// The wait's own error text: naming the checks that failed is what turns a red `followup` into
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { pr_raw_schema, type RollupItemData } from '#scripts/git/git-schemas'
|
|
2
2
|
import { json_value } from '#scripts/lib/json-value'
|
|
3
|
+
import type { z } from 'zod'
|
|
3
4
|
|
|
4
5
|
const CHECK_STATUS_PASS = 'pass'
|
|
5
6
|
const CHECK_STATUS_PENDING = 'pending'
|
|
@@ -9,8 +10,8 @@ const CHECK_STATUS_MISSING = 'missing'
|
|
|
9
10
|
// GitHub reports a job whose `if:` condition was false as COMPLETED with conclusion `skipped`, and
|
|
10
11
|
// counts it as satisfied for branch protection — a pull request reaches CLEAN with such jobs in its
|
|
11
12
|
// rollup. Recording them as `fail` would disagree with GitHub itself, and it would disable the
|
|
12
|
-
// CodeRabbit non-blocking exemption: `
|
|
13
|
-
// every non-passing check is CodeRabbit's, so kit's own conditional jobs (`auto-merge`, `E2E`,
|
|
13
|
+
// CodeRabbit non-blocking exemption: `is_unstable_only_from_optional` opens the gate only when
|
|
14
|
+
// every non-passing check is CodeRabbit's or an optional one still running, so kit's own conditional jobs (`auto-merge`, `E2E`,
|
|
14
15
|
// `Notify Auto Tag`) would keep a slow review blocking the merge until the wait loop timed out. That
|
|
15
16
|
// is invisible on fast reviews, where CLEAN short-circuits the predicate — it surfaces only on the
|
|
16
17
|
// exact path the exemption exists to protect.
|
|
@@ -45,6 +46,12 @@ interface PrStateSnapshot {
|
|
|
45
46
|
rollup: Array<RollupCheck>
|
|
46
47
|
merge_state_status: string | undefined
|
|
47
48
|
review_decision: string | undefined
|
|
49
|
+
// The commit `rollup` was read from — the head a merge has to name so that it lands what passed and
|
|
50
|
+
// nothing pushed since (#4036). Absent where the snapshot carried none.
|
|
51
|
+
head_sha?: string
|
|
52
|
+
// The base branch's required status check contexts (joshuafolkken/kit#4351). Absent where the
|
|
53
|
+
// branch requires none or they could not be read, which keeps the merge gate waiting for `CLEAN`.
|
|
54
|
+
required_contexts?: Array<string>
|
|
48
55
|
}
|
|
49
56
|
|
|
50
57
|
function read_string(value: unknown): string | undefined {
|
|
@@ -118,16 +125,39 @@ function parse_rollup_checks(raw_json: string): Array<RollupCheck> {
|
|
|
118
125
|
return checks
|
|
119
126
|
}
|
|
120
127
|
|
|
121
|
-
function
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
128
|
+
function with_head_sha(snapshot: PrStateSnapshot, head_sha: string | undefined): PrStateSnapshot {
|
|
129
|
+
return head_sha === undefined ? snapshot : { ...snapshot, head_sha }
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
function with_required_contexts(
|
|
133
|
+
snapshot: PrStateSnapshot,
|
|
134
|
+
required_contexts: Array<string> | undefined,
|
|
135
|
+
): PrStateSnapshot {
|
|
136
|
+
if (required_contexts === undefined || required_contexts.length === 0) return snapshot
|
|
137
|
+
|
|
138
|
+
return { ...snapshot, required_contexts }
|
|
139
|
+
}
|
|
125
140
|
|
|
126
|
-
|
|
141
|
+
type PrRawData = Partial<z.infer<typeof pr_raw_schema>>
|
|
142
|
+
|
|
143
|
+
function read_pr_raw_data(raw_json: string): PrRawData {
|
|
144
|
+
const result = pr_raw_schema.safeParse(json_value.parse_or_undefined(raw_json))
|
|
145
|
+
|
|
146
|
+
return result.success ? result.data : {}
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
function parse_pr_state_snapshot(raw_json: string): PrStateSnapshot {
|
|
150
|
+
const data = read_pr_raw_data(raw_json)
|
|
151
|
+
const snapshot = {
|
|
127
152
|
rollup: parse_rollup_checks(raw_json),
|
|
128
|
-
merge_state_status: read_string(data
|
|
129
|
-
review_decision: read_string(data
|
|
153
|
+
merge_state_status: read_string(data.mergeStateStatus),
|
|
154
|
+
review_decision: read_string(data.reviewDecision),
|
|
130
155
|
}
|
|
156
|
+
|
|
157
|
+
return with_required_contexts(
|
|
158
|
+
with_head_sha(snapshot, read_string(data.headRefOid)),
|
|
159
|
+
data.requiredContexts,
|
|
160
|
+
)
|
|
131
161
|
}
|
|
132
162
|
|
|
133
163
|
export {
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { git_gh_command } from './git-gh-command'
|
|
2
|
+
import { git_pr_checks, type PrStateSnapshot } from './git-pr-checks'
|
|
3
|
+
|
|
4
|
+
// **A merge lands the head the merge gate passed, and nothing pushed after it** (#4036).
|
|
5
|
+
//
|
|
6
|
+
// The gate reads the checks of one commit, and the merge request names that commit as its `sha`. A
|
|
7
|
+
// push between the two moves the head, GitHub answers 409, and the wait starts over on the new head
|
|
8
|
+
// — so the push is merged once its own checks pass, with nobody having to re-run anything. The
|
|
9
|
+
// retries are bounded: a branch that keeps moving under every wait is not one to merge unattended.
|
|
10
|
+
|
|
11
|
+
const MAX_HEAD_MOVES = 3
|
|
12
|
+
const NO_CHECKED_HEAD_MESSAGE =
|
|
13
|
+
'The merge gate answered without the head commit it checked, so there is no commit to bind the merge to'
|
|
14
|
+
const HEAD_MOVED_NOTE =
|
|
15
|
+
'The pull request head moved after its checks passed — waiting on the new head'
|
|
16
|
+
const HEAD_KEPT_MOVING_MESSAGE = `The pull request head moved after its checks passed ${String(MAX_HEAD_MOVES)} times, so it was not merged`
|
|
17
|
+
|
|
18
|
+
type WaitForGreen = () => Promise<PrStateSnapshot>
|
|
19
|
+
|
|
20
|
+
interface CheckedMerge {
|
|
21
|
+
branch_name: string
|
|
22
|
+
// The wait to go back to when the head moved — the caller's own, so a re-wait watches what the
|
|
23
|
+
// first wait watched.
|
|
24
|
+
wait_for_green: WaitForGreen
|
|
25
|
+
// The snapshot the gate already passed. Absent, the merge waits for one first.
|
|
26
|
+
checked?: PrStateSnapshot | undefined
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function checked_head(snapshot: PrStateSnapshot): string {
|
|
30
|
+
if (snapshot.head_sha === undefined) throw new Error(NO_CHECKED_HEAD_MESSAGE)
|
|
31
|
+
|
|
32
|
+
return snapshot.head_sha
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// `false` is "the head moved"; every other failure is the caller's to see.
|
|
36
|
+
async function try_merge(branch_name: string, snapshot: PrStateSnapshot): Promise<boolean> {
|
|
37
|
+
const head_sha = checked_head(snapshot)
|
|
38
|
+
|
|
39
|
+
try {
|
|
40
|
+
await git_gh_command.pr_merge(branch_name, head_sha)
|
|
41
|
+
|
|
42
|
+
return true
|
|
43
|
+
} catch (error) {
|
|
44
|
+
if (!git_gh_command.is_head_moved(error)) throw error
|
|
45
|
+
|
|
46
|
+
return false
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
async function merge_checked(input: CheckedMerge): Promise<void> {
|
|
51
|
+
let snapshot = input.checked ?? (await input.wait_for_green())
|
|
52
|
+
|
|
53
|
+
for (let move = 0; move < MAX_HEAD_MOVES; move += 1) {
|
|
54
|
+
// eslint-disable-next-line no-await-in-loop -- each merge names the head the wait before it passed
|
|
55
|
+
if (await try_merge(input.branch_name, snapshot)) return
|
|
56
|
+
|
|
57
|
+
console.info(HEAD_MOVED_NOTE)
|
|
58
|
+
// eslint-disable-next-line no-await-in-loop -- the new head has to pass before it is merged
|
|
59
|
+
snapshot = await input.wait_for_green()
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
throw new Error(HEAD_KEPT_MOVING_MESSAGE)
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// The merge gate's default wait, then the bound merge.
|
|
66
|
+
async function merge_when_green(branch_name: string): Promise<void> {
|
|
67
|
+
async function wait_for_green(): Promise<PrStateSnapshot> {
|
|
68
|
+
return await git_pr_checks.wait_for_pr_success(branch_name)
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
await merge_checked({ branch_name, wait_for_green })
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
const git_pr_merge_checked = {
|
|
75
|
+
merge_checked,
|
|
76
|
+
merge_when_green,
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
export type { CheckedMerge, WaitForGreen }
|
|
80
|
+
export { git_pr_merge_checked, HEAD_KEPT_MOVING_MESSAGE, MAX_HEAD_MOVES, NO_CHECKED_HEAD_MESSAGE }
|
package/scripts/gh/git-pr.ts
CHANGED
|
@@ -5,6 +5,7 @@ import { issue_cite } from '#scripts/issue/issue-cite'
|
|
|
5
5
|
import { session_cite } from '#scripts/issue/session-cite'
|
|
6
6
|
import { animation_helpers, type AnimationOptions } from '#scripts/lib/animation-helpers'
|
|
7
7
|
import { json_value } from '#scripts/lib/json-value'
|
|
8
|
+
import { acceptance_map } from '#scripts/review/acceptance-map'
|
|
8
9
|
import { git_gh_command } from './git-gh-command'
|
|
9
10
|
import { git_pr_error } from './git-pr-error'
|
|
10
11
|
import { git_pr_messages } from './git-pr-messages'
|
|
@@ -172,6 +173,17 @@ function build_body(issue_info: IssueInfo, extra_body?: string): string {
|
|
|
172
173
|
return `${closes}\n\n${extra_body}`
|
|
173
174
|
}
|
|
174
175
|
|
|
176
|
+
// A body without the acceptance-criteria table gets one pending row per criterion, so the author fills
|
|
177
|
+
// in rows that already carry their identifiers — `josh followup` refuses the merge until they do.
|
|
178
|
+
async function body_with_map(issue_info: IssueInfo, extra_body?: string): Promise<string> {
|
|
179
|
+
const body = build_body(issue_info, extra_body)
|
|
180
|
+
|
|
181
|
+
if (acceptance_map.has_map(body)) return body
|
|
182
|
+
const map = acceptance_map.skeleton(await git_gh_command.issue_get_body(issue_info.number))
|
|
183
|
+
|
|
184
|
+
return map === undefined ? body : `${body}\n\n${map}`
|
|
185
|
+
}
|
|
186
|
+
|
|
175
187
|
async function existing_pr_label(branch_name: string): Promise<ReleaseClassification | undefined> {
|
|
176
188
|
if (
|
|
177
189
|
!(await git_gh_command.pr_exists(branch_name)) ||
|
|
@@ -190,7 +202,7 @@ async function create_for_issue(
|
|
|
190
202
|
): Promise<void> {
|
|
191
203
|
await create(
|
|
192
204
|
build_title(issue_info),
|
|
193
|
-
|
|
205
|
+
await body_with_map(issue_info, extra_body),
|
|
194
206
|
issue_info.branch_name,
|
|
195
207
|
{
|
|
196
208
|
label,
|
package/scripts/git/base-tree.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { mkdtemp, rm, symlink } from 'node:fs/promises'
|
|
1
|
+
import { copyFile, mkdir, mkdtemp, rm, symlink } from 'node:fs/promises'
|
|
2
2
|
import { tmpdir } from 'node:os'
|
|
3
3
|
import path from 'node:path'
|
|
4
4
|
import { git_worktree } from './git-worktree'
|
|
@@ -60,7 +60,24 @@ async function with_tree<T>(
|
|
|
60
60
|
}
|
|
61
61
|
}
|
|
62
62
|
|
|
63
|
-
|
|
63
|
+
async function copy_one(tree: string, file: string): Promise<void> {
|
|
64
|
+
const target = path.join(tree, file)
|
|
65
|
+
|
|
66
|
+
await mkdir(path.dirname(target), { recursive: true })
|
|
67
|
+
await copyFile(file, target)
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// The caller's working-tree files into the tree at the same relative paths. Each file has its own
|
|
71
|
+
// target, and a recursive `mkdir` tolerates a sibling creating the same parent.
|
|
72
|
+
async function copy_in(tree: string, files: ReadonlyArray<string>): Promise<void> {
|
|
73
|
+
await Promise.all(
|
|
74
|
+
files.map(async (file) => {
|
|
75
|
+
await copy_one(tree, file)
|
|
76
|
+
}),
|
|
77
|
+
)
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
const base_tree = { NODE_MODULES, copy_in, with_tree }
|
|
64
81
|
|
|
65
82
|
export type { BaseTree }
|
|
66
83
|
export { base_tree }
|
|
@@ -11,9 +11,10 @@ import { git_command } from './git-command'
|
|
|
11
11
|
// nothing, and listing what was narrowed by — is identical, so it lives here once rather than in
|
|
12
12
|
// each command.
|
|
13
13
|
//
|
|
14
|
-
//
|
|
15
|
-
//
|
|
16
|
-
//
|
|
14
|
+
// The narrowed unit run replaces the whole suite in the gate (joshuafolkken/kit#4065), and the
|
|
15
|
+
// narrowed lint the whole-tree lint (joshuafolkken/kit#4085), each with CI's whole run behind it.
|
|
16
|
+
// Either way both fallbacks end at the whole check, and each says which of the two it was: the
|
|
17
|
+
// one thing this must never do is answer "nothing to run" quietly.
|
|
17
18
|
|
|
18
19
|
type ScopeMode = 'all' | 'related'
|
|
19
20
|
|
|
@@ -176,7 +177,7 @@ async function resolve_command_scope(request: ScopeRequest): Promise<ChangedFile
|
|
|
176
177
|
// describing a set the caller never handed over.
|
|
177
178
|
function report_unusable_arguments(
|
|
178
179
|
command_arguments: ReadonlyArray<string>,
|
|
179
|
-
scope: ChangedFileScope,
|
|
180
|
+
scope: Pick<ChangedFileScope, 'files'>,
|
|
180
181
|
label: string,
|
|
181
182
|
): void {
|
|
182
183
|
const narrowed = new Set(scope.files)
|
|
@@ -195,6 +196,7 @@ const changed_file_scope = {
|
|
|
195
196
|
UNREADABLE_REASON,
|
|
196
197
|
describe_scope,
|
|
197
198
|
flags_of,
|
|
199
|
+
format_file_list,
|
|
198
200
|
is_flag,
|
|
199
201
|
read_changed_files,
|
|
200
202
|
report_unusable_arguments,
|
|
@@ -24,6 +24,23 @@ async function read_changed_paths(is_staged: boolean): Promise<Array<string>> {
|
|
|
24
24
|
return [...tracked, ...untracked]
|
|
25
25
|
}
|
|
26
26
|
|
|
27
|
-
|
|
27
|
+
// The same reading against any commit rather than the change base — the change since the tree a
|
|
28
|
+
// test-read map was recorded on.
|
|
29
|
+
async function read_changed_since(commit: string): Promise<Array<string>> {
|
|
30
|
+
const tracked = to_paths(await git_command.diff_names_since(commit))
|
|
31
|
+
const untracked = to_paths(await git_command.untracked_names())
|
|
32
|
+
|
|
33
|
+
return [...new Set([...tracked, ...untracked])]
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// The paths among `paths` the tree of `commit` held. An empty list asks git nothing, since
|
|
37
|
+
// `ls-tree` with no path lists the whole tree.
|
|
38
|
+
async function read_held_at(commit: string, paths: ReadonlyArray<string>): Promise<Array<string>> {
|
|
39
|
+
if (paths.length === 0) return []
|
|
40
|
+
|
|
41
|
+
return to_paths(await git_command.tree_names_at(commit, paths))
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
const changed_paths = { read_changed_paths, read_changed_since, read_held_at, to_paths }
|
|
28
45
|
|
|
29
46
|
export { changed_paths }
|
|
@@ -151,18 +151,41 @@ async function change_base_commit(): Promise<string> {
|
|
|
151
151
|
return await git_spawn.read(['rev-parse', await change_base()])
|
|
152
152
|
}
|
|
153
153
|
|
|
154
|
-
|
|
154
|
+
// The working tree against any commit, with the same flags as the branch diff. `josh test:related`
|
|
155
|
+
// reads the change since the commit its test-read map was recorded on, which is not the merge base.
|
|
156
|
+
async function diff_names_since(commit: string): Promise<string> {
|
|
155
157
|
return await git_spawn.read([
|
|
156
158
|
...NO_PATH_QUOTING,
|
|
157
159
|
'diff',
|
|
158
160
|
NAME_ONLY_FLAG,
|
|
159
161
|
NO_RELATIVE_PATHS,
|
|
160
162
|
NO_RENAME_DETECTION,
|
|
161
|
-
|
|
163
|
+
commit,
|
|
164
|
+
'--',
|
|
165
|
+
])
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
// Which of `paths` a commit's tree holds. `josh test:related` asks it of the tree its test-read map
|
|
169
|
+
// was recorded on: a file that tree held and no test read is one no test reads, while a file added
|
|
170
|
+
// since is one the map knows nothing about. **Callers pass at least one path** — with none, `ls-tree`
|
|
171
|
+
// lists the whole tree.
|
|
172
|
+
async function tree_names_at(commit: string, paths: ReadonlyArray<string>): Promise<string> {
|
|
173
|
+
return await git_spawn.read([
|
|
174
|
+
...NO_PATH_QUOTING,
|
|
175
|
+
'ls-tree',
|
|
176
|
+
'-r',
|
|
177
|
+
NAME_ONLY_FLAG,
|
|
178
|
+
'--full-tree',
|
|
179
|
+
commit,
|
|
162
180
|
'--',
|
|
181
|
+
...paths,
|
|
163
182
|
])
|
|
164
183
|
}
|
|
165
184
|
|
|
185
|
+
async function diff_main_names(): Promise<string> {
|
|
186
|
+
return await diff_names_since(await change_base())
|
|
187
|
+
}
|
|
188
|
+
|
|
166
189
|
async function diff_cached_names(): Promise<string> {
|
|
167
190
|
return await git_spawn.read([
|
|
168
191
|
...NO_PATH_QUOTING,
|
|
@@ -224,7 +247,9 @@ const git_diff_reads = {
|
|
|
224
247
|
diff_main,
|
|
225
248
|
diff_main_names,
|
|
226
249
|
diff_main_numstat,
|
|
250
|
+
diff_names_since,
|
|
227
251
|
get_default_branch,
|
|
252
|
+
tree_names_at,
|
|
228
253
|
untracked_names,
|
|
229
254
|
}
|
|
230
255
|
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { get_exit_code } from '#scripts/git/git-execa-error'
|
|
2
|
+
import { git_spawn } from '#scripts/git/git-spawn'
|
|
3
|
+
|
|
4
|
+
// One fixed-string `git grep -n` over a pathspec, read back as `file:line` hits with a short excerpt.
|
|
5
|
+
// `run:prep`'s code locations and `plan:consumers` both search a name this way, so the parse and the
|
|
6
|
+
// no-match-versus-failure reading live here rather than in each.
|
|
7
|
+
|
|
8
|
+
const GREP_LINE = /^(?<path>[^:]+):(?<line>\d+):(?<text>.*)$/u
|
|
9
|
+
const MAX_EXCERPT_LENGTH = 80
|
|
10
|
+
const ELLIPSIS = '…'
|
|
11
|
+
// `git grep` exits 1 for no match; any other exit is a search that never ran.
|
|
12
|
+
const GREP_NO_MATCH_EXIT = 1
|
|
13
|
+
|
|
14
|
+
interface Hit {
|
|
15
|
+
path: string
|
|
16
|
+
line: string
|
|
17
|
+
excerpt: string
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
interface GrepResult {
|
|
21
|
+
hits: ReadonlyArray<Hit>
|
|
22
|
+
has_failed: boolean
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function shorten(text: string): string {
|
|
26
|
+
const trimmed = text.trim()
|
|
27
|
+
|
|
28
|
+
if (trimmed.length <= MAX_EXCERPT_LENGTH) return trimmed
|
|
29
|
+
|
|
30
|
+
return `${trimmed.slice(0, MAX_EXCERPT_LENGTH)}${ELLIPSIS}`
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// `git grep -n` prints `path:line:text`; the text may itself hold colons, so only the first two split.
|
|
34
|
+
function to_hit(output_line: string): Hit | undefined {
|
|
35
|
+
const groups = GREP_LINE.exec(output_line)?.groups
|
|
36
|
+
|
|
37
|
+
if (groups === undefined) return undefined
|
|
38
|
+
|
|
39
|
+
// All three groups are non-optional in `GREP_LINE`, so a match always carries each of them.
|
|
40
|
+
const { path, line, text } = groups as Record<'line' | 'path' | 'text', string>
|
|
41
|
+
|
|
42
|
+
return { path, line, excerpt: shorten(text) }
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function parse(stdout: string): Array<Hit> {
|
|
46
|
+
const hits = stdout.split('\n').map((line) => to_hit(line))
|
|
47
|
+
|
|
48
|
+
return hits.filter((hit): hit is Hit => hit !== undefined)
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// `git grep` exits 1 when nothing matches, which `git_spawn.read` raises. Only that is "no match": a
|
|
52
|
+
// git without `grep -m` (older than 2.38) exits 129, and naming every target absent then would send
|
|
53
|
+
// the reader away from code that is there. `root` searches that checkout rather than the working
|
|
54
|
+
// directory's.
|
|
55
|
+
async function search(
|
|
56
|
+
target: string,
|
|
57
|
+
flags: ReadonlyArray<string>,
|
|
58
|
+
pathspecs: ReadonlyArray<string>,
|
|
59
|
+
root?: string,
|
|
60
|
+
): Promise<GrepResult> {
|
|
61
|
+
const location = root === undefined ? [] : ['-C', root]
|
|
62
|
+
const grep_arguments = [
|
|
63
|
+
...location,
|
|
64
|
+
'grep',
|
|
65
|
+
'-n',
|
|
66
|
+
'-I',
|
|
67
|
+
'-F',
|
|
68
|
+
...flags,
|
|
69
|
+
'-e',
|
|
70
|
+
target,
|
|
71
|
+
'--',
|
|
72
|
+
...pathspecs,
|
|
73
|
+
]
|
|
74
|
+
|
|
75
|
+
try {
|
|
76
|
+
return { hits: parse(await git_spawn.read(grep_arguments)), has_failed: false }
|
|
77
|
+
} catch (error) {
|
|
78
|
+
return { hits: [], has_failed: get_exit_code(error) !== GREP_NO_MATCH_EXIT }
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
const git_grep_hits = { parse, search }
|
|
83
|
+
|
|
84
|
+
export type { GrepResult, Hit }
|
|
85
|
+
export { git_grep_hits }
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
//
|
|
10
10
|
// The list is single-sourced here because it has three consumers that must not drift apart: the
|
|
11
11
|
// probes that clear it, the fixture that clears it, and the unit-suite guard that refuses a write
|
|
12
|
-
// while any of it is set (`
|
|
12
|
+
// while any of it is set (`tools/test/test-repository-guard.ts`).
|
|
13
13
|
//
|
|
14
14
|
// **Only the variables that redirect where git writes are listed.** `GIT_PREFIX`, `GIT_EDITOR` and
|
|
15
15
|
// the `GIT_CONFIG_*` family are exported to hooks too and are deliberately absent: clearing them
|