@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,37 @@
|
|
|
1
|
+
import { readFileSync } from 'node:fs'
|
|
2
|
+
import { writeFile } from 'node:fs/promises'
|
|
3
|
+
|
|
4
|
+
// How many test files a unit run ran, handed from the unit reporter to the caller that named a file to
|
|
5
|
+
// receive it — `josh test:related`, which records it beside the scope it handed vitest
|
|
6
|
+
// (joshuafolkken/kit#4465). Its own shipped module: the reporter is kit-only and the setup-file list
|
|
7
|
+
// names files only, so neither can own a protocol a shipped reader shares.
|
|
8
|
+
|
|
9
|
+
// Names the file the run's test-file count is written to.
|
|
10
|
+
const COUNT_FILE_ENVIRONMENT = 'JOSH_UNIT_COUNT_FILE'
|
|
11
|
+
|
|
12
|
+
// Best-effort like the ledger: a run is never failed by the file it reports into.
|
|
13
|
+
async function write_count(count: number, target: string | undefined): Promise<void> {
|
|
14
|
+
if (target === undefined || target === '') return
|
|
15
|
+
|
|
16
|
+
try {
|
|
17
|
+
await writeFile(target, String(count))
|
|
18
|
+
} catch {
|
|
19
|
+
// The caller reads a missing count as unknown.
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
// A missing, empty or non-integer file is an unknown count, never zero.
|
|
24
|
+
function read_count(file: string): number | undefined {
|
|
25
|
+
try {
|
|
26
|
+
const text = readFileSync(file, 'utf8').trim()
|
|
27
|
+
const count = Number(text)
|
|
28
|
+
|
|
29
|
+
return text !== '' && Number.isSafeInteger(count) ? count : undefined
|
|
30
|
+
} catch {
|
|
31
|
+
return undefined
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
const unit_count_file = { COUNT_FILE_ENVIRONMENT, read_count, write_count }
|
|
36
|
+
|
|
37
|
+
export { unit_count_file }
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { readFileSync } from 'node:fs'
|
|
2
|
+
import path from 'node:path'
|
|
3
|
+
|
|
4
|
+
// The per-file unit durations the CI shards are balanced by (joshuafolkken/kit#4467), read here so
|
|
5
|
+
// the published `josh test:related` can weigh them too (joshuafolkken/kit#5105) — the reporter that
|
|
6
|
+
// refreshes the record is kit-only (`tools/test/unit-duration-record.ts`). A project without the
|
|
7
|
+
// record reads an empty one.
|
|
8
|
+
|
|
9
|
+
type Durations = Readonly<Record<string, number>>
|
|
10
|
+
|
|
11
|
+
const RECORD_FILE = 'tools/test/unit-durations.json'
|
|
12
|
+
|
|
13
|
+
function parse(text: string): Durations {
|
|
14
|
+
const parsed: unknown = JSON.parse(text)
|
|
15
|
+
|
|
16
|
+
if (typeof parsed !== 'object' || parsed === null) return {}
|
|
17
|
+
|
|
18
|
+
return Object.fromEntries(
|
|
19
|
+
Object.entries(parsed).filter(
|
|
20
|
+
(entry): entry is [string, number] => typeof entry[1] === 'number',
|
|
21
|
+
),
|
|
22
|
+
)
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// A missing or unreadable record is an empty one: every file then weighs the same fallback.
|
|
26
|
+
function read(root: string): Durations {
|
|
27
|
+
try {
|
|
28
|
+
return parse(readFileSync(path.join(root, RECORD_FILE), 'utf8'))
|
|
29
|
+
} catch {
|
|
30
|
+
return {}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
const unit_durations = {
|
|
35
|
+
RECORD_FILE,
|
|
36
|
+
parse,
|
|
37
|
+
read,
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export type { Durations }
|
|
41
|
+
export { unit_durations }
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
import { readdirSync } from 'node:fs'
|
|
2
|
+
import path from 'node:path'
|
|
3
|
+
import { PLATFORM_TEMP_ROOT } from '#scripts/josh/platform-temporary'
|
|
4
|
+
import { process_identity } from '#scripts/josh/process-identity'
|
|
5
|
+
import { process_owner_schema, type ProcessOwner } from '#scripts/josh/process-owner'
|
|
6
|
+
import { stamp_file } from '#scripts/josh/stamp-file'
|
|
7
|
+
import { json_value } from '#scripts/lib/json-value'
|
|
8
|
+
|
|
9
|
+
// The run markers that count the unit runs in flight, and the division of the machine by that count —
|
|
10
|
+
// the part of the worker share `vitest.config.ts` reads (`vitest-config-workers.ts`).
|
|
11
|
+
//
|
|
12
|
+
// **Kept apart from `unit-worker-share.ts` because the config imports it** (joshuafolkken/kit#4572).
|
|
13
|
+
// Every module the vitest config imports is a whole-suite file (`whole-suite-files.ts`), and the
|
|
14
|
+
// capacity and claim bounds of the share change often; held here, only this stable part is one.
|
|
15
|
+
|
|
16
|
+
// A record that means something only while it exists, in the shape `stamp-file.ts` already keeps for
|
|
17
|
+
// the in-flight gate marker. Keyed by pid rather than by checkout: `josh gate`'s unit step and a
|
|
18
|
+
// `josh test:related` can be in flight in one checkout at once, and both of them are load.
|
|
19
|
+
const RUN_PREFIX = 'josh-unit-running-'
|
|
20
|
+
// Never below one: a share of zero would run no test at all and report the suite green.
|
|
21
|
+
const MIN_WORKERS = 1
|
|
22
|
+
// One run in flight is this run alone, which is the case that changes nothing.
|
|
23
|
+
const SOLO_RUNS = 1
|
|
24
|
+
|
|
25
|
+
// A marker is the writing process's identity and nothing else; a pid-only marker has an answer of its
|
|
26
|
+
// own below (`is_running`) rather than being rejected here.
|
|
27
|
+
type RunMarker = ProcessOwner
|
|
28
|
+
|
|
29
|
+
function marker_path(pid: number = process.pid): string {
|
|
30
|
+
return stamp_file.stamp_path(RUN_PREFIX, String(pid))
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// **A marker is evidence, and the process behind it is the test.** A run killed outright leaves its
|
|
34
|
+
// file behind, and a count that trusted the file alone would hold every later run down to one worker
|
|
35
|
+
// for good — the failure mode `run-hold.ts` answers with an expiry, which cannot be sized here because
|
|
36
|
+
// a unit suite under six-way load already takes minutes. The process that writes this marker is the
|
|
37
|
+
// long-lived one, so unlike a `run:hold` record its identity is a liveness test rather than a note for
|
|
38
|
+
// the reader.
|
|
39
|
+
//
|
|
40
|
+
// **The pid alone was not that identity**. The section below already named
|
|
41
|
+
// what goes wrong — a reissued pid turns a leaked marker into a permanent phantom — and answered it by
|
|
42
|
+
// sweeping, which only ever collected the markers whose pid had *not* yet been reissued. Since the
|
|
43
|
+
// record now carries the writing process's start time beside its pid, a reissued pid is recognized as
|
|
44
|
+
// a different process and swept like any other dead one. A pid that is not positive is caught by the
|
|
45
|
+
// same check, inside `process_identity`: `process.kill(0, …)` addresses the caller's own process group
|
|
46
|
+
// rather than a process, so a truncated or hand-edited marker would otherwise answer "alive" forever.
|
|
47
|
+
//
|
|
48
|
+
// **"Cannot tell" counts as live here, which is the opposite of what the in-flight gate marker's
|
|
49
|
+
// readers do with it, and deliberately so.** A marker with no recorded start time — written before the
|
|
50
|
+
// field existed, or on a platform where it cannot be read — resolves toward *more* sharing: being
|
|
51
|
+
// wrong that way costs this run a narrower share of the machine, while being wrong the other way puts
|
|
52
|
+
// six unit suites on eleven cores, an oversubscription measured at a load
|
|
53
|
+
// average of 209.
|
|
54
|
+
function is_running(marker: RunMarker): boolean {
|
|
55
|
+
return process_identity.is_same_process(marker.pid, marker.process_start) !== false
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
function read_marker(source: string): RunMarker | undefined {
|
|
59
|
+
const raw = stamp_file.read_stamp_text(source)
|
|
60
|
+
|
|
61
|
+
if (raw === undefined) return undefined
|
|
62
|
+
|
|
63
|
+
const parsed = process_owner_schema.safeParse(json_value.parse_or_undefined(raw))
|
|
64
|
+
|
|
65
|
+
return parsed.success ? parsed.data : undefined
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// An unreadable temp directory answers "no other run", which is the direction that leaves behavior
|
|
69
|
+
// as it was rather than throttling a run on a guess. Unlike the network guard, being wrong here costs
|
|
70
|
+
// wall time and never a false result.
|
|
71
|
+
function marker_files(directory: string = PLATFORM_TEMP_ROOT): Array<string> {
|
|
72
|
+
try {
|
|
73
|
+
return readdirSync(directory).filter((name) => name.startsWith(RUN_PREFIX))
|
|
74
|
+
} catch {
|
|
75
|
+
return []
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// **A marker whose process is gone is removed, not merely skipped.** Skipping it is correct only until
|
|
80
|
+
// the operating system reissues that pid to something else, which on a machine left running for days
|
|
81
|
+
// it will — and from then on the phantom is counted as a live run for good, with every solo run held
|
|
82
|
+
// at one worker and `josh gate` announcing lanes that do not exist. `finally` in `with_run_marker`
|
|
83
|
+
// cannot prevent the leak, because the interrupt that produces it (Ctrl-C reaching the whole foreground
|
|
84
|
+
// group) does not unwind. Sweeping on read is what bounds it: the first later run collects it.
|
|
85
|
+
function sweep_marker(source: string): void {
|
|
86
|
+
try {
|
|
87
|
+
stamp_file.remove_stamp(source)
|
|
88
|
+
} catch {
|
|
89
|
+
/* not ours to remove; counting it out is the whole requirement */
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// **Only a marker that parsed to a dead pid is swept, and the unlink still cannot throw.** A marker
|
|
94
|
+
// this account may not read — another user's file on a sticky `/tmp` — is `undefined` here, and
|
|
95
|
+
// deleting on that answer would raise `EPERM` from a path with no `catch` between it and
|
|
96
|
+
// `announce_gate_plan`: an unreadable file belonging to somebody else would abort the gate outright,
|
|
97
|
+
// which is worse than the leak this sweep exists for. Unreadable therefore counts as not-live and is
|
|
98
|
+
// left alone, exactly as it was before the sweep existed.
|
|
99
|
+
function is_marker_live(source: string): boolean {
|
|
100
|
+
const marker = read_marker(source)
|
|
101
|
+
|
|
102
|
+
if (marker === undefined) return false
|
|
103
|
+
if (is_running(marker)) return true
|
|
104
|
+
|
|
105
|
+
sweep_marker(source)
|
|
106
|
+
|
|
107
|
+
return false
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
// Every marker in the temp directory whose process is still alive. This run's own is deliberately not
|
|
111
|
+
// among them: both callers count *before* writing theirs, so the `+ 1` at the call site adds it.
|
|
112
|
+
function live_run_count(directory: string = PLATFORM_TEMP_ROOT): number {
|
|
113
|
+
return marker_files(directory).filter((name) => is_marker_live(path.join(directory, name))).length
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// **The gate claims its place before its unit step exists, and the child must not claim a second
|
|
117
|
+
// one.** `josh gate` counts the runs in flight and then spawns `josh test:unit`, so without this the
|
|
118
|
+
// marker appears a second or so after the count that needed it — and two lanes launched together, the
|
|
119
|
+
// shape `epicrun` produces, both read "nothing else is running" and both take the whole machine. The
|
|
120
|
+
// gate therefore marks itself around the whole run and passes this down through the environment; the
|
|
121
|
+
// guard inside the child sees it and marks nothing, because the two processes are one run.
|
|
122
|
+
const NESTED_KEY = 'JOSH_UNIT_RUN_MARKED'
|
|
123
|
+
const NESTED_VALUE = '1'
|
|
124
|
+
|
|
125
|
+
function is_nested_run(): boolean {
|
|
126
|
+
return process.env[NESTED_KEY] === NESTED_VALUE
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
// **`undefined` at one run means "leave the choice where it was".** The gate then applies its own
|
|
130
|
+
// core reservation and the hook passes no flag at all, which is what both did before this existed.
|
|
131
|
+
function resolve_unit_workers(available_cores: number, runs: number): number | undefined {
|
|
132
|
+
if (runs <= SOLO_RUNS) return undefined
|
|
133
|
+
|
|
134
|
+
return Math.max(MIN_WORKERS, Math.floor(available_cores / runs))
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
// **The write failing is not a reason to fail the run.** A marker that could not be written costs the
|
|
138
|
+
// next run a wider share than it should have — the behavior that was there before — while a thrown
|
|
139
|
+
// error here would fail a unit suite over bookkeeping.
|
|
140
|
+
function mark_run_started(target: string): void {
|
|
141
|
+
try {
|
|
142
|
+
stamp_file.write_stamp(target, process_identity.own_fields())
|
|
143
|
+
} catch {
|
|
144
|
+
/* a missing marker costs a wide share, never a wrong result */
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
const unit_run_marker = {
|
|
149
|
+
MIN_WORKERS,
|
|
150
|
+
NESTED_KEY,
|
|
151
|
+
NESTED_VALUE,
|
|
152
|
+
RUN_PREFIX,
|
|
153
|
+
SOLO_RUNS,
|
|
154
|
+
is_nested_run,
|
|
155
|
+
live_run_count,
|
|
156
|
+
mark_run_started,
|
|
157
|
+
marker_path,
|
|
158
|
+
read_marker,
|
|
159
|
+
resolve_unit_workers,
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
export { unit_run_marker }
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
// The state guard runs on the pure project alone. isolate:false is what lets one file see the git
|
|
2
|
+
// branch, working tree or GIT_* variables a sibling left changed, so that is the only run where a leak
|
|
3
|
+
// is a correctness problem rather than a latent one — and the isolated project keeps exactly the guards
|
|
4
|
+
// the single-project suite had. The network guard is armed once at the root instead, since it arms
|
|
5
|
+
// `PATH` before any worker of either project forks.
|
|
6
|
+
const STATE_GUARD: ReadonlyArray<string> = ['./tools/test/test-state-guard.ts']
|
|
7
|
+
|
|
8
|
+
// Runs in every worker of both projects, before each test, and silences the real streams for the test
|
|
9
|
+
// body so a fixture's direct `process.stdout` write cannot leak into `pnpm josh test:unit`'s output.
|
|
10
|
+
// `setupFiles` rather than `globalSetup` because it must run inside the
|
|
11
|
+
// worker where the test's writes happen, not once in the main process.
|
|
12
|
+
const STDOUT_GUARD: ReadonlyArray<string> = ['./tools/test/test-stdout-guard.ts']
|
|
13
|
+
|
|
14
|
+
// Runs in every worker for the same reason: it wraps that worker's own `fetch`, refusing a real
|
|
15
|
+
// Telegram send and recording which test tried.
|
|
16
|
+
const TELEGRAM_GUARD: ReadonlyArray<string> = ['./tools/test/test-telegram-guard.ts']
|
|
17
|
+
|
|
18
|
+
// Runs in every worker too: it replaces that worker's machine reading, so a suite that drives the gate
|
|
19
|
+
// admits the same way on every platform and every load.
|
|
20
|
+
const MACHINE_GUARD: ReadonlyArray<string> = ['./tools/test/test-machine-guard.ts']
|
|
21
|
+
|
|
22
|
+
// The guards every run of the suite arms, whichever config starts it: the network guard once in the
|
|
23
|
+
// main process, the stdout, Telegram and machine guards in every worker. Named here so `vitest.config.ts` and
|
|
24
|
+
// `vitest.harness.config.ts` read one definition — the harness once ran with none of them.
|
|
25
|
+
const NETWORK_GUARD: ReadonlyArray<string> = ['./tools/test/test-network-guard.ts']
|
|
26
|
+
const WORKER_GUARDS: ReadonlyArray<string> = [...STDOUT_GUARD, ...TELEGRAM_GUARD, ...MACHINE_GUARD]
|
|
27
|
+
|
|
28
|
+
// Runs in every worker of the unit suite, idle unless a whole-suite `josh test:unit` asked it to
|
|
29
|
+
// record which repository paths each test reads (`test-read-recorder.ts`). Not a guard, and not
|
|
30
|
+
// the harness config's: only this suite's runs feed the test-read map.
|
|
31
|
+
const READ_RECORDER: ReadonlyArray<string> = ['./tools/test/test-read-recorder.ts']
|
|
32
|
+
|
|
33
|
+
// The unit suite's own reporter, which vitest loads by this path in its own process. Named rather
|
|
34
|
+
// than imported so neither it nor the ledger it writes joins the config's import graph
|
|
35
|
+
// (joshuafolkken/kit#4465).
|
|
36
|
+
const UNIT_FILE_REPORTER = './vitest.reporter.config.ts'
|
|
37
|
+
|
|
38
|
+
// Kept apart from `unit-projects.ts` so the shipped `josh test:related` can name every setup file
|
|
39
|
+
// without loading the kit-internal project partition.
|
|
40
|
+
const unit_setup_files = {
|
|
41
|
+
MACHINE_GUARD,
|
|
42
|
+
NETWORK_GUARD,
|
|
43
|
+
READ_RECORDER,
|
|
44
|
+
STATE_GUARD,
|
|
45
|
+
STDOUT_GUARD,
|
|
46
|
+
UNIT_FILE_REPORTER,
|
|
47
|
+
TELEGRAM_GUARD,
|
|
48
|
+
WORKER_GUARDS,
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export { unit_setup_files }
|
|
@@ -1,11 +1,6 @@
|
|
|
1
|
-
import { readdirSync } from 'node:fs'
|
|
2
1
|
import { availableParallelism } from 'node:os'
|
|
3
|
-
import path from 'node:path'
|
|
4
|
-
import { PLATFORM_TEMP_ROOT } from '#scripts/josh/platform-temporary'
|
|
5
|
-
import { process_identity } from '#scripts/josh/process-identity'
|
|
6
|
-
import { process_owner_schema, type ProcessOwner } from '#scripts/josh/process-owner'
|
|
7
2
|
import { stamp_file } from '#scripts/josh/stamp-file'
|
|
8
|
-
import {
|
|
3
|
+
import { unit_run_marker } from './unit-run-marker'
|
|
9
4
|
|
|
10
5
|
// How wide one vitest run may fan out when it is not the only one on the machine.
|
|
11
6
|
//
|
|
@@ -24,134 +19,24 @@ import { json_value } from '#scripts/lib/json-value'
|
|
|
24
19
|
// worker.
|
|
25
20
|
//
|
|
26
21
|
// **The division activates only under concurrency.** One run in flight — every solo run, CI included
|
|
27
|
-
// — gets
|
|
28
|
-
//
|
|
22
|
+
// — gets no share from it; what bounds a solo run is the claim it was admitted on (`cap_to_claim`),
|
|
23
|
+
// which for a direct run is vitest's own default on a small machine such as a four-core CI runner
|
|
24
|
+
// (`gate_plan.direct_unit_weight`, joshuafolkken/kit#4607).
|
|
25
|
+
//
|
|
26
|
+
// **The run markers and their division of the machine are `unit-run-marker.ts`**, the part the vitest
|
|
27
|
+
// config imports (joshuafolkken/kit#4572); the capacity and claim bounds and the flag handling are here.
|
|
28
|
+
const { MIN_WORKERS, NESTED_KEY, NESTED_VALUE, SOLO_RUNS } = unit_run_marker
|
|
29
|
+
const { is_nested_run, live_run_count, mark_run_started, marker_path, resolve_unit_workers } =
|
|
30
|
+
unit_run_marker
|
|
29
31
|
|
|
30
|
-
// A record that means something only while it exists, in the shape `stamp-file.ts` already keeps for
|
|
31
|
-
// the in-flight gate marker. Keyed by pid rather than by checkout: `josh gate`'s unit step and a
|
|
32
|
-
// `josh test:related` can be in flight in one checkout at once, and both of them are load.
|
|
33
|
-
const RUN_PREFIX = 'josh-unit-running-'
|
|
34
32
|
// Vitest's own flag, in both spellings its CLI accepts — it normalizes `--max-workers` to the same
|
|
35
33
|
// option, so a run that recognized only one of them would replace a number the caller typed with the
|
|
36
34
|
// share and contradict the promise below. The camel-case one is what gets written.
|
|
37
35
|
const WORKER_FLAG = '--maxWorkers'
|
|
38
36
|
const WORKER_FLAGS: ReadonlyArray<string> = [WORKER_FLAG, '--max-workers']
|
|
39
|
-
//
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
const SOLO_RUNS = 1
|
|
43
|
-
|
|
44
|
-
// A marker is the writing process's identity and nothing else; a pid-only marker has an answer of its
|
|
45
|
-
// own below (`is_running`) rather than being rejected here.
|
|
46
|
-
type RunMarker = ProcessOwner
|
|
47
|
-
|
|
48
|
-
function marker_path(pid: number = process.pid): string {
|
|
49
|
-
return stamp_file.stamp_path(RUN_PREFIX, String(pid))
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
// **A marker is evidence, and the process behind it is the test.** A run killed outright leaves its
|
|
53
|
-
// file behind, and a count that trusted the file alone would hold every later run down to one worker
|
|
54
|
-
// for good — the failure mode `run-hold.ts` answers with an expiry, which cannot be sized here because
|
|
55
|
-
// a unit suite under six-way load already takes minutes. The process that writes this marker is the
|
|
56
|
-
// long-lived one, so unlike a `run:hold` record its identity is a liveness test rather than a note for
|
|
57
|
-
// the reader.
|
|
58
|
-
//
|
|
59
|
-
// **The pid alone was not that identity**. The section below already named
|
|
60
|
-
// what goes wrong — a reissued pid turns a leaked marker into a permanent phantom — and answered it by
|
|
61
|
-
// sweeping, which only ever collected the markers whose pid had *not* yet been reissued. Since the
|
|
62
|
-
// record now carries the writing process's start time beside its pid, a reissued pid is recognized as
|
|
63
|
-
// a different process and swept like any other dead one. A pid that is not positive is caught by the
|
|
64
|
-
// same check, inside `process_identity`: `process.kill(0, …)` addresses the caller's own process group
|
|
65
|
-
// rather than a process, so a truncated or hand-edited marker would otherwise answer "alive" forever.
|
|
66
|
-
//
|
|
67
|
-
// **"Cannot tell" counts as live here, which is the opposite of what the in-flight gate marker's
|
|
68
|
-
// readers do with it, and deliberately so.** A marker with no recorded start time — written before the
|
|
69
|
-
// field existed, or on a platform where it cannot be read — resolves toward *more* sharing: being
|
|
70
|
-
// wrong that way costs this run a narrower share of the machine, while being wrong the other way puts
|
|
71
|
-
// six unit suites on eleven cores, an oversubscription measured at a load
|
|
72
|
-
// average of 209.
|
|
73
|
-
function is_running(marker: RunMarker): boolean {
|
|
74
|
-
return process_identity.is_same_process(marker.pid, marker.process_start) !== false
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
function read_marker(source: string): RunMarker | undefined {
|
|
78
|
-
const raw = stamp_file.read_stamp_text(source)
|
|
79
|
-
|
|
80
|
-
if (raw === undefined) return undefined
|
|
81
|
-
|
|
82
|
-
const parsed = process_owner_schema.safeParse(json_value.parse_or_undefined(raw))
|
|
83
|
-
|
|
84
|
-
return parsed.success ? parsed.data : undefined
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
// An unreadable temp directory answers "no other run", which is the direction that leaves behavior
|
|
88
|
-
// as it was rather than throttling a run on a guess. Unlike the network guard, being wrong here costs
|
|
89
|
-
// wall time and never a false result.
|
|
90
|
-
function marker_files(directory: string = PLATFORM_TEMP_ROOT): Array<string> {
|
|
91
|
-
try {
|
|
92
|
-
return readdirSync(directory).filter((name) => name.startsWith(RUN_PREFIX))
|
|
93
|
-
} catch {
|
|
94
|
-
return []
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
// **A marker whose process is gone is removed, not merely skipped.** Skipping it is correct only until
|
|
99
|
-
// the operating system reissues that pid to something else, which on a machine left running for days
|
|
100
|
-
// it will — and from then on the phantom is counted as a live run for good, with every solo run held
|
|
101
|
-
// at one worker and `josh gate` announcing lanes that do not exist. `finally` in `with_run_marker`
|
|
102
|
-
// cannot prevent the leak, because the interrupt that produces it (Ctrl-C reaching the whole foreground
|
|
103
|
-
// group) does not unwind. Sweeping on read is what bounds it: the first later run collects it.
|
|
104
|
-
function sweep_marker(source: string): void {
|
|
105
|
-
try {
|
|
106
|
-
stamp_file.remove_stamp(source)
|
|
107
|
-
} catch {
|
|
108
|
-
/* not ours to remove; counting it out is the whole requirement */
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
// **Only a marker that parsed to a dead pid is swept, and the unlink still cannot throw.** A marker
|
|
113
|
-
// this account may not read — another user's file on a sticky `/tmp` — is `undefined` here, and
|
|
114
|
-
// deleting on that answer would raise `EPERM` from a path with no `catch` between it and
|
|
115
|
-
// `announce_gate_plan`: an unreadable file belonging to somebody else would abort the gate outright,
|
|
116
|
-
// which is worse than the leak this sweep exists for. Unreadable therefore counts as not-live and is
|
|
117
|
-
// left alone, exactly as it was before the sweep existed.
|
|
118
|
-
function is_marker_live(source: string): boolean {
|
|
119
|
-
const marker = read_marker(source)
|
|
120
|
-
|
|
121
|
-
if (marker === undefined) return false
|
|
122
|
-
if (is_running(marker)) return true
|
|
123
|
-
|
|
124
|
-
sweep_marker(source)
|
|
125
|
-
|
|
126
|
-
return false
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
// Every marker in the temp directory whose process is still alive. This run's own is deliberately not
|
|
130
|
-
// among them: both callers count *before* writing theirs, so the `+ 1` at the call site adds it.
|
|
131
|
-
function live_run_count(directory: string = PLATFORM_TEMP_ROOT): number {
|
|
132
|
-
return marker_files(directory).filter((name) => is_marker_live(path.join(directory, name))).length
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
// **The gate claims its place before its unit step exists, and the child must not claim a second
|
|
136
|
-
// one.** `josh gate` counts the runs in flight and then spawns `josh test:unit`, so without this the
|
|
137
|
-
// marker appears a second or so after the count that needed it — and two lanes launched together, the
|
|
138
|
-
// shape `epicrun` produces, both read "nothing else is running" and both take the whole machine. The
|
|
139
|
-
// gate therefore marks itself around the whole run and passes this down through the environment; the
|
|
140
|
-
// guard inside the child sees it and marks nothing, because the two processes are one run.
|
|
141
|
-
const NESTED_KEY = 'JOSH_UNIT_RUN_MARKED'
|
|
142
|
-
const NESTED_VALUE = '1'
|
|
143
|
-
|
|
144
|
-
function is_nested_run(): boolean {
|
|
145
|
-
return process.env[NESTED_KEY] === NESTED_VALUE
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
// **`undefined` at one run means "leave the choice where it was".** The gate then applies its own
|
|
149
|
-
// core reservation and the hook passes no flag at all, which is what both did before this existed.
|
|
150
|
-
function resolve_unit_workers(available_cores: number, runs: number): number | undefined {
|
|
151
|
-
if (runs <= SOLO_RUNS) return undefined
|
|
152
|
-
|
|
153
|
-
return Math.max(MIN_WORKERS, Math.floor(available_cores / runs))
|
|
154
|
-
}
|
|
37
|
+
// The core vitest's own process — the pool, the reporter and Vite's transforms — keeps busy beside its
|
|
38
|
+
// workers (joshuafolkken/kit#4362). A direct run's claim holds it above its worker count.
|
|
39
|
+
const MAIN_PROCESS_CORES = 1
|
|
155
40
|
|
|
156
41
|
// **The run count divides the machine; the free cores bound what that division hands out.** The
|
|
157
42
|
// share counts only unit runs, so load from outside the core budget's ledger — Claude sessions, other
|
|
@@ -169,6 +54,50 @@ function cap_to_free(
|
|
|
169
54
|
return Math.max(MIN_WORKERS, Math.floor(free_cores))
|
|
170
55
|
}
|
|
171
56
|
|
|
57
|
+
// What the machine has free for this run's workers, both from `free-cores.ts`'s one reading: the free
|
|
58
|
+
// cores, and the workers the free memory holds. Either is `undefined` where it could not be read.
|
|
59
|
+
interface FreeCapacity {
|
|
60
|
+
cores: number | undefined
|
|
61
|
+
memory_workers: number | undefined
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
const UNREAD_CAPACITY: FreeCapacity = { cores: undefined, memory_workers: undefined }
|
|
65
|
+
|
|
66
|
+
// **The free memory bounds the share as the free cores do** (joshuafolkken/kit#4528). Lanes running
|
|
67
|
+
// their suites at once each sized workers from the cores alone, so their workers' memory piled up
|
|
68
|
+
// until the batch stopped opening lanes. Both bounds go through `cap_to_free`, so an unread one leaves
|
|
69
|
+
// the share as it was.
|
|
70
|
+
function cap_to_capacity(
|
|
71
|
+
workers: number | undefined,
|
|
72
|
+
free: FreeCapacity,
|
|
73
|
+
available_cores: number,
|
|
74
|
+
): number | undefined {
|
|
75
|
+
const core_capped = cap_to_free(workers, free.cores, available_cores)
|
|
76
|
+
|
|
77
|
+
return cap_to_free(core_capped, free.memory_workers, available_cores)
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// The core-budget claim a unit run holds: the weight it reserved, and the narrower one it was admitted
|
|
81
|
+
// at past the wait cap.
|
|
82
|
+
interface UnitClaim {
|
|
83
|
+
weight: number
|
|
84
|
+
granted?: number | undefined
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// **The share never exceeds the claim the run was admitted on** (joshuafolkken/kit#4235). The share is
|
|
88
|
+
// read after admission, when fewer runs may be in flight than when the weight was sized, and a share
|
|
89
|
+
// wider than the claim puts workers on the machine the ledger does not hold. The claim bounds a solo
|
|
90
|
+
// share too: vitest's own choice is one worker per core but one, wider than the weight the ledger
|
|
91
|
+
// reserves for a unit run from seven cores up, so leaving it in place would open workers no claim holds. The claim holds
|
|
92
|
+
// vitest's own process as well, so its workers are the claim less that core.
|
|
93
|
+
function cap_to_claim(share: number | undefined, claim: UnitClaim | undefined): number | undefined {
|
|
94
|
+
if (claim === undefined) return share
|
|
95
|
+
|
|
96
|
+
const bound = Math.max(MIN_WORKERS, (claim.granted ?? claim.weight) - MAIN_PROCESS_CORES)
|
|
97
|
+
|
|
98
|
+
return Math.min(share ?? bound, bound)
|
|
99
|
+
}
|
|
100
|
+
|
|
172
101
|
// The share this run may take, read from the machine. Separate from `resolve_unit_workers` so that
|
|
173
102
|
// one stays a pure function of two numbers and every test of it can pass them.
|
|
174
103
|
//
|
|
@@ -179,12 +108,12 @@ function cap_to_free(
|
|
|
179
108
|
function current_share(
|
|
180
109
|
available_cores: number = availableParallelism(),
|
|
181
110
|
live_runs: number = live_run_count(),
|
|
182
|
-
|
|
111
|
+
free: FreeCapacity = UNREAD_CAPACITY,
|
|
183
112
|
): number | undefined {
|
|
184
113
|
const own_run = is_nested_run() ? 0 : SOLO_RUNS
|
|
185
114
|
const share = resolve_unit_workers(available_cores, live_runs + own_run)
|
|
186
115
|
|
|
187
|
-
return
|
|
116
|
+
return cap_to_capacity(share, free, available_cores)
|
|
188
117
|
}
|
|
189
118
|
|
|
190
119
|
function is_worker_flag(argument: string): boolean {
|
|
@@ -213,17 +142,6 @@ function worker_arguments(
|
|
|
213
142
|
return [`${WORKER_FLAG}=${String(share)}`]
|
|
214
143
|
}
|
|
215
144
|
|
|
216
|
-
// **The write failing is not a reason to fail the run.** A marker that could not be written costs the
|
|
217
|
-
// next run a wider share than it should have — the behavior that was there before — while a thrown
|
|
218
|
-
// error here would fail a unit suite over bookkeeping.
|
|
219
|
-
function mark_run_started(target: string): void {
|
|
220
|
-
try {
|
|
221
|
-
stamp_file.write_stamp(target, process_identity.own_fields())
|
|
222
|
-
} catch {
|
|
223
|
-
/* a missing marker costs a wide share, never a wrong result */
|
|
224
|
-
}
|
|
225
|
-
}
|
|
226
|
-
|
|
227
145
|
// `finally`, so a suite that threw still clears its marker — and so does the nested branch, which
|
|
228
146
|
// restores nothing because it wrote nothing.
|
|
229
147
|
async function with_run_marker<T>(run: () => Promise<T>): Promise<T> {
|
|
@@ -245,21 +163,16 @@ async function with_run_marker<T>(run: () => Promise<T>): Promise<T> {
|
|
|
245
163
|
}
|
|
246
164
|
|
|
247
165
|
const unit_worker_share = {
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
SOLO_RUNS,
|
|
166
|
+
...unit_run_marker,
|
|
167
|
+
MAIN_PROCESS_CORES,
|
|
168
|
+
cap_to_capacity,
|
|
169
|
+
cap_to_claim,
|
|
253
170
|
cap_to_free,
|
|
254
171
|
current_share,
|
|
255
172
|
has_worker_flag,
|
|
256
|
-
is_nested_run,
|
|
257
|
-
live_run_count,
|
|
258
|
-
marker_path,
|
|
259
|
-
read_marker,
|
|
260
|
-
resolve_unit_workers,
|
|
261
173
|
with_run_marker,
|
|
262
174
|
worker_arguments,
|
|
263
175
|
}
|
|
264
176
|
|
|
177
|
+
export type { FreeCapacity, UnitClaim }
|
|
265
178
|
export { unit_worker_share }
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
// The Vite cache directory `vitest.config.ts` hands a vitest run in a throwaway tree (joshuafolkken/kit#4770).
|
|
2
|
+
//
|
|
3
|
+
// **A tree from `base-tree.ts` borrows this checkout's `node_modules`**, and vitest keys its dependency
|
|
4
|
+
// optimizer's cache by project name alone, so a `josh test:red` / `josh test:pinned` run beside the gate
|
|
5
|
+
// re-bundled the same `node_modules/.vite/vitest/<hash>/deps_ssr` the gate was importing from, and a gate
|
|
6
|
+
// file failed on a deleted `execa.js`. The tree's run names a directory of its own through
|
|
7
|
+
// `CACHE_DIRECTORY_KEY`; any other run leaves it unset and keeps Vite's default.
|
|
8
|
+
|
|
9
|
+
const CACHE_DIRECTORY_KEY = 'JOSH_VITEST_CACHE_DIR'
|
|
10
|
+
|
|
11
|
+
function config_cache_directory(environment: NodeJS.ProcessEnv = process.env): string | undefined {
|
|
12
|
+
const directory = environment[CACHE_DIRECTORY_KEY] ?? ''
|
|
13
|
+
|
|
14
|
+
return directory === '' ? undefined : directory
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
const vitest_cache_directory = { CACHE_DIRECTORY_KEY, config_cache_directory }
|
|
18
|
+
|
|
19
|
+
export { vitest_cache_directory }
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
// **A command line's `--exclude` reaches both unit projects** (joshuafolkken/kit#5105): vitest applies
|
|
2
|
+
// the flag to the root config alone, which the inline projects of `tools/test/unit-projects.ts` do not
|
|
3
|
+
// inherit, so without this it excluded nothing. `josh test:related` passes it to leave the heavy files
|
|
4
|
+
// out of a scoped run. A leaf module, since `vitest.config.ts` imports it.
|
|
5
|
+
|
|
6
|
+
const EXCLUDE_FLAG = '--exclude'
|
|
7
|
+
|
|
8
|
+
function cli_excludes(argv: ReadonlyArray<string>): Array<string> {
|
|
9
|
+
return argv.slice(1).filter((_argument, index) => argv[index] === EXCLUDE_FLAG)
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
const vitest_cli_excludes = { EXCLUDE_FLAG, cli_excludes }
|
|
13
|
+
|
|
14
|
+
export { vitest_cli_excludes }
|