@joshuafolkken/kit 1.1471.0 → 1.1784.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/agents/investigator.md +1 -1
- package/.claude/settings.json +6 -6
- package/.claude/skills/epic-commands/SKILL.md +26 -77
- package/.claude/skills/epic-commands/epic-bundle.md +12 -6
- package/.claude/skills/epic-commands/execution-waves.md +1 -2
- package/.claude/skills/verify-ui/SKILL.md +1 -2
- package/.claude/skills/workflow-commands/SKILL.md +12 -14
- package/.claude/skills/workflow-commands/background-commands.md +8 -12
- package/.claude/skills/workflow-commands/backlogrun-child.md +13 -18
- package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +7 -25
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +23 -28
- package/.claude/skills/workflow-commands/backlogrun-park.md +16 -31
- package/.claude/skills/workflow-commands/backlogrun-progress.md +12 -21
- package/.claude/skills/workflow-commands/backlogrun-recovery.md +12 -12
- package/.claude/skills/workflow-commands/backlogrun-steps.md +12 -20
- package/.claude/skills/workflow-commands/backlogrun.md +32 -51
- package/.claude/skills/workflow-commands/chain-rule.md +18 -11
- package/.claude/skills/workflow-commands/delegation.md +13 -8
- package/.claude/skills/workflow-commands/entry-sequence.md +10 -12
- package/.claude/skills/workflow-commands/followup.md +10 -35
- package/.claude/skills/workflow-commands/fullrun-steps.md +38 -49
- package/.claude/skills/workflow-commands/fullrun.md +6 -8
- package/.claude/skills/workflow-commands/halfrun.md +20 -32
- package/.claude/skills/workflow-commands/into-target.md +1 -2
- package/.claude/skills/workflow-commands/issue-comments.md +19 -15
- package/.claude/skills/workflow-commands/issue-scout.md +5 -4
- package/.claude/skills/workflow-commands/kickoff.md +24 -23
- package/.claude/skills/workflow-commands/latest-gate.md +9 -18
- package/.claude/skills/workflow-commands/needs-human-review.md +11 -19
- package/.claude/skills/workflow-commands/observation-filing.md +4 -50
- package/.claude/skills/workflow-commands/observation-ledger.md +5 -10
- package/.claude/skills/workflow-commands/pre-gate-cut.md +22 -44
- package/.claude/skills/workflow-commands/prerequisite.md +11 -18
- package/.claude/skills/workflow-commands/progress-watcher.md +3 -8
- package/.claude/skills/workflow-commands/prrun.md +6 -12
- package/.claude/skills/workflow-commands/retrospective.md +5 -5
- package/.claude/skills/workflow-commands/split-assessment.md +14 -4
- package/.claude/skills/workflow-commands/target-repository.md +1 -2
- package/.claude/skills/workflow-commands/working-tree-hold.md +11 -13
- package/.codex/hooks.json +6 -6
- package/.github/actions/setup-node/action.yml +10 -1
- package/.github/actions/setup-pnpm/action.yml +1 -1
- package/.github/dependabot.yml +16 -0
- package/.github/release.yml +0 -2
- package/.github/workflows/ci.yml +121 -11
- package/.github/workflows/publish.yml +10 -3
- package/.github/workflows/sonar-qube.yml +1 -0
- package/.prettierignore +2 -0
- package/.vscode/tasks.json +1 -2
- package/CLAUDE.md +4 -8
- package/README.md +4 -2
- package/SECURITY.md +1 -1
- package/cspell/index.yaml +7 -0
- package/dist/CLAUDE.md +4 -8
- package/dist/commands/document-read-cli.js +882 -0
- package/dist/commands/{document-section-cli.js → document-section-main.js} +137 -62
- package/dist/commands/read-set-cli.js +1867 -0
- package/dist/commands/run-prep-main.js +21653 -0
- package/dist/commands/run-step-cli.js +23880 -0
- package/dist/config-merge/index.js +5 -1
- package/dist/hooks/audit-provision.js +20 -35
- package/dist/hooks/{chunk-DGT54IH5.js → chunk-AZX4FGQ3.js} +63 -17
- package/dist/hooks/chunk-CWMBGKYW.js +6483 -0
- package/dist/hooks/chunk-O2YBIDSI.js +4306 -0
- package/dist/hooks/{chunk-AS74OU3D.js → chunk-PT5R6UJD.js} +4582 -2118
- package/dist/hooks/chunk-TUIFS5E7.js +72 -0
- package/dist/hooks/{chunk-723HKZO5.js → chunk-VWWCFGWK.js} +1 -1
- package/dist/hooks/{chunk-E7OIKX5Z.js → chunk-WR2KQAYZ.js} +1863 -382
- package/dist/hooks/{chunk-KC5AK2GF.js → chunk-XGBNSWEI.js} +248 -46
- package/dist/hooks/chunk-YCDOIR3I.js +3456 -0
- package/dist/hooks/codex-hook-adapter.js +10 -19
- package/dist/hooks/format-edited.js +5 -5
- package/dist/hooks/inputs.json +436 -257
- package/dist/hooks/pretool-guard.js +7 -22
- package/dist/hooks/session-lang.js +380 -42
- package/dist/hooks/stop-guard.js +8711 -782
- package/dist/josh.js +5263 -997
- package/dist/self-sync-guard/index.js +74 -10
- package/dist/version/index.js +115 -406
- package/eslint/base.js +1 -1
- package/lefthook/base.yml +8 -4
- package/package.json +17 -53
- package/pnpm-workspace.yaml +4 -2
- package/prompts/coding-standards.md +1 -1
- package/prompts/collaboration-workflow/file-edits.md +1 -9
- package/prompts/collaboration-workflow/gh-rest.md +1 -2
- package/prompts/collaboration-workflow/issue-citation.md +2 -4
- package/prompts/collaboration-workflow/issue-template.md +42 -17
- package/prompts/collaboration-workflow/lane-instructions.md +34 -0
- package/prompts/collaboration-workflow/measurement.md +37 -0
- package/prompts/collaboration-workflow/operating-rules.md +6 -12
- package/prompts/collaboration-workflow/output-bounds.md +4 -9
- package/prompts/collaboration-workflow/overview.md +1 -1
- package/prompts/collaboration-workflow/plan-comment.md +3 -42
- package/prompts/collaboration-workflow/principles.md +19 -8
- package/prompts/collaboration-workflow/report-format.md +37 -57
- package/prompts/collaboration-workflow/residency.md +12 -8
- package/prompts/collaboration-workflow/rule-delivery.md +3 -11
- package/prompts/collaboration-workflow/shell-body.md +8 -18
- package/prompts/collaboration-workflow/turn-batching.md +4 -6
- package/prompts/collaboration-workflow/upstream-interrupt.md +16 -6
- package/prompts/collaboration-workflow/wip-cap.md +7 -7
- package/prompts/collaboration-workflow.md +4 -7
- package/prompts/refactoring.md +1 -1
- package/prompts/review-rubric.md +1 -2
- package/prompts/review.md +45 -26
- package/prompts/testing-guide.md +10 -45
- package/scripts/agent/agent-argv.ts +20 -4
- package/scripts/agent/agent-event.ts +15 -15
- package/scripts/agent/agent-exit-record.ts +13 -1
- package/scripts/agent/agent-role-profile.ts +101 -45
- package/scripts/agent/agent-safe-text.ts +60 -0
- package/scripts/agent/api-auth.ts +41 -0
- package/scripts/agent/api-outage.ts +1 -1
- package/scripts/agent/claude-agent-argv.ts +14 -0
- package/scripts/agent/codex-agent-argv.ts +2 -0
- package/scripts/agent/lane-instructions.ts +144 -0
- package/scripts/auto-ok/auto-ok-cli.ts +14 -16
- package/scripts/auto-ok/auto-ok-judge-read.ts +12 -3
- package/scripts/auto-ok/auto-ok-judge-write.ts +46 -19
- package/scripts/auto-ok/auto-ok-judge.ts +13 -2
- package/scripts/auto-ok/auto-ok-main.ts +17 -0
- package/scripts/backlog/backlog-arrival.ts +14 -3
- package/scripts/backlog/backlog-budget-cli.ts +7 -33
- package/scripts/backlog/backlog-budget-main.ts +16 -0
- package/scripts/backlog/backlog-budget.ts +6 -7
- package/scripts/backlog/backlog-defect-priority.ts +4 -3
- package/scripts/backlog/backlog-drive-adopt.ts +67 -0
- package/scripts/backlog/backlog-drive-args.ts +4 -5
- package/scripts/backlog/backlog-drive-cli.ts +113 -28
- package/scripts/backlog/backlog-drive-hold.ts +162 -0
- package/scripts/backlog/backlog-drive-idle.ts +151 -0
- package/scripts/backlog/backlog-drive-judge.ts +25 -0
- package/scripts/backlog/backlog-drive-memory.ts +126 -0
- package/scripts/backlog/backlog-drive-named-offer.ts +5 -10
- package/scripts/backlog/backlog-drive-named.ts +54 -7
- package/scripts/backlog/backlog-drive-offer-argv.ts +3 -8
- package/scripts/backlog/backlog-drive-paused.ts +169 -0
- package/scripts/backlog/backlog-drive-restore.ts +39 -8
- package/scripts/backlog/backlog-drive-seats.ts +18 -8
- package/scripts/backlog/backlog-drive-token-handling.ts +38 -0
- package/scripts/backlog/backlog-drive.ts +79 -75
- package/scripts/backlog/backlog-next-main.ts +16 -0
- package/scripts/backlog/backlog-next-shared.ts +73 -0
- package/scripts/backlog/backlog-next.ts +48 -16
- package/scripts/backlog/backlog-occupied.ts +69 -0
- package/scripts/backlog/backlog-offer-cli.ts +6 -21
- package/scripts/backlog/backlog-offer-exclude.ts +15 -0
- package/scripts/backlog/backlog-offer-main.ts +12 -0
- package/scripts/backlog/backlog-offer.ts +36 -3
- package/scripts/backlog/backlog-overlap.ts +22 -4
- package/scripts/backlog/backlog-plan-read.ts +6 -2
- package/scripts/backlog/backlog-plan.ts +18 -4
- package/scripts/backlog/backlog-pool.ts +10 -10
- package/scripts/backlog/backlog-rank.ts +10 -2
- package/scripts/backlog/backlog-ready.ts +137 -18
- package/scripts/backlog/backlog-stalled-detect.ts +109 -36
- package/scripts/backlog/backlog-stalled.ts +52 -16
- package/scripts/backlog/backlog-wait-cause.ts +86 -0
- package/scripts/backlog/backlog-waves.ts +39 -13
- package/scripts/backlog/backlogrun-args.ts +19 -7
- package/scripts/backlog/backlogrun-cli.ts +19 -5
- package/scripts/backlog/backlogrun-launch.ts +6 -0
- package/scripts/backlog/backlogrun-restart.ts +97 -0
- package/scripts/backlog/backlogrun-stop.ts +79 -7
- package/scripts/behavior/behavior-cli.ts +2 -2
- package/scripts/behavior/behavior-rules.ts +47 -24
- package/scripts/build/build-bin.ts +2 -16
- package/scripts/build/build-claude-md.ts +0 -7
- package/scripts/build/build-commands.ts +0 -13
- package/scripts/build/build-hooks.ts +49 -48
- package/scripts/build/hook-bundle-stamp.ts +29 -11
- package/scripts/build/local-bin.ts +1 -1
- package/scripts/cases/cases-cli.ts +25 -13
- package/scripts/cases/cases-interaction-scan.ts +134 -0
- package/scripts/cases/cases-interaction.ts +183 -0
- package/scripts/cases/cases-logic.ts +39 -6
- package/scripts/ci/pr-classification-main.ts +18 -0
- package/scripts/ci/pr-classification.ts +10 -17
- package/scripts/clone/clone-scan.ts +1 -1
- package/scripts/cost-runtime/cost-blocks.ts +22 -37
- package/scripts/cost-runtime/cost-cli.ts +31 -14
- package/scripts/cost-runtime/cost-main.ts +12 -0
- package/scripts/cost-runtime/cost-transcript.ts +1 -0
- package/scripts/delegation/delegation-policy.ts +17 -4
- package/scripts/delegation/duplicate-read-guard.ts +2 -10
- package/scripts/delegation/investigation-guard.ts +15 -73
- package/scripts/delegation/investigation-reads.ts +3 -5
- package/scripts/dependabot/dependabot-cooldown.ts +194 -0
- package/scripts/discovery/repo-discovery.ts +24 -6
- package/scripts/doctor/doctor-consumer.ts +2 -5
- package/scripts/document/document-byte-budget.ts +9 -6
- package/scripts/document/document-scan.ts +1 -1
- package/scripts/document/document-section-cli.ts +17 -13
- package/scripts/document/document-section-main.ts +12 -0
- package/scripts/document/entry-read-budget.ts +2 -2
- package/scripts/document/read-set-cli.ts +4 -1
- package/scripts/epic/epic-audit-cli.ts +12 -6
- package/scripts/epic/epic-audit-orphans.ts +5 -8
- package/scripts/epic/epic-audit.ts +52 -1
- package/scripts/epic/epic-bundle-apply.ts +137 -0
- package/scripts/epic/epic-bundle-cli.ts +32 -121
- package/scripts/epic/epic-bundle-evidence.ts +49 -26
- package/scripts/epic/epic-bundle-format.ts +116 -0
- package/scripts/epic/epic-bundle-main.ts +17 -0
- package/scripts/epic/epic-bundle-referenced.ts +14 -3
- package/scripts/epic/epic-bundle.ts +17 -9
- package/scripts/epic/epic-busy.ts +5 -12
- package/scripts/epic/epic-classify.ts +24 -15
- package/scripts/epic/epic-cli-argv.ts +31 -0
- package/scripts/epic/epic-cli-decide.ts +42 -0
- package/scripts/epic/epic-cli.ts +6 -38
- package/scripts/epic/epic-close.ts +112 -55
- package/scripts/epic/epic-cross-repo.ts +4 -7
- package/scripts/epic/epic-decide.ts +119 -0
- package/scripts/epic/epic-decision.ts +9 -0
- package/scripts/epic/epic-fetch.ts +4 -0
- package/scripts/epic/epic-graph.ts +2 -0
- package/scripts/epic/epic-issue.ts +5 -1
- package/scripts/epic/epic-label-age.ts +1 -1
- package/scripts/epic/epic-lane-offer.ts +39 -4
- package/scripts/epic/epic-next-main.ts +24 -0
- package/scripts/epic/epic-next.ts +6 -24
- package/scripts/epic/epic-outside-blocker.ts +6 -2
- package/scripts/epic/epic-parse.ts +9 -3
- package/scripts/epic/epic-read.ts +1 -0
- package/scripts/epic/epic-reconcile.ts +39 -0
- package/scripts/epic/epic-run.ts +10 -1
- package/scripts/epic/epic-solo.ts +50 -14
- package/scripts/epic/epic.ts +41 -7
- package/scripts/exports/unused-members-cli.ts +2 -2
- package/scripts/followup/followup-checks-event.ts +8 -3
- package/scripts/followup/followup-coderabbit-wait.ts +82 -0
- package/scripts/followup/followup-review-gates.ts +81 -0
- package/scripts/followup/git-followup-stages.ts +13 -3
- package/scripts/followup/git-followup-workflow.ts +31 -60
- package/scripts/followup/git-pr-followup-wrapup.ts +9 -14
- package/scripts/followup/git-pr-followup.ts +36 -8
- package/scripts/fresh-machine/fresh-machine-cli.ts +1 -1
- package/scripts/fresh-machine/fresh-machine-run.ts +8 -8
- package/scripts/fresh-machine/specs/kit-test-backlogrun.json +1 -1
- package/scripts/gate/busy-average.ts +58 -0
- package/scripts/gate/check-cpu.ts +60 -0
- package/scripts/gate/check-inputs.ts +73 -0
- package/scripts/gate/check-reuse.ts +141 -0
- package/scripts/gate/command-memory.ts +192 -0
- package/scripts/gate/core-admission.ts +218 -28
- package/scripts/gate/core-budget-timing.ts +37 -0
- package/scripts/gate/core-budget.ts +150 -119
- package/scripts/gate/core-wait-record.ts +48 -0
- package/scripts/gate/core-wait.ts +162 -0
- package/scripts/gate/core-weights.ts +86 -0
- package/scripts/gate/free-cores.ts +72 -0
- package/scripts/gate/gate-ledger.ts +49 -7
- package/scripts/gate/gate-plan.ts +44 -15
- package/scripts/gate/gate-report.ts +29 -4
- package/scripts/gate/gate-run-steps.ts +195 -0
- package/scripts/gate/gate-skip.ts +12 -2
- package/scripts/gate/gate-steps.ts +12 -1
- package/scripts/gate/held-mark.ts +55 -0
- package/scripts/gate/input-fingerprint.ts +42 -0
- package/scripts/gate/machine-capacity.ts +124 -31
- package/scripts/gate/moved-paths.ts +67 -0
- package/scripts/gate/pre-commit-type-check.ts +14 -1
- package/scripts/gate/project-checks.ts +5 -12
- package/scripts/gate/scoped-green.ts +12 -8
- package/scripts/gate/since-green.ts +62 -0
- package/scripts/gate/toolchain-inputs.ts +115 -0
- package/scripts/gate/verification-gate.ts +65 -129
- package/scripts/gate/verification-inputs.ts +250 -0
- package/scripts/gh/gh-author-association.ts +96 -9
- package/scripts/gh/git-ai-review-scan.ts +4 -2
- package/scripts/gh/git-gh-api-path.ts +15 -0
- package/scripts/gh/git-gh-branch-rules.ts +73 -0
- package/scripts/gh/git-gh-conditional.ts +5 -2
- package/scripts/gh/git-gh-issue-read.ts +5 -1
- package/scripts/gh/git-gh-issue-rest.ts +1 -0
- package/scripts/gh/git-gh-issue-write.ts +77 -17
- package/scripts/gh/git-gh-issue.ts +7 -3
- package/scripts/gh/git-gh-poll-read.ts +89 -0
- package/scripts/gh/git-gh-pr-auto-merge.ts +8 -3
- package/scripts/gh/git-gh-pr-rest.ts +1 -1
- package/scripts/gh/git-gh-pr-snapshot.ts +33 -20
- package/scripts/gh/git-gh-pr.ts +27 -15
- package/scripts/gh/git-pr-checks-eval.ts +39 -7
- package/scripts/gh/git-pr-checks-parse.ts +39 -9
- package/scripts/gh/git-pr-merge-checked.ts +80 -0
- package/scripts/gh/git-pr.ts +13 -1
- package/scripts/git/base-tree.ts +19 -2
- package/scripts/git/changed-file-scope.ts +6 -4
- package/scripts/git/changed-paths.ts +18 -1
- package/scripts/git/git-diff-reads.ts +27 -2
- package/scripts/git/git-grep-hits.ts +85 -0
- package/scripts/git/git-location-environment.ts +1 -1
- package/scripts/git/git-merge-conflicts.ts +83 -0
- package/scripts/git/git-preflight.ts +37 -12
- package/scripts/git/git-push-transport.ts +1 -2
- package/scripts/git/git-schemas.ts +17 -7
- package/scripts/git/git-spawn.ts +1 -2
- package/scripts/git/git-status.ts +4 -4
- package/scripts/git/main-merge-main.ts +12 -0
- package/scripts/git/main-merge-regenerate.ts +78 -0
- package/scripts/git/main-merge.ts +39 -14
- package/scripts/git/main-sync-main.ts +12 -0
- package/scripts/git/main-sync.ts +0 -9
- package/scripts/git/stash/git-stash.ts +27 -4
- package/scripts/git/stash/{stash-pop-args.ts → stash-args.ts} +13 -10
- package/scripts/git/stash/stash-pop-cli.ts +6 -12
- package/scripts/git/stash/stash-pop-main.ts +12 -0
- package/scripts/git/stash/stash-push-cli.ts +76 -0
- package/scripts/git/stash/stash-push-main.ts +12 -0
- package/scripts/hooks/batch-guard.ts +5 -16
- package/scripts/hooks/check-commit-message-main.ts +8 -0
- package/scripts/hooks/check-commit-message.ts +4 -7
- package/scripts/hooks/format-edited-file.ts +8 -24
- package/scripts/hooks/pre-commit-lint.ts +118 -0
- package/scripts/hooks/pre-push-unit.ts +4 -2
- package/scripts/hooks/pretool-guard-cli.ts +1 -8
- package/scripts/hooks/pretool-guard.ts +57 -69
- package/scripts/hooks/reserved-run.ts +67 -8
- package/scripts/hooks/run-hook.sh +18 -11
- package/scripts/hooks/shell-rules-notice.ts +37 -0
- package/scripts/hooks/stop-actions.ts +185 -0
- package/scripts/hooks/stop-guard.ts +72 -27
- package/scripts/init/hook-command-rewrite.ts +19 -5
- package/scripts/init/hook-launch.ts +15 -12
- package/scripts/init/init-actions.ts +0 -6
- package/scripts/init/init-ai-copy.ts +10 -36
- package/scripts/init/init-bootstrap.ts +9 -8
- package/scripts/init/init-dry-run-report.ts +1 -1
- package/scripts/init/init-dry-run.ts +1 -1
- package/scripts/init/init-file-action.ts +7 -9
- package/scripts/init/init-logic-json-merge.ts +2 -2
- package/scripts/init/init-logic-migrate.ts +9 -82
- package/scripts/init/init-logic.ts +3 -2
- package/scripts/init/init-main.ts +12 -0
- package/scripts/init/init.ts +5 -12
- package/scripts/init/kit-development-versions.ts +3 -7
- package/scripts/init/kit-written-paths.ts +2 -2
- package/scripts/init/project-profile.ts +5 -4
- package/scripts/init/tsconfig-preset-migration.ts +2 -1
- package/scripts/init/vscode-tasks.ts +1 -1
- package/scripts/issue/defect-origin-cli.ts +106 -0
- package/scripts/issue/defect-origin-line.ts +60 -0
- package/scripts/issue/defect-origin-main.ts +11 -0
- package/scripts/issue/defect-origin.ts +114 -0
- package/scripts/issue/defect-rate-cli.ts +34 -78
- package/scripts/issue/defect-rate.ts +0 -16
- package/scripts/issue/defect-report-cli.ts +128 -0
- package/scripts/issue/defect-report-format.ts +56 -0
- package/scripts/issue/defect-report-main.ts +11 -0
- package/scripts/issue/defect-report.ts +160 -0
- package/scripts/issue/expected-effect-lint.ts +60 -0
- package/scripts/issue/issue-already-done-cli.ts +62 -0
- package/scripts/issue/issue-body-or-comment.ts +40 -0
- package/scripts/issue/issue-cite-cli.ts +33 -22
- package/scripts/issue/issue-cite-main.ts +12 -0
- package/scripts/issue/issue-classification.ts +13 -8
- package/scripts/issue/issue-comment-cli.ts +10 -24
- package/scripts/issue/issue-comment-main.ts +12 -0
- package/scripts/issue/issue-evidence-exit.ts +100 -0
- package/scripts/issue/issue-file-cli.ts +29 -7
- package/scripts/issue/issue-file.ts +19 -19
- package/scripts/issue/issue-fold-cli.ts +2 -11
- package/scripts/issue/issue-fold-main.ts +12 -0
- package/scripts/issue/issue-labels.ts +81 -90
- package/scripts/issue/issue-lint-cli.ts +7 -13
- package/scripts/issue/issue-lint-main.ts +12 -0
- package/scripts/issue/issue-measured-cli.ts +56 -0
- package/scripts/issue/issue-merged.ts +19 -2
- package/scripts/issue/issue-not-before-label.ts +135 -0
- package/scripts/issue/issue-not-before.ts +111 -0
- package/scripts/issue/issue-number-shape.ts +15 -1
- package/scripts/issue/issue-park.ts +28 -0
- package/scripts/issue/issue-plan-cli.ts +151 -0
- package/scripts/issue/issue-priority.ts +151 -0
- package/scripts/issue/issue-rank.ts +7 -1
- package/scripts/issue/issue-read-cli.ts +3 -10
- package/scripts/issue/issue-read-main.ts +12 -0
- package/scripts/issue/issue-read.ts +29 -5
- package/scripts/issue/issue-release-cli.ts +0 -10
- package/scripts/issue/issue-release-main.ts +13 -0
- package/scripts/issue/issue-release.ts +7 -12
- package/scripts/issue/issue-sample-gate.ts +192 -0
- package/scripts/issue/issue-sample-source.ts +76 -0
- package/scripts/issue/issue-scout-cli.ts +19 -25
- package/scripts/issue/issue-scout-main.ts +14 -0
- package/scripts/issue/issue-state-cli.ts +0 -10
- package/scripts/issue/issue-state-main.ts +12 -0
- package/scripts/issue/issue-watch-diff.ts +56 -15
- package/scripts/issue/issue-watch.ts +2 -1
- package/scripts/issue/issue-wip.ts +2 -7
- package/scripts/issue/markdown-section.ts +19 -5
- package/scripts/issue/measure-rerun-cli.ts +13 -8
- package/scripts/issue/plan-consumers-cli.ts +39 -0
- package/scripts/issue/plan-consumers-main.ts +11 -0
- package/scripts/issue/plan-consumers-section.ts +55 -0
- package/scripts/issue/plan-consumers.ts +127 -0
- package/scripts/josh/agent-session-environment.ts +1 -1
- package/scripts/josh/command-usage.ts +82 -0
- package/scripts/josh/file-map-stamp.ts +49 -16
- package/scripts/josh/hook-decision.ts +32 -20
- package/scripts/josh/josh-command-map.ts +6 -1
- package/scripts/josh/josh-command-types.ts +65 -13
- package/scripts/josh/josh-commands-agent-hooks.ts +83 -0
- package/scripts/josh/josh-commands-ai.ts +169 -157
- package/scripts/josh/josh-commands-backlog.ts +82 -16
- package/scripts/josh/josh-commands-clone.ts +1 -0
- package/scripts/josh/josh-commands-development.ts +111 -71
- package/scripts/josh/josh-commands-document.ts +43 -1
- package/scripts/josh/josh-commands-epic.ts +171 -0
- package/scripts/josh/josh-commands-hooks.ts +31 -2
- package/scripts/josh/josh-commands-issue-write.ts +181 -0
- package/scripts/josh/josh-commands-issue.ts +124 -24
- package/scripts/josh/josh-commands-lane.ts +112 -2
- package/scripts/josh/josh-commands-lint.ts +19 -8
- package/scripts/josh/josh-commands-maintenance.ts +112 -4
- package/scripts/josh/josh-commands-pause.ts +29 -0
- package/scripts/josh/josh-commands-progress.ts +87 -0
- package/scripts/josh/josh-commands-project.ts +138 -9
- package/scripts/josh/josh-commands-review.ts +124 -0
- package/scripts/josh/josh-commands-run.ts +211 -23
- package/scripts/josh/josh-commands-ship.ts +169 -0
- package/scripts/josh/josh-commands-split.ts +9 -0
- package/scripts/josh/josh-commands-versioning.ts +49 -2
- package/scripts/josh/josh-commands-workflow.ts +149 -6
- package/scripts/josh/josh-logic.ts +11 -27
- package/scripts/josh/josh.ts +14 -5
- package/scripts/josh/package-directory.ts +18 -0
- package/scripts/josh/process-identity.ts +13 -4
- package/scripts/josh/session-language-cli.ts +4 -8
- package/scripts/josh/session-language-main.ts +13 -0
- package/scripts/josh/session-language.ts +6 -1
- package/scripts/josh/shared-cache.ts +90 -0
- package/scripts/josh/stamp-file.ts +9 -15
- package/scripts/lane/lane-await.ts +51 -12
- package/scripts/lane/lane-cache.ts +5 -30
- package/scripts/lane/lane-capacity.ts +19 -22
- package/scripts/lane/lane-check-stats.ts +97 -0
- package/scripts/lane/lane-child-invocation.ts +43 -4
- package/scripts/lane/lane-cli.ts +15 -5
- package/scripts/lane/lane-close.ts +86 -18
- package/scripts/lane/lane-core-wait-stats.ts +66 -0
- package/scripts/lane/lane-dispatch.ts +27 -6
- package/scripts/lane/lane-gap-stats.ts +156 -0
- package/scripts/lane/lane-guard-policy.ts +2 -2
- package/scripts/lane/lane-handoff.ts +76 -1
- package/scripts/lane/lane-held-stats.ts +129 -0
- package/scripts/lane/lane-install.ts +16 -15
- package/scripts/lane/lane-launch-cli.ts +0 -9
- package/scripts/lane/lane-launch-main.ts +12 -0
- package/scripts/lane/lane-ledger-schema.ts +266 -0
- package/scripts/lane/lane-ledger.ts +108 -97
- package/scripts/lane/lane-limit-cli.ts +19 -9
- package/scripts/lane/lane-measure-cli.ts +58 -10
- package/scripts/lane/lane-open.ts +9 -1
- package/scripts/lane/lane-parked.ts +3 -3
- package/scripts/lane/lane-pause-cli.ts +130 -0
- package/scripts/lane/lane-pause.ts +158 -0
- package/scripts/lane/lane-preserve.ts +29 -1
- package/scripts/lane/lane-process-table.ts +166 -0
- package/scripts/lane/lane-reap-settle.ts +124 -0
- package/scripts/lane/lane-reap.ts +50 -15
- package/scripts/lane/lane-registry.ts +33 -10
- package/scripts/lane/lane-residents.ts +162 -0
- package/scripts/lane/lane-restart.ts +26 -27
- package/scripts/lane/lane-round-two-stats.ts +49 -0
- package/scripts/lane/lane-sampler.ts +4 -0
- package/scripts/lane/lane-session-action.ts +160 -0
- package/scripts/lane/lane-session-broker.ts +134 -134
- package/scripts/lane/lane-snapshot-trace.ts +84 -0
- package/scripts/lane/lane-spans.ts +51 -0
- package/scripts/lane/lane-spent.ts +6 -3
- package/scripts/lane/lane-stage-stats.ts +7 -2
- package/scripts/lane/lane-state.ts +302 -0
- package/scripts/lane/lane-stats.ts +58 -4
- package/scripts/lane/lane-stop-stats.ts +113 -37
- package/scripts/lane/lane-test-related-stats.ts +127 -0
- package/scripts/lane/lane-transcript-calls.ts +145 -0
- package/scripts/lane/lane-transcript-stats.ts +168 -0
- package/scripts/lane/lane-vacant.ts +13 -3
- package/scripts/lane/lane-withdraw-cli.ts +72 -0
- package/scripts/lane/lane-withdraw.ts +183 -0
- package/scripts/lane/process-directories.ts +70 -0
- package/scripts/lane/process-lane-marks.ts +94 -0
- package/scripts/lib/atomic-write.ts +62 -0
- package/scripts/lib/buffered-process.ts +12 -5
- package/scripts/lib/cli-flags.ts +53 -0
- package/scripts/lib/figure-format.ts +63 -0
- package/scripts/lib/json-value.ts +9 -1
- package/scripts/lib/package-manifest.ts +35 -0
- package/scripts/lib/read-file.ts +3 -1
- package/scripts/lib/stamped-memo.ts +63 -0
- package/scripts/lib/stdout-on-stderr.ts +24 -0
- package/scripts/lib/timeouts.ts +9 -0
- package/scripts/lib/transcript-record.ts +91 -0
- package/scripts/lines/effective-limit.ts +1 -1
- package/scripts/lint/eslint-cache-dependencies.ts +145 -0
- package/scripts/lint/eslint-daemon.ts +265 -0
- package/scripts/lint/format.ts +14 -5
- package/scripts/lint/import-graph.ts +279 -0
- package/scripts/lint/lint-gate-scope.ts +102 -0
- package/scripts/lint/lint-parallel-main.ts +19 -0
- package/scripts/lint/lint-parallel.ts +72 -33
- package/scripts/lint/lint-related-scope.ts +33 -24
- package/scripts/lint/lint-related.ts +38 -6
- package/scripts/notify/confirmation-options.ts +1 -2
- package/scripts/notify/telegram-notify.ts +20 -20
- package/scripts/notify/telegram-test-logic.ts +0 -1
- package/scripts/notify/telegram-test-main.ts +8 -0
- package/scripts/notify/telegram-test.ts +12 -11
- package/scripts/observations/observation-ledger.ts +13 -0
- package/scripts/observations/observations-flush-landing.ts +5 -3
- package/scripts/observations/observations-flush.ts +6 -1
- package/scripts/overrides/overrides-check.ts +2 -5
- package/scripts/overrides/overrides-files.ts +2 -1
- package/scripts/overrides/overrides-logic.ts +3 -6
- package/scripts/package/verify-optional-eslint-install.ts +8 -6
- package/scripts/propagate/propagate-publish.ts +2 -7
- package/scripts/propagate/propagate-targets.ts +4 -12
- package/scripts/refactor/import-graph.ts +9 -7
- package/scripts/release/github-release-runs.ts +17 -6
- package/scripts/release/release-approval-prune.ts +18 -0
- package/scripts/release/release-history.ts +1 -3
- package/scripts/release/release-progress.ts +42 -22
- package/scripts/release/release-publish-run.ts +39 -0
- package/scripts/release/release-publish.ts +6 -6
- package/scripts/release/release-scope-cli.ts +0 -10
- package/scripts/release/release-scope-main.ts +12 -0
- package/scripts/repo/repo-setting.ts +3 -6
- package/scripts/repo/required-checks-logic.ts +6 -15
- package/scripts/report/report-format-reference.ts +4 -0
- package/scripts/report/report-labels.ts +155 -0
- package/scripts/report/report-lint-cli.ts +3 -0
- package/scripts/report/report-lint.ts +85 -110
- package/scripts/report/report-template-cli.ts +59 -0
- package/scripts/report/report-template.ts +112 -0
- package/scripts/review/acceptance-map-check.ts +61 -0
- package/scripts/review/acceptance-map.ts +206 -0
- package/scripts/review/removed-tests-check.ts +86 -0
- package/scripts/review/removed-tests.ts +149 -0
- package/scripts/review/review-brief-cli.ts +82 -16
- package/scripts/review/review-brief-main.ts +12 -0
- package/scripts/review/review-brief.ts +31 -3
- package/scripts/review/review-code-tree.ts +10 -6
- package/scripts/review/review-comment-round.ts +26 -8
- package/scripts/review/review-finding-ledger.ts +30 -15
- package/scripts/review/review-interaction.ts +94 -0
- package/scripts/review/review-readers-scan.ts +163 -0
- package/scripts/review/review-record-cli.ts +69 -30
- package/scripts/review/review-record-main.ts +12 -0
- package/scripts/review/review-round-one-blobs.ts +221 -0
- package/scripts/review/review-round2-cli.ts +49 -12
- package/scripts/review/review-round2.ts +80 -12
- package/scripts/review/review-stamps.ts +19 -1
- package/scripts/review/review-stop-log.ts +96 -0
- package/scripts/review/review-stops-cli.ts +85 -0
- package/scripts/review/review-tree.ts +6 -17
- package/scripts/review/review-untouched-readers.ts +146 -0
- package/scripts/review/test-titles.ts +118 -0
- package/scripts/rules/agent-model.ts +67 -0
- package/scripts/rules/bash-triggers.ts +46 -3
- package/scripts/rules/decision-oracle-batch.ts +9 -1
- package/scripts/rules/decision-oracle.ts +2 -2
- package/scripts/rules/delivered-rules.ts +90 -3
- package/scripts/rules/destructive-command.ts +8 -1
- package/scripts/rules/direct-filing.ts +10 -2
- package/scripts/rules/direct-issue-comment.ts +117 -0
- package/scripts/rules/direct-pr-create.ts +69 -3
- package/scripts/rules/early-heartbeat.ts +2 -1
- package/scripts/rules/file-body.ts +7 -0
- package/scripts/rules/filing-cap.ts +8 -0
- package/scripts/rules/firing-point.ts +6 -5
- package/scripts/rules/git-argv.ts +72 -14
- package/scripts/rules/git-force.ts +12 -2
- package/scripts/rules/guard-remedy.ts +121 -0
- package/scripts/rules/implementation-cut-verdict.ts +1 -1
- package/scripts/rules/implementation-cut.ts +11 -3
- package/scripts/rules/index-guard.ts +8 -1
- package/scripts/rules/issue-comments.ts +76 -7
- package/scripts/rules/josh-git-bare.ts +7 -0
- package/scripts/rules/lane-background.ts +67 -25
- package/scripts/rules/lane-carry-conflict.ts +6 -0
- package/scripts/rules/lane-direct-tool.ts +74 -0
- package/scripts/rules/lane-interactive-ask.ts +9 -2
- package/scripts/rules/lane-park.ts +45 -23
- package/scripts/rules/lane-split-park.ts +10 -2
- package/scripts/rules/lane-switch-main.ts +7 -0
- package/scripts/rules/last-prompt.ts +50 -5
- package/scripts/rules/oracle-consulted.ts +10 -0
- package/scripts/rules/oracle-firing.ts +1 -0
- package/scripts/rules/oracle-list-cli.ts +7 -0
- package/scripts/rules/permission-guards.ts +3 -0
- package/scripts/rules/piped-verification.ts +4 -2
- package/scripts/rules/poll-loop.ts +7 -0
- package/scripts/rules/pr-merge.ts +123 -0
- package/scripts/rules/protected-files.ts +32 -5
- package/scripts/rules/raw-field-body.ts +6 -0
- package/scripts/rules/rule-body-guard.ts +8 -0
- package/scripts/rules/rule-list.ts +12 -28
- package/scripts/rules/rule-rewrite.ts +114 -0
- package/scripts/rules/rule-value-cache.ts +4 -9
- package/scripts/rules/rule-value-cli.ts +51 -32
- package/scripts/rules/rule-value.ts +8 -2
- package/scripts/rules/shell-segments.ts +50 -0
- package/scripts/rules/stop-decision.ts +77 -0
- package/scripts/rules/stop-rule-rows.ts +64 -0
- package/scripts/rules/stop-rules.ts +150 -51
- package/scripts/rules/tail-commands.ts +15 -1
- package/scripts/rules/test-declared-commit.ts +11 -1
- package/scripts/rules/third-party-write.ts +7 -0
- package/scripts/rules/timed-rerun.ts +69 -0
- package/scripts/rules/worktree-guard.ts +13 -3
- package/scripts/run/board/run-board-app-name.ts +23 -0
- package/scripts/run/board/run-board-cli.ts +65 -30
- package/scripts/run/board/run-board-closed.ts +8 -2
- package/scripts/run/board/run-board-earlier.ts +94 -0
- package/scripts/run/board/run-board-ending-reason.ts +67 -0
- package/scripts/run/board/run-board-estimate-schedule.ts +103 -0
- package/scripts/run/board/run-board-estimate.ts +98 -0
- package/scripts/run/board/run-board-fit.ts +153 -36
- package/scripts/run/board/run-board-fold.ts +123 -0
- package/scripts/run/board/run-board-fresh.ts +2 -2
- package/scripts/run/board/run-board-gather-live.ts +29 -0
- package/scripts/run/board/run-board-gather-thread.ts +189 -0
- package/scripts/run/board/run-board-gather-worker.ts +29 -0
- package/scripts/run/board/run-board-gather.ts +187 -0
- package/scripts/run/board/run-board-github.ts +119 -31
- package/scripts/run/board/run-board-header.ts +86 -21
- package/scripts/run/board/run-board-keys.ts +58 -0
- package/scripts/run/board/run-board-kind.ts +20 -6
- package/scripts/run/board/run-board-labels.ts +118 -71
- package/scripts/run/board/run-board-lane-state.ts +109 -0
- package/scripts/run/board/run-board-lane-time.ts +122 -0
- package/scripts/run/board/run-board-layout.ts +240 -61
- package/scripts/run/board/run-board-length.ts +52 -0
- package/scripts/run/board/run-board-machine.ts +8 -4
- package/scripts/run/board/run-board-main.ts +12 -0
- package/scripts/run/board/run-board-notes.ts +52 -31
- package/scripts/run/board/run-board-now.ts +1 -1
- package/scripts/run/board/run-board-operation.ts +15 -33
- package/scripts/run/board/run-board-phase.ts +1 -1
- package/scripts/run/board/run-board-plan-shared.ts +115 -0
- package/scripts/run/board/run-board-plan.ts +55 -3
- package/scripts/run/board/run-board-planning.ts +45 -0
- package/scripts/run/board/run-board-priority.ts +44 -0
- package/scripts/run/board/run-board-process-groups.ts +195 -0
- package/scripts/run/board/run-board-read.ts +153 -13
- package/scripts/run/board/run-board-reason.ts +238 -45
- package/scripts/run/board/run-board-released.ts +35 -0
- package/scripts/run/board/run-board-render-checks.ts +39 -5
- package/scripts/run/board/run-board-render-condition.ts +96 -0
- package/scripts/run/board/run-board-render-drawn.ts +67 -0
- package/scripts/run/board/run-board-render-foot.ts +59 -0
- package/scripts/run/board/run-board-render-icon.ts +35 -0
- package/scripts/run/board/run-board-render-lanes.ts +145 -0
- package/scripts/run/board/run-board-render-lead.ts +80 -0
- package/scripts/run/board/run-board-render-legend.ts +117 -47
- package/scripts/run/board/run-board-render-notes.ts +156 -29
- package/scripts/run/board/run-board-render-processes.ts +196 -0
- package/scripts/run/board/run-board-render-section.ts +119 -0
- package/scripts/run/board/run-board-render-slot.ts +3 -36
- package/scripts/run/board/run-board-render-tail.ts +115 -48
- package/scripts/run/board/run-board-render-time.ts +56 -0
- package/scripts/run/board/run-board-render-title.ts +117 -24
- package/scripts/run/board/run-board-render-waits.ts +125 -0
- package/scripts/run/board/run-board-render.ts +206 -259
- package/scripts/run/board/run-board-roots.ts +54 -0
- package/scripts/run/board/run-board-row-yield.ts +10 -4
- package/scripts/run/board/run-board-setup.ts +1 -12
- package/scripts/run/board/run-board-snapshot.ts +111 -0
- package/scripts/run/board/run-board-spin.ts +2 -2
- package/scripts/run/board/run-board-state.ts +23 -29
- package/scripts/run/board/run-board-status.ts +206 -79
- package/scripts/run/board/run-board-thanks-read.ts +2 -2
- package/scripts/run/board/run-board-tick.ts +123 -104
- package/scripts/run/board/run-board-usage-board.ts +78 -0
- package/scripts/run/board/run-board-usage-lanes.ts +113 -0
- package/scripts/run/board/run-board-usage-listing.ts +93 -0
- package/scripts/run/board/run-board-usage-read.ts +120 -150
- package/scripts/run/board/run-board-usage-rusage.ts +19 -7
- package/scripts/run/board/run-board-usage-text.ts +139 -51
- package/scripts/run/board/run-board-usage-top.ts +102 -0
- package/scripts/run/board/run-board-usage.ts +89 -72
- package/scripts/run/board/run-board-usual.ts +20 -9
- package/scripts/run/carry/run-carry-args.ts +4 -7
- package/scripts/run/carry/run-carry-conversation.ts +1 -1
- package/scripts/run/carry/run-carry.ts +9 -4
- package/scripts/run/cut/run-cut-cli.ts +3 -2
- package/scripts/run/cut/run-cut-handoff.ts +2 -2
- package/scripts/run/cut/run-cut-report.ts +16 -0
- package/scripts/run/detached-launch.ts +23 -4
- package/scripts/run/entry/run-entry-cli.ts +8 -1
- package/scripts/run/event/run-event-cli.ts +1 -5
- package/scripts/run/event/run-event-filed.ts +12 -6
- package/scripts/run/event/run-event-follow.ts +2 -3
- package/scripts/run/event/run-event-render.ts +7 -10
- package/scripts/run/event/run-event-scope.ts +20 -2
- package/scripts/run/event/run-event-stream-emit.ts +78 -11
- package/scripts/run/event/run-event-stream.ts +37 -7
- package/scripts/run/hold/run-hold-adopt.ts +65 -0
- package/scripts/run/hold/run-hold-cli.ts +93 -22
- package/scripts/run/hold/run-hold-main.ts +12 -0
- package/scripts/run/hold/run-hold-member.ts +37 -0
- package/scripts/run/hold/run-hold-session.ts +46 -0
- package/scripts/run/hold/run-hold.ts +7 -1
- package/scripts/run/hold/run-stop-notify.ts +183 -0
- package/scripts/run/launch-priority.ts +32 -0
- package/scripts/run/merge/run-merge-auth.ts +31 -0
- package/scripts/run/merge/run-merge-cli.ts +72 -107
- package/scripts/run/merge/run-merge-close.ts +74 -0
- package/scripts/run/merge/run-merge-collect.ts +6 -13
- package/scripts/run/merge/run-merge-driver.ts +71 -0
- package/scripts/run/merge/run-merge-main.ts +12 -0
- package/scripts/run/merge/run-merge-outcome.ts +23 -0
- package/scripts/run/merge/run-merge-restart.ts +39 -0
- package/scripts/run/merge/run-merge-ship.ts +20 -4
- package/scripts/run/merge/run-merge-signals.ts +123 -0
- package/scripts/run/merge/run-merge-steps.ts +128 -83
- package/scripts/run/merge/run-merge.ts +53 -40
- package/scripts/run/park/run-park-cli.ts +91 -0
- package/scripts/run/park/run-park.ts +88 -0
- package/scripts/run/park/run-stalled.ts +68 -0
- package/scripts/run/pause/run-pause-cli.ts +73 -0
- package/scripts/run/pause/run-pause.ts +251 -0
- package/scripts/run/progress/run-progress-cli.ts +4 -12
- package/scripts/run/progress/run-progress-clock.ts +1 -1
- package/scripts/run/progress/run-progress-config.ts +6 -14
- package/scripts/run/progress/run-progress-main.ts +12 -0
- package/scripts/run/progress/run-progress.ts +1 -4
- package/scripts/run/review/run-review.ts +2 -1
- package/scripts/run/run-ending.ts +1 -0
- package/scripts/run/run-invocation.ts +5 -6
- package/scripts/run/run-liveness-cli.ts +6 -8
- package/scripts/run/run-liveness.ts +61 -30
- package/scripts/run/run-next.ts +1 -1
- package/scripts/run/run-parent-cut-hook.ts +2 -2
- package/scripts/run/run-poll-hook.ts +157 -0
- package/scripts/run/run-preflight.ts +18 -3
- package/scripts/run/run-prep-cli.ts +1 -10
- package/scripts/run/run-prep-locate.ts +7 -50
- package/scripts/run/run-prep-main.ts +12 -0
- package/scripts/run/run-prep.ts +6 -0
- package/scripts/run/run-report-cli.ts +101 -13
- package/scripts/run/run-report-handoff.ts +114 -0
- package/scripts/run/run-step-cli.ts +22 -15
- package/scripts/run/run-step-section.ts +85 -0
- package/scripts/run/run-step.ts +1 -1
- package/scripts/run/run-stranded-detect.ts +13 -0
- package/scripts/run/run-watcher-guard-cli.ts +1 -1
- package/scripts/run/run-watcher-guard.ts +1 -1
- package/scripts/run/ship/run-ship-args.ts +121 -0
- package/scripts/run/ship/run-ship-body-draft.ts +110 -0
- package/scripts/run/ship/run-ship-cli.ts +67 -151
- package/scripts/run/ship/run-ship-detach.ts +27 -7
- package/scripts/run/ship/run-ship-infra-retry.ts +59 -0
- package/scripts/run/ship/run-ship-next.ts +27 -3
- package/scripts/run/ship/run-ship-overlap.ts +232 -0
- package/scripts/run/ship/run-ship-place.ts +96 -0
- package/scripts/run/ship/run-ship-pre-detach-timed.ts +43 -0
- package/scripts/run/ship/run-ship-pre-detach.ts +102 -27
- package/scripts/run/ship/run-ship-preflight.ts +161 -30
- package/scripts/run/ship/run-ship-probe.ts +11 -3
- package/scripts/run/ship/run-ship-relaunch-cap.ts +70 -0
- package/scripts/run/ship/run-ship-removed-rows.ts +61 -0
- package/scripts/run/ship/run-ship-return.ts +123 -15
- package/scripts/run/ship/run-ship-review-steps.ts +105 -149
- package/scripts/run/ship/run-ship-review.ts +73 -6
- package/scripts/run/ship/run-ship-reviewer.ts +207 -0
- package/scripts/run/ship/run-ship-stage.ts +55 -6
- package/scripts/run/ship/run-ship-steps.ts +46 -15
- package/scripts/run/ship/run-ship-stop-cause.ts +135 -0
- package/scripts/run/ship/run-ship-stop-context.ts +206 -0
- package/scripts/run/ship/run-ship-stop-text.ts +11 -6
- package/scripts/run/ship/run-ship-sync.ts +57 -12
- package/scripts/run/ship/run-ship.ts +30 -2
- package/scripts/run/tidy/run-tidy-cli.ts +0 -4
- package/scripts/run/tidy/run-tidy-lanes.ts +3 -0
- package/scripts/run/tidy/run-tidy-main.ts +8 -0
- package/scripts/run/wake/run-wake-cli.ts +119 -100
- package/scripts/run/wake/run-wake-code.ts +83 -0
- package/scripts/run/wake/run-wake-driver.ts +19 -8
- package/scripts/run/wake/run-wake-loop.ts +34 -3
- package/scripts/run/wake/run-wake-main.ts +13 -0
- package/scripts/run/wake/run-wake-ports.ts +90 -0
- package/scripts/run/wake/run-wake-takeover.ts +66 -0
- package/scripts/run/wake/run-wake.ts +2 -1
- package/scripts/safe-chain/pack-hook.ts +2 -2
- package/scripts/safe-chain/preinstall-command.ts +2 -1
- package/scripts/safe-chain/project-config.ts +3 -9
- package/scripts/security/security-audit-main.ts +8 -0
- package/scripts/security/security-audit-provision-logic.ts +0 -11
- package/scripts/security/security-audit-provision-main.ts +12 -0
- package/scripts/security/security-audit-provision.ts +11 -26
- package/scripts/security/security-audit.ts +6 -7
- package/scripts/self-sync-guard/self-sync-guard-logic.ts +6 -13
- package/scripts/split/split-assess-cli.ts +2 -2
- package/scripts/split/split-assess.ts +15 -0
- package/scripts/split/split-measure.ts +65 -0
- package/scripts/sync/claude-settings-merge.ts +8 -15
- package/scripts/sync/directory-copy-guard.ts +4 -9
- package/scripts/sync/file-content.ts +78 -8
- package/scripts/sync/sync-ai-files.ts +3 -5
- package/scripts/sync/sync-configs.ts +11 -23
- package/scripts/sync/sync-hook-safety.ts +4 -10
- package/scripts/sync/sync-main.ts +11 -0
- package/scripts/sync/sync.ts +25 -37
- package/scripts/test/test-declared-changed.ts +2 -2
- package/scripts/test/test-declared.ts +1 -1
- package/scripts/test/test-e2e-guard.ts +55 -6
- package/scripts/test/test-e2e-stamp.ts +38 -0
- package/scripts/test/test-pinned-logic.ts +145 -0
- package/scripts/test/test-pinned-main.ts +78 -0
- package/scripts/test/test-pinned.ts +100 -0
- package/scripts/test/test-read-map.ts +264 -0
- package/scripts/test/test-read-recording.ts +91 -0
- package/scripts/test/test-read-trace.ts +148 -0
- package/scripts/test/test-red-main.ts +12 -0
- package/scripts/test/test-red.ts +12 -30
- package/scripts/test/test-related-main.ts +18 -0
- package/scripts/test/test-related-record.ts +119 -0
- package/scripts/test/test-related-scope.ts +229 -43
- package/scripts/test/test-related.ts +300 -22
- package/scripts/test/test-unit-guard-main.ts +15 -0
- package/scripts/test/test-unit-guard.ts +54 -21
- package/scripts/test/unit-count-file.ts +37 -0
- package/scripts/test/unit-run-marker.ts +162 -0
- package/scripts/test/unit-setup-files.ts +51 -0
- package/scripts/test/unit-worker-share.ts +71 -137
- package/scripts/test/whole-suite-files.ts +63 -0
- package/scripts/time-runtime/time-background.ts +20 -2
- package/scripts/time-runtime/time-bundles.ts +4 -3
- package/scripts/time-runtime/time-density-hook.ts +8 -6
- package/scripts/time-runtime/time-followup-stage.ts +1 -3
- package/scripts/time-runtime/time-format.ts +5 -28
- package/scripts/time-runtime/time-markers.ts +10 -1
- package/scripts/time-runtime/time-shell.ts +126 -14
- package/scripts/time-runtime/time-spans.ts +1 -0
- package/scripts/time-runtime/time-tool-call.ts +7 -0
- package/scripts/time-runtime/time-transcript-line.ts +49 -62
- package/scripts/uninstall/uninstall.ts +1 -1
- package/scripts/version/bump-version-main.ts +12 -0
- package/scripts/version/bump-version.ts +25 -25
- package/scripts/version/effective-upstream.ts +6 -12
- package/scripts/version/latest-corepack.ts +17 -32
- package/scripts/version/latest-if-required-cli.ts +93 -0
- package/scripts/version/latest-lane-guard-main.ts +8 -0
- package/scripts/version/latest-lane-guard.ts +0 -4
- package/scripts/version/latest-scope-cli.ts +0 -9
- package/scripts/version/latest-scope-main.ts +12 -0
- package/scripts/version/latest-update.ts +5 -5
- package/scripts/version/npm-registry.ts +44 -6
- package/scripts/version/publishable-range-check.ts +5 -16
- package/scripts/version/release-age.ts +1 -1
- package/scripts/version/release-hold.ts +1 -1
- package/scripts/version/release-window.ts +38 -0
- package/scripts/version/running-binary.ts +1 -1
- package/scripts/version/safe-chain-version-update.ts +3 -8
- package/scripts/version/version-targets.ts +6 -28
- package/templates/dependabot.yml +29 -0
- package/templates/gitignore +10 -3
- package/templates/pnpm-workspace.basic.yaml +1 -1
- package/templates/sonar-project.properties +3 -2
- package/templates/workflows/ci.yml +12 -4
- package/templates/workflows/github-release.yml +4 -0
- package/tsconfig.sonar.json +1 -1
- package/.ncurc.json +0 -3
- package/dist/hooks/batch-guard.js +0 -29
- package/dist/hooks/chunk-43ZHT22P.js +0 -3495
- package/dist/hooks/chunk-CDY4NFQG.js +0 -15
- package/dist/hooks/chunk-EUMACUK2.js +0 -2038
- package/dist/hooks/chunk-H5HVWYXK.js +0 -359
- package/dist/hooks/chunk-IIGFYXKC.js +0 -7104
- package/dist/hooks/chunk-IX6TTTI6.js +0 -95
- package/dist/hooks/chunk-J47HU5H5.js +0 -237
- package/dist/hooks/chunk-K4EOONYM.js +0 -45
- package/dist/hooks/chunk-K4LMBQC2.js +0 -68
- package/dist/hooks/chunk-SHGPANFB.js +0 -56
- package/dist/hooks/chunk-YHBZAJSV.js +0 -79
- package/dist/hooks/chunk-YYPI7SJZ.js +0 -131
- package/dist/hooks/duplicate-read-guard.js +0 -30
- package/dist/hooks/investigation-guard.js +0 -32
- package/scripts/backlog/backlog-stalled-cli.ts +0 -30
- package/scripts/cost-runtime/cost-format.ts +0 -29
- package/scripts/init/basic-path-migration.ts +0 -24
- package/scripts/issue/issue-backlinks-cli.ts +0 -93
- package/scripts/josh/josh-commands-guard.ts +0 -38
- package/scripts/lint/cross-file-recheck.ts +0 -155
- package/scripts/registry-migration/migrate-logic.ts +0 -237
- package/scripts/registry-migration/migrate.ts +0 -292
- package/scripts/registry-migration/user-npmrc.ts +0 -15
- package/scripts/rules/rule-guard.ts +0 -23
- package/scripts/rules/rule-registry-rows.ts +0 -282
- package/scripts/rules/rule-registry.ts +0 -109
- package/scripts/run/run-stranded-cli.ts +0 -27
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { existsSync } from 'node:fs'
|
|
1
|
+
import { existsSync, statSync } from 'node:fs'
|
|
2
2
|
import path from 'node:path'
|
|
3
3
|
import { ENV_FILE_NAME } from '#ports'
|
|
4
4
|
import type { AgentProfile } from '#scripts/agent/agent-role-profile'
|
|
@@ -38,6 +38,9 @@ interface LaneInfo {
|
|
|
38
38
|
// instead of waiting for the pool to drain before it can be cut.
|
|
39
39
|
output: string | undefined
|
|
40
40
|
profile?: AgentProfile | undefined
|
|
41
|
+
// When the lane last took a child: `lane:open` writes its `.env`, and every dispatch records its
|
|
42
|
+
// unit there (`lane-output.ts`). `undefined` where the `.env` cannot be read.
|
|
43
|
+
dispatched_ms?: number | undefined
|
|
41
44
|
is_stranded: boolean
|
|
42
45
|
}
|
|
43
46
|
|
|
@@ -106,6 +109,10 @@ function read_environment(directory: string): string | undefined {
|
|
|
106
109
|
return file_reader.read_if_readable(path.join(directory, ENV_FILE_NAME))
|
|
107
110
|
}
|
|
108
111
|
|
|
112
|
+
function dispatched_at(directory: string): number | undefined {
|
|
113
|
+
return statSync(path.join(directory, ENV_FILE_NAME), { throwIfNoEntry: false })?.mtimeMs
|
|
114
|
+
}
|
|
115
|
+
|
|
109
116
|
// A lane is identified by its branch rather than by where it sits, so nothing here compares two
|
|
110
117
|
// spellings of one path — git prints the resolved one, and a lane root reached through a symlink
|
|
111
118
|
// would otherwise read as no lane at all.
|
|
@@ -151,6 +158,7 @@ function build_lane(
|
|
|
151
158
|
preview_port: held.preview_port,
|
|
152
159
|
output,
|
|
153
160
|
profile,
|
|
161
|
+
dispatched_ms: is_stranded ? undefined : dispatched_at(directory),
|
|
154
162
|
is_stranded,
|
|
155
163
|
}
|
|
156
164
|
}
|
|
@@ -214,9 +222,28 @@ async function main_repository_root(): Promise<string> {
|
|
|
214
222
|
return repo_discovery.main_worktree(await git_command.repository_root())
|
|
215
223
|
}
|
|
216
224
|
|
|
217
|
-
/**
|
|
218
|
-
|
|
219
|
-
|
|
225
|
+
/**
|
|
226
|
+
* The directory this repository's lanes live in, read from the main work tree rather than this one —
|
|
227
|
+
* derived from the current work tree, a command run inside a lane would look for lanes inside it.
|
|
228
|
+
*/
|
|
229
|
+
async function lane_root_directory(): Promise<string> {
|
|
230
|
+
return lane_paths.lane_root(await main_repository_root())
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
/**
|
|
234
|
+
* The issue's lane by the directory its number implies, registered or not — what ending its processes
|
|
235
|
+
* needs (`lane_reap.reap_child`), so a lane `list_lanes` no longer reads is still reached.
|
|
236
|
+
*/
|
|
237
|
+
async function lane_location(issue: string): Promise<Pick<LaneInfo, 'issue' | 'directory'>> {
|
|
238
|
+
return { issue, directory: lane_paths.lane_directory(await lane_root_directory(), issue) }
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
/**
|
|
242
|
+
* Every open lane of this repository, lowest issue number first. `main_root` is the main work tree a
|
|
243
|
+
* caller already resolved — `run:board` resolves it once rather than with a `git` call each read.
|
|
244
|
+
*/
|
|
245
|
+
async function list_lanes(main_root?: string): Promise<Array<LaneInfo>> {
|
|
246
|
+
const root = lane_paths.lane_root(main_root ?? (await main_repository_root()))
|
|
220
247
|
const blocks = await worktree_blocks()
|
|
221
248
|
const lanes = blocks.map((block) => parse_block(block, root)).filter(is_lane)
|
|
222
249
|
|
|
@@ -241,11 +268,6 @@ async function has_lanes_in_flight(): Promise<boolean> {
|
|
|
241
268
|
return lanes.some((lane) => !lane.is_stranded)
|
|
242
269
|
}
|
|
243
270
|
|
|
244
|
-
/** The lanes in use: the open work trees an interruption has not stranded. */
|
|
245
|
-
function live_count(lanes: ReadonlyArray<LaneInfo>): number {
|
|
246
|
-
return lanes.filter((lane) => !lane.is_stranded).length
|
|
247
|
-
}
|
|
248
|
-
|
|
249
271
|
/** The seats live lanes hold — what a new lane's seat has to avoid. */
|
|
250
272
|
function used_seats(lanes: ReadonlyArray<LaneInfo>): Array<number> {
|
|
251
273
|
return lanes.map((lane) => lane.seat).filter((seat): seat is number => seat !== undefined)
|
|
@@ -276,8 +298,9 @@ const lane_registry = {
|
|
|
276
298
|
find_lane,
|
|
277
299
|
find_open_lane,
|
|
278
300
|
has_lanes_in_flight,
|
|
301
|
+
lane_location,
|
|
302
|
+
lane_root_directory,
|
|
279
303
|
list_lanes,
|
|
280
|
-
live_count,
|
|
281
304
|
main_repository_root,
|
|
282
305
|
parse_block,
|
|
283
306
|
read_environment,
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
import { spawnSync } from 'node:child_process'
|
|
2
|
+
import path from 'node:path'
|
|
3
|
+
import { PROBE_TIMEOUT_MS } from '#scripts/lib/timeouts'
|
|
4
|
+
import { lane_reap } from './lane-reap'
|
|
5
|
+
import { process_directories } from './process-directories'
|
|
6
|
+
import { process_lane_marks } from './process-lane-marks'
|
|
7
|
+
|
|
8
|
+
// Ending what still runs from a lane's checkout, or carries its mark, when the lane closes
|
|
9
|
+
// (joshuafolkken/kit#4304, joshuafolkken/kit#4315).
|
|
10
|
+
//
|
|
11
|
+
// **The lane child's tree and its `eslint_d` are not everything a lane starts.** A diagnostic the
|
|
12
|
+
// child launched under `script`, or a `node` it detached, is re-parented to pid 1 and outlives the
|
|
13
|
+
// merge: no tree reaches it and no title names it, and `run:board` drew such processes as a leftover
|
|
14
|
+
// holding gigabytes while nothing ended them. Its working directory still sits under the lane, which
|
|
15
|
+
// is what finds it — the same reading the board's leftover is drawn from (`process-directories.ts`).
|
|
16
|
+
// **A process the child started from elsewhere** — a measurement run from the main checkout or `/tmp`
|
|
17
|
+
// — has no such directory, so the lane's mark it inherited finds it instead (`process-lane-marks.ts`):
|
|
18
|
+
// the issue number `lane:dispatch` put in the child's environment. A process without the mark, or with
|
|
19
|
+
// another issue's, is never this lane's.
|
|
20
|
+
//
|
|
21
|
+
// **Only that lane's processes, and never the caller.** Another lane's and the main checkout's
|
|
22
|
+
// unmarked processes are not its. A `lane:close` run from inside the lane would match itself, so its
|
|
23
|
+
// ancestry is spared, as `lane-reap.ts` spares it — and so is its process group: its own helpers
|
|
24
|
+
// (`tsx`'s `esbuild`) and the commands piped beside it share the group, while a detached process
|
|
25
|
+
// (`script`, a new session) has left it.
|
|
26
|
+
|
|
27
|
+
const GROUP_ARGUMENTS = ['-o', 'pid=,pgid=', '-p']
|
|
28
|
+
const PID_SEPARATOR = ','
|
|
29
|
+
// `ps`'s line: the process and its group.
|
|
30
|
+
const PAIR_LENGTH = 2
|
|
31
|
+
|
|
32
|
+
interface ResidentLane {
|
|
33
|
+
issue: string
|
|
34
|
+
directory: string
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
interface ResidentProbes {
|
|
38
|
+
// `undefined` where the working directories could not be read.
|
|
39
|
+
directories: () => ReadonlyMap<number, string> | undefined
|
|
40
|
+
// Each marked process's issue; `undefined` where the marks could not be read.
|
|
41
|
+
marks: () => ReadonlyMap<number, string> | undefined
|
|
42
|
+
own: () => ReadonlySet<number>
|
|
43
|
+
// Each listed process's group; a process gone by then is missing.
|
|
44
|
+
groups_of: (pids: ReadonlyArray<number>) => ReadonlyMap<number, number>
|
|
45
|
+
terminate: (pid: number) => boolean
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function parse_groups(printed: string): Map<number, number> {
|
|
49
|
+
const pairs = printed
|
|
50
|
+
.split('\n')
|
|
51
|
+
.map((line) => line.trim().split(/\s+/u).map(Number))
|
|
52
|
+
.filter((pair) => pair.length === PAIR_LENGTH && pair.every((id) => Number.isSafeInteger(id)))
|
|
53
|
+
|
|
54
|
+
return new Map(pairs.map(([pid = 0, group = 0]) => [pid, group] as const))
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// `ps` exits non-zero when a listed process is gone and still prints the rest, so its output is read
|
|
58
|
+
// whatever the exit status.
|
|
59
|
+
function groups_of(pids: ReadonlyArray<number>): Map<number, number> {
|
|
60
|
+
const result = spawnSync(lane_reap.PS_COMMAND, [...GROUP_ARGUMENTS, pids.join(PID_SEPARATOR)], {
|
|
61
|
+
encoding: 'utf8',
|
|
62
|
+
timeout: PROBE_TIMEOUT_MS,
|
|
63
|
+
stdio: ['ignore', 'pipe', 'ignore'],
|
|
64
|
+
})
|
|
65
|
+
|
|
66
|
+
return parse_groups(result.stdout)
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
const SYSTEM_PROBES: ResidentProbes = {
|
|
70
|
+
directories: () => process_directories.list_all(),
|
|
71
|
+
marks: () => process_lane_marks.list_all(),
|
|
72
|
+
own: () => lane_reap.own_ancestry(),
|
|
73
|
+
groups_of,
|
|
74
|
+
terminate: (pid) => lane_reap.SYSTEM_PROBES.terminate(pid),
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// The candidates outside the caller's process group. The caller's own group unread spares nothing
|
|
78
|
+
// more: its ancestry is spared regardless.
|
|
79
|
+
function outside_own_group(candidates: Array<number>, probes: ResidentProbes): Array<number> {
|
|
80
|
+
if (candidates.length === 0) return candidates
|
|
81
|
+
const groups = probes.groups_of([process.pid, ...candidates])
|
|
82
|
+
const own_group = groups.get(process.pid)
|
|
83
|
+
|
|
84
|
+
return candidates.filter((pid) => own_group === undefined || groups.get(pid) !== own_group)
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// Every process running from the lane's directory or carrying its mark, once each.
|
|
88
|
+
function lane_processes(
|
|
89
|
+
lane: ResidentLane,
|
|
90
|
+
directories: ReadonlyMap<number, string>,
|
|
91
|
+
marks: ReadonlyMap<number, string>,
|
|
92
|
+
): Array<number> {
|
|
93
|
+
const root = path.dirname(lane.directory)
|
|
94
|
+
const within = [...directories]
|
|
95
|
+
.filter(([, cwd]) => process_directories.lane_of(cwd, root) === lane.issue)
|
|
96
|
+
.map(([pid]) => pid)
|
|
97
|
+
const marked = [...marks].filter(([, issue]) => issue === lane.issue).map(([pid]) => pid)
|
|
98
|
+
|
|
99
|
+
return [...new Set([...within, ...marked])]
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* The processes running from `lane`'s directory or carrying its mark, the caller's ancestry and process
|
|
104
|
+
* group left out; `undefined` where the working directories or the marks could not be read.
|
|
105
|
+
*/
|
|
106
|
+
function residents(
|
|
107
|
+
lane: ResidentLane,
|
|
108
|
+
probes: ResidentProbes = SYSTEM_PROBES,
|
|
109
|
+
): Array<number> | undefined {
|
|
110
|
+
const directories = probes.directories()
|
|
111
|
+
const marks = probes.marks()
|
|
112
|
+
|
|
113
|
+
if (directories === undefined || marks === undefined) return undefined
|
|
114
|
+
const own = probes.own()
|
|
115
|
+
const candidates = lane_processes(lane, directories, marks).filter((pid) => !own.has(pid))
|
|
116
|
+
|
|
117
|
+
return outside_own_group(candidates, probes)
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Terminate the processes still running from `lane`'s directory or carrying its mark, except `spared`
|
|
122
|
+
* — what the close already ended. Returns the pids the signal reached, `undefined` where they could
|
|
123
|
+
* not be read.
|
|
124
|
+
*/
|
|
125
|
+
function end_residents(
|
|
126
|
+
lane: ResidentLane,
|
|
127
|
+
spared: ReadonlyArray<number>,
|
|
128
|
+
probes: ResidentProbes = SYSTEM_PROBES,
|
|
129
|
+
): Array<number> | undefined {
|
|
130
|
+
return residents(lane, probes)
|
|
131
|
+
?.filter((pid) => !spared.includes(pid))
|
|
132
|
+
.filter((pid) => probes.terminate(pid))
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* What `end_residents` did, said for the issue `cited`; `undefined` when nothing of the lane still ran.
|
|
137
|
+
* A reading that failed is said, never read as none.
|
|
138
|
+
*/
|
|
139
|
+
function residents_sentence(
|
|
140
|
+
ended: ReadonlyArray<number> | undefined,
|
|
141
|
+
cited: string,
|
|
142
|
+
): string | undefined {
|
|
143
|
+
if (ended === undefined) {
|
|
144
|
+
return `Could not read which processes still run from the lane for ${cited} (lsof or ps failed); none of them was ended.`
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
if (ended.length === 0) return undefined
|
|
148
|
+
|
|
149
|
+
return `Terminated ${String(ended.length)} process(es) still running from the lane for ${cited}: ${ended.join(', ')}.`
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/** Print `residents_sentence` to stderr, where a close reports what it ended. */
|
|
153
|
+
function report(ended: ReadonlyArray<number> | undefined, cited: string): void {
|
|
154
|
+
const sentence = residents_sentence(ended, cited)
|
|
155
|
+
|
|
156
|
+
if (sentence !== undefined) console.error(sentence)
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
const lane_residents = { end_residents, parse_groups, report, residents, residents_sentence }
|
|
160
|
+
|
|
161
|
+
export type { ResidentLane, ResidentProbes }
|
|
162
|
+
export { lane_residents }
|
|
@@ -3,21 +3,21 @@ import { issue_cite } from '#scripts/issue/issue-cite'
|
|
|
3
3
|
import { IN_PROGRESS_LABEL } from '#scripts/issue/issue-labels'
|
|
4
4
|
import { issue_number_shape } from '#scripts/issue/issue-number-shape'
|
|
5
5
|
import { session_cite } from '#scripts/issue/session-cite'
|
|
6
|
-
import { error_text } from '#scripts/lib/error-message'
|
|
7
6
|
import { run_cut } from '#scripts/run/cut/run-cut'
|
|
8
7
|
import { run_event_stream } from '#scripts/run/event/run-event-stream'
|
|
9
8
|
import { run_event_stream_emit } from '#scripts/run/event/run-event-stream-emit'
|
|
10
9
|
import { lane_dispatch, type DispatchOutcome } from './lane-dispatch'
|
|
11
|
-
import { lane_preserve } from './lane-preserve'
|
|
10
|
+
import { lane_preserve, type KeptWork } from './lane-preserve'
|
|
12
11
|
import { lane_reap } from './lane-reap'
|
|
13
12
|
import { lane_registry, type LaneInfo } from './lane-registry'
|
|
13
|
+
import { lane_residents } from './lane-residents'
|
|
14
14
|
|
|
15
15
|
// `josh lane:restart <N>` — a person stops a running lane child and starts its issue over in a fresh
|
|
16
16
|
// session, typically after correcting the Issue's specification mid-run.
|
|
17
17
|
//
|
|
18
18
|
// **The restart is a hand-off inside the parent's re-confirm window, not a recovery.** Killing the child
|
|
19
19
|
// alone would let `lane:await` book it stopped and `run:merge` classify it — an `outage` resumes the old
|
|
20
|
-
// session with the old specification in mind, anything else is parked `
|
|
20
|
+
// session with the old specification in mind, anything else is parked `run:stalled` and counted as a
|
|
21
21
|
// failure. `run:cut` already hands a lane to a new process inside `lane:await`'s re-confirm window, so a
|
|
22
22
|
// child that disappears and reappears under the same `fullrun #<N>` pattern is never collected: the
|
|
23
23
|
// restart stops, stashes and re-dispatches within that window, and no failure or outage is counted.
|
|
@@ -37,12 +37,9 @@ const DISPATCHED_KIND = 'dispatched'
|
|
|
37
37
|
const NO_LANE_KIND = 'no-lane'
|
|
38
38
|
const NOT_RUNNING_KIND = 'not-running'
|
|
39
39
|
const UNCLAIMED_KIND = 'unclaimed'
|
|
40
|
+
const CONFLICTED_KIND = 'conflicted'
|
|
40
41
|
|
|
41
|
-
|
|
42
|
-
kind: 'unsaved'
|
|
43
|
-
directory: string
|
|
44
|
-
reason: string
|
|
45
|
-
}
|
|
42
|
+
type Unsaved = Extract<KeptWork, { kind: 'unsaved' }>
|
|
46
43
|
|
|
47
44
|
interface Restarted {
|
|
48
45
|
kind: 'restarted'
|
|
@@ -54,8 +51,8 @@ type Refused =
|
|
|
54
51
|
| { kind: typeof NO_LANE_KIND }
|
|
55
52
|
| { kind: typeof NOT_RUNNING_KIND }
|
|
56
53
|
| { kind: typeof UNCLAIMED_KIND; reason: string }
|
|
54
|
+
| { kind: typeof CONFLICTED_KIND; directory: string }
|
|
57
55
|
type RestartOutcome = Restarted | Unsaved | Refused
|
|
58
|
-
type Saved = Unsaved | { kind: 'saved'; stash: string | undefined }
|
|
59
56
|
|
|
60
57
|
// A cut the stopped child carried would hand its successor the old session's hand-off at
|
|
61
58
|
// `run:cut --resume`; the fresh session has to start from the Issue instead.
|
|
@@ -65,22 +62,6 @@ function end_carried_cut(lane: LaneInfo): void {
|
|
|
65
62
|
if (carried !== undefined) run_cut.end_cut(carried.target)
|
|
66
63
|
}
|
|
67
64
|
|
|
68
|
-
async function stash_of(lane: LaneInfo): Promise<string | undefined> {
|
|
69
|
-
if (!(await git_stash.has_changes(lane.directory))) return undefined
|
|
70
|
-
|
|
71
|
-
return await lane_preserve.push_work(lane.issue, lane.directory, RESTART_OCCASION)
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
// A tree that could not be read or pushed is left as it is: re-dispatching into it would hand the fresh
|
|
75
|
-
// session the stopped one's half-done work as though it were its own.
|
|
76
|
-
async function save_work(lane: LaneInfo): Promise<Saved> {
|
|
77
|
-
try {
|
|
78
|
-
return { kind: 'saved', stash: await stash_of(lane) }
|
|
79
|
-
} catch (error) {
|
|
80
|
-
return { kind: 'unsaved', directory: lane.directory, reason: error_text.message_of(error) }
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
|
|
84
65
|
async function record_restart(issue: string): Promise<void> {
|
|
85
66
|
await run_event_stream_emit.emit(
|
|
86
67
|
run_event_stream.EVENT_KIND.RESTART,
|
|
@@ -88,9 +69,11 @@ async function record_restart(issue: string): Promise<void> {
|
|
|
88
69
|
)
|
|
89
70
|
}
|
|
90
71
|
|
|
72
|
+
// A tree that could not be read or pushed is left as it is: re-dispatching into it would hand the fresh
|
|
73
|
+
// session the stopped one's half-done work as though it were its own.
|
|
91
74
|
async function relaunch(lane: LaneInfo): Promise<RestartOutcome> {
|
|
92
75
|
end_carried_cut(lane)
|
|
93
|
-
const saved = await
|
|
76
|
+
const saved = await lane_preserve.keep_work(lane.issue, lane.directory, RESTART_OCCASION)
|
|
94
77
|
|
|
95
78
|
if (saved.kind === 'unsaved') return saved
|
|
96
79
|
const dispatch = await lane_dispatch.dispatch_child(lane.issue, 'restart')
|
|
@@ -106,12 +89,19 @@ async function relaunch(lane: LaneInfo): Promise<RestartOutcome> {
|
|
|
106
89
|
|
|
107
90
|
// A child that ended on its own during the claim (say, right after merging its PR) is a finished child
|
|
108
91
|
// for `run:merge` to collect — relaunching it would re-run a done issue inside the re-confirm window.
|
|
92
|
+
// What the stopped child started outside its tree goes with it, so the fresh session starts beside none
|
|
93
|
+
// of it (`lane-residents.ts`).
|
|
109
94
|
async function stop_and_relaunch(lane: LaneInfo): Promise<RestartOutcome> {
|
|
110
|
-
|
|
95
|
+
const reaped = lane_reap.reap_child(lane)
|
|
96
|
+
|
|
97
|
+
if (reaped.length === 0) return { kind: NOT_RUNNING_KIND }
|
|
98
|
+
lane_residents.report(lane_residents.end_residents(lane, reaped), session_cite.issue(lane.issue))
|
|
111
99
|
|
|
112
100
|
return await relaunch(lane)
|
|
113
101
|
}
|
|
114
102
|
|
|
103
|
+
// A tree with unresolved conflicts (a sync's merge stopped mid-way) cannot be stashed, so it is refused
|
|
104
|
+
// before the stop — stopping first would strand the lane with no child and nothing re-dispatched.
|
|
115
105
|
/** Stop the running child of `#<N>`'s lane and re-dispatch the issue there in a fresh session. */
|
|
116
106
|
async function restart(issue: string): Promise<RestartOutcome> {
|
|
117
107
|
issue_number_shape.require_issue_number(issue)
|
|
@@ -119,6 +109,11 @@ async function restart(issue: string): Promise<RestartOutcome> {
|
|
|
119
109
|
|
|
120
110
|
if (lane === undefined) return { kind: NO_LANE_KIND }
|
|
121
111
|
if (!lane_reap.is_child_running(issue)) return { kind: NOT_RUNNING_KIND }
|
|
112
|
+
|
|
113
|
+
if (await git_stash.has_conflict(lane.directory)) {
|
|
114
|
+
return { kind: CONFLICTED_KIND, directory: lane.directory }
|
|
115
|
+
}
|
|
116
|
+
|
|
122
117
|
const claim = await lane_dispatch.claim_marker(issue)
|
|
123
118
|
|
|
124
119
|
if (!claim.is_applied) return { kind: UNCLAIMED_KIND, reason: claim.reason }
|
|
@@ -154,6 +149,10 @@ function refused_text(outcome: Refused, issue: string): string {
|
|
|
154
149
|
return `No lane is open for ${cited}, so there is no child to restart.`
|
|
155
150
|
}
|
|
156
151
|
|
|
152
|
+
if (outcome.kind === CONFLICTED_KIND) {
|
|
153
|
+
return `The lane for ${cited} has unresolved conflicts, which \`git stash\` cannot keep, so the running child was left as it is — nothing was stopped or re-dispatched. Resolve them, or run \`git -C ${outcome.directory} merge --abort\`, then run \`pnpm josh lane:restart ${issue}\` again.`
|
|
154
|
+
}
|
|
155
|
+
|
|
157
156
|
if (outcome.kind === UNCLAIMED_KIND) {
|
|
158
157
|
return `The \`${IN_PROGRESS_LABEL}\` label could not be confirmed on ${cited} (${outcome.reason}), so the running child was left as it is — nothing was stopped or re-dispatched.`
|
|
159
158
|
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { lane_ledger, type LedgerEntry, type RoundTwoEntry } from './lane-ledger'
|
|
2
|
+
import { lane_stats, type StatsWindow } from './lane-stats'
|
|
3
|
+
|
|
4
|
+
// Why round 2 ran or was skipped: the ledger's `round-two` entries of one period reduced to one row per
|
|
5
|
+
// verdict and reason code, printed by `josh lane:stats` so the next change — to the procedure, or to
|
|
6
|
+
// what counts as an inert fix — is chosen from counts rather than impressions (joshuafolkken/kit#4064).
|
|
7
|
+
|
|
8
|
+
const COLUMNS = ['round 2', 'code', 'decisions'] as const
|
|
9
|
+
const KEY_SEPARATOR = ' '
|
|
10
|
+
// A period with no decision: the table still prints, so a reader sees zero rather than no table.
|
|
11
|
+
const NONE_ROW = ['none', 'none', '0']
|
|
12
|
+
|
|
13
|
+
function is_round_two(entry: LedgerEntry): entry is RoundTwoEntry {
|
|
14
|
+
return entry.kind === lane_ledger.KIND.ROUND_TWO
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
function counts_of(decisions: ReadonlyArray<RoundTwoEntry>): Map<string, number> {
|
|
18
|
+
const counts = new Map<string, number>()
|
|
19
|
+
|
|
20
|
+
for (const decision of decisions) {
|
|
21
|
+
const key = `${decision.verdict}${KEY_SEPARATOR}${decision.code}`
|
|
22
|
+
|
|
23
|
+
counts.set(key, (counts.get(key) ?? 0) + 1)
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
return counts
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// The most frequent pair first, so the reason worth acting on leads.
|
|
30
|
+
function rows_of(counts: ReadonlyMap<string, number>): Array<string> {
|
|
31
|
+
return [...counts]
|
|
32
|
+
.toSorted(([, left], [, right]) => right - left)
|
|
33
|
+
.map(([key, count]) => lane_stats.to_row([...key.split(KEY_SEPARATOR), String(count)]))
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// The period's table: `entries` is the whole ledger, filtered here to `window`.
|
|
37
|
+
function table(entries: ReadonlyArray<LedgerEntry>, window: StatsWindow): string {
|
|
38
|
+
const rows = rows_of(counts_of(lane_stats.in_window(entries, window).filter(is_round_two)))
|
|
39
|
+
|
|
40
|
+
return [
|
|
41
|
+
lane_stats.to_row(COLUMNS),
|
|
42
|
+
lane_stats.to_row(COLUMNS.map(() => '---')),
|
|
43
|
+
...(rows.length === 0 ? [lane_stats.to_row(NONE_ROW)] : rows),
|
|
44
|
+
].join('\n')
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
const lane_round_two_stats = { table }
|
|
48
|
+
|
|
49
|
+
export { lane_round_two_stats }
|
|
@@ -14,6 +14,10 @@ const SAMPLE_INTERVAL_MS = 60_000
|
|
|
14
14
|
// Where the ledger is and what "now" is, overridable so a test reads a fixed ledger at a fixed instant.
|
|
15
15
|
interface MeasureContext {
|
|
16
16
|
ledger_path?: string
|
|
17
|
+
// The run's event stream `lane:stats` reads parks from; absent, the repository's own.
|
|
18
|
+
events_path?: string
|
|
19
|
+
// The lane transcript directories `lane:stats` reads tool calls from; absent, this repository's lanes'.
|
|
20
|
+
transcript_directories?: ReadonlyArray<string>
|
|
17
21
|
now_ms?: number
|
|
18
22
|
}
|
|
19
23
|
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
import { agent_argv } from '#scripts/agent/agent-argv'
|
|
2
|
+
import { agent_role_profile, type AgentProvider } from '#scripts/agent/agent-role-profile'
|
|
3
|
+
import { api_auth } from '#scripts/agent/api-auth'
|
|
4
|
+
import { stamp_file } from '#scripts/josh/stamp-file'
|
|
5
|
+
import { error_text } from '#scripts/lib/error-message'
|
|
6
|
+
import { detached_launch, type AttachedLaunchResult } from '#scripts/run/detached-launch'
|
|
7
|
+
import { run_ship_review } from '#scripts/run/ship/run-ship-review'
|
|
8
|
+
import { run_ship_stage } from '#scripts/run/ship/run-ship-stage'
|
|
9
|
+
import { run_ship_stop_cause } from '#scripts/run/ship/run-ship-stop-cause'
|
|
10
|
+
import { run_ship_stop_context } from '#scripts/run/ship/run-ship-stop-context'
|
|
11
|
+
import { z } from 'zod'
|
|
12
|
+
import { lane_child_invocation, type ShipStop } from './lane-child-invocation'
|
|
13
|
+
import { lane_child_marker } from './lane-child-marker'
|
|
14
|
+
import { lane_parked } from './lane-parked'
|
|
15
|
+
import type { LaneInfo } from './lane-registry'
|
|
16
|
+
import { lane_relaunch } from './lane-relaunch'
|
|
17
|
+
|
|
18
|
+
// The actions a lane's session broker performs for the ship that asked (`lane-session-broker.ts`):
|
|
19
|
+
// starting the round-1 or round-2 reviewer, or relaunching the lane's child after a stopped ship.
|
|
20
|
+
// **A failure names its reason**: a bare `false` left every relaunch a stale supervisor refused
|
|
21
|
+
// unexplained in the ship log (joshuafolkken/kit#3974).
|
|
22
|
+
|
|
23
|
+
const BRIEF_PREFIX = 'josh-ship-review-brief-'
|
|
24
|
+
const FINDINGS_PREFIX = 'josh-ship-review-findings-'
|
|
25
|
+
const LOG_PREFIX = 'josh-ship-review-log-'
|
|
26
|
+
const ANTHROPIC_PROVIDER: AgentProvider = 'anthropic'
|
|
27
|
+
const stop_schema = z
|
|
28
|
+
.object({
|
|
29
|
+
stage: z.enum(run_ship_stage.STAGE),
|
|
30
|
+
title: z.string(),
|
|
31
|
+
flags: z.array(z.string()).readonly(),
|
|
32
|
+
is_review: z.boolean(),
|
|
33
|
+
conflicts: z.array(z.string()).readonly().default([]),
|
|
34
|
+
cause: z.enum(run_ship_stop_cause.CAUSE).exactOptional(),
|
|
35
|
+
is_review_stale: z.boolean().exactOptional(),
|
|
36
|
+
context: run_ship_stop_context.stop_context_schema.exactOptional(),
|
|
37
|
+
})
|
|
38
|
+
.strict()
|
|
39
|
+
const action_schema = z.discriminatedUnion('kind', [
|
|
40
|
+
z.object({ kind: z.literal('review'), round: z.enum(['1', '2']) }).strict(),
|
|
41
|
+
z.object({ kind: z.literal('relaunch'), stop: stop_schema }).strict(),
|
|
42
|
+
])
|
|
43
|
+
type ReviewRound = Extract<z.infer<typeof action_schema>, { kind: 'review' }>['round']
|
|
44
|
+
type BrokerAction = { kind: 'review'; round: ReviewRound } | { kind: 'relaunch'; stop: ShipStop }
|
|
45
|
+
type BrokerAnswer = { is_success: true } | { is_success: false; reason: string }
|
|
46
|
+
|
|
47
|
+
const SUCCESS: BrokerAnswer = { is_success: true }
|
|
48
|
+
|
|
49
|
+
function failure(reason: string): BrokerAnswer {
|
|
50
|
+
return { is_success: false, reason }
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
function review_paths(directory: string): { brief: string; findings: string; log: string } {
|
|
54
|
+
return {
|
|
55
|
+
brief: stamp_file.stamp_path(BRIEF_PREFIX, directory, '.md'),
|
|
56
|
+
findings: stamp_file.stamp_path(FINDINGS_PREFIX, directory, '.txt'),
|
|
57
|
+
log: stamp_file.stamp_path(LOG_PREFIX, directory, '.log'),
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// The reviewer runs on the lane's own provider, so a Claude lane's server never starts a Codex reviewer
|
|
62
|
+
// and an OpenAI lane's never starts a Claude one.
|
|
63
|
+
function provider_of(lane: LaneInfo): AgentProvider {
|
|
64
|
+
return lane.profile?.provider ?? ANTHROPIC_PROVIDER
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// **The reviewer carries the lane's mark explicitly**: the supervisor serving a Claude lane is no lane child,
|
|
68
|
+
// so a reviewer inheriting its environment would descend from the carry record's owner unmarked and be
|
|
69
|
+
// read as the `backlogrun` parent by every hook. **Its prompt ends with the review invocation**, so the
|
|
70
|
+
// lane's liveness read and the park's reap find it as they find the child (joshuafolkken/kit#3878).
|
|
71
|
+
|
|
72
|
+
function review_prompt(lane: LaneInfo, round: ReviewRound): string {
|
|
73
|
+
const target = review_paths(lane.directory)
|
|
74
|
+
const prompt_of =
|
|
75
|
+
round === '1' ? run_ship_review.reviewer_prompt : run_ship_review.verification_prompt
|
|
76
|
+
const tail = lane_child_invocation.review_invocation(lane.issue)
|
|
77
|
+
|
|
78
|
+
return `${prompt_of(target.brief, target.findings, lane.issue)} This is ${tail}`
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// **A reviewer that could not authenticate names it** with `api_auth.AUTH_FAILURE_NOTE`, read off its
|
|
82
|
+
// log's exit record, so the ship stop is not booked as a review finding (joshuafolkken/kit#4216).
|
|
83
|
+
function exited_answer(exit_code: number | null, log_path: string): BrokerAnswer {
|
|
84
|
+
const exited = `the reviewer exited with code ${String(exit_code)}`
|
|
85
|
+
|
|
86
|
+
if (!api_auth.is_auth_failed_transcript(stamp_file.read_stamp_text(log_path))) {
|
|
87
|
+
return failure(exited)
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
return failure(`${api_auth.AUTH_FAILURE_NOTE}: ${exited}`)
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
function reviewer_answer(result: AttachedLaunchResult, log_path: string): BrokerAnswer {
|
|
94
|
+
if (result.kind === 'failed') return failure(`the reviewer could not start: ${result.note}`)
|
|
95
|
+
|
|
96
|
+
return result.exit_code === 0 ? SUCCESS : exited_answer(result.exit_code, log_path)
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
async function launch_review(lane: LaneInfo, round: ReviewRound): Promise<BrokerAnswer> {
|
|
100
|
+
const target = review_paths(lane.directory)
|
|
101
|
+
const built = agent_argv.review_in(review_prompt(lane, round), Number(round), lane.directory)
|
|
102
|
+
if (built.kind === 'rejected') return failure(`the reviewer profile was rejected: ${built.note}`)
|
|
103
|
+
|
|
104
|
+
if (built.profile.provider !== provider_of(lane)) {
|
|
105
|
+
return failure(`the reviewer resolved to ${built.profile.provider}, not the lane's provider`)
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
console.error(agent_role_profile.describe_review(Number(round), built.profile))
|
|
109
|
+
const result = await detached_launch.launch_attached(
|
|
110
|
+
{
|
|
111
|
+
argv: built.argv,
|
|
112
|
+
cwd: lane.directory,
|
|
113
|
+
log_path: target.log,
|
|
114
|
+
profile: built.profile,
|
|
115
|
+
env: lane_child_marker.env_for(lane.issue),
|
|
116
|
+
},
|
|
117
|
+
console.error,
|
|
118
|
+
)
|
|
119
|
+
|
|
120
|
+
return reviewer_answer(result, target.log)
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
// An OpenAI lane's successor is its supervisor's to start, never a relaunch's.
|
|
124
|
+
function relaunch(lane: LaneInfo, stop: ShipStop): BrokerAnswer {
|
|
125
|
+
if (lane_relaunch.is_openai_lane(lane)) {
|
|
126
|
+
return failure('an OpenAI lane is relaunched by its own supervisor')
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
const invocation = lane_child_invocation.ship_stop_invocation(lane.issue, stop)
|
|
130
|
+
const phase = agent_role_profile.IMPLEMENTATION_PHASE
|
|
131
|
+
const result = lane_relaunch.relaunch(lane, invocation, phase, console.error)
|
|
132
|
+
|
|
133
|
+
return result.kind === 'launched'
|
|
134
|
+
? SUCCESS
|
|
135
|
+
: failure(`the relaunch did not start: ${result.note}`)
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
// **A parked issue gets no session**: a request can be read long after it was written, so the park is
|
|
139
|
+
// read when the action runs, never when it was asked for (joshuafolkken/kit#3878).
|
|
140
|
+
async function perform(lane: LaneInfo, action: BrokerAction): Promise<BrokerAnswer> {
|
|
141
|
+
if (await lane_parked.is_parked(lane.issue)) return failure('the issue is parked')
|
|
142
|
+
|
|
143
|
+
if (action.kind === 'relaunch') return relaunch(lane, action.stop)
|
|
144
|
+
|
|
145
|
+
return await launch_review(lane, action.round)
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
// What the server answers: a thrown action is a failure naming its error, never a dead server.
|
|
149
|
+
async function answer(lane: LaneInfo, action: BrokerAction): Promise<BrokerAnswer> {
|
|
150
|
+
try {
|
|
151
|
+
return await perform(lane, action)
|
|
152
|
+
} catch (error) {
|
|
153
|
+
return failure(`the broker failed: ${error_text.message_of(error)}`)
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
const lane_session_action = { SUCCESS, action_schema, answer, failure, review_paths }
|
|
158
|
+
|
|
159
|
+
export type { BrokerAction, BrokerAnswer, ReviewRound }
|
|
160
|
+
export { lane_session_action }
|