@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
|
@@ -2,9 +2,11 @@ import { stripVTControlCharacters } from 'node:util'
|
|
|
2
2
|
import { agent_role_profile } from '#scripts/agent/agent-role-profile'
|
|
3
3
|
import { changed_paths } from '#scripts/git/changed-paths'
|
|
4
4
|
import { stamp_file } from '#scripts/josh/stamp-file'
|
|
5
|
+
import { review_prior_findings } from '#scripts/review/review-prior-findings'
|
|
5
6
|
import { z } from 'zod'
|
|
6
7
|
import { run_ship_next } from './run-ship-next'
|
|
7
8
|
import { run_ship_probe } from './run-ship-probe'
|
|
9
|
+
import type { StopFinding } from './run-ship-review'
|
|
8
10
|
|
|
9
11
|
// What a relaunched lane child needs in front of it to fix a stopped ship: the tail of the failed
|
|
10
12
|
// stage's output — a red check, or the High/Medium findings a review stage reports — and the branch's
|
|
@@ -14,6 +16,9 @@ import { run_ship_probe } from './run-ship-probe'
|
|
|
14
16
|
// **Both are bounded**, so a long gate log never becomes the whole prompt. The tail is kept because a
|
|
15
17
|
// check reports its verdict last; the lines left out go to a file whose path and line range the prompt
|
|
16
18
|
// names, so nothing is lost and the session reads only the range it needs.
|
|
19
|
+
//
|
|
20
|
+
// **A review stop also carries the lane's earlier findings on the files it cites** (joshuafolkken/kit#4780),
|
|
21
|
+
// so the fix meets the constraint an earlier round set on the same line rather than breaking it.
|
|
17
22
|
|
|
18
23
|
const EXCERPT_LINE_LIMIT = 40
|
|
19
24
|
const EXCERPT_LINE_WIDTH = 240
|
|
@@ -33,6 +38,7 @@ const stop_context_schema = z
|
|
|
33
38
|
omitted: omitted_schema.optional(),
|
|
34
39
|
changed: z.array(z.string()).readonly().optional(),
|
|
35
40
|
more_changed: z.number().int(),
|
|
41
|
+
prior: z.array(z.string()).readonly().optional(),
|
|
36
42
|
})
|
|
37
43
|
.strict()
|
|
38
44
|
|
|
@@ -121,8 +127,18 @@ async function changed_of(): Promise<Pick<StopContext, 'changed' | 'more_changed
|
|
|
121
127
|
}
|
|
122
128
|
}
|
|
123
129
|
|
|
124
|
-
async function build(
|
|
125
|
-
|
|
130
|
+
async function build(
|
|
131
|
+
issue: string,
|
|
132
|
+
output: string,
|
|
133
|
+
findings: ReadonlyArray<StopFinding> = [],
|
|
134
|
+
): Promise<StopContext> {
|
|
135
|
+
const prior = review_prior_findings.on_files(issue, findings)
|
|
136
|
+
|
|
137
|
+
return {
|
|
138
|
+
...(await excerpt_of(issue, output)),
|
|
139
|
+
...(await changed_of()),
|
|
140
|
+
...(prior.length > 0 && { prior }),
|
|
141
|
+
}
|
|
126
142
|
}
|
|
127
143
|
|
|
128
144
|
function has_excerpt(context: StopContext | undefined): boolean {
|
|
@@ -168,17 +184,12 @@ function changed_text(context: StopContext): string {
|
|
|
168
184
|
return `Changed files on the branch: ${context.changed.join(', ')}${more}.`
|
|
169
185
|
}
|
|
170
186
|
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
issue: string,
|
|
178
|
-
context: StopContext,
|
|
179
|
-
budget: number = agent_role_profile.MAX_VALUE_LENGTH,
|
|
180
|
-
): string {
|
|
181
|
-
const changed = changed_text(context)
|
|
187
|
+
function trailer_text(context: StopContext): string {
|
|
188
|
+
return [changed_text(context), ...review_prior_findings.fix_lines(context.prior)].join(LINE_BREAK)
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
function fitted_block(issue: string, context: StopContext, budget: number): string {
|
|
192
|
+
const changed = trailer_text(context)
|
|
182
193
|
|
|
183
194
|
if (!has_excerpt(context)) return changed
|
|
184
195
|
|
|
@@ -193,6 +204,32 @@ function describe(
|
|
|
193
204
|
return block
|
|
194
205
|
}
|
|
195
206
|
|
|
207
|
+
function has_prior(context: StopContext): boolean {
|
|
208
|
+
return context.prior !== undefined && context.prior.length > 0
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
// The block the ship-stop prompt carries between the next command and the closing invocation.
|
|
212
|
+
//
|
|
213
|
+
// **It fits the `budget` the prompt leaves it** — the prompt is one argv element, kept within
|
|
214
|
+
// `MAX_VALUE_LENGTH` (joshuafolkken/kit#3964), well under the launch gate's prompt cap — by dropping
|
|
215
|
+
// the excerpt's head first, since a check
|
|
216
|
+
// reports its verdict last; the tail line always stays. Past that, the earlier findings go oldest first.
|
|
217
|
+
function describe(
|
|
218
|
+
issue: string,
|
|
219
|
+
context: StopContext,
|
|
220
|
+
budget: number = agent_role_profile.MAX_VALUE_LENGTH,
|
|
221
|
+
): string {
|
|
222
|
+
let fitted = context
|
|
223
|
+
let block = fitted_block(issue, fitted, budget)
|
|
224
|
+
|
|
225
|
+
while (block.length > budget && has_prior(fitted)) {
|
|
226
|
+
fitted = { ...fitted, prior: fitted.prior?.slice(1) }
|
|
227
|
+
block = fitted_block(issue, fitted, budget)
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
return block
|
|
231
|
+
}
|
|
232
|
+
|
|
196
233
|
const run_ship_stop_context = {
|
|
197
234
|
CHANGED_PATH_LIMIT,
|
|
198
235
|
EXCERPT_LINE_LIMIT,
|
|
@@ -1,15 +1,20 @@
|
|
|
1
1
|
import { issue_cite } from '#scripts/issue/issue-cite'
|
|
2
2
|
|
|
3
3
|
// The text a `josh ship` supervisor records when a stage stops, written and read in one place so the
|
|
4
|
-
// retrospective's per-stage count never drifts from the writer.
|
|
5
|
-
|
|
4
|
+
// retrospective's per-stage count never drifts from the writer. The cause rides in parentheses after
|
|
5
|
+
// `failed` (`run-ship-stop-cause.ts`); a text written before it had one reads back with none.
|
|
6
|
+
const STOP_PATTERN = /^#\d+ (?<reason>\S+) failed(?: \((?<cause>\S+)\))? — /u
|
|
6
7
|
|
|
7
|
-
function format(issue: string, reason: string): string {
|
|
8
|
-
return `${issue_cite.plain(issue)} ${reason} failed — pnpm josh ship --log ${issue}`
|
|
8
|
+
function format(issue: string, reason: string, cause: string): string {
|
|
9
|
+
return `${issue_cite.plain(issue)} ${reason} failed (${cause}) — pnpm josh ship --log ${issue}`
|
|
9
10
|
}
|
|
10
11
|
|
|
11
12
|
function reason_of(text: string): string | undefined {
|
|
12
|
-
return STOP_PATTERN.exec(text)?.[
|
|
13
|
+
return STOP_PATTERN.exec(text)?.groups?.['reason']
|
|
13
14
|
}
|
|
14
15
|
|
|
15
|
-
|
|
16
|
+
function cause_of(text: string): string | undefined {
|
|
17
|
+
return STOP_PATTERN.exec(text)?.groups?.['cause']
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export const run_ship_stop_text = { format, reason_of, cause_of }
|
|
@@ -1,21 +1,31 @@
|
|
|
1
1
|
import { git_gh_pr_read } from '#scripts/gh/git-gh-pr-read'
|
|
2
|
-
import {
|
|
2
|
+
import {
|
|
3
|
+
FAILURE_MESSAGE_PREFIX,
|
|
4
|
+
FAILURE_REASON_CHECKS,
|
|
5
|
+
FAILURE_REASON_CONFLICT,
|
|
6
|
+
} from '#scripts/gh/git-pr-checks-eval'
|
|
3
7
|
import { git_command } from '#scripts/git/git-command'
|
|
4
8
|
import { main_merge, type MergeOutcome } from '#scripts/git/main-merge'
|
|
9
|
+
import { pre_commit_lint_switch } from '#scripts/hooks/pre-commit-lint-switch'
|
|
10
|
+
import { pre_push_related_switch } from '#scripts/hooks/pre-push-related-switch'
|
|
5
11
|
import { josh_command, type JoshResult } from '#scripts/josh/josh-run'
|
|
6
12
|
import { error_text } from '#scripts/lib/error-message'
|
|
13
|
+
import { run_ship_lap } from './run-ship-lap'
|
|
7
14
|
import { run_ship_overlap } from './run-ship-overlap'
|
|
8
15
|
import { run_ship_scoped } from './run-ship-scoped'
|
|
16
|
+
import { run_ship_stop_cause, type Cause } from './run-ship-stop-cause'
|
|
9
17
|
|
|
10
18
|
// `josh ship` keeps the branch current with the default branch itself: a default branch that moves
|
|
11
19
|
// while the pull request opens and CI runs would otherwise stop the followup as `interrupted`, though
|
|
12
20
|
// merging the default branch again usually resolves it.
|
|
13
21
|
//
|
|
14
|
-
// So the merge happens mechanically:
|
|
15
|
-
//
|
|
16
|
-
//
|
|
22
|
+
// So the merge happens mechanically: before the gate (`sync_stage`), again before the push when the
|
|
23
|
+
// default branch moved since (`catch_up`), and when the followup fails after it moved again
|
|
24
|
+
// (`followup_stage`). A conflict only on
|
|
25
|
+
// the files `main-merge-regenerate.ts` lists is resolved by the merge itself; any other conflict
|
|
17
26
|
// stops the ship as `conflict`, naming the unmerged paths so the resumed session goes straight to them.
|
|
18
27
|
|
|
28
|
+
const { STEP, timed } = run_ship_lap
|
|
19
29
|
const should_forward_stderr = true
|
|
20
30
|
const SUCCESS_EXIT_CODE = 0
|
|
21
31
|
const FAILURE_EXIT_CODE = 1
|
|
@@ -26,13 +36,30 @@ const CONFLICT_NOTE = 'merging the default branch left unmerged paths:'
|
|
|
26
36
|
const DEFERRED_PREFIX = 'merge deferred to the followup: '
|
|
27
37
|
const CURRENT_SUFFIX = ' brings nothing in'
|
|
28
38
|
const MERGED_PREFIX = 'merged '
|
|
39
|
+
const MERGED_GATE_NOTE =
|
|
40
|
+
'the default branch moved since the sync; the tree merged with it fails the gate:'
|
|
41
|
+
const PUSHED_NOTE = 'pushed the merge ahead of the gate, so CI runs beside it'
|
|
42
|
+
const PUSH_FAILED_NOTE =
|
|
43
|
+
'the push ahead of the gate failed; the commit stage pushes after the gate:'
|
|
29
44
|
|
|
30
45
|
// A stage's result, plus the paths a stopped merge left unmerged — carried to the stop prompt.
|
|
31
46
|
// `is_skipped` marks a stage that found nothing to do — a review round with nothing to review, a gate
|
|
32
|
-
// that reused a green record — so its few seconds are not timed as a run of it.
|
|
47
|
+
// that reused a green record — so its few seconds are not timed as a run of it. `preconditions` names
|
|
48
|
+
// the kinds of the preconditions a stopped preflight found unmet (`run-ship-preflight.ts`). `cause` is the
|
|
49
|
+
// one a stopped stage tagged its stop with — a review round, or a red gate over a merged tree
|
|
50
|
+
// (`run-ship-stop-cause.ts`). `reason` says why the stage ran or was skipped, written on its event line
|
|
51
|
+
// (`run-ship-review-reason.ts`).
|
|
33
52
|
interface StepResult extends JoshResult {
|
|
34
53
|
is_skipped?: boolean
|
|
54
|
+
reason?: string
|
|
35
55
|
conflicts?: ReadonlyArray<string>
|
|
56
|
+
preconditions?: ReadonlyArray<string>
|
|
57
|
+
cause?: Cause
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// The push of a tree already committed, with no pull request touched.
|
|
61
|
+
function push_argv(title: string): ReadonlyArray<string> {
|
|
62
|
+
return ['git', '-y', '--skip-commit', '--skip-pr', title]
|
|
36
63
|
}
|
|
37
64
|
|
|
38
65
|
async function josh(argv: ReadonlyArray<string>): Promise<JoshResult> {
|
|
@@ -43,7 +70,7 @@ async function josh(argv: ReadonlyArray<string>): Promise<JoshResult> {
|
|
|
43
70
|
// changed, and the followup still finds a real conflict on GitHub's side.
|
|
44
71
|
async function merge_outcome(): Promise<MergeOutcome> {
|
|
45
72
|
try {
|
|
46
|
-
return await main_merge.merge()
|
|
73
|
+
return await timed(STEP.MERGE, async () => await main_merge.merge())
|
|
47
74
|
} catch (error) {
|
|
48
75
|
return { kind: 'refused', message: error_text.message_of(error) }
|
|
49
76
|
}
|
|
@@ -63,51 +90,161 @@ function sync_note(outcome: Exclude<MergeOutcome, { kind: 'conflict' }>): string
|
|
|
63
90
|
: `${MERGED_PREFIX}${outcome.branch}`
|
|
64
91
|
}
|
|
65
92
|
|
|
66
|
-
//
|
|
67
|
-
//
|
|
68
|
-
//
|
|
69
|
-
//
|
|
70
|
-
//
|
|
93
|
+
// Uncommitted work is committed locally first, never stashed: the merge guard refuses uncommitted work
|
|
94
|
+
// the default branch also touches, and a merge deferred past it met its conflict only after the gate,
|
|
95
|
+
// both review rounds and CI (joshuafolkken/kit#4708). The commit is not pushed here: a tree the sync
|
|
96
|
+
// leaves unmerged goes out at the commit stage once the gate is green (`push_ahead` pushes a merged
|
|
97
|
+
// one). A refusal left — a fetch that failed — does not stop the ship: the commit stage and the
|
|
98
|
+
// followup merge again.
|
|
99
|
+
// The pre-commit prettier, cspell and eslint are switched off for it: the gate or the scoped pair runs
|
|
100
|
+
// the same checks over this tree before anything is pushed, and the hooks only waited for the core
|
|
101
|
+
// budget to repeat them (joshuafolkken/kit#4985).
|
|
102
|
+
async function commit_locally(title: string, is_dirty: boolean): Promise<JoshResult | undefined> {
|
|
103
|
+
if (!is_dirty) return undefined
|
|
104
|
+
|
|
105
|
+
const commit = await timed(
|
|
106
|
+
STEP.LOCAL_COMMIT,
|
|
107
|
+
async () =>
|
|
108
|
+
await josh_command.josh_run(
|
|
109
|
+
['git', '-y', '--skip-push', '--skip-pr', title],
|
|
110
|
+
should_forward_stderr,
|
|
111
|
+
undefined,
|
|
112
|
+
{ [pre_commit_lint_switch.SWITCH_ENV_KEY]: 'off' },
|
|
113
|
+
),
|
|
114
|
+
)
|
|
115
|
+
|
|
116
|
+
return commit.code === SUCCESS_EXIT_CODE ? undefined : commit
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
// **A merge the sync made is pushed at once onto an open pull request, ahead of the gate**
|
|
120
|
+
// (joshuafolkken/kit#5067): CI and SonarQube start from this push, and pushed after the gate they ran
|
|
121
|
+
// behind it, leaving the followup minutes of waiting. Only the pull request's own branch moves; the
|
|
122
|
+
// merge still needs the gate, the review attest and a green CI, and a red gate stops the ship before
|
|
123
|
+
// the followup as before, the next push replacing the commit. Its pre-push hook runs the related tests
|
|
124
|
+
// (`pre-push-related-switch.ts`), since the gate over this same tree runs the whole suite next. A
|
|
125
|
+
// branch with no open pull request pushes nothing here: CI runs on pull requests only. An unmoved
|
|
126
|
+
// default branch pushes nothing either, so the commit stage stays the one push; a merged one makes it
|
|
127
|
+
// two, and CI and the review bots run again on the second. A failed push stops nothing: the commit
|
|
128
|
+
// stage pushes the gated tree.
|
|
129
|
+
async function push_ahead(title: string): Promise<string> {
|
|
130
|
+
const push = await timed(
|
|
131
|
+
STEP.PUSH,
|
|
132
|
+
async () =>
|
|
133
|
+
await josh_command.josh_run(push_argv(title), should_forward_stderr, undefined, {
|
|
134
|
+
[pre_push_related_switch.SWITCH_ENV_KEY]: pre_push_related_switch.SWITCH_ON,
|
|
135
|
+
}),
|
|
136
|
+
)
|
|
137
|
+
|
|
138
|
+
return push.code === SUCCESS_EXIT_CODE ? PUSHED_NOTE : [PUSH_FAILED_NOTE, push.out].join('\n')
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
// An unreadable pull request reads as none: the commit stage pushes after the gate either way.
|
|
142
|
+
async function has_open_pull(): Promise<boolean> {
|
|
143
|
+
try {
|
|
144
|
+
return (await git_gh_pr_read.pr_get_number(await git_command.branch())) !== undefined
|
|
145
|
+
} catch {
|
|
146
|
+
return false
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
async function pushed_note(outcome: MergeOutcome, title: string): Promise<string> {
|
|
151
|
+
if (outcome.kind !== 'merged' || !(await has_open_pull())) return ''
|
|
152
|
+
|
|
153
|
+
return await push_ahead(title)
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
async function waited_note(issue: string): Promise<string> {
|
|
157
|
+
const overlap = await timed(
|
|
158
|
+
STEP.OVERLAP_WAIT,
|
|
159
|
+
async () => await run_ship_overlap.await_overlap(issue),
|
|
160
|
+
)
|
|
161
|
+
|
|
162
|
+
return run_ship_overlap.note(overlap)
|
|
163
|
+
}
|
|
164
|
+
|
|
71
165
|
// The merge waits first for any lane whose open pull request changes the same paths
|
|
72
166
|
// (`run-ship-overlap.ts`), so it brings that pull request in before the gate rather than meeting it
|
|
73
167
|
// as `DIRTY` after CI.
|
|
74
|
-
async function sync_stage(issue: string): Promise<StepResult> {
|
|
75
|
-
const waited =
|
|
168
|
+
async function sync_stage(issue: string, title: string, is_dirty: boolean): Promise<StepResult> {
|
|
169
|
+
const waited = await waited_note(issue)
|
|
170
|
+
const failed_commit = await commit_locally(title, is_dirty)
|
|
171
|
+
|
|
172
|
+
if (failed_commit !== undefined) {
|
|
173
|
+
const out = [waited, failed_commit.out].filter((line) => line !== '').join('\n')
|
|
174
|
+
|
|
175
|
+
return { ...failed_commit, out }
|
|
176
|
+
}
|
|
177
|
+
|
|
76
178
|
const outcome = await merge_outcome()
|
|
77
179
|
|
|
78
180
|
if (outcome.kind === 'conflict') return conflict_result(outcome.files, waited)
|
|
79
181
|
|
|
80
|
-
const
|
|
182
|
+
const pushed = await pushed_note(outcome, title)
|
|
183
|
+
const out = [waited, sync_note(outcome), pushed].filter((line) => line !== '').join('\n')
|
|
81
184
|
|
|
82
185
|
return { code: SUCCESS_EXIT_CODE, out }
|
|
83
186
|
}
|
|
84
187
|
|
|
85
|
-
//
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
188
|
+
// The tree merged with a default branch that moved is gated before it is pushed: a tree only the
|
|
189
|
+
// combined change breaks — two lanes each growing one document inside its cap — stops here, reproduced
|
|
190
|
+
// locally rather than met on CI's merge ref (joshuafolkken/kit#4825). The push then carries the tree
|
|
191
|
+
// the gate's record describes, so the pre-push hook reuses it rather than re-running the unit suite.
|
|
192
|
+
// Its red is tagged a check, so the stage's infrastructure retry never reads test output as an outage.
|
|
193
|
+
async function gate_merged(): Promise<StepResult | undefined> {
|
|
194
|
+
const gate = await run_ship_scoped.scoped_gate()
|
|
89
195
|
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
196
|
+
if (gate.code === SUCCESS_EXIT_CODE) return undefined
|
|
197
|
+
|
|
198
|
+
const out = [MERGED_GATE_NOTE, gate.out].filter((line) => line !== '').join('\n')
|
|
199
|
+
|
|
200
|
+
return { ...gate, out, cause: run_ship_stop_cause.CAUSE.CHECK }
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
// Before the commit stage pushes: a default branch that moved since the sync stage is merged again and
|
|
204
|
+
// the merged tree gated, so the stop lands while the lane still waits on the ship. An unmoved one
|
|
205
|
+
// merges nothing and re-runs no gate; a refusal leaves the merge to the followup, as the sync does.
|
|
206
|
+
// A tree with no green gate record is gated whatever the merge answered: a re-run commit stage finds
|
|
207
|
+
// the merge its red gate stopped on already made, and must not push it without a gate.
|
|
208
|
+
async function catch_up(): Promise<StepResult | undefined> {
|
|
209
|
+
const outcome = await merge_outcome()
|
|
210
|
+
|
|
211
|
+
if (outcome.kind === 'conflict') return conflict_result(outcome.files, '')
|
|
212
|
+
if (outcome.kind !== 'merged' && (await run_ship_scoped.is_gate_green())) return undefined
|
|
213
|
+
|
|
214
|
+
return await gate_merged()
|
|
94
215
|
}
|
|
95
216
|
|
|
96
|
-
// The merged tree is gated before it is pushed: the push then carries the tree
|
|
97
|
-
// the gate's record describes, so the pre-push hook reuses it rather than re-running the unit suite.
|
|
98
217
|
async function push_merged(title: string): Promise<StepResult | undefined> {
|
|
99
|
-
const gate = await
|
|
218
|
+
const gate = await gate_merged()
|
|
100
219
|
|
|
101
|
-
if (gate
|
|
220
|
+
if (gate !== undefined) return gate
|
|
102
221
|
|
|
103
|
-
const push = await josh(
|
|
222
|
+
const push = await josh(push_argv(title))
|
|
104
223
|
|
|
105
224
|
return push.code === SUCCESS_EXIT_CODE ? undefined : push
|
|
106
225
|
}
|
|
107
226
|
|
|
227
|
+
// The followup's reasons a newer base can change: a red check or a conflict.
|
|
228
|
+
const MERGE_FIXABLE_REASONS = [FAILURE_REASON_CHECKS, FAILURE_REASON_CONFLICT]
|
|
229
|
+
|
|
230
|
+
function names_merge_fixable(text: string | undefined): boolean {
|
|
231
|
+
if (text?.includes(FAILURE_MESSAGE_PREFIX) !== true) return false
|
|
232
|
+
|
|
233
|
+
return MERGE_FIXABLE_REASONS.some((reason) => text.includes(reason))
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
// Whether the followup failed on the pull request's checks — a red check or a conflict. A refusal
|
|
237
|
+
// before the wait, or a review blocker alone, is not one: its text carries neither reason.
|
|
238
|
+
function is_checks_failure(failed: JoshResult): boolean {
|
|
239
|
+
return [failed.out, failed.err].some((text) => names_merge_fixable(text))
|
|
240
|
+
}
|
|
241
|
+
|
|
108
242
|
// The result to stop on, or `undefined` once a clean merge is pushed and the followup can wait again.
|
|
243
|
+
// A followup that failed on the checks merges again whenever the default branch moved since the push,
|
|
244
|
+
// conflicting or not: a red CI on the merge ref is then reproduced by the local gate or cleared by the
|
|
245
|
+
// new push. An unmoved default branch, or any other failure, stands.
|
|
109
246
|
async function merge_again(title: string, failed: JoshResult): Promise<StepResult | undefined> {
|
|
110
|
-
if (!(
|
|
247
|
+
if (!is_checks_failure(failed)) return failed
|
|
111
248
|
|
|
112
249
|
const outcome = await merge_outcome()
|
|
113
250
|
|
|
@@ -117,21 +254,62 @@ async function merge_again(title: string, failed: JoshResult): Promise<StepResul
|
|
|
117
254
|
return await push_merged(title)
|
|
118
255
|
}
|
|
119
256
|
|
|
120
|
-
|
|
257
|
+
// Whether the ship waits on the merge alone, for its stage record (`run_ship_stage.mark_merge_waiting`).
|
|
258
|
+
type WaitMark = (is_merge_waiting: boolean) => void
|
|
259
|
+
|
|
260
|
+
function ignore_wait(): void {
|
|
261
|
+
// A ship with no stage record has no lane place to free.
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
// The wait is marked only while `josh followup` runs: the merge again and its gate run unmarked, so a
|
|
265
|
+
// lane gating here still holds its place (joshuafolkken/kit#4466).
|
|
266
|
+
async function marked_followup(
|
|
267
|
+
title: string,
|
|
268
|
+
notify: ReadonlyArray<string>,
|
|
269
|
+
mark: WaitMark,
|
|
270
|
+
): Promise<JoshResult> {
|
|
271
|
+
mark(true)
|
|
272
|
+
|
|
273
|
+
try {
|
|
274
|
+
return await josh(['followup', title, ...notify])
|
|
275
|
+
} finally {
|
|
276
|
+
mark(false)
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
async function followup_attempt(
|
|
121
281
|
title: string,
|
|
122
282
|
notify: ReadonlyArray<string>,
|
|
123
|
-
|
|
283
|
+
mark: WaitMark,
|
|
284
|
+
retries: number,
|
|
124
285
|
): Promise<StepResult> {
|
|
125
|
-
const result = await
|
|
286
|
+
const result = await marked_followup(title, notify, mark)
|
|
126
287
|
|
|
127
288
|
if (result.code === SUCCESS_EXIT_CODE || retries >= MAX_MERGE_RETRIES) return result
|
|
128
289
|
|
|
129
290
|
const stop = await merge_again(title, result)
|
|
130
291
|
|
|
131
|
-
return stop ?? (await
|
|
292
|
+
return stop ?? (await followup_attempt(title, notify, mark, retries + 1))
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
async function followup_stage(
|
|
296
|
+
title: string,
|
|
297
|
+
notify: ReadonlyArray<string>,
|
|
298
|
+
mark: WaitMark = ignore_wait,
|
|
299
|
+
): Promise<StepResult> {
|
|
300
|
+
return await followup_attempt(title, notify, mark, 0)
|
|
132
301
|
}
|
|
133
302
|
|
|
134
|
-
const run_ship_sync = {
|
|
303
|
+
const run_ship_sync = {
|
|
304
|
+
CONFLICT_NOTE,
|
|
305
|
+
MAX_MERGE_RETRIES,
|
|
306
|
+
MERGED_GATE_NOTE,
|
|
307
|
+
PUSHED_NOTE,
|
|
308
|
+
PUSH_FAILED_NOTE,
|
|
309
|
+
catch_up,
|
|
310
|
+
followup_stage,
|
|
311
|
+
sync_stage,
|
|
312
|
+
}
|
|
135
313
|
|
|
136
|
-
export type { StepResult }
|
|
314
|
+
export type { StepResult, WaitMark }
|
|
137
315
|
export { run_ship_sync }
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
import { gate_labels } from '#scripts/gate/gate-labels'
|
|
2
|
+
import type { GateTree } from '#scripts/gate/gate-tree'
|
|
3
|
+
import type { MovedParts } from '#scripts/gate/moved-paths'
|
|
4
|
+
import { scoped_green } from '#scripts/gate/scoped-green'
|
|
5
|
+
import { since_green } from '#scripts/gate/since-green'
|
|
6
|
+
import { changed_file_scope } from '#scripts/git/changed-file-scope'
|
|
7
|
+
import { changed_paths } from '#scripts/git/changed-paths'
|
|
8
|
+
import type { FileMapStampAccess } from '#scripts/josh/file-map-stamp'
|
|
9
|
+
import { run_record_path } from '#scripts/josh/run-record-path'
|
|
10
|
+
import { review_stamps } from '#scripts/review/review-stamps'
|
|
11
|
+
import { test_read_map, type ReadMap } from '#scripts/test/test-read-map'
|
|
12
|
+
import { related_scope } from '#scripts/test/test-related-scope'
|
|
13
|
+
import { test_related_synced, type SyncedSplit } from '#scripts/test/test-related-synced'
|
|
14
|
+
import { whole_suite_files } from '#scripts/test/whole-suite-files'
|
|
15
|
+
|
|
16
|
+
// **A scoped pair whose records went stale only because a merge with the default branch moved the base
|
|
17
|
+
// re-runs nothing when that merge shares nothing with this branch's change** (joshuafolkken/kit#4985).
|
|
18
|
+
// The sync, the commit stage's catch-up and a lane's own conflict merge each moved the base under a
|
|
19
|
+
// pair green on the branch side, and the pair re-ran over the branch's related set — minutes of core
|
|
20
|
+
// budget for main's files, which main's CI had already verified.
|
|
21
|
+
//
|
|
22
|
+
// **Where the two can meet still runs.** A file both sides changed, a test reaching both a synced module
|
|
23
|
+
// and this branch's change (`test-related-synced.ts`), or a synced module the import graph cannot
|
|
24
|
+
// split keeps the pair running as before, narrowed by the checks themselves (`since-green.ts`). So
|
|
25
|
+
// does, for `lint:related`, any file whose imports reach both sides, and for `test:related` a synced
|
|
26
|
+
// file every test depends on or a non-code file a test reads: `josh test:related` leaves those to the
|
|
27
|
+
// branch's own tests, which a settled record would skip. The
|
|
28
|
+
// gate still runs over the merged tree wherever it ran before (joshuafolkken/kit#4825), and CI runs
|
|
29
|
+
// the whole suite.
|
|
30
|
+
//
|
|
31
|
+
// **Whatever cannot be read settles nothing**: a record that is absent or cannot be compared, a branch
|
|
32
|
+
// side that moved since its record, a merge that changed a check's configuration, or a branch change
|
|
33
|
+
// git cannot read.
|
|
34
|
+
|
|
35
|
+
interface SyncedCheck {
|
|
36
|
+
script: string
|
|
37
|
+
label: string
|
|
38
|
+
stamp: FileMapStampAccess
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
const CHECKS: ReadonlyArray<SyncedCheck> = [
|
|
42
|
+
{
|
|
43
|
+
script: scoped_green.LINT_SCRIPT,
|
|
44
|
+
label: gate_labels.LINT_LABEL,
|
|
45
|
+
stamp: review_stamps.lint_related_stamp,
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
script: scoped_green.TEST_SCRIPT,
|
|
49
|
+
label: gate_labels.UNIT_LABEL,
|
|
50
|
+
stamp: review_stamps.test_related_stamp,
|
|
51
|
+
},
|
|
52
|
+
]
|
|
53
|
+
|
|
54
|
+
function is_sync_only(parts: MovedParts): boolean {
|
|
55
|
+
return (
|
|
56
|
+
parts.synced.length > 0 &&
|
|
57
|
+
parts.changed.every((relative) => run_record_path.is_run_record(relative))
|
|
58
|
+
)
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
async function synced_of(
|
|
62
|
+
check: SyncedCheck,
|
|
63
|
+
tree: GateTree,
|
|
64
|
+
): Promise<ReadonlyArray<string> | undefined> {
|
|
65
|
+
const parts = await since_green.read_moved_parts(check.stamp, check.label, undefined, tree)
|
|
66
|
+
|
|
67
|
+
return parts !== undefined && is_sync_only(parts) ? parts.synced : undefined
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// What the merge brought in, when every stale record moved by nothing else.
|
|
71
|
+
async function synced_files(
|
|
72
|
+
checks: ReadonlyArray<SyncedCheck>,
|
|
73
|
+
tree: GateTree,
|
|
74
|
+
): Promise<ReadonlyArray<string> | undefined> {
|
|
75
|
+
const parts = await Promise.all(checks.map(async (check) => await synced_of(check, tree)))
|
|
76
|
+
const known = parts.filter((synced) => synced !== undefined)
|
|
77
|
+
|
|
78
|
+
return known.length > 0 && known.length === parts.length ? [...new Set(known.flat())] : undefined
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
async function branch_change(): Promise<ReadonlyArray<string> | undefined> {
|
|
82
|
+
try {
|
|
83
|
+
return await changed_paths.read_changed_paths(false)
|
|
84
|
+
} catch {
|
|
85
|
+
return undefined
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
function is_whole_suite(file: string): boolean {
|
|
90
|
+
return whole_suite_files.WHOLE_SUITE_FILES.has(file)
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// A synced file a test can reach with no import the graph splits: one every test depends on, or a
|
|
94
|
+
// non-code file a recorded test reads — every one of them when no map was recorded.
|
|
95
|
+
function is_read_by_tests(map: ReadMap | undefined, file: string): boolean {
|
|
96
|
+
if (is_whole_suite(file)) return true
|
|
97
|
+
if (related_scope.is_relatable(file)) return false
|
|
98
|
+
|
|
99
|
+
return map === undefined || test_read_map.readers_of(map, file).length > 0
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
function has_check(checks: ReadonlyArray<SyncedCheck>, script: string): boolean {
|
|
103
|
+
return checks.some((check) => check.script === script)
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
// What only one check reads where the two sides meet. `lint:related`'s type-aware rules read every
|
|
107
|
+
// file whose imports reach both, code between included; `test:related` leaves a file the graph
|
|
108
|
+
// cannot split to the branch's own tests (`test-related.ts`), which a settled record would skip.
|
|
109
|
+
function check_overlap(
|
|
110
|
+
checks: ReadonlyArray<SyncedCheck>,
|
|
111
|
+
synced: ReadonlyArray<string>,
|
|
112
|
+
split: SyncedSplit,
|
|
113
|
+
map: ReadMap | undefined,
|
|
114
|
+
): ReadonlyArray<string> {
|
|
115
|
+
const meeting = has_check(checks, scoped_green.LINT_SCRIPT) ? split.meeting : []
|
|
116
|
+
const read = has_check(checks, scoped_green.TEST_SCRIPT)
|
|
117
|
+
? synced.filter((file) => is_read_by_tests(map, file))
|
|
118
|
+
: []
|
|
119
|
+
|
|
120
|
+
return [...meeting, ...read]
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
// The synced files and tests where the merge and this branch's change meet.
|
|
124
|
+
async function overlap_of(
|
|
125
|
+
checks: ReadonlyArray<SyncedCheck>,
|
|
126
|
+
synced: ReadonlyArray<string>,
|
|
127
|
+
branch: ReadonlyArray<string>,
|
|
128
|
+
): Promise<ReadonlyArray<string>> {
|
|
129
|
+
const root = await changed_file_scope.repository_root_or_cwd()
|
|
130
|
+
const map = test_read_map.read_map(root)
|
|
131
|
+
const split = await test_related_synced.split(root, synced, branch, map)
|
|
132
|
+
const both = synced.filter((file) => branch.includes(file))
|
|
133
|
+
// Code the graph left unsplit — whole-suite modules included, which it never splits.
|
|
134
|
+
const unsplit = synced.filter(
|
|
135
|
+
(file) =>
|
|
136
|
+
related_scope.is_relatable(file) && !branch.includes(file) && !split.left.includes(file),
|
|
137
|
+
)
|
|
138
|
+
|
|
139
|
+
return [...both, ...split.shared, ...unsplit, ...check_overlap(checks, synced, split, map)]
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
async function unshared_sync(
|
|
143
|
+
checks: ReadonlyArray<SyncedCheck>,
|
|
144
|
+
tree: GateTree,
|
|
145
|
+
): Promise<ReadonlyArray<string> | undefined> {
|
|
146
|
+
const synced = await synced_files(checks, tree)
|
|
147
|
+
const branch = synced === undefined ? undefined : await branch_change()
|
|
148
|
+
|
|
149
|
+
if (synced === undefined || branch === undefined) return undefined
|
|
150
|
+
|
|
151
|
+
const overlap = await overlap_of(checks, synced, branch)
|
|
152
|
+
|
|
153
|
+
return overlap.length === 0 ? synced : undefined
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
function reason(scripts: ReadonlyArray<string>, synced: ReadonlyArray<string>): string {
|
|
157
|
+
return (
|
|
158
|
+
`scoped pair: ${scripts.join(' and ')} not re-run — the ${String(synced.length)} file(s) ` +
|
|
159
|
+
"the merge with the default branch brought in share no file or test with this branch's change."
|
|
160
|
+
)
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
// The line a settled pair prints, after re-recording each stale check green on this tree so the gate
|
|
164
|
+
// and the brief read it as checked — or `undefined`, and the pair runs as before.
|
|
165
|
+
async function settle(tree: GateTree, scripts: ReadonlyArray<string>): Promise<string | undefined> {
|
|
166
|
+
const checks = CHECKS.filter((check) => scripts.includes(check.script))
|
|
167
|
+
const synced = await unshared_sync(checks, tree)
|
|
168
|
+
|
|
169
|
+
if (synced === undefined) return undefined
|
|
170
|
+
|
|
171
|
+
for (const check of checks) scoped_green.record_green(check.stamp, tree)
|
|
172
|
+
|
|
173
|
+
return reason(scripts, synced)
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
const run_ship_synced_scope = { settle }
|
|
177
|
+
|
|
178
|
+
export { run_ship_synced_scope }
|