@joshuafolkken/kit 1.1784.0 → 1.2116.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/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/workflow-commands/SKILL.md +6 -6
- package/.claude/skills/workflow-commands/background-commands.md +8 -5
- package/.claude/skills/workflow-commands/backlogrun-child.md +3 -1
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +1 -1
- package/.claude/skills/workflow-commands/backlogrun-park.md +5 -2
- package/.claude/skills/workflow-commands/backlogrun-progress.md +2 -3
- package/.claude/skills/workflow-commands/backlogrun-recovery.md +1 -1
- package/.claude/skills/workflow-commands/backlogrun-steps.md +3 -2
- package/.claude/skills/workflow-commands/backlogrun.md +1 -1
- package/.claude/skills/workflow-commands/chain-rule.md +41 -32
- package/.claude/skills/workflow-commands/delegation.md +6 -6
- package/.claude/skills/workflow-commands/entry-sequence.md +2 -2
- package/.claude/skills/workflow-commands/followup.md +7 -5
- package/.claude/skills/workflow-commands/fullrun-steps.md +6 -6
- package/.claude/skills/workflow-commands/fullrun.md +1 -1
- package/.claude/skills/workflow-commands/issue-comments.md +9 -4
- package/.claude/skills/workflow-commands/issue-fold-existing.md +2 -1
- package/.claude/skills/workflow-commands/kickoff.md +2 -2
- package/.claude/skills/workflow-commands/observation-filing.md +1 -1
- package/.claude/skills/workflow-commands/observation-ledger.md +6 -4
- package/.claude/skills/workflow-commands/pre-gate-cut.md +9 -7
- package/.claude/skills/workflow-commands/prerequisite.md +3 -2
- package/.claude/skills/workflow-commands/retrospective.md +2 -2
- package/.claude/skills/workflow-commands/split-assessment.md +7 -5
- package/.codex/hooks.json +5 -5
- package/.github/actions/setup-pnpm/action.yml +9 -16
- package/.github/dependabot.yml +16 -0
- package/.github/workflows/auto-tag.yml +45 -0
- package/.github/workflows/ci.yml +155 -15
- package/.github/workflows/dependabot-auto-merge.yml +63 -4
- package/.github/workflows/production.yml +8 -0
- package/.github/workflows/publish.yml +60 -45
- package/.vscode/settings.json +19 -0
- package/CLAUDE.md +5 -12
- package/SECURITY.md +2 -2
- package/dist/CLAUDE.md +5 -12
- package/dist/commands/document-read-cli.js +2 -1
- package/dist/commands/document-section-main.js +2 -1
- package/dist/commands/read-set-cli.js +194 -134
- package/dist/commands/run-prep-main.js +9694 -10173
- package/dist/commands/run-step-cli.js +22138 -18285
- package/dist/hooks/audit-provision.js +23 -5
- package/dist/hooks/chunk-3GKE653K.js +6204 -0
- package/dist/hooks/chunk-45CJJOO7.js +1243 -0
- package/dist/hooks/{chunk-CWMBGKYW.js → chunk-5PM2JRGV.js} +2153 -856
- package/dist/hooks/{chunk-WR2KQAYZ.js → chunk-7SIUNQXK.js} +1207 -1470
- package/dist/hooks/{chunk-O2YBIDSI.js → chunk-CQD4LJE6.js} +1682 -1130
- package/dist/hooks/{chunk-VWWCFGWK.js → chunk-OPSRGWFU.js} +1 -1
- package/dist/hooks/{chunk-XGBNSWEI.js → chunk-UJ3FPMMM.js} +132 -49
- package/dist/hooks/chunk-VVNYJWEI.js +30 -0
- package/dist/hooks/chunk-Z6DQJKH3.js +2806 -0
- package/dist/hooks/codex-hook-adapter.js +8 -8
- package/dist/hooks/format-edited.js +4 -5
- package/dist/hooks/inputs.json +386 -360
- package/dist/hooks/pretool-guard.js +7 -6
- package/dist/hooks/session-lang.js +101 -258
- package/dist/hooks/stop-guard.js +1744 -2576
- package/dist/josh.js +7133 -6368
- package/dist/version/index.js +161 -1
- package/eslint/rules/comment-why-only.js +108 -0
- package/package.json +16 -9
- package/prompts/coding-standards.md +1 -1
- package/prompts/collaboration-workflow/file-edits.md +14 -11
- package/prompts/collaboration-workflow/issue-citation.md +0 -4
- package/prompts/collaboration-workflow/issue-template.md +40 -21
- package/prompts/collaboration-workflow/lane-instructions.md +3 -1
- package/prompts/collaboration-workflow/measurement.md +8 -1
- package/prompts/collaboration-workflow/operating-rules.md +11 -2
- package/prompts/collaboration-workflow/output-bounds.md +6 -2
- package/prompts/collaboration-workflow/plan-comment.md +1 -1
- package/prompts/collaboration-workflow/principles.md +9 -0
- package/prompts/collaboration-workflow/residency.md +3 -2
- package/prompts/collaboration-workflow/rule-delivery.md +13 -1
- package/prompts/collaboration-workflow/upstream-interrupt.md +2 -2
- package/prompts/collaboration-workflow/wip-cap.md +3 -1
- package/prompts/review-rubric.md +8 -0
- package/prompts/review.md +31 -22
- package/prompts/testing-guide.md +1 -0
- package/scripts/agent/agent-argv.ts +14 -16
- 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-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 +20 -9
- package/scripts/backlog/backlog-defect-priority.ts +1 -1
- package/scripts/backlog/backlog-drive-cli.ts +6 -1
- package/scripts/backlog/backlog-drive-hold.ts +3 -3
- package/scripts/backlog/backlog-drive-idle.ts +10 -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-named-offer.ts +73 -30
- package/scripts/backlog/backlog-drive-named.ts +28 -7
- package/scripts/backlog/backlog-drive-paused.ts +5 -4
- package/scripts/backlog/backlog-drive-restore.ts +11 -3
- package/scripts/backlog/backlog-drive.ts +21 -60
- package/scripts/backlog/backlog-gate-scope.ts +61 -0
- package/scripts/backlog/backlog-measure-close.ts +112 -0
- package/scripts/backlog/backlog-next.ts +39 -49
- package/scripts/backlog/backlog-occupied.ts +2 -2
- package/scripts/backlog/backlog-overlap.ts +42 -8
- 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 +19 -6
- package/scripts/backlog/backlog-pool.ts +50 -12
- package/scripts/backlog/backlog-rank.ts +60 -13
- package/scripts/backlog/backlog-stalled-detect.ts +2 -1
- package/scripts/backlog/backlog-waves.ts +17 -2
- package/scripts/backlog/backlogrun-launch.ts +7 -4
- package/scripts/cost-runtime/context-cut-payback.ts +27 -25
- package/scripts/cost-runtime/cost-cli.ts +37 -16
- package/scripts/cost-runtime/cost-pricing.ts +9 -0
- package/scripts/cost-runtime/cost-verdict.ts +4 -1
- package/scripts/delegation/delegation-policy.ts +2 -2
- package/scripts/delegation/duplicate-read-guard.ts +1 -0
- package/scripts/delegation/investigation-guard.ts +14 -2
- package/scripts/delegation/investigation-reads.ts +45 -23
- package/scripts/dependabot/dependabot-cooldown.ts +3 -2
- package/scripts/discovery/repo-party.ts +80 -20
- package/scripts/discovery/session-owner-pin.ts +51 -0
- 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 +17 -7
- package/scripts/document/document-checks.ts +20 -0
- package/scripts/document/document-ratchet-check.ts +101 -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-cli-argv.ts +2 -2
- package/scripts/epic/epic-fetch.ts +4 -2
- package/scripts/epic/epic-graph.ts +7 -2
- package/scripts/epic/epic-issue.ts +3 -1
- package/scripts/epic/epic-rank.ts +5 -0
- package/scripts/exports/unused-members-check.ts +62 -0
- package/scripts/exports/unused-members-cli.ts +6 -51
- 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 +13 -10
- 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/git-followup-finish.ts +43 -11
- package/scripts/followup/git-followup-pending.ts +3 -3
- package/scripts/followup/git-followup-stages.ts +41 -11
- package/scripts/followup/git-pr-followup-checks.ts +55 -16
- package/scripts/followup/git-pr-followup-wrapup.ts +24 -5
- package/scripts/followup/git-pr-followup.ts +62 -27
- 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 +2 -2
- package/scripts/gate/busy-average.ts +34 -2
- 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/command-memory.ts +1 -1
- package/scripts/gate/core-admission.ts +24 -6
- package/scripts/gate/core-budget-timing.ts +20 -6
- package/scripts/gate/core-budget.ts +40 -11
- package/scripts/gate/core-wait-record.ts +3 -2
- package/scripts/gate/core-wait.ts +25 -2
- package/scripts/gate/core-weights.ts +15 -7
- package/scripts/gate/gate-labels.ts +46 -0
- package/scripts/gate/gate-ledger.ts +14 -6
- package/scripts/gate/gate-plan.ts +103 -58
- package/scripts/gate/gate-report.ts +9 -7
- package/scripts/gate/gate-run-steps.ts +26 -3
- package/scripts/gate/gate-skip.ts +45 -6
- package/scripts/gate/gate-static-group.ts +60 -0
- package/scripts/gate/gate-steps.ts +2 -1
- package/scripts/gate/gate-tree.ts +4 -2
- package/scripts/gate/hook-gate-reuse.ts +19 -2
- package/scripts/gate/metrics-totals.ts +59 -0
- package/scripts/gate/scoped-green.ts +68 -15
- package/scripts/gate/since-green.ts +14 -6
- package/scripts/gate/structural-checks.ts +96 -0
- package/scripts/gate/verification-gate.ts +51 -16
- package/scripts/gate/verification-inputs.ts +21 -6
- package/scripts/gate/verification-tail.ts +52 -0
- package/scripts/gh/gh-author-association.ts +23 -2
- package/scripts/gh/git-ai-review-scan.ts +1 -1
- package/scripts/gh/git-gh-api-path.ts +12 -3
- package/scripts/gh/git-gh-comments-unreadable.ts +36 -0
- package/scripts/gh/git-gh-exec.ts +32 -2
- package/scripts/gh/git-gh-issue-read.ts +4 -2
- package/scripts/gh/git-gh-issue-rest.ts +1 -0
- package/scripts/gh/git-gh-issue-write.ts +8 -2
- package/scripts/gh/git-gh-issue.ts +12 -5
- package/scripts/gh/git-gh-pr-auto-merge.ts +13 -6
- 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 +3 -1
- package/scripts/gh/git-gh-pr-snapshot.ts +22 -7
- package/scripts/gh/git-gh-pr-too-large.ts +20 -0
- package/scripts/gh/git-gh-pr.ts +21 -7
- 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 +3 -0
- package/scripts/gh/git-pr-checks.ts +5 -5
- package/scripts/git/base-tree.ts +30 -0
- package/scripts/git/change-base.ts +4 -10
- package/scripts/git/changed-paths-sync.ts +63 -0
- package/scripts/git/changed-paths.ts +16 -1
- package/scripts/git/git-common-directory.ts +11 -1
- package/scripts/git/git-diff-reads.ts +66 -20
- package/scripts/git/git-error.ts +9 -2
- package/scripts/git/git-schemas.ts +13 -0
- 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-regenerate.ts +59 -25
- package/scripts/git/main-merge.ts +53 -5
- package/scripts/git/no-base-checkout.ts +127 -0
- package/scripts/git/stash/git-stash.ts +11 -2
- package/scripts/git/stash/stash-push-cli.ts +10 -0
- package/scripts/hooks/batch-guard.ts +40 -21
- package/scripts/hooks/edited-cspell.ts +37 -11
- package/scripts/hooks/format-edited-file.ts +22 -2
- 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 +14 -1
- package/scripts/hooks/pre-push-related-switch.ts +10 -0
- package/scripts/hooks/pre-push-unit.ts +76 -10
- package/scripts/hooks/pretool-guard.ts +2 -0
- package/scripts/hooks/reserved-run.ts +14 -1
- package/scripts/hooks/run-hook.sh +23 -8
- package/scripts/hooks/step-zero-notice.ts +6 -1
- package/scripts/hooks/stop-actions.ts +3 -15
- package/scripts/hooks/stop-guard.ts +7 -6
- package/scripts/init/distributed-paths.ts +1 -0
- package/scripts/init/hook-command-rewrite.ts +5 -1
- package/scripts/init/hook-launch.ts +4 -2
- package/scripts/issue/aggregation-split.ts +52 -0
- package/scripts/issue/defect-origin-line.ts +19 -1
- package/scripts/issue/defect-rate-cli.ts +5 -102
- package/scripts/issue/defect-report.ts +4 -4
- package/scripts/issue/effect-audit-cli.ts +178 -0
- package/scripts/issue/effect-audit.ts +185 -0
- package/scripts/issue/expected-effect-lint.ts +64 -9
- package/scripts/issue/git-next-issues.ts +5 -0
- package/scripts/issue/issue-body-or-comment.ts +38 -4
- package/scripts/issue/issue-cite-cli.ts +1 -3
- package/scripts/issue/issue-classification.ts +1 -0
- package/scripts/issue/issue-closing-pr.ts +8 -1
- package/scripts/issue/issue-evidence-exit.ts +4 -2
- package/scripts/issue/issue-file-cap.ts +58 -0
- package/scripts/issue/issue-file-cli.ts +111 -38
- 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 +43 -6
- package/scripts/issue/issue-labels.ts +19 -2
- package/scripts/issue/issue-lint-cli.ts +27 -2
- package/scripts/issue/issue-measured-cli.ts +13 -35
- package/scripts/issue/issue-measured-close.ts +58 -0
- package/scripts/issue/issue-not-before-label.ts +2 -2
- package/scripts/issue/issue-not-before.ts +4 -1
- package/scripts/issue/issue-priority-cli.ts +60 -0
- package/scripts/issue/issue-priority-raise.ts +55 -0
- package/scripts/issue/issue-priority.ts +174 -43
- package/scripts/issue/issue-rank.ts +21 -4
- package/scripts/issue/issue-read-cli.ts +32 -6
- package/scripts/issue/issue-read.ts +37 -12
- package/scripts/issue/issue-sample-gate.ts +95 -74
- 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 +12 -11
- package/scripts/issue/issue-search.ts +124 -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 +31 -1
- package/scripts/issue/issue-watch-hook.ts +11 -2
- package/scripts/issue/issue-watch.ts +55 -12
- package/scripts/issue/markdown-section.ts +1 -0
- package/scripts/issue/measure-declaration.ts +121 -0
- package/scripts/issue/measure-rerun-cli.ts +7 -70
- package/scripts/issue/plan-consumers-section.ts +22 -1
- 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/command-usage.ts +3 -2
- package/scripts/josh/durable-state-migrate.ts +105 -0
- package/scripts/josh/durable-state.ts +112 -0
- package/scripts/josh/josh-aliases.ts +95 -0
- package/scripts/josh/josh-command-map.ts +1 -82
- package/scripts/josh/josh-commands-agent-hooks.ts +6 -6
- package/scripts/josh/josh-commands-ai.ts +5 -5
- package/scripts/josh/josh-commands-development.ts +59 -58
- package/scripts/josh/josh-commands-issue-write.ts +23 -4
- package/scripts/josh/josh-commands-issue.ts +32 -0
- package/scripts/josh/josh-commands-lane.ts +87 -4
- package/scripts/josh/josh-commands-lint.ts +16 -3
- package/scripts/josh/josh-commands-maintenance.ts +15 -0
- package/scripts/josh/josh-commands-review.ts +41 -6
- package/scripts/josh/josh-commands-ship.ts +56 -8
- package/scripts/josh/josh-commands-test-check.ts +80 -0
- package/scripts/josh/josh-commands-workflow.ts +1 -1
- package/scripts/josh/josh-environment-file.ts +43 -3
- package/scripts/josh/josh-in-process.ts +2 -2
- package/scripts/josh/josh-logic.ts +5 -3
- package/scripts/josh/josh-run.ts +19 -1
- package/scripts/josh/run-record-path.ts +15 -0
- package/scripts/josh/stamp-file.ts +11 -2
- package/scripts/lane/lane-adopt-cli.ts +98 -0
- package/scripts/lane/lane-adopt.ts +208 -0
- package/scripts/lane/lane-await.ts +5 -8
- 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-check-stats.ts +29 -8
- package/scripts/lane/lane-child-invocation.ts +9 -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-close.ts +8 -3
- package/scripts/lane/lane-dispatch-log.ts +3 -3
- package/scripts/lane/lane-dispatch.ts +2 -2
- package/scripts/lane/lane-gap-stats.ts +7 -6
- package/scripts/lane/lane-guard-policy.ts +7 -1
- package/scripts/lane/lane-implement-stats.ts +207 -0
- package/scripts/lane/lane-implement-subagents.ts +90 -0
- package/scripts/lane/lane-investigation-switch.ts +16 -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 +119 -36
- package/scripts/lane/lane-ledger-write.ts +257 -0
- package/scripts/lane/lane-ledger.ts +31 -177
- package/scripts/lane/lane-load.ts +1 -1
- package/scripts/lane/lane-measure-cli.ts +176 -59
- package/scripts/lane/lane-net-read.ts +44 -0
- package/scripts/lane/lane-net-time.ts +212 -0
- package/scripts/lane/lane-open.ts +16 -7
- 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-paths.ts +24 -1
- package/scripts/lane/lane-pause-cli.ts +4 -1
- 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-registry.ts +14 -1
- package/scripts/lane/lane-relaunch.ts +1 -1
- package/scripts/lane/lane-round-one-stats.ts +51 -0
- package/scripts/lane/lane-sampler.ts +23 -4
- package/scripts/lane/lane-session-action.ts +93 -18
- package/scripts/lane/lane-session-broker.ts +49 -21
- 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-spent.ts +1 -1
- package/scripts/lane/lane-split-stats.ts +28 -0
- package/scripts/lane/lane-stage-stats.ts +13 -1
- package/scripts/lane/lane-state.ts +41 -9
- package/scripts/lane/lane-stats-tables.ts +58 -0
- package/scripts/lane/lane-stats.ts +21 -5
- package/scripts/lane/lane-stop-stats.ts +51 -19
- package/scripts/lane/lane-tail-stats.ts +32 -0
- package/scripts/lane/lane-transcript-calls.ts +67 -10
- package/scripts/lane/lane-transcript-stats.ts +44 -12
- package/scripts/lane/lane-value-cell.ts +72 -0
- package/scripts/lane/lane-value.ts +118 -0
- package/scripts/lane/lane-withdraw-closed.ts +124 -0
- package/scripts/lane/lane-withdraw.ts +108 -31
- 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/lib/poll.ts +38 -9
- package/scripts/lib/settled-together.ts +10 -0
- package/scripts/lib/shell-quote.ts +21 -0
- package/scripts/lib/token-shape.ts +111 -0
- package/scripts/lint/eslint-daemon-sources.ts +79 -0
- package/scripts/lint/eslint-daemon.ts +45 -6
- package/scripts/lint/eslint-warm-cli.ts +7 -0
- package/scripts/lint/eslint-warm.ts +66 -0
- package/scripts/lint/import-graph.ts +141 -11
- package/scripts/lint/lint-gate-scope.ts +2 -2
- package/scripts/lint/lint-parallel.ts +54 -6
- package/scripts/lint/lint-related.ts +154 -33
- 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/telegram-notify.ts +12 -3
- package/scripts/observations/observation-record.ts +42 -16
- package/scripts/observations/observations-flush.ts +32 -9
- package/scripts/overrides/overrides-check.ts +9 -1
- package/scripts/release/release-approval-prune.ts +7 -1
- package/scripts/repo/required-checks-logic.ts +4 -1
- package/scripts/repo/ruleset-check.ts +4 -3
- package/scripts/report/markdown-shape.ts +28 -0
- package/scripts/report/report-format-reference.ts +15 -1
- package/scripts/report/report-labels.ts +12 -1
- package/scripts/report/report-lint-child-summary.ts +94 -0
- package/scripts/report/report-lint-cli.ts +26 -7
- package/scripts/report/report-lint.ts +2 -20
- package/scripts/review/prose-stale-cli.ts +88 -0
- package/scripts/review/prose-stale-scan.ts +152 -0
- package/scripts/review/review-attest.ts +73 -23
- package/scripts/review/review-brief-cli.ts +68 -19
- package/scripts/review/review-brief-paths.ts +22 -0
- package/scripts/review/review-brief.ts +14 -7
- package/scripts/review/review-comment-carry.ts +47 -0
- package/scripts/review/review-comment-round.ts +85 -22
- package/scripts/review/review-finding-ledger.ts +109 -7
- package/scripts/review/review-finding-text.ts +43 -0
- package/scripts/review/review-interaction.ts +11 -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 +4 -2
- package/scripts/review/review-record-cli.ts +177 -54
- 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-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-closure.ts +62 -0
- package/scripts/review/review-round-reuse.ts +106 -0
- package/scripts/review/review-round2-cli.ts +91 -29
- package/scripts/review/review-round2-skip-comment.ts +55 -0
- package/scripts/review/review-round2.ts +24 -8
- package/scripts/review/review-stamps.ts +7 -3
- package/scripts/review/review-stop-log.ts +20 -6
- package/scripts/review/review-stops-cli.ts +2 -1
- package/scripts/review/review-submit-cli.ts +101 -0
- package/scripts/rules/agent-model.ts +1 -1
- package/scripts/rules/bash-triggers.ts +3 -3
- package/scripts/rules/concise-reply.ts +88 -0
- package/scripts/rules/credential-body.ts +77 -0
- package/scripts/rules/decision-oracle.ts +1 -1
- package/scripts/rules/delivered-rules.ts +36 -17
- package/scripts/rules/destructive-command.ts +3 -11
- package/scripts/rules/direct-issue-comment.ts +34 -12
- package/scripts/rules/direct-issue-read.ts +191 -0
- package/scripts/rules/direct-pr-create.ts +4 -24
- package/scripts/rules/early-heartbeat.ts +2 -0
- package/scripts/rules/edit-tool.ts +27 -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-force.ts +2 -2
- package/scripts/rules/guard-remedy.ts +14 -5
- package/scripts/rules/implementation-cut.ts +61 -28
- package/scripts/rules/investigator-foreground.ts +231 -0
- package/scripts/rules/issue-citation.ts +15 -60
- package/scripts/rules/issue-comments.ts +9 -4
- package/scripts/rules/josh-git-bare.ts +1 -1
- package/scripts/rules/lane-background.ts +41 -13
- package/scripts/rules/lane-direct-tool.ts +107 -9
- package/scripts/rules/lane-interactive-ask.ts +4 -1
- package/scripts/rules/lane-park.ts +4 -2
- package/scripts/rules/lane-spilled-read.ts +90 -0
- package/scripts/rules/lane-split-park.ts +1 -1
- package/scripts/rules/lane-switch-main.ts +4 -4
- package/scripts/rules/last-prompt.ts +20 -47
- package/scripts/rules/oracle-consulted.ts +1 -1
- package/scripts/rules/permission-guards.ts +5 -1
- package/scripts/rules/piped-verification-shapes.ts +110 -0
- package/scripts/rules/piped-verification.ts +67 -17
- package/scripts/rules/poll-loop.ts +72 -9
- package/scripts/rules/pr-merge.ts +5 -5
- package/scripts/rules/pre-gate-cut.ts +3 -3
- package/scripts/rules/protected-files.ts +88 -24
- 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 +5 -15
- package/scripts/rules/rule-value-cache.ts +53 -5
- package/scripts/rules/rule-value-candidates.ts +84 -0
- package/scripts/rules/rule-value-cli.ts +59 -11
- package/scripts/rules/rule-value.ts +17 -4
- package/scripts/rules/run-tail-rule.ts +1 -1
- package/scripts/rules/sed-in-place.ts +196 -0
- package/scripts/rules/shell-segments.ts +10 -2
- package/scripts/rules/stop-rule-rows.ts +1 -13
- package/scripts/rules/stop-rules.ts +33 -58
- package/scripts/rules/test-declared-commit.ts +1 -1
- package/scripts/rules/third-party-write.ts +110 -23
- package/scripts/rules/timed-rerun.ts +1 -1
- package/scripts/rules/turn-filings.ts +90 -0
- package/scripts/rules/worktree-guard.ts +22 -7
- package/scripts/run/board/run-board-ending-reason.ts +6 -2
- package/scripts/run/board/run-board-fit.ts +24 -1
- package/scripts/run/board/run-board-found.ts +134 -0
- package/scripts/run/board/run-board-header.ts +8 -0
- package/scripts/run/board/run-board-labels.ts +11 -1
- package/scripts/run/board/run-board-lane-time.ts +1 -0
- package/scripts/run/board/run-board-link.ts +15 -2
- package/scripts/run/board/run-board-notes.ts +7 -1
- package/scripts/run/board/run-board-operation.ts +4 -2
- package/scripts/run/board/run-board-phase.ts +2 -5
- package/scripts/run/board/run-board-plan.ts +1 -1
- package/scripts/run/board/run-board-read.ts +46 -1
- package/scripts/run/board/run-board-reason.ts +20 -8
- package/scripts/run/board/run-board-render-checks.ts +3 -2
- package/scripts/run/board/run-board-render-drawn.ts +11 -0
- package/scripts/run/board/run-board-render-found.ts +157 -0
- package/scripts/run/board/run-board-render-lead.ts +9 -0
- package/scripts/run/board/run-board-render-legend.ts +19 -0
- package/scripts/run/board/run-board-render-tail.ts +1 -1
- package/scripts/run/board/run-board-render.ts +82 -18
- package/scripts/run/board/run-board-spin.ts +1 -3
- package/scripts/run/board/run-board-status.ts +2 -0
- package/scripts/run/board/run-board-tick.ts +39 -10
- package/scripts/run/carry/run-carry-ended.ts +3 -2
- package/scripts/run/carry/run-carry.ts +3 -2
- 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 +52 -8
- 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-filed.ts +9 -3
- package/scripts/run/event/run-event-overrun.ts +197 -0
- package/scripts/run/event/run-event-render.ts +4 -0
- package/scripts/run/event/run-event-stream.ts +25 -3
- package/scripts/run/hold/run-stop-notify.ts +3 -8
- package/scripts/run/merge/run-merge-cap.ts +57 -0
- package/scripts/run/merge/run-merge-cli.ts +66 -23
- package/scripts/run/merge/run-merge-outcome.ts +2 -0
- package/scripts/run/merge/run-merge-ship.ts +13 -3
- package/scripts/run/merge/run-merge-signals.ts +40 -23
- package/scripts/run/merge/run-merge-steps.ts +56 -36
- 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 +41 -14
- 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 +26 -6
- package/scripts/run/run-parent-cut-hook.ts +3 -4
- package/scripts/run/run-prep.ts +1 -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 +5 -2
- package/scripts/run/ship/run-ship-args.ts +19 -0
- package/scripts/run/ship/run-ship-brokered-review.ts +106 -0
- package/scripts/run/ship/run-ship-cli.ts +131 -39
- package/scripts/run/ship/run-ship-conflict-probe.ts +59 -0
- package/scripts/run/ship/run-ship-detach.ts +10 -4
- package/scripts/run/ship/run-ship-handover.ts +106 -0
- package/scripts/run/ship/run-ship-infra-retry.ts +16 -1
- package/scripts/run/ship/run-ship-lap.ts +63 -0
- package/scripts/run/ship/run-ship-next.ts +27 -26
- package/scripts/run/ship/run-ship-overlap.ts +8 -3
- package/scripts/run/ship/run-ship-place.ts +9 -2
- 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 +7 -8
- package/scripts/run/ship/run-ship-pre-detach.ts +77 -23
- package/scripts/run/ship/run-ship-preflight.ts +16 -4
- package/scripts/run/ship/run-ship-probe.ts +23 -9
- package/scripts/run/ship/run-ship-relaunch-cap.ts +43 -7
- package/scripts/run/ship/run-ship-relaunch.ts +51 -0
- package/scripts/run/ship/run-ship-return.ts +103 -29
- package/scripts/run/ship/run-ship-review-reason.ts +24 -0
- package/scripts/run/ship/run-ship-review-steps.ts +230 -59
- package/scripts/run/ship/run-ship-review.ts +171 -51
- package/scripts/run/ship/run-ship-reviewer.ts +138 -42
- package/scripts/run/ship/run-ship-scoped.ts +39 -10
- package/scripts/run/ship/run-ship-stage.ts +49 -13
- package/scripts/run/ship/run-ship-steps.ts +24 -4
- package/scripts/run/ship/run-ship-stop-cause.ts +43 -2
- package/scripts/run/ship/run-ship-stop-context.ts +50 -13
- package/scripts/run/ship/run-ship-sync.ts +171 -30
- 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 +16 -2
- package/scripts/run/wake/run-wake-caffeinate.ts +48 -0
- package/scripts/run/wake/run-wake-cli.ts +6 -113
- package/scripts/run/wake/run-wake-code.ts +53 -11
- package/scripts/run/wake/run-wake-driver.ts +5 -3
- package/scripts/run/wake/run-wake-finish.ts +137 -0
- package/scripts/run/wake/run-wake-loop.ts +5 -3
- package/scripts/run/wake/run-wake-ports.ts +11 -3
- package/scripts/run/wake/run-wake-session.ts +2 -0
- package/scripts/run/wake/run-wake.ts +3 -2
- package/scripts/safe-chain/ci-installer-pin.ts +49 -8
- package/scripts/safe-chain/project-config.ts +3 -2
- package/scripts/security/secretlint-scan.ts +42 -9
- package/scripts/security/security-audit-provision-main.ts +9 -1
- package/scripts/security/security-audit-provision.ts +1 -1
- package/scripts/security/security-audit.ts +21 -1
- package/scripts/security/sonar-file.ts +10 -5
- package/scripts/split/split-assess.ts +12 -3
- package/scripts/split/split-early-notice.ts +116 -0
- package/scripts/split/split-measure.ts +20 -2
- package/scripts/split/split-resolution.ts +107 -0
- 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-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 +208 -20
- package/scripts/test/test-pinned-main.ts +84 -18
- 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 +258 -47
- package/scripts/test/test-reach-cli.ts +61 -0
- package/scripts/test/test-read-map.ts +35 -11
- package/scripts/test/test-read-recording.ts +17 -5
- package/scripts/test/test-read-trace.ts +26 -8
- package/scripts/test/test-red-logic.ts +46 -7
- package/scripts/test/test-red.ts +34 -14
- package/scripts/test/test-related-claim.ts +37 -0
- package/scripts/test/test-related-main.ts +4 -1
- package/scripts/test/test-related-moved.ts +91 -0
- package/scripts/test/test-related-record.ts +43 -23
- package/scripts/test/test-related-scope.ts +99 -34
- package/scripts/test/test-related-synced.ts +135 -0
- package/scripts/test/test-related-touched.ts +84 -0
- package/scripts/test/test-related.ts +167 -83
- package/scripts/test/test-unit-guard.ts +28 -5
- package/scripts/test/unit-durations.ts +41 -0
- package/scripts/test/unit-worker-share.ts +5 -4
- 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 +12 -1
- 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 +36 -5
- package/scripts/time-runtime/time-markers.ts +2 -2
- package/scripts/time-runtime/time-search-call.ts +38 -0
- package/scripts/time-runtime/time-shell.ts +1 -1
- package/scripts/time-runtime/time-transcript-line.ts +17 -5
- package/scripts/version/development-engines-verdict.ts +124 -0
- package/scripts/version/latest-corepack.ts +2 -0
- package/templates/gitignore +2 -0
- package/templates/workflows/ci.yml +41 -0
- package/dist/hooks/chunk-AZX4FGQ3.js +0 -207
- package/dist/hooks/chunk-PT5R6UJD.js +0 -7131
- package/dist/hooks/chunk-TUIFS5E7.js +0 -72
- package/dist/hooks/chunk-YCDOIR3I.js +0 -3456
- package/scripts/cost-runtime/context-cut-threshold.ts +0 -11
- package/scripts/rules/filing-cap.ts +0 -139
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { existsSync
|
|
1
|
+
import { existsSync } from 'node:fs'
|
|
2
2
|
import path from 'node:path'
|
|
3
|
-
import {
|
|
3
|
+
import { gate_labels } from '#scripts/gate/gate-labels'
|
|
4
4
|
import type { GateTree } from '#scripts/gate/gate-tree'
|
|
5
5
|
import { input_fingerprint } from '#scripts/gate/input-fingerprint'
|
|
6
6
|
import { moved_paths } from '#scripts/gate/moved-paths'
|
|
@@ -9,9 +9,17 @@ import { since_green } from '#scripts/gate/since-green'
|
|
|
9
9
|
import { changed_file_scope } from '#scripts/git/changed-file-scope'
|
|
10
10
|
import { changed_paths } from '#scripts/git/changed-paths'
|
|
11
11
|
import { review_stamps } from '#scripts/review/review-stamps'
|
|
12
|
+
import { direct_importers } from './direct-importers'
|
|
13
|
+
import { pure_files_entries } from './pure-files-entries'
|
|
14
|
+
import { related_heavy_tests } from './related-heavy-tests'
|
|
15
|
+
import { test_no_base } from './test-no-base'
|
|
12
16
|
import { test_read_map, type ReadMap } from './test-read-map'
|
|
17
|
+
import { test_related_claim } from './test-related-claim'
|
|
18
|
+
import { test_related_moved, type ChangeReading } from './test-related-moved'
|
|
13
19
|
import { test_related_record, type RunInput } from './test-related-record'
|
|
14
|
-
import { related_scope, type RelatedScope
|
|
20
|
+
import { related_scope, type RelatedScope } from './test-related-scope'
|
|
21
|
+
import { test_related_synced } from './test-related-synced'
|
|
22
|
+
import { test_related_touched } from './test-related-touched'
|
|
15
23
|
import { test_unit_guard } from './test-unit-guard'
|
|
16
24
|
|
|
17
25
|
// `josh test:related` — the unit check an implementation loop runs between edits.
|
|
@@ -36,15 +44,6 @@ function conclusive_tree(before: GateTree | undefined): GateTree | undefined {
|
|
|
36
44
|
return test_unit_guard.is_running(process.cwd()) ? before : undefined
|
|
37
45
|
}
|
|
38
46
|
|
|
39
|
-
// The change a narrowing reads, and the map it reads it against. `is_unmoved` is the since-green
|
|
40
|
-
// reading's positive fact that nothing moved since this command was last green on this checkout.
|
|
41
|
-
// `synced` is the part of the change a main sync brought in, kept for the run's ledger record, and
|
|
42
|
-
// `since_map` the part the change since the map's tree joined to what this change moved.
|
|
43
|
-
type ChangeReading = Pick<ScopeRequest, 'changed' | 'map' | 'since_map'> & {
|
|
44
|
-
is_unmoved?: true
|
|
45
|
-
synced?: ReadonlyArray<string>
|
|
46
|
-
}
|
|
47
|
-
|
|
48
47
|
// A failure answers `undefined` rather than an empty list: the two are opposite inputs to
|
|
49
48
|
// `resolve_scope`, and only one of them means "could not tell".
|
|
50
49
|
async function read_or_undefined(
|
|
@@ -84,8 +83,8 @@ async function change_since(
|
|
|
84
83
|
|
|
85
84
|
// **The map's tree is whichever lane last ran the whole suite green**, so the change since it holds that
|
|
86
85
|
// lane's own branch change too (joshuafolkken/kit#4527). What this branch did not change is marked
|
|
87
|
-
// `since_map`: it
|
|
88
|
-
//
|
|
86
|
+
// `since_map`: it reaches vitest only as a code file naming what moved, and only this branch's change
|
|
87
|
+
// can send the run to the whole suite (joshuafolkken/kit#4896). A branch change git cannot read marks nothing.
|
|
89
88
|
async function map_change(root: string, map: ReadMap): Promise<ChangeReading> {
|
|
90
89
|
const changed = await change_since(root, map)
|
|
91
90
|
|
|
@@ -101,8 +100,8 @@ async function map_change(root: string, map: ReadMap): Promise<ChangeReading> {
|
|
|
101
100
|
// Explicit file arguments win over the git reading, which is what makes the narrowing testable by
|
|
102
101
|
// hand and usable from a hook that already knows which file it just wrote. **The map still answers
|
|
103
102
|
// only for the change since its tree**, so that change joins the arguments: a test added since the
|
|
104
|
-
// map was recorded is in no entry, and only its own appearance in the change runs it —
|
|
105
|
-
//
|
|
103
|
+
// map was recorded is in no entry, and only its own appearance in the change runs it — when it names
|
|
104
|
+
// a file the arguments moved (`naming_moved`), as a source file there does.
|
|
106
105
|
async function explicit_change(
|
|
107
106
|
root: string,
|
|
108
107
|
explicit: ReadonlyArray<string>,
|
|
@@ -118,34 +117,29 @@ async function explicit_change(
|
|
|
118
117
|
return { changed: [...named, ...since_map], map, since_map }
|
|
119
118
|
}
|
|
120
119
|
|
|
121
|
-
// **
|
|
122
|
-
//
|
|
123
|
-
//
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
const data = synced.filter((file) => !related_scope.is_relatable(file))
|
|
127
|
-
|
|
128
|
-
if (data.length === 0) return []
|
|
129
|
-
|
|
130
|
-
const branch = (await branch_change()) ?? data
|
|
120
|
+
// **The whole-suite leg never narrows by a green a bare run recorded past a file every test imports**:
|
|
121
|
+
// that green vouches only for the file's direct importers (joshuafolkken/kit#5122), so while this
|
|
122
|
+
// branch changes one, the gate's unit leg reads the whole branch change.
|
|
123
|
+
async function is_green_narrowable(is_whole: boolean): Promise<boolean> {
|
|
124
|
+
if (!is_whole) return true
|
|
131
125
|
|
|
132
|
-
return
|
|
126
|
+
return direct_importers.every_test_imports_of((await branch_change()) ?? []).length === 0
|
|
133
127
|
}
|
|
134
128
|
|
|
135
129
|
// **What moved since this command's last green run** (`since-green.ts`), read as explicit arguments
|
|
136
130
|
// are. A moved file — code or not — reaches the tests reading it as data through the map, whose
|
|
137
131
|
// entries hold no module that started reading it after the map's tree; the change since that tree
|
|
138
|
-
// joins the list —
|
|
139
|
-
//
|
|
132
|
+
// joins the list — a code file of it only when it names a moved file (`naming_moved`) — so such a
|
|
133
|
+
// module runs the tests importing it. Nothing moved runs nothing; no map,
|
|
140
134
|
// or one git can no longer diff against, answers `undefined`, which reads the whole branch change.
|
|
141
135
|
async function since_green_change(
|
|
142
136
|
root: string,
|
|
143
137
|
map: ReadMap | undefined,
|
|
138
|
+
is_whole: boolean,
|
|
144
139
|
): Promise<ChangeReading | undefined> {
|
|
145
|
-
const parts = await
|
|
146
|
-
review_stamps.test_related_stamp,
|
|
147
|
-
|
|
148
|
-
)
|
|
140
|
+
const parts = (await is_green_narrowable(is_whole))
|
|
141
|
+
? await since_green.read_moved_parts(review_stamps.test_related_stamp, gate_labels.UNIT_LABEL)
|
|
142
|
+
: undefined
|
|
149
143
|
|
|
150
144
|
if (parts === undefined) return undefined
|
|
151
145
|
|
|
@@ -153,37 +147,50 @@ async function since_green_change(
|
|
|
153
147
|
|
|
154
148
|
if (moved.length === 0) return { changed: [], map, is_unmoved: true }
|
|
155
149
|
|
|
156
|
-
const
|
|
150
|
+
const branch = await branch_change()
|
|
151
|
+
const split = await test_related_synced.split(root, parts.synced, branch, map)
|
|
152
|
+
const change = await explicit_change(
|
|
153
|
+
root,
|
|
154
|
+
test_related_moved.narrowed_moved(moved, split, branch, map),
|
|
155
|
+
map,
|
|
156
|
+
)
|
|
157
157
|
|
|
158
158
|
if (change.map === undefined) return undefined
|
|
159
159
|
|
|
160
160
|
process.stdout.write(`${since_green.describe(related_scope.COMMAND_LABEL, moved)}\n`)
|
|
161
161
|
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
return { ...change, since_map, synced: parts.synced }
|
|
162
|
+
return test_related_moved.moved_reading(change, parts, branch, split)
|
|
165
163
|
}
|
|
166
164
|
|
|
167
|
-
async function whole_change(
|
|
168
|
-
|
|
165
|
+
async function whole_change(
|
|
166
|
+
root: string,
|
|
167
|
+
map: ReadMap | undefined,
|
|
168
|
+
is_whole: boolean,
|
|
169
|
+
): Promise<ChangeReading> {
|
|
170
|
+
const since = await since_green_change(root, map, is_whole)
|
|
169
171
|
|
|
170
172
|
if (since !== undefined) return since
|
|
171
173
|
|
|
172
174
|
return map === undefined ? { changed: await branch_change(), map } : await map_change(root, map)
|
|
173
175
|
}
|
|
174
176
|
|
|
177
|
+
function explicit_files(root: string, command_arguments: ReadonlyArray<string>): Array<string> {
|
|
178
|
+
return command_arguments
|
|
179
|
+
.filter((argument) => !changed_file_scope.is_flag(argument))
|
|
180
|
+
.map((file) => path.relative(root, path.resolve(file)))
|
|
181
|
+
}
|
|
182
|
+
|
|
175
183
|
async function read_change(
|
|
176
184
|
root: string,
|
|
177
185
|
command_arguments: ReadonlyArray<string>,
|
|
186
|
+
is_whole: boolean,
|
|
178
187
|
): Promise<ChangeReading> {
|
|
179
188
|
const map = test_read_map.read_map(root)
|
|
180
|
-
const explicit = command_arguments
|
|
181
|
-
.filter((argument) => !changed_file_scope.is_flag(argument))
|
|
182
|
-
.map((file) => path.relative(root, path.resolve(file)))
|
|
189
|
+
const explicit = explicit_files(root, command_arguments)
|
|
183
190
|
|
|
184
191
|
return explicit.length > 0
|
|
185
192
|
? await explicit_change(root, explicit, map)
|
|
186
|
-
: await whole_change(root, map)
|
|
193
|
+
: await whole_change(root, map, is_whole)
|
|
187
194
|
}
|
|
188
195
|
|
|
189
196
|
// **The changed non-code files the map's tree held and that did not already differ from it** — the
|
|
@@ -203,41 +210,50 @@ async function recorded_files(change: ChangeReading): Promise<ReadonlySet<string
|
|
|
203
210
|
)
|
|
204
211
|
}
|
|
205
212
|
|
|
206
|
-
function text_of(file_path: string): string {
|
|
207
|
-
try {
|
|
208
|
-
return readFileSync(file_path, 'utf8')
|
|
209
|
-
} catch {
|
|
210
|
-
return ''
|
|
211
|
-
}
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
// Each file's text is read once, however many names it is checked for.
|
|
215
|
-
function names_any(text: string, names: ReadonlyArray<string>): boolean {
|
|
216
|
-
return names.some((name) => text.includes(name))
|
|
217
|
-
}
|
|
218
|
-
|
|
219
213
|
// **The code files of the change since the map that name a file this change moved** — read off their
|
|
220
214
|
// text, the one place a file-system read added since the map's tree shows (`is_code_input` in
|
|
221
|
-
// `test-related-scope.ts`, joshuafolkken/kit#4532). A file the tree no longer holds names nothing.
|
|
215
|
+
// `test-related-scope.ts`, joshuafolkken/kit#4532). A file the tree no longer holds names nothing. A
|
|
216
|
+
// file every test depends on is never one: handed to vitest it runs the whole suite unannounced, and
|
|
217
|
+
// only this branch's own change of it may do that (joshuafolkken/kit#4993). **Only this branch's own
|
|
218
|
+
// change names**, where it was read: a main sync's file — a shared test, or one main deleted — would
|
|
219
|
+
// match main's own sources, which vitest widens to hundreds of tests (joshuafolkken/kit#5041).
|
|
222
220
|
function naming_moved(root: string, change: ChangeReading): ReadonlySet<string> {
|
|
223
|
-
const { changed = [], since_map = [] } = change
|
|
221
|
+
const { changed = [], since_map = [], branch = changed } = change
|
|
224
222
|
const names = changed
|
|
225
|
-
.filter((file) => !since_map.includes(file))
|
|
223
|
+
.filter((file) => !since_map.includes(file) && branch.includes(file))
|
|
226
224
|
.map((file) => path.basename(file))
|
|
227
|
-
const code = since_map.filter(
|
|
225
|
+
const code = since_map.filter(
|
|
226
|
+
(file) => related_scope.is_relatable(file) && !test_related_moved.is_whole_suite(file),
|
|
227
|
+
)
|
|
228
228
|
|
|
229
|
-
|
|
229
|
+
// Each file's text is read once, however many names it is checked for.
|
|
230
|
+
return new Set(
|
|
231
|
+
code.filter((file) =>
|
|
232
|
+
test_no_base.names_any(test_no_base.text_of(path.join(root, file)), names),
|
|
233
|
+
),
|
|
234
|
+
)
|
|
230
235
|
}
|
|
231
236
|
|
|
232
|
-
|
|
237
|
+
// A file every test imports narrows to its direct importers unless `is_whole`: the gate's unit leg, and
|
|
238
|
+
// the gate's reuse of it, keep the whole suite for it (`gate_labels.KEEP_WHOLE_SUITE_FLAG`).
|
|
239
|
+
async function scope_of(
|
|
240
|
+
root: string,
|
|
241
|
+
change: ChangeReading,
|
|
242
|
+
is_whole: boolean,
|
|
243
|
+
): Promise<RelatedScope> {
|
|
233
244
|
const recorded = await recorded_files(change)
|
|
234
245
|
const naming = naming_moved(root, change)
|
|
246
|
+
const pure_entries = await pure_files_entries.read_moved(root, change.changed)
|
|
247
|
+
const narrowed = is_whole ? [] : (change.changed ?? [])
|
|
248
|
+
const importers = await direct_importers.every_test_importers(root, narrowed)
|
|
235
249
|
|
|
236
250
|
return related_scope.resolve_scope({
|
|
237
251
|
root,
|
|
238
252
|
...change,
|
|
239
253
|
recorded,
|
|
240
254
|
naming_moved: naming,
|
|
255
|
+
pure_entries,
|
|
256
|
+
every_test_importers: importers,
|
|
241
257
|
is_present: existsSync,
|
|
242
258
|
})
|
|
243
259
|
}
|
|
@@ -246,7 +262,7 @@ async function scope_of(root: string, change: ChangeReading): Promise<RelatedSco
|
|
|
246
262
|
// narrows with, so the gate's reuse of a green unit step (`check-inputs.ts`) can never trust a change
|
|
247
263
|
// this command would have run tests for. Unknown reaches: no map, or one recorded on a tree git can
|
|
248
264
|
// no longer diff against. The change since the map joins the paths as it does for explicit
|
|
249
|
-
// arguments, so a test added or edited after the map was recorded still reaches.
|
|
265
|
+
// arguments, so a test added or edited after the map was recorded still reaches when it names a path.
|
|
250
266
|
async function reaches_tests(root: string, paths: ReadonlyArray<string>): Promise<boolean> {
|
|
251
267
|
if (paths.length === 0) return false
|
|
252
268
|
|
|
@@ -254,7 +270,7 @@ async function reaches_tests(root: string, paths: ReadonlyArray<string>): Promis
|
|
|
254
270
|
|
|
255
271
|
if (change.map === undefined) return true
|
|
256
272
|
|
|
257
|
-
const scope = await scope_of(root, change)
|
|
273
|
+
const scope = await scope_of(root, change, true)
|
|
258
274
|
|
|
259
275
|
return scope.mode !== 'none'
|
|
260
276
|
}
|
|
@@ -273,32 +289,46 @@ async function run_scope(
|
|
|
273
289
|
return 0
|
|
274
290
|
}
|
|
275
291
|
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
292
|
+
const vitest_arguments = related_scope.vitest_arguments(scope, [
|
|
293
|
+
...changed_file_scope.flags_of(command_arguments),
|
|
294
|
+
...related_heavy_tests.exclude_flags(scope, root),
|
|
295
|
+
])
|
|
296
|
+
|
|
297
|
+
return await test_related_claim.with_unit_claim(
|
|
298
|
+
scope.mode === 'related' ? scope.files : undefined,
|
|
299
|
+
async () =>
|
|
300
|
+
await test_unit_guard.run_guarded_vitest(
|
|
301
|
+
process.cwd(),
|
|
302
|
+
vitest_arguments,
|
|
303
|
+
related_scope.COMMAND_NAME,
|
|
304
|
+
description,
|
|
305
|
+
),
|
|
281
306
|
)
|
|
282
307
|
}
|
|
283
308
|
|
|
284
|
-
async function resolve_change(
|
|
309
|
+
async function resolve_change(
|
|
310
|
+
root: string,
|
|
311
|
+
change: ChangeReading,
|
|
312
|
+
is_whole: boolean,
|
|
313
|
+
): Promise<RelatedScope> {
|
|
285
314
|
const { UNMOVED_REASON } = related_scope
|
|
286
315
|
|
|
287
316
|
if (change.is_unmoved === true) return { mode: 'none', files: [], reason: UNMOVED_REASON }
|
|
288
317
|
|
|
289
|
-
return await scope_of(root, change)
|
|
318
|
+
return await scope_of(root, change, is_whole)
|
|
290
319
|
}
|
|
291
320
|
|
|
292
321
|
async function read_run_input(
|
|
293
322
|
root: string,
|
|
294
323
|
command_arguments: ReadonlyArray<string>,
|
|
324
|
+
is_whole: boolean,
|
|
295
325
|
): Promise<RunInput> {
|
|
296
|
-
const change = await read_change(root, command_arguments)
|
|
297
|
-
const scope = await resolve_change(root, change)
|
|
326
|
+
const change = await read_change(root, command_arguments, is_whole)
|
|
327
|
+
const scope = await resolve_change(root, change, is_whole)
|
|
298
328
|
|
|
299
|
-
const { changed, synced = [], since_map = [] } = change
|
|
329
|
+
const { changed, synced = [], since_map = [], branch } = change
|
|
300
330
|
|
|
301
|
-
return { scope, root, changed, synced, since_map }
|
|
331
|
+
return { scope, root, changed, synced, since_map, branch }
|
|
302
332
|
}
|
|
303
333
|
|
|
304
334
|
// Every run is timed and counted into the lane ledger (joshuafolkken/kit#4465).
|
|
@@ -319,20 +349,74 @@ async function run_and_record(
|
|
|
319
349
|
return exit_code
|
|
320
350
|
}
|
|
321
351
|
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
352
|
+
// **The no-base pass is part of the run's verdict**, so a green record — the one `josh ship` and the
|
|
353
|
+
// gate reuse — never vouches for a tree whose base-touching code fails in CI's checkout. It runs
|
|
354
|
+
// only after a green first pass (`test-no-base.ts`), and only over this branch's own files: those
|
|
355
|
+
// the map's tree or a main sync joined were verified by main's CI.
|
|
356
|
+
async function with_no_base_pass(
|
|
357
|
+
input: RunInput,
|
|
358
|
+
command_arguments: ReadonlyArray<string>,
|
|
359
|
+
exit_code: number,
|
|
360
|
+
): Promise<number> {
|
|
361
|
+
if (exit_code !== 0) return exit_code
|
|
362
|
+
|
|
363
|
+
const flags = changed_file_scope.flags_of(command_arguments)
|
|
364
|
+
const joined = new Set([...input.since_map, ...input.synced])
|
|
365
|
+
const own = (input.changed ?? []).filter((file) => !joined.has(file))
|
|
325
366
|
|
|
326
|
-
|
|
327
|
-
|
|
367
|
+
return await test_no_base.run_if_touched(input.root, own, flags)
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
// A non-code argument is resolved through the map, and a file every test imports through its
|
|
371
|
+
// importers, rather than handed to vitest, so only the other code arguments can be ones vitest was not
|
|
372
|
+
// given.
|
|
373
|
+
function report_unhanded(
|
|
374
|
+
root: string,
|
|
375
|
+
command_arguments: ReadonlyArray<string>,
|
|
376
|
+
scope: RelatedScope,
|
|
377
|
+
): void {
|
|
328
378
|
changed_file_scope.report_unusable_arguments(
|
|
329
|
-
command_arguments.filter(
|
|
330
|
-
|
|
379
|
+
command_arguments.filter(
|
|
380
|
+
(argument) =>
|
|
381
|
+
related_scope.is_relatable(argument) &&
|
|
382
|
+
!direct_importers.is_every_test_import(root, argument),
|
|
383
|
+
),
|
|
384
|
+
scope,
|
|
331
385
|
related_scope.COMMAND_LABEL,
|
|
332
386
|
)
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
// **A `--touched` run is the implementation loop's** (`test-related-touched.ts`): it reads its scope off
|
|
390
|
+
// the change alone and leaves no green record, so `josh review:brief` and the gate's reuse count only
|
|
391
|
+
// a full-reach run.
|
|
392
|
+
async function run_touched(given: ReadonlyArray<string>): Promise<number> {
|
|
393
|
+
const { TOUCHED_FLAG, TOUCHED_KIND } = test_related_touched
|
|
394
|
+
const command_arguments = given.filter((argument) => argument !== TOUCHED_FLAG)
|
|
395
|
+
const root = await changed_file_scope.repository_root_or_cwd()
|
|
396
|
+
const explicit = explicit_files(root, command_arguments)
|
|
397
|
+
const changed = explicit.length > 0 ? explicit : await branch_change()
|
|
398
|
+
const scope = test_related_touched.touched_scope(root, changed)
|
|
399
|
+
const input = { scope, root, changed, synced: [], since_map: [], kind: TOUCHED_KIND }
|
|
400
|
+
|
|
401
|
+
return await run_and_record(input, command_arguments)
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
async function run_related_tests(given: ReadonlyArray<string>): Promise<number> {
|
|
405
|
+
if (given.includes(test_related_touched.TOUCHED_FLAG)) return await run_touched(given)
|
|
406
|
+
|
|
407
|
+
const { KEEP_WHOLE_SUITE_FLAG } = gate_labels
|
|
408
|
+
const command_arguments = given.filter((argument) => argument !== KEEP_WHOLE_SUITE_FLAG)
|
|
409
|
+
const root = await changed_file_scope.repository_root_or_cwd()
|
|
410
|
+
const input = await read_run_input(root, command_arguments, given.includes(KEEP_WHOLE_SUITE_FLAG))
|
|
411
|
+
|
|
412
|
+
report_unhanded(root, command_arguments, input.scope)
|
|
333
413
|
|
|
334
414
|
const before = await scoped_green.read_before(command_arguments)
|
|
335
|
-
const exit_code = await
|
|
415
|
+
const exit_code = await with_no_base_pass(
|
|
416
|
+
input,
|
|
417
|
+
command_arguments,
|
|
418
|
+
await run_and_record(input, command_arguments),
|
|
419
|
+
)
|
|
336
420
|
|
|
337
421
|
await scoped_green.record_if_green(review_stamps.test_related_stamp, {
|
|
338
422
|
before: conclusive_tree(before),
|
|
@@ -11,6 +11,7 @@ import { project_test_script, type ProjectScriptState } from './project-test-scr
|
|
|
11
11
|
import { SKIP_MARKER } from './skip-marker'
|
|
12
12
|
import { test_read_recording, type RecordingEnvironment } from './test-read-recording'
|
|
13
13
|
import { unit_worker_share } from './unit-worker-share'
|
|
14
|
+
import { vitest_failure_summary } from './vitest-failure-summary'
|
|
14
15
|
|
|
15
16
|
const PNPM = 'pnpm'
|
|
16
17
|
const FAIL_EXIT_CODE = 1
|
|
@@ -203,19 +204,32 @@ async function vitest_share(vitest_arguments: ReadonlyArray<string>): Promise<nu
|
|
|
203
204
|
async function execute_vitest(
|
|
204
205
|
vitest_arguments: ReadonlyArray<string>,
|
|
205
206
|
recording: RecordingEnvironment,
|
|
207
|
+
directory: string,
|
|
206
208
|
): Promise<number> {
|
|
209
|
+
// Shown as it runs and kept as well, so a failed run can end with its summary (joshuafolkken/kit#4869).
|
|
207
210
|
const result = await execa(PNPM, ['exec', 'vitest', ...vitest_arguments], {
|
|
211
|
+
cwd: directory,
|
|
208
212
|
env: { ...isolated_unit_environment(), ...recording },
|
|
209
213
|
extendEnv: false,
|
|
210
|
-
|
|
214
|
+
stdin: 'inherit',
|
|
215
|
+
stdout: ['inherit', 'pipe'],
|
|
216
|
+
stderr: ['inherit', 'pipe'],
|
|
217
|
+
all: true,
|
|
211
218
|
reject: false,
|
|
212
219
|
})
|
|
220
|
+
const exit_code = result.exitCode ?? FAIL_EXIT_CODE
|
|
213
221
|
|
|
214
|
-
|
|
222
|
+
vitest_failure_summary.report(vitest_arguments, result.all, exit_code)
|
|
223
|
+
|
|
224
|
+
return exit_code
|
|
215
225
|
}
|
|
216
226
|
|
|
217
|
-
// A whole-suite run also records the test-read map `josh test:related` narrows by.
|
|
218
|
-
|
|
227
|
+
// A whole-suite run also records the test-read map `josh test:related` narrows by. `directory` is
|
|
228
|
+
// where vitest runs — another checkout's for `test-no-base.ts`, this process's otherwise.
|
|
229
|
+
async function run_vitest(
|
|
230
|
+
vitest_arguments: ReadonlyArray<string>,
|
|
231
|
+
directory: string = process.cwd(),
|
|
232
|
+
): Promise<number> {
|
|
219
233
|
return await unit_worker_share.with_run_marker(async () => {
|
|
220
234
|
const sized = [
|
|
221
235
|
...vitest_arguments,
|
|
@@ -226,11 +240,19 @@ async function run_vitest(vitest_arguments: ReadonlyArray<string>): Promise<numb
|
|
|
226
240
|
return await test_read_recording.with_read_recording(
|
|
227
241
|
root,
|
|
228
242
|
sized,
|
|
229
|
-
async (recording) => await execute_vitest(sized, recording),
|
|
243
|
+
async (recording) => await execute_vitest(sized, recording, directory),
|
|
230
244
|
)
|
|
231
245
|
})
|
|
232
246
|
}
|
|
233
247
|
|
|
248
|
+
// The same funnel, run in another checkout of this project — whose `node_modules` is this one's.
|
|
249
|
+
async function run_vitest_in(
|
|
250
|
+
directory: string,
|
|
251
|
+
vitest_arguments: ReadonlyArray<string>,
|
|
252
|
+
): Promise<number> {
|
|
253
|
+
return await run_vitest(vitest_arguments, directory)
|
|
254
|
+
}
|
|
255
|
+
|
|
234
256
|
// The label names the command the notice is printed for, so a skipped scoped run says
|
|
235
257
|
// `josh test:related` rather than reporting itself as the full suite. `SKIP_MARKER` is unchanged
|
|
236
258
|
// either way: the gate reads that word, never the label.
|
|
@@ -297,6 +319,7 @@ const test_unit_guard = {
|
|
|
297
319
|
isolated_unit_environment,
|
|
298
320
|
run_guarded_unit,
|
|
299
321
|
run_guarded_vitest,
|
|
322
|
+
run_vitest_in,
|
|
300
323
|
vitest_share,
|
|
301
324
|
}
|
|
302
325
|
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { readFileSync } from 'node:fs'
|
|
2
|
+
import path from 'node:path'
|
|
3
|
+
|
|
4
|
+
// The per-file unit durations the CI shards are balanced by (joshuafolkken/kit#4467), read here so
|
|
5
|
+
// the published `josh test:related` can weigh them too (joshuafolkken/kit#5105) — the reporter that
|
|
6
|
+
// refreshes the record is kit-only (`tools/test/unit-duration-record.ts`). A project without the
|
|
7
|
+
// record reads an empty one.
|
|
8
|
+
|
|
9
|
+
type Durations = Readonly<Record<string, number>>
|
|
10
|
+
|
|
11
|
+
const RECORD_FILE = 'tools/test/unit-durations.json'
|
|
12
|
+
|
|
13
|
+
function parse(text: string): Durations {
|
|
14
|
+
const parsed: unknown = JSON.parse(text)
|
|
15
|
+
|
|
16
|
+
if (typeof parsed !== 'object' || parsed === null) return {}
|
|
17
|
+
|
|
18
|
+
return Object.fromEntries(
|
|
19
|
+
Object.entries(parsed).filter(
|
|
20
|
+
(entry): entry is [string, number] => typeof entry[1] === 'number',
|
|
21
|
+
),
|
|
22
|
+
)
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// A missing or unreadable record is an empty one: every file then weighs the same fallback.
|
|
26
|
+
function read(root: string): Durations {
|
|
27
|
+
try {
|
|
28
|
+
return parse(readFileSync(path.join(root, RECORD_FILE), 'utf8'))
|
|
29
|
+
} catch {
|
|
30
|
+
return {}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
const unit_durations = {
|
|
35
|
+
RECORD_FILE,
|
|
36
|
+
parse,
|
|
37
|
+
read,
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export type { Durations }
|
|
41
|
+
export { unit_durations }
|
|
@@ -19,8 +19,9 @@ import { unit_run_marker } from './unit-run-marker'
|
|
|
19
19
|
// worker.
|
|
20
20
|
//
|
|
21
21
|
// **The division activates only under concurrency.** One run in flight — every solo run, CI included
|
|
22
|
-
// — gets
|
|
23
|
-
//
|
|
22
|
+
// — gets no share from it; what bounds a solo run is the claim it was admitted on (`cap_to_claim`),
|
|
23
|
+
// which for a direct run is vitest's own default on a small machine such as a four-core CI runner
|
|
24
|
+
// (`gate_plan.direct_unit_weight`, joshuafolkken/kit#4607).
|
|
24
25
|
//
|
|
25
26
|
// **The run markers and their division of the machine are `unit-run-marker.ts`**, the part the vitest
|
|
26
27
|
// config imports (joshuafolkken/kit#4572); the capacity and claim bounds and the flag handling are here.
|
|
@@ -86,8 +87,8 @@ interface UnitClaim {
|
|
|
86
87
|
// **The share never exceeds the claim the run was admitted on** (joshuafolkken/kit#4235). The share is
|
|
87
88
|
// read after admission, when fewer runs may be in flight than when the weight was sized, and a share
|
|
88
89
|
// wider than the claim puts workers on the machine the ledger does not hold. The claim bounds a solo
|
|
89
|
-
// share too: vitest's own choice is one worker per core but one, wider than
|
|
90
|
-
// reserves for a unit run, so leaving it in place would open workers no claim holds. The claim holds
|
|
90
|
+
// share too: vitest's own choice is one worker per core but one, wider than the weight the ledger
|
|
91
|
+
// reserves for a unit run from seven cores up, so leaving it in place would open workers no claim holds. The claim holds
|
|
91
92
|
// vitest's own process as well, so its workers are the claim less that core.
|
|
92
93
|
function cap_to_claim(share: number | undefined, claim: UnitClaim | undefined): number | undefined {
|
|
93
94
|
if (claim === undefined) return share
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
// The Vite cache directory `vitest.config.ts` hands a vitest run in a throwaway tree (joshuafolkken/kit#4770).
|
|
2
|
+
//
|
|
3
|
+
// **A tree from `base-tree.ts` borrows this checkout's `node_modules`**, and vitest keys its dependency
|
|
4
|
+
// optimizer's cache by project name alone, so a `josh test:red` / `josh test:pinned` run beside the gate
|
|
5
|
+
// re-bundled the same `node_modules/.vite/vitest/<hash>/deps_ssr` the gate was importing from, and a gate
|
|
6
|
+
// file failed on a deleted `execa.js`. The tree's run names a directory of its own through
|
|
7
|
+
// `CACHE_DIRECTORY_KEY`; any other run leaves it unset and keeps Vite's default.
|
|
8
|
+
|
|
9
|
+
const CACHE_DIRECTORY_KEY = 'JOSH_VITEST_CACHE_DIR'
|
|
10
|
+
|
|
11
|
+
function config_cache_directory(environment: NodeJS.ProcessEnv = process.env): string | undefined {
|
|
12
|
+
const directory = environment[CACHE_DIRECTORY_KEY] ?? ''
|
|
13
|
+
|
|
14
|
+
return directory === '' ? undefined : directory
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
const vitest_cache_directory = { CACHE_DIRECTORY_KEY, config_cache_directory }
|
|
18
|
+
|
|
19
|
+
export { vitest_cache_directory }
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
// **A command line's `--exclude` reaches both unit projects** (joshuafolkken/kit#5105): vitest applies
|
|
2
|
+
// the flag to the root config alone, which the inline projects of `tools/test/unit-projects.ts` do not
|
|
3
|
+
// inherit, so without this it excluded nothing. `josh test:related` passes it to leave the heavy files
|
|
4
|
+
// out of a scoped run. A leaf module, since `vitest.config.ts` imports it.
|
|
5
|
+
|
|
6
|
+
const EXCLUDE_FLAG = '--exclude'
|
|
7
|
+
|
|
8
|
+
function cli_excludes(argv: ReadonlyArray<string>): Array<string> {
|
|
9
|
+
return argv.slice(1).filter((_argument, index) => argv[index] === EXCLUDE_FLAG)
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
const vitest_cli_excludes = { EXCLUDE_FLAG, cli_excludes }
|
|
13
|
+
|
|
14
|
+
export { vitest_cli_excludes }
|