@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,23 +1,18 @@
|
|
|
1
1
|
import { randomUUID } from 'node:crypto'
|
|
2
|
-
import { mkdirSync, readFileSync,
|
|
2
|
+
import { mkdirSync, readFileSync, rmSync, unlinkSync } from 'node:fs'
|
|
3
3
|
import path from 'node:path'
|
|
4
4
|
import { setTimeout as sleep } from 'node:timers/promises'
|
|
5
|
-
import { agent_argv } from '#scripts/agent/agent-argv'
|
|
6
|
-
import { agent_role_profile, type AgentProvider } from '#scripts/agent/agent-role-profile'
|
|
7
5
|
import { git_common_directory } from '#scripts/git/git-common-directory'
|
|
6
|
+
import { issue_cite } from '#scripts/issue/issue-cite'
|
|
8
7
|
import { stamp_file } from '#scripts/josh/stamp-file'
|
|
9
|
-
import {
|
|
8
|
+
import { atomic_write } from '#scripts/lib/atomic-write'
|
|
10
9
|
import { json_value } from '#scripts/lib/json-value'
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import { run_ship_stage } from '#scripts/run/ship/run-ship-stage'
|
|
10
|
+
import { run_event_stream } from '#scripts/run/event/run-event-stream'
|
|
11
|
+
import { run_event_stream_emit } from '#scripts/run/event/run-event-stream-emit'
|
|
14
12
|
import { z } from 'zod'
|
|
15
13
|
import { lane_broker_server, type BrokerServer } from './lane-broker-server'
|
|
16
|
-
import { lane_child_invocation, type ShipStop } from './lane-child-invocation'
|
|
17
|
-
import { lane_child_marker } from './lane-child-marker'
|
|
18
|
-
import { lane_parked } from './lane-parked'
|
|
19
14
|
import type { LaneInfo } from './lane-registry'
|
|
20
|
-
import {
|
|
15
|
+
import { lane_session_action, type BrokerAction, type BrokerAnswer } from './lane-session-action'
|
|
21
16
|
|
|
22
17
|
// The sessions a lane child's detached `josh ship` cannot start itself, started for it by a process
|
|
23
18
|
// that can: the round-1 and round-2 reviewer, and the fresh child a stopped ship hands back to. An
|
|
@@ -25,13 +20,11 @@ import { lane_relaunch } from './lane-relaunch'
|
|
|
25
20
|
// Claude lane is served by the `run:wake` supervisor (`claude-lane-broker.ts`), because Claude Code removes its
|
|
26
21
|
// token from what its Bash tool starts, so a token-only credential never reaches the ship the child
|
|
27
22
|
// launched (joshuafolkken/kit#3817). **The request names an action, never a command**: the server
|
|
28
|
-
// rebuilds the argv from the registered lane, so a child can ask for nothing but these two sessions
|
|
23
|
+
// rebuilds the argv from the registered lane, so a child can ask for nothing but these two sessions
|
|
24
|
+
// (`lane-session-action.ts`).
|
|
29
25
|
|
|
30
26
|
const REQUEST_PREFIX = '.josh-review-request-'
|
|
31
27
|
const RESPONSE_PREFIX = '.josh-review-response-'
|
|
32
|
-
const BRIEF_PREFIX = 'josh-ship-review-brief-'
|
|
33
|
-
const FINDINGS_PREFIX = 'josh-ship-review-findings-'
|
|
34
|
-
const LOG_PREFIX = 'josh-ship-review-log-'
|
|
35
28
|
const CACHE_DIRECTORY = ['node_modules', '.cache']
|
|
36
29
|
const POLL_MS = 100
|
|
37
30
|
// The heartbeat is kept for a ship branched before the server record, and read only where a
|
|
@@ -39,25 +32,23 @@ const POLL_MS = 100
|
|
|
39
32
|
const LEGACY_HEARTBEAT_MS = 500
|
|
40
33
|
const LEGACY_HEARTBEAT_LIMIT_MS = 3000
|
|
41
34
|
const MINUTE_MS = 60_000
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
const
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
title: z.string(),
|
|
49
|
-
flags: z.array(z.string()).readonly(),
|
|
50
|
-
is_review: z.boolean(),
|
|
51
|
-
conflicts: z.array(z.string()).readonly().default([]),
|
|
52
|
-
})
|
|
53
|
-
.strict()
|
|
54
|
-
const action_schema = z.discriminatedUnion('kind', [
|
|
55
|
-
z.object({ kind: z.literal('review'), round: z.enum(['1', '2']) }).strict(),
|
|
56
|
-
z.object({ kind: z.literal('relaunch'), stop: stop_schema }).strict(),
|
|
57
|
-
])
|
|
35
|
+
// **A relaunch is answered once the session has started, a review once it has finished**: waiting out a
|
|
36
|
+
// review's limit on a relaunch left the stopped lane idle for half an hour (joshuafolkken/kit#4344).
|
|
37
|
+
const REQUEST_LIMIT_MINUTES: Readonly<Record<BrokerAction['kind'], number>> = {
|
|
38
|
+
review: 30,
|
|
39
|
+
relaunch: 2,
|
|
40
|
+
}
|
|
58
41
|
const request_schema = z
|
|
59
|
-
.object({ session: z.uuid(), nonce: z.uuid(), action: action_schema })
|
|
42
|
+
.object({ session: z.uuid(), nonce: z.uuid(), action: lane_session_action.action_schema })
|
|
60
43
|
.strict()
|
|
44
|
+
// **A request this broker cannot read is still answered**: the supervisor reloads on new code only at
|
|
45
|
+
// its next pass boundary (`run-wake-code.ts`), so until then a lane's ship can run a newer main than
|
|
46
|
+
// the broker's, and a field the ship added made the request unreadable and
|
|
47
|
+
// the ship waited out the whole limit on a server that had dropped it (joshuafolkken/kit#4230).
|
|
48
|
+
// **The reason names the fields the schema refused**: a guess at the supervisor's age hid a field the
|
|
49
|
+
// broker's schema had never learned even on one main (joshuafolkken/kit#4489).
|
|
50
|
+
const envelope_schema = z.looseObject({ session: z.uuid(), nonce: z.uuid() })
|
|
51
|
+
const UNREADABLE_REASON = 'the broker could not read the request'
|
|
61
52
|
const response_schema = z
|
|
62
53
|
.object({
|
|
63
54
|
session: z.uuid(),
|
|
@@ -66,18 +57,13 @@ const response_schema = z
|
|
|
66
57
|
heartbeat_at: z.number().int().positive(),
|
|
67
58
|
})
|
|
68
59
|
.strict()
|
|
69
|
-
|
|
60
|
+
// **A failure's reason sits beside the response, never in it**: a ship branched before the reason parses
|
|
61
|
+
// the response strictly, so a new field would read as no server (joshuafolkken/kit#3974).
|
|
62
|
+
const reason_schema = z.object({ nonce: z.string(), reason: z.string() }).strict()
|
|
63
|
+
type BrokerEnvelope = z.infer<typeof envelope_schema>
|
|
70
64
|
type BrokerResponse = z.infer<typeof response_schema>
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
function review_paths(directory: string): { brief: string; findings: string; log: string } {
|
|
75
|
-
return {
|
|
76
|
-
brief: stamp_file.stamp_path(BRIEF_PREFIX, directory, '.md'),
|
|
77
|
-
findings: stamp_file.stamp_path(FINDINGS_PREFIX, directory, '.txt'),
|
|
78
|
-
log: stamp_file.stamp_path(LOG_PREFIX, directory, '.log'),
|
|
79
|
-
}
|
|
80
|
-
}
|
|
65
|
+
|
|
66
|
+
const { failure } = lane_session_action
|
|
81
67
|
|
|
82
68
|
function request_path(directory: string, issue: string): string {
|
|
83
69
|
return path.join(directory, ...CACHE_DIRECTORY, `${REQUEST_PREFIX}${issue}.json`)
|
|
@@ -90,6 +76,10 @@ function response_path(directory: string, issue: string): string | undefined {
|
|
|
90
76
|
return path.join(path.dirname(common), ...CACHE_DIRECTORY, `${RESPONSE_PREFIX}${issue}.json`)
|
|
91
77
|
}
|
|
92
78
|
|
|
79
|
+
function reason_path(response: string): string {
|
|
80
|
+
return `${response}.reason`
|
|
81
|
+
}
|
|
82
|
+
|
|
93
83
|
function read_record<T>(target: string, schema: z.ZodType<T>): T | undefined {
|
|
94
84
|
try {
|
|
95
85
|
return json_value.parse_with(readFileSync(target, 'utf8'), schema)
|
|
@@ -98,102 +88,62 @@ function read_record<T>(target: string, schema: z.ZodType<T>): T | undefined {
|
|
|
98
88
|
}
|
|
99
89
|
}
|
|
100
90
|
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
function provider_of(lane: LaneInfo): AgentProvider {
|
|
104
|
-
return lane.profile?.provider ?? ANTHROPIC_PROVIDER
|
|
91
|
+
function write_record(target: string, body: BrokerResponse | z.infer<typeof reason_schema>): void {
|
|
92
|
+
atomic_write.replace_file(target, JSON.stringify(body))
|
|
105
93
|
}
|
|
106
94
|
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
// read as the `backlogrun` parent by every hook. **Its prompt ends with the review invocation**, so the
|
|
110
|
-
// lane's liveness read and the park's reap find it as they find the child (joshuafolkken/kit#3878).
|
|
95
|
+
function refused_field(issue: z.core.$ZodIssue): ReadonlyArray<string> {
|
|
96
|
+
const at = issue.path.map(String)
|
|
111
97
|
|
|
112
|
-
|
|
113
|
-
const target = review_paths(lane.directory)
|
|
114
|
-
const prompt_of =
|
|
115
|
-
round === '1' ? run_ship_review.reviewer_prompt : run_ship_review.verification_prompt
|
|
116
|
-
const tail = lane_child_invocation.review_invocation(lane.issue)
|
|
117
|
-
|
|
118
|
-
return `${prompt_of(target.brief, target.findings, lane.issue)} This is ${tail}`
|
|
119
|
-
}
|
|
98
|
+
if (issue.code !== 'unrecognized_keys') return [`${at.join('.')}: ${issue.message}`]
|
|
120
99
|
|
|
121
|
-
|
|
122
|
-
const target = review_paths(lane.directory)
|
|
123
|
-
const built = agent_argv.resolve_in(
|
|
124
|
-
review_prompt(lane, round),
|
|
125
|
-
agent_role_profile.REVIEWER,
|
|
126
|
-
lane.directory,
|
|
127
|
-
)
|
|
128
|
-
if (built.kind === 'rejected' || built.profile.provider !== provider_of(lane)) return false
|
|
129
|
-
|
|
130
|
-
const result = await detached_launch.launch_attached(
|
|
131
|
-
{
|
|
132
|
-
argv: built.argv,
|
|
133
|
-
cwd: lane.directory,
|
|
134
|
-
log_path: target.log,
|
|
135
|
-
profile: built.profile,
|
|
136
|
-
env: lane_child_marker.env_for(lane.issue),
|
|
137
|
-
},
|
|
138
|
-
console.error,
|
|
139
|
-
)
|
|
140
|
-
|
|
141
|
-
return result.kind === 'completed' && result.exit_code === 0
|
|
100
|
+
return issue.keys.map((key) => `unrecognized key: ${[...at, key].join('.')}`)
|
|
142
101
|
}
|
|
143
102
|
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
if (lane_relaunch.is_openai_lane(lane)) return false
|
|
103
|
+
function unreadable(error: z.ZodError): BrokerAnswer {
|
|
104
|
+
const fields = error.issues.flatMap((issue) => refused_field(issue))
|
|
147
105
|
|
|
148
|
-
|
|
149
|
-
const phase = agent_role_profile.IMPLEMENTATION_PHASE
|
|
150
|
-
const result = lane_relaunch.relaunch(lane, invocation, phase, console.error)
|
|
151
|
-
|
|
152
|
-
return result.kind === 'launched'
|
|
106
|
+
return failure(`${UNREADABLE_REASON} — ${fields.join('; ')}`)
|
|
153
107
|
}
|
|
154
108
|
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
async function perform(lane: LaneInfo, action: BrokerAction): Promise<boolean> {
|
|
158
|
-
if (await lane_parked.is_parked(lane.issue)) return false
|
|
159
|
-
|
|
160
|
-
if (action.kind === 'relaunch') return relaunch(lane, action.stop)
|
|
109
|
+
async function answer_request(lane: LaneInfo, received: BrokerEnvelope): Promise<BrokerAnswer> {
|
|
110
|
+
const parsed = request_schema.safeParse(received)
|
|
161
111
|
|
|
162
|
-
return
|
|
112
|
+
return parsed.success
|
|
113
|
+
? await lane_session_action.answer(lane, parsed.data.action)
|
|
114
|
+
: unreadable(parsed.error)
|
|
163
115
|
}
|
|
164
116
|
|
|
165
|
-
|
|
166
|
-
|
|
117
|
+
// The requests this process's servers are answering now — what the supervisor's reload waits out
|
|
118
|
+
// (`run-wake-cli.ts`), since closing a server mid-review fails that review.
|
|
119
|
+
const answering = { count: 0 }
|
|
167
120
|
|
|
168
|
-
|
|
169
|
-
|
|
121
|
+
function is_answering(): boolean {
|
|
122
|
+
return answering.count > 0
|
|
170
123
|
}
|
|
171
124
|
|
|
172
|
-
async function
|
|
173
|
-
|
|
174
|
-
return await perform(lane, action)
|
|
175
|
-
} catch (error) {
|
|
176
|
-
error_text.trace_swallowed('lane_session_broker.launched', error)
|
|
125
|
+
async function answer_counted(lane: LaneInfo, received: BrokerEnvelope): Promise<BrokerAnswer> {
|
|
126
|
+
answering.count += 1
|
|
177
127
|
|
|
178
|
-
|
|
128
|
+
try {
|
|
129
|
+
return await answer_request(lane, received)
|
|
130
|
+
} finally {
|
|
131
|
+
answering.count -= 1
|
|
179
132
|
}
|
|
180
133
|
}
|
|
181
134
|
|
|
182
135
|
async function process_request(
|
|
183
136
|
lane: LaneInfo,
|
|
184
137
|
response: string,
|
|
185
|
-
received:
|
|
138
|
+
received: BrokerEnvelope,
|
|
186
139
|
state: { current: BrokerResponse },
|
|
187
140
|
): Promise<void> {
|
|
188
|
-
const
|
|
141
|
+
const answer = await answer_counted(lane, received)
|
|
142
|
+
const { session, nonce } = received
|
|
189
143
|
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
is_success,
|
|
194
|
-
heartbeat_at: Date.now(),
|
|
195
|
-
}
|
|
196
|
-
write_response(response, state.current)
|
|
144
|
+
if (!answer.is_success) write_record(reason_path(response), { nonce, reason: answer.reason })
|
|
145
|
+
state.current = { session, nonce, is_success: answer.is_success, heartbeat_at: Date.now() }
|
|
146
|
+
write_record(response, state.current)
|
|
197
147
|
}
|
|
198
148
|
|
|
199
149
|
async function serve(
|
|
@@ -206,7 +156,7 @@ async function serve(
|
|
|
206
156
|
const target = request_path(lane.directory, lane.issue)
|
|
207
157
|
|
|
208
158
|
while (state.is_running) {
|
|
209
|
-
const received = read_record(target,
|
|
159
|
+
const received = read_record(target, envelope_schema)
|
|
210
160
|
|
|
211
161
|
if (received?.session === session && received.nonce !== last_nonce) {
|
|
212
162
|
last_nonce = received.nonce
|
|
@@ -236,7 +186,7 @@ function prepare(lane: LaneInfo): { response: string; current: BrokerResponse }
|
|
|
236
186
|
heartbeat_at: Date.now(),
|
|
237
187
|
}
|
|
238
188
|
|
|
239
|
-
|
|
189
|
+
write_record(response, current)
|
|
240
190
|
|
|
241
191
|
return { response, current }
|
|
242
192
|
}
|
|
@@ -244,7 +194,7 @@ function prepare(lane: LaneInfo): { response: string; current: BrokerResponse }
|
|
|
244
194
|
function start_heartbeat(state: { current: BrokerResponse }, response: string): NodeJS.Timeout {
|
|
245
195
|
const heartbeat = setInterval(() => {
|
|
246
196
|
state.current = { ...state.current, heartbeat_at: Date.now() }
|
|
247
|
-
|
|
197
|
+
write_record(response, state.current)
|
|
248
198
|
}, LEGACY_HEARTBEAT_MS)
|
|
249
199
|
|
|
250
200
|
heartbeat.unref()
|
|
@@ -264,6 +214,7 @@ async function stop_server(
|
|
|
264
214
|
await serving
|
|
265
215
|
clearInterval(heartbeat)
|
|
266
216
|
unlinkSync(response)
|
|
217
|
+
rmSync(reason_path(response), { force: true })
|
|
267
218
|
lane_broker_server.remove(response)
|
|
268
219
|
}
|
|
269
220
|
|
|
@@ -306,31 +257,49 @@ function session_response(target: string, session: string): BrokerResponse | und
|
|
|
306
257
|
return response?.session === session ? response : undefined
|
|
307
258
|
}
|
|
308
259
|
|
|
260
|
+
// A failure from a server that predates the reason leaves none.
|
|
261
|
+
function answer_of(target: string, response: BrokerResponse): BrokerAnswer {
|
|
262
|
+
if (response.is_success) return lane_session_action.SUCCESS
|
|
263
|
+
|
|
264
|
+
const record = read_record(reason_path(target), reason_schema)
|
|
265
|
+
const reason = record?.nonce === response.nonce ? record.reason : 'it gave no reason'
|
|
266
|
+
|
|
267
|
+
return failure(`the broker answered a failure: ${reason}`)
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
// The server's answer to this request, or `undefined` while it is still being served.
|
|
309
271
|
function response_verdict(
|
|
310
272
|
target: string,
|
|
311
273
|
session: string,
|
|
312
274
|
nonce: string,
|
|
313
|
-
):
|
|
275
|
+
): BrokerAnswer | undefined {
|
|
314
276
|
const response = session_response(target, session)
|
|
315
277
|
|
|
316
|
-
if (!is_live_response(target, response, lane_broker_server.is_running))
|
|
317
|
-
|
|
278
|
+
if (!is_live_response(target, response, lane_broker_server.is_running)) {
|
|
279
|
+
return failure('the broker stopped serving before it answered')
|
|
280
|
+
}
|
|
318
281
|
|
|
319
|
-
return response.
|
|
282
|
+
return response.nonce === nonce ? answer_of(target, response) : undefined
|
|
320
283
|
}
|
|
321
284
|
|
|
322
|
-
async function wait_response(
|
|
323
|
-
|
|
285
|
+
async function wait_response(
|
|
286
|
+
target: string,
|
|
287
|
+
session: string,
|
|
288
|
+
nonce: string,
|
|
289
|
+
kind: BrokerAction['kind'],
|
|
290
|
+
): Promise<BrokerAnswer> {
|
|
291
|
+
const limit_minutes = REQUEST_LIMIT_MINUTES[kind]
|
|
292
|
+
const deadline = Date.now() + limit_minutes * MINUTE_MS
|
|
324
293
|
|
|
325
294
|
while (Date.now() < deadline) {
|
|
326
295
|
const verdict = response_verdict(target, session, nonce)
|
|
327
|
-
if (verdict !==
|
|
296
|
+
if (verdict !== undefined) return verdict
|
|
328
297
|
|
|
329
298
|
// eslint-disable-next-line no-await-in-loop -- polling: each read waits on the state the previous one saw
|
|
330
299
|
await sleep(POLL_MS)
|
|
331
300
|
}
|
|
332
301
|
|
|
333
|
-
return
|
|
302
|
+
return failure(`the broker gave no answer within ${String(limit_minutes)} minutes`)
|
|
334
303
|
}
|
|
335
304
|
|
|
336
305
|
function live_response(target: string): BrokerResponse | undefined {
|
|
@@ -341,12 +310,18 @@ function live_response(target: string): BrokerResponse | undefined {
|
|
|
341
310
|
: undefined
|
|
342
311
|
}
|
|
343
312
|
|
|
313
|
+
// The session of the server answering for this lane now, or `undefined` while none does. A new session
|
|
314
|
+
// means the server that held the lane before has ended.
|
|
315
|
+
function serving_session(directory: string, issue: string): string | undefined {
|
|
316
|
+
const target = response_path(directory, issue)
|
|
317
|
+
|
|
318
|
+
return target === undefined ? undefined : live_response(target)?.session
|
|
319
|
+
}
|
|
320
|
+
|
|
344
321
|
// Whether a server answers for this lane now — what a Claude lane's ship asks before it hands a session
|
|
345
322
|
// over rather than starting the session itself.
|
|
346
323
|
function is_serving(directory: string, issue: string): boolean {
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
return target !== undefined && live_response(target) !== undefined
|
|
324
|
+
return serving_session(directory, issue) !== undefined
|
|
350
325
|
}
|
|
351
326
|
|
|
352
327
|
// **A request nobody waits for any more is taken back**: a server busy with an earlier request reads the
|
|
@@ -356,32 +331,57 @@ function withdraw(pending: string, nonce: string): void {
|
|
|
356
331
|
if (read_record(pending, request_schema)?.nonce === nonce) stamp_file.remove_stamp(pending)
|
|
357
332
|
}
|
|
358
333
|
|
|
359
|
-
|
|
334
|
+
// A failure is put on the run's stream as well as the ship's output, so a broker that cannot serve the
|
|
335
|
+
// lane is seen from `run:board` rather than only from the ship log (joshuafolkken/kit#4230).
|
|
336
|
+
async function record_failure(issue: string, answer: BrokerAnswer): Promise<void> {
|
|
337
|
+
if (answer.is_success) return
|
|
338
|
+
|
|
339
|
+
const text = `${issue_cite.plain(issue)} lane broker: ${answer.reason}`
|
|
340
|
+
|
|
341
|
+
await run_event_stream_emit.emit(run_event_stream.EVENT_KIND.NOTE, text)
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
async function send(directory: string, issue: string, action: BrokerAction): Promise<BrokerAnswer> {
|
|
360
345
|
const target = response_path(directory, issue)
|
|
361
346
|
const response = target === undefined ? undefined : live_response(target)
|
|
362
347
|
|
|
363
|
-
if (target === undefined || response === undefined) return
|
|
348
|
+
if (target === undefined || response === undefined) return failure('no broker serves this lane')
|
|
364
349
|
|
|
365
350
|
const nonce = randomUUID()
|
|
366
351
|
const body = { session: response.session, nonce, action }
|
|
367
352
|
const pending = request_path(directory, issue)
|
|
368
353
|
|
|
369
354
|
stamp_file.replace_stamp(pending, body)
|
|
370
|
-
const
|
|
355
|
+
const answer = await wait_response(target, response.session, nonce, action.kind)
|
|
371
356
|
|
|
372
357
|
withdraw(pending, nonce)
|
|
373
358
|
|
|
374
|
-
return
|
|
359
|
+
return answer
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
async function request(
|
|
363
|
+
directory: string,
|
|
364
|
+
issue: string,
|
|
365
|
+
action: BrokerAction,
|
|
366
|
+
): Promise<BrokerAnswer> {
|
|
367
|
+
const answer = await send(directory, issue, action)
|
|
368
|
+
|
|
369
|
+
await record_failure(issue, answer)
|
|
370
|
+
|
|
371
|
+
return answer
|
|
375
372
|
}
|
|
376
373
|
|
|
377
374
|
const lane_session_broker = {
|
|
375
|
+
is_answering,
|
|
378
376
|
is_serving,
|
|
379
377
|
request,
|
|
380
378
|
request_path,
|
|
381
379
|
response_path,
|
|
382
|
-
review_paths,
|
|
380
|
+
review_paths: lane_session_action.review_paths,
|
|
381
|
+
serving_session,
|
|
383
382
|
with_server,
|
|
384
383
|
}
|
|
385
384
|
|
|
386
|
-
export type { BrokerAction, ReviewRound }
|
|
387
385
|
export { lane_session_broker }
|
|
386
|
+
|
|
387
|
+
export { type ReviewRound, type BrokerAction, type BrokerAnswer } from './lane-session-action'
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import {
|
|
2
|
+
PROCESS_ALIVE,
|
|
3
|
+
PROCESS_NONE,
|
|
4
|
+
PROCESS_UNKNOWN,
|
|
5
|
+
type ProcessTrace,
|
|
6
|
+
} from '#scripts/run/run-liveness'
|
|
7
|
+
import { lane_child_invocation } from './lane-child-invocation'
|
|
8
|
+
import { lane_handoff } from './lane-handoff'
|
|
9
|
+
import { lane_process_table, type ProcessTable, type TableRead } from './lane-process-table'
|
|
10
|
+
import type { TreeProbes } from './lane-reap'
|
|
11
|
+
|
|
12
|
+
// `lane_await.process_trace_default` answered for many lanes from one process snapshot
|
|
13
|
+
// (joshuafolkken/kit#4245). That probe starts a synchronous `pgrep` per lane and reads the ship record's
|
|
14
|
+
// start time through another `ps`, so a reader asking about every lane each few seconds — `run:board`,
|
|
15
|
+
// the backlogrun drive — blocked its event loop for as long as the lanes took between them.
|
|
16
|
+
//
|
|
17
|
+
// **The answers are the probe's own.** A command line matching the lane's pattern, or a detached ship
|
|
18
|
+
// still running for it, is `alive`; a snapshot that matched neither is `none`; a snapshot that could not
|
|
19
|
+
// be read is `unknown`, as an unanswered `pgrep` is. The ship record is read only for a lane no process
|
|
20
|
+
// matched, which is the only lane its answer can change.
|
|
21
|
+
|
|
22
|
+
type TraceRead = (issue: string) => ProcessTrace
|
|
23
|
+
|
|
24
|
+
function is_matched(probes: TreeProbes, issue: string): boolean {
|
|
25
|
+
return probes.matching(lane_child_invocation.process_pattern(issue)).length > 0
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/** Each of `issues` traced from `rows`, the snapshot `undefined` where it could not be read. */
|
|
29
|
+
async function traces_of(
|
|
30
|
+
issues: ReadonlyArray<string>,
|
|
31
|
+
rows: ProcessTable | undefined,
|
|
32
|
+
): Promise<TraceRead> {
|
|
33
|
+
if (rows === undefined) return () => PROCESS_UNKNOWN
|
|
34
|
+
|
|
35
|
+
const probes = lane_process_table.probes_of(rows)
|
|
36
|
+
const unmatched = issues.filter((issue) => !is_matched(probes, issue))
|
|
37
|
+
const is_shipping =
|
|
38
|
+
unmatched.length === 0
|
|
39
|
+
? (): boolean => false
|
|
40
|
+
: await lane_handoff.ship_reader(lane_process_table.start_reader(rows))
|
|
41
|
+
const idle = new Set(unmatched.filter((issue) => !is_shipping(issue)))
|
|
42
|
+
|
|
43
|
+
return (issue) => (idle.has(issue) ? PROCESS_NONE : PROCESS_ALIVE)
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
function never_merge_waiting(): boolean {
|
|
47
|
+
return false
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Whether each of `issues` has a detached ship waiting on its merge (`lane_handoff.merge_wait_reader`),
|
|
52
|
+
* read from `rows`. The record is read only where the snapshot shows that lane's ship supervisor, so a
|
|
53
|
+
* count with no ship running starts no process (joshuafolkken/kit#4466).
|
|
54
|
+
*/
|
|
55
|
+
async function merge_waits_of(
|
|
56
|
+
issues: ReadonlyArray<string>,
|
|
57
|
+
rows: ProcessTable | undefined,
|
|
58
|
+
): Promise<(issue: string) => boolean> {
|
|
59
|
+
if (rows === undefined) return never_merge_waiting
|
|
60
|
+
|
|
61
|
+
const probes = lane_process_table.probes_of(rows)
|
|
62
|
+
const shipping = issues.filter(
|
|
63
|
+
(issue) => probes.matching(lane_child_invocation.ship_pattern(issue)).length > 0,
|
|
64
|
+
)
|
|
65
|
+
|
|
66
|
+
if (shipping.length === 0) return never_merge_waiting
|
|
67
|
+
|
|
68
|
+
return await lane_handoff.merge_wait_reader(lane_process_table.start_reader(rows))
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/** How many of `issues` have a detached ship in this checkout waiting on its merge, from a fresh snapshot. */
|
|
72
|
+
async function count_merge_waiting(
|
|
73
|
+
issues: ReadonlyArray<string>,
|
|
74
|
+
table: TableRead = lane_process_table.read_table,
|
|
75
|
+
): Promise<number> {
|
|
76
|
+
const is_waiting = await merge_waits_of(issues, await table())
|
|
77
|
+
|
|
78
|
+
return issues.filter((issue) => is_waiting(issue)).length
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
const lane_snapshot_trace = { count_merge_waiting, merge_waits_of, traces_of }
|
|
82
|
+
|
|
83
|
+
export { lane_snapshot_trace }
|
|
84
|
+
export type { TraceRead }
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
// The spans an issue's starts open and its ends close, shared by `josh lane:stats`' gaps
|
|
2
|
+
// (`lane-gap-stats.ts`) and `run:board`'s in-lane time (`run-board-lane-time.ts`)
|
|
3
|
+
// (joshuafolkken/kit#4463).
|
|
4
|
+
|
|
5
|
+
// One instant an issue's wait can end at. `issue` is absent on a stage whose writer held none.
|
|
6
|
+
interface IssueAt {
|
|
7
|
+
issue: number | undefined
|
|
8
|
+
at_ms: number
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
interface IssuePair {
|
|
12
|
+
starts: ReadonlyArray<IssueAt>
|
|
13
|
+
bounds: ReadonlyArray<IssueAt>
|
|
14
|
+
ends: ReadonlyArray<IssueAt>
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
interface Span {
|
|
18
|
+
from_ms: number
|
|
19
|
+
end_ms: number | undefined
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
// The issue's next start of any kind closes the window: an end after it belongs to that later start,
|
|
23
|
+
// so a start never ended stays not ended rather than borrowing a later run's end.
|
|
24
|
+
function next_start_ms(
|
|
25
|
+
starts: ReadonlyArray<IssueAt>,
|
|
26
|
+
issue: number | undefined,
|
|
27
|
+
from_ms: number,
|
|
28
|
+
): number {
|
|
29
|
+
const later = starts.filter((other) => other.issue === issue && other.at_ms > from_ms)
|
|
30
|
+
|
|
31
|
+
return Math.min(...later.map((other) => other.at_ms))
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// Each start until the first end of its own issue, before that issue's next start in `bounds`.
|
|
35
|
+
function issue_spans(pair: IssuePair): Array<Span> {
|
|
36
|
+
return pair.starts.map((start) => {
|
|
37
|
+
const until_ms = next_start_ms(pair.bounds, start.issue, start.at_ms)
|
|
38
|
+
|
|
39
|
+
return {
|
|
40
|
+
from_ms: start.at_ms,
|
|
41
|
+
end_ms: pair.ends.find(
|
|
42
|
+
(end) => end.issue === start.issue && end.at_ms >= start.at_ms && end.at_ms < until_ms,
|
|
43
|
+
)?.at_ms,
|
|
44
|
+
}
|
|
45
|
+
})
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
const lane_spans = { issue_spans }
|
|
49
|
+
|
|
50
|
+
export { lane_spans }
|
|
51
|
+
export type { IssueAt, IssuePair, Span }
|
|
@@ -89,8 +89,11 @@ const LIVE_PROBES: SpentProbes = {
|
|
|
89
89
|
unpushed_commits: read_unpushed_commits,
|
|
90
90
|
}
|
|
91
91
|
|
|
92
|
+
// The one probe the in-use readings take, so a reader holding a process snapshot passes its own.
|
|
93
|
+
type TraceProbes = Pick<SpentProbes, 'process_trace'>
|
|
94
|
+
|
|
92
95
|
// A stranded lane has no work tree for a child to be in, so it is never in use.
|
|
93
|
-
function trace_of(lane: LaneInfo, probes:
|
|
96
|
+
function trace_of(lane: LaneInfo, probes: TraceProbes): ProcessTrace {
|
|
94
97
|
return lane.is_stranded ? PROCESS_NONE : probes.process_trace(lane.issue)
|
|
95
98
|
}
|
|
96
99
|
|
|
@@ -178,7 +181,7 @@ function issues_traced(traced: ReadonlyArray<TracedLane>, trace: ProcessTrace):
|
|
|
178
181
|
return traced.filter(([, answer]) => answer === trace).map(([issue]) => issue)
|
|
179
182
|
}
|
|
180
183
|
|
|
181
|
-
function traced_of(lanes: ReadonlyArray<LaneInfo>, probes:
|
|
184
|
+
function traced_of(lanes: ReadonlyArray<LaneInfo>, probes: TraceProbes): Array<TracedLane> {
|
|
182
185
|
return lanes.map((lane): TracedLane => [lane.issue, trace_of(lane, probes)])
|
|
183
186
|
}
|
|
184
187
|
|
|
@@ -195,7 +198,7 @@ async function lanes_in_use(probes: SpentProbes = LIVE_PROBES): Promise<LaneUse>
|
|
|
195
198
|
/** The lanes no child is working in, read as such — never one whose probe did not answer. */
|
|
196
199
|
function idle_lanes(
|
|
197
200
|
lanes: ReadonlyArray<LaneInfo>,
|
|
198
|
-
probes:
|
|
201
|
+
probes: TraceProbes = LIVE_PROBES,
|
|
199
202
|
): Array<string> {
|
|
200
203
|
return issues_traced(traced_of(lanes, probes), PROCESS_NONE)
|
|
201
204
|
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { MS_PER_MINUTE } from '#scripts/lib/timeouts'
|
|
1
2
|
import { run_ship_stage } from '#scripts/run/ship/run-ship-stage'
|
|
2
3
|
import { lane_ledger, type DispatchEntry, type LedgerEntry, type StageEntry } from './lane-ledger'
|
|
3
4
|
import { lane_stats, type StatsWindow } from './lane-stats'
|
|
@@ -14,9 +15,10 @@ import { lane_stats, type StatsWindow } from './lane-stats'
|
|
|
14
15
|
// dispatched, and a ship resumed after a fix cannot record the implementation twice.
|
|
15
16
|
//
|
|
16
17
|
// **`ci-wait` is `followup`'s own lap, inside the `followup` stage** — a row of its own so the wait for
|
|
17
|
-
// CI reads beside `review`, the round-one review it would overlap.
|
|
18
|
+
// CI reads beside `review`, the round-one review it would overlap. `coderabbit-wait` and
|
|
19
|
+
// `coderabbit-rate-limit` follow it: how much of `followup`'s waiting CodeRabbit was still running or
|
|
20
|
+
// rate-limited, a row recorded only by a run that saw it.
|
|
18
21
|
|
|
19
|
-
const MS_PER_MINUTE = 60_000
|
|
20
22
|
const DECIMALS = 1
|
|
21
23
|
const NOT_MEASURED = 'not measured'
|
|
22
24
|
const IMPLEMENT = 'implement'
|
|
@@ -25,6 +27,7 @@ const { STAGE } = run_ship_stage
|
|
|
25
27
|
const STAGES = [
|
|
26
28
|
IMPLEMENT,
|
|
27
29
|
STAGE.PREFLIGHT,
|
|
30
|
+
lane_ledger.PRE_DETACH_STAGE,
|
|
28
31
|
STAGE.REVIEW,
|
|
29
32
|
STAGE.SYNC,
|
|
30
33
|
STAGE.GATE,
|
|
@@ -32,6 +35,8 @@ const STAGES = [
|
|
|
32
35
|
STAGE.ROUND_TWO,
|
|
33
36
|
STAGE.FOLLOWUP,
|
|
34
37
|
lane_ledger.CI_WAIT_STAGE,
|
|
38
|
+
lane_ledger.CODERABBIT_WAIT_STAGE,
|
|
39
|
+
lane_ledger.CODERABBIT_RATE_LIMIT_STAGE,
|
|
35
40
|
STAGE.REPORT,
|
|
36
41
|
] as const
|
|
37
42
|
|