@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
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
import { z } from 'zod'
|
|
2
|
+
|
|
3
|
+
// The shape of each line `lane-ledger.ts` appends and reads back — one schema per entry kind.
|
|
4
|
+
|
|
5
|
+
const KIND = {
|
|
6
|
+
MERGE: 'merge',
|
|
7
|
+
GATE: 'gate',
|
|
8
|
+
LOAD: 'load',
|
|
9
|
+
DISPATCH: 'dispatch',
|
|
10
|
+
STAGE: 'stage',
|
|
11
|
+
STOP: 'stop',
|
|
12
|
+
OVERLAP: 'overlap',
|
|
13
|
+
HELD: 'held',
|
|
14
|
+
RELEASED: 'released',
|
|
15
|
+
ROUND_TWO: 'round-two',
|
|
16
|
+
OFFERABLE: 'offerable',
|
|
17
|
+
CORE_WAIT: 'core-wait',
|
|
18
|
+
UNIT_FILES: 'unit-files',
|
|
19
|
+
TEST_RELATED: 'test-related',
|
|
20
|
+
} as const
|
|
21
|
+
|
|
22
|
+
const merge_schema = z.object({ kind: z.literal(KIND.MERGE), at: z.string(), issue: z.number() })
|
|
23
|
+
const check_schema = z.object({
|
|
24
|
+
label: z.string(),
|
|
25
|
+
elapsed_ms: z.number(),
|
|
26
|
+
is_passed: z.boolean(),
|
|
27
|
+
is_reused: z.boolean().optional(),
|
|
28
|
+
// The CPU milliseconds the check's process tree spent, so a core weight can be re-measured from
|
|
29
|
+
// the ledger (joshuafolkken/kit#4362). Absent where the gate could not read it (off macOS).
|
|
30
|
+
cpu_ms: z.number().optional(),
|
|
31
|
+
// Why the unit leg ran the whole suite instead of the related tests — a stable kind, never the
|
|
32
|
+
// file it names (joshuafolkken/kit#4397). Absent when it narrowed, and on every other check.
|
|
33
|
+
fallback: z.string().optional(),
|
|
34
|
+
// The unit leg's since-green no-op: nothing moved, so it ran no test (joshuafolkken/kit#4457).
|
|
35
|
+
is_unmoved: z.boolean().optional(),
|
|
36
|
+
// The width the check asked the core budget for, the width it ran at and how long it waited, so a
|
|
37
|
+
// unit claim's wait for room is read per run (joshuafolkken/kit#4451). Absent on a check that
|
|
38
|
+
// claimed none — a reused one, or one inside another gate's claim.
|
|
39
|
+
claim: z.object({ requested: z.number(), granted: z.number(), waited_ms: z.number() }).optional(),
|
|
40
|
+
})
|
|
41
|
+
const gate_schema = z.object({
|
|
42
|
+
kind: z.literal(KIND.GATE),
|
|
43
|
+
at: z.string(),
|
|
44
|
+
elapsed_ms: z.number(),
|
|
45
|
+
is_passed: z.boolean(),
|
|
46
|
+
// The unit suite's own duration, present when this gate ran it — the one
|
|
47
|
+
// record of a full vitest run `josh metrics` reads, so the suite is never timed twice.
|
|
48
|
+
unit_ms: z.number().optional(),
|
|
49
|
+
// The whole cores busy outside this gate, beyond the machine's baseline, at its start or its end —
|
|
50
|
+
// whichever was higher. Absent when the machine could not be read.
|
|
51
|
+
external_cores: z.number().optional(),
|
|
52
|
+
// Each check's own duration and verdict, so `josh lane:stats` can name the check a slow gate waited
|
|
53
|
+
// on. A reused check started no process: its row says so, and its zero is no timing.
|
|
54
|
+
checks: z.array(check_schema).optional(),
|
|
55
|
+
// A gate that reused a green record for this tree and base and started no check: counted, never
|
|
56
|
+
// timed (joshuafolkken/kit#4397).
|
|
57
|
+
is_reused: z.boolean().optional(),
|
|
58
|
+
})
|
|
59
|
+
// `available_mb`, `swapped_mb` and `lanes` are optional because each read can fail on its own — a
|
|
60
|
+
// platform with no memory reading, a `git worktree` call that did not answer — and a sample is still
|
|
61
|
+
// worth its load. `swapped_mb` is `machine_capacity`'s counter, every page swapped since boot.
|
|
62
|
+
// Both memory fields were renamed with their meaning (joshuafolkken/kit#3593): an older row's
|
|
63
|
+
// `free_mb` / `swap_mb` are stripped on read, so the two measurements never share a column.
|
|
64
|
+
const process_kind_schema = z.object({
|
|
65
|
+
kind: z.string(),
|
|
66
|
+
cpu_percent: z.number(),
|
|
67
|
+
rss_mb: z.number(),
|
|
68
|
+
count: z.number(),
|
|
69
|
+
})
|
|
70
|
+
const load_schema = z.object({
|
|
71
|
+
kind: z.literal(KIND.LOAD),
|
|
72
|
+
at: z.string(),
|
|
73
|
+
load: z.number(),
|
|
74
|
+
available_mb: z.number().optional(),
|
|
75
|
+
swapped_mb: z.number().optional(),
|
|
76
|
+
lanes: z.number().optional(),
|
|
77
|
+
// The heaviest process kinds at the instant of the sample (`lane-process-load.ts`), so the load the
|
|
78
|
+
// core budget's ledger does not explain can be read back by what made it (joshuafolkken/kit#3874).
|
|
79
|
+
processes: z.array(process_kind_schema).optional(),
|
|
80
|
+
})
|
|
81
|
+
// A lane child started on `issue` — the instant its implementation is timed from.
|
|
82
|
+
const dispatch_schema = z.object({
|
|
83
|
+
kind: z.literal(KIND.DISPATCH),
|
|
84
|
+
at: z.string(),
|
|
85
|
+
issue: z.number(),
|
|
86
|
+
})
|
|
87
|
+
// One finished stage of a lane's run, passed or failed: `at` is its end and `elapsed_ms` its length, so
|
|
88
|
+
// its start is read from the two. `issue` is absent where the writer does not hold one — `followup`'s
|
|
89
|
+
// CI wait, which is timed on a path that fails before the issue is known.
|
|
90
|
+
const stage_schema = z.object({
|
|
91
|
+
kind: z.literal(KIND.STAGE),
|
|
92
|
+
at: z.string(),
|
|
93
|
+
stage: z.string(),
|
|
94
|
+
elapsed_ms: z.number(),
|
|
95
|
+
issue: z.number().optional(),
|
|
96
|
+
})
|
|
97
|
+
// A `josh ship` that stopped on `issue`: `reason` is the stage it stopped at, or `conflict` — the
|
|
98
|
+
// retrospective's stop reason — and `cause` why (`run-ship-stop-cause.ts`), absent on a stop recorded
|
|
99
|
+
// before it had one. `preconditions` names the kinds a preflight stop found unmet (`run-ship-preflight.ts`),
|
|
100
|
+
// with `pre-detach` where a lane child's fast checks went red beside them (joshuafolkken/kit#4478),
|
|
101
|
+
// absent on any other stop and on one recorded before it had them. `findings` names the
|
|
102
|
+
// `<category>:<severity>` of each finding that decided a review or round-2 stop — the blocking ones, else
|
|
103
|
+
// the fixed ones (joshuafolkken/kit#4426),
|
|
104
|
+
// absent where none decided the stop. How long it stayed stopped is derived from the next ship stage, not recorded, so a
|
|
105
|
+
// resumed ship never has to know the stop it ends.
|
|
106
|
+
const stop_schema = z.object({
|
|
107
|
+
kind: z.literal(KIND.STOP),
|
|
108
|
+
at: z.string(),
|
|
109
|
+
issue: z.number(),
|
|
110
|
+
reason: z.string(),
|
|
111
|
+
cause: z.string().optional(),
|
|
112
|
+
preconditions: z.array(z.string()).optional(),
|
|
113
|
+
findings: z.array(z.string()).optional(),
|
|
114
|
+
})
|
|
115
|
+
// A `josh ship` on `issue` whose actual change overlapped the open pull requests of `lanes` on `paths`
|
|
116
|
+
// before its sync: it waited `waited_ms` for their ships to end, and `is_cleared` is false where the
|
|
117
|
+
// wait ran out first (joshuafolkken/kit#3901).
|
|
118
|
+
const overlap_schema = z.object({
|
|
119
|
+
kind: z.literal(KIND.OVERLAP),
|
|
120
|
+
at: z.string(),
|
|
121
|
+
issue: z.number(),
|
|
122
|
+
lanes: z.array(z.number()),
|
|
123
|
+
paths: z.array(z.string()),
|
|
124
|
+
waited_ms: z.number(),
|
|
125
|
+
is_cleared: z.boolean(),
|
|
126
|
+
})
|
|
127
|
+
// A `backlog:drive` pass that left a free lane empty: `reason` is why — the offer verdict that started
|
|
128
|
+
// nothing, or the hand-back that stopped the driver. How long the lane stayed empty is derived from the
|
|
129
|
+
// next `held`, `released` or `dispatch` entry, the way a stop's wait is (joshuafolkken/kit#3995).
|
|
130
|
+
// `waiting` names the issues a `chain` / `gate` hold waited on (joshuafolkken/kit#4513).
|
|
131
|
+
const held_schema = z.object({
|
|
132
|
+
kind: z.literal(KIND.HELD),
|
|
133
|
+
at: z.string(),
|
|
134
|
+
reason: z.string(),
|
|
135
|
+
waiting: z.array(z.number()).optional(),
|
|
136
|
+
})
|
|
137
|
+
// The end of a hold no dispatch ended: every lane taken — one opened outside the driver included — or
|
|
138
|
+
// the run finished, so no free lane is owed a child any more.
|
|
139
|
+
const released_schema = z.object({ kind: z.literal(KIND.RELEASED), at: z.string() })
|
|
140
|
+
// One `review:round2` decision a `josh ship` acted on for `issue`: `verdict` and the stable reason
|
|
141
|
+
// `code` it fell under, so the period's skips and runs are counted by why (joshuafolkken/kit#4064).
|
|
142
|
+
const round_two_schema = z.object({
|
|
143
|
+
kind: z.literal(KIND.ROUND_TWO),
|
|
144
|
+
at: z.string(),
|
|
145
|
+
issue: z.number(),
|
|
146
|
+
verdict: z.string(),
|
|
147
|
+
code: z.string(),
|
|
148
|
+
})
|
|
149
|
+
// A stall detector observation, written only when it changes: whether offerable backlog work and a free
|
|
150
|
+
// lane coexisted, so a stall is aged from when both first held rather than from the last launch
|
|
151
|
+
// (joshuafolkken/kit#4349).
|
|
152
|
+
const offerable_schema = z.object({
|
|
153
|
+
kind: z.literal(KIND.OFFERABLE),
|
|
154
|
+
at: z.string(),
|
|
155
|
+
is_offerable: z.boolean(),
|
|
156
|
+
})
|
|
157
|
+
// One claim that waited `waited_ms` for the core budget before `command` could start — written by the
|
|
158
|
+
// command itself, so a wait inside a gate, a scoped check or a ship lands in one record. `issue` is the
|
|
159
|
+
// lane the claim ran in, absent outside a lane (joshuafolkken/kit#4382).
|
|
160
|
+
const core_wait_schema = z.object({
|
|
161
|
+
kind: z.literal(KIND.CORE_WAIT),
|
|
162
|
+
at: z.string(),
|
|
163
|
+
command: z.string(),
|
|
164
|
+
waited_ms: z.number(),
|
|
165
|
+
issue: z.number().optional(),
|
|
166
|
+
})
|
|
167
|
+
// One vitest run's slowest test files, each with its wall time from environment setup to its last
|
|
168
|
+
// test, so a unit run whose wall time far outran its CPU names the file it stalled on
|
|
169
|
+
// (joshuafolkken/kit#4451). Written by the run itself (`tools/test/unit-file-reporter.ts`).
|
|
170
|
+
const unit_file_schema = z.object({ file: z.string(), elapsed_ms: z.number() })
|
|
171
|
+
const unit_files_schema = z.object({
|
|
172
|
+
kind: z.literal(KIND.UNIT_FILES),
|
|
173
|
+
at: z.string(),
|
|
174
|
+
files: z.array(unit_file_schema),
|
|
175
|
+
})
|
|
176
|
+
// One `josh test:related` run (joshuafolkken/kit#4465): `scope` is `related`, `none` or the full-suite
|
|
177
|
+
// fallback kind; the four counts are its input — the change itself, what a main sync brought into it,
|
|
178
|
+
// what the change since the test-read map's tree joined to it and the map's readers — and `test_files`
|
|
179
|
+
// how many vitest ran, absent where none reported. `trigger_files` are the changed files that sent a
|
|
180
|
+
// full-suite run there, absent where none did and on rows written before it (joshuafolkken/kit#4510).
|
|
181
|
+
const test_related_schema = z.object({
|
|
182
|
+
kind: z.literal(KIND.TEST_RELATED),
|
|
183
|
+
at: z.string(),
|
|
184
|
+
scope: z.string(),
|
|
185
|
+
changed: z.number(),
|
|
186
|
+
synced: z.number(),
|
|
187
|
+
since_map: z.number(),
|
|
188
|
+
readers: z.number(),
|
|
189
|
+
test_files: z.number().optional(),
|
|
190
|
+
trigger_files: z.array(z.string()).optional(),
|
|
191
|
+
elapsed_ms: z.number(),
|
|
192
|
+
})
|
|
193
|
+
const entry_schema = z.discriminatedUnion('kind', [
|
|
194
|
+
merge_schema,
|
|
195
|
+
gate_schema,
|
|
196
|
+
load_schema,
|
|
197
|
+
dispatch_schema,
|
|
198
|
+
stage_schema,
|
|
199
|
+
stop_schema,
|
|
200
|
+
overlap_schema,
|
|
201
|
+
held_schema,
|
|
202
|
+
released_schema,
|
|
203
|
+
round_two_schema,
|
|
204
|
+
offerable_schema,
|
|
205
|
+
core_wait_schema,
|
|
206
|
+
unit_files_schema,
|
|
207
|
+
test_related_schema,
|
|
208
|
+
])
|
|
209
|
+
|
|
210
|
+
type LedgerEntry = z.infer<typeof entry_schema>
|
|
211
|
+
type MergeEntry = z.infer<typeof merge_schema>
|
|
212
|
+
type GateEntry = z.infer<typeof gate_schema>
|
|
213
|
+
type LoadEntry = z.infer<typeof load_schema>
|
|
214
|
+
type DispatchEntry = z.infer<typeof dispatch_schema>
|
|
215
|
+
type StageEntry = z.infer<typeof stage_schema>
|
|
216
|
+
type StopEntry = z.infer<typeof stop_schema>
|
|
217
|
+
type OverlapEntry = z.infer<typeof overlap_schema>
|
|
218
|
+
type HeldEntry = z.infer<typeof held_schema>
|
|
219
|
+
type RoundTwoEntry = z.infer<typeof round_two_schema>
|
|
220
|
+
type OfferableEntry = z.infer<typeof offerable_schema>
|
|
221
|
+
type CoreWaitEntry = z.infer<typeof core_wait_schema>
|
|
222
|
+
type CoreWaitRecord = Omit<CoreWaitEntry, 'kind' | 'at'>
|
|
223
|
+
type UnitFilesEntry = z.infer<typeof unit_files_schema>
|
|
224
|
+
type UnitFileRecord = z.infer<typeof unit_file_schema>
|
|
225
|
+
type TestRelatedEntry = z.infer<typeof test_related_schema>
|
|
226
|
+
type TestRelatedRecord = Omit<TestRelatedEntry, 'kind' | 'at'>
|
|
227
|
+
type RoundTwoRecord = Omit<RoundTwoEntry, 'kind' | 'at'>
|
|
228
|
+
// What a finished gate reports; the ledger stamps the kind and the time.
|
|
229
|
+
type GateRecord = Omit<GateEntry, 'kind' | 'at'>
|
|
230
|
+
type GateCheckRecord = z.infer<typeof check_schema>
|
|
231
|
+
type StageRecord = Omit<StageEntry, 'kind' | 'at'>
|
|
232
|
+
type StopRecord = Omit<StopEntry, 'kind' | 'at'>
|
|
233
|
+
type OverlapRecord = Omit<OverlapEntry, 'kind' | 'at'>
|
|
234
|
+
type HeldRecord = Omit<HeldEntry, 'kind' | 'at' | 'waiting'> & {
|
|
235
|
+
waiting?: ReadonlyArray<number> | undefined
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
const lane_ledger_schema = { KIND, entry_schema }
|
|
239
|
+
|
|
240
|
+
export type {
|
|
241
|
+
CoreWaitEntry,
|
|
242
|
+
CoreWaitRecord,
|
|
243
|
+
DispatchEntry,
|
|
244
|
+
GateCheckRecord,
|
|
245
|
+
GateEntry,
|
|
246
|
+
GateRecord,
|
|
247
|
+
HeldEntry,
|
|
248
|
+
HeldRecord,
|
|
249
|
+
LedgerEntry,
|
|
250
|
+
LoadEntry,
|
|
251
|
+
MergeEntry,
|
|
252
|
+
OfferableEntry,
|
|
253
|
+
OverlapEntry,
|
|
254
|
+
OverlapRecord,
|
|
255
|
+
RoundTwoEntry,
|
|
256
|
+
RoundTwoRecord,
|
|
257
|
+
StageEntry,
|
|
258
|
+
StageRecord,
|
|
259
|
+
StopEntry,
|
|
260
|
+
StopRecord,
|
|
261
|
+
TestRelatedEntry,
|
|
262
|
+
TestRelatedRecord,
|
|
263
|
+
UnitFileRecord,
|
|
264
|
+
UnitFilesEntry,
|
|
265
|
+
}
|
|
266
|
+
export { lane_ledger_schema }
|
|
@@ -1,12 +1,26 @@
|
|
|
1
1
|
import { closeSync, constants, openSync, writeSync } from 'node:fs'
|
|
2
2
|
import { stamp_file } from '#scripts/josh/stamp-file'
|
|
3
3
|
import { json_value } from '#scripts/lib/json-value'
|
|
4
|
+
import { stamped_memo } from '#scripts/lib/stamped-memo'
|
|
4
5
|
import { run_carry } from '#scripts/run/carry/run-carry'
|
|
5
|
-
import {
|
|
6
|
+
import {
|
|
7
|
+
lane_ledger_schema,
|
|
8
|
+
type CoreWaitRecord,
|
|
9
|
+
type GateRecord,
|
|
10
|
+
type HeldRecord,
|
|
11
|
+
type LedgerEntry,
|
|
12
|
+
type OverlapRecord,
|
|
13
|
+
type RoundTwoRecord,
|
|
14
|
+
type StageRecord,
|
|
15
|
+
type StopRecord,
|
|
16
|
+
type TestRelatedRecord,
|
|
17
|
+
type UnitFileRecord,
|
|
18
|
+
} from './lane-ledger-schema'
|
|
6
19
|
|
|
7
20
|
// The measurement ledger the lane limit is tuned against: one JSON line per
|
|
8
21
|
// lane merge, per finished `josh gate`, per machine-load sample, per lane dispatch, per finished
|
|
9
|
-
// `josh ship` stage
|
|
22
|
+
// `josh ship` stage, per stopped `josh ship`, per round-2 decision, per core-budget wait and per
|
|
23
|
+
// `josh test:related` run, read back by `josh lane:stats`. Each line's shape is `lane-ledger-schema.ts`.
|
|
10
24
|
//
|
|
11
25
|
// **Its own file rather than the run's event stream.** The stream is capped at 500 events and is
|
|
12
26
|
// rewritten whole on every append, which is right for "where is the run" and wrong for a measurement
|
|
@@ -23,127 +37,20 @@ const LEDGER_SUFFIX = '.jsonl'
|
|
|
23
37
|
const LINE_SEPARATOR = '\n'
|
|
24
38
|
// `followup`'s wait for CI — a stage of a lane's run that no `josh ship` stage is the whole of.
|
|
25
39
|
const CI_WAIT_STAGE = 'ci-wait'
|
|
40
|
+
// The part of `followup`'s waits CodeRabbit spent running or rate-limited, and the rate-limited part
|
|
41
|
+
// alone (joshuafolkken/kit#4574).
|
|
42
|
+
const CODERABBIT_WAIT_STAGE = 'coderabbit-wait'
|
|
43
|
+
const CODERABBIT_RATE_LIMIT_STAGE = 'coderabbit-rate-limit'
|
|
44
|
+
// A detached `josh ship`'s fast checks in the agent's own turn — not a resumable ship stage, since the
|
|
45
|
+
// supervised gate runs them again (joshuafolkken/kit#4382).
|
|
46
|
+
const PRE_DETACH_STAGE = 'pre-detach'
|
|
26
47
|
const LEDGER_FILE_MODE = 0o600
|
|
27
48
|
// The flags `detached-launch.ts` appends its log with, for the same deterministic shared-temp path.
|
|
28
49
|
const { O_APPEND, O_CREAT, O_NOFOLLOW, O_WRONLY } = constants
|
|
29
50
|
// eslint-disable-next-line no-bitwise -- POSIX open flags are a bit field; `||` here would be a bug
|
|
30
51
|
const APPEND_FLAGS = O_WRONLY | O_APPEND | O_CREAT | O_NOFOLLOW
|
|
31
52
|
|
|
32
|
-
const KIND =
|
|
33
|
-
MERGE: 'merge',
|
|
34
|
-
GATE: 'gate',
|
|
35
|
-
LOAD: 'load',
|
|
36
|
-
DISPATCH: 'dispatch',
|
|
37
|
-
STAGE: 'stage',
|
|
38
|
-
STOP: 'stop',
|
|
39
|
-
OVERLAP: 'overlap',
|
|
40
|
-
} as const
|
|
41
|
-
|
|
42
|
-
const merge_schema = z.object({ kind: z.literal(KIND.MERGE), at: z.string(), issue: z.number() })
|
|
43
|
-
const check_schema = z.object({
|
|
44
|
-
label: z.string(),
|
|
45
|
-
elapsed_ms: z.number(),
|
|
46
|
-
is_passed: z.boolean(),
|
|
47
|
-
is_reused: z.boolean().optional(),
|
|
48
|
-
})
|
|
49
|
-
const gate_schema = z.object({
|
|
50
|
-
kind: z.literal(KIND.GATE),
|
|
51
|
-
at: z.string(),
|
|
52
|
-
elapsed_ms: z.number(),
|
|
53
|
-
is_passed: z.boolean(),
|
|
54
|
-
// The unit suite's own duration, present when this gate ran it — the one
|
|
55
|
-
// record of a full vitest run `josh metrics` reads, so the suite is never timed twice.
|
|
56
|
-
unit_ms: z.number().optional(),
|
|
57
|
-
// The whole cores busy outside this gate, beyond the machine's baseline, at its start or its end —
|
|
58
|
-
// whichever was higher. Absent when the machine could not be read.
|
|
59
|
-
external_cores: z.number().optional(),
|
|
60
|
-
// Each check's own duration and verdict, so `josh lane:stats` can name the check a slow gate waited
|
|
61
|
-
// on. A reused check started no process: its row says so, and its zero is no timing.
|
|
62
|
-
checks: z.array(check_schema).optional(),
|
|
63
|
-
})
|
|
64
|
-
// `available_mb`, `swapped_mb` and `lanes` are optional because each read can fail on its own — a
|
|
65
|
-
// platform with no memory reading, a `git worktree` call that did not answer — and a sample is still
|
|
66
|
-
// worth its load. `swapped_mb` is `machine_capacity`'s counter, every page swapped since boot.
|
|
67
|
-
// Both memory fields were renamed with their meaning (joshuafolkken/kit#3593): an older row's
|
|
68
|
-
// `free_mb` / `swap_mb` are stripped on read, so the two measurements never share a column.
|
|
69
|
-
const process_kind_schema = z.object({
|
|
70
|
-
kind: z.string(),
|
|
71
|
-
cpu_percent: z.number(),
|
|
72
|
-
rss_mb: z.number(),
|
|
73
|
-
count: z.number(),
|
|
74
|
-
})
|
|
75
|
-
const load_schema = z.object({
|
|
76
|
-
kind: z.literal(KIND.LOAD),
|
|
77
|
-
at: z.string(),
|
|
78
|
-
load: z.number(),
|
|
79
|
-
available_mb: z.number().optional(),
|
|
80
|
-
swapped_mb: z.number().optional(),
|
|
81
|
-
lanes: z.number().optional(),
|
|
82
|
-
// The heaviest process kinds at the instant of the sample (`lane-process-load.ts`), so the load the
|
|
83
|
-
// core budget's ledger does not explain can be read back by what made it (joshuafolkken/kit#3874).
|
|
84
|
-
processes: z.array(process_kind_schema).optional(),
|
|
85
|
-
})
|
|
86
|
-
// A lane child started on `issue` — the instant its implementation is timed from.
|
|
87
|
-
const dispatch_schema = z.object({
|
|
88
|
-
kind: z.literal(KIND.DISPATCH),
|
|
89
|
-
at: z.string(),
|
|
90
|
-
issue: z.number(),
|
|
91
|
-
})
|
|
92
|
-
// One finished stage of a lane's run, passed or failed: `at` is its end and `elapsed_ms` its length, so
|
|
93
|
-
// its start is read from the two. `issue` is absent where the writer does not hold one — `followup`'s
|
|
94
|
-
// CI wait, which is timed on a path that fails before the issue is known.
|
|
95
|
-
const stage_schema = z.object({
|
|
96
|
-
kind: z.literal(KIND.STAGE),
|
|
97
|
-
at: z.string(),
|
|
98
|
-
stage: z.string(),
|
|
99
|
-
elapsed_ms: z.number(),
|
|
100
|
-
issue: z.number().optional(),
|
|
101
|
-
})
|
|
102
|
-
// A `josh ship` that stopped on `issue`: `reason` is the stage it stopped at, or `conflict` — the
|
|
103
|
-
// retrospective's stop reason. How long it stayed stopped is derived from the next ship stage, not
|
|
104
|
-
// recorded, so a resumed ship never has to know the stop it ends.
|
|
105
|
-
const stop_schema = z.object({
|
|
106
|
-
kind: z.literal(KIND.STOP),
|
|
107
|
-
at: z.string(),
|
|
108
|
-
issue: z.number(),
|
|
109
|
-
reason: z.string(),
|
|
110
|
-
})
|
|
111
|
-
// A `josh ship` on `issue` whose actual change overlapped the open pull requests of `lanes` on `paths`
|
|
112
|
-
// before its sync: it waited `waited_ms` for their ships to end, and `is_cleared` is false where the
|
|
113
|
-
// wait ran out first (joshuafolkken/kit#3901).
|
|
114
|
-
const overlap_schema = z.object({
|
|
115
|
-
kind: z.literal(KIND.OVERLAP),
|
|
116
|
-
at: z.string(),
|
|
117
|
-
issue: z.number(),
|
|
118
|
-
lanes: z.array(z.number()),
|
|
119
|
-
paths: z.array(z.string()),
|
|
120
|
-
waited_ms: z.number(),
|
|
121
|
-
is_cleared: z.boolean(),
|
|
122
|
-
})
|
|
123
|
-
const entry_schema = z.discriminatedUnion('kind', [
|
|
124
|
-
merge_schema,
|
|
125
|
-
gate_schema,
|
|
126
|
-
load_schema,
|
|
127
|
-
dispatch_schema,
|
|
128
|
-
stage_schema,
|
|
129
|
-
stop_schema,
|
|
130
|
-
overlap_schema,
|
|
131
|
-
])
|
|
132
|
-
|
|
133
|
-
type LedgerEntry = z.infer<typeof entry_schema>
|
|
134
|
-
type MergeEntry = z.infer<typeof merge_schema>
|
|
135
|
-
type GateEntry = z.infer<typeof gate_schema>
|
|
136
|
-
type LoadEntry = z.infer<typeof load_schema>
|
|
137
|
-
type DispatchEntry = z.infer<typeof dispatch_schema>
|
|
138
|
-
type StageEntry = z.infer<typeof stage_schema>
|
|
139
|
-
type StopEntry = z.infer<typeof stop_schema>
|
|
140
|
-
type OverlapEntry = z.infer<typeof overlap_schema>
|
|
141
|
-
// What a finished gate reports; the ledger stamps the kind and the time.
|
|
142
|
-
type GateRecord = Omit<GateEntry, 'kind' | 'at'>
|
|
143
|
-
type GateCheckRecord = z.infer<typeof check_schema>
|
|
144
|
-
type StageRecord = Omit<StageEntry, 'kind' | 'at'>
|
|
145
|
-
type StopRecord = Omit<StopEntry, 'kind' | 'at'>
|
|
146
|
-
type OverlapRecord = Omit<OverlapEntry, 'kind' | 'at'>
|
|
53
|
+
const { KIND, entry_schema } = lane_ledger_schema
|
|
147
54
|
|
|
148
55
|
function target_of(repository: string): string {
|
|
149
56
|
return stamp_file.stamp_path(LEDGER_PREFIX, repository, LEDGER_SUFFIX)
|
|
@@ -170,8 +77,8 @@ async function target(): Promise<string | undefined> {
|
|
|
170
77
|
|
|
171
78
|
// **Append, never rewrite** — `O_APPEND` keeps each short line whole across concurrent writers, and
|
|
172
79
|
// `O_NOFOLLOW` plus `stamp_file`'s ownership test keep a planted link or another account's file from
|
|
173
|
-
// receiving it.
|
|
174
|
-
function append(path: string, entry:
|
|
80
|
+
// receiving it. Any JSON-lines log takes it — the durable review stop log too (joshuafolkken/kit#4519).
|
|
81
|
+
function append(path: string, entry: object): void {
|
|
175
82
|
const descriptor = openSync(path, APPEND_FLAGS, LEDGER_FILE_MODE)
|
|
176
83
|
|
|
177
84
|
try {
|
|
@@ -224,6 +131,41 @@ async function record_overlap(overlap: OverlapRecord, path?: string): Promise<vo
|
|
|
224
131
|
await record({ kind: KIND.OVERLAP, at: now_iso(), ...overlap }, path)
|
|
225
132
|
}
|
|
226
133
|
|
|
134
|
+
// `waiting` is written only when the offer named issues, so a hold that waited on none stays one short line.
|
|
135
|
+
async function record_held(held: HeldRecord, path?: string): Promise<void> {
|
|
136
|
+
const waiting = held.waiting ?? []
|
|
137
|
+
const named = waiting.length > 0 ? { waiting: [...waiting] } : {}
|
|
138
|
+
|
|
139
|
+
await record({ kind: KIND.HELD, at: now_iso(), reason: held.reason, ...named }, path)
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
async function record_released(path?: string): Promise<void> {
|
|
143
|
+
await record({ kind: KIND.RELEASED, at: now_iso() }, path)
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
async function record_offerable(is_offerable: boolean, path?: string): Promise<void> {
|
|
147
|
+
await record({ kind: KIND.OFFERABLE, at: now_iso(), is_offerable }, path)
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
async function record_round_two(round_two: RoundTwoRecord, path?: string): Promise<void> {
|
|
151
|
+
await record({ kind: KIND.ROUND_TWO, at: now_iso(), ...round_two }, path)
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
async function record_core_wait(wait: CoreWaitRecord, path?: string): Promise<void> {
|
|
155
|
+
await record({ kind: KIND.CORE_WAIT, at: now_iso(), ...wait }, path)
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
async function record_unit_files(
|
|
159
|
+
files: ReadonlyArray<UnitFileRecord>,
|
|
160
|
+
path?: string,
|
|
161
|
+
): Promise<void> {
|
|
162
|
+
await record({ kind: KIND.UNIT_FILES, at: now_iso(), files: [...files] }, path)
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
async function record_test_related(run: TestRelatedRecord, path?: string): Promise<void> {
|
|
166
|
+
await record({ kind: KIND.TEST_RELATED, at: now_iso(), ...run }, path)
|
|
167
|
+
}
|
|
168
|
+
|
|
227
169
|
function parse_line(line: string): LedgerEntry | undefined {
|
|
228
170
|
return entry_schema.safeParse(json_value.parse_or_undefined(line)).data
|
|
229
171
|
}
|
|
@@ -232,9 +174,7 @@ function is_present(entry: LedgerEntry | undefined): entry is LedgerEntry {
|
|
|
232
174
|
return entry !== undefined
|
|
233
175
|
}
|
|
234
176
|
|
|
235
|
-
|
|
236
|
-
// whole ledger unreadable, and an absent or unowned file is an empty ledger.
|
|
237
|
-
function read_entries(path: string): ReadonlyArray<LedgerEntry> {
|
|
177
|
+
function parse_entries(path: string): ReadonlyArray<LedgerEntry> {
|
|
238
178
|
const raw = stamp_file.read_stamp_text(path)
|
|
239
179
|
|
|
240
180
|
if (raw === undefined) return []
|
|
@@ -245,32 +185,61 @@ function read_entries(path: string): ReadonlyArray<LedgerEntry> {
|
|
|
245
185
|
.filter(is_present)
|
|
246
186
|
}
|
|
247
187
|
|
|
188
|
+
// Each ledger's entries, parsed again only once the file itself has changed (joshuafolkken/kit#4263).
|
|
189
|
+
const parsed_ledgers = stamped_memo.create<ReadonlyArray<LedgerEntry>>()
|
|
190
|
+
|
|
191
|
+
// Every entry, oldest first. A malformed line — a write cut short — is skipped rather than making the
|
|
192
|
+
// whole ledger unreadable, and an absent or unowned file is an empty ledger.
|
|
193
|
+
function read_entries(path: string): ReadonlyArray<LedgerEntry> {
|
|
194
|
+
return parsed_ledgers.of(path, stamped_memo.file_stamp(path), () => parse_entries(path))
|
|
195
|
+
}
|
|
196
|
+
|
|
248
197
|
const lane_ledger = {
|
|
249
198
|
CI_WAIT_STAGE,
|
|
199
|
+
CODERABBIT_RATE_LIMIT_STAGE,
|
|
200
|
+
CODERABBIT_WAIT_STAGE,
|
|
250
201
|
KIND,
|
|
202
|
+
PRE_DETACH_STAGE,
|
|
251
203
|
append,
|
|
252
204
|
read_entries,
|
|
253
205
|
record,
|
|
206
|
+
record_core_wait,
|
|
254
207
|
record_dispatch,
|
|
255
208
|
record_gate,
|
|
209
|
+
record_held,
|
|
210
|
+
record_released,
|
|
256
211
|
record_merge,
|
|
257
212
|
record_overlap,
|
|
213
|
+
record_offerable,
|
|
214
|
+
record_round_two,
|
|
258
215
|
record_stage,
|
|
259
216
|
record_stop,
|
|
217
|
+
record_test_related,
|
|
218
|
+
record_unit_files,
|
|
260
219
|
target,
|
|
261
220
|
target_of,
|
|
262
221
|
}
|
|
263
222
|
|
|
264
223
|
export type {
|
|
224
|
+
CoreWaitEntry,
|
|
225
|
+
CoreWaitRecord,
|
|
265
226
|
DispatchEntry,
|
|
266
227
|
GateCheckRecord,
|
|
267
228
|
GateEntry,
|
|
229
|
+
HeldEntry,
|
|
268
230
|
LedgerEntry,
|
|
269
231
|
LoadEntry,
|
|
270
232
|
MergeEntry,
|
|
233
|
+
OfferableEntry,
|
|
271
234
|
OverlapEntry,
|
|
272
235
|
OverlapRecord,
|
|
236
|
+
RoundTwoEntry,
|
|
273
237
|
StageEntry,
|
|
274
238
|
StopEntry,
|
|
275
|
-
|
|
239
|
+
StopRecord,
|
|
240
|
+
TestRelatedEntry,
|
|
241
|
+
TestRelatedRecord,
|
|
242
|
+
UnitFileRecord,
|
|
243
|
+
UnitFilesEntry,
|
|
244
|
+
} from './lane-ledger-schema'
|
|
276
245
|
export { lane_ledger }
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
#!/usr/bin/env tsx
|
|
2
2
|
import { fileURLToPath } from 'node:url'
|
|
3
3
|
import { backlog_ready, type LaneUse } from '#scripts/backlog/backlog-ready'
|
|
4
|
+
import { session_cite } from '#scripts/issue/session-cite'
|
|
4
5
|
import { cli_flags } from '#scripts/lib/cli-flags'
|
|
5
6
|
import { lane_capacity, type LimitChoice } from './lane-capacity'
|
|
6
7
|
import { lane_limit_override } from './lane-limit-override'
|
|
8
|
+
import { lane_state } from './lane-state'
|
|
7
9
|
|
|
8
10
|
// `josh lane:limit [<limit>] [--reset]` — change a live `backlogrun`'s lane limit without stopping it.
|
|
9
11
|
// A running parent keeps the environment it started with, so `JOSH_LANE_LIMIT`
|
|
@@ -96,12 +98,21 @@ function limit_text(limit: number): string {
|
|
|
96
98
|
: `${String(seated)} (${String(limit)} capped at the seats)`
|
|
97
99
|
}
|
|
98
100
|
|
|
101
|
+
// The lanes with no state record, counted in use since their state is unknown.
|
|
102
|
+
function unknown_text(unknown: ReadonlyArray<string>): string {
|
|
103
|
+
if (unknown.length === 0) return ''
|
|
104
|
+
|
|
105
|
+
const issues = unknown.map((issue) => session_cite.issue(issue)).join(' ')
|
|
106
|
+
|
|
107
|
+
return ` · ${issues}: ${lane_state.NO_STATE_HINT}`
|
|
108
|
+
}
|
|
109
|
+
|
|
99
110
|
function status_line(status: LimitStatus): string {
|
|
100
111
|
const source = status.override === undefined ? lane_capacity.LANE_LIMIT_KEY : OVERRIDE_SOURCE
|
|
101
112
|
const { occupied, seated } = status.use
|
|
102
113
|
const free = lane_capacity.free_lanes(status.limit, occupied, seated)
|
|
103
114
|
|
|
104
|
-
return `lane limit ${limit_text(status.limit)} (${source}) · in use ${String(occupied)} · free ${String(free)}`
|
|
115
|
+
return `lane limit ${limit_text(status.limit)} (${source}) · in use ${String(occupied)} · free ${String(free)}${unknown_text(status.use.unknown)}`
|
|
105
116
|
}
|
|
106
117
|
|
|
107
118
|
async function show(ports: LimitPorts): Promise<number> {
|