@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,84 @@
|
|
|
1
|
+
import { readdirSync } from 'node:fs'
|
|
2
|
+
import path from 'node:path'
|
|
3
|
+
import { related_scope, type RelatedScope } from './test-related-scope'
|
|
4
|
+
|
|
5
|
+
// `josh test:related --touched` — the implementation loop's re-check (joshuafolkken/kit#5237). A change
|
|
6
|
+
// near a hub reaches hundreds of test files, and paying that reach after every small edit repeats it
|
|
7
|
+
// minutes apart. **The touched scope reads no test-read map and no import graph**: it is the diff's own
|
|
8
|
+
// test files and, for each changed module `foo.ts`, its colocated `foo.test.ts` and `foo.*.test.ts`.
|
|
9
|
+
// What an edit breaks further away is the full-reach run's to find, so a touched run leaves no green
|
|
10
|
+
// record (`scoped-green.ts`) and is recorded in the lane ledger under its own kind.
|
|
11
|
+
|
|
12
|
+
const TOUCHED_FLAG = '--touched'
|
|
13
|
+
const TOUCHED_KIND = 'touched'
|
|
14
|
+
const TEST_SUFFIX = '.test.ts'
|
|
15
|
+
const TOUCHED_REASON = 'the diff test files and the tests named after its modules'
|
|
16
|
+
const NOTHING_TOUCHED_REASON = 'no test file is in the diff or named after a changed module'
|
|
17
|
+
|
|
18
|
+
type ListDirectory = (directory: string) => ReadonlyArray<string>
|
|
19
|
+
|
|
20
|
+
// A directory that cannot be listed holds no test to run.
|
|
21
|
+
function list_directory(directory: string): ReadonlyArray<string> {
|
|
22
|
+
try {
|
|
23
|
+
return readdirSync(directory)
|
|
24
|
+
} catch {
|
|
25
|
+
return []
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function is_named_after(module_file: string, name: string): boolean {
|
|
30
|
+
const stem = path.basename(module_file, path.extname(module_file))
|
|
31
|
+
|
|
32
|
+
return name.startsWith(`${stem}.`) && name.endsWith(TEST_SUFFIX)
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// A test file of the diff runs itself while it is still on disk; a module runs its same-named tests.
|
|
36
|
+
function tests_of(root: string, file: string, list: ListDirectory): Array<string> {
|
|
37
|
+
const directory = path.dirname(file)
|
|
38
|
+
const names = list(path.join(root, directory))
|
|
39
|
+
|
|
40
|
+
if (file.endsWith(TEST_SUFFIX)) return names.includes(path.basename(file)) ? [file] : []
|
|
41
|
+
if (!related_scope.is_relatable(file)) return []
|
|
42
|
+
|
|
43
|
+
return names
|
|
44
|
+
.filter((name) => is_named_after(file, name))
|
|
45
|
+
.map((name) => path.join(directory, name))
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function touched_tests(
|
|
49
|
+
root: string,
|
|
50
|
+
changed: ReadonlyArray<string>,
|
|
51
|
+
list: ListDirectory = list_directory,
|
|
52
|
+
): Array<string> {
|
|
53
|
+
return [...new Set(changed.flatMap((file) => tests_of(root, file, list)))]
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// `changed` is repository-root-relative; `undefined` — a diff git could not read — runs the whole suite,
|
|
57
|
+
// as an unreadable change does for the full-reach run.
|
|
58
|
+
function touched_scope(
|
|
59
|
+
root: string,
|
|
60
|
+
changed: ReadonlyArray<string> | undefined,
|
|
61
|
+
list: ListDirectory = list_directory,
|
|
62
|
+
): RelatedScope {
|
|
63
|
+
const { UNREADABLE_REASON } = related_scope
|
|
64
|
+
|
|
65
|
+
if (changed === undefined) return { mode: 'all', files: [], reason: UNREADABLE_REASON }
|
|
66
|
+
|
|
67
|
+
const files = touched_tests(root, changed, list).map((file) => path.join(root, file))
|
|
68
|
+
|
|
69
|
+
if (files.length === 0) return { mode: 'none', files: [], reason: NOTHING_TOUCHED_REASON }
|
|
70
|
+
|
|
71
|
+
return { mode: 'related', files, reason: TOUCHED_REASON }
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
const test_related_touched = {
|
|
75
|
+
NOTHING_TOUCHED_REASON,
|
|
76
|
+
TOUCHED_FLAG,
|
|
77
|
+
TOUCHED_KIND,
|
|
78
|
+
TOUCHED_REASON,
|
|
79
|
+
touched_scope,
|
|
80
|
+
touched_tests,
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
export type { ListDirectory }
|
|
84
|
+
export { test_related_touched }
|
|
@@ -1,11 +1,25 @@
|
|
|
1
|
-
#!/usr/bin/env tsx
|
|
2
1
|
import { existsSync } from 'node:fs'
|
|
3
|
-
import
|
|
2
|
+
import path from 'node:path'
|
|
3
|
+
import { gate_labels } from '#scripts/gate/gate-labels'
|
|
4
4
|
import type { GateTree } from '#scripts/gate/gate-tree'
|
|
5
|
+
import { input_fingerprint } from '#scripts/gate/input-fingerprint'
|
|
6
|
+
import { moved_paths } from '#scripts/gate/moved-paths'
|
|
5
7
|
import { scoped_green } from '#scripts/gate/scoped-green'
|
|
8
|
+
import { since_green } from '#scripts/gate/since-green'
|
|
6
9
|
import { changed_file_scope } from '#scripts/git/changed-file-scope'
|
|
10
|
+
import { changed_paths } from '#scripts/git/changed-paths'
|
|
7
11
|
import { review_stamps } from '#scripts/review/review-stamps'
|
|
8
|
-
import {
|
|
12
|
+
import { direct_importers } from './direct-importers'
|
|
13
|
+
import { pure_files_entries } from './pure-files-entries'
|
|
14
|
+
import { related_heavy_tests } from './related-heavy-tests'
|
|
15
|
+
import { test_no_base } from './test-no-base'
|
|
16
|
+
import { test_read_map, type ReadMap } from './test-read-map'
|
|
17
|
+
import { test_related_claim } from './test-related-claim'
|
|
18
|
+
import { test_related_moved, type ChangeReading } from './test-related-moved'
|
|
19
|
+
import { test_related_record, type RunInput } from './test-related-record'
|
|
20
|
+
import { related_scope, type RelatedScope } from './test-related-scope'
|
|
21
|
+
import { test_related_synced } from './test-related-synced'
|
|
22
|
+
import { test_related_touched } from './test-related-touched'
|
|
9
23
|
import { test_unit_guard } from './test-unit-guard'
|
|
10
24
|
|
|
11
25
|
// `josh test:related` — the unit check an implementation loop runs between edits.
|
|
@@ -30,26 +44,378 @@ function conclusive_tree(before: GateTree | undefined): GateTree | undefined {
|
|
|
30
44
|
return test_unit_guard.is_running(process.cwd()) ? before : undefined
|
|
31
45
|
}
|
|
32
46
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
47
|
+
// A failure answers `undefined` rather than an empty list: the two are opposite inputs to
|
|
48
|
+
// `resolve_scope`, and only one of them means "could not tell".
|
|
49
|
+
async function read_or_undefined(
|
|
50
|
+
read: () => Promise<ReadonlyArray<string>>,
|
|
51
|
+
): Promise<ReadonlyArray<string> | undefined> {
|
|
52
|
+
try {
|
|
53
|
+
return await read()
|
|
54
|
+
} catch {
|
|
55
|
+
return undefined
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
async function branch_change(): Promise<ReadonlyArray<string> | undefined> {
|
|
60
|
+
return await read_or_undefined(async () => await changed_paths.read_changed_paths(false))
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// **The change a map answers for is the change since the tree it was recorded on** — its commit and
|
|
64
|
+
// the content its dirty files held then (`test_read_map.changed_since_tree`). A commit git can no
|
|
65
|
+
// longer resolve — a pruned or foreign map — leaves the branch change with no map, which runs the
|
|
66
|
+
// whole suite on any non-code file.
|
|
67
|
+
async function change_since(
|
|
68
|
+
root: string,
|
|
69
|
+
map: ReadMap,
|
|
70
|
+
): Promise<ReadonlyArray<string> | undefined> {
|
|
71
|
+
const since = await read_or_undefined(
|
|
72
|
+
async () => await changed_paths.read_changed_since(map.commit),
|
|
73
|
+
)
|
|
74
|
+
|
|
75
|
+
if (since === undefined) return undefined
|
|
76
|
+
|
|
77
|
+
return test_read_map.changed_since_tree(
|
|
78
|
+
map,
|
|
79
|
+
since,
|
|
80
|
+
input_fingerprint.of_files(root, Object.keys(map.dirty)),
|
|
81
|
+
)
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// **The map's tree is whichever lane last ran the whole suite green**, so the change since it holds that
|
|
85
|
+
// lane's own branch change too (joshuafolkken/kit#4527). What this branch did not change is marked
|
|
86
|
+
// `since_map`: it reaches vitest only as a code file naming what moved, and only this branch's change
|
|
87
|
+
// can send the run to the whole suite (joshuafolkken/kit#4896). A branch change git cannot read marks nothing.
|
|
88
|
+
async function map_change(root: string, map: ReadMap): Promise<ChangeReading> {
|
|
89
|
+
const changed = await change_since(root, map)
|
|
90
|
+
|
|
91
|
+
if (changed === undefined) return { changed: await branch_change(), map: undefined }
|
|
92
|
+
|
|
93
|
+
const branch = await branch_change()
|
|
94
|
+
|
|
95
|
+
if (branch === undefined) return { changed, map }
|
|
96
|
+
|
|
97
|
+
return { changed, map, since_map: changed.filter((file) => !branch.includes(file)) }
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// Explicit file arguments win over the git reading, which is what makes the narrowing testable by
|
|
101
|
+
// hand and usable from a hook that already knows which file it just wrote. **The map still answers
|
|
102
|
+
// only for the change since its tree**, so that change joins the arguments: a test added since the
|
|
103
|
+
// map was recorded is in no entry, and only its own appearance in the change runs it — when it names
|
|
104
|
+
// a file the arguments moved (`naming_moved`), as a source file there does.
|
|
105
|
+
async function explicit_change(
|
|
106
|
+
root: string,
|
|
107
|
+
explicit: ReadonlyArray<string>,
|
|
108
|
+
map: ReadMap | undefined,
|
|
109
|
+
): Promise<ChangeReading> {
|
|
110
|
+
const since = map === undefined ? undefined : await change_since(root, map)
|
|
111
|
+
|
|
112
|
+
if (since === undefined) return { changed: explicit, map: undefined }
|
|
113
|
+
|
|
114
|
+
const named = new Set(explicit)
|
|
115
|
+
const since_map = since.filter((file) => !named.has(file))
|
|
116
|
+
|
|
117
|
+
return { changed: [...named, ...since_map], map, since_map }
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// **The whole-suite leg never narrows by a green a bare run recorded past a file every test imports**:
|
|
121
|
+
// that green vouches only for the file's direct importers (joshuafolkken/kit#5122), so while this
|
|
122
|
+
// branch changes one, the gate's unit leg reads the whole branch change.
|
|
123
|
+
async function is_green_narrowable(is_whole: boolean): Promise<boolean> {
|
|
124
|
+
if (!is_whole) return true
|
|
125
|
+
|
|
126
|
+
return direct_importers.every_test_imports_of((await branch_change()) ?? []).length === 0
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
// **What moved since this command's last green run** (`since-green.ts`), read as explicit arguments
|
|
130
|
+
// are. A moved file — code or not — reaches the tests reading it as data through the map, whose
|
|
131
|
+
// entries hold no module that started reading it after the map's tree; the change since that tree
|
|
132
|
+
// joins the list — a code file of it only when it names a moved file (`naming_moved`) — so such a
|
|
133
|
+
// module runs the tests importing it. Nothing moved runs nothing; no map,
|
|
134
|
+
// or one git can no longer diff against, answers `undefined`, which reads the whole branch change.
|
|
135
|
+
async function since_green_change(
|
|
136
|
+
root: string,
|
|
137
|
+
map: ReadMap | undefined,
|
|
138
|
+
is_whole: boolean,
|
|
139
|
+
): Promise<ChangeReading | undefined> {
|
|
140
|
+
const parts = (await is_green_narrowable(is_whole))
|
|
141
|
+
? await since_green.read_moved_parts(review_stamps.test_related_stamp, gate_labels.UNIT_LABEL)
|
|
142
|
+
: undefined
|
|
143
|
+
|
|
144
|
+
if (parts === undefined) return undefined
|
|
145
|
+
|
|
146
|
+
const moved = moved_paths.union_of(parts)
|
|
147
|
+
|
|
148
|
+
if (moved.length === 0) return { changed: [], map, is_unmoved: true }
|
|
149
|
+
|
|
150
|
+
const branch = await branch_change()
|
|
151
|
+
const split = await test_related_synced.split(root, parts.synced, branch, map)
|
|
152
|
+
const change = await explicit_change(
|
|
153
|
+
root,
|
|
154
|
+
test_related_moved.narrowed_moved(moved, split, branch, map),
|
|
155
|
+
map,
|
|
156
|
+
)
|
|
157
|
+
|
|
158
|
+
if (change.map === undefined) return undefined
|
|
159
|
+
|
|
160
|
+
process.stdout.write(`${since_green.describe(related_scope.COMMAND_LABEL, moved)}\n`)
|
|
161
|
+
|
|
162
|
+
return test_related_moved.moved_reading(change, parts, branch, split)
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
async function whole_change(
|
|
166
|
+
root: string,
|
|
167
|
+
map: ReadMap | undefined,
|
|
168
|
+
is_whole: boolean,
|
|
169
|
+
): Promise<ChangeReading> {
|
|
170
|
+
const since = await since_green_change(root, map, is_whole)
|
|
171
|
+
|
|
172
|
+
if (since !== undefined) return since
|
|
173
|
+
|
|
174
|
+
return map === undefined ? { changed: await branch_change(), map } : await map_change(root, map)
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
function explicit_files(root: string, command_arguments: ReadonlyArray<string>): Array<string> {
|
|
178
|
+
return command_arguments
|
|
179
|
+
.filter((argument) => !changed_file_scope.is_flag(argument))
|
|
180
|
+
.map((file) => path.relative(root, path.resolve(file)))
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
async function read_change(
|
|
184
|
+
root: string,
|
|
185
|
+
command_arguments: ReadonlyArray<string>,
|
|
186
|
+
is_whole: boolean,
|
|
187
|
+
): Promise<ChangeReading> {
|
|
188
|
+
const map = test_read_map.read_map(root)
|
|
189
|
+
const explicit = explicit_files(root, command_arguments)
|
|
190
|
+
|
|
191
|
+
return explicit.length > 0
|
|
192
|
+
? await explicit_change(root, explicit, map)
|
|
193
|
+
: await whole_change(root, map, is_whole)
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
// **The changed non-code files the map's tree held and that did not already differ from it** — the
|
|
197
|
+
// ones whose having no reader in the map means no test reads them. A file that was dirty when the
|
|
198
|
+
// map was recorded is left out, since the tree the tests read then was not the commit's. A git
|
|
199
|
+
// failure holds none, which runs the whole suite on any of them.
|
|
200
|
+
async function recorded_files(change: ChangeReading): Promise<ReadonlySet<string>> {
|
|
201
|
+
const { changed, map } = change
|
|
202
|
+
|
|
203
|
+
if (changed === undefined || map === undefined) return new Set()
|
|
204
|
+
|
|
205
|
+
const dirty = new Set(Object.keys(map.dirty))
|
|
206
|
+
const candidates = changed.filter((file) => !related_scope.is_relatable(file) && !dirty.has(file))
|
|
207
|
+
|
|
208
|
+
return new Set(
|
|
209
|
+
await read_or_undefined(async () => await changed_paths.read_held_at(map.commit, candidates)),
|
|
210
|
+
)
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
// **The code files of the change since the map that name a file this change moved** — read off their
|
|
214
|
+
// text, the one place a file-system read added since the map's tree shows (`is_code_input` in
|
|
215
|
+
// `test-related-scope.ts`, joshuafolkken/kit#4532). A file the tree no longer holds names nothing. A
|
|
216
|
+
// file every test depends on is never one: handed to vitest it runs the whole suite unannounced, and
|
|
217
|
+
// only this branch's own change of it may do that (joshuafolkken/kit#4993). **Only this branch's own
|
|
218
|
+
// change names**, where it was read: a main sync's file — a shared test, or one main deleted — would
|
|
219
|
+
// match main's own sources, which vitest widens to hundreds of tests (joshuafolkken/kit#5041).
|
|
220
|
+
function naming_moved(root: string, change: ChangeReading): ReadonlySet<string> {
|
|
221
|
+
const { changed = [], since_map = [], branch = changed } = change
|
|
222
|
+
const names = changed
|
|
223
|
+
.filter((file) => !since_map.includes(file) && branch.includes(file))
|
|
224
|
+
.map((file) => path.basename(file))
|
|
225
|
+
const code = since_map.filter(
|
|
226
|
+
(file) => related_scope.is_relatable(file) && !test_related_moved.is_whole_suite(file),
|
|
227
|
+
)
|
|
228
|
+
|
|
229
|
+
// Each file's text is read once, however many names it is checked for.
|
|
230
|
+
return new Set(
|
|
231
|
+
code.filter((file) =>
|
|
232
|
+
test_no_base.names_any(test_no_base.text_of(path.join(root, file)), names),
|
|
233
|
+
),
|
|
234
|
+
)
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
// A file every test imports narrows to its direct importers unless `is_whole`: the gate's unit leg, and
|
|
238
|
+
// the gate's reuse of it, keep the whole suite for it (`gate_labels.KEEP_WHOLE_SUITE_FLAG`).
|
|
239
|
+
async function scope_of(
|
|
240
|
+
root: string,
|
|
241
|
+
change: ChangeReading,
|
|
242
|
+
is_whole: boolean,
|
|
243
|
+
): Promise<RelatedScope> {
|
|
244
|
+
const recorded = await recorded_files(change)
|
|
245
|
+
const naming = naming_moved(root, change)
|
|
246
|
+
const pure_entries = await pure_files_entries.read_moved(root, change.changed)
|
|
247
|
+
const narrowed = is_whole ? [] : (change.changed ?? [])
|
|
248
|
+
const importers = await direct_importers.every_test_importers(root, narrowed)
|
|
249
|
+
|
|
250
|
+
return related_scope.resolve_scope({
|
|
37
251
|
root,
|
|
38
|
-
|
|
252
|
+
...change,
|
|
253
|
+
recorded,
|
|
254
|
+
naming_moved: naming,
|
|
255
|
+
pure_entries,
|
|
256
|
+
every_test_importers: importers,
|
|
257
|
+
is_present: existsSync,
|
|
258
|
+
})
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
// **Whether a set of changed files can reach any test**, answered by the decision this command
|
|
262
|
+
// narrows with, so the gate's reuse of a green unit step (`check-inputs.ts`) can never trust a change
|
|
263
|
+
// this command would have run tests for. Unknown reaches: no map, or one recorded on a tree git can
|
|
264
|
+
// no longer diff against. The change since the map joins the paths as it does for explicit
|
|
265
|
+
// arguments, so a test added or edited after the map was recorded still reaches when it names a path.
|
|
266
|
+
async function reaches_tests(root: string, paths: ReadonlyArray<string>): Promise<boolean> {
|
|
267
|
+
if (paths.length === 0) return false
|
|
268
|
+
|
|
269
|
+
const change = await explicit_change(root, paths, test_read_map.read_map(root))
|
|
270
|
+
|
|
271
|
+
if (change.map === undefined) return true
|
|
272
|
+
|
|
273
|
+
const scope = await scope_of(root, change, true)
|
|
274
|
+
|
|
275
|
+
return scope.mode !== 'none'
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
// A change known to reach no test succeeds without starting vitest, and says why.
|
|
279
|
+
async function run_scope(
|
|
280
|
+
scope: RelatedScope,
|
|
281
|
+
root: string,
|
|
282
|
+
command_arguments: ReadonlyArray<string>,
|
|
283
|
+
): Promise<number> {
|
|
284
|
+
const description = related_scope.describe_scope(scope, root)
|
|
285
|
+
|
|
286
|
+
if (scope.mode === 'none') {
|
|
287
|
+
process.stdout.write(`${description}\n`)
|
|
288
|
+
|
|
289
|
+
return 0
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
const vitest_arguments = related_scope.vitest_arguments(scope, [
|
|
293
|
+
...changed_file_scope.flags_of(command_arguments),
|
|
294
|
+
...related_heavy_tests.exclude_flags(scope, root),
|
|
295
|
+
])
|
|
296
|
+
|
|
297
|
+
return await test_related_claim.with_unit_claim(
|
|
298
|
+
scope.mode === 'related' ? scope.files : undefined,
|
|
299
|
+
async () =>
|
|
300
|
+
await test_unit_guard.run_guarded_vitest(
|
|
301
|
+
process.cwd(),
|
|
302
|
+
vitest_arguments,
|
|
303
|
+
related_scope.COMMAND_NAME,
|
|
304
|
+
description,
|
|
305
|
+
),
|
|
306
|
+
)
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
async function resolve_change(
|
|
310
|
+
root: string,
|
|
311
|
+
change: ChangeReading,
|
|
312
|
+
is_whole: boolean,
|
|
313
|
+
): Promise<RelatedScope> {
|
|
314
|
+
const { UNMOVED_REASON } = related_scope
|
|
315
|
+
|
|
316
|
+
if (change.is_unmoved === true) return { mode: 'none', files: [], reason: UNMOVED_REASON }
|
|
317
|
+
|
|
318
|
+
return await scope_of(root, change, is_whole)
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
async function read_run_input(
|
|
322
|
+
root: string,
|
|
323
|
+
command_arguments: ReadonlyArray<string>,
|
|
324
|
+
is_whole: boolean,
|
|
325
|
+
): Promise<RunInput> {
|
|
326
|
+
const change = await read_change(root, command_arguments, is_whole)
|
|
327
|
+
const scope = await resolve_change(root, change, is_whole)
|
|
328
|
+
|
|
329
|
+
const { changed, synced = [], since_map = [], branch } = change
|
|
330
|
+
|
|
331
|
+
return { scope, root, changed, synced, since_map, branch }
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
// Every run is timed and counted into the lane ledger (joshuafolkken/kit#4465).
|
|
335
|
+
async function run_and_record(
|
|
336
|
+
input: RunInput,
|
|
337
|
+
command_arguments: ReadonlyArray<string>,
|
|
338
|
+
): Promise<number> {
|
|
339
|
+
const started = performance.now()
|
|
340
|
+
const { exit_code, test_files } = await test_related_record.with_test_count(
|
|
341
|
+
async () => await run_scope(input.scope, input.root, command_arguments),
|
|
342
|
+
)
|
|
343
|
+
|
|
344
|
+
await test_related_record.record_run(input, {
|
|
345
|
+
elapsed_ms: performance.now() - started,
|
|
346
|
+
test_files,
|
|
39
347
|
})
|
|
40
348
|
|
|
349
|
+
return exit_code
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
// **The no-base pass is part of the run's verdict**, so a green record — the one `josh ship` and the
|
|
353
|
+
// gate reuse — never vouches for a tree whose base-touching code fails in CI's checkout. It runs
|
|
354
|
+
// only after a green first pass (`test-no-base.ts`), and only over this branch's own files: those
|
|
355
|
+
// the map's tree or a main sync joined were verified by main's CI.
|
|
356
|
+
async function with_no_base_pass(
|
|
357
|
+
input: RunInput,
|
|
358
|
+
command_arguments: ReadonlyArray<string>,
|
|
359
|
+
exit_code: number,
|
|
360
|
+
): Promise<number> {
|
|
361
|
+
if (exit_code !== 0) return exit_code
|
|
362
|
+
|
|
363
|
+
const flags = changed_file_scope.flags_of(command_arguments)
|
|
364
|
+
const joined = new Set([...input.since_map, ...input.synced])
|
|
365
|
+
const own = (input.changed ?? []).filter((file) => !joined.has(file))
|
|
366
|
+
|
|
367
|
+
return await test_no_base.run_if_touched(input.root, own, flags)
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
// A non-code argument is resolved through the map, and a file every test imports through its
|
|
371
|
+
// importers, rather than handed to vitest, so only the other code arguments can be ones vitest was not
|
|
372
|
+
// given.
|
|
373
|
+
function report_unhanded(
|
|
374
|
+
root: string,
|
|
375
|
+
command_arguments: ReadonlyArray<string>,
|
|
376
|
+
scope: RelatedScope,
|
|
377
|
+
): void {
|
|
41
378
|
changed_file_scope.report_unusable_arguments(
|
|
42
|
-
command_arguments
|
|
379
|
+
command_arguments.filter(
|
|
380
|
+
(argument) =>
|
|
381
|
+
related_scope.is_relatable(argument) &&
|
|
382
|
+
!direct_importers.is_every_test_import(root, argument),
|
|
383
|
+
),
|
|
43
384
|
scope,
|
|
44
385
|
related_scope.COMMAND_LABEL,
|
|
45
386
|
)
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
// **A `--touched` run is the implementation loop's** (`test-related-touched.ts`): it reads its scope off
|
|
390
|
+
// the change alone and leaves no green record, so `josh review:brief` and the gate's reuse count only
|
|
391
|
+
// a full-reach run.
|
|
392
|
+
async function run_touched(given: ReadonlyArray<string>): Promise<number> {
|
|
393
|
+
const { TOUCHED_FLAG, TOUCHED_KIND } = test_related_touched
|
|
394
|
+
const command_arguments = given.filter((argument) => argument !== TOUCHED_FLAG)
|
|
395
|
+
const root = await changed_file_scope.repository_root_or_cwd()
|
|
396
|
+
const explicit = explicit_files(root, command_arguments)
|
|
397
|
+
const changed = explicit.length > 0 ? explicit : await branch_change()
|
|
398
|
+
const scope = test_related_touched.touched_scope(root, changed)
|
|
399
|
+
const input = { scope, root, changed, synced: [], since_map: [], kind: TOUCHED_KIND }
|
|
400
|
+
|
|
401
|
+
return await run_and_record(input, command_arguments)
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
async function run_related_tests(given: ReadonlyArray<string>): Promise<number> {
|
|
405
|
+
if (given.includes(test_related_touched.TOUCHED_FLAG)) return await run_touched(given)
|
|
406
|
+
|
|
407
|
+
const { KEEP_WHOLE_SUITE_FLAG } = gate_labels
|
|
408
|
+
const command_arguments = given.filter((argument) => argument !== KEEP_WHOLE_SUITE_FLAG)
|
|
409
|
+
const root = await changed_file_scope.repository_root_or_cwd()
|
|
410
|
+
const input = await read_run_input(root, command_arguments, given.includes(KEEP_WHOLE_SUITE_FLAG))
|
|
411
|
+
|
|
412
|
+
report_unhanded(root, command_arguments, input.scope)
|
|
46
413
|
|
|
47
414
|
const before = await scoped_green.read_before(command_arguments)
|
|
48
|
-
const exit_code = await
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
related_scope.describe_scope(scope, root),
|
|
415
|
+
const exit_code = await with_no_base_pass(
|
|
416
|
+
input,
|
|
417
|
+
command_arguments,
|
|
418
|
+
await run_and_record(input, command_arguments),
|
|
53
419
|
)
|
|
54
420
|
|
|
55
421
|
await scoped_green.record_if_green(review_stamps.test_related_stamp, {
|
|
@@ -60,10 +426,6 @@ async function run_related_tests(command_arguments: ReadonlyArray<string>): Prom
|
|
|
60
426
|
return exit_code
|
|
61
427
|
}
|
|
62
428
|
|
|
63
|
-
|
|
64
|
-
process.exitCode = await run_related_tests(process.argv.slice(changed_file_scope.ARGV_START))
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
const test_related = { run_related_tests }
|
|
429
|
+
const test_related = { reaches_tests, run_related_tests }
|
|
68
430
|
|
|
69
431
|
export { test_related }
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
import { fileURLToPath } from 'node:url'
|
|
3
|
+
import { test_unit_guard } from './test-unit-guard'
|
|
4
|
+
|
|
5
|
+
// The `josh test:unit` entry, kept apart from `test-unit-guard.ts` because the gate and the pre-push
|
|
6
|
+
// hook import that one: a bundle is one file, so a main guard there would fire for every command that
|
|
7
|
+
// carries it (joshuafolkken/kit#4186).
|
|
8
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) {
|
|
9
|
+
const ARGV_OFFSET = 2
|
|
10
|
+
|
|
11
|
+
process.exitCode = await test_unit_guard.run_guarded_unit(
|
|
12
|
+
process.cwd(),
|
|
13
|
+
process.argv.slice(ARGV_OFFSET),
|
|
14
|
+
)
|
|
15
|
+
}
|
|
@@ -1,19 +1,20 @@
|
|
|
1
|
-
#!/usr/bin/env tsx
|
|
2
1
|
import { existsSync, globSync } from 'node:fs'
|
|
3
2
|
import { availableParallelism } from 'node:os'
|
|
4
3
|
import path from 'node:path'
|
|
5
|
-
import { fileURLToPath } from 'node:url'
|
|
6
4
|
import { PROJECT_ENVIRONMENT_KEYS } from '#ports'
|
|
5
|
+
import { core_budget } from '#scripts/gate/core-budget'
|
|
7
6
|
import { free_cores } from '#scripts/gate/free-cores'
|
|
8
7
|
import { project_checks } from '#scripts/gate/project-checks'
|
|
8
|
+
import { changed_file_scope } from '#scripts/git/changed-file-scope'
|
|
9
9
|
import { execa } from 'execa'
|
|
10
10
|
import { project_test_script, type ProjectScriptState } from './project-test-script'
|
|
11
11
|
import { SKIP_MARKER } from './skip-marker'
|
|
12
|
+
import { test_read_recording, type RecordingEnvironment } from './test-read-recording'
|
|
12
13
|
import { unit_worker_share } from './unit-worker-share'
|
|
14
|
+
import { vitest_failure_summary } from './vitest-failure-summary'
|
|
13
15
|
|
|
14
16
|
const PNPM = 'pnpm'
|
|
15
17
|
const FAIL_EXIT_CODE = 1
|
|
16
|
-
const ARGV_START = 2
|
|
17
18
|
const VITEST_PACKAGE = path.join('node_modules', 'vitest')
|
|
18
19
|
const UNIT_GLOB = '**/*.{test,spec}.{ts,js}'
|
|
19
20
|
const NODE_MODULES = 'node_modules'
|
|
@@ -178,35 +179,80 @@ function isolated_unit_environment(
|
|
|
178
179
|
// both count "alone" and both run uncapped. Inside the marker the number is identical — this run's own
|
|
179
180
|
// record is now on disk and `is_nested_run` therefore contributes nothing — and the window is gone.
|
|
180
181
|
//
|
|
182
|
+
// **The share is bounded by the claim the run was admitted on** (`unit_worker_share.cap_to_claim`), so
|
|
183
|
+
// a share read after admission never opens more workers than the ledger holds for it
|
|
184
|
+
// (joshuafolkken/kit#4235).
|
|
185
|
+
//
|
|
181
186
|
// **The machine is read only when no count was typed.** The reading waits out a sample window, and a
|
|
182
|
-
// caller's `--maxWorkers`
|
|
183
|
-
//
|
|
187
|
+
// caller's `--maxWorkers` wins whatever it says. The gate's cap is one: its admission narrows it to the
|
|
188
|
+
// free cores, and its unit step bounds it by the free memory once admitted (`gate-run-steps.ts`).
|
|
184
189
|
async function vitest_share(vitest_arguments: ReadonlyArray<string>): Promise<number | undefined> {
|
|
185
190
|
if (unit_worker_share.has_worker_flag(vitest_arguments)) return undefined
|
|
186
191
|
|
|
187
192
|
const available_cores = availableParallelism()
|
|
193
|
+
// The cores and the memory free right now (joshuafolkken/kit#4528), from one reading.
|
|
188
194
|
const free = await free_cores.read({ available_cores })
|
|
195
|
+
const share = unit_worker_share.current_share(
|
|
196
|
+
available_cores,
|
|
197
|
+
unit_worker_share.live_run_count(),
|
|
198
|
+
free,
|
|
199
|
+
)
|
|
200
|
+
|
|
201
|
+
return unit_worker_share.cap_to_claim(share, core_budget.held_unit_claim())
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
async function execute_vitest(
|
|
205
|
+
vitest_arguments: ReadonlyArray<string>,
|
|
206
|
+
recording: RecordingEnvironment,
|
|
207
|
+
directory: string,
|
|
208
|
+
): Promise<number> {
|
|
209
|
+
// Shown as it runs and kept as well, so a failed run can end with its summary (joshuafolkken/kit#4869).
|
|
210
|
+
const result = await execa(PNPM, ['exec', 'vitest', ...vitest_arguments], {
|
|
211
|
+
cwd: directory,
|
|
212
|
+
env: { ...isolated_unit_environment(), ...recording },
|
|
213
|
+
extendEnv: false,
|
|
214
|
+
stdin: 'inherit',
|
|
215
|
+
stdout: ['inherit', 'pipe'],
|
|
216
|
+
stderr: ['inherit', 'pipe'],
|
|
217
|
+
all: true,
|
|
218
|
+
reject: false,
|
|
219
|
+
})
|
|
220
|
+
const exit_code = result.exitCode ?? FAIL_EXIT_CODE
|
|
221
|
+
|
|
222
|
+
vitest_failure_summary.report(vitest_arguments, result.all, exit_code)
|
|
189
223
|
|
|
190
|
-
return
|
|
224
|
+
return exit_code
|
|
191
225
|
}
|
|
192
226
|
|
|
193
|
-
|
|
227
|
+
// A whole-suite run also records the test-read map `josh test:related` narrows by. `directory` is
|
|
228
|
+
// where vitest runs — another checkout's for `test-no-base.ts`, this process's otherwise.
|
|
229
|
+
async function run_vitest(
|
|
230
|
+
vitest_arguments: ReadonlyArray<string>,
|
|
231
|
+
directory: string = process.cwd(),
|
|
232
|
+
): Promise<number> {
|
|
194
233
|
return await unit_worker_share.with_run_marker(async () => {
|
|
195
|
-
const sized =
|
|
196
|
-
vitest_arguments,
|
|
197
|
-
await vitest_share(vitest_arguments),
|
|
234
|
+
const sized = [
|
|
235
|
+
...vitest_arguments,
|
|
236
|
+
...unit_worker_share.worker_arguments(vitest_arguments, await vitest_share(vitest_arguments)),
|
|
237
|
+
]
|
|
238
|
+
const root = await changed_file_scope.repository_root_or_cwd()
|
|
239
|
+
|
|
240
|
+
return await test_read_recording.with_read_recording(
|
|
241
|
+
root,
|
|
242
|
+
sized,
|
|
243
|
+
async (recording) => await execute_vitest(sized, recording, directory),
|
|
198
244
|
)
|
|
199
|
-
const result = await execa(PNPM, ['exec', 'vitest', ...vitest_arguments, ...sized], {
|
|
200
|
-
env: isolated_unit_environment(),
|
|
201
|
-
extendEnv: false,
|
|
202
|
-
stdio: 'inherit',
|
|
203
|
-
reject: false,
|
|
204
|
-
})
|
|
205
|
-
|
|
206
|
-
return result.exitCode ?? FAIL_EXIT_CODE
|
|
207
245
|
})
|
|
208
246
|
}
|
|
209
247
|
|
|
248
|
+
// The same funnel, run in another checkout of this project — whose `node_modules` is this one's.
|
|
249
|
+
async function run_vitest_in(
|
|
250
|
+
directory: string,
|
|
251
|
+
vitest_arguments: ReadonlyArray<string>,
|
|
252
|
+
): Promise<number> {
|
|
253
|
+
return await run_vitest(vitest_arguments, directory)
|
|
254
|
+
}
|
|
255
|
+
|
|
210
256
|
// The label names the command the notice is printed for, so a skipped scoped run says
|
|
211
257
|
// `josh test:related` rather than reporting itself as the full suite. `SKIP_MARKER` is unchanged
|
|
212
258
|
// either way: the gate reads that word, never the label.
|
|
@@ -262,13 +308,6 @@ async function run_guarded_unit(
|
|
|
262
308
|
return await run_guarded_vitest(project_directory, ['run', ...extra_arguments])
|
|
263
309
|
}
|
|
264
310
|
|
|
265
|
-
if (process.argv[1] === fileURLToPath(import.meta.url)) {
|
|
266
|
-
const extra_arguments = process.argv.slice(ARGV_START)
|
|
267
|
-
const exit_code = await run_guarded_unit(process.cwd(), extra_arguments)
|
|
268
|
-
|
|
269
|
-
process.exit(exit_code)
|
|
270
|
-
}
|
|
271
|
-
|
|
272
311
|
const test_unit_guard = {
|
|
273
312
|
SKIP_MARKER,
|
|
274
313
|
guard_action,
|
|
@@ -280,6 +319,8 @@ const test_unit_guard = {
|
|
|
280
319
|
isolated_unit_environment,
|
|
281
320
|
run_guarded_unit,
|
|
282
321
|
run_guarded_vitest,
|
|
322
|
+
run_vitest_in,
|
|
323
|
+
vitest_share,
|
|
283
324
|
}
|
|
284
325
|
|
|
285
326
|
export type { GuardAction }
|