@joshuafolkken/kit 1.1514.0 → 1.2114.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/agents/investigator.md +1 -1
- package/.claude/agents/reviewer-verification.md +19 -0
- package/.claude/agents/reviewer.md +19 -0
- package/.claude/settings.json +5 -6
- package/.claude/skills/dependency-update/SKILL.md +9 -10
- package/.claude/skills/epic-commands/SKILL.md +26 -65
- package/.claude/skills/epic-commands/epic-bundle.md +3 -1
- package/.claude/skills/workflow-commands/SKILL.md +11 -11
- package/.claude/skills/workflow-commands/background-commands.md +13 -10
- package/.claude/skills/workflow-commands/backlogrun-child.md +12 -8
- package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +7 -25
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +18 -14
- package/.claude/skills/workflow-commands/backlogrun-park.md +18 -24
- package/.claude/skills/workflow-commands/backlogrun-progress.md +4 -5
- package/.claude/skills/workflow-commands/backlogrun-recovery.md +6 -6
- package/.claude/skills/workflow-commands/backlogrun-steps.md +12 -11
- package/.claude/skills/workflow-commands/backlogrun.md +1 -1
- package/.claude/skills/workflow-commands/chain-rule.md +43 -28
- package/.claude/skills/workflow-commands/delegation.md +11 -10
- package/.claude/skills/workflow-commands/entry-sequence.md +10 -10
- package/.claude/skills/workflow-commands/followup.md +16 -36
- package/.claude/skills/workflow-commands/fullrun-steps.md +38 -47
- package/.claude/skills/workflow-commands/fullrun.md +3 -3
- package/.claude/skills/workflow-commands/halfrun.md +17 -25
- package/.claude/skills/workflow-commands/issue-comments.md +25 -16
- package/.claude/skills/workflow-commands/issue-fold-existing.md +2 -1
- package/.claude/skills/workflow-commands/issue-scout.md +2 -2
- package/.claude/skills/workflow-commands/kickoff.md +24 -23
- package/.claude/skills/workflow-commands/latest-gate.md +7 -12
- package/.claude/skills/workflow-commands/needs-human-review.md +9 -14
- package/.claude/skills/workflow-commands/observation-filing.md +4 -36
- package/.claude/skills/workflow-commands/observation-ledger.md +6 -4
- package/.claude/skills/workflow-commands/pre-gate-cut.md +22 -37
- package/.claude/skills/workflow-commands/prerequisite.md +11 -16
- package/.claude/skills/workflow-commands/progress-watcher.md +1 -1
- package/.claude/skills/workflow-commands/prrun.md +3 -7
- package/.claude/skills/workflow-commands/retrospective.md +2 -2
- package/.claude/skills/workflow-commands/split-assessment.md +15 -1
- package/.claude/skills/workflow-commands/working-tree-hold.md +9 -9
- package/.codex/hooks.json +5 -5
- package/.github/actions/setup-node/action.yml +9 -0
- package/.github/actions/setup-pnpm/action.yml +10 -17
- package/.github/dependabot.yml +32 -0
- package/.github/release.yml +0 -2
- package/.github/workflows/auto-tag.yml +45 -0
- package/.github/workflows/ci.yml +267 -17
- package/.github/workflows/dependabot-auto-merge.yml +63 -4
- package/.github/workflows/production.yml +8 -0
- package/.github/workflows/publish.yml +67 -46
- package/.github/workflows/sonar-qube.yml +1 -0
- package/.prettierignore +2 -0
- package/.vscode/settings.json +19 -0
- package/.vscode/tasks.json +1 -2
- package/CLAUDE.md +7 -18
- package/README.md +4 -2
- package/SECURITY.md +3 -3
- package/dist/CLAUDE.md +7 -18
- package/dist/commands/document-read-cli.js +883 -0
- package/dist/commands/{document-section-cli.js → document-section-main.js} +81 -38
- package/dist/commands/read-set-cli.js +1927 -0
- package/dist/commands/run-prep-main.js +21174 -0
- package/dist/commands/run-step-cli.js +27733 -0
- package/dist/config-merge/index.js +5 -1
- package/dist/hooks/audit-provision.js +39 -36
- package/dist/hooks/chunk-3GKE653K.js +6204 -0
- package/dist/hooks/chunk-45CJJOO7.js +1243 -0
- package/dist/hooks/chunk-5PM2JRGV.js +7780 -0
- package/dist/hooks/chunk-7SIUNQXK.js +3591 -0
- package/dist/hooks/chunk-CQD4LJE6.js +4858 -0
- package/dist/hooks/{chunk-723HKZO5.js → chunk-OPSRGWFU.js} +1 -1
- package/dist/hooks/chunk-UJ3FPMMM.js +628 -0
- package/dist/hooks/chunk-VVNYJWEI.js +30 -0
- package/dist/hooks/chunk-Z6DQJKH3.js +2806 -0
- package/dist/hooks/codex-hook-adapter.js +10 -22
- package/dist/hooks/format-edited.js +4 -6
- package/dist/hooks/inputs.json +460 -308
- package/dist/hooks/pretool-guard.js +8 -25
- package/dist/hooks/session-lang.js +135 -299
- package/dist/hooks/stop-guard.js +6496 -1799
- package/dist/josh.js +7412 -4228
- package/dist/self-sync-guard/index.js +74 -10
- package/dist/version/index.js +276 -407
- package/eslint/base.js +1 -1
- package/eslint/rules/comment-why-only.js +108 -0
- package/lefthook/base.yml +3 -1
- package/package.json +23 -54
- package/pnpm-workspace.yaml +4 -2
- package/prompts/coding-standards.md +2 -2
- package/prompts/collaboration-workflow/file-edits.md +14 -17
- package/prompts/collaboration-workflow/issue-citation.md +0 -4
- package/prompts/collaboration-workflow/issue-template.md +54 -18
- package/prompts/collaboration-workflow/lane-instructions.md +3 -2
- package/prompts/collaboration-workflow/measurement.md +44 -0
- package/prompts/collaboration-workflow/operating-rules.md +15 -8
- package/prompts/collaboration-workflow/output-bounds.md +6 -7
- package/prompts/collaboration-workflow/plan-comment.md +3 -42
- package/prompts/collaboration-workflow/principles.md +14 -0
- package/prompts/collaboration-workflow/report-format.md +31 -60
- package/prompts/collaboration-workflow/residency.md +3 -2
- package/prompts/collaboration-workflow/rule-delivery.md +13 -1
- package/prompts/collaboration-workflow/shell-body.md +6 -16
- package/prompts/collaboration-workflow/turn-batching.md +0 -2
- package/prompts/collaboration-workflow/upstream-interrupt.md +15 -5
- package/prompts/collaboration-workflow/wip-cap.md +4 -2
- package/prompts/collaboration-workflow.md +3 -7
- package/prompts/refactoring.md +1 -1
- package/prompts/review-rubric.md +9 -2
- package/prompts/review.md +65 -36
- package/prompts/testing-guide.md +9 -43
- package/scripts/agent/agent-argv.ts +14 -16
- package/scripts/agent/agent-event.ts +15 -15
- package/scripts/agent/agent-exit-record.ts +13 -1
- package/scripts/agent/agent-provider.ts +138 -0
- package/scripts/agent/agent-role-profile.ts +108 -156
- package/scripts/agent/agent-safe-text.ts +20 -5
- package/scripts/agent/api-auth.ts +41 -0
- package/scripts/agent/api-outage.ts +1 -1
- package/scripts/agent/api-usage-limit.ts +65 -0
- package/scripts/agent/claude-agent-argv.ts +19 -9
- package/scripts/agent/codex-agent-argv.ts +118 -22
- package/scripts/agent/usage-limit-reset.ts +179 -0
- package/scripts/auth/claude-token-output.ts +2 -2
- package/scripts/auto-ok/auto-ok-author.ts +53 -0
- package/scripts/auto-ok/auto-ok-cli.ts +25 -16
- package/scripts/auto-ok/auto-ok-judge-read.ts +12 -3
- package/scripts/auto-ok/auto-ok-judge-write.ts +46 -19
- package/scripts/auto-ok/auto-ok-judge.ts +13 -2
- package/scripts/auto-ok/auto-ok-main.ts +17 -0
- package/scripts/backlog/backlog-arrival.ts +14 -3
- package/scripts/backlog/backlog-budget-cli.ts +7 -33
- package/scripts/backlog/backlog-budget-main.ts +16 -0
- package/scripts/backlog/backlog-budget.ts +2 -3
- package/scripts/backlog/backlog-defect-priority.ts +5 -4
- package/scripts/backlog/backlog-drive-adopt.ts +67 -0
- package/scripts/backlog/backlog-drive-args.ts +4 -5
- package/scripts/backlog/backlog-drive-cli.ts +118 -28
- package/scripts/backlog/backlog-drive-hold.ts +162 -0
- package/scripts/backlog/backlog-drive-idle.ts +161 -0
- package/scripts/backlog/backlog-drive-judge.ts +25 -0
- package/scripts/backlog/backlog-drive-launch-pass.ts +90 -0
- package/scripts/backlog/backlog-drive-launch.ts +8 -2
- package/scripts/backlog/backlog-drive-memory.ts +126 -0
- package/scripts/backlog/backlog-drive-named-offer.ts +73 -35
- package/scripts/backlog/backlog-drive-named.ts +81 -13
- package/scripts/backlog/backlog-drive-offer-argv.ts +3 -8
- package/scripts/backlog/backlog-drive-paused.ts +170 -0
- package/scripts/backlog/backlog-drive-restore.ts +39 -8
- package/scripts/backlog/backlog-drive-seats.ts +18 -8
- package/scripts/backlog/backlog-drive-token-handling.ts +38 -0
- package/scripts/backlog/backlog-drive.ts +96 -131
- package/scripts/backlog/backlog-gate-scope.ts +61 -0
- package/scripts/backlog/backlog-measure-close.ts +112 -0
- package/scripts/backlog/backlog-next-main.ts +16 -0
- package/scripts/backlog/backlog-next-shared.ts +73 -0
- package/scripts/backlog/backlog-next.ts +78 -56
- package/scripts/backlog/backlog-occupied.ts +52 -39
- package/scripts/backlog/backlog-offer-cli.ts +6 -21
- package/scripts/backlog/backlog-offer-exclude.ts +15 -0
- package/scripts/backlog/backlog-offer-main.ts +12 -0
- package/scripts/backlog/backlog-offer.ts +36 -3
- package/scripts/backlog/backlog-overlap.ts +62 -10
- package/scripts/backlog/backlog-plan-cli.ts +4 -1
- package/scripts/backlog/backlog-plan-comment.ts +81 -0
- package/scripts/backlog/backlog-plan-read.ts +22 -5
- package/scripts/backlog/backlog-plan.ts +18 -4
- package/scripts/backlog/backlog-pool.ts +60 -22
- package/scripts/backlog/backlog-rank.ts +70 -15
- package/scripts/backlog/backlog-ready.ts +112 -30
- package/scripts/backlog/backlog-stalled-detect.ts +110 -36
- package/scripts/backlog/backlog-stalled.ts +52 -16
- package/scripts/backlog/backlog-wait-cause.ts +86 -0
- package/scripts/backlog/backlog-waves.ts +56 -15
- package/scripts/backlog/backlogrun-args.ts +19 -7
- package/scripts/backlog/backlogrun-cli.ts +19 -5
- package/scripts/backlog/backlogrun-launch.ts +13 -4
- package/scripts/backlog/backlogrun-restart.ts +97 -0
- package/scripts/backlog/backlogrun-stop.ts +79 -7
- package/scripts/behavior/behavior-cli.ts +2 -2
- package/scripts/behavior/behavior-rules.ts +47 -24
- package/scripts/build/build-bin.ts +2 -16
- package/scripts/build/build-claude-md.ts +0 -7
- package/scripts/build/build-commands.ts +0 -13
- package/scripts/build/build-hooks.ts +49 -48
- package/scripts/build/hook-bundle-stamp.ts +29 -11
- package/scripts/build/local-bin.ts +1 -1
- package/scripts/cases/cases-cli.ts +25 -13
- package/scripts/cases/cases-interaction-scan.ts +134 -0
- package/scripts/cases/cases-interaction.ts +183 -0
- package/scripts/cases/cases-logic.ts +39 -6
- package/scripts/ci/pr-classification-main.ts +18 -0
- package/scripts/ci/pr-classification.ts +10 -17
- package/scripts/clone/clone-scan.ts +1 -1
- package/scripts/cost-runtime/context-cut-payback.ts +27 -25
- package/scripts/cost-runtime/cost-blocks.ts +22 -37
- package/scripts/cost-runtime/cost-cli.ts +67 -29
- package/scripts/cost-runtime/cost-main.ts +12 -0
- package/scripts/cost-runtime/cost-pricing.ts +9 -0
- package/scripts/cost-runtime/cost-transcript.ts +1 -0
- package/scripts/cost-runtime/cost-verdict.ts +4 -1
- package/scripts/delegation/delegation-policy.ts +18 -5
- package/scripts/delegation/duplicate-read-guard.ts +1 -8
- package/scripts/delegation/investigation-guard.ts +12 -8
- package/scripts/delegation/investigation-reads.ts +48 -27
- package/scripts/dependabot/dependabot-cooldown.ts +195 -0
- package/scripts/discovery/repo-discovery.ts +24 -6
- package/scripts/discovery/repo-party.ts +80 -20
- package/scripts/discovery/session-owner-pin.ts +51 -0
- package/scripts/doctor/doctor-consumer.ts +2 -5
- package/scripts/document/capped-print.ts +1 -1
- package/scripts/document/command-reference-line-budget.ts +42 -0
- package/scripts/document/document-byte-budget.ts +18 -6
- package/scripts/document/document-checks.ts +20 -0
- package/scripts/document/document-ratchet-check.ts +101 -0
- package/scripts/document/document-scan.ts +1 -1
- package/scripts/document/document-section-cli.ts +0 -8
- package/scripts/document/document-section-main.ts +12 -0
- package/scripts/document/document-section.ts +1 -0
- package/scripts/document/entry-read-budget.ts +7 -3
- package/scripts/document/issue-citation-budget.ts +94 -0
- package/scripts/epic/epic-audit-cli.ts +12 -6
- package/scripts/epic/epic-bundle-apply.ts +137 -0
- package/scripts/epic/epic-bundle-cli.ts +32 -121
- package/scripts/epic/epic-bundle-format.ts +116 -0
- package/scripts/epic/epic-bundle-main.ts +17 -0
- package/scripts/epic/epic-busy.ts +5 -12
- package/scripts/epic/epic-classify.ts +24 -15
- package/scripts/epic/epic-cli-argv.ts +33 -2
- package/scripts/epic/epic-cli-decide.ts +42 -0
- package/scripts/epic/epic-cli.ts +6 -38
- package/scripts/epic/epic-close.ts +112 -55
- package/scripts/epic/epic-cross-repo.ts +4 -7
- package/scripts/epic/epic-decide.ts +119 -0
- package/scripts/epic/epic-decision.ts +9 -0
- package/scripts/epic/epic-fetch.ts +6 -0
- package/scripts/epic/epic-graph.ts +8 -1
- package/scripts/epic/epic-issue.ts +8 -2
- package/scripts/epic/epic-label-age.ts +1 -1
- package/scripts/epic/epic-lane-offer.ts +39 -4
- package/scripts/epic/epic-next-main.ts +24 -0
- package/scripts/epic/epic-next.ts +6 -24
- package/scripts/epic/epic-outside-blocker.ts +6 -2
- package/scripts/epic/epic-parse.ts +9 -3
- package/scripts/epic/epic-rank.ts +5 -0
- package/scripts/epic/epic-read.ts +1 -0
- package/scripts/epic/epic-reconcile.ts +39 -0
- package/scripts/epic/epic-run.ts +10 -1
- package/scripts/epic/epic-solo.ts +50 -14
- package/scripts/epic/epic.ts +41 -7
- package/scripts/exports/unused-members-check.ts +62 -0
- package/scripts/exports/unused-members-cli.ts +6 -51
- package/scripts/followup/followup-checks-event.ts +8 -3
- package/scripts/followup/followup-ci-path.ts +67 -0
- package/scripts/followup/followup-coderabbit-retrigger.ts +261 -0
- package/scripts/followup/followup-coderabbit-wait.ts +85 -0
- package/scripts/followup/followup-failed-tests.ts +160 -0
- package/scripts/followup/followup-job-needs.ts +100 -0
- package/scripts/followup/followup-job-rerun.ts +303 -0
- package/scripts/followup/followup-main-move.ts +113 -0
- package/scripts/followup/followup-review-gates.ts +81 -0
- package/scripts/followup/git-followup-finish.ts +43 -11
- package/scripts/followup/git-followup-pending.ts +3 -3
- package/scripts/followup/git-followup-stages.ts +52 -12
- package/scripts/followup/git-followup-workflow.ts +19 -66
- package/scripts/followup/git-pr-followup-checks.ts +55 -16
- package/scripts/followup/git-pr-followup-wrapup.ts +32 -18
- package/scripts/followup/git-pr-followup.ts +96 -33
- package/scripts/fresh-machine/fresh-machine-cli.ts +1 -1
- package/scripts/fresh-machine/fresh-machine-run.ts +8 -8
- package/scripts/fresh-machine/fresh-machine-script.ts +5 -9
- package/scripts/fresh-machine/specs/kit-test-backlogrun-python.json +2 -2
- package/scripts/fresh-machine/specs/kit-test-backlogrun.json +3 -3
- package/scripts/gate/busy-average.ts +90 -0
- package/scripts/gate/check-cpu.ts +60 -0
- package/scripts/gate/check-inputs.ts +39 -95
- package/scripts/gate/check-related-pinned.ts +43 -0
- package/scripts/gate/check-related-reuse.ts +64 -0
- package/scripts/gate/check-related-section.ts +57 -0
- package/scripts/gate/check-related-unplanned.ts +34 -0
- package/scripts/gate/check-related.ts +265 -0
- package/scripts/gate/check-reuse.ts +33 -54
- package/scripts/gate/command-memory.ts +192 -0
- package/scripts/gate/core-admission.ts +236 -28
- package/scripts/gate/core-budget-timing.ts +51 -0
- package/scripts/gate/core-budget.ts +111 -100
- package/scripts/gate/core-wait-record.ts +49 -0
- package/scripts/gate/core-wait.ts +62 -7
- package/scripts/gate/core-weights.ts +94 -0
- package/scripts/gate/free-cores.ts +27 -4
- package/scripts/gate/gate-labels.ts +46 -0
- package/scripts/gate/gate-ledger.ts +44 -8
- package/scripts/gate/gate-plan.ts +130 -78
- package/scripts/gate/gate-report.ts +23 -9
- package/scripts/gate/gate-run-steps.ts +77 -9
- package/scripts/gate/gate-skip.ts +57 -8
- package/scripts/gate/gate-static-group.ts +60 -0
- package/scripts/gate/gate-steps.ts +14 -2
- package/scripts/gate/gate-tree.ts +4 -2
- package/scripts/gate/hook-gate-reuse.ts +19 -2
- package/scripts/gate/input-fingerprint.ts +42 -0
- package/scripts/gate/machine-capacity.ts +65 -31
- package/scripts/gate/metrics-totals.ts +59 -0
- package/scripts/gate/moved-paths.ts +67 -0
- package/scripts/gate/project-checks.ts +5 -12
- package/scripts/gate/scoped-green.ts +76 -19
- package/scripts/gate/since-green.ts +70 -0
- package/scripts/gate/structural-checks.ts +96 -0
- package/scripts/gate/toolchain-inputs.ts +115 -0
- package/scripts/gate/verification-gate.ts +70 -32
- package/scripts/gate/verification-inputs.ts +265 -0
- package/scripts/gate/verification-tail.ts +52 -0
- package/scripts/gh/gh-author-association.ts +117 -9
- package/scripts/gh/git-ai-review-scan.ts +5 -3
- package/scripts/gh/git-gh-api-path.ts +26 -2
- package/scripts/gh/git-gh-branch-rules.ts +73 -0
- package/scripts/gh/git-gh-comments-unreadable.ts +36 -0
- package/scripts/gh/git-gh-conditional.ts +5 -2
- package/scripts/gh/git-gh-exec.ts +32 -2
- package/scripts/gh/git-gh-issue-read.ts +7 -1
- package/scripts/gh/git-gh-issue-rest.ts +1 -0
- package/scripts/gh/git-gh-issue-write.ts +75 -31
- package/scripts/gh/git-gh-issue.ts +19 -8
- package/scripts/gh/git-gh-poll-read.ts +89 -0
- package/scripts/gh/git-gh-pr-auto-merge.ts +21 -9
- package/scripts/gh/git-gh-pr-graphql-state.ts +56 -0
- package/scripts/gh/git-gh-pr-read.ts +74 -13
- package/scripts/gh/git-gh-pr-rest.ts +4 -2
- package/scripts/gh/git-gh-pr-snapshot.ts +48 -20
- package/scripts/gh/git-gh-pr-too-large.ts +20 -0
- package/scripts/gh/git-gh-pr.ts +48 -22
- package/scripts/gh/git-gh-retry.ts +141 -0
- package/scripts/gh/git-pr-ai-review.ts +15 -6
- package/scripts/gh/git-pr-checks-eval.ts +42 -7
- package/scripts/gh/git-pr-checks-parse.ts +39 -9
- package/scripts/gh/git-pr-checks.ts +5 -5
- package/scripts/gh/git-pr-merge-checked.ts +80 -0
- package/scripts/git/base-tree.ts +49 -2
- package/scripts/git/change-base.ts +4 -10
- package/scripts/git/changed-file-scope.ts +6 -4
- package/scripts/git/changed-paths-sync.ts +63 -0
- package/scripts/git/changed-paths.ts +34 -2
- package/scripts/git/git-common-directory.ts +11 -1
- package/scripts/git/git-diff-reads.ts +91 -20
- package/scripts/git/git-error.ts +9 -2
- package/scripts/git/git-grep-hits.ts +85 -0
- package/scripts/git/git-location-environment.ts +1 -1
- package/scripts/git/git-merge-conflicts.ts +83 -0
- package/scripts/git/git-preflight.ts +37 -12
- package/scripts/git/git-push-transport.ts +1 -2
- package/scripts/git/git-schemas.ts +30 -7
- package/scripts/git/git-spawn.ts +1 -2
- package/scripts/git/git-status.ts +4 -4
- package/scripts/git/git-worktree.ts +13 -0
- package/scripts/git/gone-branch.ts +4 -1
- package/scripts/git/main-merge-budget-conflict.ts +89 -0
- package/scripts/git/main-merge-guard.ts +55 -18
- package/scripts/git/main-merge-main.ts +12 -0
- package/scripts/git/main-merge-regenerate.ts +59 -25
- package/scripts/git/main-merge.ts +77 -13
- package/scripts/git/main-sync-main.ts +12 -0
- package/scripts/git/main-sync.ts +0 -9
- package/scripts/git/no-base-checkout.ts +127 -0
- package/scripts/git/stash/git-stash.ts +38 -6
- package/scripts/git/stash/{stash-pop-args.ts → stash-args.ts} +13 -10
- package/scripts/git/stash/stash-pop-cli.ts +6 -12
- package/scripts/git/stash/stash-pop-main.ts +12 -0
- package/scripts/git/stash/stash-push-cli.ts +86 -0
- package/scripts/git/stash/stash-push-main.ts +12 -0
- package/scripts/hooks/batch-guard.ts +38 -27
- package/scripts/hooks/check-commit-message-main.ts +8 -0
- package/scripts/hooks/check-commit-message.ts +4 -7
- package/scripts/hooks/edited-cspell.ts +37 -11
- package/scripts/hooks/format-edited-file.ts +29 -25
- package/scripts/hooks/lane-plan-guard.ts +50 -0
- package/scripts/hooks/pre-commit-lint-switch.ts +9 -0
- package/scripts/hooks/pre-commit-lint.ts +44 -4
- package/scripts/hooks/pre-push-related-switch.ts +10 -0
- package/scripts/hooks/pre-push-unit.ts +77 -9
- package/scripts/hooks/pretool-guard-cli.ts +1 -8
- package/scripts/hooks/pretool-guard.ts +34 -19
- package/scripts/hooks/reserved-run.ts +81 -10
- package/scripts/hooks/run-hook.sh +30 -6
- package/scripts/hooks/shell-rules-notice.ts +37 -0
- package/scripts/hooks/step-zero-notice.ts +6 -1
- package/scripts/hooks/stop-actions.ts +5 -36
- package/scripts/hooks/stop-guard.ts +20 -15
- package/scripts/init/distributed-paths.ts +1 -0
- package/scripts/init/hook-command-rewrite.ts +23 -5
- package/scripts/init/hook-launch.ts +17 -17
- package/scripts/init/init-actions.ts +0 -6
- package/scripts/init/init-ai-copy.ts +10 -36
- package/scripts/init/init-bootstrap.ts +9 -8
- package/scripts/init/init-dry-run-report.ts +1 -1
- package/scripts/init/init-dry-run.ts +1 -1
- package/scripts/init/init-file-action.ts +7 -9
- package/scripts/init/init-logic-json-merge.ts +2 -2
- package/scripts/init/init-logic-migrate.ts +9 -82
- package/scripts/init/init-logic.ts +3 -2
- package/scripts/init/init-main.ts +12 -0
- package/scripts/init/init.ts +5 -12
- package/scripts/init/kit-development-versions.ts +3 -7
- package/scripts/init/kit-written-paths.ts +2 -2
- package/scripts/init/project-profile.ts +5 -4
- package/scripts/init/tsconfig-preset-migration.ts +2 -1
- package/scripts/init/vscode-tasks.ts +1 -1
- package/scripts/issue/aggregation-split.ts +52 -0
- package/scripts/issue/defect-origin-cli.ts +106 -0
- package/scripts/issue/defect-origin-line.ts +78 -0
- package/scripts/issue/defect-origin-main.ts +11 -0
- package/scripts/issue/defect-origin.ts +114 -0
- package/scripts/issue/defect-rate-cli.ts +38 -179
- package/scripts/issue/defect-rate.ts +0 -16
- package/scripts/issue/defect-report-cli.ts +128 -0
- package/scripts/issue/defect-report-format.ts +56 -0
- package/scripts/issue/defect-report-main.ts +11 -0
- package/scripts/issue/defect-report.ts +160 -0
- package/scripts/issue/effect-audit-cli.ts +178 -0
- package/scripts/issue/effect-audit.ts +185 -0
- package/scripts/issue/expected-effect-lint.ts +65 -9
- package/scripts/issue/git-next-issues.ts +5 -0
- package/scripts/issue/issue-already-done-cli.ts +62 -0
- package/scripts/issue/issue-body-or-comment.ts +74 -0
- package/scripts/issue/issue-cite-cli.ts +1 -12
- package/scripts/issue/issue-cite-main.ts +12 -0
- package/scripts/issue/issue-classification.ts +13 -7
- package/scripts/issue/issue-closing-pr.ts +8 -1
- package/scripts/issue/issue-comment-cli.ts +10 -24
- package/scripts/issue/issue-comment-main.ts +12 -0
- package/scripts/issue/issue-evidence-exit.ts +102 -0
- package/scripts/issue/issue-file-cap.ts +58 -0
- package/scripts/issue/issue-file-cli.ts +131 -36
- package/scripts/issue/issue-file-deferral.ts +52 -0
- package/scripts/issue/issue-file-fold.ts +29 -10
- package/scripts/issue/issue-file-interrupt.ts +85 -0
- package/scripts/issue/issue-file-lane-hint.ts +30 -0
- package/scripts/issue/issue-file.ts +56 -19
- package/scripts/issue/issue-fold-cli.ts +2 -11
- package/scripts/issue/issue-fold-main.ts +12 -0
- package/scripts/issue/issue-labels.ts +97 -89
- package/scripts/issue/issue-lint-cli.ts +29 -12
- package/scripts/issue/issue-lint-main.ts +12 -0
- package/scripts/issue/issue-measured-cli.ts +34 -0
- package/scripts/issue/issue-measured-close.ts +58 -0
- package/scripts/issue/issue-merged.ts +19 -2
- package/scripts/issue/issue-not-before-label.ts +135 -0
- package/scripts/issue/issue-not-before.ts +114 -0
- package/scripts/issue/issue-number-shape.ts +15 -1
- package/scripts/issue/issue-park.ts +28 -0
- package/scripts/issue/issue-plan-cli.ts +151 -0
- package/scripts/issue/issue-priority-cli.ts +60 -0
- package/scripts/issue/issue-priority-raise.ts +55 -0
- package/scripts/issue/issue-priority.ts +282 -0
- package/scripts/issue/issue-rank.ts +27 -4
- package/scripts/issue/issue-read-cli.ts +35 -16
- package/scripts/issue/issue-read-main.ts +12 -0
- package/scripts/issue/issue-read.ts +62 -13
- package/scripts/issue/issue-release-cli.ts +0 -10
- package/scripts/issue/issue-release-main.ts +13 -0
- package/scripts/issue/issue-release.ts +7 -12
- package/scripts/issue/issue-sample-gate.ts +213 -0
- package/scripts/issue/issue-sample-prime.ts +127 -0
- package/scripts/issue/issue-sample-required.ts +57 -0
- package/scripts/issue/issue-sample-source.ts +77 -0
- package/scripts/issue/issue-scout-cli.ts +0 -11
- package/scripts/issue/issue-scout-main.ts +14 -0
- package/scripts/issue/issue-search.ts +124 -0
- package/scripts/issue/issue-state-cli.ts +0 -10
- package/scripts/issue/issue-state-main.ts +12 -0
- package/scripts/issue/issue-state.ts +13 -1
- package/scripts/issue/issue-template-section.ts +43 -0
- package/scripts/issue/issue-watch-diff.ts +87 -16
- package/scripts/issue/issue-watch-hook.ts +11 -2
- package/scripts/issue/issue-watch.ts +55 -11
- package/scripts/issue/issue-wip.ts +2 -7
- package/scripts/issue/markdown-section.ts +1 -0
- package/scripts/issue/measure-declaration.ts +121 -0
- package/scripts/issue/measure-rerun-cli.ts +7 -65
- package/scripts/issue/plan-consumers-cli.ts +39 -0
- package/scripts/issue/plan-consumers-main.ts +11 -0
- package/scripts/issue/plan-consumers-section.ts +76 -0
- package/scripts/issue/plan-consumers.ts +127 -0
- package/scripts/issue/reproduction-measure.ts +3 -1
- package/scripts/issue/size-estimate.ts +90 -0
- package/scripts/issue/trusted-measure.ts +84 -0
- package/scripts/josh/agent-session-environment.ts +1 -1
- package/scripts/josh/command-usage.ts +17 -44
- package/scripts/josh/durable-state-migrate.ts +105 -0
- package/scripts/josh/durable-state.ts +112 -0
- package/scripts/josh/file-map-stamp.ts +49 -16
- package/scripts/josh/hook-decision.ts +32 -20
- package/scripts/josh/josh-aliases.ts +95 -0
- package/scripts/josh/josh-command-map.ts +1 -79
- package/scripts/josh/josh-command-types.ts +12 -6
- package/scripts/josh/josh-commands-agent-hooks.ts +83 -0
- package/scripts/josh/josh-commands-ai.ts +160 -161
- package/scripts/josh/josh-commands-backlog.ts +82 -16
- package/scripts/josh/josh-commands-clone.ts +1 -0
- package/scripts/josh/josh-commands-development.ts +142 -101
- package/scripts/josh/josh-commands-document.ts +43 -1
- package/scripts/josh/josh-commands-epic.ts +171 -0
- package/scripts/josh/josh-commands-hooks.ts +25 -2
- package/scripts/josh/josh-commands-issue-write.ts +200 -0
- package/scripts/josh/josh-commands-issue.ts +156 -24
- package/scripts/josh/josh-commands-lane.ts +187 -3
- package/scripts/josh/josh-commands-lint.ts +34 -10
- package/scripts/josh/josh-commands-maintenance.ts +127 -4
- package/scripts/josh/josh-commands-pause.ts +29 -0
- package/scripts/josh/josh-commands-progress.ts +87 -0
- package/scripts/josh/josh-commands-project.ts +138 -9
- package/scripts/josh/josh-commands-review.ts +159 -0
- package/scripts/josh/josh-commands-run.ts +211 -23
- package/scripts/josh/josh-commands-ship.ts +217 -0
- package/scripts/josh/josh-commands-split.ts +9 -0
- package/scripts/josh/josh-commands-test-check.ts +80 -0
- package/scripts/josh/josh-commands-versioning.ts +49 -2
- package/scripts/josh/josh-commands-workflow.ts +144 -6
- package/scripts/josh/josh-environment-file.ts +43 -3
- package/scripts/josh/josh-in-process.ts +2 -2
- package/scripts/josh/josh-logic.ts +11 -16
- package/scripts/josh/josh-run.ts +19 -1
- package/scripts/josh/package-directory.ts +2 -4
- package/scripts/josh/process-identity.ts +13 -4
- package/scripts/josh/run-record-path.ts +15 -0
- package/scripts/josh/session-language-cli.ts +4 -8
- package/scripts/josh/session-language-main.ts +13 -0
- package/scripts/josh/session-language.ts +6 -1
- package/scripts/josh/shared-cache.ts +90 -0
- package/scripts/josh/stamp-file.ts +20 -17
- package/scripts/lane/lane-adopt-cli.ts +98 -0
- package/scripts/lane/lane-adopt.ts +208 -0
- package/scripts/lane/lane-await.ts +56 -20
- package/scripts/lane/lane-baseline.ts +123 -0
- package/scripts/lane/lane-breakdown-cli.ts +64 -0
- package/scripts/lane/lane-breakdown-implement.ts +170 -0
- package/scripts/lane/lane-breakdown-laps.ts +107 -0
- package/scripts/lane/lane-breakdown-pinned.ts +76 -0
- package/scripts/lane/lane-breakdown-text.ts +145 -0
- package/scripts/lane/lane-breakdown.ts +239 -0
- package/scripts/lane/lane-cache.ts +5 -30
- package/scripts/lane/lane-capacity.ts +14 -23
- package/scripts/lane/lane-check-stats.ts +84 -22
- package/scripts/lane/lane-child-invocation.ts +17 -2
- package/scripts/lane/lane-child-mark-keys.ts +12 -0
- package/scripts/lane/lane-child-marker.ts +20 -1
- package/scripts/lane/lane-ci-path-stats.ts +73 -0
- package/scripts/lane/lane-claim-stats.ts +84 -0
- package/scripts/lane/lane-cli.ts +15 -5
- package/scripts/lane/lane-close.ts +91 -18
- package/scripts/lane/lane-core-wait-stats.ts +66 -0
- package/scripts/lane/lane-dispatch-log.ts +3 -3
- package/scripts/lane/lane-dispatch.ts +26 -5
- package/scripts/lane/lane-gap-stats.ts +157 -0
- package/scripts/lane/lane-guard-policy.ts +7 -1
- package/scripts/lane/lane-handoff.ts +69 -1
- package/scripts/lane/lane-held-stats.ts +129 -0
- package/scripts/lane/lane-implement-stats.ts +207 -0
- package/scripts/lane/lane-implement-subagents.ts +90 -0
- package/scripts/lane/lane-install.ts +4 -11
- package/scripts/lane/lane-investigation-switch.ts +16 -0
- package/scripts/lane/lane-launch-cli.ts +0 -9
- package/scripts/lane/lane-launch-main.ts +12 -0
- package/scripts/lane/lane-ledger-kind.ts +31 -0
- package/scripts/lane/lane-ledger-schema-ship.ts +49 -0
- package/scripts/lane/lane-ledger-schema.ts +349 -0
- package/scripts/lane/lane-ledger-write.ts +257 -0
- package/scripts/lane/lane-ledger.ts +56 -233
- package/scripts/lane/lane-limit-cli.ts +12 -1
- package/scripts/lane/lane-load.ts +1 -1
- package/scripts/lane/lane-measure-cli.ts +193 -30
- package/scripts/lane/lane-net-read.ts +44 -0
- package/scripts/lane/lane-net-time.ts +212 -0
- package/scripts/lane/lane-open.ts +25 -8
- package/scripts/lane/lane-output.ts +2 -4
- package/scripts/lane/lane-overrun-prompt.ts +147 -0
- package/scripts/lane/lane-overrun.ts +274 -0
- package/scripts/lane/lane-parked.ts +3 -3
- package/scripts/lane/lane-paths.ts +24 -1
- package/scripts/lane/lane-pause-cli.ts +133 -0
- package/scripts/lane/lane-pause.ts +158 -0
- package/scripts/lane/lane-paused-spans.ts +97 -0
- package/scripts/lane/lane-plan-check.ts +207 -0
- package/scripts/lane/lane-plan-cli.ts +41 -0
- package/scripts/lane/lane-plan.ts +144 -0
- package/scripts/lane/lane-process-table.ts +166 -0
- package/scripts/lane/lane-reap-settle.ts +124 -0
- package/scripts/lane/lane-reap.ts +50 -15
- package/scripts/lane/lane-registry.ts +38 -4
- package/scripts/lane/lane-relaunch.ts +1 -1
- package/scripts/lane/lane-residents.ts +162 -0
- package/scripts/lane/lane-restart.ts +22 -2
- package/scripts/lane/lane-round-one-stats.ts +51 -0
- package/scripts/lane/lane-round-two-stats.ts +49 -0
- package/scripts/lane/lane-sampler.ts +26 -3
- package/scripts/lane/lane-session-action.ts +112 -23
- package/scripts/lane/lane-session-broker.ts +146 -37
- package/scripts/lane/lane-session-reread-main.ts +14 -0
- package/scripts/lane/lane-session-reread.ts +51 -0
- package/scripts/lane/lane-ship-lap-stats.ts +74 -0
- package/scripts/lane/lane-sleep.ts +58 -0
- package/scripts/lane/lane-snapshot-trace.ts +84 -0
- package/scripts/lane/lane-spans.ts +51 -0
- package/scripts/lane/lane-spent.ts +7 -4
- package/scripts/lane/lane-split-stats.ts +28 -0
- package/scripts/lane/lane-stage-stats.ts +20 -3
- package/scripts/lane/lane-state.ts +334 -0
- package/scripts/lane/lane-stats-tables.ts +58 -0
- package/scripts/lane/lane-stats.ts +74 -4
- package/scripts/lane/lane-stop-stats.ts +145 -37
- package/scripts/lane/lane-tail-stats.ts +32 -0
- package/scripts/lane/lane-test-related-stats.ts +127 -0
- package/scripts/lane/lane-transcript-calls.ts +202 -0
- package/scripts/lane/lane-transcript-stats.ts +200 -0
- package/scripts/lane/lane-vacant.ts +13 -3
- package/scripts/lane/lane-value-cell.ts +72 -0
- package/scripts/lane/lane-value.ts +118 -0
- package/scripts/lane/lane-withdraw-cli.ts +5 -4
- package/scripts/lane/lane-withdraw-closed.ts +124 -0
- package/scripts/lane/lane-withdraw.ts +149 -71
- package/scripts/lane/lane-yield.ts +85 -0
- package/scripts/lane/openai-lane-ship.ts +12 -11
- package/scripts/lane/openai-lane-supervisor-decision.ts +6 -8
- package/scripts/lane/openai-lane-supervisor-owner.ts +5 -8
- package/scripts/lane/openai-lane-supervisor.ts +5 -4
- package/scripts/lane/process-directories.ts +70 -0
- package/scripts/lane/process-lane-marks.ts +94 -0
- package/scripts/lib/atomic-write.ts +62 -0
- package/scripts/lib/buffered-process.ts +12 -5
- package/scripts/lib/cli-flags.ts +53 -0
- package/scripts/lib/figure-format.ts +63 -0
- package/scripts/lib/json-value.ts +9 -1
- package/scripts/lib/package-manifest.ts +35 -0
- package/scripts/lib/poll.ts +38 -9
- package/scripts/lib/read-file.ts +3 -1
- package/scripts/lib/settled-together.ts +10 -0
- package/scripts/lib/shell-quote.ts +21 -0
- package/scripts/lib/stamped-memo.ts +63 -0
- package/scripts/lib/stdout-on-stderr.ts +24 -0
- package/scripts/lib/timeouts.ts +9 -0
- package/scripts/lib/token-shape.ts +111 -0
- package/scripts/lib/transcript-record.ts +91 -0
- package/scripts/lines/effective-limit.ts +1 -1
- package/scripts/lint/eslint-cache-dependencies.ts +145 -0
- package/scripts/lint/eslint-daemon-sources.ts +79 -0
- package/scripts/lint/eslint-daemon.ts +304 -0
- package/scripts/lint/eslint-warm-cli.ts +7 -0
- package/scripts/lint/eslint-warm.ts +66 -0
- package/scripts/lint/format.ts +11 -2
- package/scripts/lint/import-graph.ts +409 -0
- package/scripts/lint/lint-gate-scope.ts +102 -0
- package/scripts/lint/lint-parallel-main.ts +19 -0
- package/scripts/lint/lint-parallel.ts +113 -33
- package/scripts/lint/lint-related-scope.ts +30 -24
- package/scripts/lint/lint-related.ts +183 -30
- package/scripts/lint/rename-cli.ts +179 -0
- package/scripts/lint/rename-identifier.ts +192 -0
- package/scripts/lint/type-only-imports.ts +58 -0
- package/scripts/notify/confirmation-options.ts +1 -2
- package/scripts/notify/telegram-notify.ts +32 -23
- package/scripts/notify/telegram-test-logic.ts +0 -1
- package/scripts/notify/telegram-test-main.ts +8 -0
- package/scripts/notify/telegram-test.ts +2 -6
- package/scripts/observations/observation-ledger.ts +13 -0
- package/scripts/observations/observation-record.ts +42 -16
- package/scripts/observations/observations-flush-landing.ts +5 -3
- package/scripts/observations/observations-flush.ts +38 -10
- package/scripts/overrides/overrides-check.ts +11 -6
- package/scripts/overrides/overrides-files.ts +2 -1
- package/scripts/overrides/overrides-logic.ts +3 -6
- package/scripts/package/verify-optional-eslint-install.ts +8 -6
- package/scripts/propagate/propagate-publish.ts +2 -7
- package/scripts/propagate/propagate-targets.ts +4 -12
- package/scripts/refactor/import-graph.ts +9 -7
- package/scripts/release/github-release-runs.ts +17 -6
- package/scripts/release/release-approval-prune.ts +24 -0
- package/scripts/release/release-history.ts +1 -3
- package/scripts/release/release-progress.ts +42 -22
- package/scripts/release/release-publish-run.ts +39 -0
- package/scripts/release/release-publish.ts +6 -6
- package/scripts/release/release-scope-cli.ts +0 -10
- package/scripts/release/release-scope-main.ts +12 -0
- package/scripts/repo/repo-setting.ts +3 -6
- package/scripts/repo/required-checks-logic.ts +10 -16
- package/scripts/repo/ruleset-check.ts +4 -3
- package/scripts/report/markdown-shape.ts +28 -0
- package/scripts/report/report-format-reference.ts +17 -1
- package/scripts/report/report-labels.ts +166 -0
- package/scripts/report/report-lint-child-summary.ts +94 -0
- package/scripts/report/report-lint-cli.ts +29 -7
- package/scripts/report/report-lint.ts +85 -128
- package/scripts/report/report-template-cli.ts +59 -0
- package/scripts/report/report-template.ts +112 -0
- package/scripts/review/acceptance-map.ts +1 -0
- package/scripts/review/prose-stale-cli.ts +88 -0
- package/scripts/review/prose-stale-scan.ts +152 -0
- package/scripts/review/removed-tests-check.ts +86 -0
- package/scripts/review/removed-tests.ts +149 -0
- package/scripts/review/review-attest.ts +73 -23
- package/scripts/review/review-brief-cli.ts +138 -23
- package/scripts/review/review-brief-main.ts +12 -0
- package/scripts/review/review-brief-paths.ts +22 -0
- package/scripts/review/review-brief.ts +45 -10
- package/scripts/review/review-code-tree.ts +10 -6
- package/scripts/review/review-comment-carry.ts +47 -0
- package/scripts/review/review-comment-round.ts +111 -30
- package/scripts/review/review-finding-ledger.ts +135 -18
- package/scripts/review/review-finding-text.ts +43 -0
- package/scripts/review/review-interaction.ts +105 -0
- package/scripts/review/review-lane-handover.ts +68 -0
- package/scripts/review/review-lint-cli.ts +57 -0
- package/scripts/review/review-lint-findings.ts +92 -0
- package/scripts/review/review-lint-sections.ts +80 -0
- package/scripts/review/review-lint.ts +221 -0
- package/scripts/review/review-prior-findings.ts +102 -0
- package/scripts/review/review-readers-scan.ts +165 -0
- package/scripts/review/review-record-cli.ts +236 -74
- package/scripts/review/review-record-code-round.ts +55 -0
- package/scripts/review/review-record-comment.ts +60 -0
- package/scripts/review/review-record-interaction.ts +35 -0
- package/scripts/review/review-record-main.ts +12 -0
- package/scripts/review/review-record-pinned.ts +108 -0
- package/scripts/review/review-record.ts +25 -1
- package/scripts/review/review-reviewed-tree.ts +307 -0
- package/scripts/review/review-round-one-blobs.ts +221 -0
- package/scripts/review/review-round-one-closure.ts +62 -0
- package/scripts/review/review-round-reuse.ts +106 -0
- package/scripts/review/review-round2-cli.ts +135 -36
- package/scripts/review/review-round2-skip-comment.ts +55 -0
- package/scripts/review/review-round2.ts +103 -19
- package/scripts/review/review-stamps.ts +23 -1
- package/scripts/review/review-stop-log.ts +110 -0
- package/scripts/review/review-stops-cli.ts +86 -0
- package/scripts/review/review-submit-cli.ts +101 -0
- package/scripts/review/review-tree.ts +6 -17
- package/scripts/review/review-untouched-readers.ts +146 -0
- package/scripts/review/test-titles.ts +118 -0
- package/scripts/rules/agent-model.ts +9 -1
- package/scripts/rules/bash-triggers.ts +49 -6
- package/scripts/rules/concise-reply.ts +88 -0
- package/scripts/rules/credential-body.ts +77 -0
- package/scripts/rules/decision-oracle-batch.ts +9 -1
- package/scripts/rules/decision-oracle.ts +3 -3
- package/scripts/rules/delivered-rules.ts +115 -18
- package/scripts/rules/destructive-command.ts +11 -12
- package/scripts/rules/direct-filing.ts +10 -2
- package/scripts/rules/direct-issue-comment.ts +139 -0
- package/scripts/rules/direct-issue-read.ts +191 -0
- package/scripts/rules/direct-pr-create.ts +72 -26
- package/scripts/rules/early-heartbeat.ts +4 -1
- package/scripts/rules/edit-tool.ts +27 -0
- package/scripts/rules/file-body.ts +7 -0
- package/scripts/rules/file-edit-rows.ts +17 -0
- package/scripts/rules/file-rewrite.ts +146 -0
- package/scripts/rules/firing-point.ts +3 -2
- package/scripts/rules/gh-api.ts +128 -7
- package/scripts/rules/gh-repo-selector.ts +84 -0
- package/scripts/rules/git-argv.ts +72 -14
- package/scripts/rules/git-force.ts +14 -4
- package/scripts/rules/guard-remedy.ts +17 -4
- package/scripts/rules/implementation-cut-verdict.ts +1 -1
- package/scripts/rules/implementation-cut.ts +68 -27
- package/scripts/rules/index-guard.ts +8 -1
- package/scripts/rules/investigator-foreground.ts +231 -0
- package/scripts/rules/issue-citation.ts +15 -60
- package/scripts/rules/issue-comments.ts +18 -5
- package/scripts/rules/josh-git-bare.ts +7 -0
- package/scripts/rules/lane-background.ts +103 -33
- package/scripts/rules/lane-carry-conflict.ts +6 -0
- package/scripts/rules/lane-direct-tool.ts +172 -0
- package/scripts/rules/lane-interactive-ask.ts +12 -2
- package/scripts/rules/lane-park.ts +49 -25
- package/scripts/rules/lane-spilled-read.ts +90 -0
- package/scripts/rules/lane-split-park.ts +11 -3
- package/scripts/rules/lane-switch-main.ts +11 -4
- package/scripts/rules/last-prompt.ts +20 -47
- package/scripts/rules/oracle-consulted.ts +11 -1
- package/scripts/rules/oracle-firing.ts +1 -0
- package/scripts/rules/permission-guards.ts +7 -0
- package/scripts/rules/piped-verification-shapes.ts +110 -0
- package/scripts/rules/piped-verification.ts +68 -18
- package/scripts/rules/poll-loop.ts +78 -8
- package/scripts/rules/pr-merge.ts +123 -0
- package/scripts/rules/pre-gate-cut.ts +3 -3
- package/scripts/rules/protected-files.ts +113 -22
- package/scripts/rules/raw-field-body.ts +6 -0
- package/scripts/rules/reply-language.ts +3 -17
- package/scripts/rules/reply-prose.ts +34 -0
- package/scripts/rules/repo-admin.ts +132 -0
- package/scripts/rules/reviewer-foreground.ts +88 -0
- package/scripts/rules/round-one-check-related.ts +120 -0
- package/scripts/rules/rule-body-guard.ts +13 -15
- package/scripts/rules/rule-list.ts +9 -28
- package/scripts/rules/rule-value-cache.ts +57 -14
- package/scripts/rules/rule-value-candidates.ts +84 -0
- package/scripts/rules/rule-value-cli.ts +106 -39
- package/scripts/rules/rule-value.ts +18 -5
- package/scripts/rules/run-tail-rule.ts +1 -1
- package/scripts/rules/sed-in-place.ts +196 -0
- package/scripts/rules/shell-segments.ts +43 -0
- package/scripts/rules/stop-rule-rows.ts +52 -0
- package/scripts/rules/stop-rules.ts +36 -62
- package/scripts/rules/test-declared-commit.ts +11 -1
- package/scripts/rules/third-party-write.ts +115 -21
- package/scripts/rules/timed-rerun.ts +69 -0
- package/scripts/rules/turn-filings.ts +90 -0
- package/scripts/rules/worktree-guard.ts +32 -7
- package/scripts/run/board/run-board-app-name.ts +23 -0
- package/scripts/run/board/run-board-cli.ts +65 -32
- package/scripts/run/board/run-board-earlier.ts +94 -0
- package/scripts/run/board/run-board-ending-reason.ts +71 -0
- package/scripts/run/board/run-board-estimate-schedule.ts +103 -0
- package/scripts/run/board/run-board-estimate.ts +98 -0
- package/scripts/run/board/run-board-fit.ts +177 -37
- package/scripts/run/board/run-board-fold.ts +123 -0
- package/scripts/run/board/run-board-found.ts +134 -0
- package/scripts/run/board/run-board-fresh.ts +2 -2
- package/scripts/run/board/run-board-gather-live.ts +29 -0
- package/scripts/run/board/run-board-gather-thread.ts +189 -0
- package/scripts/run/board/run-board-gather-worker.ts +29 -0
- package/scripts/run/board/run-board-gather.ts +187 -0
- package/scripts/run/board/run-board-github.ts +118 -38
- package/scripts/run/board/run-board-header.ts +90 -20
- package/scripts/run/board/run-board-keys.ts +58 -0
- package/scripts/run/board/run-board-kind.ts +20 -6
- package/scripts/run/board/run-board-labels.ts +126 -71
- package/scripts/run/board/run-board-lane-state.ts +109 -0
- package/scripts/run/board/run-board-lane-time.ts +123 -0
- package/scripts/run/board/run-board-layout.ts +239 -60
- package/scripts/run/board/run-board-length.ts +52 -0
- package/scripts/run/board/run-board-link.ts +15 -2
- package/scripts/run/board/run-board-machine.ts +8 -4
- package/scripts/run/board/run-board-main.ts +12 -0
- package/scripts/run/board/run-board-notes.ts +59 -32
- package/scripts/run/board/run-board-now.ts +1 -1
- package/scripts/run/board/run-board-operation.ts +19 -35
- package/scripts/run/board/run-board-phase.ts +3 -6
- package/scripts/run/board/run-board-plan-shared.ts +115 -0
- package/scripts/run/board/run-board-plan.ts +56 -4
- package/scripts/run/board/run-board-planning.ts +45 -0
- package/scripts/run/board/run-board-priority.ts +44 -0
- package/scripts/run/board/run-board-process-groups.ts +195 -0
- package/scripts/run/board/run-board-read.ts +197 -28
- package/scripts/run/board/run-board-reason.ts +247 -51
- package/scripts/run/board/run-board-released.ts +35 -0
- package/scripts/run/board/run-board-render-checks.ts +42 -7
- package/scripts/run/board/run-board-render-condition.ts +96 -0
- package/scripts/run/board/run-board-render-drawn.ts +78 -0
- package/scripts/run/board/run-board-render-foot.ts +59 -0
- package/scripts/run/board/run-board-render-found.ts +157 -0
- package/scripts/run/board/run-board-render-icon.ts +35 -0
- package/scripts/run/board/run-board-render-lanes.ts +145 -0
- package/scripts/run/board/run-board-render-lead.ts +89 -0
- package/scripts/run/board/run-board-render-legend.ts +136 -48
- package/scripts/run/board/run-board-render-notes.ts +156 -29
- package/scripts/run/board/run-board-render-processes.ts +196 -0
- package/scripts/run/board/run-board-render-section.ts +119 -0
- package/scripts/run/board/run-board-render-slot.ts +3 -36
- package/scripts/run/board/run-board-render-tail.ts +115 -48
- package/scripts/run/board/run-board-render-time.ts +56 -0
- package/scripts/run/board/run-board-render-title.ts +117 -24
- package/scripts/run/board/run-board-render-waits.ts +104 -20
- package/scripts/run/board/run-board-render.ts +264 -258
- package/scripts/run/board/run-board-roots.ts +54 -0
- package/scripts/run/board/run-board-row-yield.ts +9 -4
- package/scripts/run/board/run-board-setup.ts +1 -12
- package/scripts/run/board/run-board-snapshot.ts +111 -0
- package/scripts/run/board/run-board-spin.ts +3 -5
- package/scripts/run/board/run-board-state.ts +22 -33
- package/scripts/run/board/run-board-status.ts +149 -71
- package/scripts/run/board/run-board-thanks-read.ts +2 -2
- package/scripts/run/board/run-board-tick.ts +158 -114
- package/scripts/run/board/run-board-usage-board.ts +78 -0
- package/scripts/run/board/run-board-usage-lanes.ts +113 -0
- package/scripts/run/board/run-board-usage-listing.ts +93 -0
- package/scripts/run/board/run-board-usage-read.ts +120 -150
- package/scripts/run/board/run-board-usage-rusage.ts +19 -7
- package/scripts/run/board/run-board-usage-text.ts +139 -51
- package/scripts/run/board/run-board-usage-top.ts +102 -0
- package/scripts/run/board/run-board-usage.ts +89 -72
- package/scripts/run/board/run-board-usual.ts +20 -9
- package/scripts/run/carry/run-carry-args.ts +4 -7
- package/scripts/run/carry/run-carry-conversation.ts +1 -1
- package/scripts/run/carry/run-carry-ended.ts +3 -2
- package/scripts/run/carry/run-carry.ts +12 -6
- package/scripts/run/cut/run-cut-cli.ts +33 -133
- package/scripts/run/cut/run-cut-digest.ts +152 -0
- package/scripts/run/cut/run-cut-handoff.ts +54 -10
- package/scripts/run/cut/run-cut-report.ts +24 -3
- package/scripts/run/cut/run-cut-resume.ts +129 -0
- package/scripts/run/cut/run-cut-review.ts +105 -0
- package/scripts/run/cut/run-cut.ts +18 -7
- package/scripts/run/detached-launch.ts +1 -1
- package/scripts/run/entry/run-entry-cli.ts +88 -19
- package/scripts/run/entry/run-entry-spill.ts +83 -0
- package/scripts/run/entry/run-entry-stop.ts +5 -1
- package/scripts/run/entry/run-entry-trust.ts +91 -0
- package/scripts/run/event/run-event-baseline.ts +56 -0
- package/scripts/run/event/run-event-cli.ts +1 -5
- package/scripts/run/event/run-event-filed.ts +18 -6
- package/scripts/run/event/run-event-follow.ts +2 -3
- package/scripts/run/event/run-event-overrun.ts +197 -0
- package/scripts/run/event/run-event-render.ts +10 -10
- package/scripts/run/event/run-event-scope.ts +2 -2
- package/scripts/run/event/run-event-stream-emit.ts +82 -22
- package/scripts/run/event/run-event-stream.ts +58 -10
- package/scripts/run/hold/run-hold-adopt.ts +65 -0
- package/scripts/run/hold/run-hold-cli.ts +93 -22
- package/scripts/run/hold/run-hold-main.ts +12 -0
- package/scripts/run/hold/run-hold-member.ts +37 -0
- package/scripts/run/hold/run-stop-notify.ts +178 -0
- package/scripts/run/merge/run-merge-auth.ts +31 -0
- package/scripts/run/merge/run-merge-cap.ts +57 -0
- package/scripts/run/merge/run-merge-cli.ts +119 -62
- package/scripts/run/merge/run-merge-close.ts +74 -0
- package/scripts/run/merge/run-merge-collect.ts +6 -13
- package/scripts/run/merge/run-merge-driver.ts +71 -0
- package/scripts/run/merge/run-merge-main.ts +12 -0
- package/scripts/run/merge/run-merge-outcome.ts +25 -0
- package/scripts/run/merge/run-merge-restart.ts +39 -0
- package/scripts/run/merge/run-merge-ship.ts +33 -7
- package/scripts/run/merge/run-merge-signals.ts +66 -25
- package/scripts/run/merge/run-merge-steps.ts +162 -107
- package/scripts/run/merge/run-merge-usage-limit.ts +53 -0
- package/scripts/run/merge/run-merge-withdrawn.ts +53 -0
- package/scripts/run/merge/run-merge.ts +76 -48
- package/scripts/run/park/run-park-cli.ts +91 -0
- package/scripts/run/park/run-park.ts +88 -0
- package/scripts/run/park/run-stalled.ts +68 -0
- package/scripts/run/pause/run-pause-cli.ts +73 -0
- package/scripts/run/pause/run-pause.ts +251 -0
- package/scripts/run/progress/run-progress-cli.ts +4 -12
- package/scripts/run/progress/run-progress-clock.ts +1 -1
- package/scripts/run/progress/run-progress-config.ts +6 -14
- package/scripts/run/progress/run-progress-main.ts +12 -0
- package/scripts/run/progress/run-progress.ts +1 -4
- package/scripts/run/review/run-review-cli.ts +306 -20
- package/scripts/run/review/run-review-early-push.ts +121 -0
- package/scripts/run/review/run-review-join-read.ts +94 -0
- package/scripts/run/review/run-review-pinned-accepted.ts +126 -0
- package/scripts/run/review/run-review-pinned-join.ts +216 -0
- package/scripts/run/review/run-review-pinned-steps.ts +383 -0
- package/scripts/run/review/run-review-pinned-tree.ts +37 -0
- package/scripts/run/review/run-review-pinned.ts +53 -0
- package/scripts/run/review/run-review-steps.ts +70 -34
- package/scripts/run/review/run-review.ts +28 -7
- package/scripts/run/run-ending.ts +1 -0
- package/scripts/run/run-invocation.ts +5 -6
- package/scripts/run/run-liveness-cli.ts +6 -8
- package/scripts/run/run-liveness.ts +60 -29
- package/scripts/run/run-next.ts +1 -1
- package/scripts/run/run-parent-cut-hook.ts +3 -4
- package/scripts/run/run-preflight.ts +18 -3
- package/scripts/run/run-prep-cli.ts +1 -10
- package/scripts/run/run-prep-locate.ts +7 -50
- package/scripts/run/run-prep-main.ts +12 -0
- package/scripts/run/run-prep.ts +7 -0
- package/scripts/run/run-report-cli.ts +101 -13
- package/scripts/run/run-report-handoff.ts +114 -0
- package/scripts/run/run-stage-read.ts +2 -6
- package/scripts/run/run-step-cli.ts +17 -5
- package/scripts/run/run-step-lane-plan.ts +27 -0
- package/scripts/run/run-step-section.ts +26 -7
- package/scripts/run/run-step.ts +6 -3
- package/scripts/run/run-stranded-detect.ts +13 -0
- package/scripts/run/run-watcher-guard-cli.ts +1 -1
- package/scripts/run/run-watcher-guard.ts +1 -1
- package/scripts/run/ship/run-ship-args.ts +140 -0
- package/scripts/run/ship/run-ship-body-draft.ts +110 -0
- package/scripts/run/ship/run-ship-brokered-review.ts +106 -0
- package/scripts/run/ship/run-ship-cli.ts +181 -166
- package/scripts/run/ship/run-ship-conflict-probe.ts +59 -0
- package/scripts/run/ship/run-ship-detach.ts +29 -12
- package/scripts/run/ship/run-ship-handover.ts +106 -0
- package/scripts/run/ship/run-ship-infra-retry.ts +74 -0
- package/scripts/run/ship/run-ship-lap.ts +63 -0
- package/scripts/run/ship/run-ship-next.ts +44 -27
- package/scripts/run/ship/run-ship-overlap.ts +49 -7
- package/scripts/run/ship/run-ship-place.ts +103 -0
- package/scripts/run/ship/run-ship-planned.ts +92 -0
- package/scripts/run/ship/run-ship-pre-detach-pinned.ts +197 -0
- package/scripts/run/ship/run-ship-pre-detach-timed.ts +42 -0
- package/scripts/run/ship/run-ship-pre-detach.ts +144 -33
- package/scripts/run/ship/run-ship-preflight.ts +150 -33
- package/scripts/run/ship/run-ship-probe.ts +28 -6
- package/scripts/run/ship/run-ship-relaunch-cap.ts +106 -0
- package/scripts/run/ship/run-ship-relaunch.ts +51 -0
- package/scripts/run/ship/run-ship-removed-rows.ts +61 -0
- package/scripts/run/ship/run-ship-return.ts +183 -25
- package/scripts/run/ship/run-ship-review-reason.ts +24 -0
- package/scripts/run/ship/run-ship-review-steps.ts +296 -171
- package/scripts/run/ship/run-ship-review.ts +222 -35
- package/scripts/run/ship/run-ship-reviewer.ts +303 -0
- package/scripts/run/ship/run-ship-scoped.ts +39 -10
- package/scripts/run/ship/run-ship-stage.ts +101 -16
- package/scripts/run/ship/run-ship-steps.ts +68 -17
- package/scripts/run/ship/run-ship-stop-cause.ts +176 -0
- package/scripts/run/ship/run-ship-stop-context.ts +50 -13
- package/scripts/run/ship/run-ship-stop-text.ts +11 -6
- package/scripts/run/ship/run-ship-sync.ts +212 -34
- package/scripts/run/ship/run-ship-synced-scope.ts +178 -0
- package/scripts/run/ship/run-ship-wait-cli.ts +145 -0
- package/scripts/run/ship/run-ship-waiter.ts +114 -0
- package/scripts/run/ship/run-ship.ts +44 -2
- package/scripts/run/tidy/run-tidy-cli.ts +0 -4
- package/scripts/run/tidy/run-tidy-lanes.ts +3 -0
- package/scripts/run/tidy/run-tidy-main.ts +8 -0
- package/scripts/run/wake/run-wake-caffeinate.ts +48 -0
- package/scripts/run/wake/run-wake-cli.ts +121 -209
- package/scripts/run/wake/run-wake-code.ts +125 -0
- package/scripts/run/wake/run-wake-driver.ts +22 -9
- package/scripts/run/wake/run-wake-finish.ts +137 -0
- package/scripts/run/wake/run-wake-loop.ts +36 -3
- package/scripts/run/wake/run-wake-main.ts +13 -0
- package/scripts/run/wake/run-wake-ports.ts +98 -0
- package/scripts/run/wake/run-wake-session.ts +2 -0
- package/scripts/run/wake/run-wake-takeover.ts +66 -0
- package/scripts/run/wake/run-wake.ts +5 -3
- package/scripts/safe-chain/ci-installer-pin.ts +49 -8
- package/scripts/safe-chain/pack-hook.ts +2 -2
- package/scripts/safe-chain/preinstall-command.ts +2 -1
- package/scripts/safe-chain/project-config.ts +6 -11
- package/scripts/security/secretlint-scan.ts +42 -9
- package/scripts/security/security-audit-main.ts +8 -0
- package/scripts/security/security-audit-provision-logic.ts +0 -11
- package/scripts/security/security-audit-provision-main.ts +20 -0
- package/scripts/security/security-audit-provision.ts +12 -27
- package/scripts/security/security-audit.ts +27 -8
- package/scripts/security/sonar-file.ts +10 -5
- package/scripts/self-sync-guard/self-sync-guard-logic.ts +6 -13
- package/scripts/split/split-assess-cli.ts +2 -2
- package/scripts/split/split-assess.ts +25 -1
- package/scripts/split/split-early-notice.ts +116 -0
- package/scripts/split/split-measure.ts +83 -0
- package/scripts/split/split-resolution.ts +107 -0
- package/scripts/sync/claude-settings-merge.ts +8 -15
- package/scripts/sync/directory-copy-guard.ts +4 -9
- package/scripts/sync/file-content.ts +78 -8
- package/scripts/sync/sync-ai-files.ts +3 -5
- package/scripts/sync/sync-configs.ts +11 -23
- package/scripts/sync/sync-hook-safety.ts +4 -10
- package/scripts/sync/sync-main.ts +11 -0
- package/scripts/sync/sync.ts +25 -37
- package/scripts/test/direct-importers.ts +185 -0
- package/scripts/test/pure-files-entries.ts +83 -0
- package/scripts/test/related-heavy-tests.ts +81 -0
- package/scripts/test/test-declared-changed.ts +2 -2
- package/scripts/test/test-declared.ts +1 -1
- package/scripts/test/test-e2e-guard.ts +25 -1
- package/scripts/test/test-e2e-stamp.ts +38 -0
- package/scripts/test/test-no-base.ts +88 -0
- package/scripts/test/test-pinned-cache-logic.ts +363 -0
- package/scripts/test/test-pinned-cache.ts +337 -0
- package/scripts/test/test-pinned-emit.ts +49 -0
- package/scripts/test/test-pinned-functions.ts +116 -0
- package/scripts/test/test-pinned-ledger.ts +80 -0
- package/scripts/test/test-pinned-logic.ts +333 -0
- package/scripts/test/test-pinned-main.ts +144 -0
- package/scripts/test/test-pinned-pool.ts +73 -0
- package/scripts/test/test-pinned-probe.ts +254 -0
- package/scripts/test/test-pinned-prune-logic.ts +118 -0
- package/scripts/test/test-pinned-reach.ts +194 -0
- package/scripts/test/test-pinned-record.ts +196 -0
- package/scripts/test/test-pinned-rewire.ts +148 -0
- package/scripts/test/test-pinned-spawn.ts +81 -0
- package/scripts/test/test-pinned-stage.ts +70 -0
- package/scripts/test/test-pinned.ts +311 -0
- package/scripts/test/test-reach-cli.ts +61 -0
- package/scripts/test/test-read-map.ts +288 -0
- package/scripts/test/test-read-recording.ts +103 -0
- package/scripts/test/test-read-trace.ts +166 -0
- package/scripts/test/test-red-logic.ts +46 -7
- package/scripts/test/test-red-main.ts +12 -0
- package/scripts/test/test-red.ts +39 -37
- package/scripts/test/test-related-claim.ts +37 -0
- package/scripts/test/test-related-main.ts +21 -0
- package/scripts/test/test-related-moved.ts +91 -0
- package/scripts/test/test-related-record.ts +139 -0
- package/scripts/test/test-related-scope.ts +292 -41
- package/scripts/test/test-related-synced.ts +135 -0
- package/scripts/test/test-related-touched.ts +84 -0
- package/scripts/test/test-related.ts +381 -19
- package/scripts/test/test-unit-guard-main.ts +15 -0
- package/scripts/test/test-unit-guard.ts +66 -25
- package/scripts/test/unit-count-file.ts +37 -0
- package/scripts/test/unit-durations.ts +41 -0
- package/scripts/test/unit-run-marker.ts +162 -0
- package/scripts/test/unit-setup-files.ts +51 -0
- package/scripts/test/unit-worker-share.ts +64 -151
- package/scripts/test/vitest-cache-directory.ts +19 -0
- package/scripts/test/vitest-cli-excludes.ts +14 -0
- package/scripts/test/vitest-failure-summary.ts +111 -0
- package/scripts/test/whole-suite-files.ts +74 -0
- package/scripts/time-runtime/time-background.ts +20 -2
- package/scripts/time-runtime/time-batch-guard.ts +42 -4
- package/scripts/time-runtime/time-bundle-call.ts +1 -1
- package/scripts/time-runtime/time-bundles.ts +40 -8
- package/scripts/time-runtime/time-density-hook.ts +8 -6
- package/scripts/time-runtime/time-followup-stage.ts +1 -3
- package/scripts/time-runtime/time-format.ts +5 -28
- package/scripts/time-runtime/time-markers.ts +12 -3
- package/scripts/time-runtime/time-search-call.ts +38 -0
- package/scripts/time-runtime/time-shell.ts +98 -11
- package/scripts/time-runtime/time-transcript-line.ts +65 -66
- package/scripts/uninstall/uninstall.ts +1 -1
- package/scripts/version/bump-version-main.ts +12 -0
- package/scripts/version/bump-version.ts +25 -25
- package/scripts/version/development-engines-verdict.ts +124 -0
- package/scripts/version/effective-upstream.ts +6 -12
- package/scripts/version/latest-corepack.ts +19 -32
- package/scripts/version/latest-if-required-cli.ts +93 -0
- package/scripts/version/latest-lane-guard-main.ts +8 -0
- package/scripts/version/latest-lane-guard.ts +0 -4
- package/scripts/version/latest-scope-cli.ts +0 -9
- package/scripts/version/latest-scope-main.ts +12 -0
- package/scripts/version/latest-update.ts +5 -5
- package/scripts/version/npm-registry.ts +44 -6
- package/scripts/version/publishable-range-check.ts +5 -16
- package/scripts/version/release-age.ts +1 -1
- package/scripts/version/release-hold.ts +1 -1
- package/scripts/version/release-window.ts +38 -0
- package/scripts/version/running-binary.ts +1 -1
- package/scripts/version/safe-chain-version-update.ts +3 -8
- package/scripts/version/version-targets.ts +6 -28
- package/templates/dependabot.yml +29 -0
- package/templates/gitignore +6 -1
- package/templates/pnpm-workspace.basic.yaml +1 -1
- package/templates/sonar-project.properties +3 -2
- package/templates/workflows/ci.yml +53 -4
- package/templates/workflows/github-release.yml +4 -0
- package/tsconfig.sonar.json +1 -1
- package/.ncurc.json +0 -3
- package/dist/hooks/batch-guard.js +0 -29
- package/dist/hooks/chunk-4KKD2UTK.js +0 -66
- package/dist/hooks/chunk-6TS2JD6D.js +0 -237
- package/dist/hooks/chunk-7DSBJVFH.js +0 -50
- package/dist/hooks/chunk-A65Y4YOR.js +0 -79
- package/dist/hooks/chunk-APUO6U4J.js +0 -2451
- package/dist/hooks/chunk-CDY4NFQG.js +0 -15
- package/dist/hooks/chunk-DGT54IH5.js +0 -161
- package/dist/hooks/chunk-EFXE6C37.js +0 -81
- package/dist/hooks/chunk-GP4IEC4O.js +0 -20
- package/dist/hooks/chunk-JP45SOCJ.js +0 -56
- package/dist/hooks/chunk-LAOV7NLM.js +0 -45
- package/dist/hooks/chunk-M4HGZV7U.js +0 -83
- package/dist/hooks/chunk-O6GDRNJB.js +0 -343
- package/dist/hooks/chunk-PF2NZL2A.js +0 -131
- package/dist/hooks/chunk-PTICX4OL.js +0 -358
- package/dist/hooks/chunk-RT27QRJW.js +0 -6247
- package/dist/hooks/chunk-SYOTDYCI.js +0 -3533
- package/dist/hooks/chunk-TNUMY6NL.js +0 -4838
- package/dist/hooks/chunk-UPUZF3AN.js +0 -279
- package/dist/hooks/chunk-WK6SMBIC.js +0 -3180
- package/dist/hooks/duplicate-read-guard.js +0 -30
- package/dist/hooks/investigation-guard.js +0 -29
- package/scripts/backlog/backlog-stalled-cli.ts +0 -30
- package/scripts/cost-runtime/context-cut-threshold.ts +0 -11
- package/scripts/cost-runtime/cost-format.ts +0 -29
- package/scripts/init/basic-path-migration.ts +0 -24
- package/scripts/issue/issue-backlinks-cli.ts +0 -93
- package/scripts/josh/josh-commands-guard.ts +0 -38
- package/scripts/josh/josh-usage-automation.ts +0 -121
- package/scripts/josh/josh-usage-backlog.ts +0 -180
- package/scripts/josh/josh-usage-developer.ts +0 -230
- package/scripts/josh/josh-usage-hooks.ts +0 -38
- package/scripts/josh/josh-usage-issue.ts +0 -205
- package/scripts/josh/josh-usage-review.ts +0 -101
- package/scripts/josh/josh-usage-run.ts +0 -252
- package/scripts/josh/josh-usage-session.ts +0 -238
- package/scripts/josh/josh-usage-workflow.ts +0 -212
- package/scripts/lint/cross-file-recheck.ts +0 -155
- package/scripts/registry-migration/migrate-logic.ts +0 -237
- package/scripts/registry-migration/migrate.ts +0 -292
- package/scripts/registry-migration/user-npmrc.ts +0 -15
- package/scripts/rules/filing-cap.ts +0 -132
- package/scripts/rules/rule-guard.ts +0 -23
- package/scripts/rules/rule-registry-rows.ts +0 -292
- package/scripts/rules/rule-registry.ts +0 -112
- package/scripts/run/run-stranded-cli.ts +0 -27
|
@@ -27,7 +27,7 @@ import { MERGED_STATE, to_gh_state } from './git-gh-rest-state'
|
|
|
27
27
|
// branch name that says nothing about which repository holds it. Named once
|
|
28
28
|
// because both sides of a pull request carry the same shape.
|
|
29
29
|
const rest_repo_schema = z.looseObject({ full_name: z.string().optional() }).nullish()
|
|
30
|
-
const rest_pull_side_schema = z.looseObject({ repo: rest_repo_schema })
|
|
30
|
+
const rest_pull_side_schema = z.looseObject({ ref: z.string().optional(), repo: rest_repo_schema })
|
|
31
31
|
|
|
32
32
|
type RestPullSide = z.infer<typeof rest_pull_side_schema>
|
|
33
33
|
|
|
@@ -145,7 +145,8 @@ function to_pr_info(pull: RestPull): Record<string, unknown> {
|
|
|
145
145
|
|
|
146
146
|
// The conversation comments in the shape `gh pr view --json comments` answered with. A listing that
|
|
147
147
|
// will not parse throws rather than answering an empty one — `git-pr-ai-review.ts` reads an empty
|
|
148
|
-
// listing as "no reviewer left a finding" and merges.
|
|
148
|
+
// listing as "no reviewer left a finding" and merges. `updatedAt` is when CodeRabbit last rewrote its
|
|
149
|
+
// rate-limit notice, the moment its stated window counts from (joshuafolkken/kit#5289).
|
|
149
150
|
function to_pr_comments(rest_json: string): Array<Record<string, unknown>> {
|
|
150
151
|
const parsed = parse_json_array_or_undefined(rest_json, rest_comment_schema)
|
|
151
152
|
if (parsed === undefined) throw new Error(NOT_A_COMMENT_LISTING_MESSAGE)
|
|
@@ -154,6 +155,7 @@ function to_pr_comments(rest_json: string): Array<Record<string, unknown>> {
|
|
|
154
155
|
body: comment.body ?? EMPTY_BODY,
|
|
155
156
|
url: comment.html_url,
|
|
156
157
|
author: { login: comment.user?.login },
|
|
158
|
+
updatedAt: comment.updated_at,
|
|
157
159
|
}))
|
|
158
160
|
}
|
|
159
161
|
|
|
@@ -1,12 +1,16 @@
|
|
|
1
1
|
import { FULL_PAGE_QUERY, git_gh_api_path } from './git-gh-api-path'
|
|
2
|
+
import { git_gh_branch_rules } from './git-gh-branch-rules'
|
|
2
3
|
import { git_gh_exec } from './git-gh-exec'
|
|
3
|
-
import {
|
|
4
|
+
import { git_gh_poll_read } from './git-gh-poll-read'
|
|
5
|
+
import { git_gh_pr_graphql_state } from './git-gh-pr-graphql-state'
|
|
6
|
+
import { read_listed_pull, read_pull, require_pr_number } from './git-gh-pr-read'
|
|
4
7
|
import type { RestPull } from './git-gh-pr-rest'
|
|
5
8
|
import { git_gh_pr_review } from './git-gh-pr-review'
|
|
6
9
|
import { git_gh_pr_rollup } from './git-gh-pr-rollup'
|
|
7
10
|
import { to_gh_state } from './git-gh-rest-state'
|
|
8
11
|
|
|
9
|
-
// The merge gate's pull request state snapshot, rebuilt from REST
|
|
12
|
+
// The merge gate's pull request state snapshot, rebuilt from REST — GraphQL only for the merge state
|
|
13
|
+
// of a pull request whose REST detail GitHub refuses as too large (`resolve_pull`).
|
|
10
14
|
//
|
|
11
15
|
// `gh pr view --json mergeStateStatus,reviewDecision,statusCheckRollup` is answered 403 in a cloud
|
|
12
16
|
// session, and all three fields are GraphQL-only: one has no REST
|
|
@@ -19,17 +23,6 @@ import { to_gh_state } from './git-gh-rest-state'
|
|
|
19
23
|
|
|
20
24
|
const NO_HEAD_SHA_MESSAGE = 'gh api answered a pull request with no head commit'
|
|
21
25
|
|
|
22
|
-
// Both commit endpoints answer an *object* wrapping the listing, so `--paginate` alone would emit
|
|
23
|
-
// one document per page and `JSON.parse` would reject the pair; `--slurp` wraps the pages in one
|
|
24
|
-
// outer array instead (`git-gh-exec.ts` → `GhApiRequest`).
|
|
25
|
-
async function read_object_pages(path: string): Promise<string> {
|
|
26
|
-
return await git_gh_exec.exec_gh_api({
|
|
27
|
-
path: `${path}${FULL_PAGE_QUERY}`,
|
|
28
|
-
should_paginate: true,
|
|
29
|
-
should_slurp: true,
|
|
30
|
-
})
|
|
31
|
-
}
|
|
32
|
-
|
|
33
26
|
// The reviews endpoint answers a bare array, whose pages `gh` merges into one array on its own —
|
|
34
27
|
// slurping it would produce `[[…],[…]]`, which the listing schema then rejects.
|
|
35
28
|
async function read_array_pages(path: string): Promise<string> {
|
|
@@ -47,11 +40,12 @@ function read_head_sha(pull: RestPull): string {
|
|
|
47
40
|
}
|
|
48
41
|
|
|
49
42
|
// One pull request's rollup: the check runs and the status contexts, read from the head commit and
|
|
50
|
-
// merged back into the single array `gh` answered with.
|
|
43
|
+
// merged back into the single array `gh` answered with. Both endpoints answer an *object* wrapping the
|
|
44
|
+
// listing, so their pages arrive slurped into one outer array (`git-gh-poll-read.ts`).
|
|
51
45
|
async function read_status_check_rollup(commit_sha: string): Promise<Array<object>> {
|
|
52
46
|
const [check_runs_json, status_json] = await Promise.all([
|
|
53
|
-
read_object_pages(git_gh_api_path.commit_check_runs_api_path(commit_sha)),
|
|
54
|
-
read_object_pages(git_gh_api_path.commit_status_api_path(commit_sha)),
|
|
47
|
+
git_gh_poll_read.read_object_pages(git_gh_api_path.commit_check_runs_api_path(commit_sha)),
|
|
48
|
+
git_gh_poll_read.read_object_pages(git_gh_api_path.commit_status_api_path(commit_sha)),
|
|
55
49
|
])
|
|
56
50
|
|
|
57
51
|
return git_gh_pr_rollup.to_status_check_rollup({ check_runs_json, status_json })
|
|
@@ -69,10 +63,24 @@ async function pr_get_review_decision(pr_number: number): Promise<string> {
|
|
|
69
63
|
// `git-pr-checks-eval.ts` compares strictly against: `MERGE_STATE_CLEAN` never matches a lower-case
|
|
70
64
|
// `clean`, which would also take every pull request out of the CodeRabbit non-blocking exemption
|
|
71
65
|
// keyed on `UNSTABLE`. The rule is shared with `to_pr_info` rather than written twice.
|
|
66
|
+
//
|
|
67
|
+
// **`headRefOid` is the commit the rollup was read from**, in `gh`'s spelling, so a merge can be bound
|
|
68
|
+
// to the head whose checks passed rather than to whatever the branch points at by then (#4036).
|
|
69
|
+
//
|
|
70
|
+
// **`requiredContexts` is the base branch's required checks** (`git-gh-branch-rules.ts`), which the
|
|
71
|
+
// merge gate reads to accept an `UNSTABLE` pull request held only by an optional check.
|
|
72
72
|
async function build_checks_fields(pull: RestPull): Promise<Record<string, unknown>> {
|
|
73
|
+
const head_sha = read_head_sha(pull)
|
|
74
|
+
const [rollup, required_contexts] = await Promise.all([
|
|
75
|
+
read_status_check_rollup(head_sha),
|
|
76
|
+
git_gh_branch_rules.read_required_contexts(pull.base?.ref),
|
|
77
|
+
])
|
|
78
|
+
|
|
73
79
|
return {
|
|
74
|
-
statusCheckRollup:
|
|
80
|
+
statusCheckRollup: rollup,
|
|
75
81
|
mergeStateStatus: to_gh_state(pull.mergeable_state),
|
|
82
|
+
headRefOid: head_sha,
|
|
83
|
+
requiredContexts: required_contexts,
|
|
76
84
|
}
|
|
77
85
|
}
|
|
78
86
|
|
|
@@ -81,12 +89,32 @@ interface ResolvedPull {
|
|
|
81
89
|
pull: RestPull
|
|
82
90
|
}
|
|
83
91
|
|
|
84
|
-
// The resolution and the detail read, which every path below needs
|
|
85
|
-
//
|
|
92
|
+
// The resolution and the detail read, which every path below needs. The branch → number memo in
|
|
93
|
+
// `git-gh-pr-read.ts` makes the first free after the first poll.
|
|
94
|
+
//
|
|
95
|
+
// **The detail is read without an ETag.** GitHub computes `mergeable_state` lazily and can change it
|
|
96
|
+
// under an unchanged ETag, so a 304 answered from the poll cache kept the gate reading a stale
|
|
97
|
+
// `blocked` on a pull request that had turned `clean` (joshuafolkken/kit#4589).
|
|
98
|
+
//
|
|
99
|
+
// **A detail GitHub refuses as too many files changed** is stood in for by the listing row, whose
|
|
100
|
+
// missing `mergeable_state` is read from GraphQL (`git-gh-pr-graphql-state.ts`) — or the snapshot
|
|
101
|
+
// throws with the reason, since an unknown state would hold the gate pending until its budget ran out.
|
|
102
|
+
async function read_detail_or_listed(branch_name: string, pr_number: number): Promise<RestPull> {
|
|
103
|
+
try {
|
|
104
|
+
return await read_pull(pr_number)
|
|
105
|
+
} catch (error) {
|
|
106
|
+
const listed = await read_listed_pull(error, branch_name, pr_number)
|
|
107
|
+
if (listed === undefined) throw error
|
|
108
|
+
const state = await git_gh_pr_graphql_state.read_merge_state_status(listed, error)
|
|
109
|
+
|
|
110
|
+
return { ...listed, mergeable_state: state }
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
86
114
|
async function resolve_pull(branch_name: string): Promise<ResolvedPull> {
|
|
87
115
|
const pr_number = await require_pr_number(branch_name)
|
|
88
116
|
|
|
89
|
-
return { pr_number, pull: await
|
|
117
|
+
return { pr_number, pull: await read_detail_or_listed(branch_name, pr_number) }
|
|
90
118
|
}
|
|
91
119
|
|
|
92
120
|
// Everything the snapshot carries except the review decision: three requests rather than four.
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { error_text } from '#scripts/lib/error-message'
|
|
2
|
+
import { gh_failure } from './git-gh-failure'
|
|
3
|
+
|
|
4
|
+
// GitHub refuses the single-pull JSON (`GET /pulls/{N}`) of some pull requests with
|
|
5
|
+
// `HTTP 422: … too many files changed`, every time, however few files the pull request changes — while
|
|
6
|
+
// the listing, the files, the diff and GraphQL all answer for the same one (joshuafolkken/kit#5226).
|
|
7
|
+
// The refusal is about that one response, so the branch-keyed reads fall back to the listing row
|
|
8
|
+
// rather than reporting the pull request unreadable.
|
|
9
|
+
const UNPROCESSABLE_STATUS = 422
|
|
10
|
+
const TOO_MANY_FILES_TEXT = 'too many files changed'
|
|
11
|
+
|
|
12
|
+
function is_too_many_files(error: unknown): boolean {
|
|
13
|
+
if (gh_failure.failure_of(error)?.status !== UNPROCESSABLE_STATUS) return false
|
|
14
|
+
|
|
15
|
+
return error_text.message_of(error).includes(TOO_MANY_FILES_TEXT)
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
const git_gh_pr_too_large = { is_too_many_files }
|
|
19
|
+
|
|
20
|
+
export { git_gh_pr_too_large }
|
package/scripts/gh/git-gh-pr.ts
CHANGED
|
@@ -1,12 +1,18 @@
|
|
|
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
|
-
import {
|
|
9
|
+
import {
|
|
10
|
+
forget_pr_numbers,
|
|
11
|
+
git_gh_pr_read,
|
|
12
|
+
read_pull,
|
|
13
|
+
read_pull_or_listed,
|
|
14
|
+
require_pr_number,
|
|
15
|
+
} from './git-gh-pr-read'
|
|
10
16
|
import { git_gh_pr_rest } from './git-gh-pr-rest'
|
|
11
17
|
import { git_gh_pr_snapshot } from './git-gh-pr-snapshot'
|
|
12
18
|
|
|
@@ -49,25 +55,27 @@ const MERGE_UNCONFIRMED_MESSAGE =
|
|
|
49
55
|
'gh api could not read the pull request back after the merge request failed'
|
|
50
56
|
const MERGE_READ_BACK_ATTEMPTS = 3
|
|
51
57
|
const MERGE_READ_BACK_INTERVAL_MS = 1000
|
|
58
|
+
// `PUT pulls/{N}/merge` with a `sha` that is no longer the branch head.
|
|
59
|
+
const HEAD_MOVED_STATUS = 409
|
|
52
60
|
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
61
|
|
|
62
|
+
// A pull request is an issue to the labels endpoint, so the write is the issue one: a failed answer
|
|
63
|
+
// is confirmed by reading the labels back before it is reported as a failed write.
|
|
56
64
|
async function add_pr_classification(number: string, label: ReleaseClassification): Promise<void> {
|
|
57
|
-
await
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
})
|
|
65
|
+
const write = await git_gh_issue_write.issue_apply_label(number, label)
|
|
66
|
+
|
|
67
|
+
if (!write.is_applied) throw new Error(write.reason)
|
|
61
68
|
}
|
|
62
69
|
|
|
70
|
+
// Labels that could not be read are not "no classification": answering that would add a second
|
|
71
|
+
// classification beside the one a person already put on the pull request.
|
|
63
72
|
async function pr_get_classification(
|
|
64
73
|
branch_name: string,
|
|
65
74
|
): Promise<ReleaseClassification | undefined> {
|
|
66
75
|
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())
|
|
76
|
+
const labels = await git_gh_issue_write.read_label_names(String(number))
|
|
77
|
+
if (labels === undefined) throw new Error(`Unreadable labels on branch ${branch_name}`)
|
|
78
|
+
const names = labels.map((name) => name.toLowerCase())
|
|
71
79
|
const selected = names.filter((name) => pr_classification.is_classification(name))
|
|
72
80
|
if (selected.length === 0) return undefined
|
|
73
81
|
|
|
@@ -166,21 +174,34 @@ async function pr_update_body(branch_name: string, body: string): Promise<void>
|
|
|
166
174
|
}
|
|
167
175
|
|
|
168
176
|
// A merge moves the remembered detail read's state, so it is cleared first.
|
|
169
|
-
|
|
177
|
+
//
|
|
178
|
+
// **`sha` binds the merge to the head the checks passed on** (#4036): without it GitHub merges
|
|
179
|
+
// whatever the branch points at, so a commit pushed after the gate went green would land unverified.
|
|
180
|
+
// A head that moved is answered 409 (`is_head_moved`).
|
|
181
|
+
async function put_merge(pr_number: number, head_sha: string): Promise<void> {
|
|
170
182
|
forget_pr_numbers()
|
|
171
183
|
await git_gh_exec.exec_gh_api({
|
|
172
184
|
path: git_gh_api_path.pull_merge_api_path(String(pr_number)),
|
|
173
185
|
method: PUT_METHOD,
|
|
174
|
-
body: JSON.stringify({ merge_method: MERGE_COMMIT_METHOD }),
|
|
186
|
+
body: JSON.stringify({ merge_method: MERGE_COMMIT_METHOD, sha: head_sha }),
|
|
175
187
|
timeout_ms: MERGE_REQUEST_TIMEOUT_MS,
|
|
176
188
|
})
|
|
177
189
|
}
|
|
178
190
|
|
|
191
|
+
// GitHub's answer to a merge whose `sha` is no longer the branch head.
|
|
192
|
+
function is_head_moved(error: unknown): boolean {
|
|
193
|
+
return gh_failure.failure_of(error)?.status === HEAD_MOVED_STATUS
|
|
194
|
+
}
|
|
195
|
+
|
|
179
196
|
// `undefined` is "nobody read it", kept apart from the `false` that means "the pull request is not
|
|
180
|
-
// merged". Folding the two would report an unread state as a settled answer.
|
|
181
|
-
|
|
197
|
+
// merged". Folding the two would report an unread state as a settled answer. The listing row, which
|
|
198
|
+
// carries `merged_at` too, stands in for a detail GitHub refuses as too many files changed.
|
|
199
|
+
async function read_merge_state(
|
|
200
|
+
branch_name: string,
|
|
201
|
+
pr_number: number,
|
|
202
|
+
): Promise<boolean | undefined> {
|
|
182
203
|
try {
|
|
183
|
-
return git_gh_pr_rest.is_merged(await
|
|
204
|
+
return git_gh_pr_rest.is_merged(await read_pull_or_listed(branch_name, pr_number, read_pull))
|
|
184
205
|
} catch (error) {
|
|
185
206
|
// The reason goes in the line, for the same reason the poll loop's warning carries one: the
|
|
186
207
|
// failure this throws below names the *merge* request as its cause, so without this an operator
|
|
@@ -209,10 +230,14 @@ async function sleep_between_read_backs(attempt: number): Promise<void> {
|
|
|
209
230
|
// **A read that failed is still not an answer.** Out of attempts it throws rather than reporting
|
|
210
231
|
// `false`, carrying the merge failure as its `cause`, so no run ever concludes "the merge did not
|
|
211
232
|
// happen" from a read nobody got.
|
|
212
|
-
async function has_merge_landed(
|
|
233
|
+
async function has_merge_landed(
|
|
234
|
+
branch_name: string,
|
|
235
|
+
pr_number: number,
|
|
236
|
+
merge_error: unknown,
|
|
237
|
+
): Promise<boolean> {
|
|
213
238
|
for (let attempt = 0; attempt < MERGE_READ_BACK_ATTEMPTS; attempt += 1) {
|
|
214
239
|
// eslint-disable-next-line no-await-in-loop -- a retry runs only after the previous attempt has answered
|
|
215
|
-
const is_merged = await read_merge_state(pr_number)
|
|
240
|
+
const is_merged = await read_merge_state(branch_name, pr_number)
|
|
216
241
|
if (is_merged !== undefined) return is_merged
|
|
217
242
|
|
|
218
243
|
// eslint-disable-next-line no-await-in-loop -- a retry runs only after the previous attempt has answered
|
|
@@ -240,13 +265,13 @@ async function has_merge_landed(pr_number: number, merge_error: unknown): Promis
|
|
|
240
265
|
// made by hand between the failure and the read leaves `followup` with exactly the same work to
|
|
241
266
|
// finish. REST offers nothing that would tell the two apart without keeping the merge commit's SHA
|
|
242
267
|
// across a request that never answered.
|
|
243
|
-
async function pr_merge(branch_name: string): Promise<void> {
|
|
268
|
+
async function pr_merge(branch_name: string, head_sha: string): Promise<void> {
|
|
244
269
|
const pr_number = await require_pr_number(branch_name)
|
|
245
270
|
|
|
246
271
|
try {
|
|
247
|
-
await put_merge(pr_number)
|
|
272
|
+
await put_merge(pr_number, head_sha)
|
|
248
273
|
} catch (error) {
|
|
249
|
-
if (!(await has_merge_landed(pr_number, error))) throw error
|
|
274
|
+
if (!(await has_merge_landed(branch_name, pr_number, error))) throw error
|
|
250
275
|
}
|
|
251
276
|
}
|
|
252
277
|
|
|
@@ -259,6 +284,7 @@ const git_gh_pr = {
|
|
|
259
284
|
pr_comment,
|
|
260
285
|
pr_merge,
|
|
261
286
|
pr_update_body,
|
|
287
|
+
is_head_moved,
|
|
262
288
|
}
|
|
263
289
|
|
|
264
290
|
export { git_gh_pr, MERGE_COMMIT_METHOD, MERGE_REQUEST_TIMEOUT_MS, MERGE_UNCONFIRMED_MESSAGE }
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import { setTimeout as delay } from 'node:timers/promises'
|
|
2
|
+
import { get_exit_code, has_timed_out } from '#scripts/git/git-execa-error'
|
|
3
|
+
import { error_text } from '#scripts/lib/error-message'
|
|
4
|
+
import { gh_failure } from './git-gh-failure'
|
|
5
|
+
|
|
6
|
+
// One REST request asked again, a bounded number of times, when GitHub failed it transiently
|
|
7
|
+
// (joshuafolkken/kit#4717). A single 502 on `review:record --comment` used to stop a whole ship stage
|
|
8
|
+
// and cost a relaunched session that changed nothing; the same request seconds later succeeds.
|
|
9
|
+
//
|
|
10
|
+
// **Transient is a 5xx or a request that got no answer at all** — a dropped connection writes no
|
|
11
|
+
// error document, so its status is `undefined`. A 4xx is the request's own fault and answers the same
|
|
12
|
+
// the next time. Three failures without a status are still not retried: a timeout (it has already
|
|
13
|
+
// spent a minute, and a write it killed may have landed — `GH_REQUEST_TIMEOUT_MS`'s note), an error
|
|
14
|
+
// `to_gh_error` never built (gh missing, a refused body), which no wait can change, and one that wrote
|
|
15
|
+
// a body anyway — a GraphQL `errors` document is served with a 200, so it names no status and is
|
|
16
|
+
// still GitHub's answer.
|
|
17
|
+
//
|
|
18
|
+
// **A retried write can land twice** when the first attempt reached GitHub before it failed. The
|
|
19
|
+
// writes on this path tolerate it: a duplicate pull request is refused with the 422 the creator reads
|
|
20
|
+
// (`handle_pr_create_error`), a repeated merge is read back by `has_merge_landed`, and at worst a
|
|
21
|
+
// review-round comment is posted twice — cheaper than the stopped stage it replaces. Issue creation
|
|
22
|
+
// has no such guard — a second issue opens and nothing reads the first back — so
|
|
23
|
+
// `issue_create_request` opts out with `should_retry: false`.
|
|
24
|
+
|
|
25
|
+
const FIRST_RETRY_DELAY_MS = 2000
|
|
26
|
+
const SECOND_RETRY_DELAY_MS = 5000
|
|
27
|
+
const RETRY_DELAYS_MS = [FIRST_RETRY_DELAY_MS, SECOND_RETRY_DELAY_MS]
|
|
28
|
+
const MAX_ATTEMPTS = RETRY_DELAYS_MS.length + 1
|
|
29
|
+
const SERVER_ERROR_FLOOR = 500
|
|
30
|
+
// gh's own exit code for "authentication required" (`gh auth login`, no `GH_TOKEN`). It writes no
|
|
31
|
+
// error document either, so without this it would read as a request that got no answer — and no
|
|
32
|
+
// wait logs anyone in.
|
|
33
|
+
const GH_AUTH_REQUIRED_EXIT_CODE = 4
|
|
34
|
+
|
|
35
|
+
const SPENT_NOTE = 'gh: request failed transiently on every attempt'
|
|
36
|
+
|
|
37
|
+
// gh's own summary line for a failed request, e.g. `gh: Server Error (HTTP 502)`. It is the only
|
|
38
|
+
// place the status is written when the body is an HTML error page rather than GitHub's JSON document.
|
|
39
|
+
const SUMMARY_STATUS_PATTERN = /\(HTTP (?<status>\d{3})\)/u
|
|
40
|
+
|
|
41
|
+
interface RetryHooks {
|
|
42
|
+
wait: (milliseconds: number) => Promise<void>
|
|
43
|
+
note: (text: string) => void
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
const DEFAULT_HOOKS: RetryHooks = {
|
|
47
|
+
wait: async (milliseconds) => {
|
|
48
|
+
await delay(milliseconds)
|
|
49
|
+
},
|
|
50
|
+
note: (text) => {
|
|
51
|
+
process.stderr.write(`${text}\n`)
|
|
52
|
+
},
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function summary_status(error: Error): number | undefined {
|
|
56
|
+
const { status } = SUMMARY_STATUS_PATTERN.exec(error.message)?.groups ?? {}
|
|
57
|
+
|
|
58
|
+
return status === undefined ? undefined : Number(status)
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// Whether the failed spawn wrote a response body: a request that got no answer at all wrote none.
|
|
62
|
+
function has_answer(spawn_error: unknown): boolean {
|
|
63
|
+
if (!(spawn_error instanceof Error) || !('stdout' in spawn_error)) return false
|
|
64
|
+
|
|
65
|
+
return typeof spawn_error.stdout === 'string' && spawn_error.stdout.trim().length > 0
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
function is_transient_status(status: number | undefined, spawn_error: unknown): boolean {
|
|
69
|
+
if (status === undefined) return !has_answer(spawn_error)
|
|
70
|
+
|
|
71
|
+
return status >= SERVER_ERROR_FLOOR
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// A spawn no wait can change: one it killed on its budget, or one gh refused before asking.
|
|
75
|
+
function is_final_spawn(spawn_error: unknown): boolean {
|
|
76
|
+
return has_timed_out(spawn_error) || get_exit_code(spawn_error) === GH_AUTH_REQUIRED_EXIT_CODE
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
function is_transient(error: unknown): boolean {
|
|
80
|
+
const failure = gh_failure.failure_of(error)
|
|
81
|
+
|
|
82
|
+
if (failure === undefined || !(error instanceof Error)) return false
|
|
83
|
+
|
|
84
|
+
const status = failure.status ?? summary_status(error)
|
|
85
|
+
|
|
86
|
+
return !is_final_spawn(error.cause) && is_transient_status(status, error.cause)
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
function first_line(error: unknown): string {
|
|
90
|
+
return error_text.message_of(error).split('\n', 1)[0] ?? ''
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
function retry_note(error: unknown, attempt: number, wait_ms: number): string {
|
|
94
|
+
const ordinal = `${String(attempt)}/${String(MAX_ATTEMPTS)}`
|
|
95
|
+
|
|
96
|
+
return `gh: request failed transiently (attempt ${ordinal}: ${first_line(error)}) — retrying in ${String(wait_ms)} ms`
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// The wait before asking again, or `undefined` when this failure is final — not transient, or the
|
|
100
|
+
// last attempt spent.
|
|
101
|
+
function retry_delay(error: unknown, attempt: number): number | undefined {
|
|
102
|
+
return is_transient(error) ? RETRY_DELAYS_MS[attempt - 1] : undefined
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// The line a request transient to its last attempt leaves on stderr, naming the failure by the first
|
|
106
|
+
// line of its message: a stopped `josh ship` stage that ended on that failure reads it as the
|
|
107
|
+
// infrastructure (joshuafolkken/kit#5052). A recovered retry writes none.
|
|
108
|
+
function spent_note(message: string): string {
|
|
109
|
+
return `${SPENT_NOTE} (${message})`
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
function note_spent(error: unknown, attempt: number, hooks: RetryHooks): void {
|
|
113
|
+
if (attempt === MAX_ATTEMPTS && is_transient(error)) hooks.note(spent_note(first_line(error)))
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
async function with_retry<T>(
|
|
117
|
+
request: () => Promise<T>,
|
|
118
|
+
hooks: RetryHooks = DEFAULT_HOOKS,
|
|
119
|
+
attempt = 1,
|
|
120
|
+
): Promise<T> {
|
|
121
|
+
try {
|
|
122
|
+
return await request()
|
|
123
|
+
} catch (error) {
|
|
124
|
+
const wait_ms = retry_delay(error, attempt)
|
|
125
|
+
|
|
126
|
+
if (wait_ms === undefined) {
|
|
127
|
+
note_spent(error, attempt, hooks)
|
|
128
|
+
throw error
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
hooks.note(retry_note(error, attempt, wait_ms))
|
|
132
|
+
await hooks.wait(wait_ms)
|
|
133
|
+
|
|
134
|
+
return await with_retry(request, hooks, attempt + 1)
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
const gh_retry = { MAX_ATTEMPTS, RETRY_DELAYS_MS, is_transient, spent_note, with_retry }
|
|
139
|
+
|
|
140
|
+
export type { RetryHooks }
|
|
141
|
+
export { gh_retry }
|
|
@@ -7,6 +7,7 @@ import {
|
|
|
7
7
|
type ReviewComment,
|
|
8
8
|
} from './git-ai-review-scan'
|
|
9
9
|
import { git_gh_command } from './git-gh-command'
|
|
10
|
+
import { is_retry_pending, note_unreadable_stop } from './git-gh-comments-unreadable'
|
|
10
11
|
import { git_pr_confirmation, has_ignore_reason, type TelegramContext } from './git-pr-confirmation'
|
|
11
12
|
|
|
12
13
|
interface AiReviewPullComment {
|
|
@@ -132,6 +133,19 @@ const UNREADABLE_COMMENTS_BODY =
|
|
|
132
133
|
// never read the gate reports exactly like one that read it and found nothing.
|
|
133
134
|
const UNREADABLE_COMMENTS_NOTE = 'AI reviewer comments could not be read; the scan was bypassed.'
|
|
134
135
|
|
|
136
|
+
// An attempt the ship will run again sends no confirmation; the final one does (is_retry_pending).
|
|
137
|
+
async function confirm_unreadable_stop(context: TelegramContext): Promise<void> {
|
|
138
|
+
note_unreadable_stop()
|
|
139
|
+
if (is_retry_pending()) return
|
|
140
|
+
|
|
141
|
+
await git_pr_confirmation.notify_confirmation({
|
|
142
|
+
context,
|
|
143
|
+
body: UNREADABLE_COMMENTS_BODY,
|
|
144
|
+
recommended: 'Re-run `pnpm josh followup` once the comments can be read',
|
|
145
|
+
alternatives: [IGNORE_ALTERNATIVE],
|
|
146
|
+
})
|
|
147
|
+
}
|
|
148
|
+
|
|
135
149
|
async function handle_unreadable_comments(input: {
|
|
136
150
|
branch_name: string
|
|
137
151
|
ignore_reason: string | undefined
|
|
@@ -146,12 +160,7 @@ async function handle_unreadable_comments(input: {
|
|
|
146
160
|
return [UNREADABLE_COMMENTS_NOTE]
|
|
147
161
|
}
|
|
148
162
|
|
|
149
|
-
await
|
|
150
|
-
context: input.context,
|
|
151
|
-
body: UNREADABLE_COMMENTS_BODY,
|
|
152
|
-
recommended: 'Re-run `pnpm josh followup` once the comments can be read',
|
|
153
|
-
alternatives: [IGNORE_ALTERNATIVE],
|
|
154
|
-
})
|
|
163
|
+
await confirm_unreadable_stop(input.context)
|
|
155
164
|
|
|
156
165
|
throw new Error(UNREADABLE_COMMENTS_BODY)
|
|
157
166
|
}
|
|
@@ -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
|
|
@@ -255,6 +287,9 @@ class PrConflictError extends Error {
|
|
|
255
287
|
}
|
|
256
288
|
|
|
257
289
|
export {
|
|
290
|
+
FAILURE_MESSAGE_PREFIX,
|
|
291
|
+
FAILURE_REASON_CHECKS,
|
|
292
|
+
FAILURE_REASON_CONFLICT,
|
|
258
293
|
PrConflictError,
|
|
259
294
|
evaluate_pr_state,
|
|
260
295
|
is_auto_merge_blocked,
|
|
@@ -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 {
|