@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
|
@@ -2,7 +2,7 @@ import { spawnSync } from 'node:child_process'
|
|
|
2
2
|
import { setTimeout as sleep } from 'node:timers/promises'
|
|
3
3
|
import { parseArgs } from 'node:util'
|
|
4
4
|
import { issue_number_shape } from '#scripts/issue/issue-number-shape'
|
|
5
|
-
import { PROBE_TIMEOUT_MS } from '#scripts/lib/timeouts'
|
|
5
|
+
import { MS_PER_SECOND, PROBE_TIMEOUT_MS } from '#scripts/lib/timeouts'
|
|
6
6
|
import {
|
|
7
7
|
PROCESS_ALIVE,
|
|
8
8
|
PROCESS_NONE,
|
|
@@ -28,7 +28,6 @@ import { process_tools } from './process-tools'
|
|
|
28
28
|
const RECONFIRM_MS = 15_000
|
|
29
29
|
const DEFAULT_POLL_MS = 5000
|
|
30
30
|
const NEVER_APPEARED_TIMEOUT_MS = 600_000
|
|
31
|
-
const MS_PER_SECOND = 1000
|
|
32
31
|
const PROCESS_FOUND = 0
|
|
33
32
|
const PROCESS_NOT_FOUND = 1
|
|
34
33
|
const PGREP_COMMAND = 'pgrep'
|
|
@@ -36,8 +35,14 @@ const PGREP_COMMAND = 'pgrep'
|
|
|
36
35
|
// `is_settled` is read once, when the wait starts: a child that ended between two `lane:await` calls
|
|
37
36
|
// never appears in the second one, and only its settled issue tells it apart from one not yet
|
|
38
37
|
// launched.
|
|
38
|
+
//
|
|
39
|
+
// `alive_since` is when this run of the child was first seen alive: a ship it launched is no older, so
|
|
40
|
+
// a ship record launched earlier is a past dispatch's (joshuafolkken/kit#4395). A child already alive
|
|
41
|
+
// when the watch began gets the first poll's time, so a ship it launched before that is not read as
|
|
42
|
+
// its own and its disappearance waits out the re-confirm window.
|
|
39
43
|
interface AwaitState {
|
|
40
44
|
appeared: boolean
|
|
45
|
+
alive_since?: number | undefined
|
|
41
46
|
disappeared_at: number | undefined
|
|
42
47
|
first_polled_at: number | undefined
|
|
43
48
|
is_settled?: boolean
|
|
@@ -56,6 +61,7 @@ interface RawAwaitArguments {
|
|
|
56
61
|
// Injectable for testing -- the CLI never overrides these.
|
|
57
62
|
interface AwaitOptions {
|
|
58
63
|
is_running?: (issue: string) => boolean
|
|
64
|
+
is_shipped?: (issue: string, since_ms: number) => boolean
|
|
59
65
|
is_settled?: (issue: string) => Promise<boolean>
|
|
60
66
|
poll_ms?: number
|
|
61
67
|
reconfirm_ms?: number
|
|
@@ -64,8 +70,11 @@ interface AwaitOptions {
|
|
|
64
70
|
sleep?: (ms: number) => Promise<void>
|
|
65
71
|
}
|
|
66
72
|
|
|
73
|
+
// `is_shipped` is the one disappearance the re-confirm window never has to cover: a ship that ended in
|
|
74
|
+
// success merged the child's work, so no cut hand-off can follow it (joshuafolkken/kit#4395).
|
|
67
75
|
interface CheckConfig {
|
|
68
76
|
is_running: (issue: string) => boolean
|
|
77
|
+
is_shipped?: (issue: string, since_ms: number) => boolean
|
|
69
78
|
reconfirm_ms: number
|
|
70
79
|
never_appeared_timeout_ms: number
|
|
71
80
|
}
|
|
@@ -100,6 +109,10 @@ function is_process_running_default(issue: string): boolean {
|
|
|
100
109
|
return process_trace_default(issue) === PROCESS_ALIVE
|
|
101
110
|
}
|
|
102
111
|
|
|
112
|
+
function is_shipped_default(issue: string, since_ms: number): boolean {
|
|
113
|
+
return lane_handoff.is_ship_succeeded(issue, process.cwd(), since_ms)
|
|
114
|
+
}
|
|
115
|
+
|
|
103
116
|
// The same positive evidence `run:liveness` answers `settled` on: the issue closed, or it was parked.
|
|
104
117
|
async function is_settled_default(issue: string): Promise<boolean> {
|
|
105
118
|
return (await run_liveness.read_child_settled(issue)) === true
|
|
@@ -164,9 +177,16 @@ function resolve_timing(
|
|
|
164
177
|
}
|
|
165
178
|
}
|
|
166
179
|
|
|
167
|
-
function
|
|
180
|
+
function resolve_probes(options: AwaitOptions): Pick<RunConfig, 'is_running' | 'is_shipped'> {
|
|
168
181
|
return {
|
|
169
182
|
is_running: options.is_running ?? is_process_running_default,
|
|
183
|
+
is_shipped: options.is_shipped ?? is_shipped_default,
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
function resolve_options(options: AwaitOptions): RunConfig {
|
|
188
|
+
return {
|
|
189
|
+
...resolve_probes(options),
|
|
170
190
|
is_settled: options.is_settled ?? is_settled_default,
|
|
171
191
|
now: options.now ?? Date.now,
|
|
172
192
|
sleep: options.sleep ?? sleep,
|
|
@@ -174,9 +194,11 @@ function resolve_options(options: AwaitOptions): RunConfig {
|
|
|
174
194
|
}
|
|
175
195
|
}
|
|
176
196
|
|
|
177
|
-
function update_liveness(state: AwaitState, is_live: boolean): void {
|
|
197
|
+
function update_liveness(state: AwaitState, is_live: boolean, now_ms: number): void {
|
|
178
198
|
if (!is_live) return
|
|
179
199
|
|
|
200
|
+
if (!state.appeared || state.disappeared_at !== undefined) state.alive_since = now_ms
|
|
201
|
+
|
|
180
202
|
state.appeared = true
|
|
181
203
|
state.disappeared_at = undefined
|
|
182
204
|
}
|
|
@@ -203,6 +225,28 @@ function check_not_appeared(
|
|
|
203
225
|
return undefined
|
|
204
226
|
}
|
|
205
227
|
|
|
228
|
+
// The ship this run of the child launched succeeded.
|
|
229
|
+
function is_own_ship_done(issue: string, state: AwaitState, config: CheckConfig): boolean {
|
|
230
|
+
const { alive_since } = state
|
|
231
|
+
|
|
232
|
+
return alive_since !== undefined && config.is_shipped?.(issue, alive_since) === true
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
// A child that appeared and is gone: done at once when its ship succeeded, else once it stayed gone
|
|
236
|
+
// past the re-confirm window.
|
|
237
|
+
function check_gone(
|
|
238
|
+
issue: string,
|
|
239
|
+
state: AwaitState,
|
|
240
|
+
now_ms: number,
|
|
241
|
+
config: CheckConfig,
|
|
242
|
+
): string | undefined {
|
|
243
|
+
if (is_own_ship_done(issue, state, config)) return issue
|
|
244
|
+
|
|
245
|
+
state.disappeared_at ??= now_ms
|
|
246
|
+
|
|
247
|
+
return now_ms - state.disappeared_at >= config.reconfirm_ms ? issue : undefined
|
|
248
|
+
}
|
|
249
|
+
|
|
206
250
|
// Returns the issue that has confirmed-completed this tick, `undefined` if none yet.
|
|
207
251
|
// The `appeared` guard prevents a process that never showed up from being declared done, unless its
|
|
208
252
|
// issue had already settled when the wait started.
|
|
@@ -214,7 +258,7 @@ function check_issue(
|
|
|
214
258
|
): string | undefined {
|
|
215
259
|
const is_live = config.is_running(issue)
|
|
216
260
|
|
|
217
|
-
update_liveness(state, is_live)
|
|
261
|
+
update_liveness(state, is_live, now_ms)
|
|
218
262
|
|
|
219
263
|
if (is_live) return undefined
|
|
220
264
|
|
|
@@ -222,13 +266,7 @@ function check_issue(
|
|
|
222
266
|
return check_not_appeared(issue, state, now_ms, config.never_appeared_timeout_ms)
|
|
223
267
|
}
|
|
224
268
|
|
|
225
|
-
|
|
226
|
-
state.disappeared_at = now_ms
|
|
227
|
-
|
|
228
|
-
return undefined
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
return now_ms - state.disappeared_at >= config.reconfirm_ms ? issue : undefined
|
|
269
|
+
return check_gone(issue, state, now_ms, config)
|
|
232
270
|
}
|
|
233
271
|
|
|
234
272
|
function check_any(
|
|
@@ -267,6 +305,7 @@ const lane_await = {
|
|
|
267
305
|
RECONFIRM_MS,
|
|
268
306
|
check_issue,
|
|
269
307
|
is_process_running_default,
|
|
308
|
+
is_shipped_default,
|
|
270
309
|
parse_arguments,
|
|
271
310
|
process_trace_default,
|
|
272
311
|
wait_for_any,
|
|
@@ -1,13 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
cpSync,
|
|
4
|
-
existsSync,
|
|
5
|
-
mkdirSync,
|
|
6
|
-
readFileSync,
|
|
7
|
-
renameSync,
|
|
8
|
-
rmSync,
|
|
9
|
-
writeFileSync,
|
|
10
|
-
} from 'node:fs'
|
|
1
|
+
import { cpSync, existsSync, readFileSync } from 'node:fs'
|
|
11
2
|
import path from 'node:path'
|
|
12
3
|
import { hook_launch } from '#scripts/init/hook-launch'
|
|
13
4
|
import {
|
|
@@ -15,6 +6,7 @@ import {
|
|
|
15
6
|
SHARED_CACHE_SPECS,
|
|
16
7
|
type GateCacheSpec,
|
|
17
8
|
} from '#scripts/josh/josh-command-types'
|
|
9
|
+
import { atomic_write } from '#scripts/lib/atomic-write'
|
|
18
10
|
|
|
19
11
|
// Warming a fresh lane's verification caches from the main checkout.
|
|
20
12
|
//
|
|
@@ -75,30 +67,13 @@ function portable_content(
|
|
|
75
67
|
// runs in parallel with the tool whose cache is being copied, and a temporary name in the checkout
|
|
76
68
|
// root is listed by its tree walk and gone by the time it is read (#3763). `node_modules` is skipped
|
|
77
69
|
// by every tree scan and sits on the checkout's own filesystem, so the rename stays atomic.
|
|
78
|
-
function stage_path(destination_root: string, cache_file: string): string {
|
|
79
|
-
const staging_directory = path.join(destination_root, ...STAGING_SEGMENTS)
|
|
80
|
-
|
|
81
|
-
mkdirSync(staging_directory, { recursive: true })
|
|
82
|
-
|
|
83
|
-
return path.join(staging_directory, `${cache_file}.${String(process.pid)}.${randomUUID()}.tmp`)
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
function publish_staged(temporary_path: string, destination_path: string, content: string): void {
|
|
87
|
-
try {
|
|
88
|
-
writeFileSync(temporary_path, content, { flag: 'wx' })
|
|
89
|
-
renameSync(temporary_path, destination_path)
|
|
90
|
-
} finally {
|
|
91
|
-
rmSync(temporary_path, { force: true })
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
|
|
95
70
|
function write_atomically(destination_root: string, cache_file: string, content: string): void {
|
|
96
71
|
if (!existsSync(destination_root)) return
|
|
97
72
|
|
|
98
73
|
try {
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
74
|
+
atomic_write.replace_file(path.join(destination_root, cache_file), content, {
|
|
75
|
+
staging_directory: path.join(destination_root, ...STAGING_SEGMENTS),
|
|
76
|
+
})
|
|
102
77
|
} catch {
|
|
103
78
|
// Best-effort: a cache that could not be published simply leaves the destination unchanged.
|
|
104
79
|
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { cli_flags, type PositiveSetting } from '#scripts/lib/cli-flags'
|
|
1
2
|
import { lane_limit_override } from './lane-limit-override'
|
|
2
3
|
import type { LaneEnvironment } from './lane-paths'
|
|
3
4
|
import { lane_seed_policy } from './lane-seed'
|
|
@@ -21,32 +22,16 @@ import { lane_seed_policy } from './lane-seed'
|
|
|
21
22
|
// the swap peak, the slowest gates and most of the gate and commit failures.
|
|
22
23
|
const DEFAULT_LANE_LIMIT = 4
|
|
23
24
|
const LANE_LIMIT_KEY = 'JOSH_LANE_LIMIT'
|
|
24
|
-
const POSITIVE_INTEGER = /^[1-9]\d*$/u
|
|
25
25
|
const NO_LANES = 0
|
|
26
26
|
|
|
27
|
-
// The limit, or why it could not be read.
|
|
28
|
-
|
|
29
|
-
// ends the command or is reported and worked around, and only it knows which.
|
|
30
|
-
type LimitChoice = { kind: 'limit'; limit: number } | { kind: 'problem'; problem: string }
|
|
27
|
+
// The limit, or why it could not be read.
|
|
28
|
+
type LimitChoice = PositiveSetting
|
|
31
29
|
|
|
32
30
|
// **An invalid value is a hard error, never a silent fall back to the default** — the rule
|
|
33
|
-
// `PORT_SEED` already holds to.
|
|
34
|
-
//
|
|
35
|
-
//
|
|
36
|
-
// Blank is unset, not invalid: an `.env` line left as `JOSH_LANE_LIMIT=` is a variable nobody
|
|
37
|
-
// configured, exactly as `lane_paths.lane_root` reads a blank root.
|
|
38
|
-
//
|
|
39
|
-
// `name` is what the problem names: `josh lane:limit` reads its argument by the same rule.
|
|
31
|
+
// `PORT_SEED` already holds to. `name` is what the problem names: `josh lane:limit` reads its argument
|
|
32
|
+
// by the same rule.
|
|
40
33
|
function read_limit(raw: string | undefined, name: string): LimitChoice {
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
if (trimmed === '') return { kind: 'limit', limit: DEFAULT_LANE_LIMIT }
|
|
44
|
-
|
|
45
|
-
if (!POSITIVE_INTEGER.test(trimmed)) {
|
|
46
|
-
return { kind: 'problem', problem: `${name} must be a positive integer, not "${trimmed}"` }
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
return { kind: 'limit', limit: Number(trimmed) }
|
|
34
|
+
return cli_flags.read_positive_setting(raw, name, DEFAULT_LANE_LIMIT)
|
|
50
35
|
}
|
|
51
36
|
|
|
52
37
|
// **A live run's `lane:limit` override outranks the environment**: a running
|
|
@@ -76,17 +61,23 @@ function seated_limit(limit: number): number {
|
|
|
76
61
|
//
|
|
77
62
|
// **A lane that holds no place under the limit still holds its port seat** (joshuafolkken/kit#3967):
|
|
78
63
|
// `seated` counts every open lane, so the free count never offers more launches than seats are left.
|
|
64
|
+
// The places left under the limit, port seats aside: what resuming a lane that keeps its seat is
|
|
65
|
+
// weighed against (joshuafolkken/kit#4107).
|
|
66
|
+
function limit_room(limit: number, occupied: number): number {
|
|
67
|
+
return Math.max(NO_LANES, seated_limit(limit) - occupied)
|
|
68
|
+
}
|
|
69
|
+
|
|
79
70
|
function free_lanes(limit: number, occupied: number, seated = occupied): number {
|
|
80
|
-
const by_limit = seated_limit(limit) - occupied
|
|
81
71
|
const by_seats = lane_seed_policy.LAST_LANE_SEAT - seated
|
|
82
72
|
|
|
83
|
-
return Math.max(NO_LANES, Math.min(
|
|
73
|
+
return Math.max(NO_LANES, Math.min(limit_room(limit, occupied), by_seats))
|
|
84
74
|
}
|
|
85
75
|
|
|
86
76
|
const lane_capacity = {
|
|
87
77
|
LANE_LIMIT_KEY,
|
|
88
78
|
free_lanes,
|
|
89
79
|
lane_limit,
|
|
80
|
+
limit_room,
|
|
90
81
|
read_limit,
|
|
91
82
|
seated_limit,
|
|
92
83
|
}
|
|
@@ -1,17 +1,26 @@
|
|
|
1
|
+
import { MS_PER_SECOND } from '#scripts/lib/timeouts'
|
|
1
2
|
import { lane_ledger, type GateCheckRecord, type GateEntry, type LedgerEntry } from './lane-ledger'
|
|
2
3
|
import { lane_stage_stats } from './lane-stage-stats'
|
|
3
4
|
import { lane_stats, type StatsWindow } from './lane-stats'
|
|
4
5
|
|
|
5
|
-
// Which check a gate waited on:
|
|
6
|
-
//
|
|
7
|
-
//
|
|
6
|
+
// Which check a gate waited on: one period's per-check rows reduced to one row per check — median,
|
|
7
|
+
// maximum, runs, reuses, no-ops and whole-suite fallbacks — printed last by `josh lane:stats`.
|
|
8
|
+
//
|
|
9
|
+
// The whole gate is the first row, since its reuse started no check (joshuafolkken/kit#4397); the
|
|
10
|
+
// checks follow in the order they first appear.
|
|
8
11
|
//
|
|
9
12
|
// **A reused check is counted, never timed.** It started no process, so its zero would pull the median
|
|
10
|
-
// toward a check that never ran; a check with only reused rows prints `not measured`.
|
|
13
|
+
// toward a check that never ran; a check with only reused rows prints `not measured`. **The unit leg's
|
|
14
|
+
// since-green no-op is counted the same way** (joshuafolkken/kit#4457): it ran no test, so its second
|
|
15
|
+
// would stand for a run that tested nothing.
|
|
16
|
+
//
|
|
17
|
+
// **The fallbacks are broken down by why** in a second table, one row per reason kind, so a slow unit
|
|
18
|
+
// leg can be read as the full suite it ran and the reason it had to.
|
|
11
19
|
|
|
12
|
-
const MS_PER_SECOND = 1000
|
|
13
20
|
const DECIMALS = 1
|
|
14
|
-
const
|
|
21
|
+
const WHOLE_GATE_LABEL = 'gate (whole)'
|
|
22
|
+
const COLUMNS = ['check', 'median (s)', 'max (s)', 'runs', 'reused', 'no-op', 'fallback'] as const
|
|
23
|
+
const FALLBACK_COLUMNS = ['fallback reason', 'runs'] as const
|
|
15
24
|
|
|
16
25
|
function is_gate(entry: LedgerEntry): entry is GateEntry {
|
|
17
26
|
return entry.kind === lane_ledger.KIND.GATE
|
|
@@ -23,34 +32,66 @@ function cell(milliseconds: number | undefined): string {
|
|
|
23
32
|
: (milliseconds / MS_PER_SECOND).toFixed(DECIMALS)
|
|
24
33
|
}
|
|
25
34
|
|
|
35
|
+
function header(columns: ReadonlyArray<string>): Array<string> {
|
|
36
|
+
return [lane_stats.to_row(columns), lane_stats.to_row(columns.map(() => '---'))]
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function count(
|
|
40
|
+
runs: ReadonlyArray<GateCheckRecord>,
|
|
41
|
+
is_counted: (check: GateCheckRecord) => boolean,
|
|
42
|
+
): string {
|
|
43
|
+
return String(runs.filter((check) => is_counted(check)).length)
|
|
44
|
+
}
|
|
45
|
+
|
|
26
46
|
function check_row(label: string, checks: ReadonlyArray<GateCheckRecord>): string {
|
|
27
47
|
const runs = checks.filter((check) => check.label === label)
|
|
28
|
-
const timed = runs.filter((check) => check.is_reused !== true
|
|
48
|
+
const timed = runs.filter((check) => check.is_reused !== true && check.is_unmoved !== true)
|
|
49
|
+
const elapsed = timed.map((check) => check.elapsed_ms)
|
|
29
50
|
|
|
30
51
|
return lane_stats.to_row([
|
|
31
52
|
label,
|
|
32
|
-
cell(lane_stats.median(
|
|
33
|
-
cell(lane_stats.peak(
|
|
53
|
+
cell(lane_stats.median(elapsed)),
|
|
54
|
+
cell(lane_stats.peak(elapsed)),
|
|
34
55
|
String(runs.length),
|
|
35
|
-
|
|
56
|
+
count(runs, (check) => check.is_reused === true),
|
|
57
|
+
count(runs, (check) => check.is_unmoved === true),
|
|
58
|
+
count(runs, (check) => check.fallback !== undefined),
|
|
36
59
|
])
|
|
37
60
|
}
|
|
38
61
|
|
|
39
|
-
// The
|
|
62
|
+
// The whole gate read as one more check, so its reuse is counted the way a check's is.
|
|
63
|
+
function whole_gate(gate: GateEntry): GateCheckRecord {
|
|
64
|
+
return {
|
|
65
|
+
label: WHOLE_GATE_LABEL,
|
|
66
|
+
elapsed_ms: gate.elapsed_ms,
|
|
67
|
+
is_passed: gate.is_passed,
|
|
68
|
+
is_reused: gate.is_reused,
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
function fallback_table(checks: ReadonlyArray<GateCheckRecord>): string {
|
|
73
|
+
const reasons = checks.map((check) => check.fallback).filter((reason) => reason !== undefined)
|
|
74
|
+
const kinds = [...new Set(reasons)]
|
|
75
|
+
const rows = kinds.map((kind) =>
|
|
76
|
+
lane_stats.to_row([kind, String(reasons.filter((reason) => reason === kind).length)]),
|
|
77
|
+
)
|
|
78
|
+
|
|
79
|
+
return [...header(FALLBACK_COLUMNS), ...rows].join('\n')
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// The period's tables: `entries` is the whole ledger, filtered here to `window`.
|
|
40
83
|
function table(entries: ReadonlyArray<LedgerEntry>, window: StatsWindow): string {
|
|
41
|
-
const
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
const labels = [...new Set(checks.map((check) => check.label))]
|
|
84
|
+
const gates = lane_stats.in_window(entries, window).filter(is_gate)
|
|
85
|
+
const checks = gates.flatMap((gate) => gate.checks ?? [])
|
|
86
|
+
const rows = [...gates.map((gate) => whole_gate(gate)), ...checks]
|
|
87
|
+
const labels = [...new Set(rows.map((row) => row.label))]
|
|
46
88
|
|
|
47
89
|
return [
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
].join('\n')
|
|
90
|
+
[...header(COLUMNS), ...labels.map((label) => check_row(label, rows))].join('\n'),
|
|
91
|
+
fallback_table(checks),
|
|
92
|
+
].join('\n\n')
|
|
52
93
|
}
|
|
53
94
|
|
|
54
|
-
const lane_check_stats = { table }
|
|
95
|
+
const lane_check_stats = { WHOLE_GATE_LABEL, table }
|
|
55
96
|
|
|
56
97
|
export { lane_check_stats }
|
|
@@ -47,6 +47,13 @@ function process_pattern(issue: string): string {
|
|
|
47
47
|
return `(${CHILD_INVOCATION}|${REVIEW_INVOCATION}|${SHIP_PROCESS} .*) ${issue_cite.plain(issue)}$`
|
|
48
48
|
}
|
|
49
49
|
|
|
50
|
+
// The `pgrep -f` pattern that finds the detached ship supervisor of `issue` alone.
|
|
51
|
+
function ship_pattern(issue: string): string {
|
|
52
|
+
issue_number_shape.require_issue_number(issue)
|
|
53
|
+
|
|
54
|
+
return `${SHIP_PROCESS} .* ${issue_cite.plain(issue)}$`
|
|
55
|
+
}
|
|
56
|
+
|
|
50
57
|
function review_invocation(issue: string): string {
|
|
51
58
|
issue_number_shape.require_issue_number(issue)
|
|
52
59
|
|
|
@@ -126,6 +133,7 @@ const lane_child_invocation = {
|
|
|
126
133
|
process_pattern,
|
|
127
134
|
resume_invocation,
|
|
128
135
|
review_invocation,
|
|
136
|
+
ship_pattern,
|
|
129
137
|
ship_stop_invocation,
|
|
130
138
|
}
|
|
131
139
|
|
package/scripts/lane/lane-cli.ts
CHANGED
|
@@ -17,6 +17,7 @@ import { lane_open, type OpenOutcome } from './lane-open'
|
|
|
17
17
|
import { lane_output, type ReadOutcome, type RecordOutcome } from './lane-output'
|
|
18
18
|
import { lane_registry, type LaneInfo } from './lane-registry'
|
|
19
19
|
import { lane_report } from './lane-report'
|
|
20
|
+
import { lane_residents } from './lane-residents'
|
|
20
21
|
import { lane_seed_policy } from './lane-seed'
|
|
21
22
|
import type { KeptLane } from './lane-spent'
|
|
22
23
|
import { lane_stray } from './lane-stray'
|
|
@@ -111,16 +112,25 @@ function report_issues(issues: ReadonlyArray<string>): number {
|
|
|
111
112
|
return SUCCESS_EXIT_CODE
|
|
112
113
|
}
|
|
113
114
|
|
|
114
|
-
//
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
115
|
+
// What the close terminated: the lane child that had not ended, and what else ran from the checkout.
|
|
116
|
+
function report_terminated(outcome: CloseOutcome): void {
|
|
117
|
+
const cited = session_cite.issue(outcome.issue)
|
|
118
|
+
|
|
118
119
|
if (outcome.reaped.length > 0) {
|
|
119
120
|
console.error(
|
|
120
|
-
`Terminated the lane child for ${
|
|
121
|
+
`Terminated the lane child for ${cited} that had not ended by itself: process ${outcome.reaped.join(', ')}.`,
|
|
121
122
|
)
|
|
122
123
|
}
|
|
123
124
|
|
|
125
|
+
lane_residents.report(outcome.residents, cited)
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
// A close that left something behind exits non-zero and names it. Reported as a success, it would
|
|
129
|
+
// send the caller to the next `lane:open`, which then fails on git's own message about a branch that
|
|
130
|
+
// still exists.
|
|
131
|
+
function report_close(outcome: CloseOutcome): number {
|
|
132
|
+
report_terminated(outcome)
|
|
133
|
+
|
|
124
134
|
if (outcome.kind !== 'incomplete') {
|
|
125
135
|
return report_issues(outcome.kind === 'closed' ? [outcome.issue] : [])
|
|
126
136
|
}
|
|
@@ -4,8 +4,11 @@ import { git_worktree } from '#scripts/git/git-worktree'
|
|
|
4
4
|
import { error_text } from '#scripts/lib/error-message'
|
|
5
5
|
import { lane_paths } from './lane-paths'
|
|
6
6
|
import { lane_reap } from './lane-reap'
|
|
7
|
+
import { lane_reap_settle } from './lane-reap-settle'
|
|
7
8
|
import { lane_registry, type LaneInfo } from './lane-registry'
|
|
9
|
+
import { lane_residents } from './lane-residents'
|
|
8
10
|
import { lane_spent, type KeptLane } from './lane-spent'
|
|
11
|
+
import { lane_state } from './lane-state'
|
|
9
12
|
|
|
10
13
|
// Closing a lane: no work tree, no branch, no directory.
|
|
11
14
|
//
|
|
@@ -13,7 +16,8 @@ import { lane_spent, type KeptLane } from './lane-spent'
|
|
|
13
16
|
// every step here is written to run over a subject that is already gone or that still holds
|
|
14
17
|
// uncommitted work. A close that refused either would leave exactly the debris it exists to remove,
|
|
15
18
|
// and the next lane for that issue would then fail on a directory nobody could account for. There
|
|
16
|
-
// is no ledger entry to remove: the lane's seat lived in the `.env` that goes with the work tree.
|
|
19
|
+
// is no ledger entry to remove: the lane's seat lived in the `.env` that goes with the work tree. The
|
|
20
|
+
// lane's state record outlives it, marked `ended`, so its last state stays readable.
|
|
17
21
|
|
|
18
22
|
interface LaneTargets {
|
|
19
23
|
directory: string
|
|
@@ -36,6 +40,9 @@ interface CloseOutcome {
|
|
|
36
40
|
left_behind: Array<string>
|
|
37
41
|
// The lane child's processes this close terminated — empty for a child that ended by itself.
|
|
38
42
|
reaped: Array<number>
|
|
43
|
+
// What else still ran from the lane's checkout or carried its mark and this close terminated
|
|
44
|
+
// (`lane-residents.ts`); `undefined` where the processes could not be read.
|
|
45
|
+
residents: Array<number> | undefined
|
|
39
46
|
}
|
|
40
47
|
|
|
41
48
|
interface SweepOutcome {
|
|
@@ -112,39 +119,72 @@ function close_kind(did_exist: boolean, left_behind: ReadonlyArray<string>): Clo
|
|
|
112
119
|
return did_exist ? 'closed' : 'none'
|
|
113
120
|
}
|
|
114
121
|
|
|
115
|
-
// The
|
|
116
|
-
//
|
|
117
|
-
// Derived here from the current work tree, a close run inside a lane
|
|
118
|
-
// reports `none` over a directory that is still on disk.
|
|
119
|
-
async function lane_root_directory(): Promise<string> {
|
|
120
|
-
return lane_paths.lane_root(await lane_registry.main_repository_root())
|
|
121
|
-
}
|
|
122
|
-
|
|
122
|
+
// The lane root is the main work tree's (`lane_root_directory`), so the fallback directory an
|
|
123
|
+
// unregistered lane is closed by is the one `lane:open` would have created.
|
|
123
124
|
/**
|
|
124
125
|
* Close the lane for `issue`. `none` means there was nothing there, which is not a failure: a caller
|
|
125
126
|
* cleaning up after an interruption cannot know whether the lane was ever opened. `incomplete` means
|
|
126
127
|
* something survived the removal, and `left_behind` names it.
|
|
127
128
|
*/
|
|
128
129
|
async function resolve_lane(issue: string): Promise<ResolvedLane> {
|
|
129
|
-
const root = await lane_root_directory()
|
|
130
|
+
const root = await lane_registry.lane_root_directory()
|
|
130
131
|
const existing = lane_registry.find_lane(await lane_registry.list_lanes(), issue)
|
|
131
132
|
|
|
132
133
|
return { existing, targets: lane_targets(root, issue, existing) }
|
|
133
134
|
}
|
|
134
135
|
|
|
136
|
+
// A lane closed before is `none` on a retry, and ends there once its record says it is not over —
|
|
137
|
+
// an issue never opened is not given a record.
|
|
138
|
+
async function is_ending(issue: string, kind: CloseKind): Promise<boolean> {
|
|
139
|
+
if (kind !== 'none') return kind === 'closed'
|
|
140
|
+
|
|
141
|
+
const record = await lane_state.read_state(issue)
|
|
142
|
+
|
|
143
|
+
return record !== undefined && record.state !== 'ended'
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
// The lane's processes, settled after the removal so the processes have had the work tree's deletion
|
|
147
|
+
// to exit in too; what outlived the SIGKILL replaces what the lane's record noted for `run:board`.
|
|
148
|
+
async function survivors_of(issue: string, directory: string): Promise<Array<string>> {
|
|
149
|
+
const survivors = await lane_reap_settle.settle({ issue, directory })
|
|
150
|
+
|
|
151
|
+
if (survivors !== undefined) await lane_state.record_stuck(issue, survivors)
|
|
152
|
+
|
|
153
|
+
return lane_reap_settle.survivor_texts(survivors)
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
// Whatever the removal left: the checkout's residue, then the processes that outlived it.
|
|
157
|
+
async function left_behind_of(issue: string, targets: LaneTargets): Promise<Array<string>> {
|
|
158
|
+
const survivors = await survivors_of(issue, targets.directory)
|
|
159
|
+
|
|
160
|
+
return [...(await residue(targets)), ...survivors]
|
|
161
|
+
}
|
|
162
|
+
|
|
135
163
|
async function close_lane(issue: string): Promise<CloseOutcome> {
|
|
136
164
|
const { existing, targets } = await resolve_lane(issue)
|
|
137
165
|
const did_exist = existing !== undefined || existsSync(targets.directory)
|
|
138
166
|
// Before the removal, not after: a child still running in the tree would keep writing into a
|
|
139
167
|
// directory being deleted, and a process outliving its lane is a half-discarded state — the work
|
|
140
|
-
// tree gone, the child still answering `alive`.
|
|
141
|
-
const reaped = lane_reap.reap_child(issue)
|
|
168
|
+
// tree gone, the child still answering `alive`. What else still runs from the checkout goes too.
|
|
169
|
+
const reaped = lane_reap.reap_child({ issue, directory: targets.directory })
|
|
170
|
+
const residents = lane_residents.end_residents({ issue, directory: targets.directory }, reaped)
|
|
142
171
|
|
|
143
172
|
await remove_lane(targets)
|
|
144
173
|
|
|
145
|
-
const left_behind = await
|
|
174
|
+
const left_behind = await left_behind_of(issue, targets)
|
|
175
|
+
const kind = close_kind(did_exist, left_behind)
|
|
176
|
+
|
|
177
|
+
if (await is_ending(issue, kind)) {
|
|
178
|
+
await lane_state.record_change({ issue, state: 'ended', command: 'lane:close' })
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
return { issue, kind, left_behind, reaped, residents }
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
type DuePredicate = (issue: string) => Promise<boolean>
|
|
146
185
|
|
|
147
|
-
|
|
186
|
+
async function always_due(): Promise<boolean> {
|
|
187
|
+
return true
|
|
148
188
|
}
|
|
149
189
|
|
|
150
190
|
// A lane that could not be closed is recorded rather than thrown: a sweep has to attempt every lane,
|
|
@@ -163,14 +203,24 @@ async function try_close(issue: string): Promise<boolean> {
|
|
|
163
203
|
|
|
164
204
|
// Sequential on purpose: two `git worktree` writes at once contend for the same registration
|
|
165
205
|
// directory, and the whole point of the command is that nothing is left half-removed.
|
|
166
|
-
async function
|
|
206
|
+
async function close_into(sweep: SweepOutcome, issue: string, is_due: DuePredicate): Promise<void> {
|
|
207
|
+
if (!(await is_due(issue))) return
|
|
208
|
+
const bucket = (await try_close(issue)) ? sweep.closed : sweep.failed
|
|
209
|
+
|
|
210
|
+
bucket.push(issue)
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
// `is_due` is asked right before each close, not for every issue up front: a close can wait out the
|
|
214
|
+
// grace window, and a lane opened again meanwhile is no longer one to close.
|
|
215
|
+
async function close_each(
|
|
216
|
+
issues: ReadonlyArray<string>,
|
|
217
|
+
is_due: DuePredicate = always_due,
|
|
218
|
+
): Promise<SweepOutcome> {
|
|
167
219
|
const sweep: SweepOutcome = { closed: [], failed: [] }
|
|
168
220
|
|
|
169
221
|
for (const issue of issues) {
|
|
170
222
|
// eslint-disable-next-line no-await-in-loop -- worktree writes contend for the same registration directory
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
bucket.push(issue)
|
|
223
|
+
await close_into(sweep, issue, is_due)
|
|
174
224
|
}
|
|
175
225
|
|
|
176
226
|
return sweep
|
|
@@ -196,11 +246,29 @@ async function close_all_lanes(): Promise<SweepOutcome> {
|
|
|
196
246
|
return await close_each(lanes.map((lane) => lane.issue))
|
|
197
247
|
}
|
|
198
248
|
|
|
249
|
+
async function is_unfinished(issue: string): Promise<boolean> {
|
|
250
|
+
const { targets } = await resolve_lane(issue)
|
|
251
|
+
|
|
252
|
+
return !existsSync(targets.directory)
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
/**
|
|
256
|
+
* Close again every lane whose work tree is gone but whose record is not `ended` — a close a process
|
|
257
|
+
* outlived. The supervisor runs it each pass, so a lane ends once its last process does.
|
|
258
|
+
*/
|
|
259
|
+
async function retry_closes(): Promise<SweepOutcome> {
|
|
260
|
+
const records = await lane_state.read_records()
|
|
261
|
+
const issues = records.filter((record) => record.state !== 'ended').map(({ issue }) => issue)
|
|
262
|
+
|
|
263
|
+
return await close_each(issues, is_unfinished)
|
|
264
|
+
}
|
|
265
|
+
|
|
199
266
|
const lane_close = {
|
|
200
267
|
close_all_lanes,
|
|
201
268
|
close_lane,
|
|
202
269
|
prune_lanes,
|
|
203
270
|
resolve_lane,
|
|
271
|
+
retry_closes,
|
|
204
272
|
}
|
|
205
273
|
|
|
206
274
|
export type { CloseKind, CloseOutcome, PruneOutcome, ResolvedLane, SweepOutcome }
|