@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,96 @@
|
|
|
1
|
+
import { project_checks } from '#scripts/gate/project-checks'
|
|
2
|
+
import type { ChangedFileScope } from '#scripts/git/changed-file-scope'
|
|
3
|
+
import { buffered_process, type BufferedProcessResult } from '#scripts/lib/buffered-process'
|
|
4
|
+
|
|
5
|
+
// The guard tests that judge source text alone, yet run only in `josh test:related` or a detached
|
|
6
|
+
// ship's pre-detach stop: a bare Issue citation, a source with no colocated test and a `gh` spawn
|
|
7
|
+
// outside `gh api` (the static half of the network guard; the calls a test *makes* are observed by
|
|
8
|
+
// `test-network-guard.ts`, which only a run can answer). `josh lint:related` runs them beside its
|
|
9
|
+
// lint, so a between-edits loop meets them in seconds rather than at the ship (joshuafolkken/kit#4643).
|
|
10
|
+
// The targets are the pre-detach stop's too, so the two never drift.
|
|
11
|
+
//
|
|
12
|
+
// `josh exports:unused` stays out: its whole-program type-checker pass is several times the lint's
|
|
13
|
+
// own wall clock. `josh lint:related` runs its narrowed members check after a green lint instead
|
|
14
|
+
// (joshuafolkken/kit#4645).
|
|
15
|
+
//
|
|
16
|
+
// They run in kit alone: the guard tests are kit's own, and a consumer meets the pre-detach static
|
|
17
|
+
// checks there. A change with no `.ts` file in it moves none of their verdicts.
|
|
18
|
+
|
|
19
|
+
// A present directory need not hold a test the project's Vitest includes — a consumer's own
|
|
20
|
+
// `scripts/claude` of shell helpers, say — and a filter that matches nothing would stop every ship.
|
|
21
|
+
const GUARD_TEST_COMMAND: ReadonlyArray<string> = ['josh', 'test:unit', '--passWithNoTests']
|
|
22
|
+
const STRUCTURAL_GUARD_TARGETS: ReadonlyArray<string> = [
|
|
23
|
+
'scripts/issue/session-cite-scan.test.ts',
|
|
24
|
+
'tools/test/untested-sources.test.ts',
|
|
25
|
+
'tools/gh/gh-subcommand-guard.test.ts',
|
|
26
|
+
]
|
|
27
|
+
const STRUCTURAL_LISTS: ReadonlyArray<ReadonlyArray<string>> = [
|
|
28
|
+
[...GUARD_TEST_COMMAND, ...STRUCTURAL_GUARD_TARGETS],
|
|
29
|
+
]
|
|
30
|
+
const TYPESCRIPT_SUFFIX = '.ts'
|
|
31
|
+
const FAILURE_EXIT_CODE = 1
|
|
32
|
+
|
|
33
|
+
interface StructuralRun {
|
|
34
|
+
list: ReadonlyArray<string>
|
|
35
|
+
result: BufferedProcessResult
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// The front of a failed check's heading — `josh lane:value metrics-stops` counts a ship output that
|
|
39
|
+
// carries the metrics totals' one.
|
|
40
|
+
function failure_prefix(list: ReadonlyArray<string>): string {
|
|
41
|
+
return `✗ ${list.join(' ')} — `
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// Each failure is headed by the check's own command and how it ended: a check that failed with no
|
|
45
|
+
// output of its own (`ELIFECYCLE Command failed` alone, or nothing) otherwise names nothing to fix.
|
|
46
|
+
function failure_heading(list: ReadonlyArray<string>, result: BufferedProcessResult): string {
|
|
47
|
+
const ending =
|
|
48
|
+
result.exit_code === undefined
|
|
49
|
+
? 'no exit code (timed out or ended by a signal)'
|
|
50
|
+
: `exit code ${String(result.exit_code)}`
|
|
51
|
+
|
|
52
|
+
return `${failure_prefix(list)}${ending}`
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function failure_section(list: ReadonlyArray<string>, result: BufferedProcessResult): string {
|
|
56
|
+
const parts = [failure_heading(list, result), result.output.trim()]
|
|
57
|
+
|
|
58
|
+
return parts.filter((part) => part !== '').join('\n')
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// The whole-tree fallback is due as the narrowed run with a source in it is; both stay kit-only.
|
|
62
|
+
function is_due(scope: ChangedFileScope, root: string): boolean {
|
|
63
|
+
if (!project_checks.is_kit_repository(root)) return false
|
|
64
|
+
|
|
65
|
+
return scope.mode === 'all' || scope.files.some((file) => file.endsWith(TYPESCRIPT_SUFFIX))
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
async function run_in(root: string, list: ReadonlyArray<string>): Promise<StructuralRun> {
|
|
69
|
+
return { list, result: await buffered_process.run_buffered_process(list, { cwd: root }) }
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// All at once and buffered, every failure reported, so one run shows all there is to fix.
|
|
73
|
+
async function run_structural(scope: ChangedFileScope, root: string): Promise<number> {
|
|
74
|
+
if (!is_due(scope, root)) return 0
|
|
75
|
+
|
|
76
|
+
const runs = await Promise.all(STRUCTURAL_LISTS.map(async (list) => await run_in(root, list)))
|
|
77
|
+
const failed = runs.filter(({ result }) => buffered_process.is_process_failed(result))
|
|
78
|
+
|
|
79
|
+
if (failed.length === 0) return 0
|
|
80
|
+
|
|
81
|
+
const sections = failed.map(({ list, result }) => failure_section(list, result))
|
|
82
|
+
|
|
83
|
+
process.stdout.write(`\n${sections.join('\n\n')}\n`)
|
|
84
|
+
|
|
85
|
+
return FAILURE_EXIT_CODE
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
const structural_checks = {
|
|
89
|
+
GUARD_TEST_COMMAND,
|
|
90
|
+
STRUCTURAL_GUARD_TARGETS,
|
|
91
|
+
failure_prefix,
|
|
92
|
+
failure_section,
|
|
93
|
+
run_structural,
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
export { structural_checks }
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto'
|
|
2
|
+
import { existsSync, readdirSync, readFileSync } from 'node:fs'
|
|
3
|
+
import path from 'node:path'
|
|
4
|
+
|
|
5
|
+
// **The toolchain's inputs, listed once** (joshuafolkken/kit#4496): the files whose content moves what
|
|
6
|
+
// a tool answers while every source stays byte-identical — the installed packages, the eslint config
|
|
7
|
+
// and the TypeScript program's options. Every result kept across runs is discarded when they move:
|
|
8
|
+
// the metrics base cache (`metrics-base-cache.ts`), the hook bundles (`hook-bundle-stamp.ts`), the
|
|
9
|
+
// warm ESLint daemon (`eslint-daemon.ts`) and the gate's verdicts (`verification-inputs.ts`). A file
|
|
10
|
+
// added here reaches all of them.
|
|
11
|
+
//
|
|
12
|
+
// Loaded by plain `node` on every hook launch (`tools/hooks/hook-bundle-ready.ts`), so this module
|
|
13
|
+
// imports `node:` built-ins alone.
|
|
14
|
+
|
|
15
|
+
// The package manager's manifest, lock and settings files, and the record pnpm rewrites on every
|
|
16
|
+
// install — a consumer's eslint config imports its rules from installed packages.
|
|
17
|
+
const PACKAGE_FILES: ReadonlyArray<string> = [
|
|
18
|
+
'package.json',
|
|
19
|
+
'pnpm-lock.yaml',
|
|
20
|
+
'pnpm-workspace.yaml',
|
|
21
|
+
'package-lock.json',
|
|
22
|
+
'yarn.lock',
|
|
23
|
+
'bun.lock',
|
|
24
|
+
'bun.lockb',
|
|
25
|
+
'.npmrc',
|
|
26
|
+
'node_modules/.modules.yaml',
|
|
27
|
+
]
|
|
28
|
+
// The root entries of the eslint flat config and of the TypeScript program, and the directories of
|
|
29
|
+
// the rule modules and the shared compiler options they import.
|
|
30
|
+
const CONFIG_ENTRIES: ReadonlyArray<RegExp> = [
|
|
31
|
+
/^eslint\.config\.[cm]?[jt]s$/u,
|
|
32
|
+
/^tsconfig(?:\.[\w-]+)?\.json$/u,
|
|
33
|
+
]
|
|
34
|
+
const CONFIG_DIRECTORIES: ReadonlySet<string> = new Set(['eslint', 'tsconfig'])
|
|
35
|
+
// A test beside the rule modules configures nothing.
|
|
36
|
+
const TEST_MARKER = '.test.'
|
|
37
|
+
const SEPARATOR = '/'
|
|
38
|
+
const DIGEST_ALGORITHM = 'sha256'
|
|
39
|
+
|
|
40
|
+
// Code-unit order, so the digest does not depend on the locale of the machine that computes it.
|
|
41
|
+
function by_code_unit(left: string, right: string): number {
|
|
42
|
+
if (left === right) return 0
|
|
43
|
+
|
|
44
|
+
return left < right ? -1 : 1
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function to_posix(relative: string): string {
|
|
48
|
+
return relative.split(path.sep).join(SEPARATOR)
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function is_config_entry(name: string): boolean {
|
|
52
|
+
return CONFIG_ENTRIES.some((entry) => entry.test(name))
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function is_config_module(relative: string): boolean {
|
|
56
|
+
const [top = ''] = relative.split(SEPARATOR, 1)
|
|
57
|
+
|
|
58
|
+
return CONFIG_DIRECTORIES.has(top) && !path.basename(relative).includes(TEST_MARKER)
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// Whether the root-relative `relative` is a toolchain input.
|
|
62
|
+
function is_input(relative: string): boolean {
|
|
63
|
+
const posix = to_posix(relative)
|
|
64
|
+
if (PACKAGE_FILES.includes(posix)) return true
|
|
65
|
+
|
|
66
|
+
return is_config_entry(posix) || is_config_module(posix)
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// Files only: a directory moves on every entry created in it, an editor's temp file too.
|
|
70
|
+
function modules_under(root: string, directory: string): ReadonlyArray<string> {
|
|
71
|
+
const absolute = path.join(root, directory)
|
|
72
|
+
if (!existsSync(absolute)) return []
|
|
73
|
+
|
|
74
|
+
return readdirSync(absolute, { recursive: true, withFileTypes: true })
|
|
75
|
+
.filter((entry) => entry.isFile())
|
|
76
|
+
.map((entry) => to_posix(path.relative(root, path.join(entry.parentPath, entry.name))))
|
|
77
|
+
.filter((relative) => is_config_module(relative))
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// The root-relative toolchain inputs present under `root`, in code-unit order.
|
|
81
|
+
function paths(root: string): ReadonlyArray<string> {
|
|
82
|
+
const present = PACKAGE_FILES.filter((relative) => existsSync(path.join(root, relative)))
|
|
83
|
+
const entries = readdirSync(root).filter((name) => is_config_entry(name))
|
|
84
|
+
const modules = [...CONFIG_DIRECTORIES].flatMap((directory) => modules_under(root, directory))
|
|
85
|
+
|
|
86
|
+
return [...present, ...entries, ...modules].toSorted(by_code_unit)
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
function read_or_empty(file: string): Uint8Array {
|
|
90
|
+
try {
|
|
91
|
+
return readFileSync(file)
|
|
92
|
+
} catch {
|
|
93
|
+
return new Uint8Array()
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// **The fingerprint of the toolchain under `root`**: each input's path and content, in code-unit
|
|
98
|
+
// order, so an added, removed, renamed or edited input changes it. A file gone between the listing
|
|
99
|
+
// and its read hashes as empty.
|
|
100
|
+
function digest(root: string): string {
|
|
101
|
+
const hash = createHash(DIGEST_ALGORITHM)
|
|
102
|
+
|
|
103
|
+
for (const relative of paths(root)) {
|
|
104
|
+
hash
|
|
105
|
+
.update(`${relative}\0`)
|
|
106
|
+
.update(read_or_empty(path.join(root, relative)))
|
|
107
|
+
.update('\0')
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
return hash.digest('hex')
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
const toolchain_inputs = { digest, is_input, PACKAGE_FILES, paths }
|
|
114
|
+
|
|
115
|
+
export { toolchain_inputs }
|
|
@@ -3,18 +3,19 @@ import { fileURLToPath } from 'node:url'
|
|
|
3
3
|
import type { FileMapStamp } from '#scripts/josh/file-map-stamp'
|
|
4
4
|
import { GATE_COMMAND } from '#scripts/josh/josh-command-types'
|
|
5
5
|
import { composite_arguments, USAGE_ERROR_EXIT_CODE } from '#scripts/josh/josh-composite-arguments'
|
|
6
|
-
import {
|
|
6
|
+
import { lane_child_marker } from '#scripts/lane/lane-child-marker'
|
|
7
|
+
import { lane_ledger_write } from '#scripts/lane/lane-ledger-write'
|
|
7
8
|
import { FAIL_EXIT_CODE } from '#scripts/lib/buffered-process'
|
|
8
9
|
import { review_stamps } from '#scripts/review/review-stamps'
|
|
9
10
|
import { review_tree } from '#scripts/review/review-tree'
|
|
10
11
|
import { unit_worker_share } from '#scripts/test/unit-worker-share'
|
|
11
12
|
import { check_reuse, type CheckRecords } from './check-reuse'
|
|
12
|
-
import { free_cores } from './free-cores'
|
|
13
13
|
import { gate_ledger, type GateLedgerStart } from './gate-ledger'
|
|
14
14
|
import { gate_plan, type GatePlan } from './gate-plan'
|
|
15
15
|
import { gate_report, type GateStepResult } from './gate-report'
|
|
16
16
|
import { gate_run_steps, type ReusedChecks } from './gate-run-steps'
|
|
17
17
|
import { gate_skip } from './gate-skip'
|
|
18
|
+
import { gate_static_group } from './gate-static-group'
|
|
18
19
|
import { build_gate_step, build_gate_steps, UNIT_WORKER_FLAG } from './gate-steps'
|
|
19
20
|
import { gate_tree, type GateTree } from './gate-tree'
|
|
20
21
|
import { project_checks } from './project-checks'
|
|
@@ -165,11 +166,17 @@ async function run_marked_gate<T>(
|
|
|
165
166
|
// The concurrent-run count is read here rather than inside `gate-plan.ts` for the reason the core
|
|
166
167
|
// count already is: that module stays a pure function of its inputs, and the machine is asked once and
|
|
167
168
|
// handed to both calls. Counted *before* the unit step writes its own marker, so `+ 1` is this gate.
|
|
168
|
-
//
|
|
169
|
+
//
|
|
170
|
+
// **The free cores do not cap the plan** (joshuafolkken/kit#4167). The unit claim's admission narrows it
|
|
171
|
+
// to the room the outside load leaves, read over its wait rather than once at the gate's start — a
|
|
172
|
+
// width fixed off one busy instant held for the whole suite (`core_admission.is_too_narrow`).
|
|
173
|
+
//
|
|
174
|
+
// A `--static-group` narrows the resolved plan's checks and keeps its concurrency, which the full static
|
|
175
|
+
// set sized: a cap above the narrowed count never binds.
|
|
169
176
|
function announce_gate_plan(
|
|
170
177
|
is_unit_included: boolean,
|
|
171
178
|
available_cores: number,
|
|
172
|
-
|
|
179
|
+
static_group?: string,
|
|
173
180
|
): GatePlan {
|
|
174
181
|
const concurrent_runs = unit_worker_share.live_run_count() + unit_worker_share.SOLO_RUNS
|
|
175
182
|
const is_kit_repository = project_checks.is_kit_repository(process.cwd())
|
|
@@ -179,7 +186,10 @@ function announce_gate_plan(
|
|
|
179
186
|
is_unit_included,
|
|
180
187
|
is_kit_repository,
|
|
181
188
|
)
|
|
182
|
-
const plan =
|
|
189
|
+
const plan = {
|
|
190
|
+
...resolved,
|
|
191
|
+
checks: gate_static_group.narrow_checks(resolved.checks, static_group),
|
|
192
|
+
}
|
|
183
193
|
|
|
184
194
|
process.stdout.write(`${gate_plan.format_gate_plan(plan, available_cores, concurrent_runs)}\n`)
|
|
185
195
|
|
|
@@ -198,6 +208,8 @@ interface GateOptions {
|
|
|
198
208
|
// Whether the unit suite is one of this gate's checks. Defaults to true everywhere; only
|
|
199
209
|
// `--no-unit` turns it off, for the CI job that runs the suite on a runner of its own.
|
|
200
210
|
is_unit_included?: boolean
|
|
211
|
+
// The one static group a CI matrix leg runs (`gate-static-group.ts`); set only with the unit suite off.
|
|
212
|
+
static_group?: string | undefined
|
|
201
213
|
stamp_path?: string
|
|
202
214
|
marker_path?: string
|
|
203
215
|
// The gate log's destination, a parameter for the same reason the two above are: this suite runs
|
|
@@ -217,10 +229,6 @@ interface GateOptions {
|
|
|
217
229
|
// Where each check's own green record lives (`check-reuse.ts`). Only the CLI entry resolves it, for
|
|
218
230
|
// the ledger's reason: a suite whose checks never ran must not record them green on the live tree.
|
|
219
231
|
check_records?: CheckRecords | undefined
|
|
220
|
-
// The cores free of load from outside the core budget's ledger (`free-cores.ts`). Only the CLI entry
|
|
221
|
-
// resolves it, for the ledger's reason: a suite driving the gate never reads the machine, so its plan
|
|
222
|
-
// does not depend on what else happened to be running.
|
|
223
|
-
read_free_cores?: ((available_cores: number) => Promise<number | undefined>) | undefined
|
|
224
232
|
}
|
|
225
233
|
|
|
226
234
|
// **Per-check records belong to the full local gate alone**: CI's `--no-unit` gate is the safety net
|
|
@@ -260,7 +268,10 @@ function scoped_precheck_refusal(tree: GateTree, options: GateOptions): string |
|
|
|
260
268
|
return undefined
|
|
261
269
|
}
|
|
262
270
|
|
|
263
|
-
return scoped_green.refusal_for(tree.files, tree.base,
|
|
271
|
+
return scoped_green.refusal_for(tree.files, tree.base, {
|
|
272
|
+
is_lane_child: lane_child_marker.is_child_of(process.cwd()),
|
|
273
|
+
...options.scoped_sources,
|
|
274
|
+
})
|
|
264
275
|
}
|
|
265
276
|
|
|
266
277
|
// **A partial gate records nothing green, and this is the same rule as the skip one layer out**.
|
|
@@ -325,9 +336,7 @@ async function run_checked_gate(
|
|
|
325
336
|
// Resolved at the gate's entry, before this gate sets `JOSH_UNIT_RUN_MARKED`, so a gate nested in the
|
|
326
337
|
// unit suite reads the flag as set and reserves nothing.
|
|
327
338
|
const budget = gate_run_steps.default_budget()
|
|
328
|
-
|
|
329
|
-
const free = await options.read_free_cores?.(budget.available_cores)
|
|
330
|
-
const plan = announce_gate_plan(is_unit_included, budget.available_cores, free)
|
|
339
|
+
const plan = announce_gate_plan(is_unit_included, budget.available_cores, options.static_group)
|
|
331
340
|
const reused = await checks_to_reuse(plan, tree, options)
|
|
332
341
|
|
|
333
342
|
// **The gate holds the unit-run marker for its whole run, not just its unit step.** The step that
|
|
@@ -353,17 +362,30 @@ function reusable_stamp(tree: GateTree, options: GateOptions): FileMapStamp | un
|
|
|
353
362
|
return gate_skip.reusable_green_gate(tree.files, tree.base, options.stamp_path)
|
|
354
363
|
}
|
|
355
364
|
|
|
365
|
+
// The reuse leaves its line in the ledger too, so `josh lane:stats` counts the gates it saved
|
|
366
|
+
// (joshuafolkken/kit#4397).
|
|
367
|
+
async function reuse_gate(
|
|
368
|
+
stamp: FileMapStamp,
|
|
369
|
+
options: GateOptions,
|
|
370
|
+
started_at: number,
|
|
371
|
+
): Promise<number> {
|
|
372
|
+
process.stdout.write(`${gate_skip.format_skip(stamp.taken_at)}\n`)
|
|
373
|
+
await gate_ledger.record_reused(options.ledger_path, performance.now() - started_at)
|
|
374
|
+
|
|
375
|
+
return 0
|
|
376
|
+
}
|
|
377
|
+
|
|
356
378
|
// The two ways a gate ends before it runs a check: a green record it can reuse (exit 0), and the
|
|
357
379
|
// scoped pre-check refusing a tree the pair has not been green on (exit 1). `undefined` means neither
|
|
358
380
|
// fired and the checks run. **Nothing else stands between the skip and the checks.**
|
|
359
|
-
function short_circuit_gate(
|
|
381
|
+
async function short_circuit_gate(
|
|
382
|
+
tree: GateTree,
|
|
383
|
+
options: GateOptions,
|
|
384
|
+
started_at: number,
|
|
385
|
+
): Promise<number | undefined> {
|
|
360
386
|
const reusable = reusable_stamp(tree, options)
|
|
361
387
|
|
|
362
|
-
if (reusable !== undefined)
|
|
363
|
-
process.stdout.write(`${gate_skip.format_skip(reusable.taken_at)}\n`)
|
|
364
|
-
|
|
365
|
-
return 0
|
|
366
|
-
}
|
|
388
|
+
if (reusable !== undefined) return await reuse_gate(reusable, options, started_at)
|
|
367
389
|
|
|
368
390
|
const scoped_refusal = scoped_precheck_refusal(tree, options)
|
|
369
391
|
|
|
@@ -379,7 +401,7 @@ async function run_verification_gate(options: GateOptions = {}): Promise<number>
|
|
|
379
401
|
// four checks alone took — the gate's own bookkeeping is part of the wait either way.
|
|
380
402
|
const started_at = performance.now()
|
|
381
403
|
const tree = await gate_tree.read_gate_tree()
|
|
382
|
-
const short_circuit = short_circuit_gate(tree, options)
|
|
404
|
+
const short_circuit = await short_circuit_gate(tree, options, started_at)
|
|
383
405
|
|
|
384
406
|
if (short_circuit !== undefined) return short_circuit
|
|
385
407
|
|
|
@@ -402,31 +424,48 @@ const ACCEPTED_FLAGS: ReadonlyArray<string> = [VERBOSE_FLAG, gate_skip.FORCE_FLA
|
|
|
402
424
|
|
|
403
425
|
// The flags are the caller's, the destinations are the run's, so the two are merged here rather than
|
|
404
426
|
// letting an option override a flag the user typed.
|
|
427
|
+
function unknown_arguments(extra_arguments: ReadonlyArray<string>): ReadonlyArray<string> {
|
|
428
|
+
return extra_arguments.filter(
|
|
429
|
+
(argument) =>
|
|
430
|
+
!ACCEPTED_FLAGS.includes(argument) && gate_static_group.group_of(argument) === undefined,
|
|
431
|
+
)
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
// The shared refusal, plus the arguments it is actually about. Some flags are accepted, so the bare
|
|
435
|
+
// "takes no extra arguments" would send a reader to drop the ones that work. The list is interpolated
|
|
436
|
+
// rather than spelled out here, so adding a flag cannot leave this line stale.
|
|
437
|
+
function write_refusal(unknown: ReadonlyArray<string>): void {
|
|
438
|
+
const groups = Object.keys(gate_static_group.STATIC_GROUPS).join('|')
|
|
439
|
+
|
|
440
|
+
process.stderr.write(
|
|
441
|
+
`${composite_arguments.format_rejection(GATE_COMMAND, GATE_TARGETS)}\n` +
|
|
442
|
+
` refused: ${unknown.join(' ')}\n` +
|
|
443
|
+
` accepted here: ${ACCEPTED_FLAGS.join(' ')} ${gate_static_group.STATIC_GROUP_FLAG_PREFIX}<${groups}>\n`,
|
|
444
|
+
)
|
|
445
|
+
}
|
|
446
|
+
|
|
405
447
|
async function run_gate_command(
|
|
406
448
|
extra_arguments: ReadonlyArray<string>,
|
|
407
449
|
options: GateOptions = {},
|
|
408
450
|
): Promise<number> {
|
|
409
|
-
const unknown = extra_arguments
|
|
451
|
+
const unknown = unknown_arguments(extra_arguments)
|
|
410
452
|
|
|
411
453
|
if (unknown.length > 0) {
|
|
412
|
-
|
|
413
|
-
// bare "takes no extra arguments" would send a reader to drop the ones that work. The list is
|
|
414
|
-
// interpolated rather than spelled out here, so adding a flag cannot leave this line stale.
|
|
415
|
-
process.stderr.write(
|
|
416
|
-
`${composite_arguments.format_rejection(GATE_COMMAND, GATE_TARGETS)}\n` +
|
|
417
|
-
` refused: ${unknown.join(' ')}\n` +
|
|
418
|
-
` accepted here: ${ACCEPTED_FLAGS.join(' ')}\n`,
|
|
419
|
-
)
|
|
454
|
+
write_refusal(unknown)
|
|
420
455
|
|
|
421
456
|
return USAGE_ERROR_EXIT_CODE
|
|
422
457
|
}
|
|
423
458
|
|
|
459
|
+
// A static group is a part of the static set, so it implies `--no-unit` and every withholding that flag carries.
|
|
460
|
+
const static_group = gate_static_group.find_group(extra_arguments)
|
|
461
|
+
|
|
424
462
|
return await run_verification_gate({
|
|
425
463
|
is_scoped_enforced: true,
|
|
426
464
|
...options,
|
|
427
465
|
is_verbose: extra_arguments.includes(VERBOSE_FLAG),
|
|
428
466
|
is_forced: extra_arguments.includes(gate_skip.FORCE_FLAG),
|
|
429
|
-
is_unit_included: !extra_arguments.includes(NO_UNIT_FLAG),
|
|
467
|
+
is_unit_included: !extra_arguments.includes(NO_UNIT_FLAG) && static_group === undefined,
|
|
468
|
+
static_group,
|
|
430
469
|
})
|
|
431
470
|
}
|
|
432
471
|
|
|
@@ -436,9 +475,8 @@ async function run_gate_command(
|
|
|
436
475
|
// process end on its own, which it can, since every child has already exited by here.
|
|
437
476
|
if (process.argv[1] === fileURLToPath(import.meta.url)) {
|
|
438
477
|
process.exitCode = await run_gate_command(process.argv.slice(FIRST_ARGUMENT_INDEX), {
|
|
439
|
-
ledger_path: await
|
|
478
|
+
ledger_path: await lane_ledger_write.target(),
|
|
440
479
|
check_records: check_reuse.DEFAULT_RECORDS,
|
|
441
|
-
read_free_cores: async (available_cores) => await free_cores.read({ available_cores }),
|
|
442
480
|
})
|
|
443
481
|
}
|
|
444
482
|
|
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
import { readFileSync } from 'node:fs'
|
|
2
|
+
import path from 'node:path'
|
|
3
|
+
import { PROJECT_ROOT } from '#scripts/init/init-paths'
|
|
4
|
+
import { lint_related_scope } from '#scripts/lint/lint-related-scope'
|
|
5
|
+
import { gate_labels } from './gate-labels'
|
|
6
|
+
import { input_fingerprint } from './input-fingerprint'
|
|
7
|
+
import { toolchain_inputs } from './toolchain-inputs'
|
|
8
|
+
|
|
9
|
+
// **What each verification depends on, declared once** (joshuafolkken/kit#4495). Every reuse of a
|
|
10
|
+
// verdict — the whole gate (`gate-skip.ts`), one check (`check-reuse.ts`), a scoped record
|
|
11
|
+
// (`scoped-green.ts`) and the since-green narrowing (`since-green.ts`) — answers from the declaration
|
|
12
|
+
// here — the paths through `check-inputs.ts`, the tools and environment through `fingerprint` — so a
|
|
13
|
+
// new reuse picks a declaration rather than writing its own invalidation.
|
|
14
|
+
//
|
|
15
|
+
// A declaration names:
|
|
16
|
+
// - `is_input` — whether a path is a content input; `undefined` leaves it to `reads`.
|
|
17
|
+
// - `reads` — `matched`: the inputs are the paths `is_input` accepts. `recorded`: the inputs are the
|
|
18
|
+
// files a run read, as the run recorded them — the test-read map (joshuafolkken/kit#4314), whose
|
|
19
|
+
// file digests are `input-fingerprint.ts`'s — so a path is an input only when some recorded test
|
|
20
|
+
// reads it.
|
|
21
|
+
// - `is_config` — the files that configure the check: one that moves invalidates the verdict whatever
|
|
22
|
+
// else moved, and stops the since-green narrowing.
|
|
23
|
+
// - `tools` — the packages whose installed version runs the check.
|
|
24
|
+
// - `env` — the environment variables whose value changes the verdict.
|
|
25
|
+
//
|
|
26
|
+
// **A check with no declaration always runs**: `cspell` reads every text file and `behavior` reads a
|
|
27
|
+
// transcript outside the tree. Naming inputs for either would be a guess, and a wrong guess is a check
|
|
28
|
+
// reported green without having run. **The declarations over-approximate, never under**: a path in
|
|
29
|
+
// doubt is an input. `metrics` reads the scripts it counts, the approvals under
|
|
30
|
+
// `.josh/metrics-accepted/` (JSON) and the Markdown it measures (joshuafolkken/kit#4085). `lint` is
|
|
31
|
+
// prettier plus eslint, so its inputs are the sources plus every file prettier formats, less what
|
|
32
|
+
// prettier's own ignore files leave out — prettier answers that itself (`check-inputs.ts`).
|
|
33
|
+
|
|
34
|
+
const GIT_IGNORE = '.gitignore'
|
|
35
|
+
const PRETTIER_IGNORE = '.prettierignore'
|
|
36
|
+
const PRETTIER_IGNORE_FILES = [GIT_IGNORE, PRETTIER_IGNORE] as const
|
|
37
|
+
|
|
38
|
+
// A manifest or lock file moves the installed tools (`toolchain-inputs.ts`, the list every kept result
|
|
39
|
+
// shares), and an ignore or editor file moves what prettier formats — a configuration of every
|
|
40
|
+
// declared check.
|
|
41
|
+
const MANIFEST = 'package.json'
|
|
42
|
+
|
|
43
|
+
const TOOLCHAIN_FILES: ReadonlySet<string> = new Set([
|
|
44
|
+
...toolchain_inputs.PACKAGE_FILES.map((relative) => path.basename(relative)),
|
|
45
|
+
'.editorconfig',
|
|
46
|
+
...PRETTIER_IGNORE_FILES,
|
|
47
|
+
])
|
|
48
|
+
|
|
49
|
+
const PRETTIER_CONFIG_PREFIX = '.prettierrc'
|
|
50
|
+
|
|
51
|
+
// A file name starting with one of these configures the TypeScript program a check compiles, and the
|
|
52
|
+
// test runner for the unit step.
|
|
53
|
+
const COMPILER_CONFIG_PREFIXES = ['tsconfig', 'svelte.config.'] as const
|
|
54
|
+
const TEST_CONFIG_PREFIXES = [...COMPILER_CONFIG_PREFIXES, 'vitest.config.', 'vite.config.']
|
|
55
|
+
|
|
56
|
+
// A file name starting with one of these, or a path under one of the directories, configures prettier,
|
|
57
|
+
// eslint or the TypeScript program its type-aware rules read. Prettier keys its cache on the options
|
|
58
|
+
// too, so a changed `prettier.config.*` re-checks every file the whole-tree run reads.
|
|
59
|
+
const LINT_CONFIG_PREFIXES = ['eslint.config.', 'prettier.config.', ...COMPILER_CONFIG_PREFIXES]
|
|
60
|
+
const LINT_CONFIG_DIRECTORIES: ReadonlySet<string> = new Set(['eslint', 'prettier', 'tsconfig'])
|
|
61
|
+
|
|
62
|
+
const SOURCE_EXTENSIONS: ReadonlySet<string> = new Set([
|
|
63
|
+
'.ts',
|
|
64
|
+
'.tsx',
|
|
65
|
+
'.mts',
|
|
66
|
+
'.cts',
|
|
67
|
+
'.js',
|
|
68
|
+
'.jsx',
|
|
69
|
+
'.mjs',
|
|
70
|
+
'.cjs',
|
|
71
|
+
'.svelte',
|
|
72
|
+
'.vue',
|
|
73
|
+
'.json',
|
|
74
|
+
'.jsonc',
|
|
75
|
+
])
|
|
76
|
+
|
|
77
|
+
const MARKDOWN_EXTENSION = '.md'
|
|
78
|
+
// `NODE_OPTIONS` is left out: package managers and hooks set it differently around the same check,
|
|
79
|
+
// and it tunes the runtime rather than what a check answers.
|
|
80
|
+
const COMMON_ENV = ['NODE_ENV'] as const
|
|
81
|
+
const ABSENT = 'absent'
|
|
82
|
+
|
|
83
|
+
type Environment = Readonly<Record<string, string | undefined>>
|
|
84
|
+
|
|
85
|
+
// Whether prettier would leave `relative` out; `false` when prettier cannot be asked, which keeps the
|
|
86
|
+
// path an input.
|
|
87
|
+
type PrettierIgnored = (relative: string) => Promise<boolean>
|
|
88
|
+
|
|
89
|
+
type FileTest = (relative: string, is_ignored: PrettierIgnored) => Promise<boolean>
|
|
90
|
+
|
|
91
|
+
type InputReads = 'matched' | 'recorded'
|
|
92
|
+
|
|
93
|
+
interface InputDeclaration {
|
|
94
|
+
readonly is_input: FileTest | undefined
|
|
95
|
+
readonly reads: InputReads
|
|
96
|
+
readonly is_config: (relative: string) => boolean
|
|
97
|
+
readonly tools: ReadonlyArray<string>
|
|
98
|
+
readonly env: ReadonlyArray<string>
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
function is_source(relative: string): boolean {
|
|
102
|
+
return SOURCE_EXTENSIONS.has(path.extname(relative))
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
async function is_lint_input(relative: string, is_ignored: PrettierIgnored): Promise<boolean> {
|
|
106
|
+
if (is_source(relative)) return true
|
|
107
|
+
if (!lint_related_scope.is_lintable(relative)) return false
|
|
108
|
+
|
|
109
|
+
return !(await is_ignored(relative))
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
async function is_source_input(relative: string): Promise<boolean> {
|
|
113
|
+
return is_source(relative)
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
async function is_metrics_input(relative: string): Promise<boolean> {
|
|
117
|
+
return is_source(relative) || path.extname(relative) === MARKDOWN_EXTENSION
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
function configures_toolchain(relative: string): boolean {
|
|
121
|
+
const name = path.basename(relative)
|
|
122
|
+
|
|
123
|
+
return TOOLCHAIN_FILES.has(name) || name.startsWith(PRETTIER_CONFIG_PREFIX)
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
function names_any(relative: string, prefixes: ReadonlyArray<string>): boolean {
|
|
127
|
+
const name = path.basename(relative)
|
|
128
|
+
|
|
129
|
+
return configures_toolchain(relative) || prefixes.some((prefix) => name.startsWith(prefix))
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
function configures_compiler(relative: string): boolean {
|
|
133
|
+
return names_any(relative, COMPILER_CONFIG_PREFIXES)
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
function configures_tests(relative: string): boolean {
|
|
137
|
+
return names_any(relative, TEST_CONFIG_PREFIXES)
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
function configures_lint(relative: string): boolean {
|
|
141
|
+
const [top = ''] = relative.split('/', 1)
|
|
142
|
+
|
|
143
|
+
return LINT_CONFIG_DIRECTORIES.has(top) || names_any(relative, LINT_CONFIG_PREFIXES)
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
const LINT: InputDeclaration = {
|
|
147
|
+
is_input: is_lint_input,
|
|
148
|
+
reads: 'matched',
|
|
149
|
+
is_config: configures_lint,
|
|
150
|
+
tools: ['prettier', 'eslint', 'typescript'],
|
|
151
|
+
env: COMMON_ENV,
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
const UNIT: InputDeclaration = {
|
|
155
|
+
is_input: undefined,
|
|
156
|
+
reads: 'recorded',
|
|
157
|
+
is_config: configures_tests,
|
|
158
|
+
tools: ['vitest', 'typescript'],
|
|
159
|
+
env: [...COMMON_ENV, 'TZ'],
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
function compiled(is_input: FileTest): InputDeclaration {
|
|
163
|
+
return {
|
|
164
|
+
is_input,
|
|
165
|
+
reads: 'matched',
|
|
166
|
+
is_config: configures_compiler,
|
|
167
|
+
tools: ['typescript'],
|
|
168
|
+
env: COMMON_ENV,
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
// **cspell reads every file with dotfiles**, so any moved file — its config and word lists among
|
|
173
|
+
// them — answers "run again" (joshuafolkken/kit#5156).
|
|
174
|
+
async function is_any_file(): Promise<boolean> {
|
|
175
|
+
return true
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
const SPELLING: InputDeclaration = {
|
|
179
|
+
is_input: is_any_file,
|
|
180
|
+
reads: 'matched',
|
|
181
|
+
is_config: configures_toolchain,
|
|
182
|
+
tools: ['cspell'],
|
|
183
|
+
env: COMMON_ENV,
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
const DECLARATIONS: ReadonlyMap<string, InputDeclaration> = new Map([
|
|
187
|
+
[gate_labels.LINT_LABEL, LINT],
|
|
188
|
+
[gate_labels.SPELL_CHECK_LABEL, SPELLING],
|
|
189
|
+
[gate_labels.TYPE_CHECK_LABEL, compiled(is_source_input)],
|
|
190
|
+
[gate_labels.EXPORTS_LABEL, compiled(is_source_input)],
|
|
191
|
+
[gate_labels.METRICS_LABEL, compiled(is_metrics_input)],
|
|
192
|
+
[gate_labels.UNIT_LABEL, UNIT],
|
|
193
|
+
])
|
|
194
|
+
|
|
195
|
+
function declaration_of(label: string): InputDeclaration | undefined {
|
|
196
|
+
return DECLARATIONS.get(label)
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
function is_declared(label: string): boolean {
|
|
200
|
+
return DECLARATIONS.has(label)
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
// Whether any of `relatives` (repository-root relative) configures the check `label` — `true` for an
|
|
204
|
+
// undeclared one, which no narrowing can read past.
|
|
205
|
+
function configures(label: string, relatives: ReadonlyArray<string>): boolean {
|
|
206
|
+
const declaration = DECLARATIONS.get(label)
|
|
207
|
+
|
|
208
|
+
return declaration === undefined || relatives.some((relative) => declaration.is_config(relative))
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
function tool_version(root: string, tool: string): string {
|
|
212
|
+
try {
|
|
213
|
+
const manifest: unknown = JSON.parse(
|
|
214
|
+
readFileSync(path.join(root, 'node_modules', tool, MANIFEST), 'utf8'),
|
|
215
|
+
)
|
|
216
|
+
|
|
217
|
+
return typeof manifest === 'object' && manifest !== null && 'version' in manifest
|
|
218
|
+
? String(manifest.version)
|
|
219
|
+
: ABSENT
|
|
220
|
+
} catch {
|
|
221
|
+
return ABSENT
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
function entries_of(
|
|
226
|
+
declaration: InputDeclaration,
|
|
227
|
+
root: string,
|
|
228
|
+
environment: Environment,
|
|
229
|
+
): ReadonlyArray<string> {
|
|
230
|
+
return [
|
|
231
|
+
...declaration.tools.map((tool) => `tool:${tool}=${tool_version(root, tool)}`),
|
|
232
|
+
...declaration.env.map((name) => `env:${name}=${environment[name] ?? ABSENT}`),
|
|
233
|
+
]
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
// **The fingerprint of what the checks `labels` read beside the files**: the installed version of every
|
|
237
|
+
// declared tool and the value of every declared environment variable, sorted into one digest. The
|
|
238
|
+
// file contents are the record's own file map (`file-map-stamp.ts`) and the merge base its `base`, so a
|
|
239
|
+
// reuse matches all three. One label answers a check's record; every declared label the whole gate's.
|
|
240
|
+
function fingerprint(
|
|
241
|
+
labels: ReadonlyArray<string>,
|
|
242
|
+
root: string = PROJECT_ROOT,
|
|
243
|
+
environment: Environment = process.env,
|
|
244
|
+
): string {
|
|
245
|
+
const declarations = labels.flatMap((label) => DECLARATIONS.get(label) ?? [])
|
|
246
|
+
const entries = new Set(
|
|
247
|
+
declarations.flatMap((declaration) => entries_of(declaration, root, environment)),
|
|
248
|
+
)
|
|
249
|
+
|
|
250
|
+
return input_fingerprint.of_entries(entries)
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
const DECLARED_LABELS: ReadonlyArray<string> = [...DECLARATIONS.keys()]
|
|
254
|
+
|
|
255
|
+
const verification_inputs = {
|
|
256
|
+
configures,
|
|
257
|
+
declaration_of,
|
|
258
|
+
DECLARED_LABELS,
|
|
259
|
+
fingerprint,
|
|
260
|
+
is_declared,
|
|
261
|
+
PRETTIER_IGNORE_FILES,
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
export type { InputDeclaration, InputReads, PrettierIgnored }
|
|
265
|
+
export { verification_inputs }
|