@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,60 @@
|
|
|
1
|
+
import {
|
|
2
|
+
run_board_usage_rusage,
|
|
3
|
+
type RusageReader,
|
|
4
|
+
} from '#scripts/run/board/run-board-usage-rusage'
|
|
5
|
+
|
|
6
|
+
// **The CPU a check's process tree spent, read off the gate's own reaped-children time**
|
|
7
|
+
// (joshuafolkken/kit#4362). Each check is a `pnpm josh <target>` child that waits for its tool before it
|
|
8
|
+
// exits, so once the gate has reaped it the whole tree's CPU sits in the gate's `proc_pid_rusage`
|
|
9
|
+
// child times (`run-board-usage-rusage.ts`, shared rather than read twice). The reader folds the
|
|
10
|
+
// gate's own time in, so `process.cpuUsage()` takes it back out, and each finished check takes the
|
|
11
|
+
// growth since the previous one finished.
|
|
12
|
+
//
|
|
13
|
+
// **A reading is an attribution, not an isolation**: any other child the gate reaped in between — a
|
|
14
|
+
// `ps` sample, a git call — lands on the next check that finishes, and two checks reaped in one tick
|
|
15
|
+
// split their CPU unevenly. Both are small beside a check's tools. Off macOS, or without `node:ffi`,
|
|
16
|
+
// there is no reader and every check records none.
|
|
17
|
+
|
|
18
|
+
const US_PER_MS = 1000
|
|
19
|
+
|
|
20
|
+
// The CPU milliseconds spent by the children reaped since the previous call, `undefined` where the
|
|
21
|
+
// gate's own usage cannot be read.
|
|
22
|
+
type CheckCpu = () => number | undefined
|
|
23
|
+
|
|
24
|
+
function own_cpu_ms(): number {
|
|
25
|
+
const usage = process.cpuUsage()
|
|
26
|
+
|
|
27
|
+
return (usage.user + usage.system) / US_PER_MS
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function reaped_cpu_ms(read: RusageReader | undefined, pid: number): number | undefined {
|
|
31
|
+
const reading = read?.(pid)
|
|
32
|
+
|
|
33
|
+
return reading === undefined ? undefined : reading.cpu_ms - own_cpu_ms()
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// One gate's reader, its baseline taken now — before any check is reaped.
|
|
37
|
+
function check_cpu_reader(
|
|
38
|
+
read: RusageReader | undefined = run_board_usage_rusage.rusage_reader(
|
|
39
|
+
process.platform,
|
|
40
|
+
run_board_usage_rusage.load_builtin,
|
|
41
|
+
),
|
|
42
|
+
pid: number = process.pid,
|
|
43
|
+
): CheckCpu {
|
|
44
|
+
const previous = { reaped_ms: reaped_cpu_ms(read, pid) }
|
|
45
|
+
|
|
46
|
+
return function since_previous(): number | undefined {
|
|
47
|
+
const reaped_ms = reaped_cpu_ms(read, pid)
|
|
48
|
+
const before = previous.reaped_ms
|
|
49
|
+
|
|
50
|
+
previous.reaped_ms = reaped_ms
|
|
51
|
+
if (reaped_ms === undefined || before === undefined) return undefined
|
|
52
|
+
|
|
53
|
+
return Math.max(0, reaped_ms - before)
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
const check_cpu = { check_cpu_reader }
|
|
58
|
+
|
|
59
|
+
export type { CheckCpu }
|
|
60
|
+
export { check_cpu }
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import path from 'node:path'
|
|
2
|
+
import { PROJECT_ROOT } from '#scripts/init/init-paths'
|
|
3
|
+
import { test_related } from '#scripts/test/test-related'
|
|
4
|
+
import {
|
|
5
|
+
verification_inputs,
|
|
6
|
+
type InputDeclaration,
|
|
7
|
+
type PrettierIgnored,
|
|
8
|
+
} from './verification-inputs'
|
|
9
|
+
|
|
10
|
+
// The file-level answer of a check's declaration (`verification-inputs.ts`): whether any of the paths
|
|
11
|
+
// that moved is one the check reads, so a gate re-run reuses a check none of whose inputs moved
|
|
12
|
+
// (`check-reuse.ts`). It lives apart from the declarations because following imports reads the
|
|
13
|
+
// test-read map (`test-related.ts`), whose own since-green narrowing reads the declarations.
|
|
14
|
+
//
|
|
15
|
+
// **The unit step's inputs are the test-read map's, not a guess** (joshuafolkken/kit#4314): it is
|
|
16
|
+
// reusable only when `josh test:related` would run no test for what moved — every moved file one no
|
|
17
|
+
// recorded test reads. No map, or one recorded on a tree git can no longer diff against, reaches every
|
|
18
|
+
// test, so the step runs.
|
|
19
|
+
|
|
20
|
+
function prettier_ignored(root: string): PrettierIgnored {
|
|
21
|
+
const ignore_path = verification_inputs.PRETTIER_IGNORE_FILES.map((name) => path.join(root, name))
|
|
22
|
+
|
|
23
|
+
return async function is_ignored(relative: string): Promise<boolean> {
|
|
24
|
+
try {
|
|
25
|
+
const prettier = await import('prettier')
|
|
26
|
+
const info = await prettier.getFileInfo(path.join(root, relative), {
|
|
27
|
+
ignorePath: ignore_path,
|
|
28
|
+
})
|
|
29
|
+
|
|
30
|
+
return info.ignored
|
|
31
|
+
} catch {
|
|
32
|
+
return false
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
async function reads_any(
|
|
38
|
+
declaration: InputDeclaration,
|
|
39
|
+
paths: ReadonlyArray<string>,
|
|
40
|
+
is_ignored: PrettierIgnored,
|
|
41
|
+
root: string,
|
|
42
|
+
): Promise<boolean> {
|
|
43
|
+
if (declaration.reads === 'recorded') return await test_related.reaches_tests(root, paths)
|
|
44
|
+
|
|
45
|
+
const { is_input } = declaration
|
|
46
|
+
|
|
47
|
+
if (is_input === undefined) return true
|
|
48
|
+
|
|
49
|
+
const answers = await Promise.all(
|
|
50
|
+
paths.map(async (relative) => await is_input(relative, is_ignored)),
|
|
51
|
+
)
|
|
52
|
+
|
|
53
|
+
return answers.includes(true)
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// Whether any of `paths` (repository-root relative) is an input of the check `label`. An undeclared
|
|
57
|
+
// check answers `true` for every set of paths, so the only way to reuse it is never.
|
|
58
|
+
async function touches_inputs(
|
|
59
|
+
label: string,
|
|
60
|
+
paths: ReadonlyArray<string>,
|
|
61
|
+
is_ignored: PrettierIgnored,
|
|
62
|
+
root: string = PROJECT_ROOT,
|
|
63
|
+
): Promise<boolean> {
|
|
64
|
+
const declaration = verification_inputs.declaration_of(label)
|
|
65
|
+
|
|
66
|
+
if (declaration === undefined || verification_inputs.configures(label, paths)) return true
|
|
67
|
+
|
|
68
|
+
return await reads_any(declaration, paths, is_ignored, root)
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
const check_inputs = { prettier_ignored, touches_inputs }
|
|
72
|
+
|
|
73
|
+
export { check_inputs }
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import { git_command } from '#scripts/git/git-command'
|
|
2
|
+
import { PROJECT_ROOT } from '#scripts/init/init-paths'
|
|
3
|
+
import {
|
|
4
|
+
file_map_stamp,
|
|
5
|
+
type FileMapStamp,
|
|
6
|
+
type FileMapStampAccess,
|
|
7
|
+
} from '#scripts/josh/file-map-stamp'
|
|
8
|
+
import { stamp_file } from '#scripts/josh/stamp-file'
|
|
9
|
+
import { review_tree } from '#scripts/review/review-tree'
|
|
10
|
+
import { check_inputs } from './check-inputs'
|
|
11
|
+
import { gate_report, type GateStepResult } from './gate-report'
|
|
12
|
+
import type { GateTree } from './gate-tree'
|
|
13
|
+
import { moved_paths } from './moved-paths'
|
|
14
|
+
import { verification_inputs, type PrettierIgnored } from './verification-inputs'
|
|
15
|
+
|
|
16
|
+
// One green record per declared check, so a gate re-run starts only the checks whose inputs moved
|
|
17
|
+
// (`verification-inputs.ts` declares what each reads). The whole-gate record (`gate-skip.ts`) is refused
|
|
18
|
+
// the moment the merge base moves; a main sync that brought in only `.claude/**/*.md` then re-ran lint
|
|
19
|
+
// and the type check over sources neither had a reason to read again. What moved since a record is
|
|
20
|
+
// `moved-paths.ts`.
|
|
21
|
+
//
|
|
22
|
+
// **A record is reuse of a result, not a check dropped**: no base, an empty changed-file map, an
|
|
23
|
+
// unreadable base diff, no root or a fingerprint of the check's tools and environment that moved
|
|
24
|
+
// answers "not reusable", and an undeclared check is never reusable. The records are written and read
|
|
25
|
+
// only where the CLI entry resolved their destination (`CheckRecords`), so a suite driving the gate
|
|
26
|
+
// never plants a green record over the live tree.
|
|
27
|
+
|
|
28
|
+
const CHECK_PREFIX = 'josh-gate-check-'
|
|
29
|
+
|
|
30
|
+
function check_stamp(label: string): FileMapStampAccess {
|
|
31
|
+
return file_map_stamp.create(CHECK_PREFIX, PROJECT_ROOT, () =>
|
|
32
|
+
verification_inputs.fingerprint([label]),
|
|
33
|
+
)
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// Where each check's record lives — a parameter so a test plants records in a directory of its own.
|
|
37
|
+
type CheckRecords = (label: string) => string
|
|
38
|
+
|
|
39
|
+
function default_records(label: string): string {
|
|
40
|
+
return stamp_file.stamp_path(`${CHECK_PREFIX}${label}-`, PROJECT_ROOT)
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
interface ReuseContext {
|
|
44
|
+
tree: GateTree
|
|
45
|
+
records: CheckRecords
|
|
46
|
+
is_ignored: PrettierIgnored
|
|
47
|
+
root: string
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
async function is_stamp_reusable(
|
|
51
|
+
label: string,
|
|
52
|
+
stamp: FileMapStamp,
|
|
53
|
+
context: ReuseContext,
|
|
54
|
+
): Promise<boolean> {
|
|
55
|
+
const moved = await moved_paths.moved_since(stamp, context.tree)
|
|
56
|
+
|
|
57
|
+
if (moved === undefined || !check_stamp(label).describes_inputs(stamp)) return false
|
|
58
|
+
|
|
59
|
+
return !(await check_inputs.touches_inputs(label, moved, context.is_ignored, context.root))
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// The time the check's record was taken, or `undefined` when the check has to run.
|
|
63
|
+
async function reused_at(label: string, context: ReuseContext): Promise<string | undefined> {
|
|
64
|
+
const stamp = verification_inputs.is_declared(label)
|
|
65
|
+
? check_stamp(label).read(context.records(label))
|
|
66
|
+
: undefined
|
|
67
|
+
|
|
68
|
+
if (stamp === undefined) return undefined
|
|
69
|
+
|
|
70
|
+
return (await is_stamp_reusable(label, stamp, context)) ? stamp.taken_at : undefined
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
async function read_root(): Promise<string | undefined> {
|
|
74
|
+
try {
|
|
75
|
+
return await git_command.repository_root()
|
|
76
|
+
} catch {
|
|
77
|
+
return undefined
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// Each reusable check's label, mapped to when it was last green.
|
|
82
|
+
async function reusable_checks(
|
|
83
|
+
labels: ReadonlyArray<string>,
|
|
84
|
+
tree: GateTree,
|
|
85
|
+
records: CheckRecords = default_records,
|
|
86
|
+
): Promise<ReadonlyMap<string, string>> {
|
|
87
|
+
const root = await read_root()
|
|
88
|
+
|
|
89
|
+
if (root === undefined) return new Map()
|
|
90
|
+
|
|
91
|
+
const context = { tree, records, root, is_ignored: check_inputs.prettier_ignored(root) }
|
|
92
|
+
const answers = await Promise.all(
|
|
93
|
+
labels.map(async (label) => [label, await reused_at(label, context)] as const),
|
|
94
|
+
)
|
|
95
|
+
|
|
96
|
+
return new Map(answers.flatMap(([label, at]) => (at === undefined ? [] : [[label, at] as const])))
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
function is_recordable(result: GateStepResult): boolean {
|
|
100
|
+
return (
|
|
101
|
+
verification_inputs.is_declared(result.label) &&
|
|
102
|
+
!gate_report.is_gate_step_failed(result) &&
|
|
103
|
+
gate_report.has_nothing_to_say(result)
|
|
104
|
+
)
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
function write_records(
|
|
108
|
+
results: ReadonlyArray<GateStepResult>,
|
|
109
|
+
tree: GateTree,
|
|
110
|
+
records: CheckRecords,
|
|
111
|
+
): void {
|
|
112
|
+
const recordable = results.filter((result) => is_recordable(result))
|
|
113
|
+
|
|
114
|
+
for (const { label } of recordable) {
|
|
115
|
+
check_stamp(label).write(tree.files, records(label), tree.base)
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
// Every scoped check that passed silently, recorded against the tree it read — a red gate's green
|
|
120
|
+
// checks included, since each record answers for its own check alone. Nothing is written when the tree
|
|
121
|
+
// moved while the checks ran, and a failed write leaves no record, the safe direction either way.
|
|
122
|
+
async function record_green_checks(
|
|
123
|
+
results: ReadonlyArray<GateStepResult>,
|
|
124
|
+
tree: GateTree,
|
|
125
|
+
records: CheckRecords = default_records,
|
|
126
|
+
): Promise<void> {
|
|
127
|
+
try {
|
|
128
|
+
const after = await review_tree.read_changed_tree()
|
|
129
|
+
|
|
130
|
+
if (JSON.stringify(after) !== JSON.stringify(tree.files)) return
|
|
131
|
+
|
|
132
|
+
write_records(results, { files: after, base: tree.base }, records)
|
|
133
|
+
} catch {
|
|
134
|
+
/* no record is the safe answer */
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
const check_reuse = { DEFAULT_RECORDS: default_records, record_green_checks, reusable_checks }
|
|
139
|
+
|
|
140
|
+
export type { CheckRecords }
|
|
141
|
+
export { check_reuse }
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
import os from 'node:os'
|
|
2
|
+
import { bash_triggers } from '#scripts/rules/bash-triggers'
|
|
3
|
+
import { git_argv, type ProgramCall } from '#scripts/rules/git-argv'
|
|
4
|
+
import { shell_segments } from '#scripts/rules/shell-segments'
|
|
5
|
+
import { time_shell } from '#scripts/time-runtime/time-shell'
|
|
6
|
+
import { core_weights } from './core-weights'
|
|
7
|
+
|
|
8
|
+
// The heavy tools a shell line launches, and the memory they hold (joshuafolkken/kit#4582).
|
|
9
|
+
//
|
|
10
|
+
// **`reserved-run` counted a wrapped command's cores and no memory**: a lane ran
|
|
11
|
+
// `reserved-run 4 -- sh -c '… eslint . --concurrency 4 …'`, typed eslint held a TypeScript program per
|
|
12
|
+
// worker, and the 12 GB process was admitted beside four other lanes until the machine swapped. The
|
|
13
|
+
// estimate here is what the wrapper now reserves, and the same reading is what `lane-direct-tool`
|
|
14
|
+
// refuses a multi-worker eslint on.
|
|
15
|
+
//
|
|
16
|
+
// **Every spelling is read down to the program.** `git_argv.program_of` skips the wrapper words, a
|
|
17
|
+
// quoted script handed to a shell is read as its own line (`bash_triggers.shell_script_of`), and the
|
|
18
|
+
// command after `pnpm josh reserved-run <weight> --` is read as the call it wraps, marked reserved. A
|
|
19
|
+
// heredoc body is text, so it is dropped before the line is cut — unless a shell reads it
|
|
20
|
+
// (`bash <<'EOF'`), when it is read as a line of its own, the `sh -c` escape spelled another way.
|
|
21
|
+
//
|
|
22
|
+
// **The estimate is the largest tool's, not the sum**: the commands of one line run one after another,
|
|
23
|
+
// so only one of them is resident at a time. A line with no known tool is `undefined`, the 0 MB it
|
|
24
|
+
// counted before — `reserved-run 1 -- pnpm josh audit` reserves its own, and is not counted twice.
|
|
25
|
+
|
|
26
|
+
interface ToolCall extends ProgramCall {
|
|
27
|
+
// Inside a `pnpm josh reserved-run … --`, the budgeted path.
|
|
28
|
+
is_reserved: boolean
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// A line still to be cut into its programs.
|
|
32
|
+
interface PendingLine {
|
|
33
|
+
line: string
|
|
34
|
+
is_reserved: boolean
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
const JOSH_PROGRAM = 'josh'
|
|
38
|
+
const RESERVED_RUN = 'reserved-run'
|
|
39
|
+
const COMMAND_SEPARATOR = '--'
|
|
40
|
+
const ESLINT = 'eslint'
|
|
41
|
+
const VITEST = 'vitest'
|
|
42
|
+
const AUTO_WORKERS = 'auto'
|
|
43
|
+
const LINE_BREAK = '\n'
|
|
44
|
+
// A heredoc fed to a shell — `bash <<'EOF'`, `sh -s <<EOF` — whose body the shell runs.
|
|
45
|
+
const SHELL_HEREDOC = /\b(?:ba|z|da|k)?sh(?:\s+-\w+)*\s*<<-?\s*(['"]?)(\w+)\1/u
|
|
46
|
+
const HEREDOC_DELIMITER_GROUP = 2
|
|
47
|
+
// ESLint 10's `auto` caps its workers at half the available cores (`eslint/lib/eslint/eslint.js`).
|
|
48
|
+
const AUTO_CORE_SHARE = 2
|
|
49
|
+
const SINGLE_WORKER = 1
|
|
50
|
+
// The flag each multi-worker tool takes its worker count from.
|
|
51
|
+
const WORKER_FLAGS: Readonly<Partial<Record<string, string>>> = {
|
|
52
|
+
[ESLINT]: '--concurrency',
|
|
53
|
+
[VITEST]: '--maxWorkers',
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// The command `pnpm josh reserved-run <weight> [--memory <MB>] -- <command>` wraps, or `undefined`.
|
|
57
|
+
function wrapped_command_of(call: ProgramCall): string | undefined {
|
|
58
|
+
if (call.name !== JOSH_PROGRAM || call.args[0] !== RESERVED_RUN) return undefined
|
|
59
|
+
|
|
60
|
+
const separator = call.args.indexOf(COMMAND_SEPARATOR)
|
|
61
|
+
|
|
62
|
+
return separator === -1 ? undefined : call.args.slice(separator + 1).join(' ')
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// One command of a line: the program it launches, or the line it hands on — a `reserved-run`'s
|
|
66
|
+
// wrapped command, or a shell's quoted script.
|
|
67
|
+
function reading_of(segment: string, is_reserved: boolean): ToolCall | PendingLine | undefined {
|
|
68
|
+
const call = git_argv.program_of(segment)
|
|
69
|
+
const wrapped = call === undefined ? undefined : wrapped_command_of(call)
|
|
70
|
+
|
|
71
|
+
if (wrapped !== undefined) return { line: wrapped, is_reserved: true }
|
|
72
|
+
|
|
73
|
+
const script = bash_triggers.shell_script_of(segment)
|
|
74
|
+
|
|
75
|
+
if (script !== undefined) return { line: script, is_reserved }
|
|
76
|
+
|
|
77
|
+
return call === undefined ? undefined : { ...call, is_reserved }
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// The lines up to the delimiter alone on its line, or to the end when it never closes.
|
|
81
|
+
function body_until(lines: ReadonlyArray<string>, delimiter: string): string {
|
|
82
|
+
const end = lines.findIndex((body_line) => body_line.trim() === delimiter)
|
|
83
|
+
|
|
84
|
+
return (end === -1 ? lines : lines.slice(0, end)).join(LINE_BREAK)
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// The body of every heredoc the line feeds to a shell, each as a line of its own: `bash <<'EOF'` runs
|
|
88
|
+
// its body, where `cat <<EOF` only prints it.
|
|
89
|
+
function shell_heredoc_bodies(line: string): Array<string> {
|
|
90
|
+
const lines = line.split(LINE_BREAK)
|
|
91
|
+
|
|
92
|
+
return lines.flatMap((opening, index) => {
|
|
93
|
+
const delimiter = SHELL_HEREDOC.exec(opening)?.[HEREDOC_DELIMITER_GROUP]
|
|
94
|
+
|
|
95
|
+
return delimiter === undefined ? [] : body_until(lines.slice(index + 1), delimiter)
|
|
96
|
+
})
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
function is_tool_call(reading: ToolCall | PendingLine): reading is ToolCall {
|
|
100
|
+
return 'name' in reading
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
function is_pending_line(reading: ToolCall | PendingLine): reading is PendingLine {
|
|
104
|
+
return !is_tool_call(reading)
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// Every program the line launches, a shell's quoted script and a `reserved-run`'s command included.
|
|
108
|
+
// A queue rather than recursion: each handed-on line is shorter than the one it came from.
|
|
109
|
+
function tool_calls_of(line: string): Array<ToolCall> {
|
|
110
|
+
const pending: Array<PendingLine> = [{ line, is_reserved: false }]
|
|
111
|
+
const calls: Array<ToolCall> = []
|
|
112
|
+
|
|
113
|
+
for (let next = pending.shift(); next !== undefined; next = pending.shift()) {
|
|
114
|
+
const { is_reserved } = next
|
|
115
|
+
const readings = shell_segments
|
|
116
|
+
.quote_aware_commands_of(time_shell.without_heredoc_bodies(next.line))
|
|
117
|
+
.flatMap((segment) => reading_of(segment, is_reserved) ?? [])
|
|
118
|
+
|
|
119
|
+
const bodies = shell_heredoc_bodies(next.line).map((body) => ({ line: body, is_reserved }))
|
|
120
|
+
|
|
121
|
+
calls.push(...readings.filter((reading) => is_tool_call(reading)))
|
|
122
|
+
pending.push(...readings.filter((reading) => is_pending_line(reading)), ...bodies)
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
return calls
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
// `--flag <value>` or `--flag=<value>`.
|
|
129
|
+
function flag_value(args: ReadonlyArray<string>, flag: string): string | undefined {
|
|
130
|
+
const prefix = `${flag}=`
|
|
131
|
+
const index = args.findIndex((argument) => argument === flag || argument.startsWith(prefix))
|
|
132
|
+
const argument = args[index]
|
|
133
|
+
|
|
134
|
+
if (argument === undefined) return undefined
|
|
135
|
+
|
|
136
|
+
return argument === flag ? args[index + 1] : argument.slice(prefix.length)
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
// The workers a tool opens when its flag is missing. **vitest's default is the machine less one**
|
|
140
|
+
// (`maxWorkers`, run mode): `vitest.config.ts` shares the machine only between marked runs, so a lone
|
|
141
|
+
// direct run opens them all. ESLint's `--concurrency` defaults to `off`, one worker.
|
|
142
|
+
function default_workers(name: string, cores: number): number {
|
|
143
|
+
return name === VITEST ? Math.max(SINGLE_WORKER, cores - 1) : SINGLE_WORKER
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
// A worker flag's count: half the cores for `auto`, else the number — one for `off` and an unreadable
|
|
147
|
+
// value alike.
|
|
148
|
+
function count_of(value: string, cores: number): number {
|
|
149
|
+
if (value === AUTO_WORKERS) return Math.max(SINGLE_WORKER, Math.floor(cores / AUTO_CORE_SHARE))
|
|
150
|
+
|
|
151
|
+
const count = Number(value)
|
|
152
|
+
|
|
153
|
+
return Number.isSafeInteger(count) && count > SINGLE_WORKER ? count : SINGLE_WORKER
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
function workers_of(call: ToolCall, cores: number = os.availableParallelism()): number {
|
|
157
|
+
const flag = WORKER_FLAGS[call.name]
|
|
158
|
+
const value = flag === undefined ? undefined : flag_value(call.args, flag)
|
|
159
|
+
|
|
160
|
+
return value === undefined ? default_workers(call.name, cores) : count_of(value, cores)
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
function memory_of(call: ToolCall, cores: number): number | undefined {
|
|
164
|
+
const row = core_weights.TOOL_MEMORY[call.name]
|
|
165
|
+
|
|
166
|
+
return row === undefined ? undefined : core_weights.MEMORY_MB[row] * workers_of(call, cores)
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
// The MB the line's largest tool holds, or `undefined` when it launches none the table knows.
|
|
170
|
+
function estimated_memory_mb(
|
|
171
|
+
line: string,
|
|
172
|
+
cores: number = os.availableParallelism(),
|
|
173
|
+
): number | undefined {
|
|
174
|
+
const amounts = tool_calls_of(line).flatMap((call) => memory_of(call, cores) ?? [])
|
|
175
|
+
|
|
176
|
+
return amounts.length === 0 ? undefined : Math.max(...amounts)
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
// True when the line runs eslint with more than one worker, wrapped or not.
|
|
180
|
+
function runs_multi_worker_eslint(
|
|
181
|
+
line: string,
|
|
182
|
+
cores: number = os.availableParallelism(),
|
|
183
|
+
): boolean {
|
|
184
|
+
return tool_calls_of(line).some(
|
|
185
|
+
(call) => call.name === ESLINT && workers_of(call, cores) > SINGLE_WORKER,
|
|
186
|
+
)
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
const command_memory = { estimated_memory_mb, runs_multi_worker_eslint, tool_calls_of }
|
|
190
|
+
|
|
191
|
+
export { command_memory }
|
|
192
|
+
export type { ToolCall }
|