@joshuafolkken/kit 1.1471.0 → 1.1784.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/settings.json +6 -6
- package/.claude/skills/epic-commands/SKILL.md +26 -77
- package/.claude/skills/epic-commands/epic-bundle.md +12 -6
- package/.claude/skills/epic-commands/execution-waves.md +1 -2
- package/.claude/skills/verify-ui/SKILL.md +1 -2
- package/.claude/skills/workflow-commands/SKILL.md +12 -14
- package/.claude/skills/workflow-commands/background-commands.md +8 -12
- package/.claude/skills/workflow-commands/backlogrun-child.md +13 -18
- package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +7 -25
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +23 -28
- package/.claude/skills/workflow-commands/backlogrun-park.md +16 -31
- package/.claude/skills/workflow-commands/backlogrun-progress.md +12 -21
- package/.claude/skills/workflow-commands/backlogrun-recovery.md +12 -12
- package/.claude/skills/workflow-commands/backlogrun-steps.md +12 -20
- package/.claude/skills/workflow-commands/backlogrun.md +32 -51
- package/.claude/skills/workflow-commands/chain-rule.md +18 -11
- package/.claude/skills/workflow-commands/delegation.md +13 -8
- package/.claude/skills/workflow-commands/entry-sequence.md +10 -12
- package/.claude/skills/workflow-commands/followup.md +10 -35
- package/.claude/skills/workflow-commands/fullrun-steps.md +38 -49
- package/.claude/skills/workflow-commands/fullrun.md +6 -8
- package/.claude/skills/workflow-commands/halfrun.md +20 -32
- package/.claude/skills/workflow-commands/into-target.md +1 -2
- package/.claude/skills/workflow-commands/issue-comments.md +19 -15
- package/.claude/skills/workflow-commands/issue-scout.md +5 -4
- package/.claude/skills/workflow-commands/kickoff.md +24 -23
- package/.claude/skills/workflow-commands/latest-gate.md +9 -18
- package/.claude/skills/workflow-commands/needs-human-review.md +11 -19
- package/.claude/skills/workflow-commands/observation-filing.md +4 -50
- package/.claude/skills/workflow-commands/observation-ledger.md +5 -10
- package/.claude/skills/workflow-commands/pre-gate-cut.md +22 -44
- package/.claude/skills/workflow-commands/prerequisite.md +11 -18
- package/.claude/skills/workflow-commands/progress-watcher.md +3 -8
- package/.claude/skills/workflow-commands/prrun.md +6 -12
- package/.claude/skills/workflow-commands/retrospective.md +5 -5
- package/.claude/skills/workflow-commands/split-assessment.md +14 -4
- package/.claude/skills/workflow-commands/target-repository.md +1 -2
- package/.claude/skills/workflow-commands/working-tree-hold.md +11 -13
- package/.codex/hooks.json +6 -6
- package/.github/actions/setup-node/action.yml +10 -1
- package/.github/actions/setup-pnpm/action.yml +1 -1
- package/.github/dependabot.yml +16 -0
- package/.github/release.yml +0 -2
- package/.github/workflows/ci.yml +121 -11
- package/.github/workflows/publish.yml +10 -3
- package/.github/workflows/sonar-qube.yml +1 -0
- package/.prettierignore +2 -0
- package/.vscode/tasks.json +1 -2
- package/CLAUDE.md +4 -8
- package/README.md +4 -2
- package/SECURITY.md +1 -1
- package/cspell/index.yaml +7 -0
- package/dist/CLAUDE.md +4 -8
- package/dist/commands/document-read-cli.js +882 -0
- package/dist/commands/{document-section-cli.js → document-section-main.js} +137 -62
- package/dist/commands/read-set-cli.js +1867 -0
- package/dist/commands/run-prep-main.js +21653 -0
- package/dist/commands/run-step-cli.js +23880 -0
- package/dist/config-merge/index.js +5 -1
- package/dist/hooks/audit-provision.js +20 -35
- package/dist/hooks/{chunk-DGT54IH5.js → chunk-AZX4FGQ3.js} +63 -17
- package/dist/hooks/chunk-CWMBGKYW.js +6483 -0
- package/dist/hooks/chunk-O2YBIDSI.js +4306 -0
- package/dist/hooks/{chunk-AS74OU3D.js → chunk-PT5R6UJD.js} +4582 -2118
- package/dist/hooks/chunk-TUIFS5E7.js +72 -0
- package/dist/hooks/{chunk-723HKZO5.js → chunk-VWWCFGWK.js} +1 -1
- package/dist/hooks/{chunk-E7OIKX5Z.js → chunk-WR2KQAYZ.js} +1863 -382
- package/dist/hooks/{chunk-KC5AK2GF.js → chunk-XGBNSWEI.js} +248 -46
- package/dist/hooks/chunk-YCDOIR3I.js +3456 -0
- package/dist/hooks/codex-hook-adapter.js +10 -19
- package/dist/hooks/format-edited.js +5 -5
- package/dist/hooks/inputs.json +436 -257
- package/dist/hooks/pretool-guard.js +7 -22
- package/dist/hooks/session-lang.js +380 -42
- package/dist/hooks/stop-guard.js +8711 -782
- package/dist/josh.js +5263 -997
- package/dist/self-sync-guard/index.js +74 -10
- package/dist/version/index.js +115 -406
- package/eslint/base.js +1 -1
- package/lefthook/base.yml +8 -4
- package/package.json +17 -53
- package/pnpm-workspace.yaml +4 -2
- package/prompts/coding-standards.md +1 -1
- package/prompts/collaboration-workflow/file-edits.md +1 -9
- package/prompts/collaboration-workflow/gh-rest.md +1 -2
- package/prompts/collaboration-workflow/issue-citation.md +2 -4
- package/prompts/collaboration-workflow/issue-template.md +42 -17
- package/prompts/collaboration-workflow/lane-instructions.md +34 -0
- package/prompts/collaboration-workflow/measurement.md +37 -0
- package/prompts/collaboration-workflow/operating-rules.md +6 -12
- package/prompts/collaboration-workflow/output-bounds.md +4 -9
- package/prompts/collaboration-workflow/overview.md +1 -1
- package/prompts/collaboration-workflow/plan-comment.md +3 -42
- package/prompts/collaboration-workflow/principles.md +19 -8
- package/prompts/collaboration-workflow/report-format.md +37 -57
- package/prompts/collaboration-workflow/residency.md +12 -8
- package/prompts/collaboration-workflow/rule-delivery.md +3 -11
- package/prompts/collaboration-workflow/shell-body.md +8 -18
- package/prompts/collaboration-workflow/turn-batching.md +4 -6
- package/prompts/collaboration-workflow/upstream-interrupt.md +16 -6
- package/prompts/collaboration-workflow/wip-cap.md +7 -7
- package/prompts/collaboration-workflow.md +4 -7
- package/prompts/refactoring.md +1 -1
- package/prompts/review-rubric.md +1 -2
- package/prompts/review.md +45 -26
- package/prompts/testing-guide.md +10 -45
- package/scripts/agent/agent-argv.ts +20 -4
- package/scripts/agent/agent-event.ts +15 -15
- package/scripts/agent/agent-exit-record.ts +13 -1
- package/scripts/agent/agent-role-profile.ts +101 -45
- package/scripts/agent/agent-safe-text.ts +60 -0
- package/scripts/agent/api-auth.ts +41 -0
- package/scripts/agent/api-outage.ts +1 -1
- package/scripts/agent/claude-agent-argv.ts +14 -0
- package/scripts/agent/codex-agent-argv.ts +2 -0
- package/scripts/agent/lane-instructions.ts +144 -0
- package/scripts/auto-ok/auto-ok-cli.ts +14 -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 +6 -7
- package/scripts/backlog/backlog-defect-priority.ts +4 -3
- 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 +113 -28
- package/scripts/backlog/backlog-drive-hold.ts +162 -0
- package/scripts/backlog/backlog-drive-idle.ts +151 -0
- package/scripts/backlog/backlog-drive-judge.ts +25 -0
- package/scripts/backlog/backlog-drive-memory.ts +126 -0
- package/scripts/backlog/backlog-drive-named-offer.ts +5 -10
- package/scripts/backlog/backlog-drive-named.ts +54 -7
- package/scripts/backlog/backlog-drive-offer-argv.ts +3 -8
- package/scripts/backlog/backlog-drive-paused.ts +169 -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 +79 -75
- package/scripts/backlog/backlog-next-main.ts +16 -0
- package/scripts/backlog/backlog-next-shared.ts +73 -0
- package/scripts/backlog/backlog-next.ts +48 -16
- package/scripts/backlog/backlog-occupied.ts +69 -0
- 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 +22 -4
- package/scripts/backlog/backlog-plan-read.ts +6 -2
- package/scripts/backlog/backlog-plan.ts +18 -4
- package/scripts/backlog/backlog-pool.ts +10 -10
- package/scripts/backlog/backlog-rank.ts +10 -2
- package/scripts/backlog/backlog-ready.ts +137 -18
- package/scripts/backlog/backlog-stalled-detect.ts +109 -36
- package/scripts/backlog/backlog-stalled.ts +52 -16
- package/scripts/backlog/backlog-wait-cause.ts +86 -0
- package/scripts/backlog/backlog-waves.ts +39 -13
- package/scripts/backlog/backlogrun-args.ts +19 -7
- package/scripts/backlog/backlogrun-cli.ts +19 -5
- package/scripts/backlog/backlogrun-launch.ts +6 -0
- 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/cost-blocks.ts +22 -37
- package/scripts/cost-runtime/cost-cli.ts +31 -14
- package/scripts/cost-runtime/cost-main.ts +12 -0
- package/scripts/cost-runtime/cost-transcript.ts +1 -0
- package/scripts/delegation/delegation-policy.ts +17 -4
- package/scripts/delegation/duplicate-read-guard.ts +2 -10
- package/scripts/delegation/investigation-guard.ts +15 -73
- package/scripts/delegation/investigation-reads.ts +3 -5
- package/scripts/dependabot/dependabot-cooldown.ts +194 -0
- package/scripts/discovery/repo-discovery.ts +24 -6
- package/scripts/doctor/doctor-consumer.ts +2 -5
- package/scripts/document/document-byte-budget.ts +9 -6
- package/scripts/document/document-scan.ts +1 -1
- package/scripts/document/document-section-cli.ts +17 -13
- package/scripts/document/document-section-main.ts +12 -0
- package/scripts/document/entry-read-budget.ts +2 -2
- package/scripts/document/read-set-cli.ts +4 -1
- package/scripts/epic/epic-audit-cli.ts +12 -6
- package/scripts/epic/epic-audit-orphans.ts +5 -8
- package/scripts/epic/epic-audit.ts +52 -1
- package/scripts/epic/epic-bundle-apply.ts +137 -0
- package/scripts/epic/epic-bundle-cli.ts +32 -121
- package/scripts/epic/epic-bundle-evidence.ts +49 -26
- package/scripts/epic/epic-bundle-format.ts +116 -0
- package/scripts/epic/epic-bundle-main.ts +17 -0
- package/scripts/epic/epic-bundle-referenced.ts +14 -3
- package/scripts/epic/epic-bundle.ts +17 -9
- package/scripts/epic/epic-busy.ts +5 -12
- package/scripts/epic/epic-classify.ts +24 -15
- package/scripts/epic/epic-cli-argv.ts +31 -0
- 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 +4 -0
- package/scripts/epic/epic-graph.ts +2 -0
- package/scripts/epic/epic-issue.ts +5 -1
- 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-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-cli.ts +2 -2
- package/scripts/followup/followup-checks-event.ts +8 -3
- package/scripts/followup/followup-coderabbit-wait.ts +82 -0
- package/scripts/followup/followup-review-gates.ts +81 -0
- package/scripts/followup/git-followup-stages.ts +13 -3
- package/scripts/followup/git-followup-workflow.ts +31 -60
- package/scripts/followup/git-pr-followup-wrapup.ts +9 -14
- package/scripts/followup/git-pr-followup.ts +36 -8
- package/scripts/fresh-machine/fresh-machine-cli.ts +1 -1
- package/scripts/fresh-machine/fresh-machine-run.ts +8 -8
- package/scripts/fresh-machine/specs/kit-test-backlogrun.json +1 -1
- package/scripts/gate/busy-average.ts +58 -0
- package/scripts/gate/check-cpu.ts +60 -0
- package/scripts/gate/check-inputs.ts +73 -0
- package/scripts/gate/check-reuse.ts +141 -0
- package/scripts/gate/command-memory.ts +192 -0
- package/scripts/gate/core-admission.ts +218 -28
- package/scripts/gate/core-budget-timing.ts +37 -0
- package/scripts/gate/core-budget.ts +150 -119
- package/scripts/gate/core-wait-record.ts +48 -0
- package/scripts/gate/core-wait.ts +162 -0
- package/scripts/gate/core-weights.ts +86 -0
- package/scripts/gate/free-cores.ts +72 -0
- package/scripts/gate/gate-ledger.ts +49 -7
- package/scripts/gate/gate-plan.ts +44 -15
- package/scripts/gate/gate-report.ts +29 -4
- package/scripts/gate/gate-run-steps.ts +195 -0
- package/scripts/gate/gate-skip.ts +12 -2
- package/scripts/gate/gate-steps.ts +12 -1
- package/scripts/gate/held-mark.ts +55 -0
- package/scripts/gate/input-fingerprint.ts +42 -0
- package/scripts/gate/machine-capacity.ts +124 -31
- package/scripts/gate/moved-paths.ts +67 -0
- package/scripts/gate/pre-commit-type-check.ts +14 -1
- package/scripts/gate/project-checks.ts +5 -12
- package/scripts/gate/scoped-green.ts +12 -8
- package/scripts/gate/since-green.ts +62 -0
- package/scripts/gate/toolchain-inputs.ts +115 -0
- package/scripts/gate/verification-gate.ts +65 -129
- package/scripts/gate/verification-inputs.ts +250 -0
- package/scripts/gh/gh-author-association.ts +96 -9
- package/scripts/gh/git-ai-review-scan.ts +4 -2
- package/scripts/gh/git-gh-api-path.ts +15 -0
- package/scripts/gh/git-gh-branch-rules.ts +73 -0
- package/scripts/gh/git-gh-conditional.ts +5 -2
- package/scripts/gh/git-gh-issue-read.ts +5 -1
- package/scripts/gh/git-gh-issue-rest.ts +1 -0
- package/scripts/gh/git-gh-issue-write.ts +77 -17
- package/scripts/gh/git-gh-issue.ts +7 -3
- package/scripts/gh/git-gh-poll-read.ts +89 -0
- package/scripts/gh/git-gh-pr-auto-merge.ts +8 -3
- package/scripts/gh/git-gh-pr-rest.ts +1 -1
- package/scripts/gh/git-gh-pr-snapshot.ts +33 -20
- package/scripts/gh/git-gh-pr.ts +27 -15
- package/scripts/gh/git-pr-checks-eval.ts +39 -7
- package/scripts/gh/git-pr-checks-parse.ts +39 -9
- package/scripts/gh/git-pr-merge-checked.ts +80 -0
- package/scripts/gh/git-pr.ts +13 -1
- package/scripts/git/base-tree.ts +19 -2
- package/scripts/git/changed-file-scope.ts +6 -4
- package/scripts/git/changed-paths.ts +18 -1
- package/scripts/git/git-diff-reads.ts +27 -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 +17 -7
- package/scripts/git/git-spawn.ts +1 -2
- package/scripts/git/git-status.ts +4 -4
- package/scripts/git/main-merge-main.ts +12 -0
- package/scripts/git/main-merge-regenerate.ts +78 -0
- package/scripts/git/main-merge.ts +39 -14
- package/scripts/git/main-sync-main.ts +12 -0
- package/scripts/git/main-sync.ts +0 -9
- package/scripts/git/stash/git-stash.ts +27 -4
- 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 +76 -0
- package/scripts/git/stash/stash-push-main.ts +12 -0
- package/scripts/hooks/batch-guard.ts +5 -16
- package/scripts/hooks/check-commit-message-main.ts +8 -0
- package/scripts/hooks/check-commit-message.ts +4 -7
- package/scripts/hooks/format-edited-file.ts +8 -24
- package/scripts/hooks/pre-commit-lint.ts +118 -0
- package/scripts/hooks/pre-push-unit.ts +4 -2
- package/scripts/hooks/pretool-guard-cli.ts +1 -8
- package/scripts/hooks/pretool-guard.ts +57 -69
- package/scripts/hooks/reserved-run.ts +67 -8
- package/scripts/hooks/run-hook.sh +18 -11
- package/scripts/hooks/shell-rules-notice.ts +37 -0
- package/scripts/hooks/stop-actions.ts +185 -0
- package/scripts/hooks/stop-guard.ts +72 -27
- package/scripts/init/hook-command-rewrite.ts +19 -5
- package/scripts/init/hook-launch.ts +15 -12
- 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/defect-origin-cli.ts +106 -0
- package/scripts/issue/defect-origin-line.ts +60 -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 +34 -78
- 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/expected-effect-lint.ts +60 -0
- package/scripts/issue/issue-already-done-cli.ts +62 -0
- package/scripts/issue/issue-body-or-comment.ts +40 -0
- package/scripts/issue/issue-cite-cli.ts +33 -22
- package/scripts/issue/issue-cite-main.ts +12 -0
- package/scripts/issue/issue-classification.ts +13 -8
- 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 +100 -0
- package/scripts/issue/issue-file-cli.ts +29 -7
- package/scripts/issue/issue-file.ts +19 -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 +81 -90
- package/scripts/issue/issue-lint-cli.ts +7 -13
- package/scripts/issue/issue-lint-main.ts +12 -0
- package/scripts/issue/issue-measured-cli.ts +56 -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 +111 -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.ts +151 -0
- package/scripts/issue/issue-rank.ts +7 -1
- package/scripts/issue/issue-read-cli.ts +3 -10
- package/scripts/issue/issue-read-main.ts +12 -0
- package/scripts/issue/issue-read.ts +29 -5
- 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 +192 -0
- package/scripts/issue/issue-sample-source.ts +76 -0
- package/scripts/issue/issue-scout-cli.ts +19 -25
- package/scripts/issue/issue-scout-main.ts +14 -0
- package/scripts/issue/issue-state-cli.ts +0 -10
- package/scripts/issue/issue-state-main.ts +12 -0
- package/scripts/issue/issue-watch-diff.ts +56 -15
- package/scripts/issue/issue-watch.ts +2 -1
- package/scripts/issue/issue-wip.ts +2 -7
- package/scripts/issue/markdown-section.ts +19 -5
- package/scripts/issue/measure-rerun-cli.ts +13 -8
- 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 +55 -0
- package/scripts/issue/plan-consumers.ts +127 -0
- package/scripts/josh/agent-session-environment.ts +1 -1
- package/scripts/josh/command-usage.ts +82 -0
- package/scripts/josh/file-map-stamp.ts +49 -16
- package/scripts/josh/hook-decision.ts +32 -20
- package/scripts/josh/josh-command-map.ts +6 -1
- package/scripts/josh/josh-command-types.ts +65 -13
- package/scripts/josh/josh-commands-agent-hooks.ts +83 -0
- package/scripts/josh/josh-commands-ai.ts +169 -157
- 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 +111 -71
- 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 +31 -2
- package/scripts/josh/josh-commands-issue-write.ts +181 -0
- package/scripts/josh/josh-commands-issue.ts +124 -24
- package/scripts/josh/josh-commands-lane.ts +112 -2
- package/scripts/josh/josh-commands-lint.ts +19 -8
- package/scripts/josh/josh-commands-maintenance.ts +112 -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 +124 -0
- package/scripts/josh/josh-commands-run.ts +211 -23
- package/scripts/josh/josh-commands-ship.ts +169 -0
- package/scripts/josh/josh-commands-split.ts +9 -0
- package/scripts/josh/josh-commands-versioning.ts +49 -2
- package/scripts/josh/josh-commands-workflow.ts +149 -6
- package/scripts/josh/josh-logic.ts +11 -27
- package/scripts/josh/josh.ts +14 -5
- package/scripts/josh/package-directory.ts +18 -0
- package/scripts/josh/process-identity.ts +13 -4
- 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 +9 -15
- package/scripts/lane/lane-await.ts +51 -12
- package/scripts/lane/lane-cache.ts +5 -30
- package/scripts/lane/lane-capacity.ts +19 -22
- package/scripts/lane/lane-check-stats.ts +97 -0
- package/scripts/lane/lane-child-invocation.ts +43 -4
- package/scripts/lane/lane-cli.ts +15 -5
- package/scripts/lane/lane-close.ts +86 -18
- package/scripts/lane/lane-core-wait-stats.ts +66 -0
- package/scripts/lane/lane-dispatch.ts +27 -6
- package/scripts/lane/lane-gap-stats.ts +156 -0
- package/scripts/lane/lane-guard-policy.ts +2 -2
- package/scripts/lane/lane-handoff.ts +76 -1
- package/scripts/lane/lane-held-stats.ts +129 -0
- package/scripts/lane/lane-install.ts +16 -15
- package/scripts/lane/lane-launch-cli.ts +0 -9
- package/scripts/lane/lane-launch-main.ts +12 -0
- package/scripts/lane/lane-ledger-schema.ts +266 -0
- package/scripts/lane/lane-ledger.ts +108 -97
- package/scripts/lane/lane-limit-cli.ts +19 -9
- package/scripts/lane/lane-measure-cli.ts +58 -10
- package/scripts/lane/lane-open.ts +9 -1
- package/scripts/lane/lane-parked.ts +3 -3
- package/scripts/lane/lane-pause-cli.ts +130 -0
- package/scripts/lane/lane-pause.ts +158 -0
- package/scripts/lane/lane-preserve.ts +29 -1
- 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 +33 -10
- package/scripts/lane/lane-residents.ts +162 -0
- package/scripts/lane/lane-restart.ts +26 -27
- package/scripts/lane/lane-round-two-stats.ts +49 -0
- package/scripts/lane/lane-sampler.ts +4 -0
- package/scripts/lane/lane-session-action.ts +160 -0
- package/scripts/lane/lane-session-broker.ts +134 -134
- package/scripts/lane/lane-snapshot-trace.ts +84 -0
- package/scripts/lane/lane-spans.ts +51 -0
- package/scripts/lane/lane-spent.ts +6 -3
- package/scripts/lane/lane-stage-stats.ts +7 -2
- package/scripts/lane/lane-state.ts +302 -0
- package/scripts/lane/lane-stats.ts +58 -4
- package/scripts/lane/lane-stop-stats.ts +113 -37
- package/scripts/lane/lane-test-related-stats.ts +127 -0
- package/scripts/lane/lane-transcript-calls.ts +145 -0
- package/scripts/lane/lane-transcript-stats.ts +168 -0
- package/scripts/lane/lane-vacant.ts +13 -3
- package/scripts/lane/lane-withdraw-cli.ts +72 -0
- package/scripts/lane/lane-withdraw.ts +183 -0
- 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/read-file.ts +3 -1
- 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/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.ts +265 -0
- package/scripts/lint/format.ts +14 -5
- package/scripts/lint/import-graph.ts +279 -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 +72 -33
- package/scripts/lint/lint-related-scope.ts +33 -24
- package/scripts/lint/lint-related.ts +38 -6
- package/scripts/notify/confirmation-options.ts +1 -2
- package/scripts/notify/telegram-notify.ts +20 -20
- package/scripts/notify/telegram-test-logic.ts +0 -1
- package/scripts/notify/telegram-test-main.ts +8 -0
- package/scripts/notify/telegram-test.ts +12 -11
- package/scripts/observations/observation-ledger.ts +13 -0
- package/scripts/observations/observations-flush-landing.ts +5 -3
- package/scripts/observations/observations-flush.ts +6 -1
- package/scripts/overrides/overrides-check.ts +2 -5
- 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 +18 -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 +6 -15
- package/scripts/report/report-format-reference.ts +4 -0
- package/scripts/report/report-labels.ts +155 -0
- package/scripts/report/report-lint-cli.ts +3 -0
- package/scripts/report/report-lint.ts +85 -110
- package/scripts/report/report-template-cli.ts +59 -0
- package/scripts/report/report-template.ts +112 -0
- package/scripts/review/acceptance-map-check.ts +61 -0
- package/scripts/review/acceptance-map.ts +206 -0
- package/scripts/review/removed-tests-check.ts +86 -0
- package/scripts/review/removed-tests.ts +149 -0
- package/scripts/review/review-brief-cli.ts +82 -16
- package/scripts/review/review-brief-main.ts +12 -0
- package/scripts/review/review-brief.ts +31 -3
- package/scripts/review/review-code-tree.ts +10 -6
- package/scripts/review/review-comment-round.ts +26 -8
- package/scripts/review/review-finding-ledger.ts +30 -15
- package/scripts/review/review-interaction.ts +94 -0
- package/scripts/review/review-readers-scan.ts +163 -0
- package/scripts/review/review-record-cli.ts +69 -30
- package/scripts/review/review-record-main.ts +12 -0
- package/scripts/review/review-round-one-blobs.ts +221 -0
- package/scripts/review/review-round2-cli.ts +49 -12
- package/scripts/review/review-round2.ts +80 -12
- package/scripts/review/review-stamps.ts +19 -1
- package/scripts/review/review-stop-log.ts +96 -0
- package/scripts/review/review-stops-cli.ts +85 -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 +67 -0
- package/scripts/rules/bash-triggers.ts +46 -3
- package/scripts/rules/decision-oracle-batch.ts +9 -1
- package/scripts/rules/decision-oracle.ts +2 -2
- package/scripts/rules/delivered-rules.ts +90 -3
- package/scripts/rules/destructive-command.ts +8 -1
- package/scripts/rules/direct-filing.ts +10 -2
- package/scripts/rules/direct-issue-comment.ts +117 -0
- package/scripts/rules/direct-pr-create.ts +69 -3
- package/scripts/rules/early-heartbeat.ts +2 -1
- package/scripts/rules/file-body.ts +7 -0
- package/scripts/rules/filing-cap.ts +8 -0
- package/scripts/rules/firing-point.ts +6 -5
- package/scripts/rules/git-argv.ts +72 -14
- package/scripts/rules/git-force.ts +12 -2
- package/scripts/rules/guard-remedy.ts +121 -0
- package/scripts/rules/implementation-cut-verdict.ts +1 -1
- package/scripts/rules/implementation-cut.ts +11 -3
- package/scripts/rules/index-guard.ts +8 -1
- package/scripts/rules/issue-comments.ts +76 -7
- package/scripts/rules/josh-git-bare.ts +7 -0
- package/scripts/rules/lane-background.ts +67 -25
- package/scripts/rules/lane-carry-conflict.ts +6 -0
- package/scripts/rules/lane-direct-tool.ts +74 -0
- package/scripts/rules/lane-interactive-ask.ts +9 -2
- package/scripts/rules/lane-park.ts +45 -23
- package/scripts/rules/lane-split-park.ts +10 -2
- package/scripts/rules/lane-switch-main.ts +7 -0
- package/scripts/rules/last-prompt.ts +50 -5
- package/scripts/rules/oracle-consulted.ts +10 -0
- package/scripts/rules/oracle-firing.ts +1 -0
- package/scripts/rules/oracle-list-cli.ts +7 -0
- package/scripts/rules/permission-guards.ts +3 -0
- package/scripts/rules/piped-verification.ts +4 -2
- package/scripts/rules/poll-loop.ts +7 -0
- package/scripts/rules/pr-merge.ts +123 -0
- package/scripts/rules/protected-files.ts +32 -5
- package/scripts/rules/raw-field-body.ts +6 -0
- package/scripts/rules/rule-body-guard.ts +8 -0
- package/scripts/rules/rule-list.ts +12 -28
- package/scripts/rules/rule-rewrite.ts +114 -0
- package/scripts/rules/rule-value-cache.ts +4 -9
- package/scripts/rules/rule-value-cli.ts +51 -32
- package/scripts/rules/rule-value.ts +8 -2
- package/scripts/rules/shell-segments.ts +50 -0
- package/scripts/rules/stop-decision.ts +77 -0
- package/scripts/rules/stop-rule-rows.ts +64 -0
- package/scripts/rules/stop-rules.ts +150 -51
- package/scripts/rules/tail-commands.ts +15 -1
- package/scripts/rules/test-declared-commit.ts +11 -1
- package/scripts/rules/third-party-write.ts +7 -0
- package/scripts/rules/timed-rerun.ts +69 -0
- package/scripts/rules/worktree-guard.ts +13 -3
- package/scripts/run/board/run-board-app-name.ts +23 -0
- package/scripts/run/board/run-board-cli.ts +65 -30
- package/scripts/run/board/run-board-closed.ts +8 -2
- package/scripts/run/board/run-board-earlier.ts +94 -0
- package/scripts/run/board/run-board-ending-reason.ts +67 -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 +153 -36
- package/scripts/run/board/run-board-fold.ts +123 -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 +119 -31
- package/scripts/run/board/run-board-header.ts +86 -21
- 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 +118 -71
- package/scripts/run/board/run-board-lane-state.ts +109 -0
- package/scripts/run/board/run-board-lane-time.ts +122 -0
- package/scripts/run/board/run-board-layout.ts +240 -61
- package/scripts/run/board/run-board-length.ts +52 -0
- 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 +52 -31
- package/scripts/run/board/run-board-now.ts +1 -1
- package/scripts/run/board/run-board-operation.ts +15 -33
- package/scripts/run/board/run-board-phase.ts +1 -1
- package/scripts/run/board/run-board-plan-shared.ts +115 -0
- package/scripts/run/board/run-board-plan.ts +55 -3
- 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 +153 -13
- package/scripts/run/board/run-board-reason.ts +238 -45
- package/scripts/run/board/run-board-released.ts +35 -0
- package/scripts/run/board/run-board-render-checks.ts +39 -5
- package/scripts/run/board/run-board-render-condition.ts +96 -0
- package/scripts/run/board/run-board-render-drawn.ts +67 -0
- package/scripts/run/board/run-board-render-foot.ts +59 -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 +80 -0
- package/scripts/run/board/run-board-render-legend.ts +117 -47
- 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 +125 -0
- package/scripts/run/board/run-board-render.ts +206 -259
- package/scripts/run/board/run-board-roots.ts +54 -0
- package/scripts/run/board/run-board-row-yield.ts +10 -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 +2 -2
- package/scripts/run/board/run-board-state.ts +23 -29
- package/scripts/run/board/run-board-status.ts +206 -79
- package/scripts/run/board/run-board-thanks-read.ts +2 -2
- package/scripts/run/board/run-board-tick.ts +123 -104
- 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.ts +9 -4
- package/scripts/run/cut/run-cut-cli.ts +3 -2
- package/scripts/run/cut/run-cut-handoff.ts +2 -2
- package/scripts/run/cut/run-cut-report.ts +16 -0
- package/scripts/run/detached-launch.ts +23 -4
- package/scripts/run/entry/run-entry-cli.ts +8 -1
- package/scripts/run/event/run-event-cli.ts +1 -5
- package/scripts/run/event/run-event-filed.ts +12 -6
- package/scripts/run/event/run-event-follow.ts +2 -3
- package/scripts/run/event/run-event-render.ts +7 -10
- package/scripts/run/event/run-event-scope.ts +20 -2
- package/scripts/run/event/run-event-stream-emit.ts +78 -11
- package/scripts/run/event/run-event-stream.ts +37 -7
- 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-hold-session.ts +46 -0
- package/scripts/run/hold/run-hold.ts +7 -1
- package/scripts/run/hold/run-stop-notify.ts +183 -0
- package/scripts/run/launch-priority.ts +32 -0
- package/scripts/run/merge/run-merge-auth.ts +31 -0
- package/scripts/run/merge/run-merge-cli.ts +72 -107
- 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 +23 -0
- package/scripts/run/merge/run-merge-restart.ts +39 -0
- package/scripts/run/merge/run-merge-ship.ts +20 -4
- package/scripts/run/merge/run-merge-signals.ts +123 -0
- package/scripts/run/merge/run-merge-steps.ts +128 -83
- package/scripts/run/merge/run-merge.ts +53 -40
- 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.ts +2 -1
- 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 +61 -30
- package/scripts/run/run-next.ts +1 -1
- package/scripts/run/run-parent-cut-hook.ts +2 -2
- package/scripts/run/run-poll-hook.ts +157 -0
- 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 +6 -0
- package/scripts/run/run-report-cli.ts +101 -13
- package/scripts/run/run-report-handoff.ts +114 -0
- package/scripts/run/run-step-cli.ts +22 -15
- package/scripts/run/run-step-section.ts +85 -0
- package/scripts/run/run-step.ts +1 -1
- 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 +121 -0
- package/scripts/run/ship/run-ship-body-draft.ts +110 -0
- package/scripts/run/ship/run-ship-cli.ts +67 -151
- package/scripts/run/ship/run-ship-detach.ts +27 -7
- package/scripts/run/ship/run-ship-infra-retry.ts +59 -0
- package/scripts/run/ship/run-ship-next.ts +27 -3
- package/scripts/run/ship/run-ship-overlap.ts +232 -0
- package/scripts/run/ship/run-ship-place.ts +96 -0
- package/scripts/run/ship/run-ship-pre-detach-timed.ts +43 -0
- package/scripts/run/ship/run-ship-pre-detach.ts +102 -27
- package/scripts/run/ship/run-ship-preflight.ts +161 -30
- package/scripts/run/ship/run-ship-probe.ts +11 -3
- package/scripts/run/ship/run-ship-relaunch-cap.ts +70 -0
- package/scripts/run/ship/run-ship-removed-rows.ts +61 -0
- package/scripts/run/ship/run-ship-return.ts +123 -15
- package/scripts/run/ship/run-ship-review-steps.ts +105 -149
- package/scripts/run/ship/run-ship-review.ts +73 -6
- package/scripts/run/ship/run-ship-reviewer.ts +207 -0
- package/scripts/run/ship/run-ship-stage.ts +55 -6
- package/scripts/run/ship/run-ship-steps.ts +46 -15
- package/scripts/run/ship/run-ship-stop-cause.ts +135 -0
- package/scripts/run/ship/run-ship-stop-context.ts +206 -0
- package/scripts/run/ship/run-ship-stop-text.ts +11 -6
- package/scripts/run/ship/run-ship-sync.ts +57 -12
- package/scripts/run/ship/run-ship.ts +30 -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-cli.ts +119 -100
- package/scripts/run/wake/run-wake-code.ts +83 -0
- package/scripts/run/wake/run-wake-driver.ts +19 -8
- package/scripts/run/wake/run-wake-loop.ts +34 -3
- package/scripts/run/wake/run-wake-main.ts +13 -0
- package/scripts/run/wake/run-wake-ports.ts +90 -0
- package/scripts/run/wake/run-wake-takeover.ts +66 -0
- package/scripts/run/wake/run-wake.ts +2 -1
- 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 +3 -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 +12 -0
- package/scripts/security/security-audit-provision.ts +11 -26
- package/scripts/security/security-audit.ts +6 -7
- 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 +15 -0
- package/scripts/split/split-measure.ts +65 -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/test-declared-changed.ts +2 -2
- package/scripts/test/test-declared.ts +1 -1
- package/scripts/test/test-e2e-guard.ts +55 -6
- package/scripts/test/test-e2e-stamp.ts +38 -0
- package/scripts/test/test-pinned-logic.ts +145 -0
- package/scripts/test/test-pinned-main.ts +78 -0
- package/scripts/test/test-pinned.ts +100 -0
- package/scripts/test/test-read-map.ts +264 -0
- package/scripts/test/test-read-recording.ts +91 -0
- package/scripts/test/test-read-trace.ts +148 -0
- package/scripts/test/test-red-main.ts +12 -0
- package/scripts/test/test-red.ts +12 -30
- package/scripts/test/test-related-main.ts +18 -0
- package/scripts/test/test-related-record.ts +119 -0
- package/scripts/test/test-related-scope.ts +229 -43
- package/scripts/test/test-related.ts +300 -22
- package/scripts/test/test-unit-guard-main.ts +15 -0
- package/scripts/test/test-unit-guard.ts +54 -21
- package/scripts/test/unit-count-file.ts +37 -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 +71 -137
- package/scripts/test/whole-suite-files.ts +63 -0
- package/scripts/time-runtime/time-background.ts +20 -2
- package/scripts/time-runtime/time-bundles.ts +4 -3
- 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 +10 -1
- package/scripts/time-runtime/time-shell.ts +126 -14
- package/scripts/time-runtime/time-spans.ts +1 -0
- package/scripts/time-runtime/time-tool-call.ts +7 -0
- package/scripts/time-runtime/time-transcript-line.ts +49 -62
- 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/effective-upstream.ts +6 -12
- package/scripts/version/latest-corepack.ts +17 -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 +10 -3
- package/templates/pnpm-workspace.basic.yaml +1 -1
- package/templates/sonar-project.properties +3 -2
- package/templates/workflows/ci.yml +12 -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-43ZHT22P.js +0 -3495
- package/dist/hooks/chunk-CDY4NFQG.js +0 -15
- package/dist/hooks/chunk-EUMACUK2.js +0 -2038
- package/dist/hooks/chunk-H5HVWYXK.js +0 -359
- package/dist/hooks/chunk-IIGFYXKC.js +0 -7104
- package/dist/hooks/chunk-IX6TTTI6.js +0 -95
- package/dist/hooks/chunk-J47HU5H5.js +0 -237
- package/dist/hooks/chunk-K4EOONYM.js +0 -45
- package/dist/hooks/chunk-K4LMBQC2.js +0 -68
- package/dist/hooks/chunk-SHGPANFB.js +0 -56
- package/dist/hooks/chunk-YHBZAJSV.js +0 -79
- package/dist/hooks/chunk-YYPI7SJZ.js +0 -131
- package/dist/hooks/duplicate-read-guard.js +0 -30
- package/dist/hooks/investigation-guard.js +0 -32
- package/scripts/backlog/backlog-stalled-cli.ts +0 -30
- 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/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/rule-guard.ts +0 -23
- package/scripts/rules/rule-registry-rows.ts +0 -282
- package/scripts/rules/rule-registry.ts +0 -109
- package/scripts/run/run-stranded-cli.ts +0 -27
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
import path from 'node:path'
|
|
2
|
+
import { input_fingerprint } from '#scripts/gate/input-fingerprint'
|
|
3
|
+
import { file_reader } from '#scripts/lib/read-file'
|
|
4
|
+
import type ts from 'typescript'
|
|
5
|
+
|
|
6
|
+
// What a file's lint verdict reads besides the file itself: every file its imports reach, followed
|
|
7
|
+
// through the project's own files and stopped at a package's. A type-aware rule's verdict on a file
|
|
8
|
+
// is about the types of those, so a cached verdict holds only while all of them do
|
|
9
|
+
// (joshuafolkken/kit#4415).
|
|
10
|
+
//
|
|
11
|
+
// The modules are resolved as the type checker resolves them — the project's `tsconfig.json`, its
|
|
12
|
+
// paths and `package.json` imports — because a resolution of our own would follow a different file
|
|
13
|
+
// than the one whose types the rule read. A package's file is named by its resolved path rather than
|
|
14
|
+
// read: that path carries the installed version, and a package's files change with nothing else.
|
|
15
|
+
const TSCONFIG = 'tsconfig.json'
|
|
16
|
+
const NODE_MODULES = 'node_modules'
|
|
17
|
+
const MODULE_STATEMENT = /^(?:import|export)\b/mu
|
|
18
|
+
const GLOBAL_DECLARATION = /^declare (?:global|module|namespace)\b/mu
|
|
19
|
+
|
|
20
|
+
type TypeScript = typeof ts
|
|
21
|
+
|
|
22
|
+
interface Dependency {
|
|
23
|
+
file: string
|
|
24
|
+
external: boolean
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
interface Resolver {
|
|
28
|
+
typescript: TypeScript
|
|
29
|
+
options: ts.CompilerOptions
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
interface GraphContext extends Resolver {
|
|
33
|
+
root: string
|
|
34
|
+
resolution_cache: ts.ModuleResolutionCache
|
|
35
|
+
ambient: ReadonlyArray<Dependency>
|
|
36
|
+
dependencies: Map<string, ReadonlyArray<Dependency>>
|
|
37
|
+
content_hashes: Map<string, string>
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
interface ProjectConfig {
|
|
41
|
+
options: ts.CompilerOptions
|
|
42
|
+
file_names: ReadonlyArray<string>
|
|
43
|
+
config_files: ReadonlyArray<string>
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
interface ImportGraph {
|
|
47
|
+
closure_hash: (file: string) => string
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// `typescript` is an optional peer: a project without it has no type-aware rule to go stale.
|
|
51
|
+
async function load_typescript(): Promise<TypeScript | undefined> {
|
|
52
|
+
try {
|
|
53
|
+
const module = await import('typescript')
|
|
54
|
+
|
|
55
|
+
return module.default
|
|
56
|
+
} catch {
|
|
57
|
+
return undefined
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// A configuration that does not parse fails the type check, which reports it; here it only leaves
|
|
62
|
+
// the options the parse did reach. `config_files` are `tsconfig.json` and every file it extends: a
|
|
63
|
+
// type-aware verdict reads the compiler options — `strict` decides what is `any` — so a changed
|
|
64
|
+
// option is a changed input like a changed import.
|
|
65
|
+
function parsed_config(typescript: TypeScript, root: string): ProjectConfig | undefined {
|
|
66
|
+
const config_file = path.join(root, TSCONFIG)
|
|
67
|
+
if (!typescript.sys.fileExists(config_file)) return undefined
|
|
68
|
+
const source = typescript.readJsonConfigFile(config_file, typescript.sys.readFile)
|
|
69
|
+
const parsed = typescript.parseJsonSourceFileConfigFileContent(
|
|
70
|
+
source,
|
|
71
|
+
typescript.sys,
|
|
72
|
+
root,
|
|
73
|
+
undefined,
|
|
74
|
+
config_file,
|
|
75
|
+
)
|
|
76
|
+
|
|
77
|
+
return {
|
|
78
|
+
options: parsed.options,
|
|
79
|
+
file_names: parsed.fileNames,
|
|
80
|
+
config_files: [config_file, ...(source.extendedSourceFiles ?? [])],
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// A package is named by its resolved path only while that path sits in an install. A workspace or
|
|
85
|
+
// `link:` package resolves through its symlink to source the project edits — a path that carries no
|
|
86
|
+
// version — so its files are read like the project's own.
|
|
87
|
+
function is_installed(file: string): boolean {
|
|
88
|
+
return file.split(path.sep).includes(NODE_MODULES)
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
function as_dependency(
|
|
92
|
+
file: string | undefined,
|
|
93
|
+
external: boolean | undefined,
|
|
94
|
+
): Dependency | undefined {
|
|
95
|
+
if (file === undefined) return undefined
|
|
96
|
+
|
|
97
|
+
return { file, external: external === true && is_installed(file) }
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// A file named by its path from the one naming it: a `/// <reference path>`, or a relative import the
|
|
101
|
+
// checker cannot resolve — a `.svelte` component — whose file is still the one it names.
|
|
102
|
+
function relative_to(specifier: string, file: string): Dependency {
|
|
103
|
+
return { file: path.resolve(path.dirname(file), specifier), external: false }
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
function resolve_module(
|
|
107
|
+
context: GraphContext,
|
|
108
|
+
specifier: string,
|
|
109
|
+
file: string,
|
|
110
|
+
): Dependency | undefined {
|
|
111
|
+
const { typescript, options, resolution_cache } = context
|
|
112
|
+
const resolved = typescript.resolveModuleName(
|
|
113
|
+
specifier,
|
|
114
|
+
file,
|
|
115
|
+
options,
|
|
116
|
+
typescript.sys,
|
|
117
|
+
resolution_cache,
|
|
118
|
+
).resolvedModule
|
|
119
|
+
|
|
120
|
+
if (resolved !== undefined) {
|
|
121
|
+
return as_dependency(resolved.resolvedFileName, resolved.isExternalLibraryImport)
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
if (!specifier.startsWith('.')) return undefined
|
|
125
|
+
|
|
126
|
+
return relative_to(specifier, file)
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
function resolve_type(resolver: Resolver, name: string, file: string): Dependency | undefined {
|
|
130
|
+
const { typescript, options } = resolver
|
|
131
|
+
const resolved = typescript.resolveTypeReferenceDirective(
|
|
132
|
+
name,
|
|
133
|
+
file,
|
|
134
|
+
options,
|
|
135
|
+
typescript.sys,
|
|
136
|
+
).resolvedTypeReferenceDirective
|
|
137
|
+
|
|
138
|
+
return as_dependency(resolved?.resolvedFileName, resolved?.isExternalLibraryImport)
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
function references_of(context: GraphContext, file: string): Array<Dependency | undefined> {
|
|
142
|
+
const processed = context.typescript.preProcessFile(
|
|
143
|
+
file_reader.read_if_readable(file) ?? '',
|
|
144
|
+
true,
|
|
145
|
+
true,
|
|
146
|
+
)
|
|
147
|
+
|
|
148
|
+
return [
|
|
149
|
+
...processed.importedFiles.map((reference) =>
|
|
150
|
+
resolve_module(context, reference.fileName, file),
|
|
151
|
+
),
|
|
152
|
+
...processed.referencedFiles.map((reference) => relative_to(reference.fileName, file)),
|
|
153
|
+
...processed.typeReferenceDirectives.map((reference) =>
|
|
154
|
+
resolve_type(context, reference.fileName, file),
|
|
155
|
+
),
|
|
156
|
+
]
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
function direct_dependencies(context: GraphContext, file: string): ReadonlyArray<Dependency> {
|
|
160
|
+
const known = context.dependencies.get(file)
|
|
161
|
+
if (known !== undefined) return known
|
|
162
|
+
const found = references_of(context, file).filter((dependency) => dependency !== undefined)
|
|
163
|
+
|
|
164
|
+
context.dependencies.set(file, found)
|
|
165
|
+
|
|
166
|
+
return found
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
// A file reaches files that never import it when it is a script or declares a global or a module —
|
|
170
|
+
// SvelteKit's `src/app.d.ts` `App.Locals`, say, or a `.ts` module's `declare global` augmentation;
|
|
171
|
+
// one that only exports is read through its imports like any other module.
|
|
172
|
+
function is_ambient(file: string): boolean {
|
|
173
|
+
const content = file_reader.read_if_readable(file) ?? ''
|
|
174
|
+
|
|
175
|
+
return GLOBAL_DECLARATION.test(content) || !MODULE_STATEMENT.test(content)
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
// What every file reads without importing it: the project's ambient declarations, the type packages
|
|
179
|
+
// its compiler options load (`types`, or every `@types` package when it is unset), and the
|
|
180
|
+
// configuration files those options come from.
|
|
181
|
+
function ambient_of(resolver: Resolver, root: string, config: ProjectConfig): Array<Dependency> {
|
|
182
|
+
const config_file = path.join(root, TSCONFIG)
|
|
183
|
+
const declarations = [
|
|
184
|
+
...config.file_names.filter((file) => is_ambient(file)),
|
|
185
|
+
...config.config_files,
|
|
186
|
+
].map((file) => ({ file, external: false }))
|
|
187
|
+
const types = resolver.typescript
|
|
188
|
+
.getAutomaticTypeDirectiveNames(resolver.options, resolver.typescript.sys)
|
|
189
|
+
.map((name) => resolve_type(resolver, name, config_file))
|
|
190
|
+
.filter((dependency) => dependency !== undefined)
|
|
191
|
+
|
|
192
|
+
return [...declarations, ...types]
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
function content_hash(context: GraphContext, file: string): string {
|
|
196
|
+
const known = context.content_hashes.get(file)
|
|
197
|
+
if (known !== undefined) return known
|
|
198
|
+
const computed = input_fingerprint.of_file(file)
|
|
199
|
+
|
|
200
|
+
context.content_hashes.set(file, computed)
|
|
201
|
+
|
|
202
|
+
return computed
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
// Every file the imports reach, the starting file excluded: its own content is the cache's key
|
|
206
|
+
// already, and a file that imports itself through a cycle is still only that one key.
|
|
207
|
+
function is_unvisited(
|
|
208
|
+
dependency: Dependency,
|
|
209
|
+
start: string,
|
|
210
|
+
reached: Map<string, Dependency>,
|
|
211
|
+
): boolean {
|
|
212
|
+
return dependency.file !== start && !reached.has(dependency.file)
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
// Dependencies joined to what is reached, and those inside the project queued to be followed.
|
|
216
|
+
function join(
|
|
217
|
+
dependencies: ReadonlyArray<Dependency>,
|
|
218
|
+
start: string,
|
|
219
|
+
reached: Map<string, Dependency>,
|
|
220
|
+
): Array<string> {
|
|
221
|
+
const next = dependencies.filter((dependency) => is_unvisited(dependency, start, reached))
|
|
222
|
+
|
|
223
|
+
for (const dependency of next) reached.set(dependency.file, dependency)
|
|
224
|
+
|
|
225
|
+
return next.filter((dependency) => !dependency.external).map((dependency) => dependency.file)
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
function reachable(context: GraphContext, file: string): Map<string, Dependency> {
|
|
229
|
+
const reached = new Map<string, Dependency>()
|
|
230
|
+
const pending = [file, ...join(context.ambient, file, reached)]
|
|
231
|
+
|
|
232
|
+
for (let current = pending.pop(); current !== undefined; current = pending.pop()) {
|
|
233
|
+
pending.push(...join(direct_dependencies(context, current), file, reached))
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
return reached
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
// Named from the root rather than absolutely: a lane's seed and the gate's cache sharing rebase the
|
|
240
|
+
// cache file into another checkout, where an absolute name would drop every entry.
|
|
241
|
+
function token_of(context: GraphContext, dependency: Dependency): string {
|
|
242
|
+
const name = path.relative(context.root, dependency.file)
|
|
243
|
+
if (dependency.external) return name
|
|
244
|
+
|
|
245
|
+
return `${name}:${content_hash(context, dependency.file)}`
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
function closure_hash(context: GraphContext, file: string): string {
|
|
249
|
+
const tokens = [...reachable(context, file).values()].map((dependency) =>
|
|
250
|
+
token_of(context, dependency),
|
|
251
|
+
)
|
|
252
|
+
|
|
253
|
+
return input_fingerprint.of_entries(tokens)
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
// Undefined where nothing type-aware can run: no `typescript`, or no `tsconfig.json` at the root.
|
|
257
|
+
async function create(root: string): Promise<ImportGraph | undefined> {
|
|
258
|
+
const typescript = await load_typescript()
|
|
259
|
+
if (typescript === undefined) return undefined
|
|
260
|
+
const parsed = parsed_config(typescript, root)
|
|
261
|
+
if (parsed === undefined) return undefined
|
|
262
|
+
const { options } = parsed
|
|
263
|
+
const context: GraphContext = {
|
|
264
|
+
root,
|
|
265
|
+
typescript,
|
|
266
|
+
options,
|
|
267
|
+
resolution_cache: typescript.createModuleResolutionCache(root, (name) => name, options),
|
|
268
|
+
ambient: ambient_of({ typescript, options }, root, parsed),
|
|
269
|
+
dependencies: new Map(),
|
|
270
|
+
content_hashes: new Map(),
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
return { closure_hash: (file) => closure_hash(context, file) }
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
const import_graph = { create }
|
|
277
|
+
|
|
278
|
+
export type { ImportGraph }
|
|
279
|
+
export { import_graph }
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs'
|
|
2
|
+
import path from 'node:path'
|
|
3
|
+
import { environment_flags } from '@joshuafolkken/kit/env'
|
|
4
|
+
import { gate_plan } from '#scripts/gate/gate-plan'
|
|
5
|
+
import { verification_inputs } from '#scripts/gate/verification-inputs'
|
|
6
|
+
import {
|
|
7
|
+
changed_file_scope,
|
|
8
|
+
type ChangedFileScope,
|
|
9
|
+
type ScopeVocabulary,
|
|
10
|
+
} from '#scripts/git/changed-file-scope'
|
|
11
|
+
import {
|
|
12
|
+
ESLINT_CACHE_FILE,
|
|
13
|
+
ESLINT_CACHE_FLAGS,
|
|
14
|
+
PRETTIER_CACHE_FLAGS,
|
|
15
|
+
} from '#scripts/josh/josh-command-types'
|
|
16
|
+
import { lint_related_scope, type LintCaches } from './lint-related-scope'
|
|
17
|
+
|
|
18
|
+
// `josh lint --changed` — the lint `josh gate` runs (joshuafolkken/kit#4085): the branch's changed
|
|
19
|
+
// files rather than the whole tree.
|
|
20
|
+
//
|
|
21
|
+
// **Narrowing gives up only the files the branch did not change.** The whole-tree run answers such a
|
|
22
|
+
// file from its cache entry unless the files its imports reach changed (`eslint-cache-dependencies.ts`,
|
|
23
|
+
// joshuafolkken/kit#4415); this run does not lint it at all, so an unchanged file that a changed
|
|
24
|
+
// import broke is caught by the whole-tree run alone. The other files that run actually lints are
|
|
25
|
+
// the changed ones, and those are exactly the ones this run names.
|
|
26
|
+
//
|
|
27
|
+
// What a cache entry does not see falls back to the whole tree: a configuration the lint check declares
|
|
28
|
+
// (`verification-inputs.ts`) — a toolchain or ignore file, the eslint configuration and kit's own rules,
|
|
29
|
+
// the TypeScript configuration the type-aware rules read — and a change that cannot be read. CI lints the whole tree on every run,
|
|
30
|
+
// so the narrowed gate always has the full check behind it.
|
|
31
|
+
|
|
32
|
+
interface NarrowedLint {
|
|
33
|
+
prettier: ReadonlyArray<string>
|
|
34
|
+
eslint: ReadonlyArray<string>
|
|
35
|
+
eslint_cache_file: string
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
type Environment = Readonly<Record<string, string | undefined>>
|
|
39
|
+
|
|
40
|
+
const GATE_CACHES: LintCaches = {
|
|
41
|
+
eslint_file: ESLINT_CACHE_FILE,
|
|
42
|
+
eslint_flags: ESLINT_CACHE_FLAGS,
|
|
43
|
+
prettier_flags: PRETTIER_CACHE_FLAGS,
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
const CI_REASON = 'CI lints the whole tree'
|
|
47
|
+
const CONFIG_REASON = 'a changed file configures the toolchain or the linters'
|
|
48
|
+
|
|
49
|
+
const VOCABULARY: ScopeVocabulary = {
|
|
50
|
+
label: 'josh lint --changed',
|
|
51
|
+
fallback_suffix: 'checking the whole tree instead',
|
|
52
|
+
narrowed_suffix: 'checking only them',
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function all_scope(reason: string): ChangedFileScope {
|
|
56
|
+
return { mode: 'all', files: [], reason }
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// The lint check's declared configurations (`verification-inputs.ts`), as the since-green narrowing
|
|
60
|
+
// reads them too.
|
|
61
|
+
function configures_lint(files: ReadonlyArray<string>, root: string): boolean {
|
|
62
|
+
return verification_inputs.configures(
|
|
63
|
+
gate_plan.LINT_LABEL,
|
|
64
|
+
files.map((file) => path.relative(root, file).split(path.sep).join('/')),
|
|
65
|
+
)
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// `files` are absolute, as `changed_file_scope.read_changed_files` answers them; `undefined` is a
|
|
69
|
+
// change that could not be read.
|
|
70
|
+
function resolve_gate_scope(
|
|
71
|
+
files: ReadonlyArray<string> | undefined,
|
|
72
|
+
root: string,
|
|
73
|
+
environment: Environment,
|
|
74
|
+
): ChangedFileScope {
|
|
75
|
+
if (environment_flags.is_ci_enabled(environment['CI'])) return all_scope(CI_REASON)
|
|
76
|
+
if (files !== undefined && configures_lint(files, root)) return all_scope(CONFIG_REASON)
|
|
77
|
+
|
|
78
|
+
return changed_file_scope.resolve_scope(files, lint_related_scope.scope_inputs(existsSync))
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
function narrowed_run(files: ReadonlyArray<string>): NarrowedLint {
|
|
82
|
+
return {
|
|
83
|
+
prettier: lint_related_scope.prettier_arguments(files, GATE_CACHES),
|
|
84
|
+
eslint: lint_related_scope.eslint_arguments(files, GATE_CACHES),
|
|
85
|
+
eslint_cache_file: GATE_CACHES.eslint_file,
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
function describe_scope(scope: ChangedFileScope, root: string): string {
|
|
90
|
+
return changed_file_scope.describe_scope(scope, root, VOCABULARY)
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
const lint_gate_scope = {
|
|
94
|
+
CHANGED_FLAG: '--changed',
|
|
95
|
+
CI_REASON,
|
|
96
|
+
CONFIG_REASON,
|
|
97
|
+
describe_scope,
|
|
98
|
+
narrowed_run,
|
|
99
|
+
resolve_gate_scope,
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
export { lint_gate_scope }
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
import { fileURLToPath } from 'node:url'
|
|
3
|
+
import { changed_file_scope } from '#scripts/git/changed-file-scope'
|
|
4
|
+
import { lint_parallel } from './lint-parallel'
|
|
5
|
+
|
|
6
|
+
// The `josh lint` entry, kept apart from `lint-parallel.ts` because `lint-related.ts` imports that
|
|
7
|
+
// one: a bundle is one file, so a main guard there would fire for every command that carries it
|
|
8
|
+
// (joshuafolkken/kit#4186).
|
|
9
|
+
//
|
|
10
|
+
// `process.exitCode` rather than `process.exit()`: both reports are buffered and written in one go,
|
|
11
|
+
// and `process.exit()` truncates a piped stdout at its buffer size — which is exactly how this
|
|
12
|
+
// command is read when `josh gate` runs it as one of four concurrent checks. Setting the code lets
|
|
13
|
+
// the writes drain and the process end on its own, which it can, since both children have already
|
|
14
|
+
// exited by here.
|
|
15
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) {
|
|
16
|
+
process.exitCode = await lint_parallel.run_lint_command(
|
|
17
|
+
process.argv.slice(changed_file_scope.ARGV_START),
|
|
18
|
+
)
|
|
19
|
+
}
|
|
@@ -1,7 +1,10 @@
|
|
|
1
|
-
#!/usr/bin/env tsx
|
|
2
|
-
import { fileURLToPath } from 'node:url'
|
|
3
1
|
import { project_checks } from '#scripts/gate/project-checks'
|
|
4
|
-
import {
|
|
2
|
+
import { changed_file_scope } from '#scripts/git/changed-file-scope'
|
|
3
|
+
import {
|
|
4
|
+
ESLINT_CACHE_FILE,
|
|
5
|
+
ESLINT_CACHE_FLAGS,
|
|
6
|
+
PRETTIER_CACHE_FLAGS,
|
|
7
|
+
} from '#scripts/josh/josh-command-types'
|
|
5
8
|
import { lane_cache_run } from '#scripts/lane/lane-cache-run'
|
|
6
9
|
import {
|
|
7
10
|
buffered_process,
|
|
@@ -9,34 +12,53 @@ import {
|
|
|
9
12
|
type BufferedProcessResult,
|
|
10
13
|
} from '#scripts/lib/buffered-process'
|
|
11
14
|
import { SKIP_MARKER } from '#scripts/test/skip-marker'
|
|
12
|
-
import {
|
|
15
|
+
import { eslint_cache_dependencies } from './eslint-cache-dependencies'
|
|
16
|
+
import { eslint_daemon } from './eslint-daemon'
|
|
17
|
+
import { lint_gate_scope } from './lint-gate-scope'
|
|
13
18
|
|
|
14
|
-
const PRETTIER_ARGS = ['exec', 'prettier', '--check', '.'] as const
|
|
15
19
|
// This — not the `lint:eslint` map entry — is the eslint invocation `josh gate` reaches, so the
|
|
16
20
|
// cache flags come from the same constant the ignore rules are asserted against.
|
|
17
21
|
// A copy here would keep writing the old location the day that constant
|
|
18
22
|
// moves, with every test still green.
|
|
19
23
|
const WHOLE_TREE = '.'
|
|
20
24
|
const ESLINT_ARGS = ['exec', 'eslint', WHOLE_TREE, ...ESLINT_CACHE_FLAGS] as const
|
|
21
|
-
const WHOLE_TREE_RECHECK: CrossFileRecheckOptions = {
|
|
22
|
-
cache_file: ESLINT_CACHE_FILE,
|
|
23
|
-
patterns: [WHOLE_TREE],
|
|
24
|
-
}
|
|
25
25
|
|
|
26
|
-
//
|
|
27
|
-
// (`
|
|
26
|
+
// Prettier's cache stays this checkout's own, never shared through `lane_cache_run` as eslint's is:
|
|
27
|
+
// its entries do not survive a move (`josh-command-types.ts` → `GATE_CACHE_SPECS`).
|
|
28
|
+
const PRETTIER_ARGS = ['exec', 'prettier', '--check', WHOLE_TREE, ...PRETTIER_CACHE_FLAGS] as const
|
|
29
|
+
|
|
30
|
+
// What one eslint run is made of: the child's arguments and the cache file they name.
|
|
28
31
|
interface EslintRun {
|
|
29
32
|
args: ReadonlyArray<string>
|
|
30
|
-
|
|
33
|
+
cache_file: string
|
|
34
|
+
warm_daemon: boolean
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// Whether eslint may go through the checkout's warm daemon (`eslint-daemon.ts`). `josh lint:related`
|
|
38
|
+
// asks for it; the gate's own lint does not, so its whole-tree run stays one cold process of its own.
|
|
39
|
+
interface LintRunOptions {
|
|
40
|
+
warm_daemon: boolean
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const COLD_RUN: LintRunOptions = { warm_daemon: false }
|
|
44
|
+
|
|
45
|
+
// The warm daemon when asked for and reachable, else the cold `pnpm exec eslint` it falls back to.
|
|
46
|
+
async function run_eslint_process(eslint: EslintRun): Promise<BufferedProcessResult> {
|
|
47
|
+
if (eslint.warm_daemon) return await eslint_daemon.run_or_cold(eslint.args)
|
|
48
|
+
|
|
49
|
+
return await buffered_process.run_buffered_process(eslint.args)
|
|
31
50
|
}
|
|
32
51
|
|
|
33
|
-
// The
|
|
34
|
-
// the
|
|
52
|
+
// The run sits inside the lane's cache sharing, between dropping the entries whose imports changed
|
|
53
|
+
// and recording what the fresh ones read (`eslint-cache-dependencies.ts`).
|
|
35
54
|
async function run_eslint(eslint: EslintRun): Promise<BufferedProcessResult> {
|
|
36
|
-
|
|
37
|
-
const result = await buffered_process.run_buffered_process(eslint.args)
|
|
55
|
+
const { cache_file } = eslint
|
|
38
56
|
|
|
39
|
-
|
|
57
|
+
return await lane_cache_run.run(cache_file, async () => {
|
|
58
|
+
return await eslint_cache_dependencies.guard(
|
|
59
|
+
cache_file,
|
|
60
|
+
async () => await run_eslint_process(eslint),
|
|
61
|
+
)
|
|
40
62
|
})
|
|
41
63
|
}
|
|
42
64
|
|
|
@@ -96,19 +118,16 @@ function lint_exit_code(prettier: BufferedProcessResult, eslint: BufferedProcess
|
|
|
96
118
|
// and through the same basic-project skip, so a narrowed run never reaches a tool the whole-tree
|
|
97
119
|
// run would have skipped. The skip reasons answer nothing for a full
|
|
98
120
|
// project, so the one path serves both profiles.
|
|
99
|
-
//
|
|
100
|
-
// A narrowed run re-reads a cached cross-file report too (`cross-file-recheck.ts`): one change's
|
|
101
|
-
// files can hold both the reported file and the one it reads, and fixing the second leaves the
|
|
102
|
-
// first's cached report standing.
|
|
103
121
|
async function run_lint_checks(
|
|
104
122
|
prettier_args: ReadonlyArray<string>,
|
|
105
123
|
eslint_args: ReadonlyArray<string>,
|
|
106
|
-
|
|
124
|
+
cache_file: string,
|
|
125
|
+
options: LintRunOptions = COLD_RUN,
|
|
107
126
|
): Promise<number> {
|
|
108
127
|
const directory = process.cwd()
|
|
109
128
|
const [prettier, eslint] = await Promise.all([
|
|
110
129
|
run_prettier(directory, prettier_args),
|
|
111
|
-
run_checked_eslint(directory, { args: eslint_args,
|
|
130
|
+
run_checked_eslint(directory, { args: eslint_args, cache_file, ...options }),
|
|
112
131
|
])
|
|
113
132
|
|
|
114
133
|
write_output(with_ran_notice('prettier', prettier, eslint))
|
|
@@ -118,18 +137,38 @@ async function run_lint_checks(
|
|
|
118
137
|
}
|
|
119
138
|
|
|
120
139
|
async function run_lint_parallel_checks(): Promise<number> {
|
|
121
|
-
return await run_lint_checks(PRETTIER_ARGS, ESLINT_ARGS,
|
|
140
|
+
return await run_lint_checks(PRETTIER_ARGS, ESLINT_ARGS, ESLINT_CACHE_FILE)
|
|
122
141
|
}
|
|
123
142
|
|
|
124
|
-
// `
|
|
125
|
-
//
|
|
126
|
-
//
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
143
|
+
// `josh lint --changed`, the gate's lint: the branch's changed files on the gate's own caches, or the
|
|
144
|
+
// whole tree where `lint-gate-scope.ts` cannot narrow. The line naming the decision is printed first,
|
|
145
|
+
// so a narrowed run is never read as a whole one.
|
|
146
|
+
async function run_changed_lint_checks(): Promise<number> {
|
|
147
|
+
const root = await changed_file_scope.repository_root_or_cwd()
|
|
148
|
+
const files = await changed_file_scope.read_changed_files(root)
|
|
149
|
+
const scope = lint_gate_scope.resolve_gate_scope(files, root, process.env)
|
|
150
|
+
|
|
151
|
+
process.stdout.write(`${lint_gate_scope.describe_scope(scope, root)}\n`)
|
|
152
|
+
|
|
153
|
+
if (scope.mode === 'all') return await run_lint_parallel_checks()
|
|
154
|
+
|
|
155
|
+
const narrowed = lint_gate_scope.narrowed_run(scope.files)
|
|
156
|
+
|
|
157
|
+
return await run_lint_checks(narrowed.prettier, narrowed.eslint, narrowed.eslint_cache_file)
|
|
131
158
|
}
|
|
132
159
|
|
|
133
|
-
|
|
160
|
+
async function run_lint_command(command_arguments: ReadonlyArray<string>): Promise<number> {
|
|
161
|
+
if (command_arguments.includes(lint_gate_scope.CHANGED_FLAG)) {
|
|
162
|
+
return await run_changed_lint_checks()
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
return await run_lint_parallel_checks()
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
const lint_parallel = {
|
|
169
|
+
run_lint_checks,
|
|
170
|
+
run_lint_command,
|
|
171
|
+
run_lint_parallel_checks,
|
|
172
|
+
}
|
|
134
173
|
|
|
135
|
-
export { ESLINT_ARGS, lint_parallel }
|
|
174
|
+
export { ESLINT_ARGS, lint_parallel, PRETTIER_ARGS }
|
|
@@ -8,16 +8,14 @@ import {
|
|
|
8
8
|
import {
|
|
9
9
|
ESLINT_RELATED_CACHE_FILE,
|
|
10
10
|
ESLINT_RELATED_CACHE_FLAGS,
|
|
11
|
+
PRETTIER_RELATED_CACHE_FLAGS,
|
|
11
12
|
} from '#scripts/josh/josh-command-types'
|
|
12
|
-
import type { CrossFileRecheckOptions } from './cross-file-recheck'
|
|
13
13
|
|
|
14
14
|
// `josh lint` reads the whole repository on every call, and an implementation loop calls it after
|
|
15
15
|
// every few edits — re-reading files the change never touched.
|
|
16
16
|
//
|
|
17
|
-
//
|
|
18
|
-
//
|
|
19
|
-
// change did not name (a shared config, a generated snapshot), and only the whole-tree run sees
|
|
20
|
-
// that. What the narrowing replaces is the repeat calls in between.
|
|
17
|
+
// The gate narrows its own lint the same way, with its own caches and a whole-tree fallback for a
|
|
18
|
+
// changed toolchain or lint configuration (`lint-gate-scope.ts`), and CI lints the whole tree.
|
|
21
19
|
//
|
|
22
20
|
// The decision this file makes is which extensions the two linters read, and how each of them is
|
|
23
21
|
// asked about a file list instead of a directory. Everything it shares with `josh test:related` —
|
|
@@ -94,39 +92,49 @@ function describe_scope(scope: ChangedFileScope, root: string): string {
|
|
|
94
92
|
return changed_file_scope.describe_scope(scope, root, VOCABULARY)
|
|
95
93
|
}
|
|
96
94
|
|
|
97
|
-
|
|
98
|
-
|
|
95
|
+
// Where a narrowed run keeps its caches. `josh lint:related` keeps its own and the gate its own, for
|
|
96
|
+
// the reason `eslint_arguments` gives below; a narrowed gate run on the gate's caches loses none of
|
|
97
|
+
// the whole-tree entries, since a file it does not visit is not pruned (`josh-command-types.ts`).
|
|
98
|
+
interface LintCaches {
|
|
99
|
+
eslint_file: string
|
|
100
|
+
eslint_flags: ReadonlyArray<string>
|
|
101
|
+
prettier_flags: ReadonlyArray<string>
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
const RELATED_CACHES: LintCaches = {
|
|
105
|
+
eslint_file: ESLINT_RELATED_CACHE_FILE,
|
|
106
|
+
eslint_flags: ESLINT_RELATED_CACHE_FLAGS,
|
|
107
|
+
prettier_flags: PRETTIER_RELATED_CACHE_FLAGS,
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
// The scoped run's own cache file, for the reason eslint's below gives: prettier too rewrites its
|
|
111
|
+
// cache file whole, so a narrowed run sharing the gate's would discard entries a concurrent gate wrote.
|
|
112
|
+
function prettier_arguments(
|
|
113
|
+
files: ReadonlyArray<string>,
|
|
114
|
+
caches: LintCaches = RELATED_CACHES,
|
|
115
|
+
): ReadonlyArray<string> {
|
|
116
|
+
return [...PRETTIER_ARGS, ...files, ...caches.prettier_flags]
|
|
99
117
|
}
|
|
100
118
|
|
|
101
119
|
// The cache file is this command's own rather than the gate's, because the two run at the same time.
|
|
102
|
-
// `josh gate` lints
|
|
120
|
+
// `josh gate` lints beside the review while an
|
|
103
121
|
// implementation loop calls this command between edits, and each eslint run rewrites its cache file
|
|
104
122
|
// whole from the copy it loaded at start-up — so on one file the run that finished last would
|
|
105
123
|
// discard the other's entries, and a narrowed run finishing during a whole-tree run would roll the
|
|
106
124
|
// cache back to its pre-gate state. Sharing would let a narrowed run warm the gate's cache only for
|
|
107
125
|
// pruning, which says nothing about two writers. It is the same judgement the edit hook's own cache
|
|
108
126
|
// file makes.
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
return [...ESLINT_ARGS, ...files, ...
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
// What re-reading a cached cross-file report (`cross-file-recheck.ts`) needs to ask the narrowed run's question
|
|
117
|
-
// again: the same targets, the same cache file, and the Node API's spelling of `--no-warn-ignored`.
|
|
118
|
-
function cross_file_recheck_options(files: ReadonlyArray<string>): CrossFileRecheckOptions {
|
|
119
|
-
return {
|
|
120
|
-
cache_file: ESLINT_RELATED_CACHE_FILE,
|
|
121
|
-
patterns: files,
|
|
122
|
-
eslint_options: { warnIgnored: false },
|
|
123
|
-
}
|
|
127
|
+
function eslint_arguments(
|
|
128
|
+
files: ReadonlyArray<string>,
|
|
129
|
+
caches: LintCaches = RELATED_CACHES,
|
|
130
|
+
): ReadonlyArray<string> {
|
|
131
|
+
return [...ESLINT_ARGS, ...files, ...caches.eslint_flags, ...ESLINT_SCOPED_FLAGS]
|
|
124
132
|
}
|
|
125
133
|
|
|
126
134
|
const lint_related_scope = {
|
|
127
135
|
COMMAND_LABEL,
|
|
128
|
-
cross_file_recheck_options,
|
|
129
136
|
NOTHING_LINTABLE_REASON,
|
|
137
|
+
RELATED_CACHES,
|
|
130
138
|
describe_scope,
|
|
131
139
|
eslint_arguments,
|
|
132
140
|
is_lintable,
|
|
@@ -134,4 +142,5 @@ const lint_related_scope = {
|
|
|
134
142
|
scope_inputs,
|
|
135
143
|
}
|
|
136
144
|
|
|
145
|
+
export type { LintCaches }
|
|
137
146
|
export { lint_related_scope }
|