@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,103 @@
|
|
|
1
|
+
import { mkdtempSync, rmSync } from 'node:fs'
|
|
2
|
+
import { tmpdir } from 'node:os'
|
|
3
|
+
import path from 'node:path'
|
|
4
|
+
import { input_fingerprint } from '#scripts/gate/input-fingerprint'
|
|
5
|
+
import { changed_paths } from '#scripts/git/changed-paths'
|
|
6
|
+
import { git_command } from '#scripts/git/git-command'
|
|
7
|
+
import { git_spawn } from '#scripts/git/git-spawn'
|
|
8
|
+
import { test_read_map, type ReadMap } from './test-read-map'
|
|
9
|
+
import { test_read_trace } from './test-read-trace'
|
|
10
|
+
|
|
11
|
+
// When a unit run records the test-read map, and how the records become one. **Only a run of the
|
|
12
|
+
// whole suite records**: a map is read as "nothing else reads this file", which a narrowed, sharded
|
|
13
|
+
// or filtered run cannot vouch for. **Only a green run replaces the map**: a failed test may have
|
|
14
|
+
// stopped before the read it would have made.
|
|
15
|
+
|
|
16
|
+
type RecordingEnvironment = Record<string, string>
|
|
17
|
+
|
|
18
|
+
const RUN_SUBCOMMAND = 'run'
|
|
19
|
+
|
|
20
|
+
// The one flag a whole-suite run still carries — the gate's worker cap, which sizes the run without
|
|
21
|
+
// narrowing it.
|
|
22
|
+
const WORKER_FLAG_PREFIX = '--maxWorkers'
|
|
23
|
+
|
|
24
|
+
const RECORD_DIRECTORY_PREFIX = 'josh-test-reads-'
|
|
25
|
+
|
|
26
|
+
function is_recordable(vitest_arguments: ReadonlyArray<string>): boolean {
|
|
27
|
+
const [subcommand, ...flags] = vitest_arguments
|
|
28
|
+
|
|
29
|
+
return subcommand === RUN_SUBCOMMAND && flags.every((flag) => flag.startsWith(WORKER_FLAG_PREFIX))
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// Every directory the commit holds, NUL-separated so a name git would quote reads as itself.
|
|
33
|
+
async function commit_directories(commit: string): Promise<Array<string>> {
|
|
34
|
+
const output = await git_spawn.read(['ls-tree', '-r', '-d', '--name-only', '-z', commit])
|
|
35
|
+
|
|
36
|
+
return output.split('\0').filter((listed) => listed.length > 0)
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
type TreeSnapshot = Pick<ReadMap, 'commit' | 'dirty' | 'change' | 'directories'>
|
|
40
|
+
|
|
41
|
+
// A checkout with no change base (no default-branch ref) still records its map, with no change to
|
|
42
|
+
// discount: every read then counts, which narrows less, never wrongly.
|
|
43
|
+
async function own_change(): Promise<Array<string>> {
|
|
44
|
+
try {
|
|
45
|
+
return await changed_paths.read_changed_paths(false)
|
|
46
|
+
} catch {
|
|
47
|
+
return []
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// The tree the run read: the commit, every file that differed from it with its content's digest, the
|
|
52
|
+
// checkout's change from its change base, and the directories it holds. **Read before the run
|
|
53
|
+
// starts**: a digest taken after it would vouch for an edit made while the tests ran as content they
|
|
54
|
+
// read.
|
|
55
|
+
async function tree_snapshot(root: string): Promise<TreeSnapshot> {
|
|
56
|
+
const commit = await git_command.head_commit()
|
|
57
|
+
const dirty = input_fingerprint.of_files(root, await changed_paths.read_changed_since(commit))
|
|
58
|
+
const change = await own_change()
|
|
59
|
+
|
|
60
|
+
return { commit, dirty, change, directories: await commit_directories(commit) }
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// A map that cannot be written — no git, a read-only common directory — leaves the previous map in
|
|
64
|
+
// place, and a narrowing over a stale map is refused by the commit it names.
|
|
65
|
+
function save_map(root: string, directory: string, snapshot: TreeSnapshot): void {
|
|
66
|
+
try {
|
|
67
|
+
const readers = test_read_map.merge_records(test_read_map.collect_records(directory))
|
|
68
|
+
|
|
69
|
+
test_read_map.write_map(root, { version: test_read_map.MAP_VERSION, ...snapshot, readers })
|
|
70
|
+
} catch {
|
|
71
|
+
// The previous map stays; the run's own result is unaffected.
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
async function with_read_recording(
|
|
76
|
+
root: string,
|
|
77
|
+
vitest_arguments: ReadonlyArray<string>,
|
|
78
|
+
run: (environment: RecordingEnvironment) => Promise<number>,
|
|
79
|
+
): Promise<number> {
|
|
80
|
+
if (!is_recordable(vitest_arguments)) return await run({})
|
|
81
|
+
|
|
82
|
+
const directory = mkdtempSync(path.join(tmpdir(), RECORD_DIRECTORY_PREFIX))
|
|
83
|
+
|
|
84
|
+
try {
|
|
85
|
+
// Settled rather than awaited, so a tree git cannot read records no map and fails no run.
|
|
86
|
+
const [tree] = await Promise.allSettled([tree_snapshot(root)])
|
|
87
|
+
const exit_code = await run({
|
|
88
|
+
[test_read_trace.RECORD_DIRECTORY_KEY]: directory,
|
|
89
|
+
[test_read_trace.ROOT_KEY]: root,
|
|
90
|
+
})
|
|
91
|
+
|
|
92
|
+
if (exit_code === 0 && tree.status === 'fulfilled') save_map(root, directory, tree.value)
|
|
93
|
+
|
|
94
|
+
return exit_code
|
|
95
|
+
} finally {
|
|
96
|
+
rmSync(directory, { recursive: true, force: true })
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
const test_read_recording = { is_recordable, with_read_recording }
|
|
101
|
+
|
|
102
|
+
export type { RecordingEnvironment }
|
|
103
|
+
export { test_read_recording }
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
import path from 'node:path'
|
|
2
|
+
import { fileURLToPath } from 'node:url'
|
|
3
|
+
|
|
4
|
+
// What one recorded read says, decided without touching `fs`: which repository path was read, and
|
|
5
|
+
// which module read it. `test-read-capture.ts`, armed by the `test-read-recorder.ts` setup file,
|
|
6
|
+
// feeds this from inside every unit worker; everything here is pure so the decisions are testable without patching `fs`.
|
|
7
|
+
//
|
|
8
|
+
// **The reader is the outermost repository frame on the stack, not the test file alone.** Under
|
|
9
|
+
// `isolate: false` a module that reads a document at load time is evaluated once per worker, so its
|
|
10
|
+
// read lands on whichever test imported it first. Recording the module whose evaluation made the read
|
|
11
|
+
// lets `vitest related` widen the read to every test that imports it, on any worker. A read a test
|
|
12
|
+
// makes has the test outermost, so a shared helper it reads through — every test importing it — is
|
|
13
|
+
// never the reader (joshuafolkken/kit#4417). The test file is recorded beside it, because an async
|
|
14
|
+
// callback (a directory walk inside a dependency) leaves no repository frame at all.
|
|
15
|
+
//
|
|
16
|
+
// **Only a module's evaluation makes a module the reader** (joshuafolkken/kit#5033). A read a named
|
|
17
|
+
// function makes after an `await` has that function outermost, since the continuation drops the test
|
|
18
|
+
// that called it: `import-graph.ts` read some 3,700 paths that way, and `vitest related` widened each
|
|
19
|
+
// to every test importing it. Such a read belongs to the test running it, recorded beside, so an
|
|
20
|
+
// outermost frame with a function name records no module. A module's top-level code runs with no
|
|
21
|
+
// function name; so does an anonymous callback, which keeps the widening — the safe side. A top-level
|
|
22
|
+
// `await` of a named function that reads after an `await` of its own narrows to the first importing
|
|
23
|
+
// test; no module does that today, and CI's whole suite would catch the miss.
|
|
24
|
+
|
|
25
|
+
type ReadRecords = Record<string, Array<string>>
|
|
26
|
+
|
|
27
|
+
// The worker setup file and the run that starts it agree on these two names and nothing else. They
|
|
28
|
+
// live here rather than beside the map because the setup file is loaded before any test's
|
|
29
|
+
// `vi.mock`: whatever it imports, no test can mock.
|
|
30
|
+
const RECORD_DIRECTORY_KEY = 'JOSH_TEST_READS_DIRECTORY'
|
|
31
|
+
const ROOT_KEY = 'JOSH_TEST_READS_ROOT'
|
|
32
|
+
|
|
33
|
+
const FILE_URL_PREFIX = 'file://'
|
|
34
|
+
const NODE_MODULES = 'node_modules'
|
|
35
|
+
const GIT_DIRECTORY = '.git'
|
|
36
|
+
const ROOT_ENTRY = '.'
|
|
37
|
+
|
|
38
|
+
// **What a read depends on is decided by the call, not by the path alone.** Reading or probing a
|
|
39
|
+
// path depends on that path; listing a directory depends on its direct entries; a recursive listing
|
|
40
|
+
// depends on everything beneath it. The two directory kinds are keyed with a glob-shaped suffix so
|
|
41
|
+
// the map keeps one shape: `scripts/*` is a listing of `scripts`, `scripts/**` a walk over it, and a
|
|
42
|
+
// listing of the root is `*`.
|
|
43
|
+
type ReadKind = 'path' | 'listing' | 'walk'
|
|
44
|
+
|
|
45
|
+
const LISTING_READS: ReadonlySet<string> = new Set([
|
|
46
|
+
'readdir',
|
|
47
|
+
'readdirSync',
|
|
48
|
+
'opendir',
|
|
49
|
+
'opendirSync',
|
|
50
|
+
])
|
|
51
|
+
|
|
52
|
+
const KIND_SUFFIX: Record<Exclude<ReadKind, 'path'>, string> = { listing: '*', walk: '**' }
|
|
53
|
+
|
|
54
|
+
function is_recursive(options: unknown): boolean {
|
|
55
|
+
return (
|
|
56
|
+
typeof options === 'object' && options !== null && Reflect.get(options, 'recursive') === true
|
|
57
|
+
)
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// The kind of read an `fs` call by this name makes, given its second argument.
|
|
61
|
+
function read_kind(name: string, options: unknown): ReadKind {
|
|
62
|
+
if (!LISTING_READS.has(name)) return 'path'
|
|
63
|
+
|
|
64
|
+
return is_recursive(options) ? 'walk' : 'listing'
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
function read_key(relative: string, kind: ReadKind): string {
|
|
68
|
+
return kind === 'path' ? relative : path.join(relative, KIND_SUFFIX[kind])
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// The file a call site's script name points at — an absolute path or a `file://` URL — or
|
|
72
|
+
// `undefined` for a `node:` internal or an evaluated string.
|
|
73
|
+
function script_path(script_name: string): string | undefined {
|
|
74
|
+
if (script_name.startsWith(FILE_URL_PREFIX)) return fileURLToPath(script_name)
|
|
75
|
+
|
|
76
|
+
return path.isAbsolute(script_name) ? script_name : undefined
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
function is_outside(relative: string): boolean {
|
|
80
|
+
return relative.startsWith('..') || path.isAbsolute(relative)
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
function is_ignored(relative: string): boolean {
|
|
84
|
+
const segments = relative.split(path.sep)
|
|
85
|
+
|
|
86
|
+
return segments.includes(NODE_MODULES) || segments[0] === GIT_DIRECTORY
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// A path relative to the root, or `undefined` when it lies outside it or inside a directory no test
|
|
90
|
+
// result depends on. The root itself is `.`.
|
|
91
|
+
function repository_path(root: string, file_path: string): string | undefined {
|
|
92
|
+
const relative = path.relative(root, file_path)
|
|
93
|
+
|
|
94
|
+
if (relative === '') return ROOT_ENTRY
|
|
95
|
+
|
|
96
|
+
return is_outside(relative) || is_ignored(relative) ? undefined : relative
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// The path an `fs` call names. A descriptor or a buffer names no path this map can key on.
|
|
100
|
+
function read_target(argument: unknown, cwd: string): string | undefined {
|
|
101
|
+
if (typeof argument === 'string') return path.resolve(cwd, argument)
|
|
102
|
+
if (argument instanceof URL) return fileURLToPath(argument)
|
|
103
|
+
|
|
104
|
+
return undefined
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// One call site: its script name, and the name of the function running there — empty for a module's
|
|
108
|
+
// top-level code or an anonymous callback.
|
|
109
|
+
interface CallFrame {
|
|
110
|
+
script_name: string
|
|
111
|
+
function_name: string
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
interface ReaderQuery {
|
|
115
|
+
root: string
|
|
116
|
+
// Every call site, innermost first.
|
|
117
|
+
frames: ReadonlyArray<CallFrame>
|
|
118
|
+
// The recorder's own file, which is always the top frame and never the reader.
|
|
119
|
+
recorder: string
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
function frame_reader(query: ReaderQuery, frame: CallFrame): string | undefined {
|
|
123
|
+
const file_path = script_path(frame.script_name)
|
|
124
|
+
|
|
125
|
+
if (file_path === undefined || file_path === query.recorder) return undefined
|
|
126
|
+
|
|
127
|
+
const relative = repository_path(query.root, file_path)
|
|
128
|
+
|
|
129
|
+
return relative === ROOT_ENTRY ? undefined : relative
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
function stack_reader(query: ReaderQuery): string | undefined {
|
|
133
|
+
const outermost = query.frames.findLast((frame) => frame_reader(query, frame) !== undefined)
|
|
134
|
+
|
|
135
|
+
if (outermost?.function_name !== '') return undefined
|
|
136
|
+
|
|
137
|
+
return frame_reader(query, outermost)
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
function add_reader(records: Map<string, Set<string>>, read_path: string, reader: string): void {
|
|
141
|
+
const readers = records.get(read_path) ?? new Set<string>()
|
|
142
|
+
|
|
143
|
+
readers.add(reader)
|
|
144
|
+
records.set(read_path, readers)
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
function to_records(records: ReadonlyMap<string, ReadonlySet<string>>): ReadRecords {
|
|
148
|
+
return Object.fromEntries([...records].map(([read_path, readers]) => [read_path, [...readers]]))
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
const test_read_trace = {
|
|
152
|
+
RECORD_DIRECTORY_KEY,
|
|
153
|
+
ROOT_ENTRY,
|
|
154
|
+
ROOT_KEY,
|
|
155
|
+
add_reader,
|
|
156
|
+
read_key,
|
|
157
|
+
read_kind,
|
|
158
|
+
read_target,
|
|
159
|
+
repository_path,
|
|
160
|
+
script_path,
|
|
161
|
+
stack_reader,
|
|
162
|
+
to_records,
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
export type { CallFrame, ReadKind, ReaderQuery, ReadRecords }
|
|
166
|
+
export { test_read_trace }
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import node_path from 'node:path'
|
|
1
2
|
import { issue_bug_label } from '#scripts/issue/issue-bug-label'
|
|
2
3
|
import { json_value } from '#scripts/lib/json-value'
|
|
3
4
|
import { observation_ledger } from '#scripts/observations/observation-ledger'
|
|
@@ -11,7 +12,15 @@ import { test_declared_logic } from './test-declared-logic'
|
|
|
11
12
|
// that test catches anything — the added and changed tests run against the merge-base, and at least one
|
|
12
13
|
// of them has to fail there.
|
|
13
14
|
|
|
14
|
-
type RedVerdict = 'red' | 'green' | 'no-test' | 'test-only'
|
|
15
|
+
type RedVerdict = 'red' | 'green' | 'no-test' | 'stopped' | 'test-only'
|
|
16
|
+
|
|
17
|
+
// One run's verdict and the test files that failed in it. `ran` is the number of test files the run
|
|
18
|
+
// ran, absent on a verdict read back from a cache (joshuafolkken/kit#5078).
|
|
19
|
+
interface RedProbe {
|
|
20
|
+
verdict: RedVerdict
|
|
21
|
+
failed: ReadonlyArray<string>
|
|
22
|
+
ran?: number
|
|
23
|
+
}
|
|
15
24
|
|
|
16
25
|
// The declaration a bug-fix Issue carries under its background heading, in the same slot as the
|
|
17
26
|
// behavior-change declaration (`behavior-change-lint.ts`). Read from the declaration, never inferred,
|
|
@@ -55,23 +64,53 @@ function ran_file_count(report: string): number {
|
|
|
55
64
|
return json_value.parse_with(report, REPORT_SCHEMA)?.testResults.length ?? 0
|
|
56
65
|
}
|
|
57
66
|
|
|
58
|
-
//
|
|
59
|
-
//
|
|
67
|
+
// The test files a run failed in, as `josh test:pinned` stores them beside a `red` verdict
|
|
68
|
+
// (joshuafolkken/kit#4790). Vitest names each by its absolute path, under the tree's own path or its real
|
|
69
|
+
// one — a macOS temporary directory sits behind `/var` → `/private/var` — so each is read relative to the
|
|
70
|
+
// first of `roots` it sits under. An unreadable report fails none.
|
|
71
|
+
const RESULT_SCHEMA = z.object({ name: z.string(), status: z.string() })
|
|
72
|
+
const RESULTS_SCHEMA = z.object({ testResults: z.array(RESULT_SCHEMA) })
|
|
73
|
+
const FAILED_STATUS = 'failed'
|
|
74
|
+
const PARENT_PREFIX = '..'
|
|
75
|
+
|
|
76
|
+
function is_inside(name: string): boolean {
|
|
77
|
+
return !name.startsWith(PARENT_PREFIX) && !node_path.isAbsolute(name)
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
function relative_in(roots: ReadonlyArray<string>, file: string): Array<string> {
|
|
81
|
+
const relatives = roots.map((root) => node_path.relative(root, file))
|
|
82
|
+
|
|
83
|
+
return relatives.filter((name) => is_inside(name)).slice(0, 1)
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
function failed_files(report: string, roots: ReadonlyArray<string>): Array<string> {
|
|
87
|
+
const results = json_value.parse_with(report, RESULTS_SCHEMA)?.testResults ?? []
|
|
88
|
+
|
|
89
|
+
return results
|
|
90
|
+
.filter((result) => result.status === FAILED_STATUS)
|
|
91
|
+
.flatMap((result) => relative_in(roots, result.name))
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// `no-test` when nothing ran and vitest passed with no tests; `stopped` when nothing ran and it failed
|
|
95
|
+
// anyway — its config could not load, so no test was ever asked (joshuafolkken/kit#5043). Otherwise a
|
|
96
|
+
// failing run is `red` — the test caught the pre-fix tree — and a passing one is `green`.
|
|
60
97
|
function verdict_for(test_count: number, is_failed: boolean): RedVerdict {
|
|
61
|
-
if (test_count === 0) return 'no-test'
|
|
98
|
+
if (test_count === 0) return is_failed ? 'stopped' : 'no-test'
|
|
62
99
|
|
|
63
100
|
return is_failed ? 'red' : 'green'
|
|
64
101
|
}
|
|
65
102
|
|
|
66
103
|
// Only `green` on a declared bug fix is refused. `no-test` is already `josh test:declared`'s refusal
|
|
67
|
-
// when a runtime file changed, a declared fix that touched only docs has nothing to reproduce,
|
|
68
|
-
// `
|
|
104
|
+
// when a runtime file changed, a declared fix that touched only docs has nothing to reproduce, a
|
|
105
|
+
// `stopped` run asked no test, so it is neither red evidence nor green, and a `test-only` fix runs the
|
|
106
|
+
// same code on the merge-base as on HEAD.
|
|
69
107
|
function is_refused(body: string, verdict: RedVerdict): boolean {
|
|
70
108
|
return verdict === 'green' && is_bug_fix(body)
|
|
71
109
|
}
|
|
72
110
|
|
|
73
111
|
const test_red_logic = {
|
|
74
112
|
BUG_DECLARATION_LINE,
|
|
113
|
+
failed_files,
|
|
75
114
|
is_bug_fix,
|
|
76
115
|
is_refused,
|
|
77
116
|
is_test_only,
|
|
@@ -80,5 +119,5 @@ const test_red_logic = {
|
|
|
80
119
|
verdict_for,
|
|
81
120
|
}
|
|
82
121
|
|
|
83
|
-
export type { RedVerdict }
|
|
122
|
+
export type { RedProbe, RedVerdict }
|
|
84
123
|
export { test_red_logic }
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
import { fileURLToPath } from 'node:url'
|
|
3
|
+
import { test_red } from './test-red'
|
|
4
|
+
|
|
5
|
+
// The `josh test:red` entry, kept apart from `test-red.ts` because `test-red-commit.ts` imports that
|
|
6
|
+
// one: a bundle is one file, so a main guard there would fire for every command that carries it
|
|
7
|
+
// (joshuafolkken/kit#4186).
|
|
8
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) {
|
|
9
|
+
const ARGV_OFFSET = 2
|
|
10
|
+
|
|
11
|
+
process.exitCode = await test_red.main(process.argv.slice(ARGV_OFFSET))
|
|
12
|
+
}
|
package/scripts/test/test-red.ts
CHANGED
|
@@ -1,27 +1,29 @@
|
|
|
1
1
|
import { existsSync } from 'node:fs'
|
|
2
|
-
import {
|
|
2
|
+
import { readFile, realpath, rm } from 'node:fs/promises'
|
|
3
3
|
import path from 'node:path'
|
|
4
|
-
import { fileURLToPath } from 'node:url'
|
|
5
4
|
import { base_tree, type BaseTree } from '#scripts/git/base-tree'
|
|
6
5
|
import { change_base } from '#scripts/git/change-base'
|
|
7
6
|
import { changed_paths } from '#scripts/git/changed-paths'
|
|
8
7
|
import { git_location_environment } from '#scripts/git/git-location-environment'
|
|
9
8
|
import { execa } from 'execa'
|
|
10
|
-
import { test_red_logic, type RedVerdict } from './test-red-logic'
|
|
9
|
+
import { test_red_logic, type RedProbe, type RedVerdict } from './test-red-logic'
|
|
10
|
+
import { vitest_cache_directory } from './vitest-cache-directory'
|
|
11
11
|
|
|
12
12
|
// `josh test:red` — run the added and changed Vitest files against the pre-fix tree and print `red`,
|
|
13
|
-
// `green`, `no-test` or `test-only`.
|
|
13
|
+
// `green`, `no-test`, `stopped` or `test-only`.
|
|
14
14
|
//
|
|
15
15
|
// **The pre-fix tree is a detached worktree at the merge-base, never the caller's checkout**
|
|
16
16
|
// (`base-tree.ts`). The tests are copied in from the working tree, so what runs is the new test
|
|
17
17
|
// against the old code.
|
|
18
18
|
|
|
19
|
-
const ARGV_OFFSET = 2
|
|
20
19
|
const TREE_PREFIX = 'josh-test-red-'
|
|
21
20
|
const REPORT_NAME = 'report.json'
|
|
21
|
+
// Beside the tree, so the run's dependency optimizer never rewrites the borrowed `node_modules/.vite`
|
|
22
|
+
// a gate beside it imports from (`vitest-cache-directory.ts`).
|
|
23
|
+
const CACHE_NAME = 'vite-cache'
|
|
22
24
|
const VITEST_BIN = path.join(base_tree.NODE_MODULES, '.bin', 'vitest')
|
|
23
25
|
const USAGE =
|
|
24
|
-
'Usage: josh test:red — prints red / green / no-test / test-only for the changed tests on the merge-base'
|
|
26
|
+
'Usage: josh test:red — prints red / green / no-test / stopped / test-only for the changed tests on the merge-base'
|
|
25
27
|
|
|
26
28
|
interface RedRun {
|
|
27
29
|
verdict: RedVerdict
|
|
@@ -33,22 +35,6 @@ function changed_tests(paths: ReadonlyArray<string>): Array<string> {
|
|
|
33
35
|
return test_red_logic.unit_test_files(paths).filter((file) => existsSync(file))
|
|
34
36
|
}
|
|
35
37
|
|
|
36
|
-
async function copy_one(tree: string, file: string): Promise<void> {
|
|
37
|
-
const target = path.join(tree, file)
|
|
38
|
-
|
|
39
|
-
await mkdir(path.dirname(target), { recursive: true })
|
|
40
|
-
await copyFile(file, target)
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
// Each file has its own target, and a recursive `mkdir` tolerates a sibling creating the same parent.
|
|
44
|
-
async function copy_in(tree: string, files: ReadonlyArray<string>): Promise<void> {
|
|
45
|
-
await Promise.all(
|
|
46
|
-
files.map(async (file) => {
|
|
47
|
-
await copy_one(tree, file)
|
|
48
|
-
}),
|
|
49
|
-
)
|
|
50
|
-
}
|
|
51
|
-
|
|
52
38
|
function reporter_arguments(report: string): Array<string> {
|
|
53
39
|
// The plain `--outputFile`, not `--outputFile.json`: a config that sets `test.outputFile` as a string
|
|
54
40
|
// wins over the keyed form, which would send the report into the tree and read every run `no-test`.
|
|
@@ -59,32 +45,47 @@ async function read_report(report: string): Promise<string> {
|
|
|
59
45
|
return existsSync(report) ? await readFile(report, 'utf8') : ''
|
|
60
46
|
}
|
|
61
47
|
|
|
62
|
-
// The verdict of one run
|
|
48
|
+
// The verdict of one run over `selection` — `run <files>`, or `related <file> --run` for
|
|
49
|
+
// `josh test:pinned`. `--passWithNoTests` keeps "the filter matched nothing" from reading as a
|
|
63
50
|
// failure, and the JSON report — written beside the tree, never into it — says whether anything ran at
|
|
64
51
|
// all, so a file the old config excludes is `no-test` rather than a `green` that refuses a correct fix.
|
|
65
|
-
// A test that ran and broke, or a file that could not load against the old code, makes it `red
|
|
66
|
-
|
|
52
|
+
// A test that ran and broke, or a file that could not load against the old code, makes it `red`, and
|
|
53
|
+
// the files it broke in come back beside the verdict. The report is removed first, so a run that writes
|
|
54
|
+
// none never reads the one before it.
|
|
55
|
+
async function probe_in(
|
|
67
56
|
{ parent, tree }: BaseTree,
|
|
68
|
-
|
|
69
|
-
): Promise<
|
|
57
|
+
selection: ReadonlyArray<string>,
|
|
58
|
+
): Promise<RedProbe> {
|
|
70
59
|
const report = path.join(parent, REPORT_NAME)
|
|
71
|
-
const vitest_args = [
|
|
60
|
+
const vitest_args = [...selection, '--passWithNoTests', ...reporter_arguments(report)]
|
|
61
|
+
|
|
62
|
+
await rm(report, { force: true })
|
|
72
63
|
const result = await execa(path.join(tree, VITEST_BIN), vitest_args, {
|
|
73
64
|
cwd: tree,
|
|
74
|
-
env:
|
|
65
|
+
env: {
|
|
66
|
+
...git_location_environment.location_free_environment(),
|
|
67
|
+
[vitest_cache_directory.CACHE_DIRECTORY_KEY]: path.join(parent, CACHE_NAME),
|
|
68
|
+
},
|
|
75
69
|
extendEnv: true,
|
|
76
70
|
reject: false,
|
|
77
71
|
})
|
|
78
|
-
const
|
|
72
|
+
const text = await read_report(report)
|
|
73
|
+
const ran = test_red_logic.ran_file_count(text)
|
|
79
74
|
|
|
80
|
-
return
|
|
75
|
+
return {
|
|
76
|
+
verdict: test_red_logic.verdict_for(ran, result.exitCode !== 0),
|
|
77
|
+
failed: test_red_logic.failed_files(text, [tree, await realpath(tree)]),
|
|
78
|
+
ran,
|
|
79
|
+
}
|
|
81
80
|
}
|
|
82
81
|
|
|
83
82
|
async function verdict_on(base: string, files: ReadonlyArray<string>): Promise<RedVerdict> {
|
|
84
83
|
return await base_tree.with_tree(TREE_PREFIX, base, async (pre_fix) => {
|
|
85
|
-
await copy_in(pre_fix.tree, files)
|
|
84
|
+
await base_tree.copy_in(pre_fix.tree, files)
|
|
85
|
+
|
|
86
|
+
const probe = await probe_in(pre_fix, ['run', ...files])
|
|
86
87
|
|
|
87
|
-
return
|
|
88
|
+
return probe.verdict
|
|
88
89
|
})
|
|
89
90
|
}
|
|
90
91
|
|
|
@@ -92,7 +93,7 @@ async function verdict_on(base: string, files: ReadonlyArray<string>): Promise<R
|
|
|
92
93
|
// `no-test` — there is no pre-fix tree to run against, and a guard fails open. A change whose every path
|
|
93
94
|
// is a test file is `test-only` without a run: the merge-base runs the same code as HEAD.
|
|
94
95
|
async function run(): Promise<RedRun> {
|
|
95
|
-
const base = await change_base.
|
|
96
|
+
const base = await change_base.resolved_through_merge()
|
|
96
97
|
const paths = await changed_paths.read_changed_paths(false)
|
|
97
98
|
const files = changed_tests(paths)
|
|
98
99
|
|
|
@@ -117,11 +118,12 @@ async function main(argv: ReadonlyArray<string>): Promise<number> {
|
|
|
117
118
|
return 0
|
|
118
119
|
}
|
|
119
120
|
|
|
120
|
-
|
|
121
|
-
|
|
121
|
+
// Whether the checkout has the Vitest `probe_in` runs; without it every run would read `no-test`.
|
|
122
|
+
function has_runner(): boolean {
|
|
123
|
+
return existsSync(VITEST_BIN)
|
|
122
124
|
}
|
|
123
125
|
|
|
124
|
-
const test_red = { run }
|
|
126
|
+
const test_red = { has_runner, main, probe_in, run }
|
|
125
127
|
|
|
126
128
|
export type { RedRun }
|
|
127
129
|
export { test_red }
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { core_budget } from '#scripts/gate/core-budget'
|
|
2
|
+
import { gate_plan } from '#scripts/gate/gate-plan'
|
|
3
|
+
import { test_pinned_reach } from './test-pinned-reach'
|
|
4
|
+
import { related_scope } from './test-related-scope'
|
|
5
|
+
|
|
6
|
+
// The cores a `josh test:related` vitest pass claims once its files are known (joshuafolkken/kit#5135):
|
|
7
|
+
// a narrowed pass by the test files its imports reach — not by its own files, one of which may reach
|
|
8
|
+
// hundreds — and the whole suite (`undefined`), or files no graph can be built for, by the full width
|
|
9
|
+
// a direct unit run holds.
|
|
10
|
+
async function claim_weight(files: ReadonlyArray<string> | undefined): Promise<number> {
|
|
11
|
+
const tests = files === undefined ? undefined : await test_pinned_reach.reached_test_count(files)
|
|
12
|
+
|
|
13
|
+
return tests === undefined ? gate_plan.direct_unit_weight() : gate_plan.scoped_unit_weight(tests)
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
// **Each vitest pass takes its claim here, not on the command entry**: the entry is reserved before
|
|
17
|
+
// the scope resolves, so it could only ever claim the whole width. `vitest_share` reads this claim
|
|
18
|
+
// back as the `--maxWorkers` bound. Under `josh gate` the gate's claim covers the run, so none is
|
|
19
|
+
// sized.
|
|
20
|
+
async function with_unit_claim(
|
|
21
|
+
files: ReadonlyArray<string> | undefined,
|
|
22
|
+
run: () => Promise<number>,
|
|
23
|
+
): Promise<number> {
|
|
24
|
+
if (core_budget.is_covered()) return await run()
|
|
25
|
+
|
|
26
|
+
const weight = await claim_weight(files)
|
|
27
|
+
|
|
28
|
+
return await core_budget.with_command_reservation(weight, run, {
|
|
29
|
+
memory_mb: gate_plan.unit_memory(weight),
|
|
30
|
+
command: related_scope.COMMAND_NAME,
|
|
31
|
+
is_unit: true,
|
|
32
|
+
})
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
const test_related_claim = { with_unit_claim }
|
|
36
|
+
|
|
37
|
+
export { test_related_claim }
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
import { fileURLToPath } from 'node:url'
|
|
3
|
+
import { changed_file_scope } from '#scripts/git/changed-file-scope'
|
|
4
|
+
import { run_ship_removed_rows } from '#scripts/run/ship/run-ship-removed-rows'
|
|
5
|
+
import { split_early_notice } from '#scripts/split/split-early-notice'
|
|
6
|
+
import { test_related } from './test-related'
|
|
7
|
+
|
|
8
|
+
// The `josh test:related` entry, kept apart from `test-related.ts` because `check-inputs.ts` imports
|
|
9
|
+
// that one: a bundle is one file, so a main guard there would fire for every command that carries it
|
|
10
|
+
// (joshuafolkken/kit#4186). A green run then shows the tests the change removed, the one place a run
|
|
11
|
+
// meets them before `josh ship` (joshuafolkken/kit#4563), and any run shows the split notice once per
|
|
12
|
+
// Issue when the diff has outgrown the guide (joshuafolkken/kit#4642).
|
|
13
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) {
|
|
14
|
+
const exit_code = await test_related.run_related_tests(
|
|
15
|
+
process.argv.slice(changed_file_scope.ARGV_START),
|
|
16
|
+
)
|
|
17
|
+
|
|
18
|
+
if (exit_code === 0) await run_ship_removed_rows.surface()
|
|
19
|
+
await split_early_notice.surface()
|
|
20
|
+
process.exitCode = exit_code
|
|
21
|
+
}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import type { MovedParts } from '#scripts/gate/moved-paths'
|
|
2
|
+
import { test_declared_logic } from './test-declared-logic'
|
|
3
|
+
import type { ReadMap } from './test-read-map'
|
|
4
|
+
import { related_scope, type ScopeRequest } from './test-related-scope'
|
|
5
|
+
import { test_related_synced, type SyncedSplit } from './test-related-synced'
|
|
6
|
+
import { whole_suite_files } from './whole-suite-files'
|
|
7
|
+
|
|
8
|
+
// How `josh test:related` reads what moved since its last green run (`since-green.ts`) into the change
|
|
9
|
+
// it narrows by — split out of `test-related.ts`, which runs the reading.
|
|
10
|
+
|
|
11
|
+
// The change a narrowing reads, and the map it reads it against. `is_unmoved` is the since-green
|
|
12
|
+
// reading's positive fact that nothing moved since this command was last green on this checkout.
|
|
13
|
+
// `synced` is the part of the change a main sync brought in, kept for the run's ledger record, and
|
|
14
|
+
// `since_map` the part the change since the map's tree joined to what this change moved. `branch` is
|
|
15
|
+
// this branch's own change from its merge base, where it was read.
|
|
16
|
+
type ChangeReading = Pick<ScopeRequest, 'changed' | 'map' | 'since_map'> & {
|
|
17
|
+
is_unmoved?: true
|
|
18
|
+
synced?: ReadonlyArray<string>
|
|
19
|
+
branch?: ReadonlyArray<string> | undefined
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
function is_whole_suite(file: string): boolean {
|
|
23
|
+
return whole_suite_files.WHOLE_SUITE_FILES.has(file)
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
// **A non-code file a main sync brought in is not this branch's change** (joshuafolkken/kit#4572), so it
|
|
27
|
+
// joins `since_map`: it neither adds the tests reading it nor sends the run to the whole suite — main's
|
|
28
|
+
// CI verified it. So does a synced file every test depends on, which the split cannot narrow
|
|
29
|
+
// (joshuafolkken/kit#4993): main's CI ran the whole suite on it, and this branch's own tests run on it
|
|
30
|
+
// anyway. Any other synced module is `test-related-synced.ts`'s: only this branch's change runs for it,
|
|
31
|
+
// where the two meet. A branch change git cannot read marks nothing.
|
|
32
|
+
function synced_data(
|
|
33
|
+
synced: ReadonlyArray<string>,
|
|
34
|
+
branch: ReadonlyArray<string> | undefined,
|
|
35
|
+
): ReadonlyArray<string> {
|
|
36
|
+
const data = synced.filter((file) => !related_scope.is_relatable(file) || is_whole_suite(file))
|
|
37
|
+
|
|
38
|
+
return data.filter((file) => !(branch ?? data).includes(file))
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// **The branch's own test files stay out of `since_map`** (joshuafolkken/kit#4393), so each runs again
|
|
42
|
+
// on every bare run after a green one — the map holds no entry for a read one started since its tree.
|
|
43
|
+
// Only main's and another lane's test files are left to CI (joshuafolkken/kit#4896). A branch change git
|
|
44
|
+
// cannot read keeps every test file.
|
|
45
|
+
function without_own_tests(
|
|
46
|
+
since_map: ReadonlyArray<string>,
|
|
47
|
+
branch: ReadonlyArray<string> | undefined,
|
|
48
|
+
): ReadonlyArray<string> {
|
|
49
|
+
return since_map.filter(
|
|
50
|
+
(file) => !test_declared_logic.is_test_file(file) || branch?.includes(file) === false,
|
|
51
|
+
)
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// The moved files handed on as explicit arguments, the synced modules the split left out taken away.
|
|
55
|
+
// Where one meets this branch's change, the change runs in its place (`test-related-synced.ts`) — named
|
|
56
|
+
// even when only the sync moved, since a green branch side would otherwise run nothing.
|
|
57
|
+
function narrowed_moved(
|
|
58
|
+
moved: ReadonlyArray<string>,
|
|
59
|
+
split: SyncedSplit,
|
|
60
|
+
branch: ReadonlyArray<string> | undefined,
|
|
61
|
+
map: ReadMap | undefined,
|
|
62
|
+
): ReadonlyArray<string> {
|
|
63
|
+
const kept = moved.filter((file) => !split.left.includes(file))
|
|
64
|
+
const own = split.shared.length === 0 ? [] : test_related_synced.own_of(branch, map)
|
|
65
|
+
|
|
66
|
+
return [...new Set([...kept, ...(own ?? [])])]
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// The reading's `since_map`: what this branch did not change. The synced modules left out join it and
|
|
70
|
+
// the change, so they settle as reaching no test rather than leaving an empty selection that runs the
|
|
71
|
+
// whole suite.
|
|
72
|
+
function moved_reading(
|
|
73
|
+
change: ChangeReading,
|
|
74
|
+
parts: MovedParts,
|
|
75
|
+
branch: ReadonlyArray<string> | undefined,
|
|
76
|
+
split: SyncedSplit,
|
|
77
|
+
): ChangeReading {
|
|
78
|
+
const since_map = [
|
|
79
|
+
...without_own_tests(change.since_map ?? [], branch),
|
|
80
|
+
...synced_data(parts.synced, branch),
|
|
81
|
+
...split.left,
|
|
82
|
+
]
|
|
83
|
+
const changed = [...new Set([...(change.changed ?? []), ...split.left])]
|
|
84
|
+
|
|
85
|
+
return { ...change, changed, since_map: [...new Set(since_map)], synced: parts.synced, branch }
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
const test_related_moved = { is_whole_suite, moved_reading, narrowed_moved }
|
|
89
|
+
|
|
90
|
+
export type { ChangeReading }
|
|
91
|
+
export { test_related_moved }
|