@joshuafolkken/kit 1.1514.0 → 1.1784.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/agents/investigator.md +1 -1
- package/.claude/settings.json +5 -5
- package/.claude/skills/epic-commands/SKILL.md +26 -65
- package/.claude/skills/epic-commands/epic-bundle.md +3 -1
- package/.claude/skills/workflow-commands/SKILL.md +5 -5
- package/.claude/skills/workflow-commands/background-commands.md +5 -5
- package/.claude/skills/workflow-commands/backlogrun-child.md +10 -8
- package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +7 -25
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +17 -13
- package/.claude/skills/workflow-commands/backlogrun-park.md +14 -23
- package/.claude/skills/workflow-commands/backlogrun-progress.md +2 -2
- package/.claude/skills/workflow-commands/backlogrun-recovery.md +5 -5
- package/.claude/skills/workflow-commands/backlogrun-steps.md +10 -10
- package/.claude/skills/workflow-commands/backlogrun.md +1 -1
- package/.claude/skills/workflow-commands/chain-rule.md +13 -7
- package/.claude/skills/workflow-commands/delegation.md +6 -5
- package/.claude/skills/workflow-commands/entry-sequence.md +9 -9
- package/.claude/skills/workflow-commands/followup.md +9 -31
- package/.claude/skills/workflow-commands/fullrun-steps.md +36 -45
- package/.claude/skills/workflow-commands/fullrun.md +2 -2
- package/.claude/skills/workflow-commands/halfrun.md +17 -25
- package/.claude/skills/workflow-commands/issue-comments.md +16 -12
- package/.claude/skills/workflow-commands/issue-scout.md +2 -2
- package/.claude/skills/workflow-commands/kickoff.md +24 -23
- package/.claude/skills/workflow-commands/latest-gate.md +7 -12
- package/.claude/skills/workflow-commands/needs-human-review.md +9 -14
- package/.claude/skills/workflow-commands/observation-filing.md +4 -36
- package/.claude/skills/workflow-commands/observation-ledger.md +1 -1
- package/.claude/skills/workflow-commands/pre-gate-cut.md +13 -30
- package/.claude/skills/workflow-commands/prerequisite.md +10 -16
- package/.claude/skills/workflow-commands/progress-watcher.md +1 -1
- package/.claude/skills/workflow-commands/prrun.md +3 -7
- package/.claude/skills/workflow-commands/retrospective.md +1 -1
- package/.claude/skills/workflow-commands/split-assessment.md +13 -1
- package/.claude/skills/workflow-commands/working-tree-hold.md +9 -9
- package/.codex/hooks.json +5 -5
- package/.github/actions/setup-node/action.yml +9 -0
- package/.github/actions/setup-pnpm/action.yml +1 -1
- package/.github/dependabot.yml +16 -0
- package/.github/release.yml +0 -2
- package/.github/workflows/ci.yml +120 -10
- package/.github/workflows/publish.yml +8 -1
- package/.github/workflows/sonar-qube.yml +1 -0
- package/.prettierignore +2 -0
- package/.vscode/tasks.json +1 -2
- package/CLAUDE.md +3 -7
- package/README.md +4 -2
- package/SECURITY.md +1 -1
- package/dist/CLAUDE.md +3 -7
- package/dist/commands/document-read-cli.js +882 -0
- package/dist/commands/{document-section-cli.js → document-section-main.js} +79 -37
- package/dist/commands/read-set-cli.js +1867 -0
- package/dist/commands/run-prep-main.js +21653 -0
- package/dist/commands/run-step-cli.js +23880 -0
- package/dist/config-merge/index.js +5 -1
- package/dist/hooks/audit-provision.js +20 -35
- package/dist/hooks/{chunk-DGT54IH5.js → chunk-AZX4FGQ3.js} +63 -17
- package/dist/hooks/chunk-CWMBGKYW.js +6483 -0
- package/dist/hooks/chunk-O2YBIDSI.js +4306 -0
- package/dist/hooks/{chunk-TNUMY6NL.js → chunk-PT5R6UJD.js} +4193 -1900
- package/dist/hooks/chunk-TUIFS5E7.js +72 -0
- package/dist/hooks/{chunk-723HKZO5.js → chunk-VWWCFGWK.js} +1 -1
- package/dist/hooks/{chunk-APUO6U4J.js → chunk-WR2KQAYZ.js} +1843 -440
- package/dist/hooks/{chunk-O6GDRNJB.js → chunk-XGBNSWEI.js} +248 -46
- package/dist/hooks/chunk-YCDOIR3I.js +3456 -0
- package/dist/hooks/codex-hook-adapter.js +10 -22
- package/dist/hooks/format-edited.js +5 -6
- package/dist/hooks/inputs.json +443 -317
- package/dist/hooks/pretool-guard.js +7 -25
- package/dist/hooks/session-lang.js +44 -51
- package/dist/hooks/stop-guard.js +7716 -2187
- package/dist/josh.js +6002 -3583
- package/dist/self-sync-guard/index.js +74 -10
- package/dist/version/index.js +115 -406
- package/eslint/base.js +1 -1
- package/lefthook/base.yml +3 -1
- package/package.json +10 -48
- package/pnpm-workspace.yaml +4 -2
- package/prompts/coding-standards.md +1 -1
- package/prompts/collaboration-workflow/file-edits.md +1 -7
- package/prompts/collaboration-workflow/issue-citation.md +1 -1
- package/prompts/collaboration-workflow/issue-template.md +33 -16
- package/prompts/collaboration-workflow/lane-instructions.md +1 -2
- package/prompts/collaboration-workflow/measurement.md +37 -0
- package/prompts/collaboration-workflow/operating-rules.md +4 -6
- package/prompts/collaboration-workflow/output-bounds.md +2 -7
- package/prompts/collaboration-workflow/plan-comment.md +3 -42
- package/prompts/collaboration-workflow/principles.md +5 -0
- package/prompts/collaboration-workflow/report-format.md +31 -60
- package/prompts/collaboration-workflow/residency.md +2 -2
- package/prompts/collaboration-workflow/shell-body.md +6 -16
- package/prompts/collaboration-workflow/turn-batching.md +0 -2
- package/prompts/collaboration-workflow/upstream-interrupt.md +14 -4
- package/prompts/collaboration-workflow/wip-cap.md +1 -1
- package/prompts/collaboration-workflow.md +3 -7
- package/prompts/refactoring.md +1 -1
- package/prompts/review-rubric.md +1 -2
- package/prompts/review.md +41 -21
- package/prompts/testing-guide.md +8 -43
- package/scripts/agent/agent-event.ts +15 -15
- package/scripts/agent/agent-exit-record.ts +13 -1
- package/scripts/agent/api-auth.ts +41 -0
- package/scripts/agent/api-outage.ts +1 -1
- package/scripts/auto-ok/auto-ok-cli.ts +14 -16
- package/scripts/auto-ok/auto-ok-judge-read.ts +12 -3
- package/scripts/auto-ok/auto-ok-judge-write.ts +46 -19
- package/scripts/auto-ok/auto-ok-judge.ts +13 -2
- package/scripts/auto-ok/auto-ok-main.ts +17 -0
- package/scripts/backlog/backlog-arrival.ts +14 -3
- package/scripts/backlog/backlog-budget-cli.ts +7 -33
- package/scripts/backlog/backlog-budget-main.ts +16 -0
- package/scripts/backlog/backlog-budget.ts +2 -3
- package/scripts/backlog/backlog-defect-priority.ts +4 -3
- package/scripts/backlog/backlog-drive-adopt.ts +67 -0
- package/scripts/backlog/backlog-drive-args.ts +4 -5
- package/scripts/backlog/backlog-drive-cli.ts +113 -28
- package/scripts/backlog/backlog-drive-hold.ts +162 -0
- package/scripts/backlog/backlog-drive-idle.ts +151 -0
- package/scripts/backlog/backlog-drive-judge.ts +25 -0
- package/scripts/backlog/backlog-drive-memory.ts +126 -0
- package/scripts/backlog/backlog-drive-named-offer.ts +5 -10
- package/scripts/backlog/backlog-drive-named.ts +53 -6
- package/scripts/backlog/backlog-drive-offer-argv.ts +3 -8
- package/scripts/backlog/backlog-drive-paused.ts +169 -0
- package/scripts/backlog/backlog-drive-restore.ts +30 -7
- package/scripts/backlog/backlog-drive-seats.ts +18 -8
- package/scripts/backlog/backlog-drive-token-handling.ts +38 -0
- package/scripts/backlog/backlog-drive.ts +79 -75
- package/scripts/backlog/backlog-next-main.ts +16 -0
- package/scripts/backlog/backlog-next-shared.ts +73 -0
- package/scripts/backlog/backlog-next.ts +48 -16
- package/scripts/backlog/backlog-occupied.ts +52 -39
- package/scripts/backlog/backlog-offer-cli.ts +6 -21
- package/scripts/backlog/backlog-offer-exclude.ts +15 -0
- package/scripts/backlog/backlog-offer-main.ts +12 -0
- package/scripts/backlog/backlog-offer.ts +36 -3
- package/scripts/backlog/backlog-overlap.ts +22 -4
- package/scripts/backlog/backlog-plan-read.ts +6 -2
- package/scripts/backlog/backlog-plan.ts +18 -4
- package/scripts/backlog/backlog-pool.ts +10 -10
- package/scripts/backlog/backlog-rank.ts +10 -2
- package/scripts/backlog/backlog-ready.ts +112 -30
- package/scripts/backlog/backlog-stalled-detect.ts +109 -36
- package/scripts/backlog/backlog-stalled.ts +52 -16
- package/scripts/backlog/backlog-wait-cause.ts +86 -0
- package/scripts/backlog/backlog-waves.ts +39 -13
- package/scripts/backlog/backlogrun-args.ts +19 -7
- package/scripts/backlog/backlogrun-cli.ts +19 -5
- package/scripts/backlog/backlogrun-launch.ts +6 -0
- package/scripts/backlog/backlogrun-restart.ts +97 -0
- package/scripts/backlog/backlogrun-stop.ts +79 -7
- package/scripts/behavior/behavior-cli.ts +2 -2
- package/scripts/behavior/behavior-rules.ts +47 -24
- package/scripts/build/build-bin.ts +2 -16
- package/scripts/build/build-claude-md.ts +0 -7
- package/scripts/build/build-commands.ts +0 -13
- package/scripts/build/build-hooks.ts +49 -48
- package/scripts/build/hook-bundle-stamp.ts +29 -11
- package/scripts/build/local-bin.ts +1 -1
- package/scripts/cases/cases-cli.ts +25 -13
- package/scripts/cases/cases-interaction-scan.ts +134 -0
- package/scripts/cases/cases-interaction.ts +183 -0
- package/scripts/cases/cases-logic.ts +39 -6
- package/scripts/ci/pr-classification-main.ts +18 -0
- package/scripts/ci/pr-classification.ts +10 -17
- package/scripts/clone/clone-scan.ts +1 -1
- package/scripts/cost-runtime/cost-blocks.ts +22 -37
- package/scripts/cost-runtime/cost-cli.ts +31 -14
- package/scripts/cost-runtime/cost-main.ts +12 -0
- package/scripts/cost-runtime/cost-transcript.ts +1 -0
- package/scripts/delegation/delegation-policy.ts +17 -4
- package/scripts/delegation/duplicate-read-guard.ts +0 -8
- package/scripts/delegation/investigation-guard.ts +0 -8
- package/scripts/delegation/investigation-reads.ts +3 -4
- package/scripts/dependabot/dependabot-cooldown.ts +194 -0
- package/scripts/discovery/repo-discovery.ts +24 -6
- package/scripts/doctor/doctor-consumer.ts +2 -5
- package/scripts/document/document-byte-budget.ts +8 -6
- package/scripts/document/document-scan.ts +1 -1
- package/scripts/document/document-section-cli.ts +0 -8
- package/scripts/document/document-section-main.ts +12 -0
- package/scripts/epic/epic-audit-cli.ts +12 -6
- package/scripts/epic/epic-bundle-apply.ts +137 -0
- package/scripts/epic/epic-bundle-cli.ts +32 -121
- package/scripts/epic/epic-bundle-format.ts +116 -0
- package/scripts/epic/epic-bundle-main.ts +17 -0
- package/scripts/epic/epic-busy.ts +5 -12
- package/scripts/epic/epic-classify.ts +24 -15
- package/scripts/epic/epic-cli-argv.ts +31 -0
- package/scripts/epic/epic-cli-decide.ts +42 -0
- package/scripts/epic/epic-cli.ts +6 -38
- package/scripts/epic/epic-close.ts +112 -55
- package/scripts/epic/epic-cross-repo.ts +4 -7
- package/scripts/epic/epic-decide.ts +119 -0
- package/scripts/epic/epic-decision.ts +9 -0
- package/scripts/epic/epic-fetch.ts +4 -0
- package/scripts/epic/epic-graph.ts +2 -0
- package/scripts/epic/epic-issue.ts +5 -1
- package/scripts/epic/epic-label-age.ts +1 -1
- package/scripts/epic/epic-lane-offer.ts +39 -4
- package/scripts/epic/epic-next-main.ts +24 -0
- package/scripts/epic/epic-next.ts +6 -24
- package/scripts/epic/epic-outside-blocker.ts +6 -2
- package/scripts/epic/epic-parse.ts +9 -3
- package/scripts/epic/epic-read.ts +1 -0
- package/scripts/epic/epic-reconcile.ts +39 -0
- package/scripts/epic/epic-run.ts +10 -1
- package/scripts/epic/epic-solo.ts +50 -14
- package/scripts/epic/epic.ts +41 -7
- package/scripts/exports/unused-members-cli.ts +2 -2
- package/scripts/followup/followup-checks-event.ts +8 -3
- package/scripts/followup/followup-coderabbit-wait.ts +82 -0
- package/scripts/followup/followup-review-gates.ts +81 -0
- package/scripts/followup/git-followup-stages.ts +13 -3
- package/scripts/followup/git-followup-workflow.ts +19 -66
- package/scripts/followup/git-pr-followup-wrapup.ts +9 -14
- package/scripts/followup/git-pr-followup.ts +36 -8
- package/scripts/fresh-machine/fresh-machine-cli.ts +1 -1
- package/scripts/fresh-machine/fresh-machine-run.ts +8 -8
- package/scripts/fresh-machine/specs/kit-test-backlogrun.json +1 -1
- package/scripts/gate/busy-average.ts +58 -0
- package/scripts/gate/check-cpu.ts +60 -0
- package/scripts/gate/check-inputs.ts +39 -95
- package/scripts/gate/check-reuse.ts +33 -54
- package/scripts/gate/command-memory.ts +192 -0
- package/scripts/gate/core-admission.ts +218 -28
- package/scripts/gate/core-budget-timing.ts +37 -0
- package/scripts/gate/core-budget.ts +80 -98
- package/scripts/gate/core-wait-record.ts +48 -0
- package/scripts/gate/core-wait.ts +37 -5
- package/scripts/gate/core-weights.ts +86 -0
- package/scripts/gate/free-cores.ts +27 -4
- package/scripts/gate/gate-ledger.ts +32 -4
- package/scripts/gate/gate-plan.ts +41 -34
- package/scripts/gate/gate-report.ts +14 -2
- package/scripts/gate/gate-run-steps.ts +53 -8
- package/scripts/gate/gate-skip.ts +12 -2
- package/scripts/gate/gate-steps.ts +12 -1
- package/scripts/gate/input-fingerprint.ts +42 -0
- package/scripts/gate/machine-capacity.ts +65 -31
- package/scripts/gate/moved-paths.ts +67 -0
- package/scripts/gate/project-checks.ts +5 -12
- package/scripts/gate/scoped-green.ts +12 -8
- package/scripts/gate/since-green.ts +62 -0
- package/scripts/gate/toolchain-inputs.ts +115 -0
- package/scripts/gate/verification-gate.ts +27 -24
- package/scripts/gate/verification-inputs.ts +250 -0
- package/scripts/gh/gh-author-association.ts +96 -9
- package/scripts/gh/git-ai-review-scan.ts +4 -2
- package/scripts/gh/git-gh-api-path.ts +15 -0
- package/scripts/gh/git-gh-branch-rules.ts +73 -0
- package/scripts/gh/git-gh-conditional.ts +5 -2
- package/scripts/gh/git-gh-issue-read.ts +5 -1
- package/scripts/gh/git-gh-issue-write.ts +67 -29
- package/scripts/gh/git-gh-issue.ts +7 -3
- package/scripts/gh/git-gh-poll-read.ts +89 -0
- package/scripts/gh/git-gh-pr-auto-merge.ts +8 -3
- package/scripts/gh/git-gh-pr-rest.ts +1 -1
- package/scripts/gh/git-gh-pr-snapshot.ts +33 -20
- package/scripts/gh/git-gh-pr.ts +27 -15
- package/scripts/gh/git-pr-checks-eval.ts +39 -7
- package/scripts/gh/git-pr-checks-parse.ts +39 -9
- package/scripts/gh/git-pr-merge-checked.ts +80 -0
- package/scripts/git/base-tree.ts +19 -2
- package/scripts/git/changed-file-scope.ts +6 -4
- package/scripts/git/changed-paths.ts +18 -1
- package/scripts/git/git-diff-reads.ts +27 -2
- package/scripts/git/git-grep-hits.ts +85 -0
- package/scripts/git/git-location-environment.ts +1 -1
- package/scripts/git/git-merge-conflicts.ts +83 -0
- package/scripts/git/git-preflight.ts +37 -12
- package/scripts/git/git-push-transport.ts +1 -2
- package/scripts/git/git-schemas.ts +17 -7
- package/scripts/git/git-spawn.ts +1 -2
- package/scripts/git/git-status.ts +4 -4
- package/scripts/git/main-merge-main.ts +12 -0
- package/scripts/git/main-merge-regenerate.ts +2 -2
- package/scripts/git/main-merge.ts +25 -9
- package/scripts/git/main-sync-main.ts +12 -0
- package/scripts/git/main-sync.ts +0 -9
- package/scripts/git/stash/git-stash.ts +27 -4
- package/scripts/git/stash/{stash-pop-args.ts → stash-args.ts} +13 -10
- package/scripts/git/stash/stash-pop-cli.ts +6 -12
- package/scripts/git/stash/stash-pop-main.ts +12 -0
- package/scripts/git/stash/stash-push-cli.ts +76 -0
- package/scripts/git/stash/stash-push-main.ts +12 -0
- package/scripts/hooks/batch-guard.ts +0 -8
- package/scripts/hooks/check-commit-message-main.ts +8 -0
- package/scripts/hooks/check-commit-message.ts +4 -7
- package/scripts/hooks/format-edited-file.ts +8 -24
- package/scripts/hooks/pre-commit-lint.ts +30 -3
- package/scripts/hooks/pre-push-unit.ts +4 -2
- package/scripts/hooks/pretool-guard-cli.ts +1 -8
- package/scripts/hooks/pretool-guard.ts +32 -19
- package/scripts/hooks/reserved-run.ts +67 -9
- package/scripts/hooks/run-hook.sh +13 -4
- package/scripts/hooks/shell-rules-notice.ts +37 -0
- package/scripts/hooks/stop-actions.ts +2 -21
- package/scripts/hooks/stop-guard.ts +13 -9
- package/scripts/init/hook-command-rewrite.ts +19 -5
- package/scripts/init/hook-launch.ts +15 -17
- package/scripts/init/init-actions.ts +0 -6
- package/scripts/init/init-ai-copy.ts +10 -36
- package/scripts/init/init-bootstrap.ts +9 -8
- package/scripts/init/init-dry-run-report.ts +1 -1
- package/scripts/init/init-dry-run.ts +1 -1
- package/scripts/init/init-file-action.ts +7 -9
- package/scripts/init/init-logic-json-merge.ts +2 -2
- package/scripts/init/init-logic-migrate.ts +9 -82
- package/scripts/init/init-logic.ts +3 -2
- package/scripts/init/init-main.ts +12 -0
- package/scripts/init/init.ts +5 -12
- package/scripts/init/kit-development-versions.ts +3 -7
- package/scripts/init/kit-written-paths.ts +2 -2
- package/scripts/init/project-profile.ts +5 -4
- package/scripts/init/tsconfig-preset-migration.ts +2 -1
- package/scripts/init/vscode-tasks.ts +1 -1
- package/scripts/issue/defect-origin-cli.ts +106 -0
- package/scripts/issue/defect-origin-line.ts +60 -0
- package/scripts/issue/defect-origin-main.ts +11 -0
- package/scripts/issue/defect-origin.ts +114 -0
- package/scripts/issue/defect-rate-cli.ts +34 -78
- package/scripts/issue/defect-rate.ts +0 -16
- package/scripts/issue/defect-report-cli.ts +128 -0
- package/scripts/issue/defect-report-format.ts +56 -0
- package/scripts/issue/defect-report-main.ts +11 -0
- package/scripts/issue/defect-report.ts +160 -0
- package/scripts/issue/expected-effect-lint.ts +1 -0
- package/scripts/issue/issue-already-done-cli.ts +62 -0
- package/scripts/issue/issue-body-or-comment.ts +40 -0
- package/scripts/issue/issue-cite-cli.ts +0 -9
- package/scripts/issue/issue-cite-main.ts +12 -0
- package/scripts/issue/issue-classification.ts +12 -7
- package/scripts/issue/issue-comment-cli.ts +10 -24
- package/scripts/issue/issue-comment-main.ts +12 -0
- package/scripts/issue/issue-evidence-exit.ts +100 -0
- package/scripts/issue/issue-file-cli.ts +29 -7
- package/scripts/issue/issue-file.ts +19 -19
- package/scripts/issue/issue-fold-cli.ts +2 -11
- package/scripts/issue/issue-fold-main.ts +12 -0
- package/scripts/issue/issue-labels.ts +81 -90
- package/scripts/issue/issue-lint-cli.ts +2 -10
- package/scripts/issue/issue-lint-main.ts +12 -0
- package/scripts/issue/issue-measured-cli.ts +56 -0
- package/scripts/issue/issue-merged.ts +19 -2
- package/scripts/issue/issue-not-before-label.ts +135 -0
- package/scripts/issue/issue-not-before.ts +111 -0
- package/scripts/issue/issue-number-shape.ts +15 -1
- package/scripts/issue/issue-park.ts +28 -0
- package/scripts/issue/issue-plan-cli.ts +151 -0
- package/scripts/issue/issue-priority.ts +151 -0
- package/scripts/issue/issue-rank.ts +7 -1
- package/scripts/issue/issue-read-cli.ts +3 -10
- package/scripts/issue/issue-read-main.ts +12 -0
- package/scripts/issue/issue-read.ts +29 -5
- package/scripts/issue/issue-release-cli.ts +0 -10
- package/scripts/issue/issue-release-main.ts +13 -0
- package/scripts/issue/issue-release.ts +7 -12
- package/scripts/issue/issue-sample-gate.ts +192 -0
- package/scripts/issue/issue-sample-source.ts +76 -0
- package/scripts/issue/issue-scout-cli.ts +0 -11
- package/scripts/issue/issue-scout-main.ts +14 -0
- package/scripts/issue/issue-state-cli.ts +0 -10
- package/scripts/issue/issue-state-main.ts +12 -0
- package/scripts/issue/issue-watch-diff.ts +56 -15
- package/scripts/issue/issue-watch.ts +2 -1
- package/scripts/issue/issue-wip.ts +2 -7
- package/scripts/issue/measure-rerun-cli.ts +13 -8
- package/scripts/issue/plan-consumers-cli.ts +39 -0
- package/scripts/issue/plan-consumers-main.ts +11 -0
- package/scripts/issue/plan-consumers-section.ts +55 -0
- package/scripts/issue/plan-consumers.ts +127 -0
- package/scripts/josh/agent-session-environment.ts +1 -1
- package/scripts/josh/command-usage.ts +15 -43
- package/scripts/josh/file-map-stamp.ts +49 -16
- package/scripts/josh/hook-decision.ts +32 -20
- package/scripts/josh/josh-command-map.ts +4 -1
- package/scripts/josh/josh-command-types.ts +12 -6
- package/scripts/josh/josh-commands-agent-hooks.ts +83 -0
- package/scripts/josh/josh-commands-ai.ts +157 -158
- package/scripts/josh/josh-commands-backlog.ts +82 -16
- package/scripts/josh/josh-commands-clone.ts +1 -0
- package/scripts/josh/josh-commands-development.ts +111 -71
- package/scripts/josh/josh-commands-document.ts +43 -1
- package/scripts/josh/josh-commands-epic.ts +171 -0
- package/scripts/josh/josh-commands-hooks.ts +25 -2
- package/scripts/josh/josh-commands-issue-write.ts +181 -0
- package/scripts/josh/josh-commands-issue.ts +124 -24
- package/scripts/josh/josh-commands-lane.ts +103 -2
- package/scripts/josh/josh-commands-lint.ts +19 -8
- package/scripts/josh/josh-commands-maintenance.ts +112 -4
- package/scripts/josh/josh-commands-pause.ts +29 -0
- package/scripts/josh/josh-commands-progress.ts +87 -0
- package/scripts/josh/josh-commands-project.ts +138 -9
- package/scripts/josh/josh-commands-review.ts +124 -0
- package/scripts/josh/josh-commands-run.ts +211 -23
- package/scripts/josh/josh-commands-ship.ts +169 -0
- package/scripts/josh/josh-commands-split.ts +9 -0
- package/scripts/josh/josh-commands-versioning.ts +49 -2
- package/scripts/josh/josh-commands-workflow.ts +144 -6
- package/scripts/josh/josh-logic.ts +6 -13
- package/scripts/josh/package-directory.ts +2 -4
- package/scripts/josh/process-identity.ts +13 -4
- package/scripts/josh/session-language-cli.ts +4 -8
- package/scripts/josh/session-language-main.ts +13 -0
- package/scripts/josh/session-language.ts +6 -1
- package/scripts/josh/shared-cache.ts +90 -0
- package/scripts/josh/stamp-file.ts +9 -15
- package/scripts/lane/lane-await.ts +51 -12
- package/scripts/lane/lane-cache.ts +5 -30
- package/scripts/lane/lane-capacity.ts +14 -23
- package/scripts/lane/lane-check-stats.ts +62 -21
- package/scripts/lane/lane-child-invocation.ts +8 -0
- package/scripts/lane/lane-cli.ts +15 -5
- package/scripts/lane/lane-close.ts +86 -18
- package/scripts/lane/lane-core-wait-stats.ts +66 -0
- package/scripts/lane/lane-dispatch.ts +24 -3
- package/scripts/lane/lane-gap-stats.ts +156 -0
- package/scripts/lane/lane-handoff.ts +69 -1
- package/scripts/lane/lane-held-stats.ts +129 -0
- package/scripts/lane/lane-install.ts +4 -11
- package/scripts/lane/lane-launch-cli.ts +0 -9
- package/scripts/lane/lane-launch-main.ts +12 -0
- package/scripts/lane/lane-ledger-schema.ts +266 -0
- package/scripts/lane/lane-ledger.ts +92 -123
- package/scripts/lane/lane-limit-cli.ts +12 -1
- package/scripts/lane/lane-measure-cli.ts +57 -11
- package/scripts/lane/lane-open.ts +9 -1
- package/scripts/lane/lane-parked.ts +3 -3
- package/scripts/lane/lane-pause-cli.ts +130 -0
- package/scripts/lane/lane-pause.ts +158 -0
- package/scripts/lane/lane-process-table.ts +166 -0
- package/scripts/lane/lane-reap-settle.ts +124 -0
- package/scripts/lane/lane-reap.ts +50 -15
- package/scripts/lane/lane-registry.ts +24 -3
- package/scripts/lane/lane-residents.ts +162 -0
- package/scripts/lane/lane-restart.ts +22 -2
- package/scripts/lane/lane-round-two-stats.ts +49 -0
- package/scripts/lane/lane-sampler.ts +4 -0
- package/scripts/lane/lane-session-action.ts +19 -5
- package/scripts/lane/lane-session-broker.ts +102 -21
- package/scripts/lane/lane-snapshot-trace.ts +84 -0
- package/scripts/lane/lane-spans.ts +51 -0
- package/scripts/lane/lane-spent.ts +6 -3
- package/scripts/lane/lane-stage-stats.ts +7 -2
- package/scripts/lane/lane-state.ts +302 -0
- package/scripts/lane/lane-stats.ts +58 -4
- package/scripts/lane/lane-stop-stats.ts +113 -37
- package/scripts/lane/lane-test-related-stats.ts +127 -0
- package/scripts/lane/lane-transcript-calls.ts +145 -0
- package/scripts/lane/lane-transcript-stats.ts +168 -0
- package/scripts/lane/lane-vacant.ts +13 -3
- package/scripts/lane/lane-withdraw-cli.ts +5 -4
- package/scripts/lane/lane-withdraw.ts +50 -49
- package/scripts/lane/process-directories.ts +70 -0
- package/scripts/lane/process-lane-marks.ts +94 -0
- package/scripts/lib/atomic-write.ts +62 -0
- package/scripts/lib/buffered-process.ts +12 -5
- package/scripts/lib/cli-flags.ts +53 -0
- package/scripts/lib/figure-format.ts +63 -0
- package/scripts/lib/json-value.ts +9 -1
- package/scripts/lib/package-manifest.ts +35 -0
- package/scripts/lib/read-file.ts +3 -1
- package/scripts/lib/stamped-memo.ts +63 -0
- package/scripts/lib/stdout-on-stderr.ts +24 -0
- package/scripts/lib/timeouts.ts +9 -0
- package/scripts/lib/transcript-record.ts +91 -0
- package/scripts/lines/effective-limit.ts +1 -1
- package/scripts/lint/eslint-cache-dependencies.ts +145 -0
- package/scripts/lint/eslint-daemon.ts +265 -0
- package/scripts/lint/format.ts +11 -2
- package/scripts/lint/import-graph.ts +279 -0
- package/scripts/lint/lint-gate-scope.ts +102 -0
- package/scripts/lint/lint-parallel-main.ts +19 -0
- package/scripts/lint/lint-parallel.ts +62 -30
- package/scripts/lint/lint-related-scope.ts +30 -24
- package/scripts/lint/lint-related.ts +38 -6
- package/scripts/notify/confirmation-options.ts +1 -2
- package/scripts/notify/telegram-notify.ts +20 -20
- package/scripts/notify/telegram-test-logic.ts +0 -1
- package/scripts/notify/telegram-test-main.ts +8 -0
- package/scripts/notify/telegram-test.ts +2 -6
- package/scripts/observations/observation-ledger.ts +13 -0
- package/scripts/observations/observations-flush-landing.ts +5 -3
- package/scripts/observations/observations-flush.ts +6 -1
- package/scripts/overrides/overrides-check.ts +2 -5
- package/scripts/overrides/overrides-files.ts +2 -1
- package/scripts/overrides/overrides-logic.ts +3 -6
- package/scripts/package/verify-optional-eslint-install.ts +8 -6
- package/scripts/propagate/propagate-publish.ts +2 -7
- package/scripts/propagate/propagate-targets.ts +4 -12
- package/scripts/refactor/import-graph.ts +9 -7
- package/scripts/release/github-release-runs.ts +17 -6
- package/scripts/release/release-approval-prune.ts +18 -0
- package/scripts/release/release-history.ts +1 -3
- package/scripts/release/release-progress.ts +42 -22
- package/scripts/release/release-publish-run.ts +39 -0
- package/scripts/release/release-publish.ts +6 -6
- package/scripts/release/release-scope-cli.ts +0 -10
- package/scripts/release/release-scope-main.ts +12 -0
- package/scripts/repo/repo-setting.ts +3 -6
- package/scripts/repo/required-checks-logic.ts +6 -15
- package/scripts/report/report-format-reference.ts +2 -0
- package/scripts/report/report-labels.ts +155 -0
- package/scripts/report/report-lint-cli.ts +3 -0
- package/scripts/report/report-lint.ts +85 -110
- package/scripts/report/report-template-cli.ts +59 -0
- package/scripts/report/report-template.ts +112 -0
- package/scripts/review/acceptance-map.ts +1 -0
- package/scripts/review/removed-tests-check.ts +86 -0
- package/scripts/review/removed-tests.ts +149 -0
- package/scripts/review/review-brief-cli.ts +81 -15
- package/scripts/review/review-brief-main.ts +12 -0
- package/scripts/review/review-brief.ts +31 -3
- package/scripts/review/review-code-tree.ts +10 -6
- package/scripts/review/review-comment-round.ts +26 -8
- package/scripts/review/review-finding-ledger.ts +30 -15
- package/scripts/review/review-interaction.ts +94 -0
- package/scripts/review/review-readers-scan.ts +163 -0
- package/scripts/review/review-record-cli.ts +69 -30
- package/scripts/review/review-record-main.ts +12 -0
- package/scripts/review/review-round-one-blobs.ts +221 -0
- package/scripts/review/review-round2-cli.ts +49 -12
- package/scripts/review/review-round2.ts +80 -12
- package/scripts/review/review-stamps.ts +19 -1
- package/scripts/review/review-stop-log.ts +96 -0
- package/scripts/review/review-stops-cli.ts +85 -0
- package/scripts/review/review-tree.ts +6 -17
- package/scripts/review/review-untouched-readers.ts +146 -0
- package/scripts/review/test-titles.ts +118 -0
- package/scripts/rules/agent-model.ts +8 -0
- package/scripts/rules/bash-triggers.ts +46 -3
- package/scripts/rules/decision-oracle-batch.ts +9 -1
- package/scripts/rules/decision-oracle.ts +2 -2
- package/scripts/rules/delivered-rules.ts +80 -2
- package/scripts/rules/destructive-command.ts +8 -1
- package/scripts/rules/direct-filing.ts +10 -2
- package/scripts/rules/direct-issue-comment.ts +117 -0
- package/scripts/rules/direct-pr-create.ts +69 -3
- package/scripts/rules/early-heartbeat.ts +2 -1
- package/scripts/rules/file-body.ts +7 -0
- package/scripts/rules/filing-cap.ts +7 -0
- package/scripts/rules/git-argv.ts +72 -14
- package/scripts/rules/git-force.ts +12 -2
- package/scripts/rules/guard-remedy.ts +4 -0
- package/scripts/rules/implementation-cut-verdict.ts +1 -1
- package/scripts/rules/implementation-cut.ts +11 -3
- package/scripts/rules/index-guard.ts +8 -1
- package/scripts/rules/issue-comments.ts +9 -1
- package/scripts/rules/josh-git-bare.ts +7 -0
- package/scripts/rules/lane-background.ts +67 -25
- package/scripts/rules/lane-carry-conflict.ts +6 -0
- package/scripts/rules/lane-direct-tool.ts +74 -0
- package/scripts/rules/lane-interactive-ask.ts +9 -2
- package/scripts/rules/lane-park.ts +45 -23
- package/scripts/rules/lane-split-park.ts +10 -2
- package/scripts/rules/lane-switch-main.ts +7 -0
- package/scripts/rules/oracle-consulted.ts +10 -0
- package/scripts/rules/oracle-firing.ts +1 -0
- package/scripts/rules/permission-guards.ts +3 -0
- package/scripts/rules/piped-verification.ts +1 -1
- package/scripts/rules/poll-loop.ts +7 -0
- package/scripts/rules/pr-merge.ts +123 -0
- package/scripts/rules/protected-files.ts +32 -5
- package/scripts/rules/raw-field-body.ts +6 -0
- package/scripts/rules/rule-body-guard.ts +8 -0
- package/scripts/rules/rule-list.ts +9 -28
- package/scripts/rules/rule-value-cache.ts +4 -9
- package/scripts/rules/rule-value-cli.ts +51 -32
- package/scripts/rules/rule-value.ts +1 -1
- package/scripts/rules/shell-segments.ts +35 -0
- package/scripts/rules/stop-rule-rows.ts +64 -0
- package/scripts/rules/stop-rules.ts +3 -4
- package/scripts/rules/test-declared-commit.ts +11 -1
- package/scripts/rules/third-party-write.ts +7 -0
- package/scripts/rules/timed-rerun.ts +69 -0
- package/scripts/rules/worktree-guard.ts +13 -3
- package/scripts/run/board/run-board-app-name.ts +23 -0
- package/scripts/run/board/run-board-cli.ts +65 -32
- package/scripts/run/board/run-board-earlier.ts +94 -0
- package/scripts/run/board/run-board-ending-reason.ts +67 -0
- package/scripts/run/board/run-board-estimate-schedule.ts +103 -0
- package/scripts/run/board/run-board-estimate.ts +98 -0
- package/scripts/run/board/run-board-fit.ts +153 -36
- package/scripts/run/board/run-board-fold.ts +123 -0
- package/scripts/run/board/run-board-fresh.ts +2 -2
- package/scripts/run/board/run-board-gather-live.ts +29 -0
- package/scripts/run/board/run-board-gather-thread.ts +189 -0
- package/scripts/run/board/run-board-gather-worker.ts +29 -0
- package/scripts/run/board/run-board-gather.ts +187 -0
- package/scripts/run/board/run-board-github.ts +118 -38
- package/scripts/run/board/run-board-header.ts +82 -20
- package/scripts/run/board/run-board-keys.ts +58 -0
- package/scripts/run/board/run-board-kind.ts +20 -6
- package/scripts/run/board/run-board-labels.ts +116 -71
- package/scripts/run/board/run-board-lane-state.ts +109 -0
- package/scripts/run/board/run-board-lane-time.ts +122 -0
- package/scripts/run/board/run-board-layout.ts +239 -60
- package/scripts/run/board/run-board-length.ts +52 -0
- package/scripts/run/board/run-board-machine.ts +8 -4
- package/scripts/run/board/run-board-main.ts +12 -0
- package/scripts/run/board/run-board-notes.ts +52 -31
- package/scripts/run/board/run-board-now.ts +1 -1
- package/scripts/run/board/run-board-operation.ts +15 -33
- package/scripts/run/board/run-board-phase.ts +1 -1
- package/scripts/run/board/run-board-plan-shared.ts +115 -0
- package/scripts/run/board/run-board-plan.ts +55 -3
- package/scripts/run/board/run-board-planning.ts +45 -0
- package/scripts/run/board/run-board-priority.ts +44 -0
- package/scripts/run/board/run-board-process-groups.ts +195 -0
- package/scripts/run/board/run-board-read.ts +151 -27
- package/scripts/run/board/run-board-reason.ts +235 -51
- package/scripts/run/board/run-board-released.ts +35 -0
- package/scripts/run/board/run-board-render-checks.ts +39 -5
- package/scripts/run/board/run-board-render-condition.ts +96 -0
- package/scripts/run/board/run-board-render-drawn.ts +67 -0
- package/scripts/run/board/run-board-render-foot.ts +59 -0
- package/scripts/run/board/run-board-render-icon.ts +35 -0
- package/scripts/run/board/run-board-render-lanes.ts +145 -0
- package/scripts/run/board/run-board-render-lead.ts +80 -0
- package/scripts/run/board/run-board-render-legend.ts +117 -48
- package/scripts/run/board/run-board-render-notes.ts +156 -29
- package/scripts/run/board/run-board-render-processes.ts +196 -0
- package/scripts/run/board/run-board-render-section.ts +119 -0
- package/scripts/run/board/run-board-render-slot.ts +3 -36
- package/scripts/run/board/run-board-render-tail.ts +115 -48
- package/scripts/run/board/run-board-render-time.ts +56 -0
- package/scripts/run/board/run-board-render-title.ts +117 -24
- package/scripts/run/board/run-board-render-waits.ts +104 -20
- package/scripts/run/board/run-board-render.ts +207 -265
- package/scripts/run/board/run-board-roots.ts +54 -0
- package/scripts/run/board/run-board-row-yield.ts +9 -4
- package/scripts/run/board/run-board-setup.ts +1 -12
- package/scripts/run/board/run-board-snapshot.ts +111 -0
- package/scripts/run/board/run-board-spin.ts +2 -2
- package/scripts/run/board/run-board-state.ts +22 -33
- package/scripts/run/board/run-board-status.ts +147 -71
- package/scripts/run/board/run-board-thanks-read.ts +2 -2
- package/scripts/run/board/run-board-tick.ts +122 -107
- package/scripts/run/board/run-board-usage-board.ts +78 -0
- package/scripts/run/board/run-board-usage-lanes.ts +113 -0
- package/scripts/run/board/run-board-usage-listing.ts +93 -0
- package/scripts/run/board/run-board-usage-read.ts +120 -150
- package/scripts/run/board/run-board-usage-rusage.ts +19 -7
- package/scripts/run/board/run-board-usage-text.ts +139 -51
- package/scripts/run/board/run-board-usage-top.ts +102 -0
- package/scripts/run/board/run-board-usage.ts +89 -72
- package/scripts/run/board/run-board-usual.ts +20 -9
- package/scripts/run/carry/run-carry-args.ts +4 -7
- package/scripts/run/carry/run-carry-conversation.ts +1 -1
- package/scripts/run/carry/run-carry.ts +9 -4
- package/scripts/run/cut/run-cut-handoff.ts +2 -2
- package/scripts/run/event/run-event-cli.ts +1 -5
- package/scripts/run/event/run-event-filed.ts +12 -6
- package/scripts/run/event/run-event-follow.ts +2 -3
- package/scripts/run/event/run-event-render.ts +6 -10
- package/scripts/run/event/run-event-scope.ts +2 -2
- package/scripts/run/event/run-event-stream-emit.ts +82 -22
- package/scripts/run/event/run-event-stream.ts +34 -8
- package/scripts/run/hold/run-hold-adopt.ts +65 -0
- package/scripts/run/hold/run-hold-cli.ts +93 -22
- package/scripts/run/hold/run-hold-main.ts +12 -0
- package/scripts/run/hold/run-hold-member.ts +37 -0
- package/scripts/run/hold/run-stop-notify.ts +183 -0
- package/scripts/run/merge/run-merge-auth.ts +31 -0
- package/scripts/run/merge/run-merge-cli.ts +62 -48
- package/scripts/run/merge/run-merge-close.ts +74 -0
- package/scripts/run/merge/run-merge-collect.ts +6 -13
- package/scripts/run/merge/run-merge-driver.ts +71 -0
- package/scripts/run/merge/run-merge-main.ts +12 -0
- package/scripts/run/merge/run-merge-outcome.ts +23 -0
- package/scripts/run/merge/run-merge-restart.ts +39 -0
- package/scripts/run/merge/run-merge-ship.ts +20 -4
- package/scripts/run/merge/run-merge-signals.ts +33 -9
- package/scripts/run/merge/run-merge-steps.ts +120 -85
- package/scripts/run/merge/run-merge.ts +38 -37
- package/scripts/run/park/run-park-cli.ts +91 -0
- package/scripts/run/park/run-park.ts +88 -0
- package/scripts/run/park/run-stalled.ts +68 -0
- package/scripts/run/pause/run-pause-cli.ts +73 -0
- package/scripts/run/pause/run-pause.ts +251 -0
- package/scripts/run/progress/run-progress-cli.ts +4 -12
- package/scripts/run/progress/run-progress-clock.ts +1 -1
- package/scripts/run/progress/run-progress-config.ts +6 -14
- package/scripts/run/progress/run-progress-main.ts +12 -0
- package/scripts/run/progress/run-progress.ts +1 -4
- package/scripts/run/review/run-review.ts +2 -1
- package/scripts/run/run-ending.ts +1 -0
- package/scripts/run/run-invocation.ts +5 -6
- package/scripts/run/run-liveness-cli.ts +6 -8
- package/scripts/run/run-liveness.ts +60 -29
- package/scripts/run/run-next.ts +1 -1
- package/scripts/run/run-parent-cut-hook.ts +2 -2
- package/scripts/run/run-preflight.ts +18 -3
- package/scripts/run/run-prep-cli.ts +1 -10
- package/scripts/run/run-prep-locate.ts +7 -50
- package/scripts/run/run-prep-main.ts +12 -0
- package/scripts/run/run-prep.ts +6 -0
- package/scripts/run/run-report-cli.ts +101 -13
- package/scripts/run/run-report-handoff.ts +114 -0
- package/scripts/run/run-step.ts +1 -1
- package/scripts/run/run-stranded-detect.ts +13 -0
- package/scripts/run/run-watcher-guard-cli.ts +1 -1
- package/scripts/run/run-watcher-guard.ts +1 -1
- package/scripts/run/ship/run-ship-args.ts +121 -0
- package/scripts/run/ship/run-ship-body-draft.ts +110 -0
- package/scripts/run/ship/run-ship-cli.ts +63 -140
- package/scripts/run/ship/run-ship-detach.ts +19 -8
- package/scripts/run/ship/run-ship-infra-retry.ts +59 -0
- package/scripts/run/ship/run-ship-next.ts +18 -2
- package/scripts/run/ship/run-ship-overlap.ts +42 -5
- package/scripts/run/ship/run-ship-place.ts +96 -0
- package/scripts/run/ship/run-ship-pre-detach-timed.ts +43 -0
- package/scripts/run/ship/run-ship-pre-detach.ts +81 -24
- package/scripts/run/ship/run-ship-preflight.ts +137 -32
- package/scripts/run/ship/run-ship-probe.ts +11 -3
- package/scripts/run/ship/run-ship-relaunch-cap.ts +70 -0
- package/scripts/run/ship/run-ship-removed-rows.ts +61 -0
- package/scripts/run/ship/run-ship-return.ts +107 -23
- package/scripts/run/ship/run-ship-review-steps.ts +105 -151
- package/scripts/run/ship/run-ship-review.ts +73 -6
- package/scripts/run/ship/run-ship-reviewer.ts +207 -0
- package/scripts/run/ship/run-ship-stage.ts +55 -6
- package/scripts/run/ship/run-ship-steps.ts +46 -15
- package/scripts/run/ship/run-ship-stop-cause.ts +135 -0
- package/scripts/run/ship/run-ship-stop-text.ts +11 -6
- package/scripts/run/ship/run-ship-sync.ts +43 -6
- package/scripts/run/ship/run-ship.ts +30 -2
- package/scripts/run/tidy/run-tidy-cli.ts +0 -4
- package/scripts/run/tidy/run-tidy-lanes.ts +3 -0
- package/scripts/run/tidy/run-tidy-main.ts +8 -0
- package/scripts/run/wake/run-wake-cli.ts +119 -100
- package/scripts/run/wake/run-wake-code.ts +83 -0
- package/scripts/run/wake/run-wake-driver.ts +19 -8
- package/scripts/run/wake/run-wake-loop.ts +34 -3
- package/scripts/run/wake/run-wake-main.ts +13 -0
- package/scripts/run/wake/run-wake-ports.ts +90 -0
- package/scripts/run/wake/run-wake-takeover.ts +66 -0
- package/scripts/run/wake/run-wake.ts +2 -1
- package/scripts/safe-chain/pack-hook.ts +2 -2
- package/scripts/safe-chain/preinstall-command.ts +2 -1
- package/scripts/safe-chain/project-config.ts +3 -9
- package/scripts/security/security-audit-main.ts +8 -0
- package/scripts/security/security-audit-provision-logic.ts +0 -11
- package/scripts/security/security-audit-provision-main.ts +12 -0
- package/scripts/security/security-audit-provision.ts +11 -26
- package/scripts/security/security-audit.ts +6 -7
- package/scripts/self-sync-guard/self-sync-guard-logic.ts +6 -13
- package/scripts/split/split-assess-cli.ts +2 -2
- package/scripts/split/split-assess.ts +15 -0
- package/scripts/split/split-measure.ts +65 -0
- package/scripts/sync/claude-settings-merge.ts +8 -15
- package/scripts/sync/directory-copy-guard.ts +4 -9
- package/scripts/sync/file-content.ts +78 -8
- package/scripts/sync/sync-ai-files.ts +3 -5
- package/scripts/sync/sync-configs.ts +11 -23
- package/scripts/sync/sync-hook-safety.ts +4 -10
- package/scripts/sync/sync-main.ts +11 -0
- package/scripts/sync/sync.ts +25 -37
- package/scripts/test/test-declared-changed.ts +2 -2
- package/scripts/test/test-declared.ts +1 -1
- package/scripts/test/test-e2e-guard.ts +25 -1
- package/scripts/test/test-e2e-stamp.ts +38 -0
- package/scripts/test/test-pinned-logic.ts +145 -0
- package/scripts/test/test-pinned-main.ts +78 -0
- package/scripts/test/test-pinned.ts +100 -0
- package/scripts/test/test-read-map.ts +264 -0
- package/scripts/test/test-read-recording.ts +91 -0
- package/scripts/test/test-read-trace.ts +148 -0
- package/scripts/test/test-red-main.ts +12 -0
- package/scripts/test/test-red.ts +12 -30
- package/scripts/test/test-related-main.ts +18 -0
- package/scripts/test/test-related-record.ts +119 -0
- package/scripts/test/test-related-scope.ts +229 -43
- package/scripts/test/test-related.ts +300 -22
- package/scripts/test/test-unit-guard-main.ts +15 -0
- package/scripts/test/test-unit-guard.ts +42 -24
- package/scripts/test/unit-count-file.ts +37 -0
- package/scripts/test/unit-run-marker.ts +162 -0
- package/scripts/test/unit-setup-files.ts +51 -0
- package/scripts/test/unit-worker-share.ts +61 -149
- package/scripts/test/whole-suite-files.ts +63 -0
- package/scripts/time-runtime/time-background.ts +20 -2
- package/scripts/time-runtime/time-bundles.ts +4 -3
- package/scripts/time-runtime/time-density-hook.ts +8 -6
- package/scripts/time-runtime/time-followup-stage.ts +1 -3
- package/scripts/time-runtime/time-format.ts +5 -28
- package/scripts/time-runtime/time-markers.ts +10 -1
- package/scripts/time-runtime/time-shell.ts +97 -10
- package/scripts/time-runtime/time-transcript-line.ts +49 -62
- package/scripts/uninstall/uninstall.ts +1 -1
- package/scripts/version/bump-version-main.ts +12 -0
- package/scripts/version/bump-version.ts +25 -25
- package/scripts/version/effective-upstream.ts +6 -12
- package/scripts/version/latest-corepack.ts +17 -32
- package/scripts/version/latest-if-required-cli.ts +93 -0
- package/scripts/version/latest-lane-guard-main.ts +8 -0
- package/scripts/version/latest-lane-guard.ts +0 -4
- package/scripts/version/latest-scope-cli.ts +0 -9
- package/scripts/version/latest-scope-main.ts +12 -0
- package/scripts/version/latest-update.ts +5 -5
- package/scripts/version/npm-registry.ts +44 -6
- package/scripts/version/publishable-range-check.ts +5 -16
- package/scripts/version/release-age.ts +1 -1
- package/scripts/version/release-hold.ts +1 -1
- package/scripts/version/release-window.ts +38 -0
- package/scripts/version/running-binary.ts +1 -1
- package/scripts/version/safe-chain-version-update.ts +3 -8
- package/scripts/version/version-targets.ts +6 -28
- package/templates/dependabot.yml +29 -0
- package/templates/gitignore +4 -1
- package/templates/pnpm-workspace.basic.yaml +1 -1
- package/templates/sonar-project.properties +3 -2
- package/templates/workflows/ci.yml +12 -4
- package/templates/workflows/github-release.yml +4 -0
- package/tsconfig.sonar.json +1 -1
- package/.ncurc.json +0 -3
- package/dist/hooks/batch-guard.js +0 -29
- package/dist/hooks/chunk-4KKD2UTK.js +0 -66
- package/dist/hooks/chunk-6TS2JD6D.js +0 -237
- package/dist/hooks/chunk-7DSBJVFH.js +0 -50
- package/dist/hooks/chunk-A65Y4YOR.js +0 -79
- package/dist/hooks/chunk-CDY4NFQG.js +0 -15
- package/dist/hooks/chunk-EFXE6C37.js +0 -81
- package/dist/hooks/chunk-GP4IEC4O.js +0 -20
- package/dist/hooks/chunk-JP45SOCJ.js +0 -56
- package/dist/hooks/chunk-LAOV7NLM.js +0 -45
- package/dist/hooks/chunk-M4HGZV7U.js +0 -83
- package/dist/hooks/chunk-PF2NZL2A.js +0 -131
- package/dist/hooks/chunk-PTICX4OL.js +0 -358
- package/dist/hooks/chunk-RT27QRJW.js +0 -6247
- package/dist/hooks/chunk-SYOTDYCI.js +0 -3533
- package/dist/hooks/chunk-UPUZF3AN.js +0 -279
- package/dist/hooks/chunk-WK6SMBIC.js +0 -3180
- package/dist/hooks/duplicate-read-guard.js +0 -30
- package/dist/hooks/investigation-guard.js +0 -29
- package/scripts/backlog/backlog-stalled-cli.ts +0 -30
- package/scripts/cost-runtime/cost-format.ts +0 -29
- package/scripts/init/basic-path-migration.ts +0 -24
- package/scripts/issue/issue-backlinks-cli.ts +0 -93
- package/scripts/josh/josh-commands-guard.ts +0 -38
- package/scripts/josh/josh-usage-automation.ts +0 -121
- package/scripts/josh/josh-usage-backlog.ts +0 -180
- package/scripts/josh/josh-usage-developer.ts +0 -230
- package/scripts/josh/josh-usage-hooks.ts +0 -38
- package/scripts/josh/josh-usage-issue.ts +0 -205
- package/scripts/josh/josh-usage-review.ts +0 -101
- package/scripts/josh/josh-usage-run.ts +0 -252
- package/scripts/josh/josh-usage-session.ts +0 -238
- package/scripts/josh/josh-usage-workflow.ts +0 -212
- package/scripts/lint/cross-file-recheck.ts +0 -155
- package/scripts/registry-migration/migrate-logic.ts +0 -237
- package/scripts/registry-migration/migrate.ts +0 -292
- package/scripts/registry-migration/user-npmrc.ts +0 -15
- package/scripts/rules/rule-guard.ts +0 -23
- package/scripts/rules/rule-registry-rows.ts +0 -292
- package/scripts/rules/rule-registry.ts +0 -112
- package/scripts/run/run-stranded-cli.ts +0 -27
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { api_auth } from '#scripts/agent/api-auth'
|
|
1
2
|
import { api_outage } from '#scripts/agent/api-outage'
|
|
2
3
|
import { issue_closing_pr } from '#scripts/issue/issue-closing-pr'
|
|
3
4
|
import { issue_merged } from '#scripts/issue/issue-merged'
|
|
@@ -7,6 +8,7 @@ import { run_event_stream } from '#scripts/run/event/run-event-stream'
|
|
|
7
8
|
import { run_event_stream_emit } from '#scripts/run/event/run-event-stream-emit'
|
|
8
9
|
import { run_ending } from '#scripts/run/run-ending'
|
|
9
10
|
import { run_merge, type ChildOutcome, type EndingSignals } from './run-merge'
|
|
11
|
+
import { run_merge_restart } from './run-merge-restart'
|
|
10
12
|
import { run_merge_ship } from './run-merge-ship'
|
|
11
13
|
import { run_merge_steps, type MergeContext } from './run-merge-steps'
|
|
12
14
|
|
|
@@ -25,6 +27,15 @@ function read_is_outage(output: string | undefined): boolean {
|
|
|
25
27
|
return api_outage.is_outage(run_ending.read_exit(output)) || run_ending.ended_mid_turn(output)
|
|
26
28
|
}
|
|
27
29
|
|
|
30
|
+
// Whether the child's session ended because it could not authenticate — off without `--output`, as the
|
|
31
|
+
// outage read is. The lane's log is appended across launches, so it is read as the reviewer's is
|
|
32
|
+
// (`api_auth.is_auth_failed_transcript`).
|
|
33
|
+
function read_is_auth_failure(output: string | undefined): boolean {
|
|
34
|
+
if (output === undefined) return false
|
|
35
|
+
|
|
36
|
+
return api_auth.is_auth_failed_transcript(run_ending.read_transcript(output))
|
|
37
|
+
}
|
|
38
|
+
|
|
28
39
|
async function child_outages(child: string): Promise<number> {
|
|
29
40
|
const events = await run_event_stream_emit.current_events()
|
|
30
41
|
|
|
@@ -35,22 +46,33 @@ async function child_outages(child: string): Promise<number> {
|
|
|
35
46
|
).length
|
|
36
47
|
}
|
|
37
48
|
|
|
49
|
+
// Why an unfinished child is re-dispatchable, or `undefined` when it is not. **Only an API outage adds
|
|
50
|
+
// to the run-wide streak**: a host restart is over by the time the child is read (joshuafolkken/kit#4540),
|
|
51
|
+
// and an unanswered ship stop reached the API (joshuafolkken/kit#3974).
|
|
52
|
+
async function retry_cause(
|
|
53
|
+
child: string,
|
|
54
|
+
output: string | undefined,
|
|
55
|
+
): Promise<'api' | 'exempt' | undefined> {
|
|
56
|
+
if (await run_merge_restart.is_host_restart(child, output)) return 'exempt'
|
|
57
|
+
|
|
58
|
+
if (read_is_outage(output)) return 'api'
|
|
59
|
+
|
|
60
|
+
return (await run_merge_ship.is_unanswered(child, output)) ? 'exempt' : undefined
|
|
61
|
+
}
|
|
62
|
+
|
|
38
63
|
// An outage child is re-dispatched only so many times: one that ends the same way on every dispatch is
|
|
39
|
-
// parked, since merges in other lanes reset the run-wide outage streak and would never stop it.
|
|
40
|
-
// unanswered ship stop is told apart from an API outage**: the child reached the API, so it is
|
|
41
|
-
// re-dispatched without adding to the run-wide streak (joshuafolkken/kit#3974).
|
|
64
|
+
// parked, since merges in other lanes reset the run-wide outage streak and would never stop it.
|
|
42
65
|
async function read_retryable(
|
|
43
66
|
child: string,
|
|
44
67
|
output: string | undefined,
|
|
45
|
-
): Promise<{ is_outage: boolean;
|
|
46
|
-
const
|
|
47
|
-
const is_unanswered = !is_api_outage && (await run_merge_ship.is_unanswered(child, output))
|
|
68
|
+
): Promise<{ is_outage: boolean; is_streak_exempt: boolean }> {
|
|
69
|
+
const cause = await retry_cause(child, output)
|
|
48
70
|
|
|
49
|
-
if (
|
|
71
|
+
if (cause === undefined) return { is_outage: false, is_streak_exempt: false }
|
|
50
72
|
|
|
51
73
|
const is_outage = (await child_outages(child)) < run_merge.CONSECUTIVE_OUTAGE_LIMIT
|
|
52
74
|
|
|
53
|
-
return { is_outage,
|
|
75
|
+
return { is_outage, is_streak_exempt: is_outage && cause === 'exempt' }
|
|
54
76
|
}
|
|
55
77
|
|
|
56
78
|
// The timeline is read only for an OPEN, unparked child — the one classification a merged closing pull
|
|
@@ -83,7 +105,9 @@ async function read_signals(ctx: MergeContext, read: IssueRead): Promise<EndingS
|
|
|
83
105
|
read_is_withdrawn(ctx.child, read),
|
|
84
106
|
])
|
|
85
107
|
|
|
86
|
-
|
|
108
|
+
const is_auth_failure = read_is_auth_failure(ctx.output)
|
|
109
|
+
|
|
110
|
+
return { ...retryable, is_cut, merged_pr, is_withdrawn, is_auth_failure }
|
|
87
111
|
}
|
|
88
112
|
|
|
89
113
|
// An unread state is `unresolved` unless a withdrawal already settled the child, which is read locally;
|
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
import { existsSync } from 'node:fs'
|
|
2
2
|
import path from 'node:path'
|
|
3
|
-
import { git_followup_issue_close } from '#scripts/followup/git-followup-issue-close'
|
|
4
3
|
import { git_gh_command } from '#scripts/gh/git-gh-command'
|
|
5
4
|
import { git_gh_issue_write } from '#scripts/gh/git-gh-issue-write'
|
|
6
5
|
import { git_stash } from '#scripts/git/stash/git-stash'
|
|
7
6
|
import { issue_cite } from '#scripts/issue/issue-cite'
|
|
8
|
-
import {
|
|
7
|
+
import { has_label_name, NOT_BEFORE_LABEL, RUN_STALLED_LABEL } from '#scripts/issue/issue-labels'
|
|
8
|
+
import { issue_not_before } from '#scripts/issue/issue-not-before'
|
|
9
|
+
import { issue_park } from '#scripts/issue/issue-park'
|
|
10
|
+
import { issue_sample_gate } from '#scripts/issue/issue-sample-gate'
|
|
11
|
+
import { issue_state_cli } from '#scripts/issue/issue-state-cli'
|
|
9
12
|
import { session_cite } from '#scripts/issue/session-cite'
|
|
10
13
|
import { josh_command, type JoshResult } from '#scripts/josh/josh-run'
|
|
11
14
|
import { lane_close } from '#scripts/lane/lane-close'
|
|
@@ -23,8 +26,10 @@ import {
|
|
|
23
26
|
} from '#scripts/run/carry/run-carry'
|
|
24
27
|
import { run_carry_conversation } from '#scripts/run/carry/run-carry-conversation'
|
|
25
28
|
import { run_cut, type RunCut } from '#scripts/run/cut/run-cut'
|
|
29
|
+
import { run_stalled, type StallCause } from '#scripts/run/park/run-stalled'
|
|
26
30
|
import { run_label } from '#scripts/run/run-label'
|
|
27
31
|
import { run_merge } from './run-merge'
|
|
32
|
+
import { run_merge_close } from './run-merge-close'
|
|
28
33
|
import { run_merge_ship } from './run-merge-ship'
|
|
29
34
|
|
|
30
35
|
// The result of attempting to apply a carry change. Distinguishing `refused` from `applied` lets
|
|
@@ -48,14 +53,8 @@ const LANES = '--lanes'
|
|
|
48
53
|
const REPO_FLAG = '--repo'
|
|
49
54
|
const LANE_CLOSE_OCCASION = 'lane close'
|
|
50
55
|
const GIT_ENTRY = '.git'
|
|
51
|
-
const MERGE_CLOSER = 'pnpm josh run:merge'
|
|
52
|
-
const SINGLE_READ = { attempts: 1, interval_ms: 0 }
|
|
53
56
|
const OPEN_STATE = 'OPEN'
|
|
54
57
|
const SYNC_RETRY = { attempts: 3, interval_ms: 5000 }
|
|
55
|
-
// What the driver judged when it parks a child, stated on the issue.
|
|
56
|
-
const FAILED_CAUSE = 'the child’s session ended with its issue still open and unfinished.'
|
|
57
|
-
const CUT_RELAUNCH_CAUSE =
|
|
58
|
-
'its lane held a declared cut, but no successor could be relaunched from it (or it already was once).'
|
|
59
58
|
|
|
60
59
|
// One returned child's context, gathered from the command line by the CLI.
|
|
61
60
|
interface MergeContext {
|
|
@@ -73,8 +72,9 @@ interface MergeContext {
|
|
|
73
72
|
// The merged pull request that closes the child, when GitHub left the child OPEN after the merge —
|
|
74
73
|
// the one `merged` child whose issue this command still has to close.
|
|
75
74
|
merged_pr?: string | undefined
|
|
76
|
-
// The outage is
|
|
77
|
-
|
|
75
|
+
// The outage is not an API outage (`EndingSignals.is_streak_exempt`): re-dispatched, but not added
|
|
76
|
+
// to the streak.
|
|
77
|
+
is_streak_exempt?: boolean | undefined
|
|
78
78
|
}
|
|
79
79
|
|
|
80
80
|
interface FailedResult {
|
|
@@ -83,12 +83,16 @@ interface FailedResult {
|
|
|
83
83
|
// Set when the carry record refused the count because this session is not its owner. The caller
|
|
84
84
|
// surfaces this as a hard failure rather than continuing.
|
|
85
85
|
is_refused: boolean
|
|
86
|
-
//
|
|
87
|
-
// was parked (or refused) instead.
|
|
88
|
-
|
|
86
|
+
// What the child was released to wait on — its open `blocked-by` blockers, cited, and a start date
|
|
87
|
+
// still ahead — empty for a child that was parked (or refused) instead.
|
|
88
|
+
waits: ReadonlyArray<string>
|
|
89
|
+
// The short name of why a parked child was parked, which its park event carries.
|
|
90
|
+
cause?: string | undefined
|
|
89
91
|
}
|
|
90
92
|
|
|
91
|
-
const
|
|
93
|
+
const NO_WAITS: ReadonlyArray<string> = []
|
|
94
|
+
// The wait a `not-before` label alone records: the label carries no date, only that one is ahead.
|
|
95
|
+
const NOT_BEFORE_WAIT = 'a start date still ahead (`not-before`)'
|
|
92
96
|
|
|
93
97
|
// A captured `pnpm josh` subprocess: its output is read back rather than inherited, and a non-zero
|
|
94
98
|
// exit is a value to branch on rather than a throw. The step's stderr stays piped here — `run:merge`
|
|
@@ -167,8 +171,17 @@ async function sync_main(): Promise<void> {
|
|
|
167
171
|
if (!is_synced) throw new Error(`main:sync failed: ${error_output}`)
|
|
168
172
|
}
|
|
169
173
|
|
|
174
|
+
// `lane:close` says on stderr what it terminated — the child and whatever else ran from the checkout
|
|
175
|
+
// (joshuafolkken/kit#4304) — so that stderr is passed on rather than dropped with the capture. An
|
|
176
|
+
// `incomplete` close — a process that outlived even a SIGKILL — is logged and the run carries on: the
|
|
177
|
+
// merge cannot be undone, and the supervisor closes the lane again each pass until it ends
|
|
178
|
+
// (joshuafolkken/kit#4300).
|
|
170
179
|
async function close_lane(child: string): Promise<void> {
|
|
171
|
-
await josh(['lane:close', child])
|
|
180
|
+
const result = await josh(['lane:close', child])
|
|
181
|
+
const said = result.err?.trimEnd() ?? ''
|
|
182
|
+
|
|
183
|
+
if (said !== '') console.error(said)
|
|
184
|
+
if (result.code !== 0) console.error(`${session_cite.issue(child)}: lane:close is incomplete`)
|
|
172
185
|
}
|
|
173
186
|
|
|
174
187
|
async function stash_work(child: string, directory: string): Promise<void> {
|
|
@@ -204,22 +217,30 @@ function kept_lane_comment(directory: string): string {
|
|
|
204
217
|
return `The split left this issue's lane open: it still holds a commit, an uncommitted change or a live process — ${directory}`
|
|
205
218
|
}
|
|
206
219
|
|
|
207
|
-
// A child
|
|
208
|
-
//
|
|
209
|
-
//
|
|
210
|
-
//
|
|
211
|
-
async function
|
|
220
|
+
// A child that ended without a merge closes its lane only when the lane holds nothing — no commit, no
|
|
221
|
+
// change, no live process (`lane_vacant`); any other lane is kept for whoever resumes the issue.
|
|
222
|
+
// Returns the kept lane, `undefined` where there was none or it was closed. joshuafolkken/kit#4028:
|
|
223
|
+
// three children that ended doing nothing left lanes that filled the limit.
|
|
224
|
+
async function close_vacant_lane(child: string): Promise<LaneInfo | undefined> {
|
|
212
225
|
const lane = await lane_registry.find_open_lane(child)
|
|
213
226
|
|
|
214
|
-
if (lane === undefined) return
|
|
227
|
+
if (lane === undefined) return undefined
|
|
215
228
|
|
|
216
|
-
if (await lane_vacant.is_vacant(lane))
|
|
217
|
-
await close_lane(child)
|
|
229
|
+
if (!(await lane_vacant.is_vacant(lane))) return lane
|
|
218
230
|
|
|
219
|
-
|
|
220
|
-
|
|
231
|
+
await close_lane(child)
|
|
232
|
+
|
|
233
|
+
return undefined
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
// A child promoted to an epic by a split leaves its lane holding a seat: the epic root is never
|
|
237
|
+
// dispatched again, so nothing else would ever close it. A lane it keeps is stated on the issue.
|
|
238
|
+
async function close_split_lane(child: string): Promise<void> {
|
|
239
|
+
const kept = await close_vacant_lane(child)
|
|
221
240
|
|
|
222
|
-
|
|
241
|
+
if (kept !== undefined) {
|
|
242
|
+
await git_gh_issue_write.issue_try_comment(child, kept_lane_comment(kept.directory))
|
|
243
|
+
}
|
|
223
244
|
}
|
|
224
245
|
|
|
225
246
|
// The progress comment is a human-readable mirror of the carry record, so it is best-effort and only
|
|
@@ -230,25 +251,8 @@ async function post_counters(ctx: MergeContext, carry: RunCarry | undefined): Pr
|
|
|
230
251
|
await git_gh_issue_write.issue_try_comment(ctx.epic, run_merge.counters_comment(carry))
|
|
231
252
|
}
|
|
232
253
|
|
|
233
|
-
// A child
|
|
234
|
-
//
|
|
235
|
-
// close that fails is reported with its recovery and does not undo the merge being counted.
|
|
236
|
-
async function close_merged_open(ctx: MergeContext): Promise<void> {
|
|
237
|
-
if (ctx.merged_pr === undefined) return
|
|
238
|
-
|
|
239
|
-
try {
|
|
240
|
-
await git_followup_issue_close.ensure_issue_closed(
|
|
241
|
-
{ issue_number: ctx.child, pr_url: ctx.merged_pr, closer: MERGE_CLOSER },
|
|
242
|
-
SINGLE_READ,
|
|
243
|
-
)
|
|
244
|
-
} catch {
|
|
245
|
-
console.error(
|
|
246
|
-
`${session_cite.issue(ctx.child)}: could not be closed — ${git_followup_issue_close.CLOSE_RECOVERY}`,
|
|
247
|
-
)
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
// A merged child: count the merge (which resets the failure streak), return to the default branch,
|
|
254
|
+
// A merged child: close it if GitHub left it OPEN and close the epics it completed
|
|
255
|
+
// (`run-merge-close.ts`), count the merge (which resets the failure streak), return to the default branch,
|
|
252
256
|
// stash any uncommitted work the lane still holds and close it, and mirror the counters onto the epic. Returns the carry when the ownership check
|
|
253
257
|
// fails — the caller treats a non-undefined return as a hard refusal and must not offer a next child.
|
|
254
258
|
// Returns `undefined` on success.
|
|
@@ -257,7 +261,7 @@ async function do_merged(ctx: MergeContext): Promise<RunCarry | undefined> {
|
|
|
257
261
|
|
|
258
262
|
if (refused !== undefined) return refused
|
|
259
263
|
|
|
260
|
-
await
|
|
264
|
+
await run_merge_close.close_merged(ctx)
|
|
261
265
|
await sync_main()
|
|
262
266
|
const result = await apply_carry(ctx, {
|
|
263
267
|
...run_merge.change_of('merged'),
|
|
@@ -272,8 +276,17 @@ async function do_merged(ctx: MergeContext): Promise<RunCarry | undefined> {
|
|
|
272
276
|
return undefined
|
|
273
277
|
}
|
|
274
278
|
|
|
279
|
+
// A child that ended without a merge: end whatever of its process still runs, drop its stale
|
|
280
|
+
// `in-progress`, and close its lane if the child left nothing in it. The reap comes first, so the lane
|
|
281
|
+
// reads with no live process.
|
|
282
|
+
async function release_child(child: string): Promise<void> {
|
|
283
|
+
lane_reap.reap_child(await lane_registry.lane_location(child))
|
|
284
|
+
await run_label.unmark(child)
|
|
285
|
+
await close_vacant_lane(child)
|
|
286
|
+
}
|
|
287
|
+
|
|
275
288
|
function refused_result(carry: RunCarry): FailedResult {
|
|
276
|
-
return { carry, is_parked: false, is_refused: true,
|
|
289
|
+
return { carry, is_parked: false, is_refused: true, waits: NO_WAITS }
|
|
277
290
|
}
|
|
278
291
|
|
|
279
292
|
// The child's open `blocked-by` blockers, cited. A read that fails answers none, so the child is
|
|
@@ -286,66 +299,89 @@ async function open_blockers(child: string): Promise<ReadonlyArray<string>> {
|
|
|
286
299
|
.filter((blocker) => blocker.state === OPEN_STATE)
|
|
287
300
|
.map((blocker) => issue_cite.plain(blocker.number, blocker.repo))
|
|
288
301
|
} catch {
|
|
289
|
-
return
|
|
302
|
+
return NO_WAITS
|
|
290
303
|
}
|
|
291
304
|
}
|
|
292
305
|
|
|
293
|
-
//
|
|
294
|
-
// not
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
)
|
|
306
|
+
// Whether the child carries `not-before` — the body's start date copied to a label. Read only where the
|
|
307
|
+
// body could not be: the body is the source, so a label it no longer backs is never a wait.
|
|
308
|
+
async function has_not_before_label(ctx: MergeContext): Promise<boolean> {
|
|
309
|
+
const read = await issue_state_cli.read_issue(ctx.child, ctx.repo)
|
|
310
|
+
|
|
311
|
+
return read.kind === 'state' && has_label_name(read.state.labels, NOT_BEFORE_LABEL)
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
// The child's declared start date while it is still ahead (joshuafolkken/kit#4076), or its `not-before`
|
|
315
|
+
// label when the body could not be read (joshuafolkken/kit#4102), or the samples it still waits on. A
|
|
316
|
+
// due date or none answers none, so the child is parked as before.
|
|
317
|
+
async function start_date_wait(ctx: MergeContext): Promise<ReadonlyArray<string>> {
|
|
318
|
+
const body = await git_gh_command.issue_get_body(ctx.child, ctx.repo)
|
|
319
|
+
|
|
320
|
+
if (body === undefined) return (await has_not_before_label(ctx)) ? [NOT_BEFORE_WAIT] : NO_WAITS
|
|
321
|
+
|
|
322
|
+
await issue_sample_gate.prime([body])
|
|
323
|
+
const reason = issue_not_before.waiting_reason(body)
|
|
324
|
+
|
|
325
|
+
return reason === undefined ? NO_WAITS : [reason]
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
// A child that ended unfinished while an open blocker it records still has to land first, or while
|
|
329
|
+
// its declared start date is still ahead, is waiting, not failed: nothing is counted and
|
|
330
|
+
// `needs-decision` is not applied — when it runs is already recorded, so there is nothing for a person
|
|
331
|
+
// to decide — and its stale `in-progress` is dropped so the offer hands it back on its own once the
|
|
332
|
+
// blockers merge and the date arrives. The ownership guard is still asked, so a session that does not
|
|
333
|
+
// own the run cannot release a child it never dispatched.
|
|
334
|
+
async function do_waiting(ctx: MergeContext, waits: ReadonlyArray<string>): Promise<FailedResult> {
|
|
302
335
|
const refused = await refused_carry(ctx)
|
|
303
336
|
|
|
304
337
|
if (refused !== undefined) return refused_result(refused)
|
|
305
338
|
|
|
306
|
-
|
|
307
|
-
await
|
|
308
|
-
await git_gh_issue_write.issue_try_comment(ctx.child, run_merge.waiting_comment(blockers))
|
|
339
|
+
await release_child(ctx.child)
|
|
340
|
+
await git_gh_issue_write.issue_try_comment(ctx.child, run_merge.waiting_comment(waits))
|
|
309
341
|
|
|
310
|
-
return { carry: undefined, is_parked: false, is_refused: false,
|
|
342
|
+
return { carry: undefined, is_parked: false, is_refused: false, waits }
|
|
311
343
|
}
|
|
312
344
|
|
|
313
345
|
// A failed child: count the failure, end whatever of its process is still running (a child judged
|
|
314
346
|
// abandoned that hung on a wait loop would otherwise answer the pgrep liveness check `alive` for its
|
|
315
|
-
// issue number forever), drop the stale `in-progress`, and park it with `
|
|
316
|
-
// offer does not hand the same child straight back.
|
|
317
|
-
//
|
|
347
|
+
// issue number forever), drop the stale `in-progress`, and park it with `run:stalled` so the next
|
|
348
|
+
// offer does not hand the same child straight back. Not `needs-decision`: the failure is mechanical,
|
|
349
|
+
// and nothing is asked of a person but to fix its cause (joshuafolkken/kit#4102). Returns the record
|
|
350
|
+
// so the caller can read the streak against the guard. Returns `is_refused: true` without touching labels when the carry record
|
|
318
351
|
// rejected the count. A park is always explained on the issue — `cause` says what was judged, and the
|
|
319
352
|
// comment what was read and what a person does next.
|
|
320
|
-
async function park_failed(ctx: MergeContext, cause:
|
|
353
|
+
async function park_failed(ctx: MergeContext, cause: StallCause): Promise<FailedResult> {
|
|
321
354
|
const result = await apply_carry(ctx, run_merge.change_of('failed'))
|
|
322
355
|
|
|
323
356
|
if (result.kind === 'refused') return refused_result(result.carry)
|
|
324
357
|
|
|
325
358
|
const carry = result.kind === 'applied' ? result.carry : undefined
|
|
326
359
|
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
const
|
|
330
|
-
|
|
331
|
-
if (is_parked) {
|
|
332
|
-
const reason = { child: ctx.child, cause, carry, output: ctx.output }
|
|
360
|
+
await release_child(ctx.child)
|
|
361
|
+
const reason = { child: ctx.child, cause: cause.why, carry, output: ctx.output }
|
|
362
|
+
const park = await issue_park.apply(ctx.child, RUN_STALLED_LABEL, run_merge.park_comment(reason))
|
|
333
363
|
|
|
334
|
-
|
|
364
|
+
return {
|
|
365
|
+
carry,
|
|
366
|
+
is_parked: park.is_labelled,
|
|
367
|
+
is_refused: false,
|
|
368
|
+
waits: NO_WAITS,
|
|
369
|
+
cause: cause.short,
|
|
335
370
|
}
|
|
336
|
-
|
|
337
|
-
return { carry, is_parked, is_refused: false, blockers: NO_BLOCKERS }
|
|
338
371
|
}
|
|
339
372
|
|
|
340
|
-
// A child that ended unfinished: waiting when it records an open blocker
|
|
341
|
-
// otherwise (`park_failed`) —
|
|
342
|
-
// cause of the caller's, a child whose detached ship ended is parked for the ship's
|
|
343
|
-
|
|
344
|
-
|
|
373
|
+
// A child that ended unfinished: waiting when it records an open blocker or a start date still ahead
|
|
374
|
+
// (`do_waiting`), parked otherwise (`park_failed`) — a recorded order or date is never a decision for a
|
|
375
|
+
// person. Without a cause of the caller's, a child whose detached ship ended is parked for the ship's
|
|
376
|
+
// stop.
|
|
377
|
+
async function do_failed(ctx: MergeContext, cause?: StallCause): Promise<FailedResult> {
|
|
378
|
+
const waits = [...(await open_blockers(ctx.child)), ...(await start_date_wait(ctx))]
|
|
379
|
+
|
|
380
|
+
if (waits.length > 0) return await do_waiting(ctx, waits)
|
|
345
381
|
|
|
346
|
-
|
|
382
|
+
const judged = cause ?? run_merge_ship.cause(ctx.child) ?? run_stalled.SESSION_UNFINISHED
|
|
347
383
|
|
|
348
|
-
return await park_failed(ctx,
|
|
384
|
+
return await park_failed(ctx, judged)
|
|
349
385
|
}
|
|
350
386
|
|
|
351
387
|
// The outcome of counting an outage: the record to read the streak against, and whether the count was
|
|
@@ -362,7 +398,7 @@ interface OutageResult {
|
|
|
362
398
|
// outage streak against its guard. Returns `is_refused: true` without touching labels when the carry
|
|
363
399
|
// record rejected the count.
|
|
364
400
|
async function count_outage(ctx: MergeContext): Promise<ApplyCarryResult> {
|
|
365
|
-
if (ctx.
|
|
401
|
+
if (ctx.is_streak_exempt !== true) return await apply_carry(ctx, run_merge.change_of('outage'))
|
|
366
402
|
|
|
367
403
|
const refused = await refused_carry(ctx)
|
|
368
404
|
|
|
@@ -374,8 +410,7 @@ async function do_outage(ctx: MergeContext): Promise<OutageResult> {
|
|
|
374
410
|
|
|
375
411
|
if (result.kind === 'refused') return { carry: result.carry, is_refused: true }
|
|
376
412
|
|
|
377
|
-
|
|
378
|
-
await run_label.unmark(ctx.child)
|
|
413
|
+
await release_child(ctx.child)
|
|
379
414
|
|
|
380
415
|
return { carry: result.kind === 'applied' ? result.carry : undefined, is_refused: false }
|
|
381
416
|
}
|
|
@@ -452,9 +487,9 @@ async function ask_next(ctx: MergeContext): Promise<string> {
|
|
|
452
487
|
}
|
|
453
488
|
|
|
454
489
|
const run_merge_steps = {
|
|
455
|
-
CUT_RELAUNCH_CAUSE,
|
|
456
490
|
ask_next,
|
|
457
491
|
close_split_lane,
|
|
492
|
+
release_child,
|
|
458
493
|
do_failed,
|
|
459
494
|
do_merged,
|
|
460
495
|
do_outage,
|
|
@@ -1,12 +1,13 @@
|
|
|
1
|
-
import { issue_cite } from '#scripts/issue/issue-cite'
|
|
2
1
|
import {
|
|
3
|
-
ALREADY_DONE_LABEL,
|
|
4
2
|
EPIC_LABEL,
|
|
5
3
|
has_label_name,
|
|
6
|
-
|
|
4
|
+
has_parked_label,
|
|
5
|
+
RUN_STALLED_LABEL,
|
|
7
6
|
} from '#scripts/issue/issue-labels'
|
|
8
7
|
import type { IssueState } from '#scripts/issue/issue-state'
|
|
9
8
|
import type { CarryChange, RunCarry } from '#scripts/run/carry/run-carry'
|
|
9
|
+
import { run_stalled } from '#scripts/run/park/run-stalled'
|
|
10
|
+
import type { ChildOutcome } from './run-merge-outcome'
|
|
10
11
|
|
|
11
12
|
// The pure core of `run:merge`, the one composite command for a `backlogrun` merge event: the parent —
|
|
12
13
|
// the session whose context is largest and per-turn cost highest — calls `run:merge <N>` once at a
|
|
@@ -38,28 +39,22 @@ const ONE = 1
|
|
|
38
39
|
// child a merged pull request's `closes #N` names — GitHub merged it without closing
|
|
39
40
|
// the issue.
|
|
40
41
|
// - `human-review` — OPEN and carrying `needs-human-review`; the run's own ending (needs-human-review.md).
|
|
41
|
-
// - `parked` — OPEN and carrying
|
|
42
|
+
// - `parked` — OPEN and carrying a park label (`PARKED_LABELS`); a person still owns it.
|
|
42
43
|
// - `split` — OPEN and carrying `epic`; its work was divided into new children.
|
|
43
|
-
// - `outage` — OPEN and carrying neither, but the exit record shows it could not reach the API
|
|
44
|
-
//
|
|
44
|
+
// - `outage` — OPEN and carrying neither, but the exit record shows it could not reach the API, a
|
|
45
|
+
// host restart killed it, or its ship stop went unanswered; not the child's failure, so
|
|
46
|
+
// it is re-dispatchable and uncounted against the failure guard.
|
|
45
47
|
// - `cut` — OPEN and carrying neither, but its lane holds a declared cut no successor adopted;
|
|
46
48
|
// the child ended its session on purpose, so it is resumed rather than parked and
|
|
47
49
|
// counts nothing.
|
|
50
|
+
// - `unauthenticated` — OPEN and carrying neither, but the exit record shows the session could not
|
|
51
|
+
// authenticate; no child can run until a person runs `/login`, so the run stops with
|
|
52
|
+
// the child left `in-progress` and nothing counted (joshuafolkken/kit#4216).
|
|
48
53
|
// - `failed` — OPEN and carrying neither, and not an outage; the child did not finish.
|
|
49
54
|
// - `withdrawn` — a person withdrew it with `lane:withdraw`, read from the event stream before the
|
|
50
|
-
// GitHub state:
|
|
55
|
+
// GitHub state: left OPEN for the next run, it is neither merged nor failed.
|
|
51
56
|
// - `unresolved` — the state could not be read; re-read before deciding.
|
|
52
|
-
|
|
53
|
-
| 'merged'
|
|
54
|
-
| 'withdrawn'
|
|
55
|
-
| 'human-review'
|
|
56
|
-
| 'parked'
|
|
57
|
-
| 'split'
|
|
58
|
-
| 'cut'
|
|
59
|
-
| 'outage'
|
|
60
|
-
| 'failed'
|
|
61
|
-
| 'unresolved'
|
|
62
|
-
| 'shipping'
|
|
57
|
+
// The names themselves are `run-merge-outcome.ts`'s.
|
|
63
58
|
|
|
64
59
|
// What the CLI read beside the GitHub state: whether the exit record is an API outage, and whether the
|
|
65
60
|
// lane holds a cut its successor never adopted.
|
|
@@ -71,8 +66,11 @@ interface EndingSignals {
|
|
|
71
66
|
merged_pr?: string | undefined
|
|
72
67
|
// The newest launch of the child was withdrawn by a person (`run_event_scope.is_withdrawn`).
|
|
73
68
|
is_withdrawn?: boolean | undefined
|
|
74
|
-
// The outage is a ship stop no relaunch answered,
|
|
75
|
-
|
|
69
|
+
// The outage is not an API the child could not reach — a ship stop no relaunch answered, or a host
|
|
70
|
+
// restart that killed it — so it is left out of the run-wide streak.
|
|
71
|
+
is_streak_exempt?: boolean | undefined
|
|
72
|
+
// The exit record shows the session could not authenticate (`api-auth.ts`).
|
|
73
|
+
is_auth_failure?: boolean | undefined
|
|
76
74
|
}
|
|
77
75
|
|
|
78
76
|
const NO_SIGNALS: EndingSignals = { is_outage: false, is_cut: false }
|
|
@@ -81,12 +79,10 @@ function is_closed(state: IssueState): boolean {
|
|
|
81
79
|
return state.state.toUpperCase() === CLOSED_STATE
|
|
82
80
|
}
|
|
83
81
|
|
|
84
|
-
// A parked child is one a person still owns: it
|
|
85
|
-
//
|
|
86
|
-
const PARK_LABELS: ReadonlyArray<string> = [NEEDS_DECISION_LABEL, ALREADY_DONE_LABEL]
|
|
87
|
-
|
|
82
|
+
// A parked child is one a person still owns (`PARKED_LABELS`): it is left alone and not counted as a
|
|
83
|
+
// failure again.
|
|
88
84
|
function is_parked(state: IssueState): boolean {
|
|
89
|
-
return
|
|
85
|
+
return has_parked_label(state.labels)
|
|
90
86
|
}
|
|
91
87
|
|
|
92
88
|
// **CLOSED means merged, whatever labels it carries** — a child that finished and merged keeps the
|
|
@@ -102,6 +98,8 @@ function unfinished_outcome(signals: EndingSignals): ChildOutcome {
|
|
|
102
98
|
|
|
103
99
|
if (signals.is_cut) return 'cut'
|
|
104
100
|
|
|
101
|
+
if (signals.is_auth_failure === true) return 'unauthenticated'
|
|
102
|
+
|
|
105
103
|
return signals.is_outage ? 'outage' : 'failed'
|
|
106
104
|
}
|
|
107
105
|
|
|
@@ -117,8 +115,8 @@ function open_outcome(state: IssueState, signals: EndingSignals): ChildOutcome {
|
|
|
117
115
|
|
|
118
116
|
// The signals are read by the CLI and, but for a withdrawal, matter only for an OPEN child — a CLOSED
|
|
119
117
|
// child is merged regardless of how the process exited. **A withdrawal is read first**: `lane:withdraw`
|
|
120
|
-
// records it before stopping the child
|
|
121
|
-
//
|
|
118
|
+
// records it before stopping the child and leaves the issue OPEN, which would otherwise read as a child
|
|
119
|
+
// to resume or park.
|
|
122
120
|
function classify_child(
|
|
123
121
|
state: IssueState | undefined,
|
|
124
122
|
signals: EndingSignals = NO_SIGNALS,
|
|
@@ -173,7 +171,7 @@ function counters_comment(carry: RunCarry): string {
|
|
|
173
171
|
}
|
|
174
172
|
|
|
175
173
|
// Why the run parked a child it judged failed. A child that stops itself leaves its own comment; one
|
|
176
|
-
// the driver stops leaves none, so this tells a person why it carries `
|
|
174
|
+
// the driver stops leaves none, so this tells a person why it carries `run:stalled`.
|
|
177
175
|
// Script-emitted, so English.
|
|
178
176
|
interface ParkReason {
|
|
179
177
|
child: string
|
|
@@ -192,21 +190,22 @@ function park_comment(reason: ParkReason): string {
|
|
|
192
190
|
const transcript = reason.output === undefined ? '' : ` (\`${reason.output}\`)`
|
|
193
191
|
|
|
194
192
|
return [
|
|
195
|
-
|
|
193
|
+
`Parked with \`${RUN_STALLED_LABEL}\` by \`pnpm josh run:merge\`, the \`backlogrun\` driver — a mechanical failure, with no decision to make.`,
|
|
196
194
|
`- Why: ${reason.cause}`,
|
|
197
|
-
'- Read: the issue is OPEN, carries
|
|
195
|
+
'- Read: the issue is OPEN, carries no park label, `needs-human-review` or `epic`, no merged pull request’s `closes #N` names it, and it declares no open blocker, start date still ahead or sample condition not yet met.',
|
|
198
196
|
streak_line(reason.carry),
|
|
199
|
-
`- Next: read the child’s transcript${transcript},
|
|
197
|
+
`- Next: read the child’s transcript${transcript}, ${run_stalled.next_step(reason.child)}.`,
|
|
200
198
|
].join('\n')
|
|
201
199
|
}
|
|
202
200
|
|
|
203
|
-
// Why the run released a child it would otherwise have parked: the child records open blockers
|
|
204
|
-
//
|
|
205
|
-
|
|
201
|
+
// Why the run released a child it would otherwise have parked: the child records open blockers or a
|
|
202
|
+
// start date still ahead or samples still short, so when it runs is already decided and it waits rather than asking a person.
|
|
203
|
+
// Script-emitted, so English.
|
|
204
|
+
function waiting_comment(waits: ReadonlyArray<string>): string {
|
|
206
205
|
return [
|
|
207
206
|
'Released to wait by `pnpm josh run:merge`, the `backlogrun` driver — not parked, and not counted as a failure.',
|
|
208
|
-
`- Why: the child’s session ended unfinished while it
|
|
209
|
-
'- Next:
|
|
207
|
+
`- Why: the child’s session ended unfinished while it waits on: ${waits.join(', ')}.`,
|
|
208
|
+
'- Next: when it runs is already recorded — it becomes runnable again once its blockers merge, its start date arrives and its sample condition is met; a blocker outside the backlog still needs a person to land it.',
|
|
210
209
|
].join('\n')
|
|
211
210
|
}
|
|
212
211
|
|
|
@@ -222,5 +221,7 @@ const run_merge = {
|
|
|
222
221
|
is_outage_guard_tripped,
|
|
223
222
|
}
|
|
224
223
|
|
|
225
|
-
export type {
|
|
224
|
+
export type { EndingSignals, ParkReason }
|
|
226
225
|
export { run_merge }
|
|
226
|
+
|
|
227
|
+
export { type ChildOutcome } from './run-merge-outcome'
|