@joshuafolkken/kit 1.1784.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/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 +59 -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 +415 -389
- 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 +15 -8
- 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,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 }
|
package/scripts/test/test-red.ts
CHANGED
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
import { existsSync } from 'node:fs'
|
|
2
|
-
import { readFile, rm } from 'node:fs/promises'
|
|
2
|
+
import { readFile, realpath, rm } from 'node:fs/promises'
|
|
3
3
|
import path from 'node:path'
|
|
4
4
|
import { base_tree, type BaseTree } from '#scripts/git/base-tree'
|
|
5
5
|
import { change_base } from '#scripts/git/change-base'
|
|
6
6
|
import { changed_paths } from '#scripts/git/changed-paths'
|
|
7
7
|
import { git_location_environment } from '#scripts/git/git-location-environment'
|
|
8
8
|
import { execa } from 'execa'
|
|
9
|
-
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'
|
|
10
11
|
|
|
11
12
|
// `josh test:red` — run the added and changed Vitest files against the pre-fix tree and print `red`,
|
|
12
|
-
// `green`, `no-test` or `test-only`.
|
|
13
|
+
// `green`, `no-test`, `stopped` or `test-only`.
|
|
13
14
|
//
|
|
14
15
|
// **The pre-fix tree is a detached worktree at the merge-base, never the caller's checkout**
|
|
15
16
|
// (`base-tree.ts`). The tests are copied in from the working tree, so what runs is the new test
|
|
@@ -17,9 +18,12 @@ import { test_red_logic, type RedVerdict } from './test-red-logic'
|
|
|
17
18
|
|
|
18
19
|
const TREE_PREFIX = 'josh-test-red-'
|
|
19
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'
|
|
20
24
|
const VITEST_BIN = path.join(base_tree.NODE_MODULES, '.bin', 'vitest')
|
|
21
25
|
const USAGE =
|
|
22
|
-
'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'
|
|
23
27
|
|
|
24
28
|
interface RedRun {
|
|
25
29
|
verdict: RedVerdict
|
|
@@ -45,32 +49,43 @@ async function read_report(report: string): Promise<string> {
|
|
|
45
49
|
// `josh test:pinned`. `--passWithNoTests` keeps "the filter matched nothing" from reading as a
|
|
46
50
|
// failure, and the JSON report — written beside the tree, never into it — says whether anything ran at
|
|
47
51
|
// all, so a file the old config excludes is `no-test` rather than a `green` that refuses a correct fix.
|
|
48
|
-
// A test that ran and broke, or a file that could not load against the old code, makes it `red
|
|
49
|
-
// report is removed first, so a run that writes
|
|
50
|
-
|
|
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(
|
|
51
56
|
{ parent, tree }: BaseTree,
|
|
52
57
|
selection: ReadonlyArray<string>,
|
|
53
|
-
): Promise<
|
|
58
|
+
): Promise<RedProbe> {
|
|
54
59
|
const report = path.join(parent, REPORT_NAME)
|
|
55
60
|
const vitest_args = [...selection, '--passWithNoTests', ...reporter_arguments(report)]
|
|
56
61
|
|
|
57
62
|
await rm(report, { force: true })
|
|
58
63
|
const result = await execa(path.join(tree, VITEST_BIN), vitest_args, {
|
|
59
64
|
cwd: tree,
|
|
60
|
-
env:
|
|
65
|
+
env: {
|
|
66
|
+
...git_location_environment.location_free_environment(),
|
|
67
|
+
[vitest_cache_directory.CACHE_DIRECTORY_KEY]: path.join(parent, CACHE_NAME),
|
|
68
|
+
},
|
|
61
69
|
extendEnv: true,
|
|
62
70
|
reject: false,
|
|
63
71
|
})
|
|
64
|
-
const
|
|
72
|
+
const text = await read_report(report)
|
|
73
|
+
const ran = test_red_logic.ran_file_count(text)
|
|
65
74
|
|
|
66
|
-
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
|
+
}
|
|
67
80
|
}
|
|
68
81
|
|
|
69
82
|
async function verdict_on(base: string, files: ReadonlyArray<string>): Promise<RedVerdict> {
|
|
70
83
|
return await base_tree.with_tree(TREE_PREFIX, base, async (pre_fix) => {
|
|
71
84
|
await base_tree.copy_in(pre_fix.tree, files)
|
|
72
85
|
|
|
73
|
-
|
|
86
|
+
const probe = await probe_in(pre_fix, ['run', ...files])
|
|
87
|
+
|
|
88
|
+
return probe.verdict
|
|
74
89
|
})
|
|
75
90
|
}
|
|
76
91
|
|
|
@@ -78,7 +93,7 @@ async function verdict_on(base: string, files: ReadonlyArray<string>): Promise<R
|
|
|
78
93
|
// `no-test` — there is no pre-fix tree to run against, and a guard fails open. A change whose every path
|
|
79
94
|
// is a test file is `test-only` without a run: the merge-base runs the same code as HEAD.
|
|
80
95
|
async function run(): Promise<RedRun> {
|
|
81
|
-
const base = await change_base.
|
|
96
|
+
const base = await change_base.resolved_through_merge()
|
|
82
97
|
const paths = await changed_paths.read_changed_paths(false)
|
|
83
98
|
const files = changed_tests(paths)
|
|
84
99
|
|
|
@@ -103,7 +118,12 @@ async function main(argv: ReadonlyArray<string>): Promise<number> {
|
|
|
103
118
|
return 0
|
|
104
119
|
}
|
|
105
120
|
|
|
106
|
-
|
|
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)
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
const test_red = { has_runner, main, probe_in, run }
|
|
107
127
|
|
|
108
128
|
export type { RedRun }
|
|
109
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 }
|
|
@@ -2,17 +2,20 @@
|
|
|
2
2
|
import { fileURLToPath } from 'node:url'
|
|
3
3
|
import { changed_file_scope } from '#scripts/git/changed-file-scope'
|
|
4
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'
|
|
5
6
|
import { test_related } from './test-related'
|
|
6
7
|
|
|
7
8
|
// The `josh test:related` entry, kept apart from `test-related.ts` because `check-inputs.ts` imports
|
|
8
9
|
// that one: a bundle is one file, so a main guard there would fire for every command that carries it
|
|
9
10
|
// (joshuafolkken/kit#4186). A green run then shows the tests the change removed, the one place a run
|
|
10
|
-
// meets them before `josh ship` (joshuafolkken/kit#4563)
|
|
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).
|
|
11
13
|
if (process.argv[1] === fileURLToPath(import.meta.url)) {
|
|
12
14
|
const exit_code = await test_related.run_related_tests(
|
|
13
15
|
process.argv.slice(changed_file_scope.ARGV_START),
|
|
14
16
|
)
|
|
15
17
|
|
|
16
18
|
if (exit_code === 0) await run_ship_removed_rows.surface()
|
|
19
|
+
await split_early_notice.surface()
|
|
17
20
|
process.exitCode = exit_code
|
|
18
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 }
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { mkdtempSync, rmSync } from 'node:fs'
|
|
2
2
|
import { tmpdir } from 'node:os'
|
|
3
3
|
import path from 'node:path'
|
|
4
|
-
import {
|
|
4
|
+
import type { TestRelatedRecord } from '#scripts/lane/lane-ledger-schema'
|
|
5
|
+
import { lane_ledger_write } from '#scripts/lane/lane-ledger-write'
|
|
5
6
|
import { related_scope, type RelatedScope } from './test-related-scope'
|
|
6
7
|
import { unit_count_file } from './unit-count-file'
|
|
7
8
|
|
|
@@ -21,9 +22,13 @@ interface RunInput {
|
|
|
21
22
|
// The part of `changed` a main sync brought in, empty outside a since-green reading.
|
|
22
23
|
synced: ReadonlyArray<string>
|
|
23
24
|
// The part of `changed` the change since the test-read map's tree joined to the named or moved
|
|
24
|
-
// files — main merges that landed after the map among them
|
|
25
|
-
// the synced non-code files as well, which the record counts as `synced` alone.
|
|
25
|
+
// files — main merges that landed after the map among them. A file of `branch` in it counts as
|
|
26
|
+
// `changed`; it holds the synced non-code files as well, which the record counts as `synced` alone.
|
|
26
27
|
since_map: ReadonlyArray<string>
|
|
28
|
+
// This branch's own change from its merge base, where it was read.
|
|
29
|
+
branch?: ReadonlyArray<string> | undefined
|
|
30
|
+
// The name the run is recorded under when it is not the scope's own — `touched` for a `--touched` run.
|
|
31
|
+
kind?: string
|
|
27
32
|
}
|
|
28
33
|
|
|
29
34
|
interface RunResult {
|
|
@@ -69,15 +74,11 @@ async function with_test_count(
|
|
|
69
74
|
}
|
|
70
75
|
}
|
|
71
76
|
|
|
72
|
-
// The scope's files the
|
|
73
|
-
function readers_of(input: RunInput,
|
|
77
|
+
// The scope's files the record counted in no part — the map's readers.
|
|
78
|
+
function readers_of(input: RunInput, counted: ReadonlySet<string>): number {
|
|
74
79
|
if (input.scope.mode !== 'related') return 0
|
|
75
80
|
|
|
76
|
-
return input.scope.files.filter((file) => !
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
function part_of(part: ReadonlyArray<string>, changed: ReadonlySet<string>): number {
|
|
80
|
-
return part.filter((file) => changed.has(file)).length
|
|
81
|
+
return input.scope.files.filter((file) => !counted.has(path.relative(input.root, file))).length
|
|
81
82
|
}
|
|
82
83
|
|
|
83
84
|
// The changed files that sent a full-suite run there, repository-root-relative, or none.
|
|
@@ -87,20 +88,39 @@ function triggers_of(input: RunInput): Partial<TestRelatedRecord> {
|
|
|
87
88
|
return { trigger_files: input.scope.files.map((file) => path.relative(input.root, file)) }
|
|
88
89
|
}
|
|
89
90
|
|
|
91
|
+
// **The run's own change is the branch's, where it was read** (joshuafolkken/kit#5041): a synced file
|
|
92
|
+
// the split cannot vouch for is in `changed` without being this branch's change. Unread, it is what
|
|
93
|
+
// neither a main sync nor the map's tree joined.
|
|
94
|
+
function own_of(input: RunInput): ReadonlyArray<string> {
|
|
95
|
+
const { changed = [], branch } = input
|
|
96
|
+
const joined = new Set([...input.synced, ...input.since_map])
|
|
97
|
+
|
|
98
|
+
return changed.filter((file) => branch?.includes(file) ?? !joined.has(file))
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
// The input split into its counted parts, each file in one. A synced non-code file is in `since_map`
|
|
102
|
+
// too (`synced_data` in `test-related.ts`), counted as synced alone.
|
|
103
|
+
function parts_of(input: RunInput): Record<'own' | 'synced' | 'since_map', ReadonlyArray<string>> {
|
|
104
|
+
const own = own_of(input)
|
|
105
|
+
const rest = (input.changed ?? []).filter((file) => !own.includes(file))
|
|
106
|
+
|
|
107
|
+
return {
|
|
108
|
+
own,
|
|
109
|
+
synced: rest.filter((file) => input.synced.includes(file)),
|
|
110
|
+
since_map: rest.filter(
|
|
111
|
+
(file) => input.since_map.includes(file) && !input.synced.includes(file),
|
|
112
|
+
),
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
90
116
|
function record_of(input: RunInput, result: RunResult): TestRelatedRecord {
|
|
91
|
-
const
|
|
92
|
-
const synced = part_of(input.synced, changed)
|
|
93
|
-
// A synced non-code file is in `since_map` too (`synced_data` in `test-related.ts`), counted once.
|
|
94
|
-
const since_map = part_of(
|
|
95
|
-
input.since_map.filter((file) => !input.synced.includes(file)),
|
|
96
|
-
changed,
|
|
97
|
-
)
|
|
117
|
+
const { own, synced, since_map } = parts_of(input)
|
|
98
118
|
const record = {
|
|
99
|
-
scope: related_scope.scope_kind(input.scope),
|
|
100
|
-
changed:
|
|
101
|
-
synced,
|
|
102
|
-
since_map,
|
|
103
|
-
readers: readers_of(input,
|
|
119
|
+
scope: input.kind ?? related_scope.scope_kind(input.scope),
|
|
120
|
+
changed: own.length,
|
|
121
|
+
synced: synced.length,
|
|
122
|
+
since_map: since_map.length,
|
|
123
|
+
readers: readers_of(input, new Set([...own, ...synced, ...since_map])),
|
|
104
124
|
...triggers_of(input),
|
|
105
125
|
elapsed_ms: Math.round(result.elapsed_ms),
|
|
106
126
|
}
|
|
@@ -110,7 +130,7 @@ function record_of(input: RunInput, result: RunResult): TestRelatedRecord {
|
|
|
110
130
|
|
|
111
131
|
// Best-effort, as every ledger write is.
|
|
112
132
|
async function record_run(input: RunInput, result: RunResult, ledger?: string): Promise<void> {
|
|
113
|
-
await
|
|
133
|
+
await lane_ledger_write.record_test_related(record_of(input, result), ledger)
|
|
114
134
|
}
|
|
115
135
|
|
|
116
136
|
const test_related_record = { record_of, record_run, with_test_count }
|