@joshuafolkken/kit 1.1514.0 → 1.2114.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/agents/investigator.md +1 -1
- package/.claude/agents/reviewer-verification.md +19 -0
- package/.claude/agents/reviewer.md +19 -0
- package/.claude/settings.json +5 -6
- package/.claude/skills/dependency-update/SKILL.md +9 -10
- package/.claude/skills/epic-commands/SKILL.md +26 -65
- package/.claude/skills/epic-commands/epic-bundle.md +3 -1
- package/.claude/skills/workflow-commands/SKILL.md +11 -11
- package/.claude/skills/workflow-commands/background-commands.md +13 -10
- package/.claude/skills/workflow-commands/backlogrun-child.md +12 -8
- package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +7 -25
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +18 -14
- package/.claude/skills/workflow-commands/backlogrun-park.md +18 -24
- package/.claude/skills/workflow-commands/backlogrun-progress.md +4 -5
- package/.claude/skills/workflow-commands/backlogrun-recovery.md +6 -6
- package/.claude/skills/workflow-commands/backlogrun-steps.md +12 -11
- package/.claude/skills/workflow-commands/backlogrun.md +1 -1
- package/.claude/skills/workflow-commands/chain-rule.md +43 -28
- package/.claude/skills/workflow-commands/delegation.md +11 -10
- package/.claude/skills/workflow-commands/entry-sequence.md +10 -10
- package/.claude/skills/workflow-commands/followup.md +16 -36
- package/.claude/skills/workflow-commands/fullrun-steps.md +38 -47
- package/.claude/skills/workflow-commands/fullrun.md +3 -3
- package/.claude/skills/workflow-commands/halfrun.md +17 -25
- package/.claude/skills/workflow-commands/issue-comments.md +25 -16
- package/.claude/skills/workflow-commands/issue-fold-existing.md +2 -1
- package/.claude/skills/workflow-commands/issue-scout.md +2 -2
- package/.claude/skills/workflow-commands/kickoff.md +24 -23
- package/.claude/skills/workflow-commands/latest-gate.md +7 -12
- package/.claude/skills/workflow-commands/needs-human-review.md +9 -14
- package/.claude/skills/workflow-commands/observation-filing.md +4 -36
- package/.claude/skills/workflow-commands/observation-ledger.md +6 -4
- package/.claude/skills/workflow-commands/pre-gate-cut.md +22 -37
- package/.claude/skills/workflow-commands/prerequisite.md +11 -16
- package/.claude/skills/workflow-commands/progress-watcher.md +1 -1
- package/.claude/skills/workflow-commands/prrun.md +3 -7
- package/.claude/skills/workflow-commands/retrospective.md +2 -2
- package/.claude/skills/workflow-commands/split-assessment.md +15 -1
- package/.claude/skills/workflow-commands/working-tree-hold.md +9 -9
- package/.codex/hooks.json +5 -5
- package/.github/actions/setup-node/action.yml +9 -0
- package/.github/actions/setup-pnpm/action.yml +10 -17
- package/.github/dependabot.yml +32 -0
- package/.github/release.yml +0 -2
- package/.github/workflows/auto-tag.yml +45 -0
- package/.github/workflows/ci.yml +267 -17
- package/.github/workflows/dependabot-auto-merge.yml +63 -4
- package/.github/workflows/production.yml +8 -0
- package/.github/workflows/publish.yml +67 -46
- package/.github/workflows/sonar-qube.yml +1 -0
- package/.prettierignore +2 -0
- package/.vscode/settings.json +19 -0
- package/.vscode/tasks.json +1 -2
- package/CLAUDE.md +7 -18
- package/README.md +4 -2
- package/SECURITY.md +3 -3
- package/dist/CLAUDE.md +7 -18
- package/dist/commands/document-read-cli.js +883 -0
- package/dist/commands/{document-section-cli.js → document-section-main.js} +81 -38
- package/dist/commands/read-set-cli.js +1927 -0
- package/dist/commands/run-prep-main.js +21174 -0
- package/dist/commands/run-step-cli.js +27733 -0
- package/dist/config-merge/index.js +5 -1
- package/dist/hooks/audit-provision.js +39 -36
- package/dist/hooks/chunk-3GKE653K.js +6204 -0
- package/dist/hooks/chunk-45CJJOO7.js +1243 -0
- package/dist/hooks/chunk-5PM2JRGV.js +7780 -0
- package/dist/hooks/chunk-7SIUNQXK.js +3591 -0
- package/dist/hooks/chunk-CQD4LJE6.js +4858 -0
- package/dist/hooks/{chunk-723HKZO5.js → chunk-OPSRGWFU.js} +1 -1
- package/dist/hooks/chunk-UJ3FPMMM.js +628 -0
- package/dist/hooks/chunk-VVNYJWEI.js +30 -0
- package/dist/hooks/chunk-Z6DQJKH3.js +2806 -0
- package/dist/hooks/codex-hook-adapter.js +10 -22
- package/dist/hooks/format-edited.js +4 -6
- package/dist/hooks/inputs.json +460 -308
- package/dist/hooks/pretool-guard.js +8 -25
- package/dist/hooks/session-lang.js +135 -299
- package/dist/hooks/stop-guard.js +6496 -1799
- package/dist/josh.js +7412 -4228
- package/dist/self-sync-guard/index.js +74 -10
- package/dist/version/index.js +276 -407
- package/eslint/base.js +1 -1
- package/eslint/rules/comment-why-only.js +108 -0
- package/lefthook/base.yml +3 -1
- package/package.json +23 -54
- package/pnpm-workspace.yaml +4 -2
- package/prompts/coding-standards.md +2 -2
- package/prompts/collaboration-workflow/file-edits.md +14 -17
- package/prompts/collaboration-workflow/issue-citation.md +0 -4
- package/prompts/collaboration-workflow/issue-template.md +54 -18
- package/prompts/collaboration-workflow/lane-instructions.md +3 -2
- package/prompts/collaboration-workflow/measurement.md +44 -0
- package/prompts/collaboration-workflow/operating-rules.md +15 -8
- package/prompts/collaboration-workflow/output-bounds.md +6 -7
- package/prompts/collaboration-workflow/plan-comment.md +3 -42
- package/prompts/collaboration-workflow/principles.md +14 -0
- package/prompts/collaboration-workflow/report-format.md +31 -60
- package/prompts/collaboration-workflow/residency.md +3 -2
- package/prompts/collaboration-workflow/rule-delivery.md +13 -1
- package/prompts/collaboration-workflow/shell-body.md +6 -16
- package/prompts/collaboration-workflow/turn-batching.md +0 -2
- package/prompts/collaboration-workflow/upstream-interrupt.md +15 -5
- package/prompts/collaboration-workflow/wip-cap.md +4 -2
- package/prompts/collaboration-workflow.md +3 -7
- package/prompts/refactoring.md +1 -1
- package/prompts/review-rubric.md +9 -2
- package/prompts/review.md +65 -36
- package/prompts/testing-guide.md +9 -43
- package/scripts/agent/agent-argv.ts +14 -16
- package/scripts/agent/agent-event.ts +15 -15
- package/scripts/agent/agent-exit-record.ts +13 -1
- package/scripts/agent/agent-provider.ts +138 -0
- package/scripts/agent/agent-role-profile.ts +108 -156
- package/scripts/agent/agent-safe-text.ts +20 -5
- package/scripts/agent/api-auth.ts +41 -0
- package/scripts/agent/api-outage.ts +1 -1
- package/scripts/agent/api-usage-limit.ts +65 -0
- package/scripts/agent/claude-agent-argv.ts +19 -9
- package/scripts/agent/codex-agent-argv.ts +118 -22
- package/scripts/agent/usage-limit-reset.ts +179 -0
- package/scripts/auth/claude-token-output.ts +2 -2
- package/scripts/auto-ok/auto-ok-author.ts +53 -0
- package/scripts/auto-ok/auto-ok-cli.ts +25 -16
- package/scripts/auto-ok/auto-ok-judge-read.ts +12 -3
- package/scripts/auto-ok/auto-ok-judge-write.ts +46 -19
- package/scripts/auto-ok/auto-ok-judge.ts +13 -2
- package/scripts/auto-ok/auto-ok-main.ts +17 -0
- package/scripts/backlog/backlog-arrival.ts +14 -3
- package/scripts/backlog/backlog-budget-cli.ts +7 -33
- package/scripts/backlog/backlog-budget-main.ts +16 -0
- package/scripts/backlog/backlog-budget.ts +2 -3
- package/scripts/backlog/backlog-defect-priority.ts +5 -4
- package/scripts/backlog/backlog-drive-adopt.ts +67 -0
- package/scripts/backlog/backlog-drive-args.ts +4 -5
- package/scripts/backlog/backlog-drive-cli.ts +118 -28
- package/scripts/backlog/backlog-drive-hold.ts +162 -0
- package/scripts/backlog/backlog-drive-idle.ts +161 -0
- package/scripts/backlog/backlog-drive-judge.ts +25 -0
- package/scripts/backlog/backlog-drive-launch-pass.ts +90 -0
- package/scripts/backlog/backlog-drive-launch.ts +8 -2
- package/scripts/backlog/backlog-drive-memory.ts +126 -0
- package/scripts/backlog/backlog-drive-named-offer.ts +73 -35
- package/scripts/backlog/backlog-drive-named.ts +81 -13
- package/scripts/backlog/backlog-drive-offer-argv.ts +3 -8
- package/scripts/backlog/backlog-drive-paused.ts +170 -0
- package/scripts/backlog/backlog-drive-restore.ts +39 -8
- package/scripts/backlog/backlog-drive-seats.ts +18 -8
- package/scripts/backlog/backlog-drive-token-handling.ts +38 -0
- package/scripts/backlog/backlog-drive.ts +96 -131
- package/scripts/backlog/backlog-gate-scope.ts +61 -0
- package/scripts/backlog/backlog-measure-close.ts +112 -0
- package/scripts/backlog/backlog-next-main.ts +16 -0
- package/scripts/backlog/backlog-next-shared.ts +73 -0
- package/scripts/backlog/backlog-next.ts +78 -56
- package/scripts/backlog/backlog-occupied.ts +52 -39
- package/scripts/backlog/backlog-offer-cli.ts +6 -21
- package/scripts/backlog/backlog-offer-exclude.ts +15 -0
- package/scripts/backlog/backlog-offer-main.ts +12 -0
- package/scripts/backlog/backlog-offer.ts +36 -3
- package/scripts/backlog/backlog-overlap.ts +62 -10
- package/scripts/backlog/backlog-plan-cli.ts +4 -1
- package/scripts/backlog/backlog-plan-comment.ts +81 -0
- package/scripts/backlog/backlog-plan-read.ts +22 -5
- package/scripts/backlog/backlog-plan.ts +18 -4
- package/scripts/backlog/backlog-pool.ts +60 -22
- package/scripts/backlog/backlog-rank.ts +70 -15
- package/scripts/backlog/backlog-ready.ts +112 -30
- package/scripts/backlog/backlog-stalled-detect.ts +110 -36
- package/scripts/backlog/backlog-stalled.ts +52 -16
- package/scripts/backlog/backlog-wait-cause.ts +86 -0
- package/scripts/backlog/backlog-waves.ts +56 -15
- package/scripts/backlog/backlogrun-args.ts +19 -7
- package/scripts/backlog/backlogrun-cli.ts +19 -5
- package/scripts/backlog/backlogrun-launch.ts +13 -4
- package/scripts/backlog/backlogrun-restart.ts +97 -0
- package/scripts/backlog/backlogrun-stop.ts +79 -7
- package/scripts/behavior/behavior-cli.ts +2 -2
- package/scripts/behavior/behavior-rules.ts +47 -24
- package/scripts/build/build-bin.ts +2 -16
- package/scripts/build/build-claude-md.ts +0 -7
- package/scripts/build/build-commands.ts +0 -13
- package/scripts/build/build-hooks.ts +49 -48
- package/scripts/build/hook-bundle-stamp.ts +29 -11
- package/scripts/build/local-bin.ts +1 -1
- package/scripts/cases/cases-cli.ts +25 -13
- package/scripts/cases/cases-interaction-scan.ts +134 -0
- package/scripts/cases/cases-interaction.ts +183 -0
- package/scripts/cases/cases-logic.ts +39 -6
- package/scripts/ci/pr-classification-main.ts +18 -0
- package/scripts/ci/pr-classification.ts +10 -17
- package/scripts/clone/clone-scan.ts +1 -1
- package/scripts/cost-runtime/context-cut-payback.ts +27 -25
- package/scripts/cost-runtime/cost-blocks.ts +22 -37
- package/scripts/cost-runtime/cost-cli.ts +67 -29
- package/scripts/cost-runtime/cost-main.ts +12 -0
- package/scripts/cost-runtime/cost-pricing.ts +9 -0
- package/scripts/cost-runtime/cost-transcript.ts +1 -0
- package/scripts/cost-runtime/cost-verdict.ts +4 -1
- package/scripts/delegation/delegation-policy.ts +18 -5
- package/scripts/delegation/duplicate-read-guard.ts +1 -8
- package/scripts/delegation/investigation-guard.ts +12 -8
- package/scripts/delegation/investigation-reads.ts +48 -27
- package/scripts/dependabot/dependabot-cooldown.ts +195 -0
- package/scripts/discovery/repo-discovery.ts +24 -6
- package/scripts/discovery/repo-party.ts +80 -20
- package/scripts/discovery/session-owner-pin.ts +51 -0
- package/scripts/doctor/doctor-consumer.ts +2 -5
- package/scripts/document/capped-print.ts +1 -1
- package/scripts/document/command-reference-line-budget.ts +42 -0
- package/scripts/document/document-byte-budget.ts +18 -6
- package/scripts/document/document-checks.ts +20 -0
- package/scripts/document/document-ratchet-check.ts +101 -0
- package/scripts/document/document-scan.ts +1 -1
- package/scripts/document/document-section-cli.ts +0 -8
- package/scripts/document/document-section-main.ts +12 -0
- package/scripts/document/document-section.ts +1 -0
- package/scripts/document/entry-read-budget.ts +7 -3
- package/scripts/document/issue-citation-budget.ts +94 -0
- package/scripts/epic/epic-audit-cli.ts +12 -6
- package/scripts/epic/epic-bundle-apply.ts +137 -0
- package/scripts/epic/epic-bundle-cli.ts +32 -121
- package/scripts/epic/epic-bundle-format.ts +116 -0
- package/scripts/epic/epic-bundle-main.ts +17 -0
- package/scripts/epic/epic-busy.ts +5 -12
- package/scripts/epic/epic-classify.ts +24 -15
- package/scripts/epic/epic-cli-argv.ts +33 -2
- package/scripts/epic/epic-cli-decide.ts +42 -0
- package/scripts/epic/epic-cli.ts +6 -38
- package/scripts/epic/epic-close.ts +112 -55
- package/scripts/epic/epic-cross-repo.ts +4 -7
- package/scripts/epic/epic-decide.ts +119 -0
- package/scripts/epic/epic-decision.ts +9 -0
- package/scripts/epic/epic-fetch.ts +6 -0
- package/scripts/epic/epic-graph.ts +8 -1
- package/scripts/epic/epic-issue.ts +8 -2
- package/scripts/epic/epic-label-age.ts +1 -1
- package/scripts/epic/epic-lane-offer.ts +39 -4
- package/scripts/epic/epic-next-main.ts +24 -0
- package/scripts/epic/epic-next.ts +6 -24
- package/scripts/epic/epic-outside-blocker.ts +6 -2
- package/scripts/epic/epic-parse.ts +9 -3
- package/scripts/epic/epic-rank.ts +5 -0
- package/scripts/epic/epic-read.ts +1 -0
- package/scripts/epic/epic-reconcile.ts +39 -0
- package/scripts/epic/epic-run.ts +10 -1
- package/scripts/epic/epic-solo.ts +50 -14
- package/scripts/epic/epic.ts +41 -7
- package/scripts/exports/unused-members-check.ts +62 -0
- package/scripts/exports/unused-members-cli.ts +6 -51
- package/scripts/followup/followup-checks-event.ts +8 -3
- package/scripts/followup/followup-ci-path.ts +67 -0
- package/scripts/followup/followup-coderabbit-retrigger.ts +261 -0
- package/scripts/followup/followup-coderabbit-wait.ts +85 -0
- package/scripts/followup/followup-failed-tests.ts +160 -0
- package/scripts/followup/followup-job-needs.ts +100 -0
- package/scripts/followup/followup-job-rerun.ts +303 -0
- package/scripts/followup/followup-main-move.ts +113 -0
- package/scripts/followup/followup-review-gates.ts +81 -0
- package/scripts/followup/git-followup-finish.ts +43 -11
- package/scripts/followup/git-followup-pending.ts +3 -3
- package/scripts/followup/git-followup-stages.ts +52 -12
- package/scripts/followup/git-followup-workflow.ts +19 -66
- package/scripts/followup/git-pr-followup-checks.ts +55 -16
- package/scripts/followup/git-pr-followup-wrapup.ts +32 -18
- package/scripts/followup/git-pr-followup.ts +96 -33
- package/scripts/fresh-machine/fresh-machine-cli.ts +1 -1
- package/scripts/fresh-machine/fresh-machine-run.ts +8 -8
- package/scripts/fresh-machine/fresh-machine-script.ts +5 -9
- package/scripts/fresh-machine/specs/kit-test-backlogrun-python.json +2 -2
- package/scripts/fresh-machine/specs/kit-test-backlogrun.json +3 -3
- package/scripts/gate/busy-average.ts +90 -0
- package/scripts/gate/check-cpu.ts +60 -0
- package/scripts/gate/check-inputs.ts +39 -95
- package/scripts/gate/check-related-pinned.ts +43 -0
- package/scripts/gate/check-related-reuse.ts +64 -0
- package/scripts/gate/check-related-section.ts +57 -0
- package/scripts/gate/check-related-unplanned.ts +34 -0
- package/scripts/gate/check-related.ts +265 -0
- package/scripts/gate/check-reuse.ts +33 -54
- package/scripts/gate/command-memory.ts +192 -0
- package/scripts/gate/core-admission.ts +236 -28
- package/scripts/gate/core-budget-timing.ts +51 -0
- package/scripts/gate/core-budget.ts +111 -100
- package/scripts/gate/core-wait-record.ts +49 -0
- package/scripts/gate/core-wait.ts +62 -7
- package/scripts/gate/core-weights.ts +94 -0
- package/scripts/gate/free-cores.ts +27 -4
- package/scripts/gate/gate-labels.ts +46 -0
- package/scripts/gate/gate-ledger.ts +44 -8
- package/scripts/gate/gate-plan.ts +130 -78
- package/scripts/gate/gate-report.ts +23 -9
- package/scripts/gate/gate-run-steps.ts +77 -9
- package/scripts/gate/gate-skip.ts +57 -8
- package/scripts/gate/gate-static-group.ts +60 -0
- package/scripts/gate/gate-steps.ts +14 -2
- package/scripts/gate/gate-tree.ts +4 -2
- package/scripts/gate/hook-gate-reuse.ts +19 -2
- package/scripts/gate/input-fingerprint.ts +42 -0
- package/scripts/gate/machine-capacity.ts +65 -31
- package/scripts/gate/metrics-totals.ts +59 -0
- package/scripts/gate/moved-paths.ts +67 -0
- package/scripts/gate/project-checks.ts +5 -12
- package/scripts/gate/scoped-green.ts +76 -19
- package/scripts/gate/since-green.ts +70 -0
- package/scripts/gate/structural-checks.ts +96 -0
- package/scripts/gate/toolchain-inputs.ts +115 -0
- package/scripts/gate/verification-gate.ts +70 -32
- package/scripts/gate/verification-inputs.ts +265 -0
- package/scripts/gate/verification-tail.ts +52 -0
- package/scripts/gh/gh-author-association.ts +117 -9
- package/scripts/gh/git-ai-review-scan.ts +5 -3
- package/scripts/gh/git-gh-api-path.ts +26 -2
- package/scripts/gh/git-gh-branch-rules.ts +73 -0
- package/scripts/gh/git-gh-comments-unreadable.ts +36 -0
- package/scripts/gh/git-gh-conditional.ts +5 -2
- package/scripts/gh/git-gh-exec.ts +32 -2
- package/scripts/gh/git-gh-issue-read.ts +7 -1
- package/scripts/gh/git-gh-issue-rest.ts +1 -0
- package/scripts/gh/git-gh-issue-write.ts +75 -31
- package/scripts/gh/git-gh-issue.ts +19 -8
- package/scripts/gh/git-gh-poll-read.ts +89 -0
- package/scripts/gh/git-gh-pr-auto-merge.ts +21 -9
- package/scripts/gh/git-gh-pr-graphql-state.ts +56 -0
- package/scripts/gh/git-gh-pr-read.ts +74 -13
- package/scripts/gh/git-gh-pr-rest.ts +4 -2
- package/scripts/gh/git-gh-pr-snapshot.ts +48 -20
- package/scripts/gh/git-gh-pr-too-large.ts +20 -0
- package/scripts/gh/git-gh-pr.ts +48 -22
- package/scripts/gh/git-gh-retry.ts +141 -0
- package/scripts/gh/git-pr-ai-review.ts +15 -6
- package/scripts/gh/git-pr-checks-eval.ts +42 -7
- package/scripts/gh/git-pr-checks-parse.ts +39 -9
- package/scripts/gh/git-pr-checks.ts +5 -5
- package/scripts/gh/git-pr-merge-checked.ts +80 -0
- package/scripts/git/base-tree.ts +49 -2
- package/scripts/git/change-base.ts +4 -10
- package/scripts/git/changed-file-scope.ts +6 -4
- package/scripts/git/changed-paths-sync.ts +63 -0
- package/scripts/git/changed-paths.ts +34 -2
- package/scripts/git/git-common-directory.ts +11 -1
- package/scripts/git/git-diff-reads.ts +91 -20
- package/scripts/git/git-error.ts +9 -2
- package/scripts/git/git-grep-hits.ts +85 -0
- package/scripts/git/git-location-environment.ts +1 -1
- package/scripts/git/git-merge-conflicts.ts +83 -0
- package/scripts/git/git-preflight.ts +37 -12
- package/scripts/git/git-push-transport.ts +1 -2
- package/scripts/git/git-schemas.ts +30 -7
- package/scripts/git/git-spawn.ts +1 -2
- package/scripts/git/git-status.ts +4 -4
- package/scripts/git/git-worktree.ts +13 -0
- package/scripts/git/gone-branch.ts +4 -1
- package/scripts/git/main-merge-budget-conflict.ts +89 -0
- package/scripts/git/main-merge-guard.ts +55 -18
- package/scripts/git/main-merge-main.ts +12 -0
- package/scripts/git/main-merge-regenerate.ts +59 -25
- package/scripts/git/main-merge.ts +77 -13
- package/scripts/git/main-sync-main.ts +12 -0
- package/scripts/git/main-sync.ts +0 -9
- package/scripts/git/no-base-checkout.ts +127 -0
- package/scripts/git/stash/git-stash.ts +38 -6
- package/scripts/git/stash/{stash-pop-args.ts → stash-args.ts} +13 -10
- package/scripts/git/stash/stash-pop-cli.ts +6 -12
- package/scripts/git/stash/stash-pop-main.ts +12 -0
- package/scripts/git/stash/stash-push-cli.ts +86 -0
- package/scripts/git/stash/stash-push-main.ts +12 -0
- package/scripts/hooks/batch-guard.ts +38 -27
- package/scripts/hooks/check-commit-message-main.ts +8 -0
- package/scripts/hooks/check-commit-message.ts +4 -7
- package/scripts/hooks/edited-cspell.ts +37 -11
- package/scripts/hooks/format-edited-file.ts +29 -25
- package/scripts/hooks/lane-plan-guard.ts +50 -0
- package/scripts/hooks/pre-commit-lint-switch.ts +9 -0
- package/scripts/hooks/pre-commit-lint.ts +44 -4
- package/scripts/hooks/pre-push-related-switch.ts +10 -0
- package/scripts/hooks/pre-push-unit.ts +77 -9
- package/scripts/hooks/pretool-guard-cli.ts +1 -8
- package/scripts/hooks/pretool-guard.ts +34 -19
- package/scripts/hooks/reserved-run.ts +81 -10
- package/scripts/hooks/run-hook.sh +30 -6
- package/scripts/hooks/shell-rules-notice.ts +37 -0
- package/scripts/hooks/step-zero-notice.ts +6 -1
- package/scripts/hooks/stop-actions.ts +5 -36
- package/scripts/hooks/stop-guard.ts +20 -15
- package/scripts/init/distributed-paths.ts +1 -0
- package/scripts/init/hook-command-rewrite.ts +23 -5
- package/scripts/init/hook-launch.ts +17 -17
- package/scripts/init/init-actions.ts +0 -6
- package/scripts/init/init-ai-copy.ts +10 -36
- package/scripts/init/init-bootstrap.ts +9 -8
- package/scripts/init/init-dry-run-report.ts +1 -1
- package/scripts/init/init-dry-run.ts +1 -1
- package/scripts/init/init-file-action.ts +7 -9
- package/scripts/init/init-logic-json-merge.ts +2 -2
- package/scripts/init/init-logic-migrate.ts +9 -82
- package/scripts/init/init-logic.ts +3 -2
- package/scripts/init/init-main.ts +12 -0
- package/scripts/init/init.ts +5 -12
- package/scripts/init/kit-development-versions.ts +3 -7
- package/scripts/init/kit-written-paths.ts +2 -2
- package/scripts/init/project-profile.ts +5 -4
- package/scripts/init/tsconfig-preset-migration.ts +2 -1
- package/scripts/init/vscode-tasks.ts +1 -1
- package/scripts/issue/aggregation-split.ts +52 -0
- package/scripts/issue/defect-origin-cli.ts +106 -0
- package/scripts/issue/defect-origin-line.ts +78 -0
- package/scripts/issue/defect-origin-main.ts +11 -0
- package/scripts/issue/defect-origin.ts +114 -0
- package/scripts/issue/defect-rate-cli.ts +38 -179
- package/scripts/issue/defect-rate.ts +0 -16
- package/scripts/issue/defect-report-cli.ts +128 -0
- package/scripts/issue/defect-report-format.ts +56 -0
- package/scripts/issue/defect-report-main.ts +11 -0
- package/scripts/issue/defect-report.ts +160 -0
- package/scripts/issue/effect-audit-cli.ts +178 -0
- package/scripts/issue/effect-audit.ts +185 -0
- package/scripts/issue/expected-effect-lint.ts +65 -9
- package/scripts/issue/git-next-issues.ts +5 -0
- package/scripts/issue/issue-already-done-cli.ts +62 -0
- package/scripts/issue/issue-body-or-comment.ts +74 -0
- package/scripts/issue/issue-cite-cli.ts +1 -12
- package/scripts/issue/issue-cite-main.ts +12 -0
- package/scripts/issue/issue-classification.ts +13 -7
- package/scripts/issue/issue-closing-pr.ts +8 -1
- package/scripts/issue/issue-comment-cli.ts +10 -24
- package/scripts/issue/issue-comment-main.ts +12 -0
- package/scripts/issue/issue-evidence-exit.ts +102 -0
- package/scripts/issue/issue-file-cap.ts +58 -0
- package/scripts/issue/issue-file-cli.ts +131 -36
- package/scripts/issue/issue-file-deferral.ts +52 -0
- package/scripts/issue/issue-file-fold.ts +29 -10
- package/scripts/issue/issue-file-interrupt.ts +85 -0
- package/scripts/issue/issue-file-lane-hint.ts +30 -0
- package/scripts/issue/issue-file.ts +56 -19
- package/scripts/issue/issue-fold-cli.ts +2 -11
- package/scripts/issue/issue-fold-main.ts +12 -0
- package/scripts/issue/issue-labels.ts +97 -89
- package/scripts/issue/issue-lint-cli.ts +29 -12
- package/scripts/issue/issue-lint-main.ts +12 -0
- package/scripts/issue/issue-measured-cli.ts +34 -0
- package/scripts/issue/issue-measured-close.ts +58 -0
- package/scripts/issue/issue-merged.ts +19 -2
- package/scripts/issue/issue-not-before-label.ts +135 -0
- package/scripts/issue/issue-not-before.ts +114 -0
- package/scripts/issue/issue-number-shape.ts +15 -1
- package/scripts/issue/issue-park.ts +28 -0
- package/scripts/issue/issue-plan-cli.ts +151 -0
- package/scripts/issue/issue-priority-cli.ts +60 -0
- package/scripts/issue/issue-priority-raise.ts +55 -0
- package/scripts/issue/issue-priority.ts +282 -0
- package/scripts/issue/issue-rank.ts +27 -4
- package/scripts/issue/issue-read-cli.ts +35 -16
- package/scripts/issue/issue-read-main.ts +12 -0
- package/scripts/issue/issue-read.ts +62 -13
- package/scripts/issue/issue-release-cli.ts +0 -10
- package/scripts/issue/issue-release-main.ts +13 -0
- package/scripts/issue/issue-release.ts +7 -12
- package/scripts/issue/issue-sample-gate.ts +213 -0
- package/scripts/issue/issue-sample-prime.ts +127 -0
- package/scripts/issue/issue-sample-required.ts +57 -0
- package/scripts/issue/issue-sample-source.ts +77 -0
- package/scripts/issue/issue-scout-cli.ts +0 -11
- package/scripts/issue/issue-scout-main.ts +14 -0
- package/scripts/issue/issue-search.ts +124 -0
- package/scripts/issue/issue-state-cli.ts +0 -10
- package/scripts/issue/issue-state-main.ts +12 -0
- package/scripts/issue/issue-state.ts +13 -1
- package/scripts/issue/issue-template-section.ts +43 -0
- package/scripts/issue/issue-watch-diff.ts +87 -16
- package/scripts/issue/issue-watch-hook.ts +11 -2
- package/scripts/issue/issue-watch.ts +55 -11
- package/scripts/issue/issue-wip.ts +2 -7
- package/scripts/issue/markdown-section.ts +1 -0
- package/scripts/issue/measure-declaration.ts +121 -0
- package/scripts/issue/measure-rerun-cli.ts +7 -65
- package/scripts/issue/plan-consumers-cli.ts +39 -0
- package/scripts/issue/plan-consumers-main.ts +11 -0
- package/scripts/issue/plan-consumers-section.ts +76 -0
- package/scripts/issue/plan-consumers.ts +127 -0
- package/scripts/issue/reproduction-measure.ts +3 -1
- package/scripts/issue/size-estimate.ts +90 -0
- package/scripts/issue/trusted-measure.ts +84 -0
- package/scripts/josh/agent-session-environment.ts +1 -1
- package/scripts/josh/command-usage.ts +17 -44
- package/scripts/josh/durable-state-migrate.ts +105 -0
- package/scripts/josh/durable-state.ts +112 -0
- package/scripts/josh/file-map-stamp.ts +49 -16
- package/scripts/josh/hook-decision.ts +32 -20
- package/scripts/josh/josh-aliases.ts +95 -0
- package/scripts/josh/josh-command-map.ts +1 -79
- package/scripts/josh/josh-command-types.ts +12 -6
- package/scripts/josh/josh-commands-agent-hooks.ts +83 -0
- package/scripts/josh/josh-commands-ai.ts +160 -161
- package/scripts/josh/josh-commands-backlog.ts +82 -16
- package/scripts/josh/josh-commands-clone.ts +1 -0
- package/scripts/josh/josh-commands-development.ts +142 -101
- package/scripts/josh/josh-commands-document.ts +43 -1
- package/scripts/josh/josh-commands-epic.ts +171 -0
- package/scripts/josh/josh-commands-hooks.ts +25 -2
- package/scripts/josh/josh-commands-issue-write.ts +200 -0
- package/scripts/josh/josh-commands-issue.ts +156 -24
- package/scripts/josh/josh-commands-lane.ts +187 -3
- package/scripts/josh/josh-commands-lint.ts +34 -10
- package/scripts/josh/josh-commands-maintenance.ts +127 -4
- package/scripts/josh/josh-commands-pause.ts +29 -0
- package/scripts/josh/josh-commands-progress.ts +87 -0
- package/scripts/josh/josh-commands-project.ts +138 -9
- package/scripts/josh/josh-commands-review.ts +159 -0
- package/scripts/josh/josh-commands-run.ts +211 -23
- package/scripts/josh/josh-commands-ship.ts +217 -0
- package/scripts/josh/josh-commands-split.ts +9 -0
- package/scripts/josh/josh-commands-test-check.ts +80 -0
- package/scripts/josh/josh-commands-versioning.ts +49 -2
- package/scripts/josh/josh-commands-workflow.ts +144 -6
- package/scripts/josh/josh-environment-file.ts +43 -3
- package/scripts/josh/josh-in-process.ts +2 -2
- package/scripts/josh/josh-logic.ts +11 -16
- package/scripts/josh/josh-run.ts +19 -1
- package/scripts/josh/package-directory.ts +2 -4
- package/scripts/josh/process-identity.ts +13 -4
- package/scripts/josh/run-record-path.ts +15 -0
- package/scripts/josh/session-language-cli.ts +4 -8
- package/scripts/josh/session-language-main.ts +13 -0
- package/scripts/josh/session-language.ts +6 -1
- package/scripts/josh/shared-cache.ts +90 -0
- package/scripts/josh/stamp-file.ts +20 -17
- package/scripts/lane/lane-adopt-cli.ts +98 -0
- package/scripts/lane/lane-adopt.ts +208 -0
- package/scripts/lane/lane-await.ts +56 -20
- package/scripts/lane/lane-baseline.ts +123 -0
- package/scripts/lane/lane-breakdown-cli.ts +64 -0
- package/scripts/lane/lane-breakdown-implement.ts +170 -0
- package/scripts/lane/lane-breakdown-laps.ts +107 -0
- package/scripts/lane/lane-breakdown-pinned.ts +76 -0
- package/scripts/lane/lane-breakdown-text.ts +145 -0
- package/scripts/lane/lane-breakdown.ts +239 -0
- package/scripts/lane/lane-cache.ts +5 -30
- package/scripts/lane/lane-capacity.ts +14 -23
- package/scripts/lane/lane-check-stats.ts +84 -22
- package/scripts/lane/lane-child-invocation.ts +17 -2
- package/scripts/lane/lane-child-mark-keys.ts +12 -0
- package/scripts/lane/lane-child-marker.ts +20 -1
- package/scripts/lane/lane-ci-path-stats.ts +73 -0
- package/scripts/lane/lane-claim-stats.ts +84 -0
- package/scripts/lane/lane-cli.ts +15 -5
- package/scripts/lane/lane-close.ts +91 -18
- package/scripts/lane/lane-core-wait-stats.ts +66 -0
- package/scripts/lane/lane-dispatch-log.ts +3 -3
- package/scripts/lane/lane-dispatch.ts +26 -5
- package/scripts/lane/lane-gap-stats.ts +157 -0
- package/scripts/lane/lane-guard-policy.ts +7 -1
- package/scripts/lane/lane-handoff.ts +69 -1
- package/scripts/lane/lane-held-stats.ts +129 -0
- package/scripts/lane/lane-implement-stats.ts +207 -0
- package/scripts/lane/lane-implement-subagents.ts +90 -0
- package/scripts/lane/lane-install.ts +4 -11
- package/scripts/lane/lane-investigation-switch.ts +16 -0
- package/scripts/lane/lane-launch-cli.ts +0 -9
- package/scripts/lane/lane-launch-main.ts +12 -0
- package/scripts/lane/lane-ledger-kind.ts +31 -0
- package/scripts/lane/lane-ledger-schema-ship.ts +49 -0
- package/scripts/lane/lane-ledger-schema.ts +349 -0
- package/scripts/lane/lane-ledger-write.ts +257 -0
- package/scripts/lane/lane-ledger.ts +56 -233
- package/scripts/lane/lane-limit-cli.ts +12 -1
- package/scripts/lane/lane-load.ts +1 -1
- package/scripts/lane/lane-measure-cli.ts +193 -30
- package/scripts/lane/lane-net-read.ts +44 -0
- package/scripts/lane/lane-net-time.ts +212 -0
- package/scripts/lane/lane-open.ts +25 -8
- package/scripts/lane/lane-output.ts +2 -4
- package/scripts/lane/lane-overrun-prompt.ts +147 -0
- package/scripts/lane/lane-overrun.ts +274 -0
- package/scripts/lane/lane-parked.ts +3 -3
- package/scripts/lane/lane-paths.ts +24 -1
- package/scripts/lane/lane-pause-cli.ts +133 -0
- package/scripts/lane/lane-pause.ts +158 -0
- package/scripts/lane/lane-paused-spans.ts +97 -0
- package/scripts/lane/lane-plan-check.ts +207 -0
- package/scripts/lane/lane-plan-cli.ts +41 -0
- package/scripts/lane/lane-plan.ts +144 -0
- package/scripts/lane/lane-process-table.ts +166 -0
- package/scripts/lane/lane-reap-settle.ts +124 -0
- package/scripts/lane/lane-reap.ts +50 -15
- package/scripts/lane/lane-registry.ts +38 -4
- package/scripts/lane/lane-relaunch.ts +1 -1
- package/scripts/lane/lane-residents.ts +162 -0
- package/scripts/lane/lane-restart.ts +22 -2
- package/scripts/lane/lane-round-one-stats.ts +51 -0
- package/scripts/lane/lane-round-two-stats.ts +49 -0
- package/scripts/lane/lane-sampler.ts +26 -3
- package/scripts/lane/lane-session-action.ts +112 -23
- package/scripts/lane/lane-session-broker.ts +146 -37
- package/scripts/lane/lane-session-reread-main.ts +14 -0
- package/scripts/lane/lane-session-reread.ts +51 -0
- package/scripts/lane/lane-ship-lap-stats.ts +74 -0
- package/scripts/lane/lane-sleep.ts +58 -0
- package/scripts/lane/lane-snapshot-trace.ts +84 -0
- package/scripts/lane/lane-spans.ts +51 -0
- package/scripts/lane/lane-spent.ts +7 -4
- package/scripts/lane/lane-split-stats.ts +28 -0
- package/scripts/lane/lane-stage-stats.ts +20 -3
- package/scripts/lane/lane-state.ts +334 -0
- package/scripts/lane/lane-stats-tables.ts +58 -0
- package/scripts/lane/lane-stats.ts +74 -4
- package/scripts/lane/lane-stop-stats.ts +145 -37
- package/scripts/lane/lane-tail-stats.ts +32 -0
- package/scripts/lane/lane-test-related-stats.ts +127 -0
- package/scripts/lane/lane-transcript-calls.ts +202 -0
- package/scripts/lane/lane-transcript-stats.ts +200 -0
- package/scripts/lane/lane-vacant.ts +13 -3
- package/scripts/lane/lane-value-cell.ts +72 -0
- package/scripts/lane/lane-value.ts +118 -0
- package/scripts/lane/lane-withdraw-cli.ts +5 -4
- package/scripts/lane/lane-withdraw-closed.ts +124 -0
- package/scripts/lane/lane-withdraw.ts +149 -71
- package/scripts/lane/lane-yield.ts +85 -0
- package/scripts/lane/openai-lane-ship.ts +12 -11
- package/scripts/lane/openai-lane-supervisor-decision.ts +6 -8
- package/scripts/lane/openai-lane-supervisor-owner.ts +5 -8
- package/scripts/lane/openai-lane-supervisor.ts +5 -4
- package/scripts/lane/process-directories.ts +70 -0
- package/scripts/lane/process-lane-marks.ts +94 -0
- package/scripts/lib/atomic-write.ts +62 -0
- package/scripts/lib/buffered-process.ts +12 -5
- package/scripts/lib/cli-flags.ts +53 -0
- package/scripts/lib/figure-format.ts +63 -0
- package/scripts/lib/json-value.ts +9 -1
- package/scripts/lib/package-manifest.ts +35 -0
- package/scripts/lib/poll.ts +38 -9
- package/scripts/lib/read-file.ts +3 -1
- package/scripts/lib/settled-together.ts +10 -0
- package/scripts/lib/shell-quote.ts +21 -0
- package/scripts/lib/stamped-memo.ts +63 -0
- package/scripts/lib/stdout-on-stderr.ts +24 -0
- package/scripts/lib/timeouts.ts +9 -0
- package/scripts/lib/token-shape.ts +111 -0
- package/scripts/lib/transcript-record.ts +91 -0
- package/scripts/lines/effective-limit.ts +1 -1
- package/scripts/lint/eslint-cache-dependencies.ts +145 -0
- package/scripts/lint/eslint-daemon-sources.ts +79 -0
- package/scripts/lint/eslint-daemon.ts +304 -0
- package/scripts/lint/eslint-warm-cli.ts +7 -0
- package/scripts/lint/eslint-warm.ts +66 -0
- package/scripts/lint/format.ts +11 -2
- package/scripts/lint/import-graph.ts +409 -0
- package/scripts/lint/lint-gate-scope.ts +102 -0
- package/scripts/lint/lint-parallel-main.ts +19 -0
- package/scripts/lint/lint-parallel.ts +113 -33
- package/scripts/lint/lint-related-scope.ts +30 -24
- package/scripts/lint/lint-related.ts +183 -30
- package/scripts/lint/rename-cli.ts +179 -0
- package/scripts/lint/rename-identifier.ts +192 -0
- package/scripts/lint/type-only-imports.ts +58 -0
- package/scripts/notify/confirmation-options.ts +1 -2
- package/scripts/notify/telegram-notify.ts +32 -23
- package/scripts/notify/telegram-test-logic.ts +0 -1
- package/scripts/notify/telegram-test-main.ts +8 -0
- package/scripts/notify/telegram-test.ts +2 -6
- package/scripts/observations/observation-ledger.ts +13 -0
- package/scripts/observations/observation-record.ts +42 -16
- package/scripts/observations/observations-flush-landing.ts +5 -3
- package/scripts/observations/observations-flush.ts +38 -10
- package/scripts/overrides/overrides-check.ts +11 -6
- package/scripts/overrides/overrides-files.ts +2 -1
- package/scripts/overrides/overrides-logic.ts +3 -6
- package/scripts/package/verify-optional-eslint-install.ts +8 -6
- package/scripts/propagate/propagate-publish.ts +2 -7
- package/scripts/propagate/propagate-targets.ts +4 -12
- package/scripts/refactor/import-graph.ts +9 -7
- package/scripts/release/github-release-runs.ts +17 -6
- package/scripts/release/release-approval-prune.ts +24 -0
- package/scripts/release/release-history.ts +1 -3
- package/scripts/release/release-progress.ts +42 -22
- package/scripts/release/release-publish-run.ts +39 -0
- package/scripts/release/release-publish.ts +6 -6
- package/scripts/release/release-scope-cli.ts +0 -10
- package/scripts/release/release-scope-main.ts +12 -0
- package/scripts/repo/repo-setting.ts +3 -6
- package/scripts/repo/required-checks-logic.ts +10 -16
- package/scripts/repo/ruleset-check.ts +4 -3
- package/scripts/report/markdown-shape.ts +28 -0
- package/scripts/report/report-format-reference.ts +17 -1
- package/scripts/report/report-labels.ts +166 -0
- package/scripts/report/report-lint-child-summary.ts +94 -0
- package/scripts/report/report-lint-cli.ts +29 -7
- package/scripts/report/report-lint.ts +85 -128
- package/scripts/report/report-template-cli.ts +59 -0
- package/scripts/report/report-template.ts +112 -0
- package/scripts/review/acceptance-map.ts +1 -0
- package/scripts/review/prose-stale-cli.ts +88 -0
- package/scripts/review/prose-stale-scan.ts +152 -0
- package/scripts/review/removed-tests-check.ts +86 -0
- package/scripts/review/removed-tests.ts +149 -0
- package/scripts/review/review-attest.ts +73 -23
- package/scripts/review/review-brief-cli.ts +138 -23
- package/scripts/review/review-brief-main.ts +12 -0
- package/scripts/review/review-brief-paths.ts +22 -0
- package/scripts/review/review-brief.ts +45 -10
- package/scripts/review/review-code-tree.ts +10 -6
- package/scripts/review/review-comment-carry.ts +47 -0
- package/scripts/review/review-comment-round.ts +111 -30
- package/scripts/review/review-finding-ledger.ts +135 -18
- package/scripts/review/review-finding-text.ts +43 -0
- package/scripts/review/review-interaction.ts +105 -0
- package/scripts/review/review-lane-handover.ts +68 -0
- package/scripts/review/review-lint-cli.ts +57 -0
- package/scripts/review/review-lint-findings.ts +92 -0
- package/scripts/review/review-lint-sections.ts +80 -0
- package/scripts/review/review-lint.ts +221 -0
- package/scripts/review/review-prior-findings.ts +102 -0
- package/scripts/review/review-readers-scan.ts +165 -0
- package/scripts/review/review-record-cli.ts +236 -74
- package/scripts/review/review-record-code-round.ts +55 -0
- package/scripts/review/review-record-comment.ts +60 -0
- package/scripts/review/review-record-interaction.ts +35 -0
- package/scripts/review/review-record-main.ts +12 -0
- package/scripts/review/review-record-pinned.ts +108 -0
- package/scripts/review/review-record.ts +25 -1
- package/scripts/review/review-reviewed-tree.ts +307 -0
- package/scripts/review/review-round-one-blobs.ts +221 -0
- package/scripts/review/review-round-one-closure.ts +62 -0
- package/scripts/review/review-round-reuse.ts +106 -0
- package/scripts/review/review-round2-cli.ts +135 -36
- package/scripts/review/review-round2-skip-comment.ts +55 -0
- package/scripts/review/review-round2.ts +103 -19
- package/scripts/review/review-stamps.ts +23 -1
- package/scripts/review/review-stop-log.ts +110 -0
- package/scripts/review/review-stops-cli.ts +86 -0
- package/scripts/review/review-submit-cli.ts +101 -0
- package/scripts/review/review-tree.ts +6 -17
- package/scripts/review/review-untouched-readers.ts +146 -0
- package/scripts/review/test-titles.ts +118 -0
- package/scripts/rules/agent-model.ts +9 -1
- package/scripts/rules/bash-triggers.ts +49 -6
- package/scripts/rules/concise-reply.ts +88 -0
- package/scripts/rules/credential-body.ts +77 -0
- package/scripts/rules/decision-oracle-batch.ts +9 -1
- package/scripts/rules/decision-oracle.ts +3 -3
- package/scripts/rules/delivered-rules.ts +115 -18
- package/scripts/rules/destructive-command.ts +11 -12
- package/scripts/rules/direct-filing.ts +10 -2
- package/scripts/rules/direct-issue-comment.ts +139 -0
- package/scripts/rules/direct-issue-read.ts +191 -0
- package/scripts/rules/direct-pr-create.ts +72 -26
- package/scripts/rules/early-heartbeat.ts +4 -1
- package/scripts/rules/edit-tool.ts +27 -0
- package/scripts/rules/file-body.ts +7 -0
- package/scripts/rules/file-edit-rows.ts +17 -0
- package/scripts/rules/file-rewrite.ts +146 -0
- package/scripts/rules/firing-point.ts +3 -2
- package/scripts/rules/gh-api.ts +128 -7
- package/scripts/rules/gh-repo-selector.ts +84 -0
- package/scripts/rules/git-argv.ts +72 -14
- package/scripts/rules/git-force.ts +14 -4
- package/scripts/rules/guard-remedy.ts +17 -4
- package/scripts/rules/implementation-cut-verdict.ts +1 -1
- package/scripts/rules/implementation-cut.ts +68 -27
- package/scripts/rules/index-guard.ts +8 -1
- package/scripts/rules/investigator-foreground.ts +231 -0
- package/scripts/rules/issue-citation.ts +15 -60
- package/scripts/rules/issue-comments.ts +18 -5
- package/scripts/rules/josh-git-bare.ts +7 -0
- package/scripts/rules/lane-background.ts +103 -33
- package/scripts/rules/lane-carry-conflict.ts +6 -0
- package/scripts/rules/lane-direct-tool.ts +172 -0
- package/scripts/rules/lane-interactive-ask.ts +12 -2
- package/scripts/rules/lane-park.ts +49 -25
- package/scripts/rules/lane-spilled-read.ts +90 -0
- package/scripts/rules/lane-split-park.ts +11 -3
- package/scripts/rules/lane-switch-main.ts +11 -4
- package/scripts/rules/last-prompt.ts +20 -47
- package/scripts/rules/oracle-consulted.ts +11 -1
- package/scripts/rules/oracle-firing.ts +1 -0
- package/scripts/rules/permission-guards.ts +7 -0
- package/scripts/rules/piped-verification-shapes.ts +110 -0
- package/scripts/rules/piped-verification.ts +68 -18
- package/scripts/rules/poll-loop.ts +78 -8
- package/scripts/rules/pr-merge.ts +123 -0
- package/scripts/rules/pre-gate-cut.ts +3 -3
- package/scripts/rules/protected-files.ts +113 -22
- package/scripts/rules/raw-field-body.ts +6 -0
- package/scripts/rules/reply-language.ts +3 -17
- package/scripts/rules/reply-prose.ts +34 -0
- package/scripts/rules/repo-admin.ts +132 -0
- package/scripts/rules/reviewer-foreground.ts +88 -0
- package/scripts/rules/round-one-check-related.ts +120 -0
- package/scripts/rules/rule-body-guard.ts +13 -15
- package/scripts/rules/rule-list.ts +9 -28
- package/scripts/rules/rule-value-cache.ts +57 -14
- package/scripts/rules/rule-value-candidates.ts +84 -0
- package/scripts/rules/rule-value-cli.ts +106 -39
- package/scripts/rules/rule-value.ts +18 -5
- package/scripts/rules/run-tail-rule.ts +1 -1
- package/scripts/rules/sed-in-place.ts +196 -0
- package/scripts/rules/shell-segments.ts +43 -0
- package/scripts/rules/stop-rule-rows.ts +52 -0
- package/scripts/rules/stop-rules.ts +36 -62
- package/scripts/rules/test-declared-commit.ts +11 -1
- package/scripts/rules/third-party-write.ts +115 -21
- package/scripts/rules/timed-rerun.ts +69 -0
- package/scripts/rules/turn-filings.ts +90 -0
- package/scripts/rules/worktree-guard.ts +32 -7
- package/scripts/run/board/run-board-app-name.ts +23 -0
- package/scripts/run/board/run-board-cli.ts +65 -32
- package/scripts/run/board/run-board-earlier.ts +94 -0
- package/scripts/run/board/run-board-ending-reason.ts +71 -0
- package/scripts/run/board/run-board-estimate-schedule.ts +103 -0
- package/scripts/run/board/run-board-estimate.ts +98 -0
- package/scripts/run/board/run-board-fit.ts +177 -37
- package/scripts/run/board/run-board-fold.ts +123 -0
- package/scripts/run/board/run-board-found.ts +134 -0
- package/scripts/run/board/run-board-fresh.ts +2 -2
- package/scripts/run/board/run-board-gather-live.ts +29 -0
- package/scripts/run/board/run-board-gather-thread.ts +189 -0
- package/scripts/run/board/run-board-gather-worker.ts +29 -0
- package/scripts/run/board/run-board-gather.ts +187 -0
- package/scripts/run/board/run-board-github.ts +118 -38
- package/scripts/run/board/run-board-header.ts +90 -20
- package/scripts/run/board/run-board-keys.ts +58 -0
- package/scripts/run/board/run-board-kind.ts +20 -6
- package/scripts/run/board/run-board-labels.ts +126 -71
- package/scripts/run/board/run-board-lane-state.ts +109 -0
- package/scripts/run/board/run-board-lane-time.ts +123 -0
- package/scripts/run/board/run-board-layout.ts +239 -60
- package/scripts/run/board/run-board-length.ts +52 -0
- package/scripts/run/board/run-board-link.ts +15 -2
- package/scripts/run/board/run-board-machine.ts +8 -4
- package/scripts/run/board/run-board-main.ts +12 -0
- package/scripts/run/board/run-board-notes.ts +59 -32
- package/scripts/run/board/run-board-now.ts +1 -1
- package/scripts/run/board/run-board-operation.ts +19 -35
- package/scripts/run/board/run-board-phase.ts +3 -6
- package/scripts/run/board/run-board-plan-shared.ts +115 -0
- package/scripts/run/board/run-board-plan.ts +56 -4
- package/scripts/run/board/run-board-planning.ts +45 -0
- package/scripts/run/board/run-board-priority.ts +44 -0
- package/scripts/run/board/run-board-process-groups.ts +195 -0
- package/scripts/run/board/run-board-read.ts +197 -28
- package/scripts/run/board/run-board-reason.ts +247 -51
- package/scripts/run/board/run-board-released.ts +35 -0
- package/scripts/run/board/run-board-render-checks.ts +42 -7
- package/scripts/run/board/run-board-render-condition.ts +96 -0
- package/scripts/run/board/run-board-render-drawn.ts +78 -0
- package/scripts/run/board/run-board-render-foot.ts +59 -0
- package/scripts/run/board/run-board-render-found.ts +157 -0
- package/scripts/run/board/run-board-render-icon.ts +35 -0
- package/scripts/run/board/run-board-render-lanes.ts +145 -0
- package/scripts/run/board/run-board-render-lead.ts +89 -0
- package/scripts/run/board/run-board-render-legend.ts +136 -48
- package/scripts/run/board/run-board-render-notes.ts +156 -29
- package/scripts/run/board/run-board-render-processes.ts +196 -0
- package/scripts/run/board/run-board-render-section.ts +119 -0
- package/scripts/run/board/run-board-render-slot.ts +3 -36
- package/scripts/run/board/run-board-render-tail.ts +115 -48
- package/scripts/run/board/run-board-render-time.ts +56 -0
- package/scripts/run/board/run-board-render-title.ts +117 -24
- package/scripts/run/board/run-board-render-waits.ts +104 -20
- package/scripts/run/board/run-board-render.ts +264 -258
- package/scripts/run/board/run-board-roots.ts +54 -0
- package/scripts/run/board/run-board-row-yield.ts +9 -4
- package/scripts/run/board/run-board-setup.ts +1 -12
- package/scripts/run/board/run-board-snapshot.ts +111 -0
- package/scripts/run/board/run-board-spin.ts +3 -5
- package/scripts/run/board/run-board-state.ts +22 -33
- package/scripts/run/board/run-board-status.ts +149 -71
- package/scripts/run/board/run-board-thanks-read.ts +2 -2
- package/scripts/run/board/run-board-tick.ts +158 -114
- package/scripts/run/board/run-board-usage-board.ts +78 -0
- package/scripts/run/board/run-board-usage-lanes.ts +113 -0
- package/scripts/run/board/run-board-usage-listing.ts +93 -0
- package/scripts/run/board/run-board-usage-read.ts +120 -150
- package/scripts/run/board/run-board-usage-rusage.ts +19 -7
- package/scripts/run/board/run-board-usage-text.ts +139 -51
- package/scripts/run/board/run-board-usage-top.ts +102 -0
- package/scripts/run/board/run-board-usage.ts +89 -72
- package/scripts/run/board/run-board-usual.ts +20 -9
- package/scripts/run/carry/run-carry-args.ts +4 -7
- package/scripts/run/carry/run-carry-conversation.ts +1 -1
- package/scripts/run/carry/run-carry-ended.ts +3 -2
- package/scripts/run/carry/run-carry.ts +12 -6
- package/scripts/run/cut/run-cut-cli.ts +33 -133
- package/scripts/run/cut/run-cut-digest.ts +152 -0
- package/scripts/run/cut/run-cut-handoff.ts +54 -10
- package/scripts/run/cut/run-cut-report.ts +24 -3
- package/scripts/run/cut/run-cut-resume.ts +129 -0
- package/scripts/run/cut/run-cut-review.ts +105 -0
- package/scripts/run/cut/run-cut.ts +18 -7
- package/scripts/run/detached-launch.ts +1 -1
- package/scripts/run/entry/run-entry-cli.ts +88 -19
- package/scripts/run/entry/run-entry-spill.ts +83 -0
- package/scripts/run/entry/run-entry-stop.ts +5 -1
- package/scripts/run/entry/run-entry-trust.ts +91 -0
- package/scripts/run/event/run-event-baseline.ts +56 -0
- package/scripts/run/event/run-event-cli.ts +1 -5
- package/scripts/run/event/run-event-filed.ts +18 -6
- package/scripts/run/event/run-event-follow.ts +2 -3
- package/scripts/run/event/run-event-overrun.ts +197 -0
- package/scripts/run/event/run-event-render.ts +10 -10
- package/scripts/run/event/run-event-scope.ts +2 -2
- package/scripts/run/event/run-event-stream-emit.ts +82 -22
- package/scripts/run/event/run-event-stream.ts +58 -10
- package/scripts/run/hold/run-hold-adopt.ts +65 -0
- package/scripts/run/hold/run-hold-cli.ts +93 -22
- package/scripts/run/hold/run-hold-main.ts +12 -0
- package/scripts/run/hold/run-hold-member.ts +37 -0
- package/scripts/run/hold/run-stop-notify.ts +178 -0
- package/scripts/run/merge/run-merge-auth.ts +31 -0
- package/scripts/run/merge/run-merge-cap.ts +57 -0
- package/scripts/run/merge/run-merge-cli.ts +119 -62
- package/scripts/run/merge/run-merge-close.ts +74 -0
- package/scripts/run/merge/run-merge-collect.ts +6 -13
- package/scripts/run/merge/run-merge-driver.ts +71 -0
- package/scripts/run/merge/run-merge-main.ts +12 -0
- package/scripts/run/merge/run-merge-outcome.ts +25 -0
- package/scripts/run/merge/run-merge-restart.ts +39 -0
- package/scripts/run/merge/run-merge-ship.ts +33 -7
- package/scripts/run/merge/run-merge-signals.ts +66 -25
- package/scripts/run/merge/run-merge-steps.ts +162 -107
- package/scripts/run/merge/run-merge-usage-limit.ts +53 -0
- package/scripts/run/merge/run-merge-withdrawn.ts +53 -0
- package/scripts/run/merge/run-merge.ts +76 -48
- package/scripts/run/park/run-park-cli.ts +91 -0
- package/scripts/run/park/run-park.ts +88 -0
- package/scripts/run/park/run-stalled.ts +68 -0
- package/scripts/run/pause/run-pause-cli.ts +73 -0
- package/scripts/run/pause/run-pause.ts +251 -0
- package/scripts/run/progress/run-progress-cli.ts +4 -12
- package/scripts/run/progress/run-progress-clock.ts +1 -1
- package/scripts/run/progress/run-progress-config.ts +6 -14
- package/scripts/run/progress/run-progress-main.ts +12 -0
- package/scripts/run/progress/run-progress.ts +1 -4
- package/scripts/run/review/run-review-cli.ts +306 -20
- package/scripts/run/review/run-review-early-push.ts +121 -0
- package/scripts/run/review/run-review-join-read.ts +94 -0
- package/scripts/run/review/run-review-pinned-accepted.ts +126 -0
- package/scripts/run/review/run-review-pinned-join.ts +216 -0
- package/scripts/run/review/run-review-pinned-steps.ts +383 -0
- package/scripts/run/review/run-review-pinned-tree.ts +37 -0
- package/scripts/run/review/run-review-pinned.ts +53 -0
- package/scripts/run/review/run-review-steps.ts +70 -34
- package/scripts/run/review/run-review.ts +28 -7
- package/scripts/run/run-ending.ts +1 -0
- package/scripts/run/run-invocation.ts +5 -6
- package/scripts/run/run-liveness-cli.ts +6 -8
- package/scripts/run/run-liveness.ts +60 -29
- package/scripts/run/run-next.ts +1 -1
- package/scripts/run/run-parent-cut-hook.ts +3 -4
- package/scripts/run/run-preflight.ts +18 -3
- package/scripts/run/run-prep-cli.ts +1 -10
- package/scripts/run/run-prep-locate.ts +7 -50
- package/scripts/run/run-prep-main.ts +12 -0
- package/scripts/run/run-prep.ts +7 -0
- package/scripts/run/run-report-cli.ts +101 -13
- package/scripts/run/run-report-handoff.ts +114 -0
- package/scripts/run/run-stage-read.ts +2 -6
- package/scripts/run/run-step-cli.ts +17 -5
- package/scripts/run/run-step-lane-plan.ts +27 -0
- package/scripts/run/run-step-section.ts +26 -7
- package/scripts/run/run-step.ts +6 -3
- package/scripts/run/run-stranded-detect.ts +13 -0
- package/scripts/run/run-watcher-guard-cli.ts +1 -1
- package/scripts/run/run-watcher-guard.ts +1 -1
- package/scripts/run/ship/run-ship-args.ts +140 -0
- package/scripts/run/ship/run-ship-body-draft.ts +110 -0
- package/scripts/run/ship/run-ship-brokered-review.ts +106 -0
- package/scripts/run/ship/run-ship-cli.ts +181 -166
- package/scripts/run/ship/run-ship-conflict-probe.ts +59 -0
- package/scripts/run/ship/run-ship-detach.ts +29 -12
- package/scripts/run/ship/run-ship-handover.ts +106 -0
- package/scripts/run/ship/run-ship-infra-retry.ts +74 -0
- package/scripts/run/ship/run-ship-lap.ts +63 -0
- package/scripts/run/ship/run-ship-next.ts +44 -27
- package/scripts/run/ship/run-ship-overlap.ts +49 -7
- package/scripts/run/ship/run-ship-place.ts +103 -0
- package/scripts/run/ship/run-ship-planned.ts +92 -0
- package/scripts/run/ship/run-ship-pre-detach-pinned.ts +197 -0
- package/scripts/run/ship/run-ship-pre-detach-timed.ts +42 -0
- package/scripts/run/ship/run-ship-pre-detach.ts +144 -33
- package/scripts/run/ship/run-ship-preflight.ts +150 -33
- package/scripts/run/ship/run-ship-probe.ts +28 -6
- package/scripts/run/ship/run-ship-relaunch-cap.ts +106 -0
- package/scripts/run/ship/run-ship-relaunch.ts +51 -0
- package/scripts/run/ship/run-ship-removed-rows.ts +61 -0
- package/scripts/run/ship/run-ship-return.ts +183 -25
- package/scripts/run/ship/run-ship-review-reason.ts +24 -0
- package/scripts/run/ship/run-ship-review-steps.ts +296 -171
- package/scripts/run/ship/run-ship-review.ts +222 -35
- package/scripts/run/ship/run-ship-reviewer.ts +303 -0
- package/scripts/run/ship/run-ship-scoped.ts +39 -10
- package/scripts/run/ship/run-ship-stage.ts +101 -16
- package/scripts/run/ship/run-ship-steps.ts +68 -17
- package/scripts/run/ship/run-ship-stop-cause.ts +176 -0
- package/scripts/run/ship/run-ship-stop-context.ts +50 -13
- package/scripts/run/ship/run-ship-stop-text.ts +11 -6
- package/scripts/run/ship/run-ship-sync.ts +212 -34
- package/scripts/run/ship/run-ship-synced-scope.ts +178 -0
- package/scripts/run/ship/run-ship-wait-cli.ts +145 -0
- package/scripts/run/ship/run-ship-waiter.ts +114 -0
- package/scripts/run/ship/run-ship.ts +44 -2
- package/scripts/run/tidy/run-tidy-cli.ts +0 -4
- package/scripts/run/tidy/run-tidy-lanes.ts +3 -0
- package/scripts/run/tidy/run-tidy-main.ts +8 -0
- package/scripts/run/wake/run-wake-caffeinate.ts +48 -0
- package/scripts/run/wake/run-wake-cli.ts +121 -209
- package/scripts/run/wake/run-wake-code.ts +125 -0
- package/scripts/run/wake/run-wake-driver.ts +22 -9
- package/scripts/run/wake/run-wake-finish.ts +137 -0
- package/scripts/run/wake/run-wake-loop.ts +36 -3
- package/scripts/run/wake/run-wake-main.ts +13 -0
- package/scripts/run/wake/run-wake-ports.ts +98 -0
- package/scripts/run/wake/run-wake-session.ts +2 -0
- package/scripts/run/wake/run-wake-takeover.ts +66 -0
- package/scripts/run/wake/run-wake.ts +5 -3
- package/scripts/safe-chain/ci-installer-pin.ts +49 -8
- package/scripts/safe-chain/pack-hook.ts +2 -2
- package/scripts/safe-chain/preinstall-command.ts +2 -1
- package/scripts/safe-chain/project-config.ts +6 -11
- package/scripts/security/secretlint-scan.ts +42 -9
- package/scripts/security/security-audit-main.ts +8 -0
- package/scripts/security/security-audit-provision-logic.ts +0 -11
- package/scripts/security/security-audit-provision-main.ts +20 -0
- package/scripts/security/security-audit-provision.ts +12 -27
- package/scripts/security/security-audit.ts +27 -8
- package/scripts/security/sonar-file.ts +10 -5
- package/scripts/self-sync-guard/self-sync-guard-logic.ts +6 -13
- package/scripts/split/split-assess-cli.ts +2 -2
- package/scripts/split/split-assess.ts +25 -1
- package/scripts/split/split-early-notice.ts +116 -0
- package/scripts/split/split-measure.ts +83 -0
- package/scripts/split/split-resolution.ts +107 -0
- package/scripts/sync/claude-settings-merge.ts +8 -15
- package/scripts/sync/directory-copy-guard.ts +4 -9
- package/scripts/sync/file-content.ts +78 -8
- package/scripts/sync/sync-ai-files.ts +3 -5
- package/scripts/sync/sync-configs.ts +11 -23
- package/scripts/sync/sync-hook-safety.ts +4 -10
- package/scripts/sync/sync-main.ts +11 -0
- package/scripts/sync/sync.ts +25 -37
- package/scripts/test/direct-importers.ts +185 -0
- package/scripts/test/pure-files-entries.ts +83 -0
- package/scripts/test/related-heavy-tests.ts +81 -0
- package/scripts/test/test-declared-changed.ts +2 -2
- package/scripts/test/test-declared.ts +1 -1
- package/scripts/test/test-e2e-guard.ts +25 -1
- package/scripts/test/test-e2e-stamp.ts +38 -0
- package/scripts/test/test-no-base.ts +88 -0
- package/scripts/test/test-pinned-cache-logic.ts +363 -0
- package/scripts/test/test-pinned-cache.ts +337 -0
- package/scripts/test/test-pinned-emit.ts +49 -0
- package/scripts/test/test-pinned-functions.ts +116 -0
- package/scripts/test/test-pinned-ledger.ts +80 -0
- package/scripts/test/test-pinned-logic.ts +333 -0
- package/scripts/test/test-pinned-main.ts +144 -0
- package/scripts/test/test-pinned-pool.ts +73 -0
- package/scripts/test/test-pinned-probe.ts +254 -0
- package/scripts/test/test-pinned-prune-logic.ts +118 -0
- package/scripts/test/test-pinned-reach.ts +194 -0
- package/scripts/test/test-pinned-record.ts +196 -0
- package/scripts/test/test-pinned-rewire.ts +148 -0
- package/scripts/test/test-pinned-spawn.ts +81 -0
- package/scripts/test/test-pinned-stage.ts +70 -0
- package/scripts/test/test-pinned.ts +311 -0
- package/scripts/test/test-reach-cli.ts +61 -0
- package/scripts/test/test-read-map.ts +288 -0
- package/scripts/test/test-read-recording.ts +103 -0
- package/scripts/test/test-read-trace.ts +166 -0
- package/scripts/test/test-red-logic.ts +46 -7
- package/scripts/test/test-red-main.ts +12 -0
- package/scripts/test/test-red.ts +39 -37
- package/scripts/test/test-related-claim.ts +37 -0
- package/scripts/test/test-related-main.ts +21 -0
- package/scripts/test/test-related-moved.ts +91 -0
- package/scripts/test/test-related-record.ts +139 -0
- package/scripts/test/test-related-scope.ts +292 -41
- package/scripts/test/test-related-synced.ts +135 -0
- package/scripts/test/test-related-touched.ts +84 -0
- package/scripts/test/test-related.ts +381 -19
- package/scripts/test/test-unit-guard-main.ts +15 -0
- package/scripts/test/test-unit-guard.ts +66 -25
- package/scripts/test/unit-count-file.ts +37 -0
- package/scripts/test/unit-durations.ts +41 -0
- package/scripts/test/unit-run-marker.ts +162 -0
- package/scripts/test/unit-setup-files.ts +51 -0
- package/scripts/test/unit-worker-share.ts +64 -151
- package/scripts/test/vitest-cache-directory.ts +19 -0
- package/scripts/test/vitest-cli-excludes.ts +14 -0
- package/scripts/test/vitest-failure-summary.ts +111 -0
- package/scripts/test/whole-suite-files.ts +74 -0
- package/scripts/time-runtime/time-background.ts +20 -2
- package/scripts/time-runtime/time-batch-guard.ts +42 -4
- package/scripts/time-runtime/time-bundle-call.ts +1 -1
- package/scripts/time-runtime/time-bundles.ts +40 -8
- package/scripts/time-runtime/time-density-hook.ts +8 -6
- package/scripts/time-runtime/time-followup-stage.ts +1 -3
- package/scripts/time-runtime/time-format.ts +5 -28
- package/scripts/time-runtime/time-markers.ts +12 -3
- package/scripts/time-runtime/time-search-call.ts +38 -0
- package/scripts/time-runtime/time-shell.ts +98 -11
- package/scripts/time-runtime/time-transcript-line.ts +65 -66
- package/scripts/uninstall/uninstall.ts +1 -1
- package/scripts/version/bump-version-main.ts +12 -0
- package/scripts/version/bump-version.ts +25 -25
- package/scripts/version/development-engines-verdict.ts +124 -0
- package/scripts/version/effective-upstream.ts +6 -12
- package/scripts/version/latest-corepack.ts +19 -32
- package/scripts/version/latest-if-required-cli.ts +93 -0
- package/scripts/version/latest-lane-guard-main.ts +8 -0
- package/scripts/version/latest-lane-guard.ts +0 -4
- package/scripts/version/latest-scope-cli.ts +0 -9
- package/scripts/version/latest-scope-main.ts +12 -0
- package/scripts/version/latest-update.ts +5 -5
- package/scripts/version/npm-registry.ts +44 -6
- package/scripts/version/publishable-range-check.ts +5 -16
- package/scripts/version/release-age.ts +1 -1
- package/scripts/version/release-hold.ts +1 -1
- package/scripts/version/release-window.ts +38 -0
- package/scripts/version/running-binary.ts +1 -1
- package/scripts/version/safe-chain-version-update.ts +3 -8
- package/scripts/version/version-targets.ts +6 -28
- package/templates/dependabot.yml +29 -0
- package/templates/gitignore +6 -1
- package/templates/pnpm-workspace.basic.yaml +1 -1
- package/templates/sonar-project.properties +3 -2
- package/templates/workflows/ci.yml +53 -4
- package/templates/workflows/github-release.yml +4 -0
- package/tsconfig.sonar.json +1 -1
- package/.ncurc.json +0 -3
- package/dist/hooks/batch-guard.js +0 -29
- package/dist/hooks/chunk-4KKD2UTK.js +0 -66
- package/dist/hooks/chunk-6TS2JD6D.js +0 -237
- package/dist/hooks/chunk-7DSBJVFH.js +0 -50
- package/dist/hooks/chunk-A65Y4YOR.js +0 -79
- package/dist/hooks/chunk-APUO6U4J.js +0 -2451
- package/dist/hooks/chunk-CDY4NFQG.js +0 -15
- package/dist/hooks/chunk-DGT54IH5.js +0 -161
- package/dist/hooks/chunk-EFXE6C37.js +0 -81
- package/dist/hooks/chunk-GP4IEC4O.js +0 -20
- package/dist/hooks/chunk-JP45SOCJ.js +0 -56
- package/dist/hooks/chunk-LAOV7NLM.js +0 -45
- package/dist/hooks/chunk-M4HGZV7U.js +0 -83
- package/dist/hooks/chunk-O6GDRNJB.js +0 -343
- package/dist/hooks/chunk-PF2NZL2A.js +0 -131
- package/dist/hooks/chunk-PTICX4OL.js +0 -358
- package/dist/hooks/chunk-RT27QRJW.js +0 -6247
- package/dist/hooks/chunk-SYOTDYCI.js +0 -3533
- package/dist/hooks/chunk-TNUMY6NL.js +0 -4838
- package/dist/hooks/chunk-UPUZF3AN.js +0 -279
- package/dist/hooks/chunk-WK6SMBIC.js +0 -3180
- package/dist/hooks/duplicate-read-guard.js +0 -30
- package/dist/hooks/investigation-guard.js +0 -29
- package/scripts/backlog/backlog-stalled-cli.ts +0 -30
- package/scripts/cost-runtime/context-cut-threshold.ts +0 -11
- package/scripts/cost-runtime/cost-format.ts +0 -29
- package/scripts/init/basic-path-migration.ts +0 -24
- package/scripts/issue/issue-backlinks-cli.ts +0 -93
- package/scripts/josh/josh-commands-guard.ts +0 -38
- package/scripts/josh/josh-usage-automation.ts +0 -121
- package/scripts/josh/josh-usage-backlog.ts +0 -180
- package/scripts/josh/josh-usage-developer.ts +0 -230
- package/scripts/josh/josh-usage-hooks.ts +0 -38
- package/scripts/josh/josh-usage-issue.ts +0 -205
- package/scripts/josh/josh-usage-review.ts +0 -101
- package/scripts/josh/josh-usage-run.ts +0 -252
- package/scripts/josh/josh-usage-session.ts +0 -238
- package/scripts/josh/josh-usage-workflow.ts +0 -212
- package/scripts/lint/cross-file-recheck.ts +0 -155
- package/scripts/registry-migration/migrate-logic.ts +0 -237
- package/scripts/registry-migration/migrate.ts +0 -292
- package/scripts/registry-migration/user-npmrc.ts +0 -15
- package/scripts/rules/filing-cap.ts +0 -132
- package/scripts/rules/rule-guard.ts +0 -23
- package/scripts/rules/rule-registry-rows.ts +0 -292
- package/scripts/rules/rule-registry.ts +0 -112
- package/scripts/run/run-stranded-cli.ts +0 -27
|
@@ -0,0 +1,311 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs'
|
|
2
|
+
import { readFile } from 'node:fs/promises'
|
|
3
|
+
import { change_base } from '#scripts/git/change-base'
|
|
4
|
+
import { changed_paths } from '#scripts/git/changed-paths'
|
|
5
|
+
import { git_spawn } from '#scripts/git/git-spawn'
|
|
6
|
+
import { review_code_tree } from '#scripts/review/review-code-tree'
|
|
7
|
+
import { test_pinned_cache, type LoadedCache, type Reached } from './test-pinned-cache'
|
|
8
|
+
import { test_pinned_cache_logic, type Known, type Recheck } from './test-pinned-cache-logic'
|
|
9
|
+
import { test_pinned_emit } from './test-pinned-emit'
|
|
10
|
+
import { test_pinned_functions } from './test-pinned-functions'
|
|
11
|
+
import type { PinnedOrigin } from './test-pinned-ledger'
|
|
12
|
+
import {
|
|
13
|
+
test_pinned_logic,
|
|
14
|
+
type Hunk,
|
|
15
|
+
type HunkOutcome,
|
|
16
|
+
type PinnedReport,
|
|
17
|
+
} from './test-pinned-logic'
|
|
18
|
+
import { test_pinned_probe, type CheckOptions, type Probe } from './test-pinned-probe'
|
|
19
|
+
import { test_pinned_reach, type Reach } from './test-pinned-reach'
|
|
20
|
+
import type { Staged } from './test-pinned-stage'
|
|
21
|
+
import { test_red } from './test-red'
|
|
22
|
+
import type { RedProbe } from './test-red-logic'
|
|
23
|
+
|
|
24
|
+
// `josh test:pinned` (joshuafolkken/kit#4516) — put each changed hunk of a non-test code file back to
|
|
25
|
+
// the merge-base's lines, one at a time, run that file's related tests, and list the hunks no test went
|
|
26
|
+
// red on: the "reverting it stays green" finding a review used to stop a lane on.
|
|
27
|
+
//
|
|
28
|
+
// **The reverts happen in a detached worktree at HEAD, never the caller's checkout** (`base-tree.ts`).
|
|
29
|
+
// The changed files are copied in from the working tree first, so what is reverted is the change as it
|
|
30
|
+
// stands, committed or not, and each hunk's file is restored before the next one runs.
|
|
31
|
+
|
|
32
|
+
const HEAD = 'HEAD'
|
|
33
|
+
|
|
34
|
+
interface StubRead {
|
|
35
|
+
hunks: ReadonlyArray<Hunk>
|
|
36
|
+
unparsed: ReadonlyArray<string>
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// `rewired` counts the changed hunks left out as a rewire (`test-pinned-rewire.ts`).
|
|
40
|
+
interface ProbeRead extends StubRead {
|
|
41
|
+
rewired: number
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
interface RunOptions {
|
|
45
|
+
max_hunks: number
|
|
46
|
+
is_cached_only: boolean
|
|
47
|
+
is_first_unpinned?: boolean
|
|
48
|
+
rewired?: number
|
|
49
|
+
origin?: PinnedOrigin | undefined
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// One run's probing: the checked hunks, what the cache knows of each, and the cache they are written to.
|
|
53
|
+
interface ProbeRun {
|
|
54
|
+
hunks: ReadonlyArray<Hunk>
|
|
55
|
+
known: ReadonlyArray<Known>
|
|
56
|
+
cache: LoadedCache
|
|
57
|
+
keys: ReadonlyArray<string>
|
|
58
|
+
options: RunOptions
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// Each hunk's verdict, and how many of the fresh probes ran in stages.
|
|
62
|
+
interface Verdicts {
|
|
63
|
+
verdicts: Array<RedProbe | undefined>
|
|
64
|
+
staged: Staged
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
const NO_OUTCOME: HunkOutcome = { unpinned: [], stopped: [] }
|
|
68
|
+
const NO_REPORT = { ...NO_OUTCOME, unchecked: [], unparsed: [] } as const
|
|
69
|
+
|
|
70
|
+
// `--diff-filter=M`: an added file's one hunk is the whole file, and reverting it is a missing module
|
|
71
|
+
// every importer fails on, which says nothing about the tests — its functions are probed instead
|
|
72
|
+
// (`stub_hunks_of`). The prefixes are pinned: a user's `diff.mnemonicPrefix` writes `+++ w/<file>`,
|
|
73
|
+
// which would read as no hunk at all.
|
|
74
|
+
async function read_hunks(base: string, files: ReadonlyArray<string>): Promise<Array<Hunk>> {
|
|
75
|
+
if (files.length === 0) return []
|
|
76
|
+
const diff_args = ['diff', '-U0', '--no-color', '--no-ext-diff', '--diff-filter=M']
|
|
77
|
+
const prefix_args = ['--src-prefix=a/', '--dst-prefix=b/', base, '--']
|
|
78
|
+
|
|
79
|
+
return test_pinned_logic.parse_hunks(
|
|
80
|
+
await git_spawn.read([...diff_args, ...prefix_args, ...files]),
|
|
81
|
+
)
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// The key of each hunk, read off the working file its lines sit in now.
|
|
85
|
+
async function keys_of(hunks: ReadonlyArray<Hunk>): Promise<Array<string>> {
|
|
86
|
+
const contents = await Promise.all(hunks.map(async (hunk) => await readFile(hunk.file, 'utf8')))
|
|
87
|
+
|
|
88
|
+
return test_pinned_cache_logic.distinct(
|
|
89
|
+
hunks.map((hunk, index) => test_pinned_cache_logic.hunk_key(hunk, contents[index] ?? '')),
|
|
90
|
+
)
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// The verdict the cache already holds; one left to recheck holds none yet.
|
|
94
|
+
function held_of(known: Known): RedProbe | undefined {
|
|
95
|
+
return test_pinned_cache_logic.is_recheck(known) ? undefined : known
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
function recheck_of(known: Known): Recheck | undefined {
|
|
99
|
+
return test_pinned_cache_logic.is_recheck(known) ? known : undefined
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// The hunks no held verdict covers, each with its recheck where the cache named one.
|
|
103
|
+
function probes_of(hunks: ReadonlyArray<Hunk>, known: ReadonlyArray<Known>): Array<Probe> {
|
|
104
|
+
return hunks
|
|
105
|
+
.map((hunk, index) => ({ hunk, index, recheck: recheck_of(known[index]) }))
|
|
106
|
+
.filter((probe) => held_of(known[probe.index]) === undefined)
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// The probes in the order they run: the fewest tests reached first (`test_pinned_logic.by_reach`),
|
|
110
|
+
// each file's count read once and carried on its probes, which a wide one runs in stages by
|
|
111
|
+
// (`test-pinned-stage.ts`); a file with no graph to read counts as 0.
|
|
112
|
+
async function by_reach(probes: ReadonlyArray<Probe>, reach: Reach): Promise<Array<Probe>> {
|
|
113
|
+
const files = test_pinned_cache_logic.distinct(probes.map((probe) => probe.hunk.file))
|
|
114
|
+
const related = await Promise.all(files.map(async (file) => await reach.related(file)))
|
|
115
|
+
const counts = new Map(files.map((file, index) => [file, related[index]?.length ?? 0]))
|
|
116
|
+
const counted = probes.map((probe) => ({ ...probe, reach: counts.get(probe.hunk.file) }))
|
|
117
|
+
|
|
118
|
+
return test_pinned_logic.by_reach(counted, counts)
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
function reached_of(verdicts: ReadonlyArray<RedProbe | undefined>): Array<Reached> {
|
|
122
|
+
return verdicts.flatMap((verdict, index) => (verdict === undefined ? [] : [[index, verdict]]))
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
// The fresh run's options: the hunks the cache held, then the run's own.
|
|
126
|
+
function check_options(held: number, options: RunOptions): CheckOptions {
|
|
127
|
+
return {
|
|
128
|
+
held,
|
|
129
|
+
rewired: options.rewired ?? 0,
|
|
130
|
+
is_first_unpinned: options.is_first_unpinned === true,
|
|
131
|
+
origin: options.origin,
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
// Each hunk's verdict: the cached one where it still holds, else a fresh run's, in the hunks' order.
|
|
136
|
+
// The held ones are written first and each fresh one as it is reached (`test_pinned_cache.writer`).
|
|
137
|
+
// Under `is_first_unpinned` a hunk the run stopped before keeps no verdict.
|
|
138
|
+
async function verdicts_on(paths: ReadonlyArray<string>, probing: ProbeRun): Promise<Verdicts> {
|
|
139
|
+
const verdicts = probing.known.map((entry) => held_of(entry))
|
|
140
|
+
const reached = reached_of(verdicts)
|
|
141
|
+
const probes = await by_reach(probes_of(probing.hunks, probing.known), probing.cache.reach)
|
|
142
|
+
const writer = test_pinned_cache.writer(probing.cache, probing.keys)
|
|
143
|
+
const options = check_options(reached.length, probing.options)
|
|
144
|
+
|
|
145
|
+
await writer.record(reached)
|
|
146
|
+
const checked = await test_pinned_probe.checked_on(
|
|
147
|
+
paths,
|
|
148
|
+
probes,
|
|
149
|
+
async (index, verdict) => {
|
|
150
|
+
verdicts[index] = verdict
|
|
151
|
+
await writer.record([[index, verdict]])
|
|
152
|
+
},
|
|
153
|
+
options,
|
|
154
|
+
)
|
|
155
|
+
|
|
156
|
+
return { verdicts, staged: checked.staged }
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
function outcome_of(
|
|
160
|
+
hunks: ReadonlyArray<Hunk>,
|
|
161
|
+
verdicts: ReadonlyArray<RedProbe | undefined>,
|
|
162
|
+
): HunkOutcome {
|
|
163
|
+
const is_held = verdicts.every((verdict) => verdict !== undefined)
|
|
164
|
+
|
|
165
|
+
return { ...test_pinned_logic.outcome(hunks, verdicts), is_held }
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
// The hunks a run probed and stopped before (`is_first_unpinned`); none, no `cut` key.
|
|
169
|
+
function cut_of(
|
|
170
|
+
hunks: ReadonlyArray<Hunk>,
|
|
171
|
+
verdicts: ReadonlyArray<RedProbe | undefined>,
|
|
172
|
+
): Pick<HunkOutcome, 'cut'> {
|
|
173
|
+
const cut = hunks.filter((_hunk, index) => verdicts[index] === undefined)
|
|
174
|
+
|
|
175
|
+
return cut.length === 0 ? {} : { cut }
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
// A fresh cached verdict is reused without a run (`test-pinned-cache.ts`); every hunk's verdict is
|
|
179
|
+
// stored again, so a rerun on the same tree starts no vitest. `is_cached_only` runs no probe: only the
|
|
180
|
+
// verdicts the cache holds are read, and nothing is written.
|
|
181
|
+
async function outcome_on(
|
|
182
|
+
base: string,
|
|
183
|
+
paths: ReadonlyArray<string>,
|
|
184
|
+
hunks: ReadonlyArray<Hunk>,
|
|
185
|
+
options: RunOptions,
|
|
186
|
+
): Promise<HunkOutcome> {
|
|
187
|
+
if (hunks.length === 0) return NO_OUTCOME
|
|
188
|
+
const cache = await test_pinned_cache.load(base, hunks)
|
|
189
|
+
const keys = await keys_of(hunks)
|
|
190
|
+
const known = await test_pinned_cache.known(
|
|
191
|
+
cache,
|
|
192
|
+
keys,
|
|
193
|
+
hunks.map((hunk) => hunk.file),
|
|
194
|
+
)
|
|
195
|
+
|
|
196
|
+
if (options.is_cached_only) {
|
|
197
|
+
return outcome_of(
|
|
198
|
+
hunks,
|
|
199
|
+
known.map((entry) => held_of(entry)),
|
|
200
|
+
)
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
const { verdicts, staged } = await verdicts_on(paths, { hunks, known, cache, keys, options })
|
|
204
|
+
|
|
205
|
+
return { ...outcome_of(hunks, verdicts), ...cut_of(hunks, verdicts), staged }
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
// A target the base's tree does not hold is added — committed on the branch or still untracked.
|
|
209
|
+
async function added_scripts(base: string, targets: ReadonlyArray<string>): Promise<Array<string>> {
|
|
210
|
+
const held = new Set(await changed_paths.read_held_at(base, targets))
|
|
211
|
+
|
|
212
|
+
return targets.filter((file) => !held.has(file) && test_pinned_functions.is_script(file))
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
// Without `typescript` (an optional peer in a consumer) no function can be read, so every added file
|
|
216
|
+
// is reported unchecked rather than passed as pinned.
|
|
217
|
+
async function stub_hunks_of(added: ReadonlyArray<string>): Promise<StubRead> {
|
|
218
|
+
const api = review_code_tree.load_typescript(process.cwd())
|
|
219
|
+
if (api === undefined) return { hunks: [], unparsed: added }
|
|
220
|
+
const contents = await Promise.all(added.map(async (file) => await readFile(file, 'utf8')))
|
|
221
|
+
const hunks = added.flatMap((file, index) =>
|
|
222
|
+
test_pinned_functions.stub_hunks(api, file, contents[index] ?? ''),
|
|
223
|
+
)
|
|
224
|
+
|
|
225
|
+
return { hunks, unparsed: [] }
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
// A changed hunk whose revert emits the same JavaScript, or a rewire, is dropped before the cap
|
|
229
|
+
// (`test-pinned-emit.ts`), so neither is `unchecked`; without `typescript` every hunk is kept, so the
|
|
230
|
+
// run checks more rather than less.
|
|
231
|
+
async function runtime_hunks(hunks: ReadonlyArray<Hunk>): Promise<ProbeRead> {
|
|
232
|
+
const api = review_code_tree.load_typescript(process.cwd())
|
|
233
|
+
if (api === undefined) return { hunks: [...hunks], unparsed: [], rewired: 0 }
|
|
234
|
+
const contents = await Promise.all(hunks.map(async (hunk) => await readFile(hunk.file, 'utf8')))
|
|
235
|
+
|
|
236
|
+
return { ...test_pinned_emit.probed_of(api, hunks, contents), unparsed: [] }
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
async function read_probes(base: string, targets: ReadonlyArray<string>): Promise<ProbeRead> {
|
|
240
|
+
const stubs = await stub_hunks_of(await added_scripts(base, targets))
|
|
241
|
+
const changed = await runtime_hunks(await read_hunks(base, targets))
|
|
242
|
+
const hunks = [...changed.hunks, ...stubs.hunks]
|
|
243
|
+
|
|
244
|
+
return { hunks, unparsed: stubs.unparsed, rewired: changed.rewired }
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
// The work tree's files that differ from `commit`, deleted ones dropped. Read since `HEAD` they are
|
|
248
|
+
// what the worktree at `HEAD` needs copied in to hold the work tree — a conflicted merge's incoming
|
|
249
|
+
// files included; read since the change base they are this branch's own change.
|
|
250
|
+
async function existing_since(commit: string): Promise<Array<string>> {
|
|
251
|
+
const changed = await changed_paths.read_changed_since(commit)
|
|
252
|
+
|
|
253
|
+
return changed.filter((file) => existsSync(file))
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
async function report_on(
|
|
257
|
+
base: string,
|
|
258
|
+
options: RunOptions,
|
|
259
|
+
has_runner: boolean,
|
|
260
|
+
): Promise<PinnedReport> {
|
|
261
|
+
const { max_hunks } = options
|
|
262
|
+
const paths = await existing_since(HEAD)
|
|
263
|
+
const changed = await existing_since(base)
|
|
264
|
+
const targets = await test_pinned_reach.probed_files(
|
|
265
|
+
changed.filter((file) => test_pinned_logic.is_target(file)),
|
|
266
|
+
)
|
|
267
|
+
const probes = await read_probes(base, targets)
|
|
268
|
+
const { checked, unchecked } = test_pinned_logic.split(probes.hunks, has_runner ? max_hunks : 0)
|
|
269
|
+
const outcome = await outcome_on(base, paths, checked, { ...options, rewired: probes.rewired })
|
|
270
|
+
|
|
271
|
+
return { ...outcome, unchecked, unparsed: probes.unparsed, max_hunks, has_runner }
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
async function report(options: RunOptions): Promise<PinnedReport> {
|
|
275
|
+
const base = await change_base.resolved_through_merge()
|
|
276
|
+
const has_runner = test_red.has_runner()
|
|
277
|
+
if (base === undefined) return { ...NO_REPORT, max_hunks: options.max_hunks, has_runner }
|
|
278
|
+
|
|
279
|
+
return await report_on(base, options, has_runner)
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
// No merge-base (not a repository, no default branch) checks nothing, as `josh test:red` does. The cap
|
|
283
|
+
// is shared: changed hunks first, then the added files' functions. Without Vitest (a consumer that has
|
|
284
|
+
// none) no probe runs, so every one is unchecked rather than unpinned. `is_first_unpinned` starts no
|
|
285
|
+
// probe once one is unpinned (joshuafolkken/kit#5153): the hunks left are reported `cut`. `origin` is
|
|
286
|
+
// what started the run, for its ledger row.
|
|
287
|
+
async function run(
|
|
288
|
+
max_hunks: number,
|
|
289
|
+
is_first_unpinned = false,
|
|
290
|
+
origin?: PinnedOrigin,
|
|
291
|
+
): Promise<PinnedReport> {
|
|
292
|
+
return await report({ max_hunks, is_cached_only: false, is_first_unpinned, origin })
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
// The unpinned hunks the cache already answers for this tree, probing nothing (joshuafolkken/kit#4936):
|
|
296
|
+
// what a check still running — or one stopped mid-way — has reached for the hunks that did not move.
|
|
297
|
+
async function cached(max_hunks: number): Promise<PinnedReport> {
|
|
298
|
+
return await report({ max_hunks, is_cached_only: true })
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
// The cached report when the cache holds every checked hunk's verdict for this tree, probing nothing
|
|
302
|
+
// (joshuafolkken/kit#5078); `undefined` when a hunk moved or was never probed, so the caller probes.
|
|
303
|
+
async function held_report(max_hunks: number): Promise<PinnedReport | undefined> {
|
|
304
|
+
const read = await cached(max_hunks)
|
|
305
|
+
|
|
306
|
+
return read.is_held === true ? read : undefined
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
const test_pinned = { cached, held_report, run }
|
|
310
|
+
|
|
311
|
+
export { test_pinned }
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
import { existsSync, statSync } from 'node:fs'
|
|
3
|
+
import { fileURLToPath } from 'node:url'
|
|
4
|
+
import { test_pinned_reach } from './test-pinned-reach'
|
|
5
|
+
|
|
6
|
+
// `josh test:reach <file...>` — how many test files each file's imports reach, the count
|
|
7
|
+
// `josh test:related` sizes its core claim by, one `<count> <file>` line per file
|
|
8
|
+
// (joshuafolkken/kit#5238): an overrun filing or a baseline measures it without a hand-written probe.
|
|
9
|
+
|
|
10
|
+
const ARGV_OFFSET = 2
|
|
11
|
+
const FAILURE_EXIT_CODE = 1
|
|
12
|
+
const USAGE = 'Usage: josh test:reach <file...>'
|
|
13
|
+
const NO_GRAPH =
|
|
14
|
+
'josh test:reach: no import graph can be built here (no typescript or tsconfig.json)'
|
|
15
|
+
|
|
16
|
+
function is_file(path: string): boolean {
|
|
17
|
+
return existsSync(path) && statSync(path).isFile()
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
// A path no file answers — absent, or a directory — reaches no test, so its `0` would read as a
|
|
21
|
+
// measured count: `pnpm josh` runs from the repository root, where a path typed relative to a
|
|
22
|
+
// subdirectory names nothing.
|
|
23
|
+
function refusal(argv: ReadonlyArray<string>): string | undefined {
|
|
24
|
+
if (argv.length === 0) return USAGE
|
|
25
|
+
const missing = argv.filter((file) => !is_file(file))
|
|
26
|
+
if (missing.length === 0) return undefined
|
|
27
|
+
|
|
28
|
+
return `josh test:reach: no such file from the repository root: ${missing.join(', ')}`
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
async function run(argv: ReadonlyArray<string>): Promise<number> {
|
|
32
|
+
const refused = refusal(argv)
|
|
33
|
+
|
|
34
|
+
if (refused !== undefined) {
|
|
35
|
+
console.error(refused)
|
|
36
|
+
|
|
37
|
+
return FAILURE_EXIT_CODE
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
const counts = await test_pinned_reach.reached_test_counts(argv)
|
|
41
|
+
|
|
42
|
+
if (counts === undefined) {
|
|
43
|
+
console.error(NO_GRAPH)
|
|
44
|
+
|
|
45
|
+
return FAILURE_EXIT_CODE
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
console.info(counts.map(({ file, count }) => `${String(count)} ${file}`).join('\n'))
|
|
49
|
+
|
|
50
|
+
return 0
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
async function main(argv: ReadonlyArray<string>): Promise<void> {
|
|
54
|
+
process.exitCode = await run(argv)
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
const test_reach_cli = { USAGE, run }
|
|
58
|
+
|
|
59
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
|
|
60
|
+
|
|
61
|
+
export { test_reach_cli }
|
|
@@ -0,0 +1,288 @@
|
|
|
1
|
+
import { readdirSync, readFileSync, rmSync, statSync } from 'node:fs'
|
|
2
|
+
import path from 'node:path'
|
|
3
|
+
import { git_common_directory } from '#scripts/git/git-common-directory'
|
|
4
|
+
import { run_record_path } from '#scripts/josh/run-record-path'
|
|
5
|
+
import { atomic_write } from '#scripts/lib/atomic-write'
|
|
6
|
+
import { json_value } from '#scripts/lib/json-value'
|
|
7
|
+
import { test_read_trace, type ReadRecords } from './test-read-trace'
|
|
8
|
+
|
|
9
|
+
// The test-read map: for every repository path a full unit run read, the modules that read it.
|
|
10
|
+
// `josh test:related` resolves a changed non-code file through it to the code files `vitest related`
|
|
11
|
+
// can walk, so a changed document runs the tests that read it rather than the whole suite.
|
|
12
|
+
//
|
|
13
|
+
// **The map is valid against the tree it was recorded on, and only that tree.** It records the
|
|
14
|
+
// commit and the files that differed from it, so the change a narrowing reads is the change since
|
|
15
|
+
// then. A tree whose own code changed what it reads has changed that code, and `vitest related`
|
|
16
|
+
// runs the tests importing it. **It lives in the git common directory**, which every lane worktree of
|
|
17
|
+
// one clone shares along with the commits it names, so one lane's full run narrows the next lane's.
|
|
18
|
+
// **One file per version** (joshuafolkken/kit#4423): a lane on an older kit writing its map leaves a
|
|
19
|
+
// newer lane's map in place, so a version bump no longer sends either to the whole suite.
|
|
20
|
+
|
|
21
|
+
interface ReadMap {
|
|
22
|
+
version: number
|
|
23
|
+
commit: string
|
|
24
|
+
// The files that differed from `commit` when the map was recorded, each with the digest of its
|
|
25
|
+
// content then (`input_fingerprint.of_files`), so one whose content has not moved since does not count as changed
|
|
26
|
+
// (joshuafolkken/kit#4425).
|
|
27
|
+
dirty: Record<string, string>
|
|
28
|
+
// The recording checkout's change as a test reads it through git — the branch diff from the change
|
|
29
|
+
// base plus the untracked files (`changed_paths.read_changed_paths`), committed or not
|
|
30
|
+
// (joshuafolkken/kit#4734).
|
|
31
|
+
change: Array<string>
|
|
32
|
+
// The directories `commit` holds, so a directory new since then is told apart from one no test
|
|
33
|
+
// read — the map's own keys cannot say which, since an unread directory has none.
|
|
34
|
+
directories: Array<string>
|
|
35
|
+
readers: ReadRecords
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// Bumped whenever the shape, what a reader means or how `dirty` is digested changes, so a map an older
|
|
39
|
+
// kit wrote reads as no map at all and the next full run writes it afresh. 6: `dirty` is
|
|
40
|
+
// `input-fingerprint.ts`'s digest of every changed file (joshuafolkken/kit#4497). 7: `change`
|
|
41
|
+
// (joshuafolkken/kit#4734). 8: a module is a reader only of what its evaluation read
|
|
42
|
+
// (joshuafolkken/kit#5033).
|
|
43
|
+
const MAP_VERSION = 8
|
|
44
|
+
|
|
45
|
+
const MAP_FILE_STEM = 'test-read-map'
|
|
46
|
+
const RECORD_EXTENSION = '.json'
|
|
47
|
+
|
|
48
|
+
// A map file of another version no lane has written for this long belongs to no kit still running,
|
|
49
|
+
// and is removed by the next write: one week.
|
|
50
|
+
const STALE_AFTER_MS = 604_800_000
|
|
51
|
+
|
|
52
|
+
type ReadPair = [string, string]
|
|
53
|
+
|
|
54
|
+
function record_pairs(record: ReadRecords): Array<ReadPair> {
|
|
55
|
+
return Object.entries(record).flatMap(([read_path, readers]) =>
|
|
56
|
+
readers.map((reader): ReadPair => [read_path, reader]),
|
|
57
|
+
)
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
function merge_records(records: ReadonlyArray<ReadRecords>): ReadRecords {
|
|
61
|
+
const merged = new Map<string, Set<string>>()
|
|
62
|
+
const pairs = records.flatMap((record) => record_pairs(record))
|
|
63
|
+
|
|
64
|
+
for (const [read_path, reader] of pairs) {
|
|
65
|
+
test_read_trace.add_reader(merged, read_path, reader)
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
return test_read_trace.to_records(merged)
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
function is_object(value: unknown): value is object {
|
|
72
|
+
return typeof value === 'object' && value !== null
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
function is_string_array(value: unknown): value is Array<string> {
|
|
76
|
+
return Array.isArray(value) && value.every((entry) => typeof entry === 'string')
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
function is_read_records(value: unknown): value is ReadRecords {
|
|
80
|
+
return is_object(value) && Object.values(value).every(is_string_array)
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
function is_digest_record(value: unknown): value is Record<string, string> {
|
|
84
|
+
if (!is_object(value) || Array.isArray(value)) return false
|
|
85
|
+
|
|
86
|
+
return Object.values(value).every((digest) => typeof digest === 'string')
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
const FIELD_CHECKS: ReadonlyArray<[keyof ReadMap, (field: unknown) => boolean]> = [
|
|
90
|
+
['version', (field) => field === MAP_VERSION],
|
|
91
|
+
['commit', (field) => typeof field === 'string'],
|
|
92
|
+
['dirty', is_digest_record],
|
|
93
|
+
['change', is_string_array],
|
|
94
|
+
['directories', is_string_array],
|
|
95
|
+
['readers', is_read_records],
|
|
96
|
+
]
|
|
97
|
+
|
|
98
|
+
function is_read_map(value: unknown): value is ReadMap {
|
|
99
|
+
if (!is_object(value)) return false
|
|
100
|
+
|
|
101
|
+
return FIELD_CHECKS.every(([field, is_valid]) => is_valid(Reflect.get(value, field)))
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// **The files whose content differs from the tree the map was recorded on** (joshuafolkken/kit#4425).
|
|
105
|
+
// `since` is every path that differs from `map.commit` now, and `current` the digest of every path
|
|
106
|
+
// that was dirty then. A path dirty then is changed only when its digest moved: counted by name, a
|
|
107
|
+
// lane's own change the map was recorded over read as changed on every later run, so a gate reused
|
|
108
|
+
// no green unit step whenever the lane held any code.
|
|
109
|
+
function changed_since_tree(
|
|
110
|
+
map: ReadMap,
|
|
111
|
+
since: ReadonlyArray<string>,
|
|
112
|
+
current: Readonly<Record<string, string>>,
|
|
113
|
+
): Array<string> {
|
|
114
|
+
const fresh = since.filter((file) => !Object.hasOwn(map.dirty, file))
|
|
115
|
+
const moved = Object.entries(map.dirty)
|
|
116
|
+
.filter(([file, digest]) => current[file] !== digest)
|
|
117
|
+
.map(([file]) => file)
|
|
118
|
+
|
|
119
|
+
return [...new Set([...fresh, ...moved])]
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
function parse_map(text: string): ReadMap | undefined {
|
|
123
|
+
const value = json_value.parse_or_undefined(text)
|
|
124
|
+
|
|
125
|
+
return is_read_map(value) ? value : undefined
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
function parse_records(text: string): ReadRecords {
|
|
129
|
+
const value = json_value.parse_or_undefined(text)
|
|
130
|
+
|
|
131
|
+
return is_read_records(value) ? value : {}
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
// Innermost first, ending at the root `.`.
|
|
135
|
+
function directories_above(relative: string): Array<string> {
|
|
136
|
+
const parent = path.dirname(relative)
|
|
137
|
+
|
|
138
|
+
if (parent === relative) return []
|
|
139
|
+
|
|
140
|
+
return [parent, ...directories_above(parent)]
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
// The directories on the file's path the recorded commit did not hold, innermost first. The root
|
|
144
|
+
// always existed.
|
|
145
|
+
function created_directories(
|
|
146
|
+
directories: ReadonlyArray<string>,
|
|
147
|
+
recorded: ReadonlySet<string>,
|
|
148
|
+
): Array<string> {
|
|
149
|
+
return directories.filter(
|
|
150
|
+
(directory) => directory !== test_read_trace.ROOT_ENTRY && !recorded.has(directory),
|
|
151
|
+
)
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
// A changed file is read by whoever read it, listed its own directory or walked any directory above
|
|
155
|
+
// it. A directory new since the recording is also a new entry in the listing above it and a probe of
|
|
156
|
+
// it that now answers differently; a directory that already existed reads the same to both, whatever
|
|
157
|
+
// changed deeper down.
|
|
158
|
+
//
|
|
159
|
+
// **A run record reaches only a test that read it by name** (joshuafolkken/kit#5001): a test listing or
|
|
160
|
+
// walking the root or `.josh/` reads the checkout around it, not the observation or accepted metrics
|
|
161
|
+
// a lane writes after its checks went green, so those keys would run every such test for bookkeeping.
|
|
162
|
+
function lookup_keys(relative: string, recorded: ReadonlySet<string>): Array<string> {
|
|
163
|
+
if (run_record_path.is_run_record(relative)) return [relative]
|
|
164
|
+
|
|
165
|
+
const directories = directories_above(relative)
|
|
166
|
+
const created = created_directories(directories, recorded)
|
|
167
|
+
const listed = [
|
|
168
|
+
directories[0] ?? test_read_trace.ROOT_ENTRY,
|
|
169
|
+
...created.map((directory) => path.dirname(directory)),
|
|
170
|
+
]
|
|
171
|
+
|
|
172
|
+
return [
|
|
173
|
+
relative,
|
|
174
|
+
...created,
|
|
175
|
+
...listed.map((directory) => test_read_trace.read_key(directory, 'listing')),
|
|
176
|
+
...directories.map((directory) => test_read_trace.read_key(directory, 'walk')),
|
|
177
|
+
]
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
function readers_of(map: ReadMap, relative: string): Array<string> {
|
|
181
|
+
const keys = lookup_keys(relative, new Set(map.directories))
|
|
182
|
+
|
|
183
|
+
return [...new Set(keys.flatMap((key) => map.readers[key] ?? []))]
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
// **A directory inside which no recorded test listed, walked or read any entry** (joshuafolkken/kit#4303).
|
|
187
|
+
// A file added to it since is one no test reads, as surely as one the tree already held there: a test
|
|
188
|
+
// that builds a path into it reads some file there, and one that enumerates it lists it, both of which
|
|
189
|
+
// leave a key whose directory is this one — a read is recorded before it runs, so a path absent then
|
|
190
|
+
// still leaves its key. **A directory new since the recording counts too** (joshuafolkken/kit#4597):
|
|
191
|
+
// a probe of it or a listing of its parent is one of `readers_of`'s keys, which the caller asks first.
|
|
192
|
+
// **A read of the recording tree's own change does not count** (joshuafolkken/kit#4734): a test that
|
|
193
|
+
// reads this checkout's change through git reads whatever file the recording lane held, so its own
|
|
194
|
+
// `.josh/metrics-accepted/<N>.json` marked that directory read and sent the next lane's to the whole
|
|
195
|
+
// suite. A listing or a walk of the directory, or a read of any other file there, still counts — except
|
|
196
|
+
// for a run record, which only a read of itself reaches (`lookup_keys`).
|
|
197
|
+
function in_unread_directory(map: ReadMap, relative: string): boolean {
|
|
198
|
+
if (run_record_path.is_run_record(relative)) return true
|
|
199
|
+
|
|
200
|
+
const directory = path.dirname(relative)
|
|
201
|
+
const change = new Set(map.change)
|
|
202
|
+
const keys = Object.keys(map.readers).filter((key) => !change.has(key))
|
|
203
|
+
|
|
204
|
+
return keys.every((key) => path.dirname(key) !== directory)
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
function map_path(root: string, version: number = MAP_VERSION): string | undefined {
|
|
208
|
+
const common = git_common_directory.repository(root)
|
|
209
|
+
const name = `${MAP_FILE_STEM}.v${String(version)}${RECORD_EXTENSION}`
|
|
210
|
+
|
|
211
|
+
return common === undefined
|
|
212
|
+
? undefined
|
|
213
|
+
: path.join(common, git_common_directory.STATE_DIRECTORY, name)
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
// Every version's map, the unversioned one kits before joshuafolkken/kit#4423 wrote included; a
|
|
217
|
+
// staging file ends in `.tmp`, not the extension.
|
|
218
|
+
function is_map_file(name: string): boolean {
|
|
219
|
+
return name.startsWith(MAP_FILE_STEM) && name.endsWith(RECORD_EXTENSION)
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
// A file another lane's write pruned meanwhile has no stat, and is not this write's to remove.
|
|
223
|
+
function is_stale(file_path: string, now: number): boolean {
|
|
224
|
+
const modified = statSync(file_path, { throwIfNoEntry: false })?.mtimeMs ?? now
|
|
225
|
+
|
|
226
|
+
return now - modified > STALE_AFTER_MS
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
// The map just written is never stale, so it survives its own prune.
|
|
230
|
+
function prune_stale_maps(directory: string): void {
|
|
231
|
+
const now = Date.now()
|
|
232
|
+
const maps = readdirSync(directory)
|
|
233
|
+
.filter((name) => is_map_file(name))
|
|
234
|
+
.map((name) => path.join(directory, name))
|
|
235
|
+
|
|
236
|
+
for (const file_path of maps) {
|
|
237
|
+
if (is_stale(file_path, now)) rmSync(file_path, { force: true })
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
function read_text(file_path: string): string | undefined {
|
|
242
|
+
try {
|
|
243
|
+
return readFileSync(file_path, 'utf8')
|
|
244
|
+
} catch {
|
|
245
|
+
return undefined
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
function read_map(root: string): ReadMap | undefined {
|
|
250
|
+
const file_path = map_path(root)
|
|
251
|
+
const text = file_path === undefined ? undefined : read_text(file_path)
|
|
252
|
+
|
|
253
|
+
return text === undefined ? undefined : parse_map(text)
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
// Written beside the target and renamed over it, so a lane reading the map while another lane
|
|
257
|
+
// replaces it reads one whole map or the other. It lands in its own version's file.
|
|
258
|
+
function write_map(root: string, map: ReadMap): void {
|
|
259
|
+
const file_path = map_path(root, map.version)
|
|
260
|
+
|
|
261
|
+
if (file_path === undefined) return
|
|
262
|
+
|
|
263
|
+
atomic_write.replace_file(file_path, JSON.stringify(map))
|
|
264
|
+
prune_stale_maps(path.dirname(file_path))
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
// Every worker writes its own files into the run's directory; this reads them all back.
|
|
268
|
+
function collect_records(directory: string): Array<ReadRecords> {
|
|
269
|
+
return readdirSync(directory)
|
|
270
|
+
.filter((name) => name.endsWith(RECORD_EXTENSION))
|
|
271
|
+
.map((name) => parse_records(read_text(path.join(directory, name)) ?? ''))
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
const test_read_map = {
|
|
275
|
+
MAP_VERSION,
|
|
276
|
+
changed_since_tree,
|
|
277
|
+
collect_records,
|
|
278
|
+
in_unread_directory,
|
|
279
|
+
map_path,
|
|
280
|
+
merge_records,
|
|
281
|
+
parse_map,
|
|
282
|
+
read_map,
|
|
283
|
+
readers_of,
|
|
284
|
+
write_map,
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
export type { ReadMap }
|
|
288
|
+
export { test_read_map }
|