@joshuafolkken/kit 1.1514.0 → 1.2114.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/agents/investigator.md +1 -1
- package/.claude/agents/reviewer-verification.md +19 -0
- package/.claude/agents/reviewer.md +19 -0
- package/.claude/settings.json +5 -6
- package/.claude/skills/dependency-update/SKILL.md +9 -10
- package/.claude/skills/epic-commands/SKILL.md +26 -65
- package/.claude/skills/epic-commands/epic-bundle.md +3 -1
- package/.claude/skills/workflow-commands/SKILL.md +11 -11
- package/.claude/skills/workflow-commands/background-commands.md +13 -10
- package/.claude/skills/workflow-commands/backlogrun-child.md +12 -8
- package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +7 -25
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +18 -14
- package/.claude/skills/workflow-commands/backlogrun-park.md +18 -24
- package/.claude/skills/workflow-commands/backlogrun-progress.md +4 -5
- package/.claude/skills/workflow-commands/backlogrun-recovery.md +6 -6
- package/.claude/skills/workflow-commands/backlogrun-steps.md +12 -11
- package/.claude/skills/workflow-commands/backlogrun.md +1 -1
- package/.claude/skills/workflow-commands/chain-rule.md +43 -28
- package/.claude/skills/workflow-commands/delegation.md +11 -10
- package/.claude/skills/workflow-commands/entry-sequence.md +10 -10
- package/.claude/skills/workflow-commands/followup.md +16 -36
- package/.claude/skills/workflow-commands/fullrun-steps.md +38 -47
- package/.claude/skills/workflow-commands/fullrun.md +3 -3
- package/.claude/skills/workflow-commands/halfrun.md +17 -25
- package/.claude/skills/workflow-commands/issue-comments.md +25 -16
- package/.claude/skills/workflow-commands/issue-fold-existing.md +2 -1
- package/.claude/skills/workflow-commands/issue-scout.md +2 -2
- package/.claude/skills/workflow-commands/kickoff.md +24 -23
- package/.claude/skills/workflow-commands/latest-gate.md +7 -12
- package/.claude/skills/workflow-commands/needs-human-review.md +9 -14
- package/.claude/skills/workflow-commands/observation-filing.md +4 -36
- package/.claude/skills/workflow-commands/observation-ledger.md +6 -4
- package/.claude/skills/workflow-commands/pre-gate-cut.md +22 -37
- package/.claude/skills/workflow-commands/prerequisite.md +11 -16
- package/.claude/skills/workflow-commands/progress-watcher.md +1 -1
- package/.claude/skills/workflow-commands/prrun.md +3 -7
- package/.claude/skills/workflow-commands/retrospective.md +2 -2
- package/.claude/skills/workflow-commands/split-assessment.md +15 -1
- package/.claude/skills/workflow-commands/working-tree-hold.md +9 -9
- package/.codex/hooks.json +5 -5
- package/.github/actions/setup-node/action.yml +9 -0
- package/.github/actions/setup-pnpm/action.yml +10 -17
- package/.github/dependabot.yml +32 -0
- package/.github/release.yml +0 -2
- package/.github/workflows/auto-tag.yml +45 -0
- package/.github/workflows/ci.yml +267 -17
- package/.github/workflows/dependabot-auto-merge.yml +63 -4
- package/.github/workflows/production.yml +8 -0
- package/.github/workflows/publish.yml +67 -46
- package/.github/workflows/sonar-qube.yml +1 -0
- package/.prettierignore +2 -0
- package/.vscode/settings.json +19 -0
- package/.vscode/tasks.json +1 -2
- package/CLAUDE.md +7 -18
- package/README.md +4 -2
- package/SECURITY.md +3 -3
- package/dist/CLAUDE.md +7 -18
- package/dist/commands/document-read-cli.js +883 -0
- package/dist/commands/{document-section-cli.js → document-section-main.js} +81 -38
- package/dist/commands/read-set-cli.js +1927 -0
- package/dist/commands/run-prep-main.js +21174 -0
- package/dist/commands/run-step-cli.js +27733 -0
- package/dist/config-merge/index.js +5 -1
- package/dist/hooks/audit-provision.js +39 -36
- package/dist/hooks/chunk-3GKE653K.js +6204 -0
- package/dist/hooks/chunk-45CJJOO7.js +1243 -0
- package/dist/hooks/chunk-5PM2JRGV.js +7780 -0
- package/dist/hooks/chunk-7SIUNQXK.js +3591 -0
- package/dist/hooks/chunk-CQD4LJE6.js +4858 -0
- package/dist/hooks/{chunk-723HKZO5.js → chunk-OPSRGWFU.js} +1 -1
- package/dist/hooks/chunk-UJ3FPMMM.js +628 -0
- package/dist/hooks/chunk-VVNYJWEI.js +30 -0
- package/dist/hooks/chunk-Z6DQJKH3.js +2806 -0
- package/dist/hooks/codex-hook-adapter.js +10 -22
- package/dist/hooks/format-edited.js +4 -6
- package/dist/hooks/inputs.json +460 -308
- package/dist/hooks/pretool-guard.js +8 -25
- package/dist/hooks/session-lang.js +135 -299
- package/dist/hooks/stop-guard.js +6496 -1799
- package/dist/josh.js +7412 -4228
- package/dist/self-sync-guard/index.js +74 -10
- package/dist/version/index.js +276 -407
- package/eslint/base.js +1 -1
- package/eslint/rules/comment-why-only.js +108 -0
- package/lefthook/base.yml +3 -1
- package/package.json +23 -54
- package/pnpm-workspace.yaml +4 -2
- package/prompts/coding-standards.md +2 -2
- package/prompts/collaboration-workflow/file-edits.md +14 -17
- package/prompts/collaboration-workflow/issue-citation.md +0 -4
- package/prompts/collaboration-workflow/issue-template.md +54 -18
- package/prompts/collaboration-workflow/lane-instructions.md +3 -2
- package/prompts/collaboration-workflow/measurement.md +44 -0
- package/prompts/collaboration-workflow/operating-rules.md +15 -8
- package/prompts/collaboration-workflow/output-bounds.md +6 -7
- package/prompts/collaboration-workflow/plan-comment.md +3 -42
- package/prompts/collaboration-workflow/principles.md +14 -0
- package/prompts/collaboration-workflow/report-format.md +31 -60
- package/prompts/collaboration-workflow/residency.md +3 -2
- package/prompts/collaboration-workflow/rule-delivery.md +13 -1
- package/prompts/collaboration-workflow/shell-body.md +6 -16
- package/prompts/collaboration-workflow/turn-batching.md +0 -2
- package/prompts/collaboration-workflow/upstream-interrupt.md +15 -5
- package/prompts/collaboration-workflow/wip-cap.md +4 -2
- package/prompts/collaboration-workflow.md +3 -7
- package/prompts/refactoring.md +1 -1
- package/prompts/review-rubric.md +9 -2
- package/prompts/review.md +65 -36
- package/prompts/testing-guide.md +9 -43
- package/scripts/agent/agent-argv.ts +14 -16
- package/scripts/agent/agent-event.ts +15 -15
- package/scripts/agent/agent-exit-record.ts +13 -1
- package/scripts/agent/agent-provider.ts +138 -0
- package/scripts/agent/agent-role-profile.ts +108 -156
- package/scripts/agent/agent-safe-text.ts +20 -5
- package/scripts/agent/api-auth.ts +41 -0
- package/scripts/agent/api-outage.ts +1 -1
- package/scripts/agent/api-usage-limit.ts +65 -0
- package/scripts/agent/claude-agent-argv.ts +19 -9
- package/scripts/agent/codex-agent-argv.ts +118 -22
- package/scripts/agent/usage-limit-reset.ts +179 -0
- package/scripts/auth/claude-token-output.ts +2 -2
- package/scripts/auto-ok/auto-ok-author.ts +53 -0
- package/scripts/auto-ok/auto-ok-cli.ts +25 -16
- package/scripts/auto-ok/auto-ok-judge-read.ts +12 -3
- package/scripts/auto-ok/auto-ok-judge-write.ts +46 -19
- package/scripts/auto-ok/auto-ok-judge.ts +13 -2
- package/scripts/auto-ok/auto-ok-main.ts +17 -0
- package/scripts/backlog/backlog-arrival.ts +14 -3
- package/scripts/backlog/backlog-budget-cli.ts +7 -33
- package/scripts/backlog/backlog-budget-main.ts +16 -0
- package/scripts/backlog/backlog-budget.ts +2 -3
- package/scripts/backlog/backlog-defect-priority.ts +5 -4
- package/scripts/backlog/backlog-drive-adopt.ts +67 -0
- package/scripts/backlog/backlog-drive-args.ts +4 -5
- package/scripts/backlog/backlog-drive-cli.ts +118 -28
- package/scripts/backlog/backlog-drive-hold.ts +162 -0
- package/scripts/backlog/backlog-drive-idle.ts +161 -0
- package/scripts/backlog/backlog-drive-judge.ts +25 -0
- package/scripts/backlog/backlog-drive-launch-pass.ts +90 -0
- package/scripts/backlog/backlog-drive-launch.ts +8 -2
- package/scripts/backlog/backlog-drive-memory.ts +126 -0
- package/scripts/backlog/backlog-drive-named-offer.ts +73 -35
- package/scripts/backlog/backlog-drive-named.ts +81 -13
- package/scripts/backlog/backlog-drive-offer-argv.ts +3 -8
- package/scripts/backlog/backlog-drive-paused.ts +170 -0
- package/scripts/backlog/backlog-drive-restore.ts +39 -8
- package/scripts/backlog/backlog-drive-seats.ts +18 -8
- package/scripts/backlog/backlog-drive-token-handling.ts +38 -0
- package/scripts/backlog/backlog-drive.ts +96 -131
- package/scripts/backlog/backlog-gate-scope.ts +61 -0
- package/scripts/backlog/backlog-measure-close.ts +112 -0
- package/scripts/backlog/backlog-next-main.ts +16 -0
- package/scripts/backlog/backlog-next-shared.ts +73 -0
- package/scripts/backlog/backlog-next.ts +78 -56
- package/scripts/backlog/backlog-occupied.ts +52 -39
- package/scripts/backlog/backlog-offer-cli.ts +6 -21
- package/scripts/backlog/backlog-offer-exclude.ts +15 -0
- package/scripts/backlog/backlog-offer-main.ts +12 -0
- package/scripts/backlog/backlog-offer.ts +36 -3
- package/scripts/backlog/backlog-overlap.ts +62 -10
- package/scripts/backlog/backlog-plan-cli.ts +4 -1
- package/scripts/backlog/backlog-plan-comment.ts +81 -0
- package/scripts/backlog/backlog-plan-read.ts +22 -5
- package/scripts/backlog/backlog-plan.ts +18 -4
- package/scripts/backlog/backlog-pool.ts +60 -22
- package/scripts/backlog/backlog-rank.ts +70 -15
- package/scripts/backlog/backlog-ready.ts +112 -30
- package/scripts/backlog/backlog-stalled-detect.ts +110 -36
- package/scripts/backlog/backlog-stalled.ts +52 -16
- package/scripts/backlog/backlog-wait-cause.ts +86 -0
- package/scripts/backlog/backlog-waves.ts +56 -15
- package/scripts/backlog/backlogrun-args.ts +19 -7
- package/scripts/backlog/backlogrun-cli.ts +19 -5
- package/scripts/backlog/backlogrun-launch.ts +13 -4
- package/scripts/backlog/backlogrun-restart.ts +97 -0
- package/scripts/backlog/backlogrun-stop.ts +79 -7
- package/scripts/behavior/behavior-cli.ts +2 -2
- package/scripts/behavior/behavior-rules.ts +47 -24
- package/scripts/build/build-bin.ts +2 -16
- package/scripts/build/build-claude-md.ts +0 -7
- package/scripts/build/build-commands.ts +0 -13
- package/scripts/build/build-hooks.ts +49 -48
- package/scripts/build/hook-bundle-stamp.ts +29 -11
- package/scripts/build/local-bin.ts +1 -1
- package/scripts/cases/cases-cli.ts +25 -13
- package/scripts/cases/cases-interaction-scan.ts +134 -0
- package/scripts/cases/cases-interaction.ts +183 -0
- package/scripts/cases/cases-logic.ts +39 -6
- package/scripts/ci/pr-classification-main.ts +18 -0
- package/scripts/ci/pr-classification.ts +10 -17
- package/scripts/clone/clone-scan.ts +1 -1
- package/scripts/cost-runtime/context-cut-payback.ts +27 -25
- package/scripts/cost-runtime/cost-blocks.ts +22 -37
- package/scripts/cost-runtime/cost-cli.ts +67 -29
- package/scripts/cost-runtime/cost-main.ts +12 -0
- package/scripts/cost-runtime/cost-pricing.ts +9 -0
- package/scripts/cost-runtime/cost-transcript.ts +1 -0
- package/scripts/cost-runtime/cost-verdict.ts +4 -1
- package/scripts/delegation/delegation-policy.ts +18 -5
- package/scripts/delegation/duplicate-read-guard.ts +1 -8
- package/scripts/delegation/investigation-guard.ts +12 -8
- package/scripts/delegation/investigation-reads.ts +48 -27
- package/scripts/dependabot/dependabot-cooldown.ts +195 -0
- package/scripts/discovery/repo-discovery.ts +24 -6
- package/scripts/discovery/repo-party.ts +80 -20
- package/scripts/discovery/session-owner-pin.ts +51 -0
- package/scripts/doctor/doctor-consumer.ts +2 -5
- package/scripts/document/capped-print.ts +1 -1
- package/scripts/document/command-reference-line-budget.ts +42 -0
- package/scripts/document/document-byte-budget.ts +18 -6
- package/scripts/document/document-checks.ts +20 -0
- package/scripts/document/document-ratchet-check.ts +101 -0
- package/scripts/document/document-scan.ts +1 -1
- package/scripts/document/document-section-cli.ts +0 -8
- package/scripts/document/document-section-main.ts +12 -0
- package/scripts/document/document-section.ts +1 -0
- package/scripts/document/entry-read-budget.ts +7 -3
- package/scripts/document/issue-citation-budget.ts +94 -0
- package/scripts/epic/epic-audit-cli.ts +12 -6
- package/scripts/epic/epic-bundle-apply.ts +137 -0
- package/scripts/epic/epic-bundle-cli.ts +32 -121
- package/scripts/epic/epic-bundle-format.ts +116 -0
- package/scripts/epic/epic-bundle-main.ts +17 -0
- package/scripts/epic/epic-busy.ts +5 -12
- package/scripts/epic/epic-classify.ts +24 -15
- package/scripts/epic/epic-cli-argv.ts +33 -2
- package/scripts/epic/epic-cli-decide.ts +42 -0
- package/scripts/epic/epic-cli.ts +6 -38
- package/scripts/epic/epic-close.ts +112 -55
- package/scripts/epic/epic-cross-repo.ts +4 -7
- package/scripts/epic/epic-decide.ts +119 -0
- package/scripts/epic/epic-decision.ts +9 -0
- package/scripts/epic/epic-fetch.ts +6 -0
- package/scripts/epic/epic-graph.ts +8 -1
- package/scripts/epic/epic-issue.ts +8 -2
- package/scripts/epic/epic-label-age.ts +1 -1
- package/scripts/epic/epic-lane-offer.ts +39 -4
- package/scripts/epic/epic-next-main.ts +24 -0
- package/scripts/epic/epic-next.ts +6 -24
- package/scripts/epic/epic-outside-blocker.ts +6 -2
- package/scripts/epic/epic-parse.ts +9 -3
- package/scripts/epic/epic-rank.ts +5 -0
- package/scripts/epic/epic-read.ts +1 -0
- package/scripts/epic/epic-reconcile.ts +39 -0
- package/scripts/epic/epic-run.ts +10 -1
- package/scripts/epic/epic-solo.ts +50 -14
- package/scripts/epic/epic.ts +41 -7
- package/scripts/exports/unused-members-check.ts +62 -0
- package/scripts/exports/unused-members-cli.ts +6 -51
- package/scripts/followup/followup-checks-event.ts +8 -3
- package/scripts/followup/followup-ci-path.ts +67 -0
- package/scripts/followup/followup-coderabbit-retrigger.ts +261 -0
- package/scripts/followup/followup-coderabbit-wait.ts +85 -0
- package/scripts/followup/followup-failed-tests.ts +160 -0
- package/scripts/followup/followup-job-needs.ts +100 -0
- package/scripts/followup/followup-job-rerun.ts +303 -0
- package/scripts/followup/followup-main-move.ts +113 -0
- package/scripts/followup/followup-review-gates.ts +81 -0
- package/scripts/followup/git-followup-finish.ts +43 -11
- package/scripts/followup/git-followup-pending.ts +3 -3
- package/scripts/followup/git-followup-stages.ts +52 -12
- package/scripts/followup/git-followup-workflow.ts +19 -66
- package/scripts/followup/git-pr-followup-checks.ts +55 -16
- package/scripts/followup/git-pr-followup-wrapup.ts +32 -18
- package/scripts/followup/git-pr-followup.ts +96 -33
- package/scripts/fresh-machine/fresh-machine-cli.ts +1 -1
- package/scripts/fresh-machine/fresh-machine-run.ts +8 -8
- package/scripts/fresh-machine/fresh-machine-script.ts +5 -9
- package/scripts/fresh-machine/specs/kit-test-backlogrun-python.json +2 -2
- package/scripts/fresh-machine/specs/kit-test-backlogrun.json +3 -3
- package/scripts/gate/busy-average.ts +90 -0
- package/scripts/gate/check-cpu.ts +60 -0
- package/scripts/gate/check-inputs.ts +39 -95
- package/scripts/gate/check-related-pinned.ts +43 -0
- package/scripts/gate/check-related-reuse.ts +64 -0
- package/scripts/gate/check-related-section.ts +57 -0
- package/scripts/gate/check-related-unplanned.ts +34 -0
- package/scripts/gate/check-related.ts +265 -0
- package/scripts/gate/check-reuse.ts +33 -54
- package/scripts/gate/command-memory.ts +192 -0
- package/scripts/gate/core-admission.ts +236 -28
- package/scripts/gate/core-budget-timing.ts +51 -0
- package/scripts/gate/core-budget.ts +111 -100
- package/scripts/gate/core-wait-record.ts +49 -0
- package/scripts/gate/core-wait.ts +62 -7
- package/scripts/gate/core-weights.ts +94 -0
- package/scripts/gate/free-cores.ts +27 -4
- package/scripts/gate/gate-labels.ts +46 -0
- package/scripts/gate/gate-ledger.ts +44 -8
- package/scripts/gate/gate-plan.ts +130 -78
- package/scripts/gate/gate-report.ts +23 -9
- package/scripts/gate/gate-run-steps.ts +77 -9
- package/scripts/gate/gate-skip.ts +57 -8
- package/scripts/gate/gate-static-group.ts +60 -0
- package/scripts/gate/gate-steps.ts +14 -2
- package/scripts/gate/gate-tree.ts +4 -2
- package/scripts/gate/hook-gate-reuse.ts +19 -2
- package/scripts/gate/input-fingerprint.ts +42 -0
- package/scripts/gate/machine-capacity.ts +65 -31
- package/scripts/gate/metrics-totals.ts +59 -0
- package/scripts/gate/moved-paths.ts +67 -0
- package/scripts/gate/project-checks.ts +5 -12
- package/scripts/gate/scoped-green.ts +76 -19
- package/scripts/gate/since-green.ts +70 -0
- package/scripts/gate/structural-checks.ts +96 -0
- package/scripts/gate/toolchain-inputs.ts +115 -0
- package/scripts/gate/verification-gate.ts +70 -32
- package/scripts/gate/verification-inputs.ts +265 -0
- package/scripts/gate/verification-tail.ts +52 -0
- package/scripts/gh/gh-author-association.ts +117 -9
- package/scripts/gh/git-ai-review-scan.ts +5 -3
- package/scripts/gh/git-gh-api-path.ts +26 -2
- package/scripts/gh/git-gh-branch-rules.ts +73 -0
- package/scripts/gh/git-gh-comments-unreadable.ts +36 -0
- package/scripts/gh/git-gh-conditional.ts +5 -2
- package/scripts/gh/git-gh-exec.ts +32 -2
- package/scripts/gh/git-gh-issue-read.ts +7 -1
- package/scripts/gh/git-gh-issue-rest.ts +1 -0
- package/scripts/gh/git-gh-issue-write.ts +75 -31
- package/scripts/gh/git-gh-issue.ts +19 -8
- package/scripts/gh/git-gh-poll-read.ts +89 -0
- package/scripts/gh/git-gh-pr-auto-merge.ts +21 -9
- package/scripts/gh/git-gh-pr-graphql-state.ts +56 -0
- package/scripts/gh/git-gh-pr-read.ts +74 -13
- package/scripts/gh/git-gh-pr-rest.ts +4 -2
- package/scripts/gh/git-gh-pr-snapshot.ts +48 -20
- package/scripts/gh/git-gh-pr-too-large.ts +20 -0
- package/scripts/gh/git-gh-pr.ts +48 -22
- package/scripts/gh/git-gh-retry.ts +141 -0
- package/scripts/gh/git-pr-ai-review.ts +15 -6
- package/scripts/gh/git-pr-checks-eval.ts +42 -7
- package/scripts/gh/git-pr-checks-parse.ts +39 -9
- package/scripts/gh/git-pr-checks.ts +5 -5
- package/scripts/gh/git-pr-merge-checked.ts +80 -0
- package/scripts/git/base-tree.ts +49 -2
- package/scripts/git/change-base.ts +4 -10
- package/scripts/git/changed-file-scope.ts +6 -4
- package/scripts/git/changed-paths-sync.ts +63 -0
- package/scripts/git/changed-paths.ts +34 -2
- package/scripts/git/git-common-directory.ts +11 -1
- package/scripts/git/git-diff-reads.ts +91 -20
- package/scripts/git/git-error.ts +9 -2
- package/scripts/git/git-grep-hits.ts +85 -0
- package/scripts/git/git-location-environment.ts +1 -1
- package/scripts/git/git-merge-conflicts.ts +83 -0
- package/scripts/git/git-preflight.ts +37 -12
- package/scripts/git/git-push-transport.ts +1 -2
- package/scripts/git/git-schemas.ts +30 -7
- package/scripts/git/git-spawn.ts +1 -2
- package/scripts/git/git-status.ts +4 -4
- package/scripts/git/git-worktree.ts +13 -0
- package/scripts/git/gone-branch.ts +4 -1
- package/scripts/git/main-merge-budget-conflict.ts +89 -0
- package/scripts/git/main-merge-guard.ts +55 -18
- package/scripts/git/main-merge-main.ts +12 -0
- package/scripts/git/main-merge-regenerate.ts +59 -25
- package/scripts/git/main-merge.ts +77 -13
- package/scripts/git/main-sync-main.ts +12 -0
- package/scripts/git/main-sync.ts +0 -9
- package/scripts/git/no-base-checkout.ts +127 -0
- package/scripts/git/stash/git-stash.ts +38 -6
- package/scripts/git/stash/{stash-pop-args.ts → stash-args.ts} +13 -10
- package/scripts/git/stash/stash-pop-cli.ts +6 -12
- package/scripts/git/stash/stash-pop-main.ts +12 -0
- package/scripts/git/stash/stash-push-cli.ts +86 -0
- package/scripts/git/stash/stash-push-main.ts +12 -0
- package/scripts/hooks/batch-guard.ts +38 -27
- package/scripts/hooks/check-commit-message-main.ts +8 -0
- package/scripts/hooks/check-commit-message.ts +4 -7
- package/scripts/hooks/edited-cspell.ts +37 -11
- package/scripts/hooks/format-edited-file.ts +29 -25
- package/scripts/hooks/lane-plan-guard.ts +50 -0
- package/scripts/hooks/pre-commit-lint-switch.ts +9 -0
- package/scripts/hooks/pre-commit-lint.ts +44 -4
- package/scripts/hooks/pre-push-related-switch.ts +10 -0
- package/scripts/hooks/pre-push-unit.ts +77 -9
- package/scripts/hooks/pretool-guard-cli.ts +1 -8
- package/scripts/hooks/pretool-guard.ts +34 -19
- package/scripts/hooks/reserved-run.ts +81 -10
- package/scripts/hooks/run-hook.sh +30 -6
- package/scripts/hooks/shell-rules-notice.ts +37 -0
- package/scripts/hooks/step-zero-notice.ts +6 -1
- package/scripts/hooks/stop-actions.ts +5 -36
- package/scripts/hooks/stop-guard.ts +20 -15
- package/scripts/init/distributed-paths.ts +1 -0
- package/scripts/init/hook-command-rewrite.ts +23 -5
- package/scripts/init/hook-launch.ts +17 -17
- package/scripts/init/init-actions.ts +0 -6
- package/scripts/init/init-ai-copy.ts +10 -36
- package/scripts/init/init-bootstrap.ts +9 -8
- package/scripts/init/init-dry-run-report.ts +1 -1
- package/scripts/init/init-dry-run.ts +1 -1
- package/scripts/init/init-file-action.ts +7 -9
- package/scripts/init/init-logic-json-merge.ts +2 -2
- package/scripts/init/init-logic-migrate.ts +9 -82
- package/scripts/init/init-logic.ts +3 -2
- package/scripts/init/init-main.ts +12 -0
- package/scripts/init/init.ts +5 -12
- package/scripts/init/kit-development-versions.ts +3 -7
- package/scripts/init/kit-written-paths.ts +2 -2
- package/scripts/init/project-profile.ts +5 -4
- package/scripts/init/tsconfig-preset-migration.ts +2 -1
- package/scripts/init/vscode-tasks.ts +1 -1
- package/scripts/issue/aggregation-split.ts +52 -0
- package/scripts/issue/defect-origin-cli.ts +106 -0
- package/scripts/issue/defect-origin-line.ts +78 -0
- package/scripts/issue/defect-origin-main.ts +11 -0
- package/scripts/issue/defect-origin.ts +114 -0
- package/scripts/issue/defect-rate-cli.ts +38 -179
- package/scripts/issue/defect-rate.ts +0 -16
- package/scripts/issue/defect-report-cli.ts +128 -0
- package/scripts/issue/defect-report-format.ts +56 -0
- package/scripts/issue/defect-report-main.ts +11 -0
- package/scripts/issue/defect-report.ts +160 -0
- package/scripts/issue/effect-audit-cli.ts +178 -0
- package/scripts/issue/effect-audit.ts +185 -0
- package/scripts/issue/expected-effect-lint.ts +65 -9
- package/scripts/issue/git-next-issues.ts +5 -0
- package/scripts/issue/issue-already-done-cli.ts +62 -0
- package/scripts/issue/issue-body-or-comment.ts +74 -0
- package/scripts/issue/issue-cite-cli.ts +1 -12
- package/scripts/issue/issue-cite-main.ts +12 -0
- package/scripts/issue/issue-classification.ts +13 -7
- package/scripts/issue/issue-closing-pr.ts +8 -1
- package/scripts/issue/issue-comment-cli.ts +10 -24
- package/scripts/issue/issue-comment-main.ts +12 -0
- package/scripts/issue/issue-evidence-exit.ts +102 -0
- package/scripts/issue/issue-file-cap.ts +58 -0
- package/scripts/issue/issue-file-cli.ts +131 -36
- package/scripts/issue/issue-file-deferral.ts +52 -0
- package/scripts/issue/issue-file-fold.ts +29 -10
- package/scripts/issue/issue-file-interrupt.ts +85 -0
- package/scripts/issue/issue-file-lane-hint.ts +30 -0
- package/scripts/issue/issue-file.ts +56 -19
- package/scripts/issue/issue-fold-cli.ts +2 -11
- package/scripts/issue/issue-fold-main.ts +12 -0
- package/scripts/issue/issue-labels.ts +97 -89
- package/scripts/issue/issue-lint-cli.ts +29 -12
- package/scripts/issue/issue-lint-main.ts +12 -0
- package/scripts/issue/issue-measured-cli.ts +34 -0
- package/scripts/issue/issue-measured-close.ts +58 -0
- package/scripts/issue/issue-merged.ts +19 -2
- package/scripts/issue/issue-not-before-label.ts +135 -0
- package/scripts/issue/issue-not-before.ts +114 -0
- package/scripts/issue/issue-number-shape.ts +15 -1
- package/scripts/issue/issue-park.ts +28 -0
- package/scripts/issue/issue-plan-cli.ts +151 -0
- package/scripts/issue/issue-priority-cli.ts +60 -0
- package/scripts/issue/issue-priority-raise.ts +55 -0
- package/scripts/issue/issue-priority.ts +282 -0
- package/scripts/issue/issue-rank.ts +27 -4
- package/scripts/issue/issue-read-cli.ts +35 -16
- package/scripts/issue/issue-read-main.ts +12 -0
- package/scripts/issue/issue-read.ts +62 -13
- package/scripts/issue/issue-release-cli.ts +0 -10
- package/scripts/issue/issue-release-main.ts +13 -0
- package/scripts/issue/issue-release.ts +7 -12
- package/scripts/issue/issue-sample-gate.ts +213 -0
- package/scripts/issue/issue-sample-prime.ts +127 -0
- package/scripts/issue/issue-sample-required.ts +57 -0
- package/scripts/issue/issue-sample-source.ts +77 -0
- package/scripts/issue/issue-scout-cli.ts +0 -11
- package/scripts/issue/issue-scout-main.ts +14 -0
- package/scripts/issue/issue-search.ts +124 -0
- package/scripts/issue/issue-state-cli.ts +0 -10
- package/scripts/issue/issue-state-main.ts +12 -0
- package/scripts/issue/issue-state.ts +13 -1
- package/scripts/issue/issue-template-section.ts +43 -0
- package/scripts/issue/issue-watch-diff.ts +87 -16
- package/scripts/issue/issue-watch-hook.ts +11 -2
- package/scripts/issue/issue-watch.ts +55 -11
- package/scripts/issue/issue-wip.ts +2 -7
- package/scripts/issue/markdown-section.ts +1 -0
- package/scripts/issue/measure-declaration.ts +121 -0
- package/scripts/issue/measure-rerun-cli.ts +7 -65
- package/scripts/issue/plan-consumers-cli.ts +39 -0
- package/scripts/issue/plan-consumers-main.ts +11 -0
- package/scripts/issue/plan-consumers-section.ts +76 -0
- package/scripts/issue/plan-consumers.ts +127 -0
- package/scripts/issue/reproduction-measure.ts +3 -1
- package/scripts/issue/size-estimate.ts +90 -0
- package/scripts/issue/trusted-measure.ts +84 -0
- package/scripts/josh/agent-session-environment.ts +1 -1
- package/scripts/josh/command-usage.ts +17 -44
- package/scripts/josh/durable-state-migrate.ts +105 -0
- package/scripts/josh/durable-state.ts +112 -0
- package/scripts/josh/file-map-stamp.ts +49 -16
- package/scripts/josh/hook-decision.ts +32 -20
- package/scripts/josh/josh-aliases.ts +95 -0
- package/scripts/josh/josh-command-map.ts +1 -79
- package/scripts/josh/josh-command-types.ts +12 -6
- package/scripts/josh/josh-commands-agent-hooks.ts +83 -0
- package/scripts/josh/josh-commands-ai.ts +160 -161
- package/scripts/josh/josh-commands-backlog.ts +82 -16
- package/scripts/josh/josh-commands-clone.ts +1 -0
- package/scripts/josh/josh-commands-development.ts +142 -101
- package/scripts/josh/josh-commands-document.ts +43 -1
- package/scripts/josh/josh-commands-epic.ts +171 -0
- package/scripts/josh/josh-commands-hooks.ts +25 -2
- package/scripts/josh/josh-commands-issue-write.ts +200 -0
- package/scripts/josh/josh-commands-issue.ts +156 -24
- package/scripts/josh/josh-commands-lane.ts +187 -3
- package/scripts/josh/josh-commands-lint.ts +34 -10
- package/scripts/josh/josh-commands-maintenance.ts +127 -4
- package/scripts/josh/josh-commands-pause.ts +29 -0
- package/scripts/josh/josh-commands-progress.ts +87 -0
- package/scripts/josh/josh-commands-project.ts +138 -9
- package/scripts/josh/josh-commands-review.ts +159 -0
- package/scripts/josh/josh-commands-run.ts +211 -23
- package/scripts/josh/josh-commands-ship.ts +217 -0
- package/scripts/josh/josh-commands-split.ts +9 -0
- package/scripts/josh/josh-commands-test-check.ts +80 -0
- package/scripts/josh/josh-commands-versioning.ts +49 -2
- package/scripts/josh/josh-commands-workflow.ts +144 -6
- package/scripts/josh/josh-environment-file.ts +43 -3
- package/scripts/josh/josh-in-process.ts +2 -2
- package/scripts/josh/josh-logic.ts +11 -16
- package/scripts/josh/josh-run.ts +19 -1
- package/scripts/josh/package-directory.ts +2 -4
- package/scripts/josh/process-identity.ts +13 -4
- package/scripts/josh/run-record-path.ts +15 -0
- package/scripts/josh/session-language-cli.ts +4 -8
- package/scripts/josh/session-language-main.ts +13 -0
- package/scripts/josh/session-language.ts +6 -1
- package/scripts/josh/shared-cache.ts +90 -0
- package/scripts/josh/stamp-file.ts +20 -17
- package/scripts/lane/lane-adopt-cli.ts +98 -0
- package/scripts/lane/lane-adopt.ts +208 -0
- package/scripts/lane/lane-await.ts +56 -20
- package/scripts/lane/lane-baseline.ts +123 -0
- package/scripts/lane/lane-breakdown-cli.ts +64 -0
- package/scripts/lane/lane-breakdown-implement.ts +170 -0
- package/scripts/lane/lane-breakdown-laps.ts +107 -0
- package/scripts/lane/lane-breakdown-pinned.ts +76 -0
- package/scripts/lane/lane-breakdown-text.ts +145 -0
- package/scripts/lane/lane-breakdown.ts +239 -0
- package/scripts/lane/lane-cache.ts +5 -30
- package/scripts/lane/lane-capacity.ts +14 -23
- package/scripts/lane/lane-check-stats.ts +84 -22
- package/scripts/lane/lane-child-invocation.ts +17 -2
- package/scripts/lane/lane-child-mark-keys.ts +12 -0
- package/scripts/lane/lane-child-marker.ts +20 -1
- package/scripts/lane/lane-ci-path-stats.ts +73 -0
- package/scripts/lane/lane-claim-stats.ts +84 -0
- package/scripts/lane/lane-cli.ts +15 -5
- package/scripts/lane/lane-close.ts +91 -18
- package/scripts/lane/lane-core-wait-stats.ts +66 -0
- package/scripts/lane/lane-dispatch-log.ts +3 -3
- package/scripts/lane/lane-dispatch.ts +26 -5
- package/scripts/lane/lane-gap-stats.ts +157 -0
- package/scripts/lane/lane-guard-policy.ts +7 -1
- package/scripts/lane/lane-handoff.ts +69 -1
- package/scripts/lane/lane-held-stats.ts +129 -0
- package/scripts/lane/lane-implement-stats.ts +207 -0
- package/scripts/lane/lane-implement-subagents.ts +90 -0
- package/scripts/lane/lane-install.ts +4 -11
- package/scripts/lane/lane-investigation-switch.ts +16 -0
- package/scripts/lane/lane-launch-cli.ts +0 -9
- package/scripts/lane/lane-launch-main.ts +12 -0
- package/scripts/lane/lane-ledger-kind.ts +31 -0
- package/scripts/lane/lane-ledger-schema-ship.ts +49 -0
- package/scripts/lane/lane-ledger-schema.ts +349 -0
- package/scripts/lane/lane-ledger-write.ts +257 -0
- package/scripts/lane/lane-ledger.ts +56 -233
- package/scripts/lane/lane-limit-cli.ts +12 -1
- package/scripts/lane/lane-load.ts +1 -1
- package/scripts/lane/lane-measure-cli.ts +193 -30
- package/scripts/lane/lane-net-read.ts +44 -0
- package/scripts/lane/lane-net-time.ts +212 -0
- package/scripts/lane/lane-open.ts +25 -8
- package/scripts/lane/lane-output.ts +2 -4
- package/scripts/lane/lane-overrun-prompt.ts +147 -0
- package/scripts/lane/lane-overrun.ts +274 -0
- package/scripts/lane/lane-parked.ts +3 -3
- package/scripts/lane/lane-paths.ts +24 -1
- package/scripts/lane/lane-pause-cli.ts +133 -0
- package/scripts/lane/lane-pause.ts +158 -0
- package/scripts/lane/lane-paused-spans.ts +97 -0
- package/scripts/lane/lane-plan-check.ts +207 -0
- package/scripts/lane/lane-plan-cli.ts +41 -0
- package/scripts/lane/lane-plan.ts +144 -0
- package/scripts/lane/lane-process-table.ts +166 -0
- package/scripts/lane/lane-reap-settle.ts +124 -0
- package/scripts/lane/lane-reap.ts +50 -15
- package/scripts/lane/lane-registry.ts +38 -4
- package/scripts/lane/lane-relaunch.ts +1 -1
- package/scripts/lane/lane-residents.ts +162 -0
- package/scripts/lane/lane-restart.ts +22 -2
- package/scripts/lane/lane-round-one-stats.ts +51 -0
- package/scripts/lane/lane-round-two-stats.ts +49 -0
- package/scripts/lane/lane-sampler.ts +26 -3
- package/scripts/lane/lane-session-action.ts +112 -23
- package/scripts/lane/lane-session-broker.ts +146 -37
- package/scripts/lane/lane-session-reread-main.ts +14 -0
- package/scripts/lane/lane-session-reread.ts +51 -0
- package/scripts/lane/lane-ship-lap-stats.ts +74 -0
- package/scripts/lane/lane-sleep.ts +58 -0
- package/scripts/lane/lane-snapshot-trace.ts +84 -0
- package/scripts/lane/lane-spans.ts +51 -0
- package/scripts/lane/lane-spent.ts +7 -4
- package/scripts/lane/lane-split-stats.ts +28 -0
- package/scripts/lane/lane-stage-stats.ts +20 -3
- package/scripts/lane/lane-state.ts +334 -0
- package/scripts/lane/lane-stats-tables.ts +58 -0
- package/scripts/lane/lane-stats.ts +74 -4
- package/scripts/lane/lane-stop-stats.ts +145 -37
- package/scripts/lane/lane-tail-stats.ts +32 -0
- package/scripts/lane/lane-test-related-stats.ts +127 -0
- package/scripts/lane/lane-transcript-calls.ts +202 -0
- package/scripts/lane/lane-transcript-stats.ts +200 -0
- package/scripts/lane/lane-vacant.ts +13 -3
- package/scripts/lane/lane-value-cell.ts +72 -0
- package/scripts/lane/lane-value.ts +118 -0
- package/scripts/lane/lane-withdraw-cli.ts +5 -4
- package/scripts/lane/lane-withdraw-closed.ts +124 -0
- package/scripts/lane/lane-withdraw.ts +149 -71
- package/scripts/lane/lane-yield.ts +85 -0
- package/scripts/lane/openai-lane-ship.ts +12 -11
- package/scripts/lane/openai-lane-supervisor-decision.ts +6 -8
- package/scripts/lane/openai-lane-supervisor-owner.ts +5 -8
- package/scripts/lane/openai-lane-supervisor.ts +5 -4
- package/scripts/lane/process-directories.ts +70 -0
- package/scripts/lane/process-lane-marks.ts +94 -0
- package/scripts/lib/atomic-write.ts +62 -0
- package/scripts/lib/buffered-process.ts +12 -5
- package/scripts/lib/cli-flags.ts +53 -0
- package/scripts/lib/figure-format.ts +63 -0
- package/scripts/lib/json-value.ts +9 -1
- package/scripts/lib/package-manifest.ts +35 -0
- package/scripts/lib/poll.ts +38 -9
- package/scripts/lib/read-file.ts +3 -1
- package/scripts/lib/settled-together.ts +10 -0
- package/scripts/lib/shell-quote.ts +21 -0
- package/scripts/lib/stamped-memo.ts +63 -0
- package/scripts/lib/stdout-on-stderr.ts +24 -0
- package/scripts/lib/timeouts.ts +9 -0
- package/scripts/lib/token-shape.ts +111 -0
- package/scripts/lib/transcript-record.ts +91 -0
- package/scripts/lines/effective-limit.ts +1 -1
- package/scripts/lint/eslint-cache-dependencies.ts +145 -0
- package/scripts/lint/eslint-daemon-sources.ts +79 -0
- package/scripts/lint/eslint-daemon.ts +304 -0
- package/scripts/lint/eslint-warm-cli.ts +7 -0
- package/scripts/lint/eslint-warm.ts +66 -0
- package/scripts/lint/format.ts +11 -2
- package/scripts/lint/import-graph.ts +409 -0
- package/scripts/lint/lint-gate-scope.ts +102 -0
- package/scripts/lint/lint-parallel-main.ts +19 -0
- package/scripts/lint/lint-parallel.ts +113 -33
- package/scripts/lint/lint-related-scope.ts +30 -24
- package/scripts/lint/lint-related.ts +183 -30
- package/scripts/lint/rename-cli.ts +179 -0
- package/scripts/lint/rename-identifier.ts +192 -0
- package/scripts/lint/type-only-imports.ts +58 -0
- package/scripts/notify/confirmation-options.ts +1 -2
- package/scripts/notify/telegram-notify.ts +32 -23
- package/scripts/notify/telegram-test-logic.ts +0 -1
- package/scripts/notify/telegram-test-main.ts +8 -0
- package/scripts/notify/telegram-test.ts +2 -6
- package/scripts/observations/observation-ledger.ts +13 -0
- package/scripts/observations/observation-record.ts +42 -16
- package/scripts/observations/observations-flush-landing.ts +5 -3
- package/scripts/observations/observations-flush.ts +38 -10
- package/scripts/overrides/overrides-check.ts +11 -6
- package/scripts/overrides/overrides-files.ts +2 -1
- package/scripts/overrides/overrides-logic.ts +3 -6
- package/scripts/package/verify-optional-eslint-install.ts +8 -6
- package/scripts/propagate/propagate-publish.ts +2 -7
- package/scripts/propagate/propagate-targets.ts +4 -12
- package/scripts/refactor/import-graph.ts +9 -7
- package/scripts/release/github-release-runs.ts +17 -6
- package/scripts/release/release-approval-prune.ts +24 -0
- package/scripts/release/release-history.ts +1 -3
- package/scripts/release/release-progress.ts +42 -22
- package/scripts/release/release-publish-run.ts +39 -0
- package/scripts/release/release-publish.ts +6 -6
- package/scripts/release/release-scope-cli.ts +0 -10
- package/scripts/release/release-scope-main.ts +12 -0
- package/scripts/repo/repo-setting.ts +3 -6
- package/scripts/repo/required-checks-logic.ts +10 -16
- package/scripts/repo/ruleset-check.ts +4 -3
- package/scripts/report/markdown-shape.ts +28 -0
- package/scripts/report/report-format-reference.ts +17 -1
- package/scripts/report/report-labels.ts +166 -0
- package/scripts/report/report-lint-child-summary.ts +94 -0
- package/scripts/report/report-lint-cli.ts +29 -7
- package/scripts/report/report-lint.ts +85 -128
- package/scripts/report/report-template-cli.ts +59 -0
- package/scripts/report/report-template.ts +112 -0
- package/scripts/review/acceptance-map.ts +1 -0
- package/scripts/review/prose-stale-cli.ts +88 -0
- package/scripts/review/prose-stale-scan.ts +152 -0
- package/scripts/review/removed-tests-check.ts +86 -0
- package/scripts/review/removed-tests.ts +149 -0
- package/scripts/review/review-attest.ts +73 -23
- package/scripts/review/review-brief-cli.ts +138 -23
- package/scripts/review/review-brief-main.ts +12 -0
- package/scripts/review/review-brief-paths.ts +22 -0
- package/scripts/review/review-brief.ts +45 -10
- package/scripts/review/review-code-tree.ts +10 -6
- package/scripts/review/review-comment-carry.ts +47 -0
- package/scripts/review/review-comment-round.ts +111 -30
- package/scripts/review/review-finding-ledger.ts +135 -18
- package/scripts/review/review-finding-text.ts +43 -0
- package/scripts/review/review-interaction.ts +105 -0
- package/scripts/review/review-lane-handover.ts +68 -0
- package/scripts/review/review-lint-cli.ts +57 -0
- package/scripts/review/review-lint-findings.ts +92 -0
- package/scripts/review/review-lint-sections.ts +80 -0
- package/scripts/review/review-lint.ts +221 -0
- package/scripts/review/review-prior-findings.ts +102 -0
- package/scripts/review/review-readers-scan.ts +165 -0
- package/scripts/review/review-record-cli.ts +236 -74
- package/scripts/review/review-record-code-round.ts +55 -0
- package/scripts/review/review-record-comment.ts +60 -0
- package/scripts/review/review-record-interaction.ts +35 -0
- package/scripts/review/review-record-main.ts +12 -0
- package/scripts/review/review-record-pinned.ts +108 -0
- package/scripts/review/review-record.ts +25 -1
- package/scripts/review/review-reviewed-tree.ts +307 -0
- package/scripts/review/review-round-one-blobs.ts +221 -0
- package/scripts/review/review-round-one-closure.ts +62 -0
- package/scripts/review/review-round-reuse.ts +106 -0
- package/scripts/review/review-round2-cli.ts +135 -36
- package/scripts/review/review-round2-skip-comment.ts +55 -0
- package/scripts/review/review-round2.ts +103 -19
- package/scripts/review/review-stamps.ts +23 -1
- package/scripts/review/review-stop-log.ts +110 -0
- package/scripts/review/review-stops-cli.ts +86 -0
- package/scripts/review/review-submit-cli.ts +101 -0
- package/scripts/review/review-tree.ts +6 -17
- package/scripts/review/review-untouched-readers.ts +146 -0
- package/scripts/review/test-titles.ts +118 -0
- package/scripts/rules/agent-model.ts +9 -1
- package/scripts/rules/bash-triggers.ts +49 -6
- package/scripts/rules/concise-reply.ts +88 -0
- package/scripts/rules/credential-body.ts +77 -0
- package/scripts/rules/decision-oracle-batch.ts +9 -1
- package/scripts/rules/decision-oracle.ts +3 -3
- package/scripts/rules/delivered-rules.ts +115 -18
- package/scripts/rules/destructive-command.ts +11 -12
- package/scripts/rules/direct-filing.ts +10 -2
- package/scripts/rules/direct-issue-comment.ts +139 -0
- package/scripts/rules/direct-issue-read.ts +191 -0
- package/scripts/rules/direct-pr-create.ts +72 -26
- package/scripts/rules/early-heartbeat.ts +4 -1
- package/scripts/rules/edit-tool.ts +27 -0
- package/scripts/rules/file-body.ts +7 -0
- package/scripts/rules/file-edit-rows.ts +17 -0
- package/scripts/rules/file-rewrite.ts +146 -0
- package/scripts/rules/firing-point.ts +3 -2
- package/scripts/rules/gh-api.ts +128 -7
- package/scripts/rules/gh-repo-selector.ts +84 -0
- package/scripts/rules/git-argv.ts +72 -14
- package/scripts/rules/git-force.ts +14 -4
- package/scripts/rules/guard-remedy.ts +17 -4
- package/scripts/rules/implementation-cut-verdict.ts +1 -1
- package/scripts/rules/implementation-cut.ts +68 -27
- package/scripts/rules/index-guard.ts +8 -1
- package/scripts/rules/investigator-foreground.ts +231 -0
- package/scripts/rules/issue-citation.ts +15 -60
- package/scripts/rules/issue-comments.ts +18 -5
- package/scripts/rules/josh-git-bare.ts +7 -0
- package/scripts/rules/lane-background.ts +103 -33
- package/scripts/rules/lane-carry-conflict.ts +6 -0
- package/scripts/rules/lane-direct-tool.ts +172 -0
- package/scripts/rules/lane-interactive-ask.ts +12 -2
- package/scripts/rules/lane-park.ts +49 -25
- package/scripts/rules/lane-spilled-read.ts +90 -0
- package/scripts/rules/lane-split-park.ts +11 -3
- package/scripts/rules/lane-switch-main.ts +11 -4
- package/scripts/rules/last-prompt.ts +20 -47
- package/scripts/rules/oracle-consulted.ts +11 -1
- package/scripts/rules/oracle-firing.ts +1 -0
- package/scripts/rules/permission-guards.ts +7 -0
- package/scripts/rules/piped-verification-shapes.ts +110 -0
- package/scripts/rules/piped-verification.ts +68 -18
- package/scripts/rules/poll-loop.ts +78 -8
- package/scripts/rules/pr-merge.ts +123 -0
- package/scripts/rules/pre-gate-cut.ts +3 -3
- package/scripts/rules/protected-files.ts +113 -22
- package/scripts/rules/raw-field-body.ts +6 -0
- package/scripts/rules/reply-language.ts +3 -17
- package/scripts/rules/reply-prose.ts +34 -0
- package/scripts/rules/repo-admin.ts +132 -0
- package/scripts/rules/reviewer-foreground.ts +88 -0
- package/scripts/rules/round-one-check-related.ts +120 -0
- package/scripts/rules/rule-body-guard.ts +13 -15
- package/scripts/rules/rule-list.ts +9 -28
- package/scripts/rules/rule-value-cache.ts +57 -14
- package/scripts/rules/rule-value-candidates.ts +84 -0
- package/scripts/rules/rule-value-cli.ts +106 -39
- package/scripts/rules/rule-value.ts +18 -5
- package/scripts/rules/run-tail-rule.ts +1 -1
- package/scripts/rules/sed-in-place.ts +196 -0
- package/scripts/rules/shell-segments.ts +43 -0
- package/scripts/rules/stop-rule-rows.ts +52 -0
- package/scripts/rules/stop-rules.ts +36 -62
- package/scripts/rules/test-declared-commit.ts +11 -1
- package/scripts/rules/third-party-write.ts +115 -21
- package/scripts/rules/timed-rerun.ts +69 -0
- package/scripts/rules/turn-filings.ts +90 -0
- package/scripts/rules/worktree-guard.ts +32 -7
- package/scripts/run/board/run-board-app-name.ts +23 -0
- package/scripts/run/board/run-board-cli.ts +65 -32
- package/scripts/run/board/run-board-earlier.ts +94 -0
- package/scripts/run/board/run-board-ending-reason.ts +71 -0
- package/scripts/run/board/run-board-estimate-schedule.ts +103 -0
- package/scripts/run/board/run-board-estimate.ts +98 -0
- package/scripts/run/board/run-board-fit.ts +177 -37
- package/scripts/run/board/run-board-fold.ts +123 -0
- package/scripts/run/board/run-board-found.ts +134 -0
- package/scripts/run/board/run-board-fresh.ts +2 -2
- package/scripts/run/board/run-board-gather-live.ts +29 -0
- package/scripts/run/board/run-board-gather-thread.ts +189 -0
- package/scripts/run/board/run-board-gather-worker.ts +29 -0
- package/scripts/run/board/run-board-gather.ts +187 -0
- package/scripts/run/board/run-board-github.ts +118 -38
- package/scripts/run/board/run-board-header.ts +90 -20
- package/scripts/run/board/run-board-keys.ts +58 -0
- package/scripts/run/board/run-board-kind.ts +20 -6
- package/scripts/run/board/run-board-labels.ts +126 -71
- package/scripts/run/board/run-board-lane-state.ts +109 -0
- package/scripts/run/board/run-board-lane-time.ts +123 -0
- package/scripts/run/board/run-board-layout.ts +239 -60
- package/scripts/run/board/run-board-length.ts +52 -0
- package/scripts/run/board/run-board-link.ts +15 -2
- package/scripts/run/board/run-board-machine.ts +8 -4
- package/scripts/run/board/run-board-main.ts +12 -0
- package/scripts/run/board/run-board-notes.ts +59 -32
- package/scripts/run/board/run-board-now.ts +1 -1
- package/scripts/run/board/run-board-operation.ts +19 -35
- package/scripts/run/board/run-board-phase.ts +3 -6
- package/scripts/run/board/run-board-plan-shared.ts +115 -0
- package/scripts/run/board/run-board-plan.ts +56 -4
- package/scripts/run/board/run-board-planning.ts +45 -0
- package/scripts/run/board/run-board-priority.ts +44 -0
- package/scripts/run/board/run-board-process-groups.ts +195 -0
- package/scripts/run/board/run-board-read.ts +197 -28
- package/scripts/run/board/run-board-reason.ts +247 -51
- package/scripts/run/board/run-board-released.ts +35 -0
- package/scripts/run/board/run-board-render-checks.ts +42 -7
- package/scripts/run/board/run-board-render-condition.ts +96 -0
- package/scripts/run/board/run-board-render-drawn.ts +78 -0
- package/scripts/run/board/run-board-render-foot.ts +59 -0
- package/scripts/run/board/run-board-render-found.ts +157 -0
- package/scripts/run/board/run-board-render-icon.ts +35 -0
- package/scripts/run/board/run-board-render-lanes.ts +145 -0
- package/scripts/run/board/run-board-render-lead.ts +89 -0
- package/scripts/run/board/run-board-render-legend.ts +136 -48
- package/scripts/run/board/run-board-render-notes.ts +156 -29
- package/scripts/run/board/run-board-render-processes.ts +196 -0
- package/scripts/run/board/run-board-render-section.ts +119 -0
- package/scripts/run/board/run-board-render-slot.ts +3 -36
- package/scripts/run/board/run-board-render-tail.ts +115 -48
- package/scripts/run/board/run-board-render-time.ts +56 -0
- package/scripts/run/board/run-board-render-title.ts +117 -24
- package/scripts/run/board/run-board-render-waits.ts +104 -20
- package/scripts/run/board/run-board-render.ts +264 -258
- package/scripts/run/board/run-board-roots.ts +54 -0
- package/scripts/run/board/run-board-row-yield.ts +9 -4
- package/scripts/run/board/run-board-setup.ts +1 -12
- package/scripts/run/board/run-board-snapshot.ts +111 -0
- package/scripts/run/board/run-board-spin.ts +3 -5
- package/scripts/run/board/run-board-state.ts +22 -33
- package/scripts/run/board/run-board-status.ts +149 -71
- package/scripts/run/board/run-board-thanks-read.ts +2 -2
- package/scripts/run/board/run-board-tick.ts +158 -114
- package/scripts/run/board/run-board-usage-board.ts +78 -0
- package/scripts/run/board/run-board-usage-lanes.ts +113 -0
- package/scripts/run/board/run-board-usage-listing.ts +93 -0
- package/scripts/run/board/run-board-usage-read.ts +120 -150
- package/scripts/run/board/run-board-usage-rusage.ts +19 -7
- package/scripts/run/board/run-board-usage-text.ts +139 -51
- package/scripts/run/board/run-board-usage-top.ts +102 -0
- package/scripts/run/board/run-board-usage.ts +89 -72
- package/scripts/run/board/run-board-usual.ts +20 -9
- package/scripts/run/carry/run-carry-args.ts +4 -7
- package/scripts/run/carry/run-carry-conversation.ts +1 -1
- package/scripts/run/carry/run-carry-ended.ts +3 -2
- package/scripts/run/carry/run-carry.ts +12 -6
- package/scripts/run/cut/run-cut-cli.ts +33 -133
- package/scripts/run/cut/run-cut-digest.ts +152 -0
- package/scripts/run/cut/run-cut-handoff.ts +54 -10
- package/scripts/run/cut/run-cut-report.ts +24 -3
- package/scripts/run/cut/run-cut-resume.ts +129 -0
- package/scripts/run/cut/run-cut-review.ts +105 -0
- package/scripts/run/cut/run-cut.ts +18 -7
- package/scripts/run/detached-launch.ts +1 -1
- package/scripts/run/entry/run-entry-cli.ts +88 -19
- package/scripts/run/entry/run-entry-spill.ts +83 -0
- package/scripts/run/entry/run-entry-stop.ts +5 -1
- package/scripts/run/entry/run-entry-trust.ts +91 -0
- package/scripts/run/event/run-event-baseline.ts +56 -0
- package/scripts/run/event/run-event-cli.ts +1 -5
- package/scripts/run/event/run-event-filed.ts +18 -6
- package/scripts/run/event/run-event-follow.ts +2 -3
- package/scripts/run/event/run-event-overrun.ts +197 -0
- package/scripts/run/event/run-event-render.ts +10 -10
- package/scripts/run/event/run-event-scope.ts +2 -2
- package/scripts/run/event/run-event-stream-emit.ts +82 -22
- package/scripts/run/event/run-event-stream.ts +58 -10
- package/scripts/run/hold/run-hold-adopt.ts +65 -0
- package/scripts/run/hold/run-hold-cli.ts +93 -22
- package/scripts/run/hold/run-hold-main.ts +12 -0
- package/scripts/run/hold/run-hold-member.ts +37 -0
- package/scripts/run/hold/run-stop-notify.ts +178 -0
- package/scripts/run/merge/run-merge-auth.ts +31 -0
- package/scripts/run/merge/run-merge-cap.ts +57 -0
- package/scripts/run/merge/run-merge-cli.ts +119 -62
- package/scripts/run/merge/run-merge-close.ts +74 -0
- package/scripts/run/merge/run-merge-collect.ts +6 -13
- package/scripts/run/merge/run-merge-driver.ts +71 -0
- package/scripts/run/merge/run-merge-main.ts +12 -0
- package/scripts/run/merge/run-merge-outcome.ts +25 -0
- package/scripts/run/merge/run-merge-restart.ts +39 -0
- package/scripts/run/merge/run-merge-ship.ts +33 -7
- package/scripts/run/merge/run-merge-signals.ts +66 -25
- package/scripts/run/merge/run-merge-steps.ts +162 -107
- package/scripts/run/merge/run-merge-usage-limit.ts +53 -0
- package/scripts/run/merge/run-merge-withdrawn.ts +53 -0
- package/scripts/run/merge/run-merge.ts +76 -48
- package/scripts/run/park/run-park-cli.ts +91 -0
- package/scripts/run/park/run-park.ts +88 -0
- package/scripts/run/park/run-stalled.ts +68 -0
- package/scripts/run/pause/run-pause-cli.ts +73 -0
- package/scripts/run/pause/run-pause.ts +251 -0
- package/scripts/run/progress/run-progress-cli.ts +4 -12
- package/scripts/run/progress/run-progress-clock.ts +1 -1
- package/scripts/run/progress/run-progress-config.ts +6 -14
- package/scripts/run/progress/run-progress-main.ts +12 -0
- package/scripts/run/progress/run-progress.ts +1 -4
- package/scripts/run/review/run-review-cli.ts +306 -20
- package/scripts/run/review/run-review-early-push.ts +121 -0
- package/scripts/run/review/run-review-join-read.ts +94 -0
- package/scripts/run/review/run-review-pinned-accepted.ts +126 -0
- package/scripts/run/review/run-review-pinned-join.ts +216 -0
- package/scripts/run/review/run-review-pinned-steps.ts +383 -0
- package/scripts/run/review/run-review-pinned-tree.ts +37 -0
- package/scripts/run/review/run-review-pinned.ts +53 -0
- package/scripts/run/review/run-review-steps.ts +70 -34
- package/scripts/run/review/run-review.ts +28 -7
- package/scripts/run/run-ending.ts +1 -0
- package/scripts/run/run-invocation.ts +5 -6
- package/scripts/run/run-liveness-cli.ts +6 -8
- package/scripts/run/run-liveness.ts +60 -29
- package/scripts/run/run-next.ts +1 -1
- package/scripts/run/run-parent-cut-hook.ts +3 -4
- package/scripts/run/run-preflight.ts +18 -3
- package/scripts/run/run-prep-cli.ts +1 -10
- package/scripts/run/run-prep-locate.ts +7 -50
- package/scripts/run/run-prep-main.ts +12 -0
- package/scripts/run/run-prep.ts +7 -0
- package/scripts/run/run-report-cli.ts +101 -13
- package/scripts/run/run-report-handoff.ts +114 -0
- package/scripts/run/run-stage-read.ts +2 -6
- package/scripts/run/run-step-cli.ts +17 -5
- package/scripts/run/run-step-lane-plan.ts +27 -0
- package/scripts/run/run-step-section.ts +26 -7
- package/scripts/run/run-step.ts +6 -3
- package/scripts/run/run-stranded-detect.ts +13 -0
- package/scripts/run/run-watcher-guard-cli.ts +1 -1
- package/scripts/run/run-watcher-guard.ts +1 -1
- package/scripts/run/ship/run-ship-args.ts +140 -0
- package/scripts/run/ship/run-ship-body-draft.ts +110 -0
- package/scripts/run/ship/run-ship-brokered-review.ts +106 -0
- package/scripts/run/ship/run-ship-cli.ts +181 -166
- package/scripts/run/ship/run-ship-conflict-probe.ts +59 -0
- package/scripts/run/ship/run-ship-detach.ts +29 -12
- package/scripts/run/ship/run-ship-handover.ts +106 -0
- package/scripts/run/ship/run-ship-infra-retry.ts +74 -0
- package/scripts/run/ship/run-ship-lap.ts +63 -0
- package/scripts/run/ship/run-ship-next.ts +44 -27
- package/scripts/run/ship/run-ship-overlap.ts +49 -7
- package/scripts/run/ship/run-ship-place.ts +103 -0
- package/scripts/run/ship/run-ship-planned.ts +92 -0
- package/scripts/run/ship/run-ship-pre-detach-pinned.ts +197 -0
- package/scripts/run/ship/run-ship-pre-detach-timed.ts +42 -0
- package/scripts/run/ship/run-ship-pre-detach.ts +144 -33
- package/scripts/run/ship/run-ship-preflight.ts +150 -33
- package/scripts/run/ship/run-ship-probe.ts +28 -6
- package/scripts/run/ship/run-ship-relaunch-cap.ts +106 -0
- package/scripts/run/ship/run-ship-relaunch.ts +51 -0
- package/scripts/run/ship/run-ship-removed-rows.ts +61 -0
- package/scripts/run/ship/run-ship-return.ts +183 -25
- package/scripts/run/ship/run-ship-review-reason.ts +24 -0
- package/scripts/run/ship/run-ship-review-steps.ts +296 -171
- package/scripts/run/ship/run-ship-review.ts +222 -35
- package/scripts/run/ship/run-ship-reviewer.ts +303 -0
- package/scripts/run/ship/run-ship-scoped.ts +39 -10
- package/scripts/run/ship/run-ship-stage.ts +101 -16
- package/scripts/run/ship/run-ship-steps.ts +68 -17
- package/scripts/run/ship/run-ship-stop-cause.ts +176 -0
- package/scripts/run/ship/run-ship-stop-context.ts +50 -13
- package/scripts/run/ship/run-ship-stop-text.ts +11 -6
- package/scripts/run/ship/run-ship-sync.ts +212 -34
- package/scripts/run/ship/run-ship-synced-scope.ts +178 -0
- package/scripts/run/ship/run-ship-wait-cli.ts +145 -0
- package/scripts/run/ship/run-ship-waiter.ts +114 -0
- package/scripts/run/ship/run-ship.ts +44 -2
- package/scripts/run/tidy/run-tidy-cli.ts +0 -4
- package/scripts/run/tidy/run-tidy-lanes.ts +3 -0
- package/scripts/run/tidy/run-tidy-main.ts +8 -0
- package/scripts/run/wake/run-wake-caffeinate.ts +48 -0
- package/scripts/run/wake/run-wake-cli.ts +121 -209
- package/scripts/run/wake/run-wake-code.ts +125 -0
- package/scripts/run/wake/run-wake-driver.ts +22 -9
- package/scripts/run/wake/run-wake-finish.ts +137 -0
- package/scripts/run/wake/run-wake-loop.ts +36 -3
- package/scripts/run/wake/run-wake-main.ts +13 -0
- package/scripts/run/wake/run-wake-ports.ts +98 -0
- package/scripts/run/wake/run-wake-session.ts +2 -0
- package/scripts/run/wake/run-wake-takeover.ts +66 -0
- package/scripts/run/wake/run-wake.ts +5 -3
- package/scripts/safe-chain/ci-installer-pin.ts +49 -8
- package/scripts/safe-chain/pack-hook.ts +2 -2
- package/scripts/safe-chain/preinstall-command.ts +2 -1
- package/scripts/safe-chain/project-config.ts +6 -11
- package/scripts/security/secretlint-scan.ts +42 -9
- package/scripts/security/security-audit-main.ts +8 -0
- package/scripts/security/security-audit-provision-logic.ts +0 -11
- package/scripts/security/security-audit-provision-main.ts +20 -0
- package/scripts/security/security-audit-provision.ts +12 -27
- package/scripts/security/security-audit.ts +27 -8
- package/scripts/security/sonar-file.ts +10 -5
- package/scripts/self-sync-guard/self-sync-guard-logic.ts +6 -13
- package/scripts/split/split-assess-cli.ts +2 -2
- package/scripts/split/split-assess.ts +25 -1
- package/scripts/split/split-early-notice.ts +116 -0
- package/scripts/split/split-measure.ts +83 -0
- package/scripts/split/split-resolution.ts +107 -0
- package/scripts/sync/claude-settings-merge.ts +8 -15
- package/scripts/sync/directory-copy-guard.ts +4 -9
- package/scripts/sync/file-content.ts +78 -8
- package/scripts/sync/sync-ai-files.ts +3 -5
- package/scripts/sync/sync-configs.ts +11 -23
- package/scripts/sync/sync-hook-safety.ts +4 -10
- package/scripts/sync/sync-main.ts +11 -0
- package/scripts/sync/sync.ts +25 -37
- package/scripts/test/direct-importers.ts +185 -0
- package/scripts/test/pure-files-entries.ts +83 -0
- package/scripts/test/related-heavy-tests.ts +81 -0
- package/scripts/test/test-declared-changed.ts +2 -2
- package/scripts/test/test-declared.ts +1 -1
- package/scripts/test/test-e2e-guard.ts +25 -1
- package/scripts/test/test-e2e-stamp.ts +38 -0
- package/scripts/test/test-no-base.ts +88 -0
- package/scripts/test/test-pinned-cache-logic.ts +363 -0
- package/scripts/test/test-pinned-cache.ts +337 -0
- package/scripts/test/test-pinned-emit.ts +49 -0
- package/scripts/test/test-pinned-functions.ts +116 -0
- package/scripts/test/test-pinned-ledger.ts +80 -0
- package/scripts/test/test-pinned-logic.ts +333 -0
- package/scripts/test/test-pinned-main.ts +144 -0
- package/scripts/test/test-pinned-pool.ts +73 -0
- package/scripts/test/test-pinned-probe.ts +254 -0
- package/scripts/test/test-pinned-prune-logic.ts +118 -0
- package/scripts/test/test-pinned-reach.ts +194 -0
- package/scripts/test/test-pinned-record.ts +196 -0
- package/scripts/test/test-pinned-rewire.ts +148 -0
- package/scripts/test/test-pinned-spawn.ts +81 -0
- package/scripts/test/test-pinned-stage.ts +70 -0
- package/scripts/test/test-pinned.ts +311 -0
- package/scripts/test/test-reach-cli.ts +61 -0
- package/scripts/test/test-read-map.ts +288 -0
- package/scripts/test/test-read-recording.ts +103 -0
- package/scripts/test/test-read-trace.ts +166 -0
- package/scripts/test/test-red-logic.ts +46 -7
- package/scripts/test/test-red-main.ts +12 -0
- package/scripts/test/test-red.ts +39 -37
- package/scripts/test/test-related-claim.ts +37 -0
- package/scripts/test/test-related-main.ts +21 -0
- package/scripts/test/test-related-moved.ts +91 -0
- package/scripts/test/test-related-record.ts +139 -0
- package/scripts/test/test-related-scope.ts +292 -41
- package/scripts/test/test-related-synced.ts +135 -0
- package/scripts/test/test-related-touched.ts +84 -0
- package/scripts/test/test-related.ts +381 -19
- package/scripts/test/test-unit-guard-main.ts +15 -0
- package/scripts/test/test-unit-guard.ts +66 -25
- package/scripts/test/unit-count-file.ts +37 -0
- package/scripts/test/unit-durations.ts +41 -0
- package/scripts/test/unit-run-marker.ts +162 -0
- package/scripts/test/unit-setup-files.ts +51 -0
- package/scripts/test/unit-worker-share.ts +64 -151
- package/scripts/test/vitest-cache-directory.ts +19 -0
- package/scripts/test/vitest-cli-excludes.ts +14 -0
- package/scripts/test/vitest-failure-summary.ts +111 -0
- package/scripts/test/whole-suite-files.ts +74 -0
- package/scripts/time-runtime/time-background.ts +20 -2
- package/scripts/time-runtime/time-batch-guard.ts +42 -4
- package/scripts/time-runtime/time-bundle-call.ts +1 -1
- package/scripts/time-runtime/time-bundles.ts +40 -8
- package/scripts/time-runtime/time-density-hook.ts +8 -6
- package/scripts/time-runtime/time-followup-stage.ts +1 -3
- package/scripts/time-runtime/time-format.ts +5 -28
- package/scripts/time-runtime/time-markers.ts +12 -3
- package/scripts/time-runtime/time-search-call.ts +38 -0
- package/scripts/time-runtime/time-shell.ts +98 -11
- package/scripts/time-runtime/time-transcript-line.ts +65 -66
- package/scripts/uninstall/uninstall.ts +1 -1
- package/scripts/version/bump-version-main.ts +12 -0
- package/scripts/version/bump-version.ts +25 -25
- package/scripts/version/development-engines-verdict.ts +124 -0
- package/scripts/version/effective-upstream.ts +6 -12
- package/scripts/version/latest-corepack.ts +19 -32
- package/scripts/version/latest-if-required-cli.ts +93 -0
- package/scripts/version/latest-lane-guard-main.ts +8 -0
- package/scripts/version/latest-lane-guard.ts +0 -4
- package/scripts/version/latest-scope-cli.ts +0 -9
- package/scripts/version/latest-scope-main.ts +12 -0
- package/scripts/version/latest-update.ts +5 -5
- package/scripts/version/npm-registry.ts +44 -6
- package/scripts/version/publishable-range-check.ts +5 -16
- package/scripts/version/release-age.ts +1 -1
- package/scripts/version/release-hold.ts +1 -1
- package/scripts/version/release-window.ts +38 -0
- package/scripts/version/running-binary.ts +1 -1
- package/scripts/version/safe-chain-version-update.ts +3 -8
- package/scripts/version/version-targets.ts +6 -28
- package/templates/dependabot.yml +29 -0
- package/templates/gitignore +6 -1
- package/templates/pnpm-workspace.basic.yaml +1 -1
- package/templates/sonar-project.properties +3 -2
- package/templates/workflows/ci.yml +53 -4
- package/templates/workflows/github-release.yml +4 -0
- package/tsconfig.sonar.json +1 -1
- package/.ncurc.json +0 -3
- package/dist/hooks/batch-guard.js +0 -29
- package/dist/hooks/chunk-4KKD2UTK.js +0 -66
- package/dist/hooks/chunk-6TS2JD6D.js +0 -237
- package/dist/hooks/chunk-7DSBJVFH.js +0 -50
- package/dist/hooks/chunk-A65Y4YOR.js +0 -79
- package/dist/hooks/chunk-APUO6U4J.js +0 -2451
- package/dist/hooks/chunk-CDY4NFQG.js +0 -15
- package/dist/hooks/chunk-DGT54IH5.js +0 -161
- package/dist/hooks/chunk-EFXE6C37.js +0 -81
- package/dist/hooks/chunk-GP4IEC4O.js +0 -20
- package/dist/hooks/chunk-JP45SOCJ.js +0 -56
- package/dist/hooks/chunk-LAOV7NLM.js +0 -45
- package/dist/hooks/chunk-M4HGZV7U.js +0 -83
- package/dist/hooks/chunk-O6GDRNJB.js +0 -343
- package/dist/hooks/chunk-PF2NZL2A.js +0 -131
- package/dist/hooks/chunk-PTICX4OL.js +0 -358
- package/dist/hooks/chunk-RT27QRJW.js +0 -6247
- package/dist/hooks/chunk-SYOTDYCI.js +0 -3533
- package/dist/hooks/chunk-TNUMY6NL.js +0 -4838
- package/dist/hooks/chunk-UPUZF3AN.js +0 -279
- package/dist/hooks/chunk-WK6SMBIC.js +0 -3180
- package/dist/hooks/duplicate-read-guard.js +0 -30
- package/dist/hooks/investigation-guard.js +0 -29
- package/scripts/backlog/backlog-stalled-cli.ts +0 -30
- package/scripts/cost-runtime/context-cut-threshold.ts +0 -11
- package/scripts/cost-runtime/cost-format.ts +0 -29
- package/scripts/init/basic-path-migration.ts +0 -24
- package/scripts/issue/issue-backlinks-cli.ts +0 -93
- package/scripts/josh/josh-commands-guard.ts +0 -38
- package/scripts/josh/josh-usage-automation.ts +0 -121
- package/scripts/josh/josh-usage-backlog.ts +0 -180
- package/scripts/josh/josh-usage-developer.ts +0 -230
- package/scripts/josh/josh-usage-hooks.ts +0 -38
- package/scripts/josh/josh-usage-issue.ts +0 -205
- package/scripts/josh/josh-usage-review.ts +0 -101
- package/scripts/josh/josh-usage-run.ts +0 -252
- package/scripts/josh/josh-usage-session.ts +0 -238
- package/scripts/josh/josh-usage-workflow.ts +0 -212
- package/scripts/lint/cross-file-recheck.ts +0 -155
- package/scripts/registry-migration/migrate-logic.ts +0 -237
- package/scripts/registry-migration/migrate.ts +0 -292
- package/scripts/registry-migration/user-npmrc.ts +0 -15
- package/scripts/rules/filing-cap.ts +0 -132
- package/scripts/rules/rule-guard.ts +0 -23
- package/scripts/rules/rule-registry-rows.ts +0 -292
- package/scripts/rules/rule-registry.ts +0 -112
- package/scripts/run/run-stranded-cli.ts +0 -27
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
import { fileURLToPath } from 'node:url'
|
|
3
|
+
import { parseArgs } from 'node:util'
|
|
4
|
+
import { review_tree } from '#scripts/review/review-tree'
|
|
5
|
+
import { test_pinned } from './test-pinned'
|
|
6
|
+
import { test_pinned_ledger, type PinnedOrigin } from './test-pinned-ledger'
|
|
7
|
+
import { test_pinned_logic, type PinnedReport } from './test-pinned-logic'
|
|
8
|
+
import { test_pinned_record, type PinnedSummary } from './test-pinned-record'
|
|
9
|
+
|
|
10
|
+
// The `josh test:pinned` entry: read `--max`, run, print one line per unpinned hunk and per unchecked
|
|
11
|
+
// reason (each unchecked place in the `full output:` log), and exit non-zero when any checked hunk is unpinned. An unchecked hunk alone does not fail the run — it
|
|
12
|
+
// was not asked about.
|
|
13
|
+
|
|
14
|
+
const CLEAN_EXIT = 0
|
|
15
|
+
const FAILED_EXIT = 1
|
|
16
|
+
const ARGV_OFFSET = 2
|
|
17
|
+
const USAGE = [
|
|
18
|
+
'Usage: josh test:pinned [--max <n>] [--record <token>] [--origin <run-review|pre-detach|manual>] [--first-unpinned] [--help]',
|
|
19
|
+
' revert each changed code hunk outside tests and fixtures only they reach, and run its related tests;',
|
|
20
|
+
' prints `unpinned <file>:<line>` for a hunk no test went red on, and',
|
|
21
|
+
` \`unchecked <n> — <reason>\` for the hunks past the --max cap (default ${String(test_pinned_logic.DEFAULT_MAX_HUNKS)})`,
|
|
22
|
+
' or whose revert stopped vitest before any test ran, each place listed in the `full output:` log;',
|
|
23
|
+
' --record also leaves the answer, under <token>, for `josh run:review --join`;',
|
|
24
|
+
' --origin names what started the run on its lane ledger row (default manual);',
|
|
25
|
+
' hunks run fewest reached tests first, and --first-unpinned starts no probe once one is unpinned',
|
|
26
|
+
].join('\n')
|
|
27
|
+
|
|
28
|
+
const PARSE_ARGS_OPTIONS = {
|
|
29
|
+
help: { type: 'boolean', short: 'h', default: false },
|
|
30
|
+
'first-unpinned': { type: 'boolean', default: false },
|
|
31
|
+
max: { type: 'string' },
|
|
32
|
+
origin: { type: 'string' },
|
|
33
|
+
record: { type: 'string' },
|
|
34
|
+
} as const
|
|
35
|
+
|
|
36
|
+
const HELP_FLAGS: ReadonlySet<string> = new Set(['--help', '-h'])
|
|
37
|
+
// A tree still moving after this many checks is answered as not checked rather than waited on.
|
|
38
|
+
const MAX_CHECKS = 3
|
|
39
|
+
const MOVING_NOTE = `the tree kept moving across ${String(MAX_CHECKS)} checks`
|
|
40
|
+
|
|
41
|
+
interface PinnedOptions {
|
|
42
|
+
max_hunks: number
|
|
43
|
+
record_token: string | undefined
|
|
44
|
+
is_first_unpinned: boolean
|
|
45
|
+
origin: PinnedOrigin
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// A `--max` that is not a whole number above zero is a refusal, not the default.
|
|
49
|
+
function valid_max(raw: string | undefined): number | undefined {
|
|
50
|
+
const max = Number(raw ?? test_pinned_logic.DEFAULT_MAX_HUNKS)
|
|
51
|
+
|
|
52
|
+
return Number.isSafeInteger(max) && max > 0 ? max : undefined
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// `undefined` prints the usage: a help request, an unknown flag, a missing or invalid `--max`, or an
|
|
56
|
+
// `--origin` not among the three.
|
|
57
|
+
function options_of(argv: ReadonlyArray<string>): PinnedOptions | undefined {
|
|
58
|
+
try {
|
|
59
|
+
const { values } = parseArgs({ args: [...argv], options: PARSE_ARGS_OPTIONS, strict: true })
|
|
60
|
+
const max_hunks = valid_max(values.max)
|
|
61
|
+
const origin = test_pinned_ledger.origin_of(values.origin)
|
|
62
|
+
|
|
63
|
+
if (max_hunks === undefined || origin === undefined || values.help) return undefined
|
|
64
|
+
|
|
65
|
+
return {
|
|
66
|
+
max_hunks,
|
|
67
|
+
record_token: values.record,
|
|
68
|
+
is_first_unpinned: values['first-unpinned'],
|
|
69
|
+
origin,
|
|
70
|
+
}
|
|
71
|
+
} catch {
|
|
72
|
+
return undefined
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// Clean for an explicit help request; a refusal for anything the parse did not understand.
|
|
77
|
+
function print_usage(argv: ReadonlyArray<string>): number {
|
|
78
|
+
process.stderr.write(`${USAGE}\n`)
|
|
79
|
+
|
|
80
|
+
return argv.some((argument) => HELP_FLAGS.has(argument)) ? CLEAN_EXIT : FAILED_EXIT
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
async function tree_digest(): Promise<string> {
|
|
84
|
+
return JSON.stringify(await review_tree.read_changed_tree())
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// The recorded check runs beside a review that may fix in place, and it reads the tree at more than
|
|
88
|
+
// one moment; a check the tree moved under is run again, so its answer is about one tree.
|
|
89
|
+
async function settled_run(options: PinnedOptions): Promise<PinnedReport> {
|
|
90
|
+
for (let attempt = 0; attempt < MAX_CHECKS; attempt += 1) {
|
|
91
|
+
// eslint-disable-next-line no-await-in-loop -- each check runs only once the last one saw the tree move
|
|
92
|
+
const before = await tree_digest()
|
|
93
|
+
// eslint-disable-next-line no-await-in-loop -- as above
|
|
94
|
+
const report = await test_pinned.run(
|
|
95
|
+
options.max_hunks,
|
|
96
|
+
options.is_first_unpinned,
|
|
97
|
+
options.origin,
|
|
98
|
+
)
|
|
99
|
+
// eslint-disable-next-line no-await-in-loop -- as above
|
|
100
|
+
if ((await tree_digest()) === before) return report
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
throw new Error(MOVING_NOTE)
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
// `--record` leaves an answer however the run ends — a check that could not run included — so the
|
|
107
|
+
// join waiting on it never waits on a check that died.
|
|
108
|
+
async function recorded_run(options: PinnedOptions, token: string): Promise<PinnedSummary> {
|
|
109
|
+
try {
|
|
110
|
+
const summary = test_pinned_record.summary_of(await settled_run(options))
|
|
111
|
+
|
|
112
|
+
test_pinned_record.write(token, summary)
|
|
113
|
+
|
|
114
|
+
return summary
|
|
115
|
+
} catch (error: unknown) {
|
|
116
|
+
test_pinned_record.write(token, test_pinned_record.not_run_summary(error))
|
|
117
|
+
|
|
118
|
+
throw error
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
async function main(argv: ReadonlyArray<string>): Promise<number> {
|
|
123
|
+
const options = options_of(argv)
|
|
124
|
+
if (options === undefined) return print_usage(argv)
|
|
125
|
+
|
|
126
|
+
const summary =
|
|
127
|
+
options.record_token === undefined
|
|
128
|
+
? test_pinned_record.summary_of(
|
|
129
|
+
await test_pinned.run(options.max_hunks, options.is_first_unpinned, options.origin),
|
|
130
|
+
)
|
|
131
|
+
: await recorded_run(options, options.record_token)
|
|
132
|
+
|
|
133
|
+
process.stdout.write(test_pinned_logic.report_text(summary))
|
|
134
|
+
|
|
135
|
+
return summary.unpinned.length === 0 ? CLEAN_EXIT : FAILED_EXIT
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) {
|
|
139
|
+
process.exitCode = await main(process.argv.slice(ARGV_OFFSET))
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
const test_pinned_main = { main }
|
|
143
|
+
|
|
144
|
+
export { test_pinned_main }
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
// How `josh test:pinned` spreads its hunk checks over detached worktrees (joshuafolkken/kit#4706).
|
|
2
|
+
//
|
|
3
|
+
// **Two reverts in flight never share a tree**: each lane holds a tree of its own and checks its hunks
|
|
4
|
+
// one at a time, so a hunk's run sees only its own revert, as the serial run did. **The lanes fit the
|
|
5
|
+
// worker budget the run was admitted on** — at most one lane per worker, each vitest capped to its
|
|
6
|
+
// part of the budget — and never more than `MAX_TREES`, since each lane checks out a whole worktree.
|
|
7
|
+
|
|
8
|
+
const MAX_TREES = 4
|
|
9
|
+
const UNREAD_BUDGET = 1
|
|
10
|
+
|
|
11
|
+
interface LanePlan {
|
|
12
|
+
lanes: number
|
|
13
|
+
workers: number
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
// `budget` is the vitest workers the run may use; an unread one runs a single lane.
|
|
17
|
+
function lane_plan(count: number, budget: number = UNREAD_BUDGET): LanePlan {
|
|
18
|
+
const lanes = Math.max(1, Math.min(count, budget, MAX_TREES))
|
|
19
|
+
|
|
20
|
+
return { lanes, workers: Math.max(1, Math.floor(budget / lanes)) }
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
// The items each lane takes, dealt round-robin so the lanes stay within one item of each other.
|
|
24
|
+
function deal<T>(items: ReadonlyArray<T>, lanes: number): Array<Array<T>> {
|
|
25
|
+
const groups: Array<Array<T>> = Array.from({ length: lanes }, () => [])
|
|
26
|
+
|
|
27
|
+
for (const [index, item] of items.entries()) groups[index % lanes]?.push(item)
|
|
28
|
+
|
|
29
|
+
return groups.filter((group) => group.length > 0)
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// The lanes' answers, or the first lane's failure once every lane has ended — a failed lane never
|
|
33
|
+
// returns while the others still run their trees beside whatever the caller does next.
|
|
34
|
+
function settled<R>(outcomes: ReadonlyArray<PromiseSettledResult<R>>): Array<R> {
|
|
35
|
+
const failed = outcomes.find((outcome) => outcome.status === 'rejected')
|
|
36
|
+
if (failed !== undefined) throw failed.reason
|
|
37
|
+
|
|
38
|
+
return outcomes.flatMap((outcome) => (outcome.status === 'fulfilled' ? [outcome.value] : []))
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// Runs every lane at once; a lane answers its own items in the order it was dealt them.
|
|
42
|
+
async function run_lanes<T, R>(
|
|
43
|
+
items: ReadonlyArray<T>,
|
|
44
|
+
lanes: number,
|
|
45
|
+
run_lane: (group: ReadonlyArray<T>) => Promise<ReadonlyArray<R>>,
|
|
46
|
+
): Promise<Array<ReadonlyArray<R>>> {
|
|
47
|
+
return settled(
|
|
48
|
+
await Promise.allSettled(deal(items, lanes).map(async (group) => await run_lane(group))),
|
|
49
|
+
)
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// The one-item slice of lane `index % lanes` that holds item `index`.
|
|
53
|
+
function at(index: number, lanes: number): [number, number] {
|
|
54
|
+
const position = Math.floor(index / lanes)
|
|
55
|
+
|
|
56
|
+
return [position, position + 1]
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// The lanes' results put back in the items' own order, whatever order the lanes finished in: item
|
|
60
|
+
// `index` sat at `floor(index / lanes)` in lane `index % lanes`.
|
|
61
|
+
async function run_pool<T, R>(
|
|
62
|
+
items: ReadonlyArray<T>,
|
|
63
|
+
lanes: number,
|
|
64
|
+
run_lane: (group: ReadonlyArray<T>) => Promise<ReadonlyArray<R>>,
|
|
65
|
+
): Promise<Array<R>> {
|
|
66
|
+
const results = await run_lanes(items, lanes, run_lane)
|
|
67
|
+
|
|
68
|
+
return items.flatMap((_item, index) => results[index % lanes]?.slice(...at(index, lanes)) ?? [])
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
const test_pinned_pool = { MAX_TREES, deal, lane_plan, run_pool }
|
|
72
|
+
|
|
73
|
+
export { test_pinned_pool }
|
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
import { readFile, writeFile } from 'node:fs/promises'
|
|
2
|
+
import path from 'node:path'
|
|
3
|
+
import { base_tree, type BaseTree } from '#scripts/git/base-tree'
|
|
4
|
+
import { direct_importers } from './direct-importers'
|
|
5
|
+
import { related_heavy_tests } from './related-heavy-tests'
|
|
6
|
+
import { test_pinned_cache_logic, type Recheck } from './test-pinned-cache-logic'
|
|
7
|
+
import { test_pinned_ledger, type PinnedOrigin, type ProbeTime } from './test-pinned-ledger'
|
|
8
|
+
import { test_pinned_logic, type Hunk } from './test-pinned-logic'
|
|
9
|
+
import { test_pinned_pool } from './test-pinned-pool'
|
|
10
|
+
import { test_pinned_stage, type Staged, type StagePlan } from './test-pinned-stage'
|
|
11
|
+
import { test_red } from './test-red'
|
|
12
|
+
import type { RedProbe } from './test-red-logic'
|
|
13
|
+
import { related_scope, type RelatedScope } from './test-related-scope'
|
|
14
|
+
import { test_unit_guard } from './test-unit-guard'
|
|
15
|
+
import { unit_worker_share } from './unit-worker-share'
|
|
16
|
+
|
|
17
|
+
// The probes of `josh test:pinned` (joshuafolkken/kit#4516): each hunk reverted alone in a detached
|
|
18
|
+
// worktree at HEAD (`base-tree.ts`), and its related tests run. **Each verdict is handed on as soon as
|
|
19
|
+
// it is reached** (joshuafolkken/kit#4936), so the caller stores it before the next hunk runs.
|
|
20
|
+
//
|
|
21
|
+
// A hunk with a `recheck` runs only those tests — the ones added or edited since its stored `green` or
|
|
22
|
+
// `no-test` verdict, or the ones its stored `red` failed in (`test-pinned-cache-logic.ts`); a `red`
|
|
23
|
+
// recheck they no longer fail falls back to a fresh probe, which runs in stages where the file's reach
|
|
24
|
+
// is wide (`test-pinned-stage.ts`).
|
|
25
|
+
|
|
26
|
+
const TREE_PREFIX = 'josh-test-pinned-'
|
|
27
|
+
const HEAD = 'HEAD'
|
|
28
|
+
const NO_TEST: RedProbe = { verdict: 'no-test', failed: [], ran: 0 }
|
|
29
|
+
|
|
30
|
+
// One hunk to probe, with the index of its verdict among the caller's hunks and how many test files
|
|
31
|
+
// its file reaches, where a graph counted them.
|
|
32
|
+
interface Probe {
|
|
33
|
+
hunk: Hunk
|
|
34
|
+
index: number
|
|
35
|
+
recheck?: Recheck | undefined
|
|
36
|
+
reach?: number | undefined
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
type OnVerdict = (index: number, verdict: RedProbe) => Promise<void>
|
|
40
|
+
|
|
41
|
+
async function direct_of(root: string, file: string): Promise<Array<string>> {
|
|
42
|
+
const importers = await direct_importers.importers_of(root, [file])
|
|
43
|
+
|
|
44
|
+
return importers.get(file) ?? []
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// What a fresh probe of the hunk runs in the tree at `root` (`test-pinned-stage.ts`). A file every
|
|
48
|
+
// test imports stays the special case of joshuafolkken/kit#5122: its direct importers alone, never
|
|
49
|
+
// escalated, since its reach is the whole suite — and `vitest related` handed it runs the whole suite.
|
|
50
|
+
async function plan_of(root: string, probe: Probe): Promise<StagePlan> {
|
|
51
|
+
const { file } = probe.hunk
|
|
52
|
+
|
|
53
|
+
if (direct_importers.every_test_imports_of([file]).length > 0) {
|
|
54
|
+
return { reach: await direct_of(root, file) }
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
if (probe.reach === undefined) return { reach: [file] }
|
|
58
|
+
|
|
59
|
+
return test_pinned_stage.plan_over(file, await direct_of(root, file), probe.reach)
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// The tests `files` reach in the tree at `root`, the heavy files reached only indirectly left out
|
|
63
|
+
// (`josh test:related`'s rule). `undefined` when there are none.
|
|
64
|
+
function selection_over(
|
|
65
|
+
root: string,
|
|
66
|
+
files: ReadonlyArray<string>,
|
|
67
|
+
workers: number,
|
|
68
|
+
): Array<string> | undefined {
|
|
69
|
+
if (files.length === 0) return undefined
|
|
70
|
+
|
|
71
|
+
// vitest is handed the paths relative to the tree it runs in, as the exclusion reads them.
|
|
72
|
+
const scope: RelatedScope = { mode: 'related', files, reason: '' }
|
|
73
|
+
const placed: RelatedScope = { ...scope, files: files.map((test) => path.join(root, test)) }
|
|
74
|
+
const flags = related_heavy_tests.exclude_flags(placed, root)
|
|
75
|
+
|
|
76
|
+
return [
|
|
77
|
+
...related_scope.vitest_arguments(scope, flags),
|
|
78
|
+
...unit_worker_share.worker_arguments([], workers),
|
|
79
|
+
]
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
function recheck_selection(recheck: Recheck, workers: number): Array<string> {
|
|
83
|
+
return ['run', ...recheck.recheck, ...unit_worker_share.worker_arguments([], workers)]
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// The probe's first run: its recheck, or the first stage of its plan.
|
|
87
|
+
async function selection_of(
|
|
88
|
+
root: string,
|
|
89
|
+
probe: Probe,
|
|
90
|
+
workers: number,
|
|
91
|
+
): Promise<Array<string> | undefined> {
|
|
92
|
+
if (probe.recheck !== undefined) return recheck_selection(probe.recheck, workers)
|
|
93
|
+
const plan = await plan_of(root, probe)
|
|
94
|
+
|
|
95
|
+
return selection_over(root, plan.direct ?? plan.reach, workers)
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// The run with this one hunk reverted. The file is put back before the next hunk runs, or that hunk's
|
|
99
|
+
// tests would also see this revert.
|
|
100
|
+
async function reverted_run(
|
|
101
|
+
tree: BaseTree,
|
|
102
|
+
hunk: Hunk,
|
|
103
|
+
selection: ReadonlyArray<string> | undefined,
|
|
104
|
+
): Promise<RedProbe> {
|
|
105
|
+
if (selection === undefined) return NO_TEST
|
|
106
|
+
|
|
107
|
+
const target = path.join(tree.tree, hunk.file)
|
|
108
|
+
const content = await readFile(target, 'utf8')
|
|
109
|
+
|
|
110
|
+
await writeFile(target, test_pinned_logic.revert(content, hunk))
|
|
111
|
+
|
|
112
|
+
try {
|
|
113
|
+
return await test_red.probe_in(tree, selection)
|
|
114
|
+
} finally {
|
|
115
|
+
await writeFile(target, content)
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
// Set once a probe is unpinned in a `--first-unpinned` run (joshuafolkken/kit#5153): no lane starts
|
|
120
|
+
// another probe, and the ones already running finish and hand their verdicts on.
|
|
121
|
+
interface Halt {
|
|
122
|
+
is_set: boolean
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
// What every lane of one run shares: its workers per tree, the caller's hand-off, the probes' times,
|
|
126
|
+
// how many probes ran in stages, and the halt a `--first-unpinned` run carries.
|
|
127
|
+
interface Lane {
|
|
128
|
+
workers: number
|
|
129
|
+
on_verdict: OnVerdict
|
|
130
|
+
times: Array<ProbeTime>
|
|
131
|
+
staged: Staged
|
|
132
|
+
halt?: Halt | undefined
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
// The hunk's verdict over every stage of its plan.
|
|
136
|
+
async function fresh_verdict(tree: BaseTree, probe: Probe, lane: Lane): Promise<RedProbe> {
|
|
137
|
+
const plan = await plan_of(tree.tree, probe)
|
|
138
|
+
|
|
139
|
+
async function run(files: ReadonlyArray<string>): Promise<RedProbe> {
|
|
140
|
+
return await reverted_run(tree, probe.hunk, selection_over(tree.tree, files, lane.workers))
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
return await test_pinned_stage.staged_verdict(plan, run, lane.staged)
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
// The hunk's verdict: its recheck's answer, or a fresh probe where it answers none.
|
|
147
|
+
async function verdict_of(tree: BaseTree, probe: Probe, lane: Lane): Promise<RedProbe> {
|
|
148
|
+
if (probe.recheck === undefined) return await fresh_verdict(tree, probe, lane)
|
|
149
|
+
const selection = recheck_selection(probe.recheck, lane.workers)
|
|
150
|
+
const run = await reverted_run(tree, probe.hunk, selection)
|
|
151
|
+
|
|
152
|
+
return (
|
|
153
|
+
test_pinned_cache_logic.rechecked(probe.recheck, run) ??
|
|
154
|
+
(await fresh_verdict(tree, probe, lane))
|
|
155
|
+
)
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
function halt_on(lane: Lane, verdict: RedProbe): void {
|
|
159
|
+
if (lane.halt !== undefined && test_pinned_logic.is_unpinned(verdict)) lane.halt.is_set = true
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
async function timed_verdict(tree: BaseTree, probe: Probe, lane: Lane): Promise<RedProbe> {
|
|
163
|
+
const started = Date.now()
|
|
164
|
+
const verdict = await verdict_of(tree, probe, lane)
|
|
165
|
+
|
|
166
|
+
lane.times.push(test_pinned_ledger.time_of(probe.hunk, verdict, Date.now() - started))
|
|
167
|
+
|
|
168
|
+
return verdict
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
// One hunk at a time within a lane: its hunks share the lane's tree (`test-pinned-pool.ts`). A set
|
|
172
|
+
// halt starts no further hunk, so the lane answers fewer than it was dealt.
|
|
173
|
+
async function verdicts_in(
|
|
174
|
+
tree: BaseTree,
|
|
175
|
+
probes: ReadonlyArray<Probe>,
|
|
176
|
+
lane: Lane,
|
|
177
|
+
): Promise<Array<RedProbe>> {
|
|
178
|
+
const verdicts: Array<RedProbe> = []
|
|
179
|
+
|
|
180
|
+
for (const probe of probes) {
|
|
181
|
+
if (lane.halt?.is_set === true) break
|
|
182
|
+
// eslint-disable-next-line no-await-in-loop -- the hunks share one tree, so each revert waits for the last restore
|
|
183
|
+
const verdict = await timed_verdict(tree, probe, lane)
|
|
184
|
+
|
|
185
|
+
halt_on(lane, verdict)
|
|
186
|
+
// eslint-disable-next-line no-await-in-loop -- stored before the next hunk runs, so a stopped run keeps it
|
|
187
|
+
await lane.on_verdict(probe.index, verdict)
|
|
188
|
+
verdicts.push(verdict)
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
return verdicts
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
async function pooled(
|
|
195
|
+
paths: ReadonlyArray<string>,
|
|
196
|
+
probes: ReadonlyArray<Probe>,
|
|
197
|
+
lane: Omit<Lane, 'workers'>,
|
|
198
|
+
): Promise<Array<RedProbe>> {
|
|
199
|
+
if (probes.length === 0) return []
|
|
200
|
+
const plan = test_pinned_pool.lane_plan(probes.length, await test_unit_guard.vitest_share([]))
|
|
201
|
+
|
|
202
|
+
return await test_pinned_pool.run_pool(
|
|
203
|
+
probes,
|
|
204
|
+
plan.lanes,
|
|
205
|
+
async (group) =>
|
|
206
|
+
await base_tree.with_tree(TREE_PREFIX, HEAD, async (tree) => {
|
|
207
|
+
await base_tree.copy_in(tree.tree, paths)
|
|
208
|
+
|
|
209
|
+
return await verdicts_in(tree, group, { ...lane, workers: plan.workers })
|
|
210
|
+
}),
|
|
211
|
+
)
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
// `held` counts the hunks the cache answered, `rewired` the ones left out as a rewire
|
|
215
|
+
// (`test-pinned-rewire.ts`); `is_first_unpinned` starts no probe once one is unpinned.
|
|
216
|
+
interface CheckOptions {
|
|
217
|
+
held?: number
|
|
218
|
+
rewired?: number
|
|
219
|
+
is_first_unpinned?: boolean
|
|
220
|
+
origin?: PinnedOrigin | undefined
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
// The verdicts reached, in the probes' order, and how many of the probes ran in stages.
|
|
224
|
+
interface Checked {
|
|
225
|
+
verdicts: Array<RedProbe>
|
|
226
|
+
staged: Staged
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
// The probes, checked over as many trees as the worker budget allows; `paths` are copied into each.
|
|
230
|
+
// The run's ledger row counts the `held` hunks beside the probed ones' times. Under
|
|
231
|
+
// `is_first_unpinned`, the verdicts are the ones started before the first unpinned verdict.
|
|
232
|
+
async function checked_on(
|
|
233
|
+
paths: ReadonlyArray<string>,
|
|
234
|
+
probes: ReadonlyArray<Probe>,
|
|
235
|
+
on_verdict: OnVerdict,
|
|
236
|
+
options: CheckOptions = {},
|
|
237
|
+
): Promise<Checked> {
|
|
238
|
+
const started = Date.now()
|
|
239
|
+
const times: Array<ProbeTime> = []
|
|
240
|
+
const staged = test_pinned_stage.none()
|
|
241
|
+
const halt = options.is_first_unpinned === true ? { is_set: false } : undefined
|
|
242
|
+
const verdicts = await pooled(paths, probes, { on_verdict, times, staged, halt })
|
|
243
|
+
|
|
244
|
+
const skipped = { held: options.held ?? 0, rewired: options.rewired ?? 0, origin: options.origin }
|
|
245
|
+
|
|
246
|
+
await test_pinned_ledger.record(skipped, times, Date.now() - started)
|
|
247
|
+
|
|
248
|
+
return { verdicts, staged }
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
const test_pinned_probe = { checked_on, selection_of }
|
|
252
|
+
|
|
253
|
+
export type { CheckOptions, Checked, Probe }
|
|
254
|
+
export { test_pinned_probe }
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { test_pinned_cache_logic, type GreenHunk } from './test-pinned-cache-logic'
|
|
2
|
+
import { test_pinned_logic, type Hunk } from './test-pinned-logic'
|
|
3
|
+
|
|
4
|
+
// What lets a `red` verdict outlive the removal of an unpinned line (joshuafolkken/kit#5004). Removing
|
|
5
|
+
// the line a `green` probe named changes the code change and the failed test's import closure both, yet
|
|
6
|
+
// that line could be reverted with every test green, so the other hunks' `red` verdicts still hold.
|
|
7
|
+
//
|
|
8
|
+
// **The cache records each `green` hunk and `pruned`: the code change with exactly those hunks
|
|
9
|
+
// reverted.** A
|
|
10
|
+
// later run reverts each of its own hunks that is only what is left of a recorded one — the same base
|
|
11
|
+
// lines, its lines a subsequence of that one's — and a `pruned` that reads the same means the code
|
|
12
|
+
// change since differs only by lines removed from `green` hunks. Any other edit reads differently. A
|
|
13
|
+
// hunk that lost lines has a key of its own, so it is probed afresh. A matching hunk is not tied to its
|
|
14
|
+
// recorded position, so a `green` line moved elsewhere in its file reads as one removed — a stretch the
|
|
15
|
+
// diff's line numbers cannot settle, since every edit above a hunk shifts them.
|
|
16
|
+
|
|
17
|
+
// The code change a `pruned` digest is read off: the base commit, each changed non-test path and its
|
|
18
|
+
// content digest.
|
|
19
|
+
interface CodeChange {
|
|
20
|
+
commit: string
|
|
21
|
+
code: ReadonlyArray<string>
|
|
22
|
+
digests: ReadonlyMap<string, string>
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// A stub probe on an added file puts back a body it wrote, not the base's lines, so it records nothing.
|
|
26
|
+
function is_line_hunk(hunk: Hunk): boolean {
|
|
27
|
+
return hunk.function_name === undefined
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// The line hunks whose verdict is `green` — the ones the cache records, and the only ones its `pruned`
|
|
31
|
+
// reverts: a hunk that only resembles one stays, so removing it later reads as an edit.
|
|
32
|
+
function greens_reached(
|
|
33
|
+
hunks: ReadonlyArray<Hunk>,
|
|
34
|
+
verdicts: ReadonlyArray<string | undefined>,
|
|
35
|
+
): Array<Hunk> {
|
|
36
|
+
return hunks.filter((hunk, index) => verdicts[index] === 'green' && is_line_hunk(hunk))
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function record_of(hunk: Hunk): GreenHunk {
|
|
40
|
+
return { file: hunk.file, old_lines: hunk.old_lines, new_lines: hunk.new_lines ?? [] }
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// Every line of `part` sits in `whole`, in the same order.
|
|
44
|
+
function is_subsequence(part: ReadonlyArray<string>, whole: ReadonlyArray<string>): boolean {
|
|
45
|
+
const remaining = [...whole]
|
|
46
|
+
|
|
47
|
+
return part.every((line) => remaining.splice(0, remaining.indexOf(line) + 1).at(-1) === line)
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
function is_same_lines(left: ReadonlyArray<string>, right: ReadonlyArray<string>): boolean {
|
|
51
|
+
return JSON.stringify(left) === JSON.stringify(right)
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// `hunk` is `green` with none of its lines added or changed, only some — or none — removed.
|
|
55
|
+
function is_remnant(hunk: Hunk, green: GreenHunk): boolean {
|
|
56
|
+
if (!is_line_hunk(hunk) || hunk.file !== green.file) return false
|
|
57
|
+
|
|
58
|
+
return (
|
|
59
|
+
is_same_lines(hunk.old_lines, green.old_lines) &&
|
|
60
|
+
is_subsequence(hunk.new_lines ?? [], green.new_lines)
|
|
61
|
+
)
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// `content` with each of `hunks` reverted, the lowest last so a revert moves none still to come.
|
|
65
|
+
function reverted(content: string, hunks: ReadonlyArray<Hunk>): string {
|
|
66
|
+
const order = hunks.toSorted((left, right) => right.new_start - left.new_start)
|
|
67
|
+
let text = content
|
|
68
|
+
|
|
69
|
+
for (const hunk of order) {
|
|
70
|
+
text = test_pinned_logic.revert(text, hunk)
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
return text
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// The hunks a later run reverts: each one that is only what is left of a recorded `green` hunk.
|
|
77
|
+
function remnants_of(hunks: ReadonlyArray<Hunk>, greens: ReadonlyArray<GreenHunk>): Array<Hunk> {
|
|
78
|
+
return hunks.filter((hunk) => greens.some((green) => is_remnant(hunk, green)))
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// The digest of each `green` hunk's file now, with `reverts` reverted; a file the work tree no longer
|
|
82
|
+
// holds has none.
|
|
83
|
+
function pruned_digests(
|
|
84
|
+
contents: ReadonlyMap<string, string>,
|
|
85
|
+
reverts: ReadonlyArray<Hunk>,
|
|
86
|
+
greens: ReadonlyArray<GreenHunk>,
|
|
87
|
+
): Map<string, string> {
|
|
88
|
+
const files = [...new Set(greens.map((green) => green.file))]
|
|
89
|
+
const pairs = files.flatMap((file) => {
|
|
90
|
+
const content = contents.get(file)
|
|
91
|
+
if (content === undefined) return []
|
|
92
|
+
const own = reverts.filter((hunk) => hunk.file === file)
|
|
93
|
+
|
|
94
|
+
return [[file, test_pinned_cache_logic.digest_of(reverted(content, own))] as const]
|
|
95
|
+
})
|
|
96
|
+
|
|
97
|
+
return new Map(pairs)
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// The code change with `reverts` reverted. Each `green` file is listed whether or not it still differs
|
|
101
|
+
// from the base, so one a removal put back reads the same as one a revert did.
|
|
102
|
+
function pruned_of(
|
|
103
|
+
code: CodeChange,
|
|
104
|
+
contents: ReadonlyMap<string, string>,
|
|
105
|
+
reverts: ReadonlyArray<Hunk>,
|
|
106
|
+
greens: ReadonlyArray<GreenHunk>,
|
|
107
|
+
): string {
|
|
108
|
+
const pruned = pruned_digests(contents, reverts, greens)
|
|
109
|
+
const digests = new Map([...code.digests, ...pruned])
|
|
110
|
+
const paths = [...new Set([...code.code, ...pruned.keys()])]
|
|
111
|
+
|
|
112
|
+
return test_pinned_cache_logic.change_of(code.commit, paths, digests)
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
const test_pinned_prune_logic = { greens_reached, record_of, is_remnant, remnants_of, pruned_of }
|
|
116
|
+
|
|
117
|
+
export type { CodeChange }
|
|
118
|
+
export { test_pinned_prune_logic }
|