@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,66 @@
|
|
|
1
|
+
import { lane_ledger, type CoreWaitEntry, type LedgerEntry } from './lane-ledger'
|
|
2
|
+
import { lane_stage_stats } from './lane-stage-stats'
|
|
3
|
+
import { lane_stats, type StatsWindow } from './lane-stats'
|
|
4
|
+
|
|
5
|
+
// How long each lane's commands waited for the core budget: the ledger's `core-wait` entries of one
|
|
6
|
+
// period reduced to one row per lane, printed by `josh lane:stats` so a lane's time splits into work
|
|
7
|
+
// and waiting (joshuafolkken/kit#4382). A lane is named by its issue number, a wait outside a lane — the
|
|
8
|
+
// main checkout's — by its own row.
|
|
9
|
+
|
|
10
|
+
const COLUMNS = ['lane', 'total (min)', 'median (min)', 'waits'] as const
|
|
11
|
+
const OUTSIDE_A_LANE = 'outside a lane'
|
|
12
|
+
const { NOT_MEASURED } = lane_stage_stats
|
|
13
|
+
// A period with no wait: the table still prints, so a reader sees zero waits rather than no table.
|
|
14
|
+
const NONE_ROW = ['none', NOT_MEASURED, NOT_MEASURED, '0']
|
|
15
|
+
|
|
16
|
+
function is_core_wait(entry: LedgerEntry): entry is CoreWaitEntry {
|
|
17
|
+
return entry.kind === lane_ledger.KIND.CORE_WAIT
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
function lane_of(wait: CoreWaitEntry): string {
|
|
21
|
+
return wait.issue === undefined ? OUTSIDE_A_LANE : String(wait.issue)
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function total(values: ReadonlyArray<number>): number {
|
|
25
|
+
return values.reduce((sum, value) => sum + value, 0)
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function waits_of(waits: ReadonlyArray<CoreWaitEntry>, lane: string): Array<number> {
|
|
29
|
+
return waits.filter((wait) => lane_of(wait) === lane).map((wait) => wait.waited_ms)
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function lane_row(lane: string, waits: ReadonlyArray<CoreWaitEntry>): string {
|
|
33
|
+
const waited = waits_of(waits, lane)
|
|
34
|
+
|
|
35
|
+
return lane_stats.to_row([
|
|
36
|
+
lane,
|
|
37
|
+
lane_stage_stats.cell(total(waited)),
|
|
38
|
+
lane_stage_stats.cell(lane_stats.median(waited)),
|
|
39
|
+
String(waited.length),
|
|
40
|
+
])
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// The lanes the period saw, the longest total first, so the lane the budget held back most leads.
|
|
44
|
+
function lanes_of(waits: ReadonlyArray<CoreWaitEntry>): Array<string> {
|
|
45
|
+
const lanes = [...new Set(waits.map((wait) => lane_of(wait)))]
|
|
46
|
+
|
|
47
|
+
return lanes.toSorted(
|
|
48
|
+
(left, right) => total(waits_of(waits, right)) - total(waits_of(waits, left)),
|
|
49
|
+
)
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// The period's table: `entries` is the whole ledger, filtered here to `window`.
|
|
53
|
+
function table(entries: ReadonlyArray<LedgerEntry>, window: StatsWindow): string {
|
|
54
|
+
const waits = lane_stats.in_window(entries, window).filter((entry) => is_core_wait(entry))
|
|
55
|
+
const rows = lanes_of(waits).map((lane) => lane_row(lane, waits))
|
|
56
|
+
|
|
57
|
+
return [
|
|
58
|
+
lane_stats.to_row(COLUMNS),
|
|
59
|
+
lane_stats.to_row(COLUMNS.map(() => '---')),
|
|
60
|
+
...(rows.length === 0 ? [lane_stats.to_row(NONE_ROW)] : rows),
|
|
61
|
+
].join('\n')
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
const lane_core_wait_stats = { table }
|
|
65
|
+
|
|
66
|
+
export { lane_core_wait_stats }
|
|
@@ -10,6 +10,7 @@ import { telegram_notify } from '#scripts/notify/telegram-notify'
|
|
|
10
10
|
import { detached_launch, type LaunchArgv } from '#scripts/run/detached-launch'
|
|
11
11
|
import { run_event_stream } from '#scripts/run/event/run-event-stream'
|
|
12
12
|
import { run_event_stream_emit } from '#scripts/run/event/run-event-stream-emit'
|
|
13
|
+
import { run_park } from '#scripts/run/park/run-park'
|
|
13
14
|
import { run_ending } from '#scripts/run/run-ending'
|
|
14
15
|
import { run_label } from '#scripts/run/run-label'
|
|
15
16
|
import { lane_child_invocation } from './lane-child-invocation'
|
|
@@ -19,6 +20,7 @@ import { lane_ledger } from './lane-ledger'
|
|
|
19
20
|
import { lane_output } from './lane-output'
|
|
20
21
|
import { lane_registry, type LaneInfo } from './lane-registry'
|
|
21
22
|
import { lane_resume, type ResumePlan } from './lane-resume'
|
|
23
|
+
import { lane_state } from './lane-state'
|
|
22
24
|
import { openai_lane_supervisor } from './openai-lane-supervisor'
|
|
23
25
|
|
|
24
26
|
// `josh lane:dispatch <issue-number>` — start a lane's child as an operating-system process of its own.
|
|
@@ -244,10 +246,15 @@ async function dispatched_start(
|
|
|
244
246
|
: dispatched_of(request, pid, notes)
|
|
245
247
|
}
|
|
246
248
|
|
|
249
|
+
// **A dispatch takes back any park the issue's earlier child recorded**: the issue is offered
|
|
250
|
+
// again only once `needs-decision` is off, so a record still on disk is one a person cleared by hand on
|
|
251
|
+
// GitHub, and left in place it would silence `lane-park` on this child's own stop
|
|
252
|
+
// (joshuafolkken/kit#4132).
|
|
247
253
|
async function started(request: StartRequest): Promise<DispatchOutcome> {
|
|
248
254
|
const notes: Array<string> = []
|
|
249
255
|
const existing = existing_dispatch(request)
|
|
250
256
|
if (existing !== undefined) return existing
|
|
257
|
+
run_park.clear(request.lane.issue, request.lane.directory)
|
|
251
258
|
const nonce =
|
|
252
259
|
request.profile.provider === 'openai' ? openai_lane_supervisor.new_nonce() : undefined
|
|
253
260
|
const result = detached_launch.launch(
|
|
@@ -327,13 +334,27 @@ async function mark_in_progress(issue: string): Promise<LabelWrite> {
|
|
|
327
334
|
// removal warns and never throws, so it cannot turn a launch failure into a thrown error.
|
|
328
335
|
//
|
|
329
336
|
// The lane ledger takes the same instant: `lane:stats` times a lane's implementation from it, and the
|
|
330
|
-
// stream is capped, so a period's earlier dispatches would be gone from there.
|
|
331
|
-
|
|
337
|
+
// stream is capped, so a period's earlier dispatches would be gone from there. The lane's state record
|
|
338
|
+
// takes the stream's launch instant as its own, so `run:board`, which reads the lane's events from
|
|
339
|
+
// the record's launch on, keeps the launch event that opens them (joshuafolkken/kit#4269).
|
|
340
|
+
async function record_started(issue: string, start: DispatchStart): Promise<void> {
|
|
341
|
+
const now = new Date()
|
|
342
|
+
|
|
332
343
|
await run_event_stream_emit.emit(
|
|
333
344
|
run_event_stream.EVENT_KIND.CHILD_LAUNCH,
|
|
334
345
|
`${issue_cite.plain(issue)} dispatched`,
|
|
346
|
+
now,
|
|
335
347
|
)
|
|
336
348
|
await lane_ledger.record_dispatch(Number(issue))
|
|
349
|
+
await lane_state.record_change(
|
|
350
|
+
{
|
|
351
|
+
issue,
|
|
352
|
+
state: 'running',
|
|
353
|
+
command: start === RESTART_START ? 'lane:restart' : 'lane:dispatch',
|
|
354
|
+
is_launch: true,
|
|
355
|
+
},
|
|
356
|
+
{ now },
|
|
357
|
+
)
|
|
337
358
|
}
|
|
338
359
|
|
|
339
360
|
// How a dispatch begins. A `resumable` one claims the marker itself and resumes an `outage` session; a
|
|
@@ -359,7 +380,7 @@ async function finish_dispatch(
|
|
|
359
380
|
|
|
360
381
|
const is_failed = outcome.kind === 'failed'
|
|
361
382
|
|
|
362
|
-
await (is_failed ? run_label.unmark(issue) : record_started(issue))
|
|
383
|
+
await (is_failed ? run_label.unmark(issue) : record_started(issue, start))
|
|
363
384
|
|
|
364
385
|
return outcome
|
|
365
386
|
}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import { agent_role_profile } from '#scripts/agent/agent-role-profile'
|
|
2
|
+
import { MS_PER_SECOND } from '#scripts/lib/timeouts'
|
|
3
|
+
import { run_event_stream, type RunEvent } from '#scripts/run/event/run-event-stream'
|
|
4
|
+
import { lane_ledger, type LedgerEntry, type MergeEntry } from './lane-ledger'
|
|
5
|
+
import { lane_spans, type Span } from './lane-spans'
|
|
6
|
+
import { lane_stage_stats } from './lane-stage-stats'
|
|
7
|
+
import { lane_stats, type StatsWindow } from './lane-stats'
|
|
8
|
+
import { lane_stop_stats } from './lane-stop-stats'
|
|
9
|
+
|
|
10
|
+
// How long a lane slot waited on the lane machinery rather than on work, printed by `josh lane:stats`
|
|
11
|
+
// (joshuafolkken/kit#4395). Three hand-offs, each timed from the moment the slot's next step could run:
|
|
12
|
+
//
|
|
13
|
+
// - `cut → resume`: a child's session cut until the relaunched session resumed the lane.
|
|
14
|
+
// - `outage → relaunch`: a child that ended with no result, collected as an `outage`, until its next
|
|
15
|
+
// `child-launch` (joshuafolkken/kit#4410).
|
|
16
|
+
// - `park → offer`: a park until the driver's next offer answered — a `held`, `released` or `dispatch`
|
|
17
|
+
// entry. A pool that stays full writes no line after its one `released`, and a driver handed back
|
|
18
|
+
// writes none, so a gap over the offer interval is a full pool or no driver, never the hand-over
|
|
19
|
+
// (joshuafolkken/kit#4410). The ship's cap park and the driver's collection of it are each timed.
|
|
20
|
+
// - `followup → merge`: the ship's last `followup` stage before the merge until the parent wrote the
|
|
21
|
+
// `merge` line, the step that releases the slot. A merge with no `followup` stage has no start.
|
|
22
|
+
//
|
|
23
|
+
// A start nothing ended is counted under `not ended`, kept out of the seconds.
|
|
24
|
+
|
|
25
|
+
const COLUMNS = ['gap', 'count', 'median (s)', 'max (s)', 'not ended'] as const
|
|
26
|
+
const RELAUNCH = 'cut → resume'
|
|
27
|
+
const OUTAGE = 'outage → relaunch'
|
|
28
|
+
const PARK = 'park → offer'
|
|
29
|
+
const MERGE = 'followup → merge'
|
|
30
|
+
const FOLLOWUP_STAGE = 'followup'
|
|
31
|
+
const IMPLEMENTATION_CUT = `cut (${agent_role_profile.IMPLEMENTATION_PHASE})`
|
|
32
|
+
const { NOT_MEASURED, is_dispatch, is_number, is_stage } = lane_stage_stats
|
|
33
|
+
const { EVENT_KIND } = run_event_stream
|
|
34
|
+
// The offer answers that are not a dispatch: a free lane held, or the pool found full.
|
|
35
|
+
const OFFER_ANSWERS: ReadonlySet<string> = new Set([
|
|
36
|
+
lane_ledger.KIND.HELD,
|
|
37
|
+
lane_ledger.KIND.RELEASED,
|
|
38
|
+
])
|
|
39
|
+
|
|
40
|
+
// Only an implementation cut appends a `resume` when it is adopted; a pre-gate resume appends nothing,
|
|
41
|
+
// so its cut would read as never ended (`run-cut-cli.ts` → `emit_resume_event`).
|
|
42
|
+
function implementation_cuts(events: ReadonlyArray<RunEvent>): Array<RunEvent> {
|
|
43
|
+
return events.filter((event) => event.text.endsWith(IMPLEMENTATION_CUT))
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
function relaunch_spans(events: ReadonlyArray<RunEvent>): Array<Span> {
|
|
47
|
+
return lane_spans.issue_spans({
|
|
48
|
+
starts: lane_stop_stats.events_of(implementation_cuts(events), EVENT_KIND.CUT),
|
|
49
|
+
bounds: lane_stop_stats.events_of(events, EVENT_KIND.CUT),
|
|
50
|
+
ends: lane_stop_stats.events_of(events, EVENT_KIND.RESUME),
|
|
51
|
+
})
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// A child that ended with no result is collected as an `outage`, re-dispatchable; its next launch is
|
|
55
|
+
// the relaunch.
|
|
56
|
+
function outage_spans(events: ReadonlyArray<RunEvent>): Array<Span> {
|
|
57
|
+
const outages = lane_stop_stats.events_of(events, EVENT_KIND.OUTAGE)
|
|
58
|
+
|
|
59
|
+
return lane_spans.issue_spans({
|
|
60
|
+
starts: outages,
|
|
61
|
+
bounds: outages,
|
|
62
|
+
ends: lane_stop_stats.events_of(events, EVENT_KIND.CHILD_LAUNCH),
|
|
63
|
+
})
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
function offer_times(entries: ReadonlyArray<LedgerEntry>): Array<number> {
|
|
67
|
+
return entries
|
|
68
|
+
.filter((entry) => is_dispatch(entry) || OFFER_ANSWERS.has(entry.kind))
|
|
69
|
+
.map((entry) => Date.parse(entry.at))
|
|
70
|
+
.toSorted((left, right) => left - right)
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
function park_spans(
|
|
74
|
+
entries: ReadonlyArray<LedgerEntry>,
|
|
75
|
+
events: ReadonlyArray<RunEvent>,
|
|
76
|
+
): Array<Span> {
|
|
77
|
+
const offers = offer_times(entries)
|
|
78
|
+
|
|
79
|
+
return lane_stop_stats
|
|
80
|
+
.events_of(events, EVENT_KIND.PARK)
|
|
81
|
+
.map((park) => ({ from_ms: park.at_ms, end_ms: offers.find((at) => at > park.at_ms) }))
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
function is_merge(entry: LedgerEntry): entry is MergeEntry {
|
|
85
|
+
return entry.kind === lane_ledger.KIND.MERGE
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
function is_followup_of(entry: LedgerEntry, merge: MergeEntry): boolean {
|
|
89
|
+
return (
|
|
90
|
+
is_stage(entry) &&
|
|
91
|
+
entry.stage === FOLLOWUP_STAGE &&
|
|
92
|
+
entry.issue === merge.issue &&
|
|
93
|
+
entry.at <= merge.at
|
|
94
|
+
)
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
function merge_span(entries: ReadonlyArray<LedgerEntry>, merge: MergeEntry): Span | undefined {
|
|
98
|
+
const followup = entries.findLast((entry) => is_followup_of(entry, merge))
|
|
99
|
+
|
|
100
|
+
return followup === undefined
|
|
101
|
+
? undefined
|
|
102
|
+
: { from_ms: Date.parse(followup.at), end_ms: Date.parse(merge.at) }
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
function merge_spans(entries: ReadonlyArray<LedgerEntry>): Array<Span> {
|
|
106
|
+
return entries
|
|
107
|
+
.filter((entry) => is_merge(entry))
|
|
108
|
+
.map((merge) => merge_span(entries, merge))
|
|
109
|
+
.filter((span) => span !== undefined)
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
function seconds(milliseconds: number | undefined): string {
|
|
113
|
+
return milliseconds === undefined
|
|
114
|
+
? NOT_MEASURED
|
|
115
|
+
: String(Math.round(milliseconds / MS_PER_SECOND))
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
function is_in(span: Span, window: StatsWindow): boolean {
|
|
119
|
+
return span.from_ms >= window.since_ms && span.from_ms <= window.until_ms
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
function gap_row(name: string, spans: ReadonlyArray<Span>, window: StatsWindow): string {
|
|
123
|
+
const started = spans.filter((span) => is_in(span, window))
|
|
124
|
+
const ended = started
|
|
125
|
+
.map((span) => (span.end_ms === undefined ? undefined : span.end_ms - span.from_ms))
|
|
126
|
+
.filter((value) => is_number(value))
|
|
127
|
+
|
|
128
|
+
return lane_stats.to_row([
|
|
129
|
+
name,
|
|
130
|
+
String(started.length),
|
|
131
|
+
seconds(lane_stats.median(ended)),
|
|
132
|
+
seconds(lane_stats.peak(ended)),
|
|
133
|
+
String(started.length - ended.length),
|
|
134
|
+
])
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
// The period's table: `entries` is the whole ledger and `events` the whole run-event stream, both
|
|
138
|
+
// reduced here to the spans that started in `window`.
|
|
139
|
+
function table(
|
|
140
|
+
entries: ReadonlyArray<LedgerEntry>,
|
|
141
|
+
window: StatsWindow,
|
|
142
|
+
events: ReadonlyArray<RunEvent> = [],
|
|
143
|
+
): string {
|
|
144
|
+
return [
|
|
145
|
+
lane_stats.to_row(COLUMNS),
|
|
146
|
+
lane_stats.to_row(COLUMNS.map(() => '---')),
|
|
147
|
+
gap_row(RELAUNCH, relaunch_spans(events), window),
|
|
148
|
+
gap_row(OUTAGE, outage_spans(events), window),
|
|
149
|
+
gap_row(PARK, park_spans(entries, events), window),
|
|
150
|
+
gap_row(MERGE, merge_spans(entries), window),
|
|
151
|
+
].join('\n')
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
const lane_gap_stats = { table }
|
|
155
|
+
|
|
156
|
+
export { lane_gap_stats }
|
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
import { git_common_directory } from '#scripts/git/git-common-directory'
|
|
2
|
+
import { run_carry } from '#scripts/run/carry/run-carry'
|
|
2
3
|
import { run_ship_detach } from '#scripts/run/ship/run-ship-detach'
|
|
4
|
+
import { run_ship_stage } from '#scripts/run/ship/run-ship-stage'
|
|
3
5
|
import { lane_child_marker, type MarkerSource } from './lane-child-marker'
|
|
4
6
|
|
|
7
|
+
type StartRead = (pid: number) => string | undefined
|
|
8
|
+
|
|
5
9
|
// Whether a lane has handed its post-implementation region to the detached ship.
|
|
6
10
|
//
|
|
7
11
|
// **A child that ran `pnpm josh ship --detach` waits on nobody when it ends.** The supervisor drives the
|
|
@@ -24,6 +28,62 @@ function is_ship_running(issue: string, directory: string): boolean {
|
|
|
24
28
|
)
|
|
25
29
|
}
|
|
26
30
|
|
|
31
|
+
// A detached ship for `issue` launched at or after `since_ms` ended in success — it merged, so no cut
|
|
32
|
+
// hand-off follows it. The record outlives its run until the next `ship --detach` replaces it, so a
|
|
33
|
+
// success launched earlier belongs to a past dispatch of the issue and never counts.
|
|
34
|
+
function is_ship_succeeded(issue: string, directory: string, since_ms: number): boolean {
|
|
35
|
+
const repository = git_common_directory.repository(directory)
|
|
36
|
+
const reading =
|
|
37
|
+
repository === undefined ? undefined : run_ship_detach.read_result(repository, issue)
|
|
38
|
+
|
|
39
|
+
return reading?.result === 'success' && (reading.launched_at ?? since_ms - 1) >= since_ms
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
async function read_repository(): Promise<string | undefined> {
|
|
43
|
+
try {
|
|
44
|
+
return await run_carry.repository_directory()
|
|
45
|
+
} catch {
|
|
46
|
+
return undefined
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// `is_ship_running` for this checkout, for a reader that must not block its event loop
|
|
51
|
+
// (joshuafolkken/kit#4245): the repository is read asynchronously once and every recorded start time
|
|
52
|
+
// through `read`, so no answer starts a synchronous process.
|
|
53
|
+
async function ship_reader(read: StartRead): Promise<(issue: string) => boolean> {
|
|
54
|
+
const repository = await read_repository()
|
|
55
|
+
|
|
56
|
+
return (issue) =>
|
|
57
|
+
repository !== undefined &&
|
|
58
|
+
run_ship_detach.read_result(repository, issue, read)?.result === 'running'
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// The live ship for `issue` is inside `josh followup`: it waits on CI, CodeRabbit and the merge alone
|
|
62
|
+
// (joshuafolkken/kit#4466). The mark is down while the followup stage merges and gates again, after a
|
|
63
|
+
// stop, and once a successor supervisor opens the record (`run_ship_stage.read_merge_waiting`).
|
|
64
|
+
function is_merge_waiting(repository: string, issue: string, read: StartRead): boolean {
|
|
65
|
+
if (run_ship_detach.read_result(repository, issue, read)?.result !== 'running') return false
|
|
66
|
+
|
|
67
|
+
return run_ship_stage.read_merge_waiting(run_ship_stage.record_path(repository, issue))
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// `is_merge_waiting` for this checkout, read the way `ship_reader` reads.
|
|
71
|
+
async function merge_wait_reader(read: StartRead): Promise<(issue: string) => boolean> {
|
|
72
|
+
const repository = await read_repository()
|
|
73
|
+
|
|
74
|
+
return (issue) => repository !== undefined && is_merge_waiting(repository, issue, read)
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// The live ship for `issue` in the repository `directory` belongs to waits for a lane place before it
|
|
78
|
+
// relaunches its child (`run-ship-place.ts`); a dead supervisor's mark reads as no wait.
|
|
79
|
+
function is_place_waiting(issue: string, directory: string): boolean {
|
|
80
|
+
const repository = git_common_directory.repository(directory)
|
|
81
|
+
|
|
82
|
+
if (repository === undefined || !is_ship_running(issue, directory)) return false
|
|
83
|
+
|
|
84
|
+
return run_ship_stage.read_place_waiting(run_ship_stage.record_path(repository, issue))
|
|
85
|
+
}
|
|
86
|
+
|
|
27
87
|
// When the detached ship for `issue` that is still live was launched, or `undefined` where none is.
|
|
28
88
|
function ship_running_since(issue: string, directory: string): number | undefined {
|
|
29
89
|
const repository = git_common_directory.repository(directory)
|
|
@@ -40,6 +100,14 @@ function is_handed_off(directory: string, source: MarkerSource = process.env): b
|
|
|
40
100
|
return is_ship_running(issue, directory)
|
|
41
101
|
}
|
|
42
102
|
|
|
43
|
-
const lane_handoff = {
|
|
103
|
+
const lane_handoff = {
|
|
104
|
+
is_handed_off,
|
|
105
|
+
is_place_waiting,
|
|
106
|
+
is_ship_running,
|
|
107
|
+
is_ship_succeeded,
|
|
108
|
+
merge_wait_reader,
|
|
109
|
+
ship_reader,
|
|
110
|
+
ship_running_since,
|
|
111
|
+
}
|
|
44
112
|
|
|
45
113
|
export { lane_handoff }
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import { lane_ledger, type HeldEntry, type LedgerEntry } from './lane-ledger'
|
|
2
|
+
import { lane_stage_stats } from './lane-stage-stats'
|
|
3
|
+
import { lane_stats, type StatsWindow } from './lane-stats'
|
|
4
|
+
|
|
5
|
+
// How long a free lane stayed empty, and why: the ledger's `held` entries of one period reduced to one
|
|
6
|
+
// row per reason, printed by `josh lane:stats` so the idle capacity a backlog stall episode reported
|
|
7
|
+
// is split by cause — an offer that started nothing apart from a driver waiting on its session
|
|
8
|
+
// (joshuafolkken/kit#3995).
|
|
9
|
+
//
|
|
10
|
+
// **A hold lasts until the next `held`, `released` or `dispatch` entry**: the driver writes one on every
|
|
11
|
+
// offered pass that started nothing, so consecutive entries tile the wait and the last one ends at the
|
|
12
|
+
// dispatch — or at the release a full pool or a finished run writes.
|
|
13
|
+
// A hold nothing followed is counted under `not ended`, kept out of the minutes, whose time has no end;
|
|
14
|
+
// one past `MAX_HOLD_MS` is a driver nobody restarted, read as ended at the cap.
|
|
15
|
+
|
|
16
|
+
const COLUMNS = [
|
|
17
|
+
'held by',
|
|
18
|
+
'total (min)',
|
|
19
|
+
'median (min)',
|
|
20
|
+
'max (min)',
|
|
21
|
+
'holds',
|
|
22
|
+
'not ended',
|
|
23
|
+
] as const
|
|
24
|
+
const MS_PER_HOUR = 3_600_000
|
|
25
|
+
const MAX_HOLD_MS = MS_PER_HOUR
|
|
26
|
+
const { NOT_MEASURED } = lane_stage_stats
|
|
27
|
+
// A period with no hold: the table still prints, so a reader sees zero holds rather than no table.
|
|
28
|
+
const NONE_ROW = ['none', NOT_MEASURED, NOT_MEASURED, NOT_MEASURED, '0', '0']
|
|
29
|
+
const { is_dispatch, is_number } = lane_stage_stats
|
|
30
|
+
|
|
31
|
+
interface Hold {
|
|
32
|
+
reason: string
|
|
33
|
+
wait_ms: number | undefined
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function is_held(entry: LedgerEntry): entry is HeldEntry {
|
|
37
|
+
return entry.kind === lane_ledger.KIND.HELD
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function is_hold_end(entry: LedgerEntry): boolean {
|
|
41
|
+
return is_held(entry) || is_dispatch(entry) || entry.kind === lane_ledger.KIND.RELEASED
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// Every instant a hold can end at, parsed and sorted once: holds come once a minute, so re-reading the
|
|
45
|
+
// whole ledger per hold made a week's `lane:stats` take seconds.
|
|
46
|
+
function end_times(entries: ReadonlyArray<LedgerEntry>): Array<number> {
|
|
47
|
+
return entries
|
|
48
|
+
.filter((entry) => is_hold_end(entry))
|
|
49
|
+
.map((entry) => Date.parse(entry.at))
|
|
50
|
+
.filter((at) => Number.isFinite(at))
|
|
51
|
+
.toSorted((left, right) => left - right)
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
function wait_ms(held: HeldEntry, ends: ReadonlyArray<number>): number | undefined {
|
|
55
|
+
const from_ms = Date.parse(held.at)
|
|
56
|
+
const end_ms = ends.find((at) => at > from_ms)
|
|
57
|
+
|
|
58
|
+
return end_ms === undefined ? undefined : Math.min(end_ms - from_ms, MAX_HOLD_MS)
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
function holds_of(entries: ReadonlyArray<LedgerEntry>): Array<Hold> {
|
|
62
|
+
const ends = end_times(entries)
|
|
63
|
+
|
|
64
|
+
return entries
|
|
65
|
+
.filter(is_held)
|
|
66
|
+
.map((held) => ({ reason: held.reason, wait_ms: wait_ms(held, ends) }))
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
function total(values: ReadonlyArray<number>): number {
|
|
70
|
+
return values.reduce((sum, value) => sum + value, 0)
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
function ended_of(holds: ReadonlyArray<Hold>, reason: string): Array<number> {
|
|
74
|
+
return holds
|
|
75
|
+
.filter((hold) => hold.reason === reason)
|
|
76
|
+
.map((hold) => hold.wait_ms)
|
|
77
|
+
.filter((value) => is_number(value))
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
function reason_row(reason: string, holds: ReadonlyArray<Hold>): string {
|
|
81
|
+
const ended = ended_of(holds, reason)
|
|
82
|
+
const count = holds.filter((hold) => hold.reason === reason).length
|
|
83
|
+
|
|
84
|
+
return lane_stats.to_row([
|
|
85
|
+
reason,
|
|
86
|
+
lane_stage_stats.cell(ended.length === 0 ? undefined : total(ended)),
|
|
87
|
+
lane_stage_stats.cell(lane_stats.median(ended)),
|
|
88
|
+
lane_stage_stats.cell(lane_stats.peak(ended)),
|
|
89
|
+
String(count),
|
|
90
|
+
String(count - ended.length),
|
|
91
|
+
])
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// The reasons the period saw, the longest total first, so the cause worth removing next leads.
|
|
95
|
+
function reasons_of(holds: ReadonlyArray<Hold>): Array<string> {
|
|
96
|
+
const reasons = [...new Set(holds.map((hold) => hold.reason))]
|
|
97
|
+
|
|
98
|
+
return reasons.toSorted(
|
|
99
|
+
(left, right) => total(ended_of(holds, right)) - total(ended_of(holds, left)),
|
|
100
|
+
)
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// The period's table: `entries` is the whole ledger, filtered here to `window`.
|
|
104
|
+
function table(entries: ReadonlyArray<LedgerEntry>, window: StatsWindow): string {
|
|
105
|
+
const holds = holds_of(lane_stats.in_window(entries, window))
|
|
106
|
+
const rows = reasons_of(holds).map((reason) => reason_row(reason, holds))
|
|
107
|
+
|
|
108
|
+
return [
|
|
109
|
+
lane_stats.to_row(COLUMNS),
|
|
110
|
+
lane_stats.to_row(COLUMNS.map(() => '---')),
|
|
111
|
+
...(rows.length === 0 ? [lane_stats.to_row(NONE_ROW)] : rows),
|
|
112
|
+
].join('\n')
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
function is_open_at(held: HeldEntry, now_ms: number): boolean {
|
|
116
|
+
return now_ms - Date.parse(held.at) < MAX_HOLD_MS
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
// The reason of the hold still open at the ledger's end, or `undefined` where the last one has ended —
|
|
120
|
+
// or is past `MAX_HOLD_MS`, a driver killed while held that wrote no hand-back.
|
|
121
|
+
function open_reason(entries: ReadonlyArray<LedgerEntry>, now_ms: number): string | undefined {
|
|
122
|
+
const last = entries.findLast((entry) => is_hold_end(entry))
|
|
123
|
+
|
|
124
|
+
return last !== undefined && is_held(last) && is_open_at(last, now_ms) ? last.reason : undefined
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
const lane_held_stats = { open_reason, table }
|
|
128
|
+
|
|
129
|
+
export { lane_held_stats }
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { existsSync } from 'node:fs'
|
|
2
|
-
import path from 'node:path'
|
|
3
2
|
import { core_budget } from '#scripts/gate/core-budget'
|
|
4
3
|
import { buffered_process } from '#scripts/lib/buffered-process'
|
|
4
|
+
import { PACKAGE_JSON, package_manifest } from '#scripts/lib/package-manifest'
|
|
5
5
|
import { INSTALL_TIMEOUT_MS } from '#scripts/lib/timeouts'
|
|
6
6
|
|
|
7
7
|
// Filling the lane, which is the other half of opening one.
|
|
@@ -26,16 +26,9 @@ import { INSTALL_TIMEOUT_MS } from '#scripts/lib/timeouts'
|
|
|
26
26
|
// exactly the lock committed there. A lock the install would rather rewrite is a finding, not
|
|
27
27
|
// something to absorb silently into six parallel lanes.
|
|
28
28
|
const INSTALL_ARGUMENTS = ['install', '--frozen-lockfile']
|
|
29
|
-
// The manifest whose absence is the whole skip condition. A lane cut from a repository that has no
|
|
30
|
-
// `package.json` has nothing to install, so running `pnpm install` there could only fail on a
|
|
31
|
-
// manifest that was never there — which is exactly the fixture a cross-process lane test needs.
|
|
32
|
-
// The condition is strictly "the file does not exist": a manifest that is
|
|
33
|
-
// present but unreadable or broken still runs the install and still fails as before, so a genuinely
|
|
34
|
-
// broken repository is never passed silently.
|
|
35
|
-
const MANIFEST_FILE_NAME = 'package.json'
|
|
36
29
|
// The lane opens with no dependencies installed, and that is the reported state rather than a
|
|
37
30
|
// failure — there was nothing to install, so nothing failed.
|
|
38
|
-
const NO_MANIFEST_OUTPUT = `No ${
|
|
31
|
+
const NO_MANIFEST_OUTPUT = `No ${PACKAGE_JSON} in the lane, so the dependency install was skipped.`
|
|
39
32
|
|
|
40
33
|
interface InstallResult {
|
|
41
34
|
is_installed: boolean
|
|
@@ -51,7 +44,7 @@ interface InstallResult {
|
|
|
51
44
|
// `existsSync` answers only whether the path is there, never whether its contents parse, so a
|
|
52
45
|
// present-but-broken manifest falls through to the real install and fails there.
|
|
53
46
|
function has_manifest(directory: string): boolean {
|
|
54
|
-
return existsSync(
|
|
47
|
+
return existsSync(package_manifest.manifest_path(directory))
|
|
55
48
|
}
|
|
56
49
|
|
|
57
50
|
/**
|
|
@@ -87,4 +80,4 @@ async function install_dependencies(directory: string): Promise<InstallResult> {
|
|
|
87
80
|
const lane_install = { install_dependencies }
|
|
88
81
|
|
|
89
82
|
export type { InstallResult }
|
|
90
|
-
export { lane_install, INSTALL_ARGUMENTS,
|
|
83
|
+
export { lane_install, INSTALL_ARGUMENTS, NO_MANIFEST_OUTPUT }
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
#!/usr/bin/env tsx
|
|
2
|
-
import { fileURLToPath } from 'node:url'
|
|
3
1
|
import { issue_number_shape } from '#scripts/issue/issue-number-shape'
|
|
4
2
|
import { josh_command } from '#scripts/josh/josh-run'
|
|
5
3
|
import { lane_registry, type LaneInfo } from '#scripts/lane/lane-registry'
|
|
@@ -21,7 +19,6 @@ import { execa } from 'execa'
|
|
|
21
19
|
// warning. Their explanations stream through to stderr; the child's pid is the one thing on stdout.
|
|
22
20
|
// A lane a park kept is the one `already-open` it steps past — `lane_directory` below.
|
|
23
21
|
|
|
24
|
-
const ARGV_OFFSET = 2
|
|
25
22
|
const SUCCESS_EXIT_CODE = 0
|
|
26
23
|
const FAILURE_EXIT_CODE = 1
|
|
27
24
|
const should_forward_stderr = true
|
|
@@ -171,13 +168,7 @@ async function run(argv: ReadonlyArray<string>): Promise<number> {
|
|
|
171
168
|
return await launch(context)
|
|
172
169
|
}
|
|
173
170
|
|
|
174
|
-
async function main(argv: ReadonlyArray<string>): Promise<void> {
|
|
175
|
-
process.exitCode = await run(argv)
|
|
176
|
-
}
|
|
177
|
-
|
|
178
171
|
const lane_launch_cli = { launch_lane, read_context, run }
|
|
179
172
|
|
|
180
|
-
if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
|
|
181
|
-
|
|
182
173
|
export type { LaunchContext, LaunchOutcome }
|
|
183
174
|
export { lane_launch_cli }
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
import { fileURLToPath } from 'node:url'
|
|
3
|
+
import { lane_launch_cli } from './lane-launch-cli'
|
|
4
|
+
|
|
5
|
+
// The `josh lane:launch` entry, kept apart from `lane-launch-cli.ts` because other modules import that
|
|
6
|
+
// one: a bundle is one file, so a main guard there would fire for every command that carries it
|
|
7
|
+
// (joshuafolkken/kit#4186).
|
|
8
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) {
|
|
9
|
+
const ARGV_OFFSET = 2
|
|
10
|
+
|
|
11
|
+
process.exitCode = await lane_launch_cli.run(process.argv.slice(ARGV_OFFSET))
|
|
12
|
+
}
|