@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
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { readFile } from 'node:fs/promises'
|
|
2
|
+
import { yaml_document } from '#scripts/lib/yaml-document'
|
|
3
|
+
import { z } from 'zod'
|
|
4
|
+
|
|
5
|
+
// A job that only gathers others' results — kit's `Checks`, which `needs` the unit shards — ends
|
|
6
|
+
// `failure` beside a shard red on a test the change never touched, and its log names no test
|
|
7
|
+
// (joshuafolkken/kit#5171). It fails because of that shard alone, so it is rerun with it; the rerun
|
|
8
|
+
// endpoint reruns a failed job's dependents in any case. **The workflow's own `needs` says which job
|
|
9
|
+
// waits on which**, read from the checkout the pull request's head is.
|
|
10
|
+
//
|
|
11
|
+
// A job is known by the name a check run carries, which the workflow writes as a template: an
|
|
12
|
+
// expression in it matches anything, and a name with none gains the ` (<matrix values>)` suffix GitHub
|
|
13
|
+
// appends to a matrix job. A job no pattern matches — a reusable workflow's, a name built otherwise —
|
|
14
|
+
// is waited on by nothing here, so its failure is kept.
|
|
15
|
+
|
|
16
|
+
const EXPRESSION = /\$\{\{[^}]*\}\}/u
|
|
17
|
+
const EXPRESSION_MARK = '${{'
|
|
18
|
+
const ANY_TEXT = '.+'
|
|
19
|
+
const MATRIX_SUFFIX = String.raw`(?: \(.+\))?`
|
|
20
|
+
const REGEX_SPECIAL = /[$()*+.?[\\\]^{|}]/gu
|
|
21
|
+
|
|
22
|
+
const needs_schema = z.array(z.string())
|
|
23
|
+
|
|
24
|
+
const job_schema = z.looseObject({
|
|
25
|
+
name: z.string().optional(),
|
|
26
|
+
needs: z.union([z.string(), needs_schema]).optional(),
|
|
27
|
+
})
|
|
28
|
+
|
|
29
|
+
const workflow_schema = z.looseObject({ jobs: z.record(z.string(), job_schema) })
|
|
30
|
+
|
|
31
|
+
type WorkflowJobs = z.infer<typeof workflow_schema>['jobs']
|
|
32
|
+
|
|
33
|
+
interface JobNeeds {
|
|
34
|
+
pattern: RegExp
|
|
35
|
+
needs: ReadonlyArray<RegExp>
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
type NeedsGraph = ReadonlyArray<JobNeeds>
|
|
39
|
+
|
|
40
|
+
function escape(text: string): string {
|
|
41
|
+
return text.replaceAll(REGEX_SPECIAL, String.raw`\$&`)
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function name_pattern(id: string, name: string = id): RegExp {
|
|
45
|
+
const source = name.includes(EXPRESSION_MARK)
|
|
46
|
+
? name
|
|
47
|
+
.split(EXPRESSION)
|
|
48
|
+
.map((part) => escape(part))
|
|
49
|
+
.join(ANY_TEXT)
|
|
50
|
+
: `${escape(name)}${MATRIX_SUFFIX}`
|
|
51
|
+
|
|
52
|
+
return new RegExp(`^${source}$`, 'u')
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function needs_list(needs: string | ReadonlyArray<string> = []): ReadonlyArray<string> {
|
|
56
|
+
return typeof needs === 'string' ? [needs] : needs
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
function pattern_of(jobs: WorkflowJobs, id: string): RegExp {
|
|
60
|
+
return name_pattern(id, jobs[id]?.name)
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// The jobs of a workflow, each with the names of the jobs it needs; a workflow of another shape has
|
|
64
|
+
// none. YAML that does not parse throws, which `read_graph` answers as none.
|
|
65
|
+
function parse_graph(workflow: string): NeedsGraph {
|
|
66
|
+
const parsed = workflow_schema.safeParse(yaml_document.parse_yaml(workflow))
|
|
67
|
+
|
|
68
|
+
if (!parsed.success) return []
|
|
69
|
+
|
|
70
|
+
const { jobs } = parsed.data
|
|
71
|
+
|
|
72
|
+
return Object.entries(jobs).map(([id, job]) => ({
|
|
73
|
+
pattern: pattern_of(jobs, id),
|
|
74
|
+
needs: needs_list(job.needs).map((need) => pattern_of(jobs, need)),
|
|
75
|
+
}))
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// **Whether the job named `job_name` needs one of the jobs named in `upstream`.**
|
|
79
|
+
function is_waiting_on(
|
|
80
|
+
graph: NeedsGraph,
|
|
81
|
+
job_name: string,
|
|
82
|
+
upstream: ReadonlyArray<string>,
|
|
83
|
+
): boolean {
|
|
84
|
+
const needs = graph.filter(({ pattern }) => pattern.test(job_name)).flatMap((job) => job.needs)
|
|
85
|
+
|
|
86
|
+
return upstream.some((name) => needs.some((pattern) => pattern.test(name)))
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
async function read_graph(workflow_path: string): Promise<NeedsGraph> {
|
|
90
|
+
try {
|
|
91
|
+
return parse_graph(await readFile(workflow_path, 'utf8'))
|
|
92
|
+
} catch {
|
|
93
|
+
return []
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
const followup_job_needs = { is_waiting_on, parse_graph, read_graph }
|
|
98
|
+
|
|
99
|
+
export type { NeedsGraph }
|
|
100
|
+
export { followup_job_needs }
|
|
@@ -0,0 +1,303 @@
|
|
|
1
|
+
import { git_gh_api_path } from '#scripts/gh/git-gh-api-path'
|
|
2
|
+
import { git_gh_command } from '#scripts/gh/git-gh-command'
|
|
3
|
+
import { git_gh_exec } from '#scripts/gh/git-gh-exec'
|
|
4
|
+
import { git_gh_helpers } from '#scripts/gh/git-gh-helpers'
|
|
5
|
+
import { changed_paths } from '#scripts/git/changed-paths'
|
|
6
|
+
import { git_branch } from '#scripts/git/git-branch'
|
|
7
|
+
import { poll } from '#scripts/lib/poll'
|
|
8
|
+
import { z } from 'zod'
|
|
9
|
+
import {
|
|
10
|
+
followup_failed_tests,
|
|
11
|
+
KEPT_VERDICT,
|
|
12
|
+
RERUN_VERDICT,
|
|
13
|
+
UNNAMED_VERDICT,
|
|
14
|
+
type FailedTests,
|
|
15
|
+
type TestVerdict,
|
|
16
|
+
} from './followup-failed-tests'
|
|
17
|
+
import { followup_job_needs, type NeedsGraph } from './followup-job-needs'
|
|
18
|
+
import { followup_main_move } from './followup-main-move'
|
|
19
|
+
|
|
20
|
+
// A GitHub Actions job whose every step succeeded can still end `cancelled` or `timed_out`: the runner
|
|
21
|
+
// stops reporting after the last step and the job's `timeout-minutes` cuts it off (joshuafolkken/kit#4813,
|
|
22
|
+
// two 3-second jobs cut at 2m0s). Nothing in the change caused it, so `followup` reruns such a job once
|
|
23
|
+
// — as `git-gh-retry.ts` retries a GitHub 5xx — rather than failing a pull request that is green.
|
|
24
|
+
//
|
|
25
|
+
// **A job red only on tests outside the change is rerun the same way** (joshuafolkken/kit#5171): a test
|
|
26
|
+
// the diff never touched failing under runner load stopped `followup` and waited for a relaunched
|
|
27
|
+
// session to type the rerun by hand. Only the run's first attempt qualifies, so a test that fails again
|
|
28
|
+
// stops `followup` as before, and each such rerun leaves an observation (`followup-failed-tests.ts`).
|
|
29
|
+
// A job that failed only for waiting on such a job is rerun with it (`followup-job-needs.ts`).
|
|
30
|
+
//
|
|
31
|
+
// The rerun endpoint reruns **every** failed job of a run, and GitHub refuses it while the run is still
|
|
32
|
+
// going. So each run is waited out first, and it is rerun only when every job that failed in it
|
|
33
|
+
// qualifies: a run holding a job that failed on the change itself is never rerun, or a test the change
|
|
34
|
+
// broke could be retried into a merge.
|
|
35
|
+
|
|
36
|
+
const FAILURE_CONCLUSION = 'failure'
|
|
37
|
+
const FAILED_CONCLUSIONS = [FAILURE_CONCLUSION, 'cancelled', 'timed_out'] as const
|
|
38
|
+
const FAILED_JOB_CONCLUSIONS: ReadonlySet<string> = new Set(FAILED_CONCLUSIONS)
|
|
39
|
+
const ACTIONS_APP_SLUG = 'github-actions'
|
|
40
|
+
const PASSING_STEP_CONCLUSIONS: ReadonlySet<string> = new Set(['success', 'skipped'])
|
|
41
|
+
const RUN_COMPLETED = 'completed'
|
|
42
|
+
const FIRST_ATTEMPT = 1
|
|
43
|
+
|
|
44
|
+
// The longest `timeout-minutes` in `ci.yml` is 10; a run still going past that is not one a rerun helps.
|
|
45
|
+
const COMPLETE_ATTEMPTS = 40
|
|
46
|
+
const COMPLETE_INTERVAL_MS = 15_000
|
|
47
|
+
|
|
48
|
+
// The rerun answers once the new attempt exists, but its check runs can trail it; a re-judge that read
|
|
49
|
+
// the failed run again would fail on the very job just rerun.
|
|
50
|
+
const REGISTER_ATTEMPTS = 10
|
|
51
|
+
const REGISTER_INTERVAL_MS = 3000
|
|
52
|
+
|
|
53
|
+
const failed_check_schema = z.looseObject({
|
|
54
|
+
id: z.number(),
|
|
55
|
+
conclusion: z.enum(FAILED_CONCLUSIONS),
|
|
56
|
+
app: z.looseObject({ slug: z.literal(ACTIONS_APP_SLUG) }),
|
|
57
|
+
})
|
|
58
|
+
|
|
59
|
+
const rollup_schema = z.looseObject({ statusCheckRollup: z.array(z.unknown()) })
|
|
60
|
+
|
|
61
|
+
// REST answers `null` for a step that never finished; a test fixture may leave the field out.
|
|
62
|
+
const step_schema = z.looseObject({ conclusion: z.string().nullish() })
|
|
63
|
+
|
|
64
|
+
const job_schema = z.looseObject({
|
|
65
|
+
id: z.number(),
|
|
66
|
+
name: z.string(),
|
|
67
|
+
run_id: z.number(),
|
|
68
|
+
run_attempt: z.number().nullish(),
|
|
69
|
+
conclusion: z.string().nullish(),
|
|
70
|
+
steps: z.array(step_schema),
|
|
71
|
+
})
|
|
72
|
+
|
|
73
|
+
// `path` is the workflow file's, relative to the repository root.
|
|
74
|
+
const run_schema = z.looseObject({ status: z.string(), path: z.string().optional() })
|
|
75
|
+
|
|
76
|
+
const jobs_page_schema = z.looseObject({ jobs: z.array(job_schema) })
|
|
77
|
+
|
|
78
|
+
type Job = z.infer<typeof job_schema>
|
|
79
|
+
|
|
80
|
+
// A failed job and what its reading says, with the failed tests when its log named some.
|
|
81
|
+
interface Judged {
|
|
82
|
+
job: Job
|
|
83
|
+
verdict: TestVerdict
|
|
84
|
+
tests?: FailedTests
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
function actions_api_path(rest: string): string {
|
|
88
|
+
return `${git_gh_api_path.repo_api_path()}/actions/${rest}`
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
async function read_actions<T>(rest: string, schema: z.ZodType<T>): Promise<T> {
|
|
92
|
+
const json = await git_gh_exec.exec_gh_api({ path: actions_api_path(rest) })
|
|
93
|
+
|
|
94
|
+
return schema.parse(JSON.parse(json))
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
async function read_failed_check_ids(branch_name: string): Promise<Array<number>> {
|
|
98
|
+
const { snapshot_json } = await git_gh_command.pr_get_checks_snapshot(branch_name)
|
|
99
|
+
const rollup = rollup_schema.parse(JSON.parse(snapshot_json)).statusCheckRollup
|
|
100
|
+
|
|
101
|
+
return rollup.flatMap((item) => {
|
|
102
|
+
const parsed = failed_check_schema.safeParse(item)
|
|
103
|
+
|
|
104
|
+
return parsed.success ? parsed.data.id : []
|
|
105
|
+
})
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
// A check run of GitHub Actions has its job's id, which is how the job — and so its run — is found.
|
|
109
|
+
async function read_failed_run_ids(branch_name: string): Promise<Array<number>> {
|
|
110
|
+
const ids = await read_failed_check_ids(branch_name)
|
|
111
|
+
const jobs = await Promise.all(
|
|
112
|
+
ids.map(async (id) => await read_actions(`jobs/${String(id)}`, job_schema)),
|
|
113
|
+
)
|
|
114
|
+
|
|
115
|
+
return [...new Set(jobs.map((job) => job.run_id))]
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
async function is_run_completed(run_id: number): Promise<boolean> {
|
|
119
|
+
const run = await read_actions(`runs/${String(run_id)}`, run_schema)
|
|
120
|
+
|
|
121
|
+
return run.status === RUN_COMPLETED
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
async function await_run_completed(run_id: number): Promise<boolean> {
|
|
125
|
+
return await poll.poll_until(async () => await is_run_completed(run_id), {
|
|
126
|
+
attempts: COMPLETE_ATTEMPTS,
|
|
127
|
+
interval_ms: COMPLETE_INTERVAL_MS,
|
|
128
|
+
})
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
function has_every_step_passed(job: Job): boolean {
|
|
132
|
+
if (job.steps.length === 0) return false
|
|
133
|
+
|
|
134
|
+
return job.steps.every((step) => PASSING_STEP_CONCLUSIONS.has(step.conclusion ?? ''))
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
function is_first_failure(job: Job): boolean {
|
|
138
|
+
return (
|
|
139
|
+
job.conclusion === FAILURE_CONCLUSION && (job.run_attempt ?? FIRST_ATTEMPT) <= FIRST_ATTEMPT
|
|
140
|
+
)
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
// A job whose every step passed stopped on the runner; one red on its first attempt is judged by the
|
|
144
|
+
// failed tests its log names. The log endpoint redirects to the plain text, which `gh api` follows; a
|
|
145
|
+
// vitest log is colored.
|
|
146
|
+
async function judge_job(job: Job, changed: ReadonlySet<string>): Promise<Judged> {
|
|
147
|
+
if (has_every_step_passed(job)) return { job, verdict: RERUN_VERDICT }
|
|
148
|
+
if (!is_first_failure(job)) return { job, verdict: KEPT_VERDICT }
|
|
149
|
+
|
|
150
|
+
const log = await git_gh_exec.exec_gh_api({
|
|
151
|
+
path: actions_api_path(`jobs/${String(job.id)}/logs`),
|
|
152
|
+
should_allow_escapes: true,
|
|
153
|
+
})
|
|
154
|
+
const tests = followup_failed_tests.read_failed_tests(log)
|
|
155
|
+
|
|
156
|
+
return { job, verdict: followup_failed_tests.verdict_of(tests, changed), tests }
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
function is_red_on_tests({ verdict, tests }: Judged): boolean {
|
|
160
|
+
return verdict === RERUN_VERDICT && tests !== undefined
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
// A job red with no test named qualifies only as one waiting on a job red on tests outside the change.
|
|
164
|
+
function settle_unnamed(judged: ReadonlyArray<Judged>, graph: NeedsGraph): Array<Judged> {
|
|
165
|
+
const red_on_tests = judged.filter((entry) => is_red_on_tests(entry)).map(({ job }) => job.name)
|
|
166
|
+
|
|
167
|
+
return judged.map((entry) => {
|
|
168
|
+
if (entry.verdict !== UNNAMED_VERDICT) return entry
|
|
169
|
+
|
|
170
|
+
const is_waiting = followup_job_needs.is_waiting_on(graph, entry.job.name, red_on_tests)
|
|
171
|
+
|
|
172
|
+
return is_waiting ? { job: entry.job, verdict: RERUN_VERDICT } : entry
|
|
173
|
+
})
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
// The workflow is read only when a job named no test; a run without its `path` waits on nothing.
|
|
177
|
+
async function read_needs_graph(
|
|
178
|
+
run_id: number,
|
|
179
|
+
judged: ReadonlyArray<Judged>,
|
|
180
|
+
): Promise<NeedsGraph> {
|
|
181
|
+
if (judged.every(({ verdict }) => verdict !== UNNAMED_VERDICT)) return []
|
|
182
|
+
|
|
183
|
+
const run = await read_actions(`runs/${String(run_id)}`, run_schema)
|
|
184
|
+
|
|
185
|
+
return run.path === undefined ? [] : await followup_job_needs.read_graph(run.path)
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
// **The jobs the rerun would retry**, or `undefined` when the run must not be rerun: still going, or
|
|
189
|
+
// holding a failed job that does not qualify.
|
|
190
|
+
async function read_rerun_jobs(
|
|
191
|
+
run_id: number,
|
|
192
|
+
changed: ReadonlySet<string>,
|
|
193
|
+
): Promise<Array<Judged> | undefined> {
|
|
194
|
+
if (!(await await_run_completed(run_id))) return undefined
|
|
195
|
+
const { jobs } = await read_actions(
|
|
196
|
+
`runs/${String(run_id)}/jobs?filter=latest&per_page=100`,
|
|
197
|
+
jobs_page_schema,
|
|
198
|
+
)
|
|
199
|
+
const failed = jobs.filter((job) => FAILED_JOB_CONCLUSIONS.has(job.conclusion ?? ''))
|
|
200
|
+
const judged = await Promise.all(failed.map(async (job) => await judge_job(job, changed)))
|
|
201
|
+
const settled = settle_unnamed(judged, await read_needs_graph(run_id, judged))
|
|
202
|
+
|
|
203
|
+
return settled.every(({ verdict }) => verdict === RERUN_VERDICT) ? settled : undefined
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
// One request per run, not retried: a rerun that landed before a transient failure would be refused
|
|
207
|
+
// the second time.
|
|
208
|
+
async function rerun_runs(run_ids: ReadonlyArray<number>): Promise<void> {
|
|
209
|
+
await Promise.all(
|
|
210
|
+
run_ids.map(
|
|
211
|
+
async (run_id) =>
|
|
212
|
+
await git_gh_exec.exec_gh_api({
|
|
213
|
+
path: actions_api_path(`runs/${String(run_id)}/rerun-failed-jobs`),
|
|
214
|
+
method: 'POST',
|
|
215
|
+
should_retry: false,
|
|
216
|
+
}),
|
|
217
|
+
),
|
|
218
|
+
)
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
async function await_rerun_registered(
|
|
222
|
+
branch_name: string,
|
|
223
|
+
jobs: ReadonlyArray<Job>,
|
|
224
|
+
): Promise<void> {
|
|
225
|
+
const rerun_ids = new Set(jobs.map((job) => job.id))
|
|
226
|
+
|
|
227
|
+
await poll.poll_until(
|
|
228
|
+
async () => {
|
|
229
|
+
const failed = await read_failed_check_ids(branch_name)
|
|
230
|
+
|
|
231
|
+
return failed.every((id) => !rerun_ids.has(id))
|
|
232
|
+
},
|
|
233
|
+
{ attempts: REGISTER_ATTEMPTS, interval_ms: REGISTER_INTERVAL_MS },
|
|
234
|
+
)
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
// Every run must qualify: rerunning some would still leave the pull request red on the others. The
|
|
238
|
+
// change is read once, and only when a run failed.
|
|
239
|
+
async function find_rerun_jobs(branch_name: string): Promise<Array<Judged>> {
|
|
240
|
+
const run_ids = await read_failed_run_ids(branch_name)
|
|
241
|
+
|
|
242
|
+
if (run_ids.length === 0) return []
|
|
243
|
+
|
|
244
|
+
const changed = new Set(await changed_paths.read_changed_paths(false))
|
|
245
|
+
const per_run = await Promise.all(
|
|
246
|
+
run_ids.map(async (run_id) => await read_rerun_jobs(run_id, changed)),
|
|
247
|
+
)
|
|
248
|
+
|
|
249
|
+
return per_run.every((jobs) => jobs !== undefined) ? per_run.flat() : []
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
async function rerun(branch_name: string, entries: ReadonlyArray<Judged>): Promise<Array<string>> {
|
|
253
|
+
const jobs = entries.map(({ job }) => job)
|
|
254
|
+
const names = jobs.map((job) => job.name)
|
|
255
|
+
|
|
256
|
+
console.info(
|
|
257
|
+
`🔁 Rerunning CI jobs that stopped after every step passed or failed only outside the change: ${names.join(', ')}`,
|
|
258
|
+
)
|
|
259
|
+
await followup_failed_tests.record(
|
|
260
|
+
entries.flatMap(({ job, tests }) => (tests === undefined ? [] : { job: job.name, tests })),
|
|
261
|
+
git_branch.issue_from_branch(branch_name),
|
|
262
|
+
)
|
|
263
|
+
await rerun_runs([...new Set(jobs.map((job) => job.run_id))])
|
|
264
|
+
await await_rerun_registered(branch_name, jobs)
|
|
265
|
+
|
|
266
|
+
return names
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
// A failed test main has since changed is merged before any rerun (`followup-main-move.ts`).
|
|
270
|
+
async function should_merge_first(
|
|
271
|
+
branch_name: string,
|
|
272
|
+
entries: ReadonlyArray<Judged>,
|
|
273
|
+
): Promise<boolean> {
|
|
274
|
+
const files = [...new Set(entries.flatMap(({ tests }) => tests?.files ?? []))]
|
|
275
|
+
|
|
276
|
+
return await followup_main_move.should_merge_first(
|
|
277
|
+
files,
|
|
278
|
+
git_branch.issue_from_branch(branch_name),
|
|
279
|
+
)
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
// **Returns the names of the jobs it reran**, empty when there was none to rerun or main has to be
|
|
283
|
+
// merged first. A read or a rerun that fails is reported and answers empty: the rerun is a recovery,
|
|
284
|
+
// so the original failure stands.
|
|
285
|
+
async function rerun_failed_jobs(branch_name: string): Promise<Array<string>> {
|
|
286
|
+
try {
|
|
287
|
+
const entries = await find_rerun_jobs(branch_name)
|
|
288
|
+
|
|
289
|
+
if (entries.length === 0 || (await should_merge_first(branch_name, entries))) return []
|
|
290
|
+
|
|
291
|
+
return await rerun(branch_name, entries)
|
|
292
|
+
} catch (error) {
|
|
293
|
+
console.info(`⚠️ CI job rerun failed: ${git_gh_helpers.get_error_message_with_stderr(error)}`)
|
|
294
|
+
|
|
295
|
+
return []
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
const followup_job_rerun = {
|
|
300
|
+
rerun_failed_jobs,
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
export { followup_job_rerun, COMPLETE_ATTEMPTS, REGISTER_ATTEMPTS }
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { git_command } from '#scripts/git/git-command'
|
|
2
|
+
import { main_merge_guard } from '#scripts/git/main-merge-guard'
|
|
3
|
+
import type { ObservationEntry } from '#scripts/observations/observation-record'
|
|
4
|
+
import { followup_failed_tests } from './followup-failed-tests'
|
|
5
|
+
|
|
6
|
+
// **A test red outside the change that main has since changed is merged, not rerun**
|
|
7
|
+
// (joshuafolkken/kit#5316): a date-bound test fixed on main went red on a lane still on the old base,
|
|
8
|
+
// and the rerun on that base was red again before `merge_again` (`run-ship-sync.ts`) took main in. So
|
|
9
|
+
// before a rerun, a failed test whose file or subject module (`followup_failed_tests.subjects_of`) main
|
|
10
|
+
// moved since the branch point skips it: `followup` fails as before and ship's merge, gate and push go
|
|
11
|
+
// first. The rerun right is unspent, and after the merge the same file is no longer incoming, so a
|
|
12
|
+
// test still red is rerun once as before.
|
|
13
|
+
|
|
14
|
+
const OBSERVATION_SLUG = 'followup-main-merge-first'
|
|
15
|
+
const OBSERVATION_DEPTH = 'd1'
|
|
16
|
+
const LATEST_COMMIT = 1
|
|
17
|
+
const SHORT_SHA_LENGTH = 12
|
|
18
|
+
|
|
19
|
+
interface MainMove {
|
|
20
|
+
files: ReadonlyArray<string>
|
|
21
|
+
commit: string
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
// A failed test file beside the path main moved for it: the file itself or its subject module.
|
|
25
|
+
interface MovedTest {
|
|
26
|
+
file: string
|
|
27
|
+
moved: string
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function moved_tests(
|
|
31
|
+
test_files: ReadonlyArray<string>,
|
|
32
|
+
incoming: ReadonlySet<string>,
|
|
33
|
+
): Array<MovedTest> {
|
|
34
|
+
return test_files.flatMap((file) => {
|
|
35
|
+
const moved = followup_failed_tests.subjects_of(file).find((subject) => incoming.has(subject))
|
|
36
|
+
|
|
37
|
+
return moved === undefined ? [] : { file, moved }
|
|
38
|
+
})
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// The main-side commit is the latest on main's own line that touched the first moved path.
|
|
42
|
+
async function latest_commit(file: string, main_reference: string): Promise<string> {
|
|
43
|
+
const [commit] = await git_command.log_first_parent(LATEST_COMMIT, file, main_reference)
|
|
44
|
+
|
|
45
|
+
return commit ?? main_reference
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// **The failed test files main moved since the branch point**, `undefined` when main did not move or
|
|
49
|
+
// moved none of them. The fetch is what makes `origin/<default>` current, as `main_merge.merge` does.
|
|
50
|
+
async function read_main_move(test_files: ReadonlyArray<string>): Promise<MainMove | undefined> {
|
|
51
|
+
if (test_files.length === 0) return undefined
|
|
52
|
+
|
|
53
|
+
const default_branch = await git_command.get_default_branch()
|
|
54
|
+
|
|
55
|
+
await git_command.fetch_branch(default_branch)
|
|
56
|
+
|
|
57
|
+
const incoming = new Set(await main_merge_guard.incoming_paths(default_branch))
|
|
58
|
+
const moved = moved_tests(test_files, incoming)
|
|
59
|
+
const [first] = moved
|
|
60
|
+
|
|
61
|
+
if (first === undefined) return undefined
|
|
62
|
+
|
|
63
|
+
return {
|
|
64
|
+
files: moved.map(({ file }) => file),
|
|
65
|
+
commit: await latest_commit(first.moved, `origin/${default_branch}`),
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
function observation_of(move: MainMove): ObservationEntry {
|
|
70
|
+
return {
|
|
71
|
+
slug: OBSERVATION_SLUG,
|
|
72
|
+
depth: OBSERVATION_DEPTH,
|
|
73
|
+
where: move.files.join(', '),
|
|
74
|
+
what: `followup put the main merge before the rerun; the failed test moved on main at ${move.commit.slice(0, SHORT_SHA_LENGTH)}`,
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// A fetch or read that fails is reported and keeps the rerun: the merge is the shortcut, the rerun the
|
|
79
|
+
// recovery that stood before it.
|
|
80
|
+
async function read_or_rerun(test_files: ReadonlyArray<string>): Promise<MainMove | undefined> {
|
|
81
|
+
try {
|
|
82
|
+
return await read_main_move(test_files)
|
|
83
|
+
} catch (error) {
|
|
84
|
+
console.info(`⚠️ Could not compare the failed tests with main, rerunning: ${String(error)}`)
|
|
85
|
+
|
|
86
|
+
return undefined
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// **Whether the rerun is skipped for a merge of main**, with the reason posted on the issue.
|
|
91
|
+
async function should_merge_first(
|
|
92
|
+
test_files: ReadonlyArray<string>,
|
|
93
|
+
issue: number | undefined,
|
|
94
|
+
): Promise<boolean> {
|
|
95
|
+
const move = await read_or_rerun(test_files)
|
|
96
|
+
|
|
97
|
+
if (move === undefined) return false
|
|
98
|
+
|
|
99
|
+
console.info(
|
|
100
|
+
`🔀 Not rerunning: main changed the failed tests since the branch point (${move.files.join(', ')}); merge main first.`,
|
|
101
|
+
)
|
|
102
|
+
await followup_failed_tests.record_entry(observation_of(move), issue)
|
|
103
|
+
|
|
104
|
+
return true
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
const followup_main_move = {
|
|
108
|
+
read_main_move,
|
|
109
|
+
should_merge_first,
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
export type { MainMove }
|
|
113
|
+
export { followup_main_move, OBSERVATION_SLUG }
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { issue_number_shape } from '#scripts/issue/issue-number-shape'
|
|
2
|
+
import { issue_watch_gate } from '#scripts/issue/issue-watch-gate'
|
|
3
|
+
import { review_attest } from '#scripts/review/review-attest'
|
|
4
|
+
import { review_interaction } from '#scripts/review/review-interaction'
|
|
5
|
+
import { review_record } from '#scripts/review/review-record'
|
|
6
|
+
|
|
7
|
+
// The merge gates over the review rounds — that the review read its own checkout, and that each round
|
|
8
|
+
// the change owes left its ledger line. `git-followup-workflow.ts` runs them first, before the gates over
|
|
9
|
+
// the pull request body.
|
|
10
|
+
|
|
11
|
+
// `/code-review` is forked by the harness and inherits the *session's* working directory, so a run
|
|
12
|
+
// implementing in a lane can be reviewed against a different tree entirely — one holding the
|
|
13
|
+
// previous child's already-merged code. That review finds nothing wrong and says so, and the run
|
|
14
|
+
// would read the silence as a clean round. **This is the seam where that is caught**: a merge is
|
|
15
|
+
// refused unless the review attested the checkout it was briefed on.
|
|
16
|
+
//
|
|
17
|
+
// **Absence is a refusal, not a pass.** The defect produces *no* signal, so a check that only
|
|
18
|
+
// compared two present records would answer `ok` in exactly the state it exists to catch.
|
|
19
|
+
//
|
|
20
|
+
// **Scoped to a checkout that actually briefed a review.** `review_attest.check` answers
|
|
21
|
+
// `not-required` where no `josh review:brief` was run here inside a run's lifetime, so a project or
|
|
22
|
+
// a flow that does not use the brief merges exactly as it did before.
|
|
23
|
+
//
|
|
24
|
+
// The direction is deliberate: a wrongly-refused merge costs one re-run of the review, and a wrongly
|
|
25
|
+
// allowed one ships a diff nobody read. Thrown rather than reported, so no `completion` Telegram is
|
|
26
|
+
// sent and nothing merges — `git_pr_followup.run` is never reached.
|
|
27
|
+
// `ok` means the guard was satisfied and `not-required` means it never applied to this checkout —
|
|
28
|
+
// both let the merge proceed, so the two gates below read the verdict through one predicate rather
|
|
29
|
+
// than repeating the pair of statuses.
|
|
30
|
+
function is_merge_permitted(status: string): boolean {
|
|
31
|
+
return status === 'ok' || status === 'not-required'
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
function is_valid_issue(issue_number: string | undefined): issue_number is string {
|
|
35
|
+
return issue_number !== undefined && issue_number_shape.ISSUE_NUMBER_PATTERN.test(issue_number)
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
async function assert_review_attested(should_merge: boolean): Promise<void> {
|
|
39
|
+
if (!should_merge) return
|
|
40
|
+
|
|
41
|
+
const verdict = await review_attest.check_here()
|
|
42
|
+
|
|
43
|
+
if (!is_merge_permitted(verdict.status)) throw new Error(review_attest.refusal_message(verdict))
|
|
44
|
+
|
|
45
|
+
const refusal = await issue_watch_gate.review_refusal_here()
|
|
46
|
+
|
|
47
|
+
if (refusal !== undefined) throw new Error(refusal)
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// Recording a review round as a prose request leaves the recurrence ledger blind whenever it is
|
|
51
|
+
// skipped. **This is the seam where it is a gate instead**: a merge is refused unless the round left
|
|
52
|
+
// a `- rf:` line for its issue, a zero-finding `none` line included — and, for a change to the run
|
|
53
|
+
// tooling, unless the interaction review left its `- ri:` line too (joshuafolkken/kit#4276).
|
|
54
|
+
//
|
|
55
|
+
// **Absence is a refusal, `missing` exactly as `assert_review_attested`'s is** — the defect this
|
|
56
|
+
// exists for produces *no* line, so silence must not read as success. A checkout that keeps no ledger
|
|
57
|
+
// answers `not-required` and merges as before, and a run whose issue the followup cannot identify has
|
|
58
|
+
// no key to check, so it carries on rather than blocking on missing information.
|
|
59
|
+
async function assert_review_recorded(
|
|
60
|
+
should_merge: boolean,
|
|
61
|
+
issue_number: string | undefined,
|
|
62
|
+
): Promise<void> {
|
|
63
|
+
if (!should_merge || !is_valid_issue(issue_number)) return
|
|
64
|
+
|
|
65
|
+
const issue = Number(issue_number)
|
|
66
|
+
const verdict = await review_record.check(issue)
|
|
67
|
+
|
|
68
|
+
if (!is_merge_permitted(verdict.status)) throw new Error(review_record.refusal_message(issue))
|
|
69
|
+
|
|
70
|
+
const refusal = await review_interaction.refusal(issue)
|
|
71
|
+
|
|
72
|
+
if (refusal !== undefined) throw new Error(refusal)
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
const followup_review_gates = {
|
|
76
|
+
assert_review_attested,
|
|
77
|
+
assert_review_recorded,
|
|
78
|
+
is_valid_issue,
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
export { followup_review_gates }
|
|
@@ -7,6 +7,7 @@ import { run_progress_clock } from '#scripts/run/progress/run-progress-clock'
|
|
|
7
7
|
import { parse_completed_issue_number } from './followup-issue-number'
|
|
8
8
|
import { git_followup_cleanup, type CleanupStep } from './git-followup-cleanup'
|
|
9
9
|
import { git_followup_pending } from './git-followup-pending'
|
|
10
|
+
import { git_followup_stages } from './git-followup-stages'
|
|
10
11
|
|
|
11
12
|
// **The count of unreleased merges, not the project version**. The local `package.json` version
|
|
12
13
|
// reads as "the version this run just shipped", but children do not bump, so that number names the
|
|
@@ -17,38 +18,69 @@ import { git_followup_pending } from './git-followup-pending'
|
|
|
17
18
|
// Printed after the merge, and the count is read from a freshly fetched default branch — so this
|
|
18
19
|
// run's own merge is already in it and nothing here says otherwise, unlike the Telegram sent one step
|
|
19
20
|
// earlier from a tree the merge had not reached.
|
|
20
|
-
async function
|
|
21
|
+
async function read_pending_release(): Promise<ReadonlyArray<string>> {
|
|
21
22
|
const line = await git_followup_pending.pending_release_line({ is_merge_pending: false })
|
|
22
23
|
|
|
23
|
-
|
|
24
|
+
return line === undefined ? [] : [line]
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
async function print_pending_release(): Promise<void> {
|
|
28
|
+
const lines = await read_pending_release()
|
|
29
|
+
|
|
30
|
+
for (const line of lines) console.info(line)
|
|
24
31
|
}
|
|
25
32
|
|
|
26
33
|
// #821: surface what to run next right where the completion is read. Printed before the project
|
|
27
34
|
// version line, which stays the final line of the console output by contract.
|
|
28
|
-
|
|
29
|
-
|
|
35
|
+
//
|
|
36
|
+
// Merged runs only, like the epic auto-close: on `--no-merge` the linked issue is still open
|
|
37
|
+
// and still the current task, so a "next" list would hide the one issue that matters.
|
|
38
|
+
async function read_next_issues(
|
|
39
|
+
completed_issue_number: string | undefined,
|
|
40
|
+
should_merge: boolean,
|
|
41
|
+
): Promise<ReadonlyArray<string>> {
|
|
42
|
+
if (!should_merge) return []
|
|
43
|
+
|
|
44
|
+
return await git_next_issues.fetch_next_issue_lines(
|
|
30
45
|
parse_completed_issue_number(completed_issue_number),
|
|
31
46
|
)
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
async function print_next_issues(completed_issue_number: string | undefined): Promise<void> {
|
|
50
|
+
const lines = await read_next_issues(completed_issue_number, true)
|
|
51
|
+
|
|
32
52
|
for (const line of lines) console.info(line)
|
|
33
53
|
}
|
|
34
54
|
|
|
35
|
-
// The tail printed once the workflow itself has finished. `print_pending_release` stays last
|
|
36
|
-
// contract, so anything added here goes above it.
|
|
55
|
+
// The tail printed once the workflow itself has finished. `print_pending_release`'s line stays last
|
|
56
|
+
// by contract, so anything added here goes above it.
|
|
57
|
+
//
|
|
58
|
+
// **The two reads need nothing from one another, so they go out together** (#5131), and the time
|
|
59
|
+
// they take is printed as a `completion` stage row: the stage block is already out by now, and an
|
|
60
|
+
// untimed tail is the fixed cost `josh ship --log` could not see. The row goes above the completion
|
|
61
|
+
// lines, because the pending-release line is the one that has to stay last.
|
|
37
62
|
async function print_completion(
|
|
38
63
|
issue_number: string | undefined,
|
|
39
64
|
should_merge: boolean,
|
|
40
65
|
): Promise<void> {
|
|
66
|
+
const started_ms = performance.now()
|
|
67
|
+
const [next_lines, release_lines] = await Promise.all([
|
|
68
|
+
read_next_issues(issue_number, should_merge),
|
|
69
|
+
read_pending_release(),
|
|
70
|
+
])
|
|
71
|
+
const duration_ms = performance.now() - started_ms
|
|
72
|
+
|
|
73
|
+
console.info(
|
|
74
|
+
git_followup_stages.format_stage({ name: git_followup_stages.STAGE.completion, duration_ms }),
|
|
75
|
+
)
|
|
41
76
|
console.info('')
|
|
42
77
|
console.info('✅ PR followup completed.')
|
|
43
|
-
|
|
44
|
-
// and still the current task, so a "next" list would hide the one issue that matters.
|
|
45
|
-
if (should_merge) await print_next_issues(issue_number)
|
|
46
|
-
await print_pending_release()
|
|
78
|
+
for (const line of [...next_lines, ...release_lines]) console.info(line)
|
|
47
79
|
}
|
|
48
80
|
|
|
49
81
|
// A **merged** run ends here, and the round-1 review snapshot's lifetime is one run.
|
|
50
82
|
// `--no-merge` is not the end of one — the pull request is still open and
|
|
51
|
-
// the issue is still the current task, the same line `
|
|
83
|
+
// the issue is still the current task, the same line `read_next_issues` and the epic auto-close
|
|
52
84
|
// already draw — and clearing there would be the unsafe direction: the next round-1 brief would find
|
|
53
85
|
// no record and write a fresh one against the already-fixed tree, which is the arm-A skip over
|
|
54
86
|
// unreviewed fix code the record exists to prevent.
|