@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,139 @@
|
|
|
1
|
+
import { mkdtempSync, rmSync } from 'node:fs'
|
|
2
|
+
import { tmpdir } from 'node:os'
|
|
3
|
+
import path from 'node:path'
|
|
4
|
+
import type { TestRelatedRecord } from '#scripts/lane/lane-ledger-schema'
|
|
5
|
+
import { lane_ledger_write } from '#scripts/lane/lane-ledger-write'
|
|
6
|
+
import { related_scope, type RelatedScope } from './test-related-scope'
|
|
7
|
+
import { unit_count_file } from './unit-count-file'
|
|
8
|
+
|
|
9
|
+
// What one `josh test:related` run leaves in the lane ledger (joshuafolkken/kit#4465): how much of its
|
|
10
|
+
// input was the change itself, what a main sync brought in and what the test-read map added, the
|
|
11
|
+
// scope it settled on, how many test files vitest ran and how long it took — so `josh lane:stats`
|
|
12
|
+
// can tell a run widened by its input from one vitest widened by itself.
|
|
13
|
+
|
|
14
|
+
const COUNT_FILE_NAME = 'count'
|
|
15
|
+
|
|
16
|
+
// The facts the run knew before vitest started: the scope, and the change it was resolved from.
|
|
17
|
+
interface RunInput {
|
|
18
|
+
scope: RelatedScope
|
|
19
|
+
root: string
|
|
20
|
+
// Repository-root-relative, as the change was read; `undefined` when it could not be.
|
|
21
|
+
changed: ReadonlyArray<string> | undefined
|
|
22
|
+
// The part of `changed` a main sync brought in, empty outside a since-green reading.
|
|
23
|
+
synced: ReadonlyArray<string>
|
|
24
|
+
// The part of `changed` the change since the test-read map's tree joined to the named or moved
|
|
25
|
+
// files — main merges that landed after the map among them. A file of `branch` in it counts as
|
|
26
|
+
// `changed`; it holds the synced non-code files as well, which the record counts as `synced` alone.
|
|
27
|
+
since_map: ReadonlyArray<string>
|
|
28
|
+
// This branch's own change from its merge base, where it was read.
|
|
29
|
+
branch?: ReadonlyArray<string> | undefined
|
|
30
|
+
// The name the run is recorded under when it is not the scope's own — `touched` for a `--touched` run.
|
|
31
|
+
kind?: string
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
interface RunResult {
|
|
35
|
+
elapsed_ms: number
|
|
36
|
+
test_files: number | undefined
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function set_count_target(target: string | undefined): void {
|
|
40
|
+
const { COUNT_FILE_ENVIRONMENT } = unit_count_file
|
|
41
|
+
|
|
42
|
+
if (target === undefined) Reflect.deleteProperty(process.env, COUNT_FILE_ENVIRONMENT)
|
|
43
|
+
else process.env[COUNT_FILE_ENVIRONMENT] = target
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// An unwritable temp root leaves the run uncounted rather than failing the tests it would only measure.
|
|
47
|
+
function count_directory(): string | undefined {
|
|
48
|
+
try {
|
|
49
|
+
return mkdtempSync(path.join(tmpdir(), 'josh-test-related-'))
|
|
50
|
+
} catch {
|
|
51
|
+
return undefined
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// Runs `run` with the unit reporter told where to write the run's test-file count, and reads it back.
|
|
56
|
+
// A run that started no vitest writes none, which is an absent count rather than zero.
|
|
57
|
+
async function with_test_count(
|
|
58
|
+
run: () => Promise<number>,
|
|
59
|
+
): Promise<{ exit_code: number; test_files: number | undefined }> {
|
|
60
|
+
const directory = count_directory()
|
|
61
|
+
|
|
62
|
+
if (directory === undefined) return { exit_code: await run(), test_files: undefined }
|
|
63
|
+
|
|
64
|
+
const file = path.join(directory, COUNT_FILE_NAME)
|
|
65
|
+
const previous = process.env[unit_count_file.COUNT_FILE_ENVIRONMENT]
|
|
66
|
+
|
|
67
|
+
set_count_target(file)
|
|
68
|
+
|
|
69
|
+
try {
|
|
70
|
+
return { exit_code: await run(), test_files: unit_count_file.read_count(file) }
|
|
71
|
+
} finally {
|
|
72
|
+
set_count_target(previous)
|
|
73
|
+
rmSync(directory, { recursive: true, force: true })
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// The scope's files the record counted in no part — the map's readers.
|
|
78
|
+
function readers_of(input: RunInput, counted: ReadonlySet<string>): number {
|
|
79
|
+
if (input.scope.mode !== 'related') return 0
|
|
80
|
+
|
|
81
|
+
return input.scope.files.filter((file) => !counted.has(path.relative(input.root, file))).length
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// The changed files that sent a full-suite run there, repository-root-relative, or none.
|
|
85
|
+
function triggers_of(input: RunInput): Partial<TestRelatedRecord> {
|
|
86
|
+
if (input.scope.mode !== 'all' || input.scope.files.length === 0) return {}
|
|
87
|
+
|
|
88
|
+
return { trigger_files: input.scope.files.map((file) => path.relative(input.root, file)) }
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// **The run's own change is the branch's, where it was read** (joshuafolkken/kit#5041): a synced file
|
|
92
|
+
// the split cannot vouch for is in `changed` without being this branch's change. Unread, it is what
|
|
93
|
+
// neither a main sync nor the map's tree joined.
|
|
94
|
+
function own_of(input: RunInput): ReadonlyArray<string> {
|
|
95
|
+
const { changed = [], branch } = input
|
|
96
|
+
const joined = new Set([...input.synced, ...input.since_map])
|
|
97
|
+
|
|
98
|
+
return changed.filter((file) => branch?.includes(file) ?? !joined.has(file))
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
// The input split into its counted parts, each file in one. A synced non-code file is in `since_map`
|
|
102
|
+
// too (`synced_data` in `test-related.ts`), counted as synced alone.
|
|
103
|
+
function parts_of(input: RunInput): Record<'own' | 'synced' | 'since_map', ReadonlyArray<string>> {
|
|
104
|
+
const own = own_of(input)
|
|
105
|
+
const rest = (input.changed ?? []).filter((file) => !own.includes(file))
|
|
106
|
+
|
|
107
|
+
return {
|
|
108
|
+
own,
|
|
109
|
+
synced: rest.filter((file) => input.synced.includes(file)),
|
|
110
|
+
since_map: rest.filter(
|
|
111
|
+
(file) => input.since_map.includes(file) && !input.synced.includes(file),
|
|
112
|
+
),
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
function record_of(input: RunInput, result: RunResult): TestRelatedRecord {
|
|
117
|
+
const { own, synced, since_map } = parts_of(input)
|
|
118
|
+
const record = {
|
|
119
|
+
scope: input.kind ?? related_scope.scope_kind(input.scope),
|
|
120
|
+
changed: own.length,
|
|
121
|
+
synced: synced.length,
|
|
122
|
+
since_map: since_map.length,
|
|
123
|
+
readers: readers_of(input, new Set([...own, ...synced, ...since_map])),
|
|
124
|
+
...triggers_of(input),
|
|
125
|
+
elapsed_ms: Math.round(result.elapsed_ms),
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
return result.test_files === undefined ? record : { ...record, test_files: result.test_files }
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
// Best-effort, as every ledger write is.
|
|
132
|
+
async function record_run(input: RunInput, result: RunResult, ledger?: string): Promise<void> {
|
|
133
|
+
await lane_ledger_write.record_test_related(record_of(input, result), ledger)
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
const test_related_record = { record_of, record_run, with_test_count }
|
|
137
|
+
|
|
138
|
+
export type { RunInput, RunResult }
|
|
139
|
+
export { test_related_record }
|
|
@@ -1,31 +1,43 @@
|
|
|
1
1
|
import path from 'node:path'
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
//
|
|
10
|
-
//
|
|
11
|
-
// an implementation loop paid it again on every re-check. The same tree narrowed to one changed
|
|
12
|
-
// file runs 31 files and 566 tests in 2.4s (7.9s of CPU, −93%).
|
|
2
|
+
import { since_green } from '#scripts/gate/since-green'
|
|
3
|
+
import { changed_file_scope, type ChangedFileScope } from '#scripts/git/changed-file-scope'
|
|
4
|
+
import { pure_files_entries } from './pure-files-entries'
|
|
5
|
+
import { test_read_map, type ReadMap } from './test-read-map'
|
|
6
|
+
import { whole_suite_files } from './whole-suite-files'
|
|
7
|
+
|
|
8
|
+
// The whole unit suite is expensive — the largest share of what the gate checks spend, and an
|
|
9
|
+
// implementation loop paid it again on every re-check — while one changed file narrows it to a small
|
|
10
|
+
// fraction. `josh lane:stats` reports what `test:unit` costs now.
|
|
13
11
|
//
|
|
14
|
-
// **
|
|
15
|
-
//
|
|
16
|
-
//
|
|
17
|
-
// `
|
|
12
|
+
// **The verification gate runs this narrowing in place of the whole suite** (joshuafolkken/kit#4065),
|
|
13
|
+
// which is safe only because it reaches every test a change can break. A changed module reaches
|
|
14
|
+
// the tests importing it through `vitest related`, and the tests reading it as data through the
|
|
15
|
+
// test-read map a whole-suite run records (`test-read-map.ts`). A changed document, config or
|
|
16
|
+
// snapshot — which no module graph holds — reaches the modules that read it through that map alone. **Whatever neither can answer runs the whole suite**: no map, a
|
|
17
|
+
// non-code file added since the recorded tree that no recorded test read, where a test read inside its
|
|
18
|
+
// directory, or a file every test
|
|
19
|
+
// depends on — each counted only when this change moved it (joshuafolkken/kit#4527). A non-code file the recorded tree already held and no test read is one no test reads
|
|
20
|
+
// (joshuafolkken/kit#4073), and so is one added since to a directory no test read inside
|
|
21
|
+
// (joshuafolkken/kit#4303, joshuafolkken/kit#4597), so a change made only of those runs nothing. CI runs the whole suite
|
|
22
|
+
// regardless, so a read the recorder could not see — one a child process makes — is still caught
|
|
23
|
+
// before the merge.
|
|
18
24
|
//
|
|
19
|
-
//
|
|
20
|
-
//
|
|
21
|
-
//
|
|
22
|
-
|
|
25
|
+
// Everything the decision shares with `josh lint:related` — the fallback line, the file listing and
|
|
26
|
+
// the unreadable-change reason — is `changed-file-scope.ts`, so the two commands cannot drift apart
|
|
27
|
+
// about what they print.
|
|
28
|
+
|
|
29
|
+
// The third answer only this command has: the change is known to reach no test, so nothing runs.
|
|
30
|
+
// `files` holds the changed files that settled it, for the line that says why.
|
|
31
|
+
interface NoTestScope {
|
|
32
|
+
mode: 'none'
|
|
33
|
+
files: ReadonlyArray<string>
|
|
34
|
+
reason: string
|
|
35
|
+
}
|
|
23
36
|
|
|
24
|
-
type RelatedScope = ChangedFileScope
|
|
37
|
+
type RelatedScope = ChangedFileScope | NoTestScope
|
|
25
38
|
|
|
26
|
-
// The extensions vitest can walk a module graph back from.
|
|
27
|
-
//
|
|
28
|
-
// narrowed to nothing at all is the one outcome this module exists to prevent.
|
|
39
|
+
// The extensions vitest can walk a module graph back from. Every other changed file is resolved
|
|
40
|
+
// through the test-read map instead.
|
|
29
41
|
const RELATABLE_EXTENSIONS: ReadonlySet<string> = new Set([
|
|
30
42
|
'.ts',
|
|
31
43
|
'.tsx',
|
|
@@ -38,8 +50,24 @@ const RELATABLE_EXTENSIONS: ReadonlySet<string> = new Set([
|
|
|
38
50
|
'.svelte',
|
|
39
51
|
])
|
|
40
52
|
|
|
53
|
+
const { WHOLE_SUITE_FILES } = whole_suite_files
|
|
41
54
|
const { UNREADABLE_REASON } = changed_file_scope
|
|
42
|
-
const NOTHING_RELATABLE_REASON = 'no changed file is one a test can import'
|
|
55
|
+
const NOTHING_RELATABLE_REASON = 'no changed file is one a test can import or read'
|
|
56
|
+
const NO_MAP_REASON = 'no test-read map covers the changed non-code file'
|
|
57
|
+
const { UNMOVED_REASON } = since_green
|
|
58
|
+
const WHOLE_SUITE_SUFFIX = 'affects every test'
|
|
59
|
+
const UNRECORDED_SUFFIX = 'is read by no recorded test'
|
|
60
|
+
|
|
61
|
+
// The stable kind each full-suite reason falls under, so the gate ledger counts the fallbacks by why
|
|
62
|
+
// rather than by the file a reason names (joshuafolkken/kit#4397).
|
|
63
|
+
const FALLBACK_KINDS: ReadonlyArray<{ kind: string; reason: string }> = [
|
|
64
|
+
{ kind: 'unreadable', reason: UNREADABLE_REASON },
|
|
65
|
+
{ kind: 'nothing-relatable', reason: NOTHING_RELATABLE_REASON },
|
|
66
|
+
{ kind: 'no-map', reason: NO_MAP_REASON },
|
|
67
|
+
{ kind: 'whole-suite-file', reason: WHOLE_SUITE_SUFFIX },
|
|
68
|
+
{ kind: 'unrecorded-file', reason: UNRECORDED_SUFFIX },
|
|
69
|
+
]
|
|
70
|
+
const OTHER_FALLBACK = 'other'
|
|
43
71
|
|
|
44
72
|
// The command this narrowing belongs to, defined once: the guard prints it when it skips, and the
|
|
45
73
|
// line below prints it in front of every decision.
|
|
@@ -47,42 +75,261 @@ const COMMAND_NAME = 'test:related'
|
|
|
47
75
|
const COMMAND_LABEL = `josh ${COMMAND_NAME}`
|
|
48
76
|
const { LISTED_FILE_LIMIT } = changed_file_scope
|
|
49
77
|
|
|
50
|
-
const VOCABULARY
|
|
78
|
+
const VOCABULARY = {
|
|
51
79
|
label: COMMAND_LABEL,
|
|
52
80
|
fallback_suffix: 'running the full unit suite instead',
|
|
53
81
|
narrowed_suffix: 'running only the tests related to them',
|
|
54
82
|
}
|
|
55
83
|
|
|
84
|
+
const NONE_SUFFIX = 'running no tests'
|
|
85
|
+
|
|
56
86
|
const RUN_FLAG = '--run'
|
|
57
87
|
const RELATED_SUBCOMMAND = 'related'
|
|
58
88
|
const RUN_SUBCOMMAND = 'run'
|
|
59
89
|
|
|
90
|
+
// Bundled so the CLI and the tests hand the decision the same five facts.
|
|
91
|
+
interface ScopeRequest {
|
|
92
|
+
root: string
|
|
93
|
+
// Repository-root-relative paths, or `undefined` when the change could not be read.
|
|
94
|
+
changed: ReadonlyArray<string> | undefined
|
|
95
|
+
map: ReadMap | undefined
|
|
96
|
+
// The changed non-code files the map's tree held, and that did not differ from it when the map
|
|
97
|
+
// was recorded — the ones whose having no reader in the map means no test reads them.
|
|
98
|
+
recorded: ReadonlySet<string>
|
|
99
|
+
is_present: (file_path: string) => boolean
|
|
100
|
+
// The part of `changed` that joined only because it differs from the map's tree — which another
|
|
101
|
+
// lane's branch records — not because this change moved it. Only a code file of it naming a moved
|
|
102
|
+
// file reaches vitest; the rest — its non-code files' readers among it — never runs a test nor sends
|
|
103
|
+
// the run to the whole suite: this tree verified it already, or main's CI did
|
|
104
|
+
// (joshuafolkken/kit#4527, joshuafolkken/kit#4896).
|
|
105
|
+
since_map?: ReadonlyArray<string>
|
|
106
|
+
// The code files of `since_map` that name a file this change moved — the only ones of that part
|
|
107
|
+
// handed to vitest (joshuafolkken/kit#4532). See `is_code_input`.
|
|
108
|
+
naming_moved?: ReadonlySet<string>
|
|
109
|
+
// The entries a change of `tools/test/pure-files.ts` moved, when it moved nothing else there — the
|
|
110
|
+
// list then reaches those test files rather than every test (`pure-files-entries.ts`).
|
|
111
|
+
pure_entries?: ReadonlyArray<string> | undefined
|
|
112
|
+
// The changed files every test imports, each with the test files importing it directly
|
|
113
|
+
// (`direct-importers.ts`) — the run narrows to those rather than the whole suite.
|
|
114
|
+
every_test_importers?: ReadonlyMap<string, ReadonlyArray<string>>
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// What the decision narrows to: the files to hand vitest, and the changed files known to reach no
|
|
118
|
+
// test.
|
|
119
|
+
interface Selection {
|
|
120
|
+
files: ReadonlyArray<string>
|
|
121
|
+
unread: ReadonlyArray<string>
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// Either the selection the changed non-code files resolve to, or why they cannot be resolved — with
|
|
125
|
+
// the repository-root-relative files that sent the run to the whole suite, where a file did.
|
|
126
|
+
type MapResolution = Selection | { reason: string; triggers?: ReadonlyArray<string> }
|
|
127
|
+
|
|
60
128
|
function is_relatable(file_path: string): boolean {
|
|
61
129
|
return RELATABLE_EXTENSIONS.has(path.extname(file_path))
|
|
62
130
|
}
|
|
63
131
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
132
|
+
function is_moved(request: ScopeRequest, file: string): boolean {
|
|
133
|
+
return request.since_map?.includes(file) !== true
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// **A code file only the map's tree differs by — another lane's change, or main's since, a test file
|
|
137
|
+
// among them — is handed to vitest only when it names a file this change moved**
|
|
138
|
+
// (joshuafolkken/kit#4532, joshuafolkken/kit#4896). Leaving the rest out is safe: an import of a moved
|
|
139
|
+
// module is reached from that module itself, since `vitest related` walks every test file's graph
|
|
140
|
+
// rather than the map's; the one read neither the graph nor the map sees is a file-system read added
|
|
141
|
+
// since the map's tree, and such a read names the file it reads. A test file reaching a moved file
|
|
142
|
+
// through a helper's read, or a read whose path is assembled from fragments or listed from a directory,
|
|
143
|
+
// is missed here and caught by CI's whole suite before the merge, as a child process's read is.
|
|
144
|
+
function is_code_input(request: ScopeRequest, file: string): boolean {
|
|
145
|
+
if (!is_relatable(file)) return false
|
|
146
|
+
if (is_moved(request, file)) return true
|
|
147
|
+
|
|
148
|
+
return request.naming_moved?.has(file) === true
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
// A full-suite scope's `files` are the changed files that sent it there (joshuafolkken/kit#4510), as a
|
|
152
|
+
// `none` scope's are the ones that settled it; the printed line still names only the first.
|
|
153
|
+
function all_scope(reason: string, triggers: ReadonlyArray<string> = [], root = ''): RelatedScope {
|
|
154
|
+
return { mode: 'all', files: triggers.map((file) => path.join(root, file)), reason }
|
|
68
155
|
}
|
|
69
156
|
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
157
|
+
// A file no recorded test read narrows only when the recorded tree held it, or no recorded test read
|
|
158
|
+
// inside its directory: any other file added since is one the recorder never saw, so its having no
|
|
159
|
+
// reader says nothing.
|
|
160
|
+
function resolve_through_map(others: ReadonlyArray<string>, request: ScopeRequest): MapResolution {
|
|
161
|
+
const { map, recorded } = request
|
|
162
|
+
|
|
163
|
+
if (others.length === 0) return { files: [], unread: [] }
|
|
164
|
+
if (map === undefined) return { reason: `${NO_MAP_REASON} ${String(others[0])}` }
|
|
165
|
+
|
|
166
|
+
const unread = others.filter((file) => test_read_map.readers_of(map, file).length === 0)
|
|
167
|
+
const unknown = unread.filter(
|
|
168
|
+
(file) =>
|
|
169
|
+
is_moved(request, file) &&
|
|
170
|
+
!recorded.has(file) &&
|
|
171
|
+
!test_read_map.in_unread_directory(map, file),
|
|
172
|
+
)
|
|
173
|
+
|
|
174
|
+
if (unknown.length > 0) {
|
|
175
|
+
return { reason: `${String(unknown[0])} ${UNRECORDED_SUFFIX}`, triggers: unknown }
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
return { files: others.flatMap((file) => test_read_map.readers_of(map, file)), unread }
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
// A changed module is also data to a test that reads it through `fs` rather than importing it, and
|
|
182
|
+
// `vitest related` cannot see that read. Unlike a non-code file, a module the map does not hold
|
|
183
|
+
// still narrows — through the module graph alone.
|
|
184
|
+
function code_readers(code: ReadonlyArray<string>, map: ReadMap | undefined): Array<string> {
|
|
185
|
+
if (map === undefined) return []
|
|
186
|
+
|
|
187
|
+
return code.flatMap((file) => test_read_map.readers_of(map, file))
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
function none_scope(unread: ReadonlyArray<string>, root: string): NoTestScope {
|
|
191
|
+
const files = unread.map((file) => path.join(root, file))
|
|
192
|
+
|
|
193
|
+
return { mode: 'none', files, reason: `${String(files.length)} changed file(s) reach no test` }
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
// Nothing to select is "no test" only when something settled it; an empty or vanished selection
|
|
197
|
+
// still runs the whole suite.
|
|
198
|
+
function narrowed_scope(selection: Selection, request: ScopeRequest): RelatedScope {
|
|
199
|
+
if (selection.files.length === 0 && selection.unread.length > 0) {
|
|
200
|
+
return none_scope(selection.unread, request.root)
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
const present = [...new Set(selection.files)]
|
|
204
|
+
.map((file) => path.join(request.root, file))
|
|
205
|
+
.filter((file) => request.is_present(file))
|
|
206
|
+
|
|
207
|
+
if (present.length === 0) return all_scope(NOTHING_RELATABLE_REASON)
|
|
208
|
+
|
|
209
|
+
return { mode: 'related', files: present, reason: `${String(present.length)} related file(s)` }
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
// The part only the map's tree differs by that reached no test — settled as surely as an unread file,
|
|
213
|
+
// so a tree holding nothing of this change's own runs no test rather than the whole suite.
|
|
214
|
+
function left_out(request: ScopeRequest, code: ReadonlyArray<string>): Array<string> {
|
|
215
|
+
return (request.since_map ?? []).filter((file) => !code.includes(file))
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
// The change with an entries-only `pure-files.ts` taken out of it, and the test files it reaches in
|
|
219
|
+
// its place — it would send `vitest related` to every test.
|
|
220
|
+
function without_pure_entries(
|
|
221
|
+
changed: ReadonlyArray<string>,
|
|
222
|
+
entries: ReadonlyArray<string> | undefined,
|
|
223
|
+
): Selection {
|
|
224
|
+
if (entries === undefined) return { files: [], unread: changed }
|
|
225
|
+
|
|
226
|
+
const rest = changed.filter((file) => file !== pure_files_entries.PURE_FILES_PATH)
|
|
227
|
+
|
|
228
|
+
return { files: pure_files_entries.tests_of(entries), unread: rest }
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
function is_narrowed(request: ScopeRequest, file: string): boolean {
|
|
232
|
+
return request.every_test_importers?.has(file) === true
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
// **A moved file every test imports reaches only the test files importing it directly**
|
|
236
|
+
// (joshuafolkken/kit#5122): handed to vitest it would run the whole suite, which the gate's `test:unit`
|
|
237
|
+
// and CI run once regardless. One no test imports directly reaches no test here.
|
|
238
|
+
function direct_selection(request: ScopeRequest, changed: ReadonlyArray<string>): Selection {
|
|
239
|
+
const moved = changed.filter((file) => is_narrowed(request, file) && is_moved(request, file))
|
|
240
|
+
const tests = moved.map((file) => request.every_test_importers?.get(file) ?? [])
|
|
241
|
+
|
|
242
|
+
return { files: tests.flat(), unread: moved.filter((_file, index) => tests[index]?.length === 0) }
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
function whole_suite_triggers(
|
|
246
|
+
request: ScopeRequest,
|
|
247
|
+
changed: ReadonlyArray<string>,
|
|
73
248
|
): Array<string> {
|
|
74
|
-
return
|
|
249
|
+
return changed.filter(
|
|
250
|
+
(file) => WHOLE_SUITE_FILES.has(file) && !is_narrowed(request, file) && is_moved(request, file),
|
|
251
|
+
)
|
|
75
252
|
}
|
|
76
253
|
|
|
77
|
-
function
|
|
78
|
-
|
|
79
|
-
|
|
254
|
+
function resolve_read(
|
|
255
|
+
request: ScopeRequest & { changed: ReadonlyArray<string> },
|
|
256
|
+
entry_tests: ReadonlyArray<string>,
|
|
80
257
|
): RelatedScope {
|
|
81
|
-
|
|
258
|
+
const { changed, root } = request
|
|
259
|
+
const whole = whole_suite_triggers(request, changed)
|
|
260
|
+
|
|
261
|
+
if (whole.length > 0) return all_scope(`${String(whole[0])} ${WHOLE_SUITE_SUFFIX}`, whole, root)
|
|
262
|
+
|
|
263
|
+
const direct = direct_selection(request, changed)
|
|
264
|
+
const code = changed.filter((file) => !is_narrowed(request, file) && is_code_input(request, file))
|
|
265
|
+
const resolution = resolve_through_map(
|
|
266
|
+
changed.filter((file) => !is_relatable(file) && is_moved(request, file)),
|
|
267
|
+
request,
|
|
268
|
+
)
|
|
269
|
+
|
|
270
|
+
if ('reason' in resolution) return all_scope(resolution.reason, resolution.triggers, root)
|
|
271
|
+
|
|
272
|
+
const files = [
|
|
273
|
+
...code,
|
|
274
|
+
...code_readers(code, request.map),
|
|
275
|
+
...resolution.files,
|
|
276
|
+
...entry_tests,
|
|
277
|
+
...direct.files,
|
|
278
|
+
]
|
|
279
|
+
const unread = [...resolution.unread, ...left_out(request, code), ...direct.unread]
|
|
280
|
+
|
|
281
|
+
return narrowed_scope({ files, unread }, request)
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
// `undefined` and `[]` are deliberately different inputs. The first says the change could not be
|
|
285
|
+
// read; the second says it was read and held nothing to relate.
|
|
286
|
+
function resolve_scope(request: ScopeRequest): RelatedScope {
|
|
287
|
+
if (request.changed === undefined) return all_scope(UNREADABLE_REASON)
|
|
288
|
+
|
|
289
|
+
const pure = without_pure_entries(request.changed, request.pure_entries)
|
|
290
|
+
|
|
291
|
+
return resolve_read({ ...request, changed: pure.unread }, pure.files)
|
|
82
292
|
}
|
|
83
293
|
|
|
84
294
|
function describe_scope(scope: RelatedScope, root: string): string {
|
|
85
|
-
return changed_file_scope.describe_scope(scope, root, VOCABULARY)
|
|
295
|
+
if (scope.mode !== 'none') return changed_file_scope.describe_scope(scope, root, VOCABULARY)
|
|
296
|
+
|
|
297
|
+
const listing = changed_file_scope.format_file_list(scope.files, root)
|
|
298
|
+
|
|
299
|
+
return `${COMMAND_LABEL}: ${scope.reason} — ${NONE_SUFFIX}.\n${listing}`
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
function reason_kind(reason: string): string {
|
|
303
|
+
return FALLBACK_KINDS.find((entry) => reason.includes(entry.reason))?.kind ?? OTHER_FALLBACK
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
// The kind of full-suite fallback a run's output names, read off the line `describe_scope` printed, or
|
|
307
|
+
// `undefined` when the run narrowed or ran nothing.
|
|
308
|
+
function fallback_kind(output: string): string | undefined {
|
|
309
|
+
const prefix = `${COMMAND_LABEL}: `
|
|
310
|
+
const suffix = ` — ${VOCABULARY.fallback_suffix}.`
|
|
311
|
+
const line = output
|
|
312
|
+
.split('\n')
|
|
313
|
+
.map((candidate) => candidate.trim())
|
|
314
|
+
.find((candidate) => candidate.startsWith(prefix) && candidate.endsWith(suffix))
|
|
315
|
+
|
|
316
|
+
if (line === undefined) return undefined
|
|
317
|
+
|
|
318
|
+
return reason_kind(line.slice(prefix.length, -suffix.length))
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
// The stable name a scope is recorded under: its mode when it narrowed or ran nothing, else the kind of
|
|
322
|
+
// full-suite fallback its reason falls under (joshuafolkken/kit#4465).
|
|
323
|
+
function scope_kind(scope: RelatedScope): string {
|
|
324
|
+
return scope.mode === 'all' ? reason_kind(scope.reason) : scope.mode
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
// Whether a run's output is the since-green no-op — nothing moved, so no test ran — read off the line
|
|
328
|
+
// `describe_scope` printed, so the gate ledger never times it as a unit run (joshuafolkken/kit#4457).
|
|
329
|
+
function is_unmoved(output: string): boolean {
|
|
330
|
+
const line = `${COMMAND_LABEL}: ${UNMOVED_REASON} — ${NONE_SUFFIX}.`
|
|
331
|
+
|
|
332
|
+
return output.split('\n').some((candidate) => candidate.trim() === line)
|
|
86
333
|
}
|
|
87
334
|
|
|
88
335
|
// `--run` is what keeps `vitest related` out of watch mode; the `run` sub-command already implies it
|
|
@@ -91,7 +338,7 @@ function vitest_arguments(
|
|
|
91
338
|
scope: RelatedScope,
|
|
92
339
|
extra_flags: ReadonlyArray<string> = [],
|
|
93
340
|
): ReadonlyArray<string> {
|
|
94
|
-
if (scope.mode
|
|
341
|
+
if (scope.mode !== 'related') return [RUN_SUBCOMMAND, ...extra_flags]
|
|
95
342
|
|
|
96
343
|
return [RELATED_SUBCOMMAND, ...scope.files, RUN_FLAG, ...extra_flags]
|
|
97
344
|
}
|
|
@@ -101,14 +348,18 @@ const related_scope = {
|
|
|
101
348
|
COMMAND_NAME,
|
|
102
349
|
LISTED_FILE_LIMIT,
|
|
103
350
|
NOTHING_RELATABLE_REASON,
|
|
351
|
+
NO_MAP_REASON,
|
|
352
|
+
UNMOVED_REASON,
|
|
104
353
|
UNREADABLE_REASON,
|
|
105
354
|
describe_scope,
|
|
355
|
+
fallback_kind,
|
|
106
356
|
is_relatable,
|
|
357
|
+
is_unmoved,
|
|
107
358
|
resolve_scope,
|
|
108
|
-
|
|
109
|
-
select_related_files,
|
|
359
|
+
scope_kind,
|
|
110
360
|
vitest_arguments,
|
|
111
361
|
}
|
|
112
362
|
|
|
113
363
|
export type { ScopeMode } from '#scripts/git/changed-file-scope'
|
|
364
|
+
export type { RelatedScope, ScopeRequest }
|
|
114
365
|
export { related_scope }
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs'
|
|
2
|
+
import path from 'node:path'
|
|
3
|
+
import { import_graph, type ImportGraph } from '#scripts/lint/import-graph'
|
|
4
|
+
import { test_declared_logic } from './test-declared-logic'
|
|
5
|
+
import { test_pinned_reach } from './test-pinned-reach'
|
|
6
|
+
import { test_read_map, type ReadMap } from './test-read-map'
|
|
7
|
+
import { related_scope } from './test-related-scope'
|
|
8
|
+
import { whole_suite_files } from './whole-suite-files'
|
|
9
|
+
|
|
10
|
+
// **A code module a main sync brought in reaches vitest only through a test this branch's change
|
|
11
|
+
// reaches too** (joshuafolkken/kit#4912). Handed to `vitest related` as a moved file, such a module ran
|
|
12
|
+
// every test importing it, and main's CI had already run those against it. The tests where the two can
|
|
13
|
+
// meet — whose imports reach both the synced module and this branch's own change — run through that
|
|
14
|
+
// change in its place (`own_of`), which `vitest related` walks by its own graph. `shared` names them as
|
|
15
|
+
// this graph reads them, but is never handed to vitest: the graph follows type-only imports and
|
|
16
|
+
// ambient declarations too, and so reaches hundreds of tests the branch's change never runs
|
|
17
|
+
// (joshuafolkken/kit#5066). Its being empty says the two never meet.
|
|
18
|
+
//
|
|
19
|
+
// **The import graph is TypeScript's, which drops an import it cannot resolve**, so only what it can
|
|
20
|
+
// follow is left out. Nothing is left out where no graph can be built, the branch change or the map
|
|
21
|
+
// cannot be read, the branch changed a file every test depends on, or the work tree holds a
|
|
22
|
+
// component TypeScript does not resolve; a synced module that is gone or is such a component stays a
|
|
23
|
+
// moved file. Each of those runs the tests importing it, as before. A synced module every test depends
|
|
24
|
+
// on is not split either: `test-related.ts` leaves it to main's CI unless this branch changed it too.
|
|
25
|
+
|
|
26
|
+
// `left` are the synced modules no longer handed to vitest, `shared` the tests where they meet the change,
|
|
27
|
+
// `meeting` every file whose imports reach both — `shared` and the code between, which `josh ship`'s
|
|
28
|
+
// lint settle reads (joshuafolkken/kit#4985) — all repository-root-relative.
|
|
29
|
+
interface SyncedSplit {
|
|
30
|
+
left: ReadonlyArray<string>
|
|
31
|
+
shared: ReadonlyArray<string>
|
|
32
|
+
meeting: ReadonlyArray<string>
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// What the split is read from: the synced modules this branch did not change, the code of its own
|
|
36
|
+
// change, and every code file of the work tree, all absolute as the graph resolves them.
|
|
37
|
+
interface SplitInputs {
|
|
38
|
+
root: string
|
|
39
|
+
main_only: ReadonlyArray<string>
|
|
40
|
+
own: ReadonlyArray<string>
|
|
41
|
+
universe: ReadonlyArray<string>
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
const NOTHING_LEFT: SyncedSplit = { left: [], shared: [], meeting: [] }
|
|
45
|
+
const UNRESOLVED_EXTENSION = '.svelte'
|
|
46
|
+
|
|
47
|
+
function is_unresolved(file: string): boolean {
|
|
48
|
+
return path.extname(file) === UNRESOLVED_EXTENSION
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function is_beyond_graph(file: string): boolean {
|
|
52
|
+
return whole_suite_files.WHOLE_SUITE_FILES.has(path.normalize(file)) || is_unresolved(file)
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function is_vouched(root: string, file: string): boolean {
|
|
56
|
+
if (!related_scope.is_relatable(file) || is_beyond_graph(file)) return false
|
|
57
|
+
|
|
58
|
+
return existsSync(path.join(root, file))
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// The branch's own change as the graph reads it: its code files and the recorded readers of its
|
|
62
|
+
// non-code ones. `undefined` where the graph cannot vouch for it.
|
|
63
|
+
function own_of(
|
|
64
|
+
branch: ReadonlyArray<string> | undefined,
|
|
65
|
+
map: ReadMap | undefined,
|
|
66
|
+
): ReadonlyArray<string> | undefined {
|
|
67
|
+
if (branch === undefined || map === undefined) return undefined
|
|
68
|
+
|
|
69
|
+
const data = branch.filter((file) => !related_scope.is_relatable(file))
|
|
70
|
+
const readers = data.flatMap((file) => test_read_map.readers_of(map, file))
|
|
71
|
+
const code = branch.filter((file) => related_scope.is_relatable(file))
|
|
72
|
+
|
|
73
|
+
return branch.some((file) => is_beyond_graph(file)) ? undefined : [...code, ...readers]
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
function split_with(graph: ImportGraph, inputs: SplitInputs): SyncedSplit {
|
|
77
|
+
const { root, main_only, own, universe } = inputs
|
|
78
|
+
const from_branch = graph.runtime_importers(own, universe)
|
|
79
|
+
const meeting = [...graph.runtime_importers(main_only, universe)]
|
|
80
|
+
.filter((file) => from_branch.has(file))
|
|
81
|
+
.map((file) => path.relative(root, file))
|
|
82
|
+
const shared = meeting.filter((file) => test_declared_logic.is_test_file(file))
|
|
83
|
+
|
|
84
|
+
return { left: main_only.map((file) => path.relative(root, file)), shared, meeting }
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
function absolute_in(root: string, files: ReadonlyArray<string>): Array<string> {
|
|
88
|
+
return files.map((file) => path.join(root, file))
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
async function split_by_graph(
|
|
92
|
+
root: string,
|
|
93
|
+
main_only: ReadonlyArray<string>,
|
|
94
|
+
own: ReadonlyArray<string>,
|
|
95
|
+
): Promise<SyncedSplit> {
|
|
96
|
+
const graph = await import_graph.create(root)
|
|
97
|
+
|
|
98
|
+
if (graph === undefined) return NOTHING_LEFT
|
|
99
|
+
|
|
100
|
+
const universe = await test_pinned_reach.code_universe()
|
|
101
|
+
|
|
102
|
+
if (universe.some((file) => is_unresolved(file))) return NOTHING_LEFT
|
|
103
|
+
|
|
104
|
+
return split_with(graph, {
|
|
105
|
+
root,
|
|
106
|
+
main_only: absolute_in(root, main_only),
|
|
107
|
+
own: absolute_in(root, own),
|
|
108
|
+
universe,
|
|
109
|
+
})
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
// The graph is built only when a synced module this branch did not change is there to split. A failure
|
|
113
|
+
// to build or walk it — git unreadable, a file gone mid-walk — leaves nothing out.
|
|
114
|
+
async function split(
|
|
115
|
+
root: string,
|
|
116
|
+
synced: ReadonlyArray<string>,
|
|
117
|
+
branch: ReadonlyArray<string> | undefined,
|
|
118
|
+
map: ReadMap | undefined,
|
|
119
|
+
): Promise<SyncedSplit> {
|
|
120
|
+
const own = own_of(branch, map)
|
|
121
|
+
const main_only = synced.filter((file) => !own?.includes(file) && is_vouched(root, file))
|
|
122
|
+
|
|
123
|
+
if (own === undefined || main_only.length === 0) return NOTHING_LEFT
|
|
124
|
+
|
|
125
|
+
try {
|
|
126
|
+
return await split_by_graph(root, main_only, own)
|
|
127
|
+
} catch {
|
|
128
|
+
return NOTHING_LEFT
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
const test_related_synced = { own_of, split, split_with }
|
|
133
|
+
|
|
134
|
+
export type { SyncedSplit }
|
|
135
|
+
export { test_related_synced }
|