@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,51 @@
|
|
|
1
|
+
// The state guard runs on the pure project alone. isolate:false is what lets one file see the git
|
|
2
|
+
// branch, working tree or GIT_* variables a sibling left changed, so that is the only run where a leak
|
|
3
|
+
// is a correctness problem rather than a latent one — and the isolated project keeps exactly the guards
|
|
4
|
+
// the single-project suite had. The network guard is armed once at the root instead, since it arms
|
|
5
|
+
// `PATH` before any worker of either project forks.
|
|
6
|
+
const STATE_GUARD: ReadonlyArray<string> = ['./tools/test/test-state-guard.ts']
|
|
7
|
+
|
|
8
|
+
// Runs in every worker of both projects, before each test, and silences the real streams for the test
|
|
9
|
+
// body so a fixture's direct `process.stdout` write cannot leak into `pnpm josh test:unit`'s output.
|
|
10
|
+
// `setupFiles` rather than `globalSetup` because it must run inside the
|
|
11
|
+
// worker where the test's writes happen, not once in the main process.
|
|
12
|
+
const STDOUT_GUARD: ReadonlyArray<string> = ['./tools/test/test-stdout-guard.ts']
|
|
13
|
+
|
|
14
|
+
// Runs in every worker for the same reason: it wraps that worker's own `fetch`, refusing a real
|
|
15
|
+
// Telegram send and recording which test tried.
|
|
16
|
+
const TELEGRAM_GUARD: ReadonlyArray<string> = ['./tools/test/test-telegram-guard.ts']
|
|
17
|
+
|
|
18
|
+
// Runs in every worker too: it replaces that worker's machine reading, so a suite that drives the gate
|
|
19
|
+
// admits the same way on every platform and every load.
|
|
20
|
+
const MACHINE_GUARD: ReadonlyArray<string> = ['./tools/test/test-machine-guard.ts']
|
|
21
|
+
|
|
22
|
+
// The guards every run of the suite arms, whichever config starts it: the network guard once in the
|
|
23
|
+
// main process, the stdout, Telegram and machine guards in every worker. Named here so `vitest.config.ts` and
|
|
24
|
+
// `vitest.harness.config.ts` read one definition — the harness once ran with none of them.
|
|
25
|
+
const NETWORK_GUARD: ReadonlyArray<string> = ['./tools/test/test-network-guard.ts']
|
|
26
|
+
const WORKER_GUARDS: ReadonlyArray<string> = [...STDOUT_GUARD, ...TELEGRAM_GUARD, ...MACHINE_GUARD]
|
|
27
|
+
|
|
28
|
+
// Runs in every worker of the unit suite, idle unless a whole-suite `josh test:unit` asked it to
|
|
29
|
+
// record which repository paths each test reads (`test-read-recorder.ts`). Not a guard, and not
|
|
30
|
+
// the harness config's: only this suite's runs feed the test-read map.
|
|
31
|
+
const READ_RECORDER: ReadonlyArray<string> = ['./tools/test/test-read-recorder.ts']
|
|
32
|
+
|
|
33
|
+
// The unit suite's own reporter, which vitest loads by this path in its own process. Named rather
|
|
34
|
+
// than imported so neither it nor the ledger it writes joins the config's import graph
|
|
35
|
+
// (joshuafolkken/kit#4465).
|
|
36
|
+
const UNIT_FILE_REPORTER = './vitest.reporter.config.ts'
|
|
37
|
+
|
|
38
|
+
// Kept apart from `unit-projects.ts` so the shipped `josh test:related` can name every setup file
|
|
39
|
+
// without loading the kit-internal project partition.
|
|
40
|
+
const unit_setup_files = {
|
|
41
|
+
MACHINE_GUARD,
|
|
42
|
+
NETWORK_GUARD,
|
|
43
|
+
READ_RECORDER,
|
|
44
|
+
STATE_GUARD,
|
|
45
|
+
STDOUT_GUARD,
|
|
46
|
+
UNIT_FILE_REPORTER,
|
|
47
|
+
TELEGRAM_GUARD,
|
|
48
|
+
WORKER_GUARDS,
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export { unit_setup_files }
|
|
@@ -1,11 +1,6 @@
|
|
|
1
|
-
import { readdirSync } from 'node:fs'
|
|
2
1
|
import { availableParallelism } from 'node:os'
|
|
3
|
-
import path from 'node:path'
|
|
4
|
-
import { PLATFORM_TEMP_ROOT } from '#scripts/josh/platform-temporary'
|
|
5
|
-
import { process_identity } from '#scripts/josh/process-identity'
|
|
6
|
-
import { process_owner_schema, type ProcessOwner } from '#scripts/josh/process-owner'
|
|
7
2
|
import { stamp_file } from '#scripts/josh/stamp-file'
|
|
8
|
-
import {
|
|
3
|
+
import { unit_run_marker } from './unit-run-marker'
|
|
9
4
|
|
|
10
5
|
// How wide one vitest run may fan out when it is not the only one on the machine.
|
|
11
6
|
//
|
|
@@ -26,131 +21,80 @@ import { json_value } from '#scripts/lib/json-value'
|
|
|
26
21
|
// **The division activates only under concurrency.** One run in flight — every solo run, CI included
|
|
27
22
|
// — gets exactly the number the gate and the hook produced before this module existed, so a quiet
|
|
28
23
|
// machine behaves bit for bit as it did and only the condition that was measured broken changes.
|
|
24
|
+
//
|
|
25
|
+
// **The run markers and their division of the machine are `unit-run-marker.ts`**, the part the vitest
|
|
26
|
+
// config imports (joshuafolkken/kit#4572); the capacity and claim bounds and the flag handling are here.
|
|
27
|
+
const { MIN_WORKERS, NESTED_KEY, NESTED_VALUE, SOLO_RUNS } = unit_run_marker
|
|
28
|
+
const { is_nested_run, live_run_count, mark_run_started, marker_path, resolve_unit_workers } =
|
|
29
|
+
unit_run_marker
|
|
29
30
|
|
|
30
|
-
// A record that means something only while it exists, in the shape `stamp-file.ts` already keeps for
|
|
31
|
-
// the in-flight gate marker. Keyed by pid rather than by checkout: `josh gate`'s unit step and a
|
|
32
|
-
// `josh test:related` can be in flight in one checkout at once, and both of them are load.
|
|
33
|
-
const RUN_PREFIX = 'josh-unit-running-'
|
|
34
31
|
// Vitest's own flag, in both spellings its CLI accepts — it normalizes `--max-workers` to the same
|
|
35
32
|
// option, so a run that recognized only one of them would replace a number the caller typed with the
|
|
36
33
|
// share and contradict the promise below. The camel-case one is what gets written.
|
|
37
34
|
const WORKER_FLAG = '--maxWorkers'
|
|
38
35
|
const WORKER_FLAGS: ReadonlyArray<string> = [WORKER_FLAG, '--max-workers']
|
|
39
|
-
//
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
//
|
|
45
|
-
//
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
// a unit suite under six-way load already takes minutes. The process that writes this marker is the
|
|
56
|
-
// long-lived one, so unlike a `run:hold` record its identity is a liveness test rather than a note for
|
|
57
|
-
// the reader.
|
|
58
|
-
//
|
|
59
|
-
// **The pid alone was not that identity**. The section below already named
|
|
60
|
-
// what goes wrong — a reissued pid turns a leaked marker into a permanent phantom — and answered it by
|
|
61
|
-
// sweeping, which only ever collected the markers whose pid had *not* yet been reissued. Since the
|
|
62
|
-
// record now carries the writing process's start time beside its pid, a reissued pid is recognized as
|
|
63
|
-
// a different process and swept like any other dead one. A pid that is not positive is caught by the
|
|
64
|
-
// same check, inside `process_identity`: `process.kill(0, …)` addresses the caller's own process group
|
|
65
|
-
// rather than a process, so a truncated or hand-edited marker would otherwise answer "alive" forever.
|
|
66
|
-
//
|
|
67
|
-
// **"Cannot tell" counts as live here, which is the opposite of what the in-flight gate marker's
|
|
68
|
-
// readers do with it, and deliberately so.** A marker with no recorded start time — written before the
|
|
69
|
-
// field existed, or on a platform where it cannot be read — resolves toward *more* sharing: being
|
|
70
|
-
// wrong that way costs this run a narrower share of the machine, while being wrong the other way puts
|
|
71
|
-
// six unit suites on eleven cores, an oversubscription measured at a load
|
|
72
|
-
// average of 209.
|
|
73
|
-
function is_running(marker: RunMarker): boolean {
|
|
74
|
-
return process_identity.is_same_process(marker.pid, marker.process_start) !== false
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
function read_marker(source: string): RunMarker | undefined {
|
|
78
|
-
const raw = stamp_file.read_stamp_text(source)
|
|
79
|
-
|
|
80
|
-
if (raw === undefined) return undefined
|
|
81
|
-
|
|
82
|
-
const parsed = process_owner_schema.safeParse(json_value.parse_or_undefined(raw))
|
|
83
|
-
|
|
84
|
-
return parsed.success ? parsed.data : undefined
|
|
85
|
-
}
|
|
36
|
+
// The core vitest's own process — the pool, the reporter and Vite's transforms — keeps busy beside its
|
|
37
|
+
// workers (joshuafolkken/kit#4362). A direct run's claim holds it above its worker count.
|
|
38
|
+
const MAIN_PROCESS_CORES = 1
|
|
39
|
+
|
|
40
|
+
// **The run count divides the machine; the free cores bound what that division hands out.** The
|
|
41
|
+
// share counts only unit runs, so load from outside the core budget's ledger — Claude sessions, other
|
|
42
|
+
// tools — went unseen: 22 of 38 ledger samples at a load average of 20 or more had vitest as their
|
|
43
|
+
// heaviest process, one at 381% over 30 processes. `free_cores` is `free-cores.ts`'s reading, the
|
|
44
|
+
// cores less that outside load. `undefined` — a CI runner, a CPU quota — and a reading at or above
|
|
45
|
+
// the ceiling both leave `workers` as it was, so an unread or quiet machine changes nothing.
|
|
46
|
+
function cap_to_free(
|
|
47
|
+
workers: number | undefined,
|
|
48
|
+
free_cores: number | undefined,
|
|
49
|
+
available_cores: number,
|
|
50
|
+
): number | undefined {
|
|
51
|
+
if (free_cores === undefined || free_cores >= (workers ?? available_cores)) return workers
|
|
86
52
|
|
|
87
|
-
|
|
88
|
-
// as it was rather than throttling a run on a guess. Unlike the network guard, being wrong here costs
|
|
89
|
-
// wall time and never a false result.
|
|
90
|
-
function marker_files(directory: string = PLATFORM_TEMP_ROOT): Array<string> {
|
|
91
|
-
try {
|
|
92
|
-
return readdirSync(directory).filter((name) => name.startsWith(RUN_PREFIX))
|
|
93
|
-
} catch {
|
|
94
|
-
return []
|
|
95
|
-
}
|
|
53
|
+
return Math.max(MIN_WORKERS, Math.floor(free_cores))
|
|
96
54
|
}
|
|
97
55
|
|
|
98
|
-
//
|
|
99
|
-
//
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
// group) does not unwind. Sweeping on read is what bounds it: the first later run collects it.
|
|
104
|
-
function sweep_marker(source: string): void {
|
|
105
|
-
try {
|
|
106
|
-
stamp_file.remove_stamp(source)
|
|
107
|
-
} catch {
|
|
108
|
-
/* not ours to remove; counting it out is the whole requirement */
|
|
109
|
-
}
|
|
56
|
+
// What the machine has free for this run's workers, both from `free-cores.ts`'s one reading: the free
|
|
57
|
+
// cores, and the workers the free memory holds. Either is `undefined` where it could not be read.
|
|
58
|
+
interface FreeCapacity {
|
|
59
|
+
cores: number | undefined
|
|
60
|
+
memory_workers: number | undefined
|
|
110
61
|
}
|
|
111
62
|
|
|
112
|
-
|
|
113
|
-
// this account may not read — another user's file on a sticky `/tmp` — is `undefined` here, and
|
|
114
|
-
// deleting on that answer would raise `EPERM` from a path with no `catch` between it and
|
|
115
|
-
// `announce_gate_plan`: an unreadable file belonging to somebody else would abort the gate outright,
|
|
116
|
-
// which is worse than the leak this sweep exists for. Unreadable therefore counts as not-live and is
|
|
117
|
-
// left alone, exactly as it was before the sweep existed.
|
|
118
|
-
function is_marker_live(source: string): boolean {
|
|
119
|
-
const marker = read_marker(source)
|
|
63
|
+
const UNREAD_CAPACITY: FreeCapacity = { cores: undefined, memory_workers: undefined }
|
|
120
64
|
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
65
|
+
// **The free memory bounds the share as the free cores do** (joshuafolkken/kit#4528). Lanes running
|
|
66
|
+
// their suites at once each sized workers from the cores alone, so their workers' memory piled up
|
|
67
|
+
// until the batch stopped opening lanes. Both bounds go through `cap_to_free`, so an unread one leaves
|
|
68
|
+
// the share as it was.
|
|
69
|
+
function cap_to_capacity(
|
|
70
|
+
workers: number | undefined,
|
|
71
|
+
free: FreeCapacity,
|
|
72
|
+
available_cores: number,
|
|
73
|
+
): number | undefined {
|
|
74
|
+
const core_capped = cap_to_free(workers, free.cores, available_cores)
|
|
125
75
|
|
|
126
|
-
return
|
|
76
|
+
return cap_to_free(core_capped, free.memory_workers, available_cores)
|
|
127
77
|
}
|
|
128
78
|
|
|
129
|
-
//
|
|
130
|
-
//
|
|
131
|
-
|
|
132
|
-
|
|
79
|
+
// The core-budget claim a unit run holds: the weight it reserved, and the narrower one it was admitted
|
|
80
|
+
// at past the wait cap.
|
|
81
|
+
interface UnitClaim {
|
|
82
|
+
weight: number
|
|
83
|
+
granted?: number | undefined
|
|
133
84
|
}
|
|
134
85
|
|
|
135
|
-
// **The
|
|
136
|
-
//
|
|
137
|
-
//
|
|
138
|
-
//
|
|
139
|
-
//
|
|
140
|
-
//
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
function is_nested_run(): boolean {
|
|
145
|
-
return process.env[NESTED_KEY] === NESTED_VALUE
|
|
146
|
-
}
|
|
86
|
+
// **The share never exceeds the claim the run was admitted on** (joshuafolkken/kit#4235). The share is
|
|
87
|
+
// read after admission, when fewer runs may be in flight than when the weight was sized, and a share
|
|
88
|
+
// wider than the claim puts workers on the machine the ledger does not hold. The claim bounds a solo
|
|
89
|
+
// share too: vitest's own choice is one worker per core but one, wider than any weight the ledger
|
|
90
|
+
// reserves for a unit run, so leaving it in place would open workers no claim holds. The claim holds
|
|
91
|
+
// vitest's own process as well, so its workers are the claim less that core.
|
|
92
|
+
function cap_to_claim(share: number | undefined, claim: UnitClaim | undefined): number | undefined {
|
|
93
|
+
if (claim === undefined) return share
|
|
147
94
|
|
|
148
|
-
|
|
149
|
-
// core reservation and the hook passes no flag at all, which is what both did before this existed.
|
|
150
|
-
function resolve_unit_workers(available_cores: number, runs: number): number | undefined {
|
|
151
|
-
if (runs <= SOLO_RUNS) return undefined
|
|
95
|
+
const bound = Math.max(MIN_WORKERS, (claim.granted ?? claim.weight) - MAIN_PROCESS_CORES)
|
|
152
96
|
|
|
153
|
-
return Math.
|
|
97
|
+
return Math.min(share ?? bound, bound)
|
|
154
98
|
}
|
|
155
99
|
|
|
156
100
|
// The share this run may take, read from the machine. Separate from `resolve_unit_workers` so that
|
|
@@ -163,10 +107,12 @@ function resolve_unit_workers(available_cores: number, runs: number): number | u
|
|
|
163
107
|
function current_share(
|
|
164
108
|
available_cores: number = availableParallelism(),
|
|
165
109
|
live_runs: number = live_run_count(),
|
|
110
|
+
free: FreeCapacity = UNREAD_CAPACITY,
|
|
166
111
|
): number | undefined {
|
|
167
112
|
const own_run = is_nested_run() ? 0 : SOLO_RUNS
|
|
113
|
+
const share = resolve_unit_workers(available_cores, live_runs + own_run)
|
|
168
114
|
|
|
169
|
-
return
|
|
115
|
+
return cap_to_capacity(share, free, available_cores)
|
|
170
116
|
}
|
|
171
117
|
|
|
172
118
|
function is_worker_flag(argument: string): boolean {
|
|
@@ -182,28 +128,19 @@ function is_worker_flag(argument: string): boolean {
|
|
|
182
128
|
// would make this function's own answer depend on what happened to be running while it was asked, and
|
|
183
129
|
// `f(args, undefined)` takes the default rather than the value — so the case that matters most, "this
|
|
184
130
|
// run is alone", would be the one case no test could express.
|
|
131
|
+
function has_worker_flag(vitest_arguments: ReadonlyArray<string>): boolean {
|
|
132
|
+
return vitest_arguments.some((argument) => is_worker_flag(argument))
|
|
133
|
+
}
|
|
134
|
+
|
|
185
135
|
function worker_arguments(
|
|
186
136
|
vitest_arguments: ReadonlyArray<string>,
|
|
187
137
|
share: number | undefined,
|
|
188
138
|
): Array<string> {
|
|
189
|
-
if (share === undefined || vitest_arguments
|
|
190
|
-
return []
|
|
191
|
-
}
|
|
139
|
+
if (share === undefined || has_worker_flag(vitest_arguments)) return []
|
|
192
140
|
|
|
193
141
|
return [`${WORKER_FLAG}=${String(share)}`]
|
|
194
142
|
}
|
|
195
143
|
|
|
196
|
-
// **The write failing is not a reason to fail the run.** A marker that could not be written costs the
|
|
197
|
-
// next run a wider share than it should have — the behavior that was there before — while a thrown
|
|
198
|
-
// error here would fail a unit suite over bookkeeping.
|
|
199
|
-
function mark_run_started(target: string): void {
|
|
200
|
-
try {
|
|
201
|
-
stamp_file.write_stamp(target, process_identity.own_fields())
|
|
202
|
-
} catch {
|
|
203
|
-
/* a missing marker costs a wide share, never a wrong result */
|
|
204
|
-
}
|
|
205
|
-
}
|
|
206
|
-
|
|
207
144
|
// `finally`, so a suite that threw still clears its marker — and so does the nested branch, which
|
|
208
145
|
// restores nothing because it wrote nothing.
|
|
209
146
|
async function with_run_marker<T>(run: () => Promise<T>): Promise<T> {
|
|
@@ -225,19 +162,16 @@ async function with_run_marker<T>(run: () => Promise<T>): Promise<T> {
|
|
|
225
162
|
}
|
|
226
163
|
|
|
227
164
|
const unit_worker_share = {
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
165
|
+
...unit_run_marker,
|
|
166
|
+
MAIN_PROCESS_CORES,
|
|
167
|
+
cap_to_capacity,
|
|
168
|
+
cap_to_claim,
|
|
169
|
+
cap_to_free,
|
|
233
170
|
current_share,
|
|
234
|
-
|
|
235
|
-
live_run_count,
|
|
236
|
-
marker_path,
|
|
237
|
-
read_marker,
|
|
238
|
-
resolve_unit_workers,
|
|
171
|
+
has_worker_flag,
|
|
239
172
|
with_run_marker,
|
|
240
173
|
worker_arguments,
|
|
241
174
|
}
|
|
242
175
|
|
|
176
|
+
export type { FreeCapacity, UnitClaim }
|
|
243
177
|
export { unit_worker_share }
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import path from 'node:path'
|
|
2
|
+
import { unit_setup_files } from './unit-setup-files'
|
|
3
|
+
|
|
4
|
+
// The files every test depends on without importing or reading them: the package and its lock,
|
|
5
|
+
// the vitest configuration, and the setup files every worker runs before every test.
|
|
6
|
+
const SETUP_FILES: ReadonlyArray<string> = [
|
|
7
|
+
...unit_setup_files.NETWORK_GUARD,
|
|
8
|
+
...unit_setup_files.STATE_GUARD,
|
|
9
|
+
...unit_setup_files.WORKER_GUARDS,
|
|
10
|
+
...unit_setup_files.READ_RECORDER,
|
|
11
|
+
]
|
|
12
|
+
|
|
13
|
+
const ROOT_FILES: ReadonlyArray<string> = [
|
|
14
|
+
'package.json',
|
|
15
|
+
'pnpm-lock.yaml',
|
|
16
|
+
'pnpm-workspace.yaml',
|
|
17
|
+
'tsconfig.json',
|
|
18
|
+
'vitest.config.ts',
|
|
19
|
+
'vitest.harness.config.ts',
|
|
20
|
+
// What the read recorder runs in every worker, which no test imports through the setup file.
|
|
21
|
+
'tools/test/test-read-capture.ts',
|
|
22
|
+
'scripts/test/test-read-trace.ts',
|
|
23
|
+
]
|
|
24
|
+
|
|
25
|
+
// **What the vitest config and the worker setup files import** (joshuafolkken/kit#4465). Vitest runs
|
|
26
|
+
// every test when a file it is given is a config dependency — every module the config imports,
|
|
27
|
+
// statically or not — and the setup files are in every test's graph, so `vitest related` widens to the
|
|
28
|
+
// whole suite on any of these with no word of why. Named here, they print the reason instead.
|
|
29
|
+
// `whole-suite-files.test.ts` holds the list to both graphs, so an import added to either fails there.
|
|
30
|
+
const IMPORTED_BY_EVERY_TEST: ReadonlyArray<string> = [
|
|
31
|
+
'scripts/git/constants.ts',
|
|
32
|
+
'scripts/git/git-location-environment.ts',
|
|
33
|
+
'scripts/init/init-paths.ts',
|
|
34
|
+
'scripts/josh/agent-session-environment.ts',
|
|
35
|
+
'scripts/josh/platform-temporary.ts',
|
|
36
|
+
'scripts/josh/process-identity.ts',
|
|
37
|
+
'scripts/josh/process-owner.ts',
|
|
38
|
+
'scripts/josh/stamp-file.ts',
|
|
39
|
+
'scripts/lib/atomic-write.ts',
|
|
40
|
+
'scripts/lib/json-value.ts',
|
|
41
|
+
'scripts/lib/read-file.ts',
|
|
42
|
+
'scripts/lib/timeouts.ts',
|
|
43
|
+
'scripts/test/unit-run-marker.ts',
|
|
44
|
+
'scripts/test/unit-setup-files.ts',
|
|
45
|
+
'tools/test/duration-sequencer.ts',
|
|
46
|
+
'tools/test/duration-shard.ts',
|
|
47
|
+
'tools/test/pure-files.ts',
|
|
48
|
+
'tools/test/test-module-elapsed.ts',
|
|
49
|
+
'tools/test/test-repository-guard.ts',
|
|
50
|
+
'tools/test/unit-duration-record.ts',
|
|
51
|
+
'tools/test/unit-guard-environment.ts',
|
|
52
|
+
'tools/test/unit-projects.ts',
|
|
53
|
+
'tools/test/vitest-config-workers.ts',
|
|
54
|
+
'tools/test/vitest-include-globs.ts',
|
|
55
|
+
]
|
|
56
|
+
|
|
57
|
+
const WHOLE_SUITE_FILES: ReadonlySet<string> = new Set(
|
|
58
|
+
[...ROOT_FILES, ...IMPORTED_BY_EVERY_TEST, ...SETUP_FILES].map((file) => path.normalize(file)),
|
|
59
|
+
)
|
|
60
|
+
|
|
61
|
+
const whole_suite_files = { WHOLE_SUITE_FILES }
|
|
62
|
+
|
|
63
|
+
export { whole_suite_files }
|
|
@@ -51,8 +51,15 @@ const NO_FINISH = 0
|
|
|
51
51
|
// let the #3273 lane child end its turn on a running task the stop hook never saw.
|
|
52
52
|
const LAUNCH_PATTERN =
|
|
53
53
|
/(?:running in background with ID:|moved to the background \(ID:)\s*([\w-]+)/iu
|
|
54
|
-
// A backgrounded subagent's launch result, which names its id on an `agentId:` line of its own
|
|
55
|
-
|
|
54
|
+
// A backgrounded subagent's launch result, which names its id on an `agentId:` line of its own — or
|
|
55
|
+
// the JSON result of a `SendMessage` that resumed one, which names it as `resumedAgentId`. A resumed
|
|
56
|
+
// subagent runs in the background under the same id and ends with the same notice; missing that
|
|
57
|
+
// spelling let the #4344 lane child's stop hook release its hold and `in-progress` while the resumed
|
|
58
|
+
// investigator was still running (joshuafolkken/kit#4347). It is anchored on the result's own first
|
|
59
|
+
// key: a command that printed a transcript line, which nests the same key under `toolUseResult`,
|
|
60
|
+
// would otherwise open a resume that never finishes.
|
|
61
|
+
const AGENT_LAUNCH_PATTERN =
|
|
62
|
+
/^(?:Async agent launched[\s\S]*?\bagentId:\s*|\{"success":[^\n]*?"resumedAgentId":")([\w-]+)/u
|
|
56
63
|
// The notice the harness writes when a task it took into the background ends.
|
|
57
64
|
// It is anchored at the start because the whole content of that line *is*
|
|
58
65
|
// the notice — a body merely quoting one is text, the same hazard `read_id` unquotes for — and it
|
|
@@ -65,6 +72,11 @@ const AGENT_LAUNCH_PATTERN = /^Async agent launched[\s\S]*?\bagentId:\s*([\w-]+)
|
|
|
65
72
|
// an enumeration of the harness's spellings, and a spelling it added later would silently start
|
|
66
73
|
// reporting finished commands as never finished.
|
|
67
74
|
const FINISH_PATTERN = /^<task-notification>[\s\S]*?<task-id>([\w-]+)<\/task-id>/u
|
|
75
|
+
// The other end of a backgrounded task: the result of a `TaskStop` call. The harness writes no
|
|
76
|
+
// task-notification for a task it was told to stop, so reading the notice alone left a stopped task
|
|
77
|
+
// open for ever, and the lane stop guard blocked every stop after it (joshuafolkken/kit#4472). It is
|
|
78
|
+
// anchored on the result's own first key for the reason `AGENT_LAUNCH_PATTERN` is.
|
|
79
|
+
const STOP_PATTERN = /^\{"message":"Successfully stopped task:\s*([\w-]+)/u
|
|
68
80
|
// The output file every reader of a backgrounded command names, whichever command it uses to read
|
|
69
81
|
// it — `tail`, `cat`, `sed`, `grep`, or the `Monitor` tool, all of which carry the path.
|
|
70
82
|
const OUTPUT_PATTERN = /tasks\/([\w-]+)\.output/u
|
|
@@ -113,6 +125,11 @@ function finished_id(text: string): string {
|
|
|
113
125
|
return FINISH_PATTERN.exec(text)?.[1] ?? NO_BACKGROUND
|
|
114
126
|
}
|
|
115
127
|
|
|
128
|
+
// The background run a `TaskStop` result reports stopping, or nothing for every other tool result.
|
|
129
|
+
function stopped_id(text: string): string {
|
|
130
|
+
return STOP_PATTERN.exec(text)?.[1] ?? NO_BACKGROUND
|
|
131
|
+
}
|
|
132
|
+
|
|
116
133
|
// One line, as much of it as this reading needs. Taken structurally rather than as a `TranscriptLine`
|
|
117
134
|
// so the import stays one-way: `time-transcript-line.ts` already imports this module to read the two
|
|
118
135
|
// ids off a body, and asking for its type back would close the cycle.
|
|
@@ -300,6 +317,7 @@ const time_background = {
|
|
|
300
317
|
launch_id,
|
|
301
318
|
agent_launch_id,
|
|
302
319
|
finished_id,
|
|
320
|
+
stopped_id,
|
|
303
321
|
finished_at,
|
|
304
322
|
read_id,
|
|
305
323
|
read_id_of,
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { figure_format } from '#scripts/lib/figure-format'
|
|
1
2
|
import { time_agent_bundles } from './time-agent-bundles'
|
|
2
3
|
import { time_format } from './time-format'
|
|
3
4
|
import { time_round_trips } from './time-round-trips'
|
|
@@ -111,7 +112,7 @@ const NO_BUNDLES: BundleTotals = {
|
|
|
111
112
|
// `scripts/time-x` inside `scripts/time-xyz`.
|
|
112
113
|
//
|
|
113
114
|
// **The tail position is what makes an absolute path comparable with a relative one.** A `Read` call
|
|
114
|
-
// names `/Users/…/kit/
|
|
115
|
+
// names `/Users/…/kit/tools/time/x.ts` while the `grep` before it named `tools/time`, and nothing
|
|
115
116
|
// here knows the working directory the second was relative to — so the search-then-read pair, which is
|
|
116
117
|
// the whole reason the target test exists, would escape it on the two shapes it occurs in most.
|
|
117
118
|
function contains_segments(whole: string, part: string): boolean {
|
|
@@ -124,7 +125,7 @@ function contains_segments(whole: string, part: string): boolean {
|
|
|
124
125
|
}
|
|
125
126
|
|
|
126
127
|
// Equal, or one inside the other. The containing form is what catches the search-then-read pair:
|
|
127
|
-
// `grep -rn foo scripts` names `scripts`, and the `cat
|
|
128
|
+
// `grep -rn foo scripts` names `scripts`, and the `cat tools/time/x.ts` that follows it names a path
|
|
128
129
|
// beneath — which is exactly how the second call learned the first one's answer.
|
|
129
130
|
function is_related(left: string, right: string): boolean {
|
|
130
131
|
if (left === right) return true
|
|
@@ -422,7 +423,7 @@ interface TripPrice {
|
|
|
422
423
|
}
|
|
423
424
|
|
|
424
425
|
function recoverable_suffix(totals: BundleTotals, round_trip_count: number): string {
|
|
425
|
-
const share =
|
|
426
|
+
const share = figure_format.format_share(totals.recoverable_round_trips, round_trip_count)
|
|
426
427
|
|
|
427
428
|
return `${share} of ${String(round_trip_count)} round trip(s)`
|
|
428
429
|
}
|
|
@@ -66,22 +66,22 @@ const notice_schema = z.object({ notified_at_ms: z.number() })
|
|
|
66
66
|
const call_schema = z.object({ tool_name: z.string().min(1), tool_input: z.unknown() })
|
|
67
67
|
|
|
68
68
|
function parse_transcript_path(raw_payload: string): string | undefined {
|
|
69
|
-
const
|
|
69
|
+
const payload = json_value.parse_with(raw_payload, payload_schema)
|
|
70
70
|
|
|
71
|
-
if (
|
|
71
|
+
if (payload?.transcript_path === undefined) return undefined
|
|
72
72
|
|
|
73
|
-
return time_hook_transcript.transcript_of(
|
|
73
|
+
return time_hook_transcript.transcript_of(payload.transcript_path, payload.agent_id)
|
|
74
74
|
}
|
|
75
75
|
|
|
76
76
|
// The call that has just run, as the payload names it — what the line checks
|
|
77
77
|
// against the turns behind it, so a call that needed their result is never offered as one that could
|
|
78
78
|
// have shared their turn. A payload without a tool name answers `undefined`, judged on those turns alone.
|
|
79
79
|
function parse_call(raw_payload: string): GuardedCall | undefined {
|
|
80
|
-
const
|
|
80
|
+
const call = json_value.parse_with(raw_payload, call_schema)
|
|
81
81
|
|
|
82
|
-
if (
|
|
82
|
+
if (call === undefined) return undefined
|
|
83
83
|
|
|
84
|
-
return { name:
|
|
84
|
+
return { name: call.tool_name, input: call.tool_input }
|
|
85
85
|
}
|
|
86
86
|
|
|
87
87
|
// The last `max_bytes` of a file, as text. The leading line is usually cut mid-way, which every
|
|
@@ -173,6 +173,8 @@ function density_notice(raw_payload: string, now_ms: number = Date.now()): strin
|
|
|
173
173
|
const time_density_hook = {
|
|
174
174
|
density_notice,
|
|
175
175
|
notice_path,
|
|
176
|
+
parse_call,
|
|
177
|
+
parse_transcript_path,
|
|
176
178
|
read_tail,
|
|
177
179
|
}
|
|
178
180
|
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { git_followup_stages, type FollowupStage } from '#scripts/followup/git-followup-stages'
|
|
2
|
+
import { MS_PER_SECOND } from '#scripts/lib/timeouts'
|
|
2
3
|
|
|
3
4
|
// Reading `followup`'s own stage rows back out of what it printed.
|
|
4
5
|
//
|
|
@@ -35,9 +36,6 @@ const LINE_SEPARATOR = '\n'
|
|
|
35
36
|
// so the tail is the one part of the row whose shape the alignment cannot move.
|
|
36
37
|
const SECONDS_SUFFIX = ' s'
|
|
37
38
|
const DIGIT_OR_POINT = /[\d.]/u
|
|
38
|
-
// Written here rather than imported: `time-format.ts` keeps its own copy private, and reaching for
|
|
39
|
-
// `run-progress.ts` would pull a command module into the parse for one number.
|
|
40
|
-
const MS_PER_SECOND = 1000
|
|
41
39
|
const NO_STAGES: ReadonlyArray<FollowupStage> = []
|
|
42
40
|
|
|
43
41
|
// Leading whitespace is trimmed for the same reason `time-reported-failure.ts` trims it: the printer
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
import { figure_format } from '#scripts/lib/figure-format'
|
|
2
|
+
import { MS_PER_SECOND } from '#scripts/lib/timeouts'
|
|
3
|
+
|
|
1
4
|
// The column and number formatting every timing report is laid out through.
|
|
2
5
|
//
|
|
3
6
|
// It was `time-report.ts`'s until three renderers shared it: the run scope's own tables, the epic
|
|
@@ -12,13 +15,9 @@
|
|
|
12
15
|
// imports either of them. **The words two blocks must spell identically are the exception**, and they
|
|
13
16
|
// are here for the reason `NO_CALLS` is: a label printed by two renderers, one of which cannot import
|
|
14
17
|
// the other, has to be written once or the two reports come to disagree about what a row is called.
|
|
18
|
+
// The figures themselves are `figure_format`'s, shared with the cost reports.
|
|
15
19
|
|
|
16
|
-
const MS_PER_MINUTE = 60_000
|
|
17
|
-
const MS_PER_SECOND = 1000
|
|
18
|
-
const MINUTE_DECIMALS = 1
|
|
19
20
|
const SECOND_DECIMALS = 1
|
|
20
|
-
const PERCENT_SCALE = 100
|
|
21
|
-
const PERCENT_DECIMALS = 1
|
|
22
21
|
const LABEL_WIDTH = 24
|
|
23
22
|
// Wide enough for a three-digit run (`335.4 min`), so a long session's rows stay in column with a
|
|
24
23
|
// short one's rather than pushing the share out by a character.
|
|
@@ -53,32 +52,12 @@ function overflow_line(row_count: number): Array<string> {
|
|
|
53
52
|
]
|
|
54
53
|
}
|
|
55
54
|
|
|
56
|
-
function format_minutes(duration_ms: number): string {
|
|
57
|
-
return `${(duration_ms / MS_PER_MINUTE).toFixed(MINUTE_DECIMALS)} min`
|
|
58
|
-
}
|
|
59
|
-
|
|
60
55
|
// Seconds rather than minutes for a per-turn figure: one turn is tens of seconds, and `0.1 min` is
|
|
61
56
|
// too coarse to show the rise across a batch that this scale exists to make visible.
|
|
62
57
|
function format_seconds(duration_ms: number): string {
|
|
63
58
|
return `${(duration_ms / MS_PER_SECOND).toFixed(SECOND_DECIMALS)} s`
|
|
64
59
|
}
|
|
65
60
|
|
|
66
|
-
function format_share(part: number, whole: number): string {
|
|
67
|
-
if (whole === 0) return 'n/a'
|
|
68
|
-
|
|
69
|
-
return `${((part / whole) * PERCENT_SCALE).toFixed(PERCENT_DECIMALS)}%`
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
// A dollar figure, to the caller's own precision. Two cost blocks print money now — the phase costs
|
|
73
|
-
// and the per-subagent context-construction costs — and each rounds to a different place (a run total
|
|
74
|
-
// to the cent, a per-round-trip figure finer), so the decimals are the caller's and only the `$` and
|
|
75
|
-
// the `toFixed` are shared. It sits here beside the other number formatters rather than in one block,
|
|
76
|
-
// for the reason `format_minutes` does: a second copy beside the second renderer is how two cost rows
|
|
77
|
-
// of one report come to punctuate a dollar amount two ways.
|
|
78
|
-
function usd(amount: number, decimals: number): string {
|
|
79
|
-
return `$${amount.toFixed(decimals)}`
|
|
80
|
-
}
|
|
81
|
-
|
|
82
61
|
// The one place the three columns are laid out, so a row carrying words instead of a duration lines
|
|
83
62
|
// up with the rows that carry one rather than overrunning the numeric column.
|
|
84
63
|
function format_columns(label: string, minutes: string, suffix: string): string {
|
|
@@ -86,7 +65,7 @@ function format_columns(label: string, minutes: string, suffix: string): string
|
|
|
86
65
|
}
|
|
87
66
|
|
|
88
67
|
function format_row(label: string, duration_ms: number, suffix: string): string {
|
|
89
|
-
return format_columns(label, format_minutes(duration_ms), suffix)
|
|
68
|
+
return format_columns(label, figure_format.format_minutes(duration_ms), suffix)
|
|
90
69
|
}
|
|
91
70
|
|
|
92
71
|
// **A share nobody read says so rather than totalling zero.** The duration column is left empty
|
|
@@ -101,8 +80,6 @@ const time_format = {
|
|
|
101
80
|
NO_CALLS,
|
|
102
81
|
overflow_line,
|
|
103
82
|
format_seconds,
|
|
104
|
-
format_share,
|
|
105
|
-
usd,
|
|
106
83
|
format_columns,
|
|
107
84
|
format_row,
|
|
108
85
|
// `format_clock` stays private: `format_window` is its only caller, and a namespace that offers
|
|
@@ -89,6 +89,11 @@ const BODY_FIELD_PATTERN = /\bbody=/u
|
|
|
89
89
|
const ISSUE_COMMENT_PATTERN = /\bgh\s+issue\s+comment\b/u
|
|
90
90
|
const BODY_FLAG_PATTERN = /--body(?:-file)?\b/u
|
|
91
91
|
|
|
92
|
+
// `josh issue:plan` posts the plan under no API path of its own, so it is named outright — **as the
|
|
93
|
+
// command run**, at the start or after a `;` / `&&` / `|`, so a grep or a commit message that merely
|
|
94
|
+
// quotes it is not the call.
|
|
95
|
+
const ISSUE_PLAN_PATTERN = /(?:^|[;&|]\s*)pnpm\s+josh\s+issue:plan\b/u
|
|
96
|
+
|
|
92
97
|
// **The add form, not the label's name anywhere in the command.** The prerequisite branch removes the
|
|
93
98
|
// same label with `-X DELETE …/labels/in-progress`, which is a run ending its hold on an issue rather
|
|
94
99
|
// than opening one — matched loosely, that call would move the run's start to somewhere near its end.
|
|
@@ -159,6 +164,10 @@ function is_issue_comment(command: string): boolean {
|
|
|
159
164
|
return ISSUE_COMMENT_PATTERN.test(command) && BODY_FLAG_PATTERN.test(command)
|
|
160
165
|
}
|
|
161
166
|
|
|
167
|
+
function is_plan_write(command: string): boolean {
|
|
168
|
+
return is_api_body_write(command) || is_issue_comment(command) || ISSUE_PLAN_PATTERN.test(command)
|
|
169
|
+
}
|
|
170
|
+
|
|
162
171
|
function is_in_progress_label(command: string): boolean {
|
|
163
172
|
return ISSUE_LABELS_PATTERN.test(command) && command.includes(IN_PROGRESS_FIELD)
|
|
164
173
|
}
|
|
@@ -216,7 +225,7 @@ function bash_issue(command: string): number {
|
|
|
216
225
|
function bash_marker(command: string): PhaseMarker {
|
|
217
226
|
if (is_run_start(command)) return WORKFLOW_MARKER
|
|
218
227
|
|
|
219
|
-
return
|
|
228
|
+
return is_plan_write(command) ? PLAN_MARKER : NO_MARKER
|
|
220
229
|
}
|
|
221
230
|
|
|
222
231
|
const time_markers = {
|