@joshuafolkken/kit 1.1514.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 +5 -5
- package/.claude/skills/epic-commands/SKILL.md +26 -65
- package/.claude/skills/epic-commands/epic-bundle.md +3 -1
- package/.claude/skills/workflow-commands/SKILL.md +5 -5
- package/.claude/skills/workflow-commands/background-commands.md +5 -5
- package/.claude/skills/workflow-commands/backlogrun-child.md +10 -8
- package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +7 -25
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +17 -13
- package/.claude/skills/workflow-commands/backlogrun-park.md +14 -23
- package/.claude/skills/workflow-commands/backlogrun-progress.md +2 -2
- package/.claude/skills/workflow-commands/backlogrun-recovery.md +5 -5
- package/.claude/skills/workflow-commands/backlogrun-steps.md +10 -10
- package/.claude/skills/workflow-commands/backlogrun.md +1 -1
- package/.claude/skills/workflow-commands/chain-rule.md +13 -7
- package/.claude/skills/workflow-commands/delegation.md +6 -5
- package/.claude/skills/workflow-commands/entry-sequence.md +9 -9
- package/.claude/skills/workflow-commands/followup.md +9 -31
- package/.claude/skills/workflow-commands/fullrun-steps.md +36 -45
- package/.claude/skills/workflow-commands/fullrun.md +2 -2
- package/.claude/skills/workflow-commands/halfrun.md +17 -25
- package/.claude/skills/workflow-commands/issue-comments.md +16 -12
- package/.claude/skills/workflow-commands/issue-scout.md +2 -2
- package/.claude/skills/workflow-commands/kickoff.md +24 -23
- package/.claude/skills/workflow-commands/latest-gate.md +7 -12
- package/.claude/skills/workflow-commands/needs-human-review.md +9 -14
- package/.claude/skills/workflow-commands/observation-filing.md +4 -36
- package/.claude/skills/workflow-commands/observation-ledger.md +1 -1
- package/.claude/skills/workflow-commands/pre-gate-cut.md +13 -30
- package/.claude/skills/workflow-commands/prerequisite.md +10 -16
- package/.claude/skills/workflow-commands/progress-watcher.md +1 -1
- package/.claude/skills/workflow-commands/prrun.md +3 -7
- package/.claude/skills/workflow-commands/retrospective.md +1 -1
- package/.claude/skills/workflow-commands/split-assessment.md +13 -1
- package/.claude/skills/workflow-commands/working-tree-hold.md +9 -9
- package/.codex/hooks.json +5 -5
- package/.github/actions/setup-node/action.yml +9 -0
- package/.github/actions/setup-pnpm/action.yml +1 -1
- package/.github/dependabot.yml +16 -0
- package/.github/release.yml +0 -2
- package/.github/workflows/ci.yml +120 -10
- package/.github/workflows/publish.yml +8 -1
- package/.github/workflows/sonar-qube.yml +1 -0
- package/.prettierignore +2 -0
- package/.vscode/tasks.json +1 -2
- package/CLAUDE.md +3 -7
- package/README.md +4 -2
- package/SECURITY.md +1 -1
- package/dist/CLAUDE.md +3 -7
- package/dist/commands/document-read-cli.js +882 -0
- package/dist/commands/{document-section-cli.js → document-section-main.js} +79 -37
- 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-TNUMY6NL.js → chunk-PT5R6UJD.js} +4193 -1900
- package/dist/hooks/chunk-TUIFS5E7.js +72 -0
- package/dist/hooks/{chunk-723HKZO5.js → chunk-VWWCFGWK.js} +1 -1
- package/dist/hooks/{chunk-APUO6U4J.js → chunk-WR2KQAYZ.js} +1843 -440
- package/dist/hooks/{chunk-O6GDRNJB.js → chunk-XGBNSWEI.js} +248 -46
- package/dist/hooks/chunk-YCDOIR3I.js +3456 -0
- package/dist/hooks/codex-hook-adapter.js +10 -22
- package/dist/hooks/format-edited.js +5 -6
- package/dist/hooks/inputs.json +443 -317
- package/dist/hooks/pretool-guard.js +7 -25
- package/dist/hooks/session-lang.js +44 -51
- package/dist/hooks/stop-guard.js +7716 -2187
- package/dist/josh.js +6002 -3583
- 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 +3 -1
- package/package.json +10 -48
- package/pnpm-workspace.yaml +4 -2
- package/prompts/coding-standards.md +1 -1
- package/prompts/collaboration-workflow/file-edits.md +1 -7
- package/prompts/collaboration-workflow/issue-citation.md +1 -1
- package/prompts/collaboration-workflow/issue-template.md +33 -16
- package/prompts/collaboration-workflow/lane-instructions.md +1 -2
- package/prompts/collaboration-workflow/measurement.md +37 -0
- package/prompts/collaboration-workflow/operating-rules.md +4 -6
- package/prompts/collaboration-workflow/output-bounds.md +2 -7
- package/prompts/collaboration-workflow/plan-comment.md +3 -42
- package/prompts/collaboration-workflow/principles.md +5 -0
- package/prompts/collaboration-workflow/report-format.md +31 -60
- package/prompts/collaboration-workflow/residency.md +2 -2
- package/prompts/collaboration-workflow/shell-body.md +6 -16
- package/prompts/collaboration-workflow/turn-batching.md +0 -2
- package/prompts/collaboration-workflow/upstream-interrupt.md +14 -4
- package/prompts/collaboration-workflow/wip-cap.md +1 -1
- package/prompts/collaboration-workflow.md +3 -7
- package/prompts/refactoring.md +1 -1
- package/prompts/review-rubric.md +1 -2
- package/prompts/review.md +41 -21
- package/prompts/testing-guide.md +8 -43
- package/scripts/agent/agent-event.ts +15 -15
- package/scripts/agent/agent-exit-record.ts +13 -1
- package/scripts/agent/api-auth.ts +41 -0
- package/scripts/agent/api-outage.ts +1 -1
- 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 +2 -3
- 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 +53 -6
- 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 +30 -7
- 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 +52 -39
- package/scripts/backlog/backlog-offer-cli.ts +6 -21
- package/scripts/backlog/backlog-offer-exclude.ts +15 -0
- package/scripts/backlog/backlog-offer-main.ts +12 -0
- package/scripts/backlog/backlog-offer.ts +36 -3
- package/scripts/backlog/backlog-overlap.ts +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 +112 -30
- 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 +0 -8
- package/scripts/delegation/investigation-guard.ts +0 -8
- package/scripts/delegation/investigation-reads.ts +3 -4
- 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 +8 -6
- package/scripts/document/document-scan.ts +1 -1
- package/scripts/document/document-section-cli.ts +0 -8
- package/scripts/document/document-section-main.ts +12 -0
- package/scripts/epic/epic-audit-cli.ts +12 -6
- package/scripts/epic/epic-bundle-apply.ts +137 -0
- package/scripts/epic/epic-bundle-cli.ts +32 -121
- package/scripts/epic/epic-bundle-format.ts +116 -0
- package/scripts/epic/epic-bundle-main.ts +17 -0
- package/scripts/epic/epic-busy.ts +5 -12
- package/scripts/epic/epic-classify.ts +24 -15
- package/scripts/epic/epic-cli-argv.ts +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 +19 -66
- 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 +39 -95
- package/scripts/gate/check-reuse.ts +33 -54
- 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 +80 -98
- package/scripts/gate/core-wait-record.ts +48 -0
- package/scripts/gate/core-wait.ts +37 -5
- package/scripts/gate/core-weights.ts +86 -0
- package/scripts/gate/free-cores.ts +27 -4
- package/scripts/gate/gate-ledger.ts +32 -4
- package/scripts/gate/gate-plan.ts +41 -34
- package/scripts/gate/gate-report.ts +14 -2
- package/scripts/gate/gate-run-steps.ts +53 -8
- package/scripts/gate/gate-skip.ts +12 -2
- package/scripts/gate/gate-steps.ts +12 -1
- package/scripts/gate/input-fingerprint.ts +42 -0
- package/scripts/gate/machine-capacity.ts +65 -31
- package/scripts/gate/moved-paths.ts +67 -0
- 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 +27 -24
- 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-write.ts +67 -29
- 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/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 +2 -2
- package/scripts/git/main-merge.ts +25 -9
- 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 +0 -8
- 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 +30 -3
- package/scripts/hooks/pre-push-unit.ts +4 -2
- package/scripts/hooks/pretool-guard-cli.ts +1 -8
- package/scripts/hooks/pretool-guard.ts +32 -19
- package/scripts/hooks/reserved-run.ts +67 -9
- package/scripts/hooks/run-hook.sh +13 -4
- package/scripts/hooks/shell-rules-notice.ts +37 -0
- package/scripts/hooks/stop-actions.ts +2 -21
- package/scripts/hooks/stop-guard.ts +13 -9
- package/scripts/init/hook-command-rewrite.ts +19 -5
- package/scripts/init/hook-launch.ts +15 -17
- package/scripts/init/init-actions.ts +0 -6
- package/scripts/init/init-ai-copy.ts +10 -36
- package/scripts/init/init-bootstrap.ts +9 -8
- package/scripts/init/init-dry-run-report.ts +1 -1
- package/scripts/init/init-dry-run.ts +1 -1
- package/scripts/init/init-file-action.ts +7 -9
- package/scripts/init/init-logic-json-merge.ts +2 -2
- package/scripts/init/init-logic-migrate.ts +9 -82
- package/scripts/init/init-logic.ts +3 -2
- package/scripts/init/init-main.ts +12 -0
- package/scripts/init/init.ts +5 -12
- package/scripts/init/kit-development-versions.ts +3 -7
- package/scripts/init/kit-written-paths.ts +2 -2
- package/scripts/init/project-profile.ts +5 -4
- package/scripts/init/tsconfig-preset-migration.ts +2 -1
- package/scripts/init/vscode-tasks.ts +1 -1
- package/scripts/issue/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 +1 -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 +0 -9
- package/scripts/issue/issue-cite-main.ts +12 -0
- package/scripts/issue/issue-classification.ts +12 -7
- 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 +2 -10
- 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 +0 -11
- 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/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 +15 -43
- package/scripts/josh/file-map-stamp.ts +49 -16
- package/scripts/josh/hook-decision.ts +32 -20
- package/scripts/josh/josh-command-map.ts +4 -1
- package/scripts/josh/josh-command-types.ts +12 -6
- package/scripts/josh/josh-commands-agent-hooks.ts +83 -0
- package/scripts/josh/josh-commands-ai.ts +157 -158
- 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 +25 -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 +103 -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 +144 -6
- package/scripts/josh/josh-logic.ts +6 -13
- package/scripts/josh/package-directory.ts +2 -4
- 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 +14 -23
- package/scripts/lane/lane-check-stats.ts +62 -21
- package/scripts/lane/lane-child-invocation.ts +8 -0
- 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 +24 -3
- package/scripts/lane/lane-gap-stats.ts +156 -0
- package/scripts/lane/lane-handoff.ts +69 -1
- package/scripts/lane/lane-held-stats.ts +129 -0
- package/scripts/lane/lane-install.ts +4 -11
- 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 +92 -123
- package/scripts/lane/lane-limit-cli.ts +12 -1
- package/scripts/lane/lane-measure-cli.ts +57 -11
- 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-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 +24 -3
- package/scripts/lane/lane-residents.ts +162 -0
- package/scripts/lane/lane-restart.ts +22 -2
- 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 +19 -5
- package/scripts/lane/lane-session-broker.ts +102 -21
- 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 +5 -4
- package/scripts/lane/lane-withdraw.ts +50 -49
- 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 +11 -2
- 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 +62 -30
- package/scripts/lint/lint-related-scope.ts +30 -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 +2 -6
- 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 +2 -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.ts +1 -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 +81 -15
- 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 +8 -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 +80 -2
- 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 +7 -0
- package/scripts/rules/git-argv.ts +72 -14
- package/scripts/rules/git-force.ts +12 -2
- package/scripts/rules/guard-remedy.ts +4 -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 +9 -1
- 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/oracle-consulted.ts +10 -0
- package/scripts/rules/oracle-firing.ts +1 -0
- package/scripts/rules/permission-guards.ts +3 -0
- package/scripts/rules/piped-verification.ts +1 -1
- 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 +9 -28
- package/scripts/rules/rule-value-cache.ts +4 -9
- package/scripts/rules/rule-value-cli.ts +51 -32
- package/scripts/rules/rule-value.ts +1 -1
- package/scripts/rules/shell-segments.ts +35 -0
- package/scripts/rules/stop-rule-rows.ts +64 -0
- package/scripts/rules/stop-rules.ts +3 -4
- 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 -32
- 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 +118 -38
- package/scripts/run/board/run-board-header.ts +82 -20
- package/scripts/run/board/run-board-keys.ts +58 -0
- package/scripts/run/board/run-board-kind.ts +20 -6
- package/scripts/run/board/run-board-labels.ts +116 -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 +239 -60
- 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 +151 -27
- package/scripts/run/board/run-board-reason.ts +235 -51
- 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 -48
- package/scripts/run/board/run-board-render-notes.ts +156 -29
- package/scripts/run/board/run-board-render-processes.ts +196 -0
- package/scripts/run/board/run-board-render-section.ts +119 -0
- package/scripts/run/board/run-board-render-slot.ts +3 -36
- package/scripts/run/board/run-board-render-tail.ts +115 -48
- package/scripts/run/board/run-board-render-time.ts +56 -0
- package/scripts/run/board/run-board-render-title.ts +117 -24
- package/scripts/run/board/run-board-render-waits.ts +104 -20
- package/scripts/run/board/run-board-render.ts +207 -265
- package/scripts/run/board/run-board-roots.ts +54 -0
- package/scripts/run/board/run-board-row-yield.ts +9 -4
- package/scripts/run/board/run-board-setup.ts +1 -12
- package/scripts/run/board/run-board-snapshot.ts +111 -0
- package/scripts/run/board/run-board-spin.ts +2 -2
- package/scripts/run/board/run-board-state.ts +22 -33
- package/scripts/run/board/run-board-status.ts +147 -71
- package/scripts/run/board/run-board-thanks-read.ts +2 -2
- package/scripts/run/board/run-board-tick.ts +122 -107
- 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-handoff.ts +2 -2
- 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 +6 -10
- package/scripts/run/event/run-event-scope.ts +2 -2
- package/scripts/run/event/run-event-stream-emit.ts +82 -22
- package/scripts/run/event/run-event-stream.ts +34 -8
- package/scripts/run/hold/run-hold-adopt.ts +65 -0
- package/scripts/run/hold/run-hold-cli.ts +93 -22
- package/scripts/run/hold/run-hold-main.ts +12 -0
- package/scripts/run/hold/run-hold-member.ts +37 -0
- package/scripts/run/hold/run-stop-notify.ts +183 -0
- package/scripts/run/merge/run-merge-auth.ts +31 -0
- package/scripts/run/merge/run-merge-cli.ts +62 -48
- 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 +33 -9
- package/scripts/run/merge/run-merge-steps.ts +120 -85
- package/scripts/run/merge/run-merge.ts +38 -37
- 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 +60 -29
- package/scripts/run/run-next.ts +1 -1
- package/scripts/run/run-parent-cut-hook.ts +2 -2
- 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.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 +63 -140
- package/scripts/run/ship/run-ship-detach.ts +19 -8
- package/scripts/run/ship/run-ship-infra-retry.ts +59 -0
- package/scripts/run/ship/run-ship-next.ts +18 -2
- package/scripts/run/ship/run-ship-overlap.ts +42 -5
- 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 +81 -24
- package/scripts/run/ship/run-ship-preflight.ts +137 -32
- 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 +107 -23
- package/scripts/run/ship/run-ship-review-steps.ts +105 -151
- 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-text.ts +11 -6
- package/scripts/run/ship/run-ship-sync.ts +43 -6
- 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 +25 -1
- 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 +42 -24
- 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 +61 -149
- 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 +97 -10
- 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 +4 -1
- 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-4KKD2UTK.js +0 -66
- package/dist/hooks/chunk-6TS2JD6D.js +0 -237
- package/dist/hooks/chunk-7DSBJVFH.js +0 -50
- package/dist/hooks/chunk-A65Y4YOR.js +0 -79
- package/dist/hooks/chunk-CDY4NFQG.js +0 -15
- package/dist/hooks/chunk-EFXE6C37.js +0 -81
- package/dist/hooks/chunk-GP4IEC4O.js +0 -20
- package/dist/hooks/chunk-JP45SOCJ.js +0 -56
- package/dist/hooks/chunk-LAOV7NLM.js +0 -45
- package/dist/hooks/chunk-M4HGZV7U.js +0 -83
- package/dist/hooks/chunk-PF2NZL2A.js +0 -131
- package/dist/hooks/chunk-PTICX4OL.js +0 -358
- package/dist/hooks/chunk-RT27QRJW.js +0 -6247
- package/dist/hooks/chunk-SYOTDYCI.js +0 -3533
- package/dist/hooks/chunk-UPUZF3AN.js +0 -279
- package/dist/hooks/chunk-WK6SMBIC.js +0 -3180
- package/dist/hooks/duplicate-read-guard.js +0 -30
- package/dist/hooks/investigation-guard.js +0 -29
- package/scripts/backlog/backlog-stalled-cli.ts +0 -30
- package/scripts/cost-runtime/cost-format.ts +0 -29
- package/scripts/init/basic-path-migration.ts +0 -24
- package/scripts/issue/issue-backlinks-cli.ts +0 -93
- package/scripts/josh/josh-commands-guard.ts +0 -38
- package/scripts/josh/josh-usage-automation.ts +0 -121
- package/scripts/josh/josh-usage-backlog.ts +0 -180
- package/scripts/josh/josh-usage-developer.ts +0 -230
- package/scripts/josh/josh-usage-hooks.ts +0 -38
- package/scripts/josh/josh-usage-issue.ts +0 -205
- package/scripts/josh/josh-usage-review.ts +0 -101
- package/scripts/josh/josh-usage-run.ts +0 -252
- package/scripts/josh/josh-usage-session.ts +0 -238
- package/scripts/josh/josh-usage-workflow.ts +0 -212
- package/scripts/lint/cross-file-recheck.ts +0 -155
- package/scripts/registry-migration/migrate-logic.ts +0 -237
- package/scripts/registry-migration/migrate.ts +0 -292
- package/scripts/registry-migration/user-npmrc.ts +0 -15
- package/scripts/rules/rule-guard.ts +0 -23
- package/scripts/rules/rule-registry-rows.ts +0 -292
- package/scripts/rules/rule-registry.ts +0 -112
- package/scripts/run/run-stranded-cli.ts +0 -27
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { process_identity } from '#scripts/josh/process-identity'
|
|
2
2
|
import { lane_ledger, type GateCheckRecord } from '#scripts/lane/lane-ledger'
|
|
3
|
+
import { related_scope } from '#scripts/test/test-related-scope'
|
|
3
4
|
import { core_admission } from './core-admission'
|
|
4
5
|
import { core_budget } from './core-budget'
|
|
5
6
|
import { gate_plan } from './gate-plan'
|
|
@@ -13,8 +14,8 @@ import { machine_capacity } from './machine-capacity'
|
|
|
13
14
|
//
|
|
14
15
|
// **The machine is read where none of the gate's own checks runs — before the first starts and after
|
|
15
16
|
// the last ends.** The load average cannot tell the two apart: a solo gate started at 4 on the 11-core
|
|
16
|
-
// machine ended at 21, its own load. The reading is the core budget's own
|
|
17
|
-
//
|
|
17
|
+
// machine ended at 21, its own load. The reading is the core budget's own; "quiet" is no whole core
|
|
18
|
+
// busy beyond the background a developer machine always carries.
|
|
18
19
|
//
|
|
19
20
|
// **Between the ends, the load is read off the core budget's ledger, not the CPU**.
|
|
20
21
|
// Two readings missed every lane whose lint, tests or `ship` ran only while
|
|
@@ -23,7 +24,11 @@ import { machine_capacity } from './machine-capacity'
|
|
|
23
24
|
// is what tells the two apart: another `josh` run's admitted claim is another process's place, and its
|
|
24
25
|
// weight is the cores it holds. A claim still waiting holds none.
|
|
25
26
|
|
|
26
|
-
|
|
27
|
+
// **The background a quiet machine still carries.** On 2026-10-07 the 11-core machine idled at about
|
|
28
|
+
// 1.5 cores outside `josh` — Claude sessions 0.55, the window server 0.47, a browser 0.5. Admission
|
|
29
|
+
// counts it (`machine_capacity.external_cores`, joshuafolkken/kit#4238), but a gate timed beside it is
|
|
30
|
+
// still a solo gate for `josh metrics`, so it is no external load here.
|
|
31
|
+
const BACKGROUND_CORES = 2
|
|
27
32
|
// Often enough to catch another lane's shortest related lint, seldom enough that reading the markers —
|
|
28
33
|
// a process probe each — costs the gate nothing it could measure.
|
|
29
34
|
const SAMPLE_INTERVAL_MS = 3000
|
|
@@ -48,7 +53,7 @@ async function read_external_cores(): Promise<number | undefined> {
|
|
|
48
53
|
|
|
49
54
|
if (busy_cores === undefined) return undefined
|
|
50
55
|
|
|
51
|
-
return machine_capacity.external_cores(busy_cores,
|
|
56
|
+
return machine_capacity.external_cores(busy_cores, BACKGROUND_CORES)
|
|
52
57
|
}
|
|
53
58
|
|
|
54
59
|
// The cores other processes' admitted claims hold now. This gate's own claims are written by this
|
|
@@ -88,15 +93,36 @@ async function start(ledger_path: string | undefined): Promise<GateLedgerStart>
|
|
|
88
93
|
return { ledger_path, readings, sampler: start_sampler(readings) }
|
|
89
94
|
}
|
|
90
95
|
|
|
96
|
+
// The unit leg's own facts: the whole-suite fallback it took, or the since-green no-op that ran no
|
|
97
|
+
// test (joshuafolkken/kit#4457) — the two `josh lane:stats` must not time as an ordinary run.
|
|
98
|
+
function unit_facts(result: GateStepResult): Pick<GateCheckRecord, 'fallback' | 'is_unmoved'> {
|
|
99
|
+
if (result.label !== gate_plan.UNIT_LABEL) return {}
|
|
100
|
+
|
|
101
|
+
return {
|
|
102
|
+
fallback: related_scope.fallback_kind(result.output),
|
|
103
|
+
...(related_scope.is_unmoved(result.output) && { is_unmoved: true }),
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
91
107
|
function check_records(results: ReadonlyArray<GateStepResult>): Array<GateCheckRecord> {
|
|
92
108
|
return results.map((result) => ({
|
|
93
109
|
label: result.label,
|
|
94
110
|
elapsed_ms: result.elapsed_ms,
|
|
95
111
|
is_passed: !gate_report.is_gate_step_failed(result),
|
|
96
112
|
is_reused: result.reused_at !== undefined,
|
|
113
|
+
...(result.cpu_ms !== undefined && { cpu_ms: Math.round(result.cpu_ms) }),
|
|
114
|
+
...unit_facts(result),
|
|
115
|
+
claim: result.claim,
|
|
97
116
|
}))
|
|
98
117
|
}
|
|
99
118
|
|
|
119
|
+
// A gate that reused a green record started no check: its line is counted as reused, never timed.
|
|
120
|
+
async function record_reused(ledger_path: string | undefined, elapsed_ms: number): Promise<void> {
|
|
121
|
+
if (ledger_path === undefined) return
|
|
122
|
+
|
|
123
|
+
await lane_ledger.record_gate(ledger_path, { elapsed_ms, is_passed: true, is_reused: true })
|
|
124
|
+
}
|
|
125
|
+
|
|
100
126
|
// The caller measures the elapsed time before this, so the end's reading is never part of it.
|
|
101
127
|
async function record(
|
|
102
128
|
begun: GateLedgerStart,
|
|
@@ -119,8 +145,10 @@ async function record(
|
|
|
119
145
|
}
|
|
120
146
|
|
|
121
147
|
const gate_ledger = {
|
|
148
|
+
BACKGROUND_CORES,
|
|
122
149
|
SAMPLE_INTERVAL_MS,
|
|
123
150
|
record,
|
|
151
|
+
record_reused,
|
|
124
152
|
start,
|
|
125
153
|
}
|
|
126
154
|
|
|
@@ -49,6 +49,7 @@ interface GateCheck {
|
|
|
49
49
|
const LINT_LABEL = 'lint'
|
|
50
50
|
const TYPE_CHECK_LABEL = 'check'
|
|
51
51
|
const UNIT_LABEL = 'test:unit'
|
|
52
|
+
const UNIT_TARGET = 'test:related'
|
|
52
53
|
const BEHAVIOR_LABEL = 'behavior'
|
|
53
54
|
const METRICS_LABEL = 'metrics'
|
|
54
55
|
const EXPORTS_LABEL = 'exports'
|
|
@@ -78,15 +79,18 @@ const WARNING_CHECKER_LABELS: ReadonlyArray<string> = [LINT_LABEL, TYPE_CHECK_LA
|
|
|
78
79
|
//
|
|
79
80
|
// **The two zero weights are measured, and they stay zero.** These are warm runs on the 11-core
|
|
80
81
|
// machine. `behavior` took 0.6s of wall for 0.7s of CPU, which
|
|
81
|
-
// is node starting up. `exports:unused` took 5.5s of wall for 9.0s of CPU, about 1.6 cores.
|
|
82
|
-
// that would be
|
|
83
|
-
// It would
|
|
84
|
-
// full length of the unit suite, to cover a burst that ends before lint does. Nothing has measured
|
|
82
|
+
// is node starting up. `exports:unused` took 5.5s of wall for 9.0s of CPU, about 1.6 cores. Rounded
|
|
83
|
+
// up, that would be two cores, but a reservation lasts the whole gate's plan, not the check's five
|
|
84
|
+
// seconds. It would raise `RESERVED_CORES` from 6 to 8 and cut the solo unit cap from 5 workers to 3
|
|
85
|
+
// for the full length of the unit suite, to cover a burst that ends before lint does. Nothing has measured
|
|
85
86
|
// that trade, so the measured shape stays.
|
|
86
87
|
const STATIC_CHECKS: ReadonlyArray<GateCheck> = [
|
|
88
|
+
// **The lint reads the branch's changed files, not the whole tree** (joshuafolkken/kit#4085), and
|
|
89
|
+
// falls back to the whole tree in CI and on a changed configuration (`lint-gate-scope.ts`).
|
|
87
90
|
{
|
|
88
91
|
label: LINT_LABEL,
|
|
89
92
|
target: 'lint',
|
|
93
|
+
args: ['--changed'],
|
|
90
94
|
reserved_cores: core_budget.CORE_WEIGHTS.lint,
|
|
91
95
|
memory_mb: core_budget.MEMORY_MB.lint,
|
|
92
96
|
},
|
|
@@ -120,13 +124,23 @@ const STATIC_CHECKS: ReadonlyArray<GateCheck> = [
|
|
|
120
124
|
memory_mb: core_budget.MEMORY_MB.eslint_scan,
|
|
121
125
|
is_kit_only: true,
|
|
122
126
|
},
|
|
127
|
+
// The lockfile policy check is network-bound and usually instant: it verifies only when the
|
|
128
|
+
// lockfile or `pnpm-workspace.yaml` moved from the merge-base (joshuafolkken/kit#4090), so it
|
|
129
|
+
// reserves no core. Kit's own until a consumer's private-registry entries are known to verify.
|
|
130
|
+
{ label: 'lockfile', target: 'lockfile:policy', reserved_cores: 0, is_kit_only: true },
|
|
123
131
|
]
|
|
124
132
|
|
|
125
133
|
// The checks, in the order their output is printed — the static set, then the unit suite last (the
|
|
126
134
|
// one check that fans out across every core, and the one the `--no-unit` split drops).
|
|
135
|
+
//
|
|
136
|
+
// **The unit check runs the tests the change can reach, not the whole suite**
|
|
137
|
+
// (joshuafolkken/kit#4065): `josh test:related` narrows through the module graph and the test-read
|
|
138
|
+
// map, and runs the whole suite — refreshing that map — whenever it cannot tell. The label stays
|
|
139
|
+
// `test:unit`, the name every ledger, reservation and record knows the check by. CI runs the whole
|
|
140
|
+
// sharded suite regardless.
|
|
127
141
|
const GATE_CHECKS: ReadonlyArray<GateCheck> = [
|
|
128
142
|
...STATIC_CHECKS,
|
|
129
|
-
{ label: UNIT_LABEL, target:
|
|
143
|
+
{ label: UNIT_LABEL, target: UNIT_TARGET, reserved_cores: 0 },
|
|
130
144
|
]
|
|
131
145
|
|
|
132
146
|
// **Selecting is not skipping, and the difference is where the unit suite runs rather than whether
|
|
@@ -152,7 +166,7 @@ function has_unit_check(checks: ReadonlyArray<GateCheck>): boolean {
|
|
|
152
166
|
return checks.some((check) => check.label === UNIT_LABEL)
|
|
153
167
|
}
|
|
154
168
|
|
|
155
|
-
// What the non-elastic checks hold between them: 2 +
|
|
169
|
+
// What the non-elastic checks hold between them: 2 + 2 + 2. Reduced over `STATIC_CHECKS`
|
|
156
170
|
// rather than over every check, because that is the set the sentence above names: `resolve_unit_worker_cap`
|
|
157
171
|
// spends this as the cores the unit suite must leave to its siblings, so summing the unit check into
|
|
158
172
|
// it would have the suite subtract its own reservation from its own budget the day that reservation
|
|
@@ -219,7 +233,7 @@ function shared_cores(available_cores: number, concurrent_runs: number): number
|
|
|
219
233
|
|
|
220
234
|
// Admit checks in declaration order while the running set's reserved cores still fit **this run's
|
|
221
235
|
// share** of the machine. On a machine running one gate that share is the machine, so this bites
|
|
222
|
-
// only below
|
|
236
|
+
// only below six cores — the three reserving checks want six between them — and there it is the
|
|
223
237
|
// difference between two checks sharing a core and four fighting over it.
|
|
224
238
|
//
|
|
225
239
|
// **Under concurrency it is the only lever there is, and that is a measurement rather than a
|
|
@@ -309,8 +323,9 @@ function solo_unit_weight(available_cores: number): number {
|
|
|
309
323
|
// once**: no second set of weights is introduced, so a change to the measured reservation moves the
|
|
310
324
|
// admission with it.
|
|
311
325
|
//
|
|
312
|
-
// **A solo gate's four weights sum to exactly the core count** — `reserved(2 +
|
|
313
|
-
// unit_cap(cores -
|
|
326
|
+
// **A solo gate's four weights sum to exactly the core count** — `reserved(2 + 2 + 2) +
|
|
327
|
+
// unit_cap(cores - 6)` is `cores` — which is what lets every check of a lone gate on a machine with room
|
|
328
|
+
// (its busy cores within what the ledger holds, `core-budget.ts`) be admitted at once,
|
|
314
329
|
// its concurrency unchanged. A machine below the measured one leaves the unit suite uncapped and reads
|
|
315
330
|
// its weight from the same identity, `cores - RESERVED_CORES` clamped at zero, so the sum is the core
|
|
316
331
|
// count there too.
|
|
@@ -339,22 +354,33 @@ function check_memory(check: GateCheck, plan: GatePlan, available_cores: number)
|
|
|
339
354
|
// and hold every later claim behind it. One weight for the suite however it is started. **Floored at one
|
|
340
355
|
// worker**: on a machine the static checks fill, a four-core CI runner among them, the gate's solo
|
|
341
356
|
// weight is zero because its siblings hold every core — a direct run has no siblings, and vitest still
|
|
342
|
-
// occupies a core.
|
|
357
|
+
// occupies a core. **Plus vitest's own process** (joshuafolkken/kit#4362): the workers are the share,
|
|
358
|
+
// and the claim holds the process that drives them on top (`unit_worker_share.cap_to_claim` takes it
|
|
359
|
+
// back off).
|
|
343
360
|
function direct_unit_weight(
|
|
344
361
|
available_cores: number = availableParallelism(),
|
|
345
362
|
live_runs: number = unit_worker_share.live_run_count(),
|
|
346
363
|
): number {
|
|
347
|
-
const
|
|
364
|
+
const workers =
|
|
348
365
|
unit_worker_share.current_share(available_cores, live_runs) ?? solo_unit_weight(available_cores)
|
|
349
366
|
|
|
350
|
-
return Math.max(unit_worker_share.MIN_WORKERS,
|
|
367
|
+
return Math.max(unit_worker_share.MIN_WORKERS, workers) + unit_worker_share.MAIN_PROCESS_CORES
|
|
351
368
|
}
|
|
352
369
|
|
|
353
|
-
// What a unit run started directly holds: one worker's peak for each
|
|
370
|
+
// What a unit run started directly holds: one worker's peak for each core `direct_unit_weight` gives
|
|
371
|
+
// it, vitest's own process counted as one more.
|
|
354
372
|
function direct_unit_memory(): number {
|
|
355
373
|
return unit_memory(direct_unit_weight())
|
|
356
374
|
}
|
|
357
375
|
|
|
376
|
+
// The claim every unit run started directly declares — `josh test:unit`, `josh test:related` and the
|
|
377
|
+
// pre-push hook — declared once so the three cannot drift apart.
|
|
378
|
+
const DIRECT_UNIT_CLAIM = {
|
|
379
|
+
core_weight: direct_unit_weight,
|
|
380
|
+
memory_mb: direct_unit_memory,
|
|
381
|
+
is_unit_claim: true,
|
|
382
|
+
} as const
|
|
383
|
+
|
|
358
384
|
function unit_cap_for(
|
|
359
385
|
checks: ReadonlyArray<GateCheck>,
|
|
360
386
|
available_cores: number,
|
|
@@ -398,25 +424,6 @@ function resolve_gate_plan(
|
|
|
398
424
|
}
|
|
399
425
|
}
|
|
400
426
|
|
|
401
|
-
// The unit cap bounded by the cores free of load from outside the core budget's ledger
|
|
402
|
-
// (`free-cores.ts`), so the run count's share is never wider than what is free. A plan with no unit
|
|
403
|
-
// step carries no cap, and an unread machine leaves the cap as resolved (`unit_worker_share.cap_to_free`).
|
|
404
|
-
function bound_by_free(
|
|
405
|
-
plan: GatePlan,
|
|
406
|
-
available_cores: number,
|
|
407
|
-
free_cores: number | undefined,
|
|
408
|
-
): GatePlan {
|
|
409
|
-
if (!has_unit_check(plan.checks)) return plan
|
|
410
|
-
|
|
411
|
-
const unit_worker_cap = unit_worker_share.cap_to_free(
|
|
412
|
-
plan.unit_worker_cap,
|
|
413
|
-
free_cores,
|
|
414
|
-
available_cores,
|
|
415
|
-
)
|
|
416
|
-
|
|
417
|
-
return { ...plan, unit_worker_cap }
|
|
418
|
-
}
|
|
419
|
-
|
|
420
427
|
// Printed once per run, so a gate that was slow on someone else's machine can be read without
|
|
421
428
|
// re-deriving the plan from their core count.
|
|
422
429
|
//
|
|
@@ -460,6 +467,7 @@ function format_gate_plan(
|
|
|
460
467
|
}
|
|
461
468
|
|
|
462
469
|
const gate_plan = {
|
|
470
|
+
DIRECT_UNIT_CLAIM,
|
|
463
471
|
EXPORTS_LABEL,
|
|
464
472
|
GATE_CHECKS,
|
|
465
473
|
LINT_LABEL,
|
|
@@ -469,11 +477,10 @@ const gate_plan = {
|
|
|
469
477
|
STATIC_CHECKS,
|
|
470
478
|
TYPE_CHECK_LABEL,
|
|
471
479
|
UNIT_LABEL,
|
|
480
|
+
UNIT_TARGET,
|
|
472
481
|
WARNING_CHECKER_LABELS,
|
|
473
|
-
bound_by_free,
|
|
474
482
|
check_memory,
|
|
475
483
|
check_weight,
|
|
476
|
-
direct_unit_memory,
|
|
477
484
|
direct_unit_weight,
|
|
478
485
|
format_gate_plan,
|
|
479
486
|
format_machine,
|
|
@@ -2,6 +2,7 @@ import { GATE_COMMAND } from '#scripts/josh/josh-command-types'
|
|
|
2
2
|
import { josh_verdict } from '#scripts/josh/josh-verdict'
|
|
3
3
|
import { buffered_process, type BufferedProcessResult } from '#scripts/lib/buffered-process'
|
|
4
4
|
import { status_icons } from '#scripts/lib/status-icons'
|
|
5
|
+
import { MS_PER_SECOND } from '#scripts/lib/timeouts'
|
|
5
6
|
import { NOT_USED_MARKER, NOTHING_TO_CHECK_MARKER } from '#scripts/test/skip-marker'
|
|
6
7
|
import { test_unit_guard } from '#scripts/test/test-unit-guard'
|
|
7
8
|
import { gate_log } from './gate-log'
|
|
@@ -31,6 +32,18 @@ interface GateStepResult extends BufferedProcessResult {
|
|
|
31
32
|
// Set when the check was not started because its inputs match the record taken at this time
|
|
32
33
|
// (`check-reuse.ts`).
|
|
33
34
|
reused_at?: string | undefined
|
|
35
|
+
// The CPU milliseconds the check's process tree spent, where the gate could read it (`check-cpu.ts`).
|
|
36
|
+
cpu_ms?: number | undefined
|
|
37
|
+
// The check's place in the core budget, absent on a check that claimed none (`gate-run-steps.ts`).
|
|
38
|
+
claim?: CheckClaim | undefined
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// The width a check asked the core budget for, the width it ran at and how long it waited for it, so
|
|
42
|
+
// whether a unit claim's wait for room paid off is read per run (joshuafolkken/kit#4451).
|
|
43
|
+
interface CheckClaim {
|
|
44
|
+
requested: number
|
|
45
|
+
granted: number
|
|
46
|
+
waited_ms: number
|
|
34
47
|
}
|
|
35
48
|
|
|
36
49
|
function is_gate_step_failed(result: GateStepResult): boolean {
|
|
@@ -147,7 +160,6 @@ function should_print_body(result: GateStepResult, is_verbose: boolean): boolean
|
|
|
147
160
|
// Seconds to one decimal, which is the resolution the answer is read at: the question a gate's
|
|
148
161
|
// timing answers is "which of the four is the long pole", and no check is ever separated from
|
|
149
162
|
// another by less than a tenth of a second.
|
|
150
|
-
const MS_PER_SECOND = 1000
|
|
151
163
|
const SECONDS_DECIMALS = 1
|
|
152
164
|
|
|
153
165
|
function format_seconds(elapsed_ms: number): string {
|
|
@@ -285,5 +297,5 @@ const gate_report = {
|
|
|
285
297
|
report_gate_steps,
|
|
286
298
|
}
|
|
287
299
|
|
|
288
|
-
export type { GateReport, GateStep, GateStepResult }
|
|
300
|
+
export type { CheckClaim, GateReport, GateStep, GateStepResult }
|
|
289
301
|
export { gate_report }
|
|
@@ -2,17 +2,24 @@ import { availableParallelism } from 'node:os'
|
|
|
2
2
|
import { bounded_pool } from '#scripts/lib/bounded-pool'
|
|
3
3
|
import { buffered_process } from '#scripts/lib/buffered-process'
|
|
4
4
|
import { unit_worker_share } from '#scripts/test/unit-worker-share'
|
|
5
|
-
import {
|
|
5
|
+
import { check_cpu, type CheckCpu } from './check-cpu'
|
|
6
|
+
import { core_budget, type Admission } from './core-budget'
|
|
7
|
+
import { free_cores } from './free-cores'
|
|
6
8
|
import { gate_plan, type GatePlan } from './gate-plan'
|
|
7
|
-
import type { GateStep, GateStepResult } from './gate-report'
|
|
8
|
-
import { build_gate_step } from './gate-steps'
|
|
9
|
+
import type { CheckClaim, GateStep, GateStepResult } from './gate-report'
|
|
10
|
+
import { build_gate_step, with_granted_workers } from './gate-steps'
|
|
9
11
|
import { project_checks } from './project-checks'
|
|
10
12
|
|
|
11
13
|
// Running the gate's checks: each one under its place in the machine-wide budget, a reused one
|
|
12
14
|
// (`check-reuse.ts`) without starting it. `verification-gate.ts` decides what runs and records the
|
|
13
15
|
// outcome; this module only runs it.
|
|
14
16
|
|
|
15
|
-
|
|
17
|
+
// `cpu` is the gate's shared reader, so concurrent checks each take their own growth; a lone call
|
|
18
|
+
// reads its child alone from a baseline of its own.
|
|
19
|
+
async function run_gate_step(
|
|
20
|
+
step: GateStep,
|
|
21
|
+
cpu: CheckCpu = check_cpu.check_cpu_reader(),
|
|
22
|
+
): Promise<GateStepResult> {
|
|
16
23
|
if (step.skip_reason !== undefined) {
|
|
17
24
|
return {
|
|
18
25
|
label: step.label,
|
|
@@ -28,7 +35,7 @@ async function run_gate_step(step: GateStep): Promise<GateStepResult> {
|
|
|
28
35
|
step.cwd === undefined ? {} : { cwd: step.cwd },
|
|
29
36
|
)
|
|
30
37
|
|
|
31
|
-
return { label: step.label, command: step.command_args.join(' '), ...result }
|
|
38
|
+
return { label: step.label, command: step.command_args.join(' '), ...result, cpu_ms: cpu() }
|
|
32
39
|
}
|
|
33
40
|
|
|
34
41
|
// This gate's share of the machine, resolved once at the gate's entry and carried down as one value.
|
|
@@ -55,6 +62,8 @@ interface ReservedStep {
|
|
|
55
62
|
step: GateStep
|
|
56
63
|
weight: number
|
|
57
64
|
memory_mb: number
|
|
65
|
+
// The plan's `--maxWorkers` for the unit suite, the width the free memory bounds once it is admitted.
|
|
66
|
+
worker_cap: number | undefined
|
|
58
67
|
// When the check's own green record was taken, for a check `check-reuse.ts` found reusable.
|
|
59
68
|
reused_at: string | undefined
|
|
60
69
|
}
|
|
@@ -72,6 +81,7 @@ async function build_reserved_steps(
|
|
|
72
81
|
step: await build_gate_step(check, process.cwd(), plan),
|
|
73
82
|
weight: gate_plan.check_weight(check, plan, available_cores),
|
|
74
83
|
memory_mb: gate_plan.check_memory(check, plan, available_cores),
|
|
84
|
+
worker_cap: plan.unit_worker_cap,
|
|
75
85
|
reused_at: reused.get(check.label),
|
|
76
86
|
})),
|
|
77
87
|
)
|
|
@@ -90,6 +100,34 @@ function reused_result(step: GateStep, reused_at: string): GateStepResult {
|
|
|
90
100
|
}
|
|
91
101
|
}
|
|
92
102
|
|
|
103
|
+
// What the check asked the budget for and what it ran at, for its ledger row (`gate-ledger.ts`).
|
|
104
|
+
function claim_of(requested: number, admission: Admission): CheckClaim {
|
|
105
|
+
return {
|
|
106
|
+
requested,
|
|
107
|
+
granted: admission.granted ?? requested,
|
|
108
|
+
waited_ms: admission.waited_ms ?? 0,
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
// **The unit step's width is bounded by the free memory too** (joshuafolkken/kit#4528). The plan's cap
|
|
113
|
+
// and the granted width are sized from the cores alone, and the `--maxWorkers` they become skips the
|
|
114
|
+
// guard's own reading (`test-unit-guard.ts`), so the memory is read here, once the claim is admitted
|
|
115
|
+
// and the suite is about to start. The free cores are not applied: the admission has already narrowed
|
|
116
|
+
// the claim to them (joshuafolkken/kit#4167).
|
|
117
|
+
async function admitted_step(
|
|
118
|
+
reserved: ReservedStep,
|
|
119
|
+
admission: Admission,
|
|
120
|
+
available_cores: number,
|
|
121
|
+
): Promise<GateStep> {
|
|
122
|
+
if (reserved.step.label !== gate_plan.UNIT_LABEL) return reserved.step
|
|
123
|
+
|
|
124
|
+
const { memory_workers } = await free_cores.read({ available_cores })
|
|
125
|
+
const asked = admission.granted ?? reserved.worker_cap
|
|
126
|
+
const workers = unit_worker_share.cap_to_free(asked, memory_workers, available_cores)
|
|
127
|
+
|
|
128
|
+
return with_granted_workers(reserved.step, workers)
|
|
129
|
+
}
|
|
130
|
+
|
|
93
131
|
// **A nested gate takes no reservation, and the budget is what makes that necessary rather than
|
|
94
132
|
// merely tidy**. The unit step spawns the suite, which runs this repository's
|
|
95
133
|
// own gate tests; each of those is a gate inside the outer gate's unit reservation, and a place it
|
|
@@ -98,20 +136,26 @@ function reused_result(step: GateStep, reused_at: string): GateStepResult {
|
|
|
98
136
|
async function run_reserved_step(
|
|
99
137
|
reserved: ReservedStep,
|
|
100
138
|
budget: BudgetContext,
|
|
139
|
+
cpu: CheckCpu,
|
|
101
140
|
): Promise<GateStepResult> {
|
|
102
141
|
if (reserved.reused_at !== undefined) return reused_result(reserved.step, reserved.reused_at)
|
|
103
|
-
if (!budget.is_reserved) return await run_gate_step(reserved.step)
|
|
142
|
+
if (!budget.is_reserved) return await run_gate_step(reserved.step, cpu)
|
|
104
143
|
|
|
105
144
|
return await core_budget.with_core_reservation(
|
|
106
145
|
reserved.weight,
|
|
107
146
|
async (admission) => ({
|
|
108
|
-
...(await run_gate_step(
|
|
147
|
+
...(await run_gate_step(
|
|
148
|
+
await admitted_step(reserved, admission, budget.available_cores),
|
|
149
|
+
cpu,
|
|
150
|
+
)),
|
|
109
151
|
budget_note: core_budget.describe_overflow(admission),
|
|
152
|
+
claim: claim_of(reserved.weight, admission),
|
|
110
153
|
}),
|
|
111
154
|
{
|
|
112
155
|
budget: budget.available_cores,
|
|
113
156
|
memory_mb: reserved.memory_mb,
|
|
114
157
|
command: `gate ${reserved.step.label}`,
|
|
158
|
+
is_unit: reserved.step.label === gate_plan.UNIT_LABEL,
|
|
115
159
|
},
|
|
116
160
|
)
|
|
117
161
|
}
|
|
@@ -129,6 +173,7 @@ async function run_gate_steps(
|
|
|
129
173
|
reused: ReusedChecks = new Map(),
|
|
130
174
|
): Promise<ReadonlyArray<GateStepResult>> {
|
|
131
175
|
const reserved = await build_reserved_steps(plan, budget.available_cores, reused)
|
|
176
|
+
const cpu = check_cpu.check_cpu_reader()
|
|
132
177
|
|
|
133
178
|
// **The checks run under the held mark, so a check's own dispatch claims nothing**.
|
|
134
179
|
// Each check is a `pnpm josh <target>` child, and a target that declares
|
|
@@ -139,7 +184,7 @@ async function run_gate_steps(
|
|
|
139
184
|
await bounded_pool.bounded_map(
|
|
140
185
|
reserved,
|
|
141
186
|
plan.concurrency,
|
|
142
|
-
async (entry) => await run_reserved_step(entry, budget),
|
|
187
|
+
async (entry) => await run_reserved_step(entry, budget, cpu),
|
|
143
188
|
),
|
|
144
189
|
)
|
|
145
190
|
}
|
|
@@ -64,10 +64,19 @@ const FORCE_FLAG = '--force'
|
|
|
64
64
|
// rewritten by the hook's own install each cost minutes before anyone could tell them apart.
|
|
65
65
|
type GateReuse = { stamp: FileMapStamp } | { miss: string }
|
|
66
66
|
|
|
67
|
+
// The fingerprint of every declared check's tools and environment (`verification-inputs.ts`).
|
|
68
|
+
const INPUTS_MOVED = 'a checked tool or environment variable changed since the green gate'
|
|
69
|
+
|
|
67
70
|
function base_moved(recorded: string | undefined, base: string): string {
|
|
68
71
|
return `the merge base moved since the green gate (${recorded ?? 'none'} → ${base})`
|
|
69
72
|
}
|
|
70
73
|
|
|
74
|
+
function stamp_miss(stamp: FileMapStamp, base: string): string | undefined {
|
|
75
|
+
if (stamp.base !== base) return base_moved(stamp.base, base)
|
|
76
|
+
|
|
77
|
+
return review_stamps.gate_stamp.describes_inputs(stamp) ? undefined : INPUTS_MOVED
|
|
78
|
+
}
|
|
79
|
+
|
|
71
80
|
function gate_reuse(
|
|
72
81
|
tree: Record<string, string>,
|
|
73
82
|
base: string | undefined,
|
|
@@ -79,9 +88,10 @@ function gate_reuse(
|
|
|
79
88
|
const stamp = review_brief.matching_stamp(review_stamps.gate_stamp.read(source), tree)
|
|
80
89
|
|
|
81
90
|
if (stamp === undefined) return { miss: 'no green gate record matches the changed files' }
|
|
82
|
-
if (stamp.base !== base) return { miss: base_moved(stamp.base, base) }
|
|
83
91
|
|
|
84
|
-
|
|
92
|
+
const miss = stamp_miss(stamp, base)
|
|
93
|
+
|
|
94
|
+
return miss === undefined ? { stamp } : { miss }
|
|
85
95
|
}
|
|
86
96
|
|
|
87
97
|
function stamp_of(reuse: GateReuse): FileMapStamp | undefined {
|
|
@@ -42,6 +42,17 @@ async function build_gate_step(
|
|
|
42
42
|
return { label: check.label, command_args, cwd, skip_reason }
|
|
43
43
|
}
|
|
44
44
|
|
|
45
|
+
// The unit step at a narrower worker count: the one its claim was admitted at past the wait cap
|
|
46
|
+
// (`core_admission.narrowed_weight`), or the one the free memory holds (`gate-run-steps.ts`). Any
|
|
47
|
+
// other step, or one left as asked, is returned unchanged.
|
|
48
|
+
function with_granted_workers(step: GateStep, granted: number | undefined): GateStep {
|
|
49
|
+
if (granted === undefined || step.label !== UNIT_LABEL) return step
|
|
50
|
+
|
|
51
|
+
const kept = step.command_args.filter((argument) => !argument.startsWith(`${UNIT_WORKER_FLAG}=`))
|
|
52
|
+
|
|
53
|
+
return { ...step, command_args: [...kept, `${UNIT_WORKER_FLAG}=${String(granted)}`] }
|
|
54
|
+
}
|
|
55
|
+
|
|
45
56
|
async function build_gate_steps(
|
|
46
57
|
start_directory: string,
|
|
47
58
|
plan: GatePlan = gate_plan.resolve_gate_plan(),
|
|
@@ -51,4 +62,4 @@ async function build_gate_steps(
|
|
|
51
62
|
)
|
|
52
63
|
}
|
|
53
64
|
|
|
54
|
-
export { build_gate_step, build_gate_steps, UNIT_WORKER_FLAG }
|
|
65
|
+
export { build_gate_step, build_gate_steps, UNIT_WORKER_FLAG, with_granted_workers }
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { readFileSync } from 'node:fs'
|
|
2
|
+
import path from 'node:path'
|
|
3
|
+
import { stamp_file } from '#scripts/josh/stamp-file'
|
|
4
|
+
|
|
5
|
+
// **The one fingerprint every kept result is computed with** (joshuafolkken/kit#4497). A reuse of a
|
|
6
|
+
// verdict holds only while what it read holds, and each reader of a verdict once computed that on its
|
|
7
|
+
// own — the ESLint cache's import closure, the test-read map's dirty files, the gate's tool versions —
|
|
8
|
+
// so a miss in one (joshuafolkken/kit#4407, #4415, #4423, #4425) was a miss nowhere else. Every one now
|
|
9
|
+
// digests a file, a set of files and a set of named entries here.
|
|
10
|
+
|
|
11
|
+
// The digest of a path that does not exist, or cannot be read, so it still differs from any content.
|
|
12
|
+
const ABSENT = 'absent'
|
|
13
|
+
|
|
14
|
+
function of_content(content: Buffer | string): string {
|
|
15
|
+
return stamp_file.digest(content)
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
// One digest over `entries`, independent of their order.
|
|
19
|
+
function of_entries(entries: Iterable<string>): string {
|
|
20
|
+
return of_content([...entries].toSorted((left, right) => left.localeCompare(right)).join('\n'))
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
function of_file(file_path: string): string {
|
|
24
|
+
try {
|
|
25
|
+
return of_content(readFileSync(file_path))
|
|
26
|
+
} catch {
|
|
27
|
+
return ABSENT
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// Each of `relatives` (relative to `root`) keyed to the digest of its content, in path order.
|
|
32
|
+
function of_files(root: string, relatives: Iterable<string>): Record<string, string> {
|
|
33
|
+
const sorted = [...new Set(relatives)].toSorted((left, right) => left.localeCompare(right))
|
|
34
|
+
|
|
35
|
+
return Object.fromEntries(
|
|
36
|
+
sorted.map((relative) => [relative, of_file(path.join(root, relative))]),
|
|
37
|
+
)
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
const input_fingerprint = { ABSENT, of_entries, of_file, of_files }
|
|
41
|
+
|
|
42
|
+
export { input_fingerprint }
|