@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
|
@@ -4,8 +4,11 @@ import { git_worktree } from '#scripts/git/git-worktree'
|
|
|
4
4
|
import { error_text } from '#scripts/lib/error-message'
|
|
5
5
|
import { lane_paths } from './lane-paths'
|
|
6
6
|
import { lane_reap } from './lane-reap'
|
|
7
|
+
import { lane_reap_settle } from './lane-reap-settle'
|
|
7
8
|
import { lane_registry, type LaneInfo } from './lane-registry'
|
|
9
|
+
import { lane_residents } from './lane-residents'
|
|
8
10
|
import { lane_spent, type KeptLane } from './lane-spent'
|
|
11
|
+
import { lane_state } from './lane-state'
|
|
9
12
|
|
|
10
13
|
// Closing a lane: no work tree, no branch, no directory.
|
|
11
14
|
//
|
|
@@ -13,7 +16,8 @@ import { lane_spent, type KeptLane } from './lane-spent'
|
|
|
13
16
|
// every step here is written to run over a subject that is already gone or that still holds
|
|
14
17
|
// uncommitted work. A close that refused either would leave exactly the debris it exists to remove,
|
|
15
18
|
// and the next lane for that issue would then fail on a directory nobody could account for. There
|
|
16
|
-
// is no ledger entry to remove: the lane's seat lived in the `.env` that goes with the work tree.
|
|
19
|
+
// is no ledger entry to remove: the lane's seat lived in the `.env` that goes with the work tree. The
|
|
20
|
+
// lane's state record outlives it, marked `ended`, so its last state stays readable.
|
|
17
21
|
|
|
18
22
|
interface LaneTargets {
|
|
19
23
|
directory: string
|
|
@@ -36,6 +40,9 @@ interface CloseOutcome {
|
|
|
36
40
|
left_behind: Array<string>
|
|
37
41
|
// The lane child's processes this close terminated — empty for a child that ended by itself.
|
|
38
42
|
reaped: Array<number>
|
|
43
|
+
// What else still ran from the lane's checkout or carried its mark and this close terminated
|
|
44
|
+
// (`lane-residents.ts`); `undefined` where the processes could not be read.
|
|
45
|
+
residents: Array<number> | undefined
|
|
39
46
|
}
|
|
40
47
|
|
|
41
48
|
interface SweepOutcome {
|
|
@@ -112,39 +119,72 @@ function close_kind(did_exist: boolean, left_behind: ReadonlyArray<string>): Clo
|
|
|
112
119
|
return did_exist ? 'closed' : 'none'
|
|
113
120
|
}
|
|
114
121
|
|
|
115
|
-
// The
|
|
116
|
-
//
|
|
117
|
-
// Derived here from the current work tree, a close run inside a lane
|
|
118
|
-
// reports `none` over a directory that is still on disk.
|
|
119
|
-
async function lane_root_directory(): Promise<string> {
|
|
120
|
-
return lane_paths.lane_root(await lane_registry.main_repository_root())
|
|
121
|
-
}
|
|
122
|
-
|
|
122
|
+
// The lane root is the main work tree's (`lane_root_directory`), so the fallback directory an
|
|
123
|
+
// unregistered lane is closed by is the one `lane:open` would have created.
|
|
123
124
|
/**
|
|
124
125
|
* Close the lane for `issue`. `none` means there was nothing there, which is not a failure: a caller
|
|
125
126
|
* cleaning up after an interruption cannot know whether the lane was ever opened. `incomplete` means
|
|
126
127
|
* something survived the removal, and `left_behind` names it.
|
|
127
128
|
*/
|
|
128
129
|
async function resolve_lane(issue: string): Promise<ResolvedLane> {
|
|
129
|
-
const root = await lane_root_directory()
|
|
130
|
+
const root = await lane_registry.lane_root_directory()
|
|
130
131
|
const existing = lane_registry.find_lane(await lane_registry.list_lanes(), issue)
|
|
131
132
|
|
|
132
133
|
return { existing, targets: lane_targets(root, issue, existing) }
|
|
133
134
|
}
|
|
134
135
|
|
|
136
|
+
// A lane closed before is `none` on a retry, and ends there once its record says it is not over —
|
|
137
|
+
// an issue never opened is not given a record.
|
|
138
|
+
async function is_ending(issue: string, kind: CloseKind): Promise<boolean> {
|
|
139
|
+
if (kind !== 'none') return kind === 'closed'
|
|
140
|
+
|
|
141
|
+
const record = await lane_state.read_state(issue)
|
|
142
|
+
|
|
143
|
+
return record !== undefined && record.state !== 'ended'
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
// The lane's processes, settled after the removal so the processes have had the work tree's deletion
|
|
147
|
+
// to exit in too; what outlived the SIGKILL replaces what the lane's record noted for `run:board`.
|
|
148
|
+
async function survivors_of(issue: string, directory: string): Promise<Array<string>> {
|
|
149
|
+
const survivors = await lane_reap_settle.settle({ issue, directory })
|
|
150
|
+
|
|
151
|
+
if (survivors !== undefined) await lane_state.record_stuck(issue, survivors)
|
|
152
|
+
|
|
153
|
+
return lane_reap_settle.survivor_texts(survivors)
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
// Whatever the removal left: the checkout's residue, then the processes that outlived it.
|
|
157
|
+
async function left_behind_of(issue: string, targets: LaneTargets): Promise<Array<string>> {
|
|
158
|
+
const survivors = await survivors_of(issue, targets.directory)
|
|
159
|
+
|
|
160
|
+
return [...(await residue(targets)), ...survivors]
|
|
161
|
+
}
|
|
162
|
+
|
|
135
163
|
async function close_lane(issue: string): Promise<CloseOutcome> {
|
|
136
164
|
const { existing, targets } = await resolve_lane(issue)
|
|
137
165
|
const did_exist = existing !== undefined || existsSync(targets.directory)
|
|
138
166
|
// Before the removal, not after: a child still running in the tree would keep writing into a
|
|
139
167
|
// directory being deleted, and a process outliving its lane is a half-discarded state — the work
|
|
140
|
-
// tree gone, the child still answering `alive`.
|
|
141
|
-
const reaped = lane_reap.reap_child(issue)
|
|
168
|
+
// tree gone, the child still answering `alive`. What else still runs from the checkout goes too.
|
|
169
|
+
const reaped = lane_reap.reap_child({ issue, directory: targets.directory })
|
|
170
|
+
const residents = lane_residents.end_residents({ issue, directory: targets.directory }, reaped)
|
|
142
171
|
|
|
143
172
|
await remove_lane(targets)
|
|
144
173
|
|
|
145
|
-
const left_behind = await
|
|
174
|
+
const left_behind = await left_behind_of(issue, targets)
|
|
175
|
+
const kind = close_kind(did_exist, left_behind)
|
|
176
|
+
|
|
177
|
+
if (await is_ending(issue, kind)) {
|
|
178
|
+
await lane_state.record_change({ issue, state: 'ended', command: 'lane:close' })
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
return { issue, kind, left_behind, reaped, residents }
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
type DuePredicate = (issue: string) => Promise<boolean>
|
|
146
185
|
|
|
147
|
-
|
|
186
|
+
async function always_due(): Promise<boolean> {
|
|
187
|
+
return true
|
|
148
188
|
}
|
|
149
189
|
|
|
150
190
|
// A lane that could not be closed is recorded rather than thrown: a sweep has to attempt every lane,
|
|
@@ -163,14 +203,24 @@ async function try_close(issue: string): Promise<boolean> {
|
|
|
163
203
|
|
|
164
204
|
// Sequential on purpose: two `git worktree` writes at once contend for the same registration
|
|
165
205
|
// directory, and the whole point of the command is that nothing is left half-removed.
|
|
166
|
-
async function
|
|
206
|
+
async function close_into(sweep: SweepOutcome, issue: string, is_due: DuePredicate): Promise<void> {
|
|
207
|
+
if (!(await is_due(issue))) return
|
|
208
|
+
const bucket = (await try_close(issue)) ? sweep.closed : sweep.failed
|
|
209
|
+
|
|
210
|
+
bucket.push(issue)
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
// `is_due` is asked right before each close, not for every issue up front: a close can wait out the
|
|
214
|
+
// grace window, and a lane opened again meanwhile is no longer one to close.
|
|
215
|
+
async function close_each(
|
|
216
|
+
issues: ReadonlyArray<string>,
|
|
217
|
+
is_due: DuePredicate = always_due,
|
|
218
|
+
): Promise<SweepOutcome> {
|
|
167
219
|
const sweep: SweepOutcome = { closed: [], failed: [] }
|
|
168
220
|
|
|
169
221
|
for (const issue of issues) {
|
|
170
222
|
// eslint-disable-next-line no-await-in-loop -- worktree writes contend for the same registration directory
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
bucket.push(issue)
|
|
223
|
+
await close_into(sweep, issue, is_due)
|
|
174
224
|
}
|
|
175
225
|
|
|
176
226
|
return sweep
|
|
@@ -196,11 +246,29 @@ async function close_all_lanes(): Promise<SweepOutcome> {
|
|
|
196
246
|
return await close_each(lanes.map((lane) => lane.issue))
|
|
197
247
|
}
|
|
198
248
|
|
|
249
|
+
async function is_unfinished(issue: string): Promise<boolean> {
|
|
250
|
+
const { targets } = await resolve_lane(issue)
|
|
251
|
+
|
|
252
|
+
return !existsSync(targets.directory)
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
/**
|
|
256
|
+
* Close again every lane whose work tree is gone but whose record is not `ended` — a close a process
|
|
257
|
+
* outlived. The supervisor runs it each pass, so a lane ends once its last process does.
|
|
258
|
+
*/
|
|
259
|
+
async function retry_closes(): Promise<SweepOutcome> {
|
|
260
|
+
const records = await lane_state.read_records()
|
|
261
|
+
const issues = records.filter((record) => record.state !== 'ended').map(({ issue }) => issue)
|
|
262
|
+
|
|
263
|
+
return await close_each(issues, is_unfinished)
|
|
264
|
+
}
|
|
265
|
+
|
|
199
266
|
const lane_close = {
|
|
200
267
|
close_all_lanes,
|
|
201
268
|
close_lane,
|
|
202
269
|
prune_lanes,
|
|
203
270
|
resolve_lane,
|
|
271
|
+
retry_closes,
|
|
204
272
|
}
|
|
205
273
|
|
|
206
274
|
export type { CloseKind, CloseOutcome, PruneOutcome, ResolvedLane, SweepOutcome }
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { lane_ledger, type CoreWaitEntry, type LedgerEntry } from './lane-ledger'
|
|
2
|
+
import { lane_stage_stats } from './lane-stage-stats'
|
|
3
|
+
import { lane_stats, type StatsWindow } from './lane-stats'
|
|
4
|
+
|
|
5
|
+
// How long each lane's commands waited for the core budget: the ledger's `core-wait` entries of one
|
|
6
|
+
// period reduced to one row per lane, printed by `josh lane:stats` so a lane's time splits into work
|
|
7
|
+
// and waiting (joshuafolkken/kit#4382). A lane is named by its issue number, a wait outside a lane — the
|
|
8
|
+
// main checkout's — by its own row.
|
|
9
|
+
|
|
10
|
+
const COLUMNS = ['lane', 'total (min)', 'median (min)', 'waits'] as const
|
|
11
|
+
const OUTSIDE_A_LANE = 'outside a lane'
|
|
12
|
+
const { NOT_MEASURED } = lane_stage_stats
|
|
13
|
+
// A period with no wait: the table still prints, so a reader sees zero waits rather than no table.
|
|
14
|
+
const NONE_ROW = ['none', NOT_MEASURED, NOT_MEASURED, '0']
|
|
15
|
+
|
|
16
|
+
function is_core_wait(entry: LedgerEntry): entry is CoreWaitEntry {
|
|
17
|
+
return entry.kind === lane_ledger.KIND.CORE_WAIT
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
function lane_of(wait: CoreWaitEntry): string {
|
|
21
|
+
return wait.issue === undefined ? OUTSIDE_A_LANE : String(wait.issue)
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function total(values: ReadonlyArray<number>): number {
|
|
25
|
+
return values.reduce((sum, value) => sum + value, 0)
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function waits_of(waits: ReadonlyArray<CoreWaitEntry>, lane: string): Array<number> {
|
|
29
|
+
return waits.filter((wait) => lane_of(wait) === lane).map((wait) => wait.waited_ms)
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function lane_row(lane: string, waits: ReadonlyArray<CoreWaitEntry>): string {
|
|
33
|
+
const waited = waits_of(waits, lane)
|
|
34
|
+
|
|
35
|
+
return lane_stats.to_row([
|
|
36
|
+
lane,
|
|
37
|
+
lane_stage_stats.cell(total(waited)),
|
|
38
|
+
lane_stage_stats.cell(lane_stats.median(waited)),
|
|
39
|
+
String(waited.length),
|
|
40
|
+
])
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// The lanes the period saw, the longest total first, so the lane the budget held back most leads.
|
|
44
|
+
function lanes_of(waits: ReadonlyArray<CoreWaitEntry>): Array<string> {
|
|
45
|
+
const lanes = [...new Set(waits.map((wait) => lane_of(wait)))]
|
|
46
|
+
|
|
47
|
+
return lanes.toSorted(
|
|
48
|
+
(left, right) => total(waits_of(waits, right)) - total(waits_of(waits, left)),
|
|
49
|
+
)
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// The period's table: `entries` is the whole ledger, filtered here to `window`.
|
|
53
|
+
function table(entries: ReadonlyArray<LedgerEntry>, window: StatsWindow): string {
|
|
54
|
+
const waits = lane_stats.in_window(entries, window).filter((entry) => is_core_wait(entry))
|
|
55
|
+
const rows = lanes_of(waits).map((lane) => lane_row(lane, waits))
|
|
56
|
+
|
|
57
|
+
return [
|
|
58
|
+
lane_stats.to_row(COLUMNS),
|
|
59
|
+
lane_stats.to_row(COLUMNS.map(() => '---')),
|
|
60
|
+
...(rows.length === 0 ? [lane_stats.to_row(NONE_ROW)] : rows),
|
|
61
|
+
].join('\n')
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
const lane_core_wait_stats = { table }
|
|
65
|
+
|
|
66
|
+
export { lane_core_wait_stats }
|
|
@@ -7,9 +7,10 @@ import { IN_PROGRESS_LABEL } from '#scripts/issue/issue-labels'
|
|
|
7
7
|
import { issue_number_shape } from '#scripts/issue/issue-number-shape'
|
|
8
8
|
import { session_cite } from '#scripts/issue/session-cite'
|
|
9
9
|
import { telegram_notify } from '#scripts/notify/telegram-notify'
|
|
10
|
-
import { detached_launch } from '#scripts/run/detached-launch'
|
|
10
|
+
import { detached_launch, type LaunchArgv } from '#scripts/run/detached-launch'
|
|
11
11
|
import { run_event_stream } from '#scripts/run/event/run-event-stream'
|
|
12
12
|
import { run_event_stream_emit } from '#scripts/run/event/run-event-stream-emit'
|
|
13
|
+
import { run_park } from '#scripts/run/park/run-park'
|
|
13
14
|
import { run_ending } from '#scripts/run/run-ending'
|
|
14
15
|
import { run_label } from '#scripts/run/run-label'
|
|
15
16
|
import { lane_child_invocation } from './lane-child-invocation'
|
|
@@ -19,6 +20,7 @@ import { lane_ledger } from './lane-ledger'
|
|
|
19
20
|
import { lane_output } from './lane-output'
|
|
20
21
|
import { lane_registry, type LaneInfo } from './lane-registry'
|
|
21
22
|
import { lane_resume, type ResumePlan } from './lane-resume'
|
|
23
|
+
import { lane_state } from './lane-state'
|
|
22
24
|
import { openai_lane_supervisor } from './openai-lane-supervisor'
|
|
23
25
|
|
|
24
26
|
// `josh lane:dispatch <issue-number>` — start a lane's child as an operating-system process of its own.
|
|
@@ -197,7 +199,7 @@ function existing_dispatch(request: StartRequest): DispatchOutcome | undefined {
|
|
|
197
199
|
return dispatched_of(request, active.pid, [])
|
|
198
200
|
}
|
|
199
201
|
|
|
200
|
-
function launch_argv(request: StartRequest, nonce: string | undefined):
|
|
202
|
+
function launch_argv(request: StartRequest, nonce: string | undefined): LaunchArgv {
|
|
201
203
|
if (request.profile.provider !== 'openai') return request.argv
|
|
202
204
|
if (nonce === undefined) throw new Error('OpenAI supervisor nonce is missing')
|
|
203
205
|
|
|
@@ -244,10 +246,15 @@ async function dispatched_start(
|
|
|
244
246
|
: dispatched_of(request, pid, notes)
|
|
245
247
|
}
|
|
246
248
|
|
|
249
|
+
// **A dispatch takes back any park the issue's earlier child recorded**: the issue is offered
|
|
250
|
+
// again only once `needs-decision` is off, so a record still on disk is one a person cleared by hand on
|
|
251
|
+
// GitHub, and left in place it would silence `lane-park` on this child's own stop
|
|
252
|
+
// (joshuafolkken/kit#4132).
|
|
247
253
|
async function started(request: StartRequest): Promise<DispatchOutcome> {
|
|
248
254
|
const notes: Array<string> = []
|
|
249
255
|
const existing = existing_dispatch(request)
|
|
250
256
|
if (existing !== undefined) return existing
|
|
257
|
+
run_park.clear(request.lane.issue, request.lane.directory)
|
|
251
258
|
const nonce =
|
|
252
259
|
request.profile.provider === 'openai' ? openai_lane_supervisor.new_nonce() : undefined
|
|
253
260
|
const result = detached_launch.launch(
|
|
@@ -327,13 +334,27 @@ async function mark_in_progress(issue: string): Promise<LabelWrite> {
|
|
|
327
334
|
// removal warns and never throws, so it cannot turn a launch failure into a thrown error.
|
|
328
335
|
//
|
|
329
336
|
// The lane ledger takes the same instant: `lane:stats` times a lane's implementation from it, and the
|
|
330
|
-
// stream is capped, so a period's earlier dispatches would be gone from there.
|
|
331
|
-
|
|
337
|
+
// stream is capped, so a period's earlier dispatches would be gone from there. The lane's state record
|
|
338
|
+
// takes the stream's launch instant as its own, so `run:board`, which reads the lane's events from
|
|
339
|
+
// the record's launch on, keeps the launch event that opens them (joshuafolkken/kit#4269).
|
|
340
|
+
async function record_started(issue: string, start: DispatchStart): Promise<void> {
|
|
341
|
+
const now = new Date()
|
|
342
|
+
|
|
332
343
|
await run_event_stream_emit.emit(
|
|
333
344
|
run_event_stream.EVENT_KIND.CHILD_LAUNCH,
|
|
334
345
|
`${issue_cite.plain(issue)} dispatched`,
|
|
346
|
+
now,
|
|
335
347
|
)
|
|
336
348
|
await lane_ledger.record_dispatch(Number(issue))
|
|
349
|
+
await lane_state.record_change(
|
|
350
|
+
{
|
|
351
|
+
issue,
|
|
352
|
+
state: 'running',
|
|
353
|
+
command: start === RESTART_START ? 'lane:restart' : 'lane:dispatch',
|
|
354
|
+
is_launch: true,
|
|
355
|
+
},
|
|
356
|
+
{ now },
|
|
357
|
+
)
|
|
337
358
|
}
|
|
338
359
|
|
|
339
360
|
// How a dispatch begins. A `resumable` one claims the marker itself and resumes an `outage` session; a
|
|
@@ -359,7 +380,7 @@ async function finish_dispatch(
|
|
|
359
380
|
|
|
360
381
|
const is_failed = outcome.kind === 'failed'
|
|
361
382
|
|
|
362
|
-
await (is_failed ? run_label.unmark(issue) : record_started(issue))
|
|
383
|
+
await (is_failed ? run_label.unmark(issue) : record_started(issue, start))
|
|
363
384
|
|
|
364
385
|
return outcome
|
|
365
386
|
}
|
|
@@ -404,7 +425,7 @@ function log_sentence(outcome: Dispatched, issue: string): string {
|
|
|
404
425
|
return ` Its output is NOT being kept — ${outcome.notes.join(NOTE_SEPARATOR)} — so ${outcome.log_path} will not grow and the process trace is the only answer: ${poll}.`
|
|
405
426
|
}
|
|
406
427
|
|
|
407
|
-
return ` It writes to ${outcome.log_path}.
|
|
428
|
+
return ` It writes to ${outcome.log_path}. Wait on it with \`pnpm josh lane:await ${issue} --owner "$PPID"\` in the background and end the turn; once that output falls silent, ${poll}.`
|
|
408
429
|
}
|
|
409
430
|
|
|
410
431
|
// Whether this dispatch resumed the disconnected child's session or started fresh — the report the
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import { agent_role_profile } from '#scripts/agent/agent-role-profile'
|
|
2
|
+
import { MS_PER_SECOND } from '#scripts/lib/timeouts'
|
|
3
|
+
import { run_event_stream, type RunEvent } from '#scripts/run/event/run-event-stream'
|
|
4
|
+
import { lane_ledger, type LedgerEntry, type MergeEntry } from './lane-ledger'
|
|
5
|
+
import { lane_spans, type Span } from './lane-spans'
|
|
6
|
+
import { lane_stage_stats } from './lane-stage-stats'
|
|
7
|
+
import { lane_stats, type StatsWindow } from './lane-stats'
|
|
8
|
+
import { lane_stop_stats } from './lane-stop-stats'
|
|
9
|
+
|
|
10
|
+
// How long a lane slot waited on the lane machinery rather than on work, printed by `josh lane:stats`
|
|
11
|
+
// (joshuafolkken/kit#4395). Three hand-offs, each timed from the moment the slot's next step could run:
|
|
12
|
+
//
|
|
13
|
+
// - `cut → resume`: a child's session cut until the relaunched session resumed the lane.
|
|
14
|
+
// - `outage → relaunch`: a child that ended with no result, collected as an `outage`, until its next
|
|
15
|
+
// `child-launch` (joshuafolkken/kit#4410).
|
|
16
|
+
// - `park → offer`: a park until the driver's next offer answered — a `held`, `released` or `dispatch`
|
|
17
|
+
// entry. A pool that stays full writes no line after its one `released`, and a driver handed back
|
|
18
|
+
// writes none, so a gap over the offer interval is a full pool or no driver, never the hand-over
|
|
19
|
+
// (joshuafolkken/kit#4410). The ship's cap park and the driver's collection of it are each timed.
|
|
20
|
+
// - `followup → merge`: the ship's last `followup` stage before the merge until the parent wrote the
|
|
21
|
+
// `merge` line, the step that releases the slot. A merge with no `followup` stage has no start.
|
|
22
|
+
//
|
|
23
|
+
// A start nothing ended is counted under `not ended`, kept out of the seconds.
|
|
24
|
+
|
|
25
|
+
const COLUMNS = ['gap', 'count', 'median (s)', 'max (s)', 'not ended'] as const
|
|
26
|
+
const RELAUNCH = 'cut → resume'
|
|
27
|
+
const OUTAGE = 'outage → relaunch'
|
|
28
|
+
const PARK = 'park → offer'
|
|
29
|
+
const MERGE = 'followup → merge'
|
|
30
|
+
const FOLLOWUP_STAGE = 'followup'
|
|
31
|
+
const IMPLEMENTATION_CUT = `cut (${agent_role_profile.IMPLEMENTATION_PHASE})`
|
|
32
|
+
const { NOT_MEASURED, is_dispatch, is_number, is_stage } = lane_stage_stats
|
|
33
|
+
const { EVENT_KIND } = run_event_stream
|
|
34
|
+
// The offer answers that are not a dispatch: a free lane held, or the pool found full.
|
|
35
|
+
const OFFER_ANSWERS: ReadonlySet<string> = new Set([
|
|
36
|
+
lane_ledger.KIND.HELD,
|
|
37
|
+
lane_ledger.KIND.RELEASED,
|
|
38
|
+
])
|
|
39
|
+
|
|
40
|
+
// Only an implementation cut appends a `resume` when it is adopted; a pre-gate resume appends nothing,
|
|
41
|
+
// so its cut would read as never ended (`run-cut-cli.ts` → `emit_resume_event`).
|
|
42
|
+
function implementation_cuts(events: ReadonlyArray<RunEvent>): Array<RunEvent> {
|
|
43
|
+
return events.filter((event) => event.text.endsWith(IMPLEMENTATION_CUT))
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
function relaunch_spans(events: ReadonlyArray<RunEvent>): Array<Span> {
|
|
47
|
+
return lane_spans.issue_spans({
|
|
48
|
+
starts: lane_stop_stats.events_of(implementation_cuts(events), EVENT_KIND.CUT),
|
|
49
|
+
bounds: lane_stop_stats.events_of(events, EVENT_KIND.CUT),
|
|
50
|
+
ends: lane_stop_stats.events_of(events, EVENT_KIND.RESUME),
|
|
51
|
+
})
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// A child that ended with no result is collected as an `outage`, re-dispatchable; its next launch is
|
|
55
|
+
// the relaunch.
|
|
56
|
+
function outage_spans(events: ReadonlyArray<RunEvent>): Array<Span> {
|
|
57
|
+
const outages = lane_stop_stats.events_of(events, EVENT_KIND.OUTAGE)
|
|
58
|
+
|
|
59
|
+
return lane_spans.issue_spans({
|
|
60
|
+
starts: outages,
|
|
61
|
+
bounds: outages,
|
|
62
|
+
ends: lane_stop_stats.events_of(events, EVENT_KIND.CHILD_LAUNCH),
|
|
63
|
+
})
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
function offer_times(entries: ReadonlyArray<LedgerEntry>): Array<number> {
|
|
67
|
+
return entries
|
|
68
|
+
.filter((entry) => is_dispatch(entry) || OFFER_ANSWERS.has(entry.kind))
|
|
69
|
+
.map((entry) => Date.parse(entry.at))
|
|
70
|
+
.toSorted((left, right) => left - right)
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
function park_spans(
|
|
74
|
+
entries: ReadonlyArray<LedgerEntry>,
|
|
75
|
+
events: ReadonlyArray<RunEvent>,
|
|
76
|
+
): Array<Span> {
|
|
77
|
+
const offers = offer_times(entries)
|
|
78
|
+
|
|
79
|
+
return lane_stop_stats
|
|
80
|
+
.events_of(events, EVENT_KIND.PARK)
|
|
81
|
+
.map((park) => ({ from_ms: park.at_ms, end_ms: offers.find((at) => at > park.at_ms) }))
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
function is_merge(entry: LedgerEntry): entry is MergeEntry {
|
|
85
|
+
return entry.kind === lane_ledger.KIND.MERGE
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
function is_followup_of(entry: LedgerEntry, merge: MergeEntry): boolean {
|
|
89
|
+
return (
|
|
90
|
+
is_stage(entry) &&
|
|
91
|
+
entry.stage === FOLLOWUP_STAGE &&
|
|
92
|
+
entry.issue === merge.issue &&
|
|
93
|
+
entry.at <= merge.at
|
|
94
|
+
)
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
function merge_span(entries: ReadonlyArray<LedgerEntry>, merge: MergeEntry): Span | undefined {
|
|
98
|
+
const followup = entries.findLast((entry) => is_followup_of(entry, merge))
|
|
99
|
+
|
|
100
|
+
return followup === undefined
|
|
101
|
+
? undefined
|
|
102
|
+
: { from_ms: Date.parse(followup.at), end_ms: Date.parse(merge.at) }
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
function merge_spans(entries: ReadonlyArray<LedgerEntry>): Array<Span> {
|
|
106
|
+
return entries
|
|
107
|
+
.filter((entry) => is_merge(entry))
|
|
108
|
+
.map((merge) => merge_span(entries, merge))
|
|
109
|
+
.filter((span) => span !== undefined)
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
function seconds(milliseconds: number | undefined): string {
|
|
113
|
+
return milliseconds === undefined
|
|
114
|
+
? NOT_MEASURED
|
|
115
|
+
: String(Math.round(milliseconds / MS_PER_SECOND))
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
function is_in(span: Span, window: StatsWindow): boolean {
|
|
119
|
+
return span.from_ms >= window.since_ms && span.from_ms <= window.until_ms
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
function gap_row(name: string, spans: ReadonlyArray<Span>, window: StatsWindow): string {
|
|
123
|
+
const started = spans.filter((span) => is_in(span, window))
|
|
124
|
+
const ended = started
|
|
125
|
+
.map((span) => (span.end_ms === undefined ? undefined : span.end_ms - span.from_ms))
|
|
126
|
+
.filter((value) => is_number(value))
|
|
127
|
+
|
|
128
|
+
return lane_stats.to_row([
|
|
129
|
+
name,
|
|
130
|
+
String(started.length),
|
|
131
|
+
seconds(lane_stats.median(ended)),
|
|
132
|
+
seconds(lane_stats.peak(ended)),
|
|
133
|
+
String(started.length - ended.length),
|
|
134
|
+
])
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
// The period's table: `entries` is the whole ledger and `events` the whole run-event stream, both
|
|
138
|
+
// reduced here to the spans that started in `window`.
|
|
139
|
+
function table(
|
|
140
|
+
entries: ReadonlyArray<LedgerEntry>,
|
|
141
|
+
window: StatsWindow,
|
|
142
|
+
events: ReadonlyArray<RunEvent> = [],
|
|
143
|
+
): string {
|
|
144
|
+
return [
|
|
145
|
+
lane_stats.to_row(COLUMNS),
|
|
146
|
+
lane_stats.to_row(COLUMNS.map(() => '---')),
|
|
147
|
+
gap_row(RELAUNCH, relaunch_spans(events), window),
|
|
148
|
+
gap_row(OUTAGE, outage_spans(events), window),
|
|
149
|
+
gap_row(PARK, park_spans(entries, events), window),
|
|
150
|
+
gap_row(MERGE, merge_spans(entries), window),
|
|
151
|
+
].join('\n')
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
const lane_gap_stats = { table }
|
|
155
|
+
|
|
156
|
+
export { lane_gap_stats }
|
|
@@ -45,9 +45,9 @@ interface LaneGuardEntry {
|
|
|
45
45
|
const LANE_GUARD_POLICY: ReadonlyArray<LaneGuardEntry> = [
|
|
46
46
|
{
|
|
47
47
|
id: 'investigation',
|
|
48
|
-
mode_in_lane_child: '
|
|
48
|
+
mode_in_lane_child: 'refuse',
|
|
49
49
|
because:
|
|
50
|
-
'
|
|
50
|
+
'the notice was measured not to move the reading — 52% of lane cost stayed in main-line exploration — and the refusal fires once per accumulation, a round trip the child survives as it survives the rule row, so the child is refused like the main line',
|
|
51
51
|
},
|
|
52
52
|
{
|
|
53
53
|
id: 'batching',
|
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
import { git_common_directory } from '#scripts/git/git-common-directory'
|
|
2
|
+
import { run_carry } from '#scripts/run/carry/run-carry'
|
|
2
3
|
import { run_ship_detach } from '#scripts/run/ship/run-ship-detach'
|
|
4
|
+
import { run_ship_stage } from '#scripts/run/ship/run-ship-stage'
|
|
3
5
|
import { lane_child_marker, type MarkerSource } from './lane-child-marker'
|
|
4
6
|
|
|
7
|
+
type StartRead = (pid: number) => string | undefined
|
|
8
|
+
|
|
5
9
|
// Whether a lane has handed its post-implementation region to the detached ship.
|
|
6
10
|
//
|
|
7
11
|
// **A child that ran `pnpm josh ship --detach` waits on nobody when it ends.** The supervisor drives the
|
|
@@ -24,6 +28,69 @@ function is_ship_running(issue: string, directory: string): boolean {
|
|
|
24
28
|
)
|
|
25
29
|
}
|
|
26
30
|
|
|
31
|
+
// A detached ship for `issue` launched at or after `since_ms` ended in success — it merged, so no cut
|
|
32
|
+
// hand-off follows it. The record outlives its run until the next `ship --detach` replaces it, so a
|
|
33
|
+
// success launched earlier belongs to a past dispatch of the issue and never counts.
|
|
34
|
+
function is_ship_succeeded(issue: string, directory: string, since_ms: number): boolean {
|
|
35
|
+
const repository = git_common_directory.repository(directory)
|
|
36
|
+
const reading =
|
|
37
|
+
repository === undefined ? undefined : run_ship_detach.read_result(repository, issue)
|
|
38
|
+
|
|
39
|
+
return reading?.result === 'success' && (reading.launched_at ?? since_ms - 1) >= since_ms
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
async function read_repository(): Promise<string | undefined> {
|
|
43
|
+
try {
|
|
44
|
+
return await run_carry.repository_directory()
|
|
45
|
+
} catch {
|
|
46
|
+
return undefined
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// `is_ship_running` for this checkout, for a reader that must not block its event loop
|
|
51
|
+
// (joshuafolkken/kit#4245): the repository is read asynchronously once and every recorded start time
|
|
52
|
+
// through `read`, so no answer starts a synchronous process.
|
|
53
|
+
async function ship_reader(read: StartRead): Promise<(issue: string) => boolean> {
|
|
54
|
+
const repository = await read_repository()
|
|
55
|
+
|
|
56
|
+
return (issue) =>
|
|
57
|
+
repository !== undefined &&
|
|
58
|
+
run_ship_detach.read_result(repository, issue, read)?.result === 'running'
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// The live ship for `issue` is inside `josh followup`: it waits on CI, CodeRabbit and the merge alone
|
|
62
|
+
// (joshuafolkken/kit#4466). The mark is down while the followup stage merges and gates again, after a
|
|
63
|
+
// stop, and once a successor supervisor opens the record (`run_ship_stage.read_merge_waiting`).
|
|
64
|
+
function is_merge_waiting(repository: string, issue: string, read: StartRead): boolean {
|
|
65
|
+
if (run_ship_detach.read_result(repository, issue, read)?.result !== 'running') return false
|
|
66
|
+
|
|
67
|
+
return run_ship_stage.read_merge_waiting(run_ship_stage.record_path(repository, issue))
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// `is_merge_waiting` for this checkout, read the way `ship_reader` reads.
|
|
71
|
+
async function merge_wait_reader(read: StartRead): Promise<(issue: string) => boolean> {
|
|
72
|
+
const repository = await read_repository()
|
|
73
|
+
|
|
74
|
+
return (issue) => repository !== undefined && is_merge_waiting(repository, issue, read)
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// The live ship for `issue` in the repository `directory` belongs to waits for a lane place before it
|
|
78
|
+
// relaunches its child (`run-ship-place.ts`); a dead supervisor's mark reads as no wait.
|
|
79
|
+
function is_place_waiting(issue: string, directory: string): boolean {
|
|
80
|
+
const repository = git_common_directory.repository(directory)
|
|
81
|
+
|
|
82
|
+
if (repository === undefined || !is_ship_running(issue, directory)) return false
|
|
83
|
+
|
|
84
|
+
return run_ship_stage.read_place_waiting(run_ship_stage.record_path(repository, issue))
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// When the detached ship for `issue` that is still live was launched, or `undefined` where none is.
|
|
88
|
+
function ship_running_since(issue: string, directory: string): number | undefined {
|
|
89
|
+
const repository = git_common_directory.repository(directory)
|
|
90
|
+
|
|
91
|
+
return repository === undefined ? undefined : run_ship_detach.running_since(repository, issue)
|
|
92
|
+
}
|
|
93
|
+
|
|
27
94
|
// This session is the dispatched lane child for `directory` and its own ship is running.
|
|
28
95
|
function is_handed_off(directory: string, source: MarkerSource = process.env): boolean {
|
|
29
96
|
const issue = lane_child_marker.marked_issue(source)
|
|
@@ -33,6 +100,14 @@ function is_handed_off(directory: string, source: MarkerSource = process.env): b
|
|
|
33
100
|
return is_ship_running(issue, directory)
|
|
34
101
|
}
|
|
35
102
|
|
|
36
|
-
const lane_handoff = {
|
|
103
|
+
const lane_handoff = {
|
|
104
|
+
is_handed_off,
|
|
105
|
+
is_place_waiting,
|
|
106
|
+
is_ship_running,
|
|
107
|
+
is_ship_succeeded,
|
|
108
|
+
merge_wait_reader,
|
|
109
|
+
ship_reader,
|
|
110
|
+
ship_running_since,
|
|
111
|
+
}
|
|
37
112
|
|
|
38
113
|
export { lane_handoff }
|