@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,12 +1,13 @@
|
|
|
1
|
-
import { createHash
|
|
2
|
-
import { lstatSync, readFileSync,
|
|
1
|
+
import { createHash } from 'node:crypto'
|
|
2
|
+
import { lstatSync, readFileSync, rmSync, writeFileSync } from 'node:fs'
|
|
3
3
|
import path from 'node:path'
|
|
4
4
|
import { PACKAGE_DIR } from '#scripts/init/init-paths'
|
|
5
|
-
import { PLATFORM_TEMP_ROOT } from '
|
|
5
|
+
import { PLATFORM_TEMP_ROOT } from '#scripts/josh/platform-temporary'
|
|
6
|
+
import { atomic_write } from '#scripts/lib/atomic-write'
|
|
6
7
|
|
|
7
8
|
// A small record one josh command writes and another reads, kept per checkout in the temp directory.
|
|
8
9
|
//
|
|
9
|
-
// Extracted from `
|
|
10
|
+
// Extracted from `tools/eval/eval-stamp.ts` when `josh latest:scope` needed the same handoff.
|
|
10
11
|
// The mechanics below are not boilerplate — the symlink defense on the
|
|
11
12
|
// write, the ownership check on the read, and the deterministic per-checkout path are each load
|
|
12
13
|
// bearing — so a second copy of them is the clone `CLAUDE.md` prohibits. What differs between the
|
|
@@ -121,8 +122,8 @@ function is_foreign_file(target: string): boolean {
|
|
|
121
122
|
}
|
|
122
123
|
|
|
123
124
|
// Mutable coordination state cannot disappear between an unlink and its replacement: a reader that
|
|
124
|
-
// mistakes that gap for "no child" can start the same generation twice.
|
|
125
|
-
// beside the target
|
|
125
|
+
// mistakes that gap for "no child" can start the same generation twice. `atomic-write.ts` stages the
|
|
126
|
+
// text beside the target with the same exclusive create and renames it over the target.
|
|
126
127
|
// `rename` replaces the path itself rather than following a symlink planted there, so the write still
|
|
127
128
|
// never lands somewhere else; a regular file another account owns is refused before it is replaced,
|
|
128
129
|
// the same answer the unlink gives on a sticky temp directory.
|
|
@@ -131,16 +132,9 @@ function replace_text_stamp(target: string, text: string): string {
|
|
|
131
132
|
throw new Error(`refusing to replace another account's file: ${target}`)
|
|
132
133
|
}
|
|
133
134
|
|
|
134
|
-
|
|
135
|
+
atomic_write.replace_file(target, text, { mode: STAMP_FILE_MODE })
|
|
135
136
|
|
|
136
|
-
|
|
137
|
-
writeFileSync(temporary, text, { flag: STAMP_CREATE_FLAG, mode: STAMP_FILE_MODE })
|
|
138
|
-
renameSync(temporary, target)
|
|
139
|
-
|
|
140
|
-
return target
|
|
141
|
-
} finally {
|
|
142
|
-
rmSync(temporary, { force: true })
|
|
143
|
-
}
|
|
137
|
+
return target
|
|
144
138
|
}
|
|
145
139
|
|
|
146
140
|
function replace_stamp(target: string, payload: unknown): string {
|
|
@@ -2,7 +2,7 @@ import { spawnSync } from 'node:child_process'
|
|
|
2
2
|
import { setTimeout as sleep } from 'node:timers/promises'
|
|
3
3
|
import { parseArgs } from 'node:util'
|
|
4
4
|
import { issue_number_shape } from '#scripts/issue/issue-number-shape'
|
|
5
|
-
import { PROBE_TIMEOUT_MS } from '#scripts/lib/timeouts'
|
|
5
|
+
import { MS_PER_SECOND, PROBE_TIMEOUT_MS } from '#scripts/lib/timeouts'
|
|
6
6
|
import {
|
|
7
7
|
PROCESS_ALIVE,
|
|
8
8
|
PROCESS_NONE,
|
|
@@ -28,7 +28,6 @@ import { process_tools } from './process-tools'
|
|
|
28
28
|
const RECONFIRM_MS = 15_000
|
|
29
29
|
const DEFAULT_POLL_MS = 5000
|
|
30
30
|
const NEVER_APPEARED_TIMEOUT_MS = 600_000
|
|
31
|
-
const MS_PER_SECOND = 1000
|
|
32
31
|
const PROCESS_FOUND = 0
|
|
33
32
|
const PROCESS_NOT_FOUND = 1
|
|
34
33
|
const PGREP_COMMAND = 'pgrep'
|
|
@@ -36,8 +35,14 @@ const PGREP_COMMAND = 'pgrep'
|
|
|
36
35
|
// `is_settled` is read once, when the wait starts: a child that ended between two `lane:await` calls
|
|
37
36
|
// never appears in the second one, and only its settled issue tells it apart from one not yet
|
|
38
37
|
// launched.
|
|
38
|
+
//
|
|
39
|
+
// `alive_since` is when this run of the child was first seen alive: a ship it launched is no older, so
|
|
40
|
+
// a ship record launched earlier is a past dispatch's (joshuafolkken/kit#4395). A child already alive
|
|
41
|
+
// when the watch began gets the first poll's time, so a ship it launched before that is not read as
|
|
42
|
+
// its own and its disappearance waits out the re-confirm window.
|
|
39
43
|
interface AwaitState {
|
|
40
44
|
appeared: boolean
|
|
45
|
+
alive_since?: number | undefined
|
|
41
46
|
disappeared_at: number | undefined
|
|
42
47
|
first_polled_at: number | undefined
|
|
43
48
|
is_settled?: boolean
|
|
@@ -56,6 +61,7 @@ interface RawAwaitArguments {
|
|
|
56
61
|
// Injectable for testing -- the CLI never overrides these.
|
|
57
62
|
interface AwaitOptions {
|
|
58
63
|
is_running?: (issue: string) => boolean
|
|
64
|
+
is_shipped?: (issue: string, since_ms: number) => boolean
|
|
59
65
|
is_settled?: (issue: string) => Promise<boolean>
|
|
60
66
|
poll_ms?: number
|
|
61
67
|
reconfirm_ms?: number
|
|
@@ -64,8 +70,11 @@ interface AwaitOptions {
|
|
|
64
70
|
sleep?: (ms: number) => Promise<void>
|
|
65
71
|
}
|
|
66
72
|
|
|
73
|
+
// `is_shipped` is the one disappearance the re-confirm window never has to cover: a ship that ended in
|
|
74
|
+
// success merged the child's work, so no cut hand-off can follow it (joshuafolkken/kit#4395).
|
|
67
75
|
interface CheckConfig {
|
|
68
76
|
is_running: (issue: string) => boolean
|
|
77
|
+
is_shipped?: (issue: string, since_ms: number) => boolean
|
|
69
78
|
reconfirm_ms: number
|
|
70
79
|
never_appeared_timeout_ms: number
|
|
71
80
|
}
|
|
@@ -100,6 +109,10 @@ function is_process_running_default(issue: string): boolean {
|
|
|
100
109
|
return process_trace_default(issue) === PROCESS_ALIVE
|
|
101
110
|
}
|
|
102
111
|
|
|
112
|
+
function is_shipped_default(issue: string, since_ms: number): boolean {
|
|
113
|
+
return lane_handoff.is_ship_succeeded(issue, process.cwd(), since_ms)
|
|
114
|
+
}
|
|
115
|
+
|
|
103
116
|
// The same positive evidence `run:liveness` answers `settled` on: the issue closed, or it was parked.
|
|
104
117
|
async function is_settled_default(issue: string): Promise<boolean> {
|
|
105
118
|
return (await run_liveness.read_child_settled(issue)) === true
|
|
@@ -164,9 +177,16 @@ function resolve_timing(
|
|
|
164
177
|
}
|
|
165
178
|
}
|
|
166
179
|
|
|
167
|
-
function
|
|
180
|
+
function resolve_probes(options: AwaitOptions): Pick<RunConfig, 'is_running' | 'is_shipped'> {
|
|
168
181
|
return {
|
|
169
182
|
is_running: options.is_running ?? is_process_running_default,
|
|
183
|
+
is_shipped: options.is_shipped ?? is_shipped_default,
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
function resolve_options(options: AwaitOptions): RunConfig {
|
|
188
|
+
return {
|
|
189
|
+
...resolve_probes(options),
|
|
170
190
|
is_settled: options.is_settled ?? is_settled_default,
|
|
171
191
|
now: options.now ?? Date.now,
|
|
172
192
|
sleep: options.sleep ?? sleep,
|
|
@@ -174,9 +194,11 @@ function resolve_options(options: AwaitOptions): RunConfig {
|
|
|
174
194
|
}
|
|
175
195
|
}
|
|
176
196
|
|
|
177
|
-
function update_liveness(state: AwaitState, is_live: boolean): void {
|
|
197
|
+
function update_liveness(state: AwaitState, is_live: boolean, now_ms: number): void {
|
|
178
198
|
if (!is_live) return
|
|
179
199
|
|
|
200
|
+
if (!state.appeared || state.disappeared_at !== undefined) state.alive_since = now_ms
|
|
201
|
+
|
|
180
202
|
state.appeared = true
|
|
181
203
|
state.disappeared_at = undefined
|
|
182
204
|
}
|
|
@@ -203,6 +225,28 @@ function check_not_appeared(
|
|
|
203
225
|
return undefined
|
|
204
226
|
}
|
|
205
227
|
|
|
228
|
+
// The ship this run of the child launched succeeded.
|
|
229
|
+
function is_own_ship_done(issue: string, state: AwaitState, config: CheckConfig): boolean {
|
|
230
|
+
const { alive_since } = state
|
|
231
|
+
|
|
232
|
+
return alive_since !== undefined && config.is_shipped?.(issue, alive_since) === true
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
// A child that appeared and is gone: done at once when its ship succeeded, else once it stayed gone
|
|
236
|
+
// past the re-confirm window.
|
|
237
|
+
function check_gone(
|
|
238
|
+
issue: string,
|
|
239
|
+
state: AwaitState,
|
|
240
|
+
now_ms: number,
|
|
241
|
+
config: CheckConfig,
|
|
242
|
+
): string | undefined {
|
|
243
|
+
if (is_own_ship_done(issue, state, config)) return issue
|
|
244
|
+
|
|
245
|
+
state.disappeared_at ??= now_ms
|
|
246
|
+
|
|
247
|
+
return now_ms - state.disappeared_at >= config.reconfirm_ms ? issue : undefined
|
|
248
|
+
}
|
|
249
|
+
|
|
206
250
|
// Returns the issue that has confirmed-completed this tick, `undefined` if none yet.
|
|
207
251
|
// The `appeared` guard prevents a process that never showed up from being declared done, unless its
|
|
208
252
|
// issue had already settled when the wait started.
|
|
@@ -214,7 +258,7 @@ function check_issue(
|
|
|
214
258
|
): string | undefined {
|
|
215
259
|
const is_live = config.is_running(issue)
|
|
216
260
|
|
|
217
|
-
update_liveness(state, is_live)
|
|
261
|
+
update_liveness(state, is_live, now_ms)
|
|
218
262
|
|
|
219
263
|
if (is_live) return undefined
|
|
220
264
|
|
|
@@ -222,13 +266,7 @@ function check_issue(
|
|
|
222
266
|
return check_not_appeared(issue, state, now_ms, config.never_appeared_timeout_ms)
|
|
223
267
|
}
|
|
224
268
|
|
|
225
|
-
|
|
226
|
-
state.disappeared_at = now_ms
|
|
227
|
-
|
|
228
|
-
return undefined
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
return now_ms - state.disappeared_at >= config.reconfirm_ms ? issue : undefined
|
|
269
|
+
return check_gone(issue, state, now_ms, config)
|
|
232
270
|
}
|
|
233
271
|
|
|
234
272
|
function check_any(
|
|
@@ -267,6 +305,7 @@ const lane_await = {
|
|
|
267
305
|
RECONFIRM_MS,
|
|
268
306
|
check_issue,
|
|
269
307
|
is_process_running_default,
|
|
308
|
+
is_shipped_default,
|
|
270
309
|
parse_arguments,
|
|
271
310
|
process_trace_default,
|
|
272
311
|
wait_for_any,
|
|
@@ -1,13 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
cpSync,
|
|
4
|
-
existsSync,
|
|
5
|
-
mkdirSync,
|
|
6
|
-
readFileSync,
|
|
7
|
-
renameSync,
|
|
8
|
-
rmSync,
|
|
9
|
-
writeFileSync,
|
|
10
|
-
} from 'node:fs'
|
|
1
|
+
import { cpSync, existsSync, readFileSync } from 'node:fs'
|
|
11
2
|
import path from 'node:path'
|
|
12
3
|
import { hook_launch } from '#scripts/init/hook-launch'
|
|
13
4
|
import {
|
|
@@ -15,6 +6,7 @@ import {
|
|
|
15
6
|
SHARED_CACHE_SPECS,
|
|
16
7
|
type GateCacheSpec,
|
|
17
8
|
} from '#scripts/josh/josh-command-types'
|
|
9
|
+
import { atomic_write } from '#scripts/lib/atomic-write'
|
|
18
10
|
|
|
19
11
|
// Warming a fresh lane's verification caches from the main checkout.
|
|
20
12
|
//
|
|
@@ -75,30 +67,13 @@ function portable_content(
|
|
|
75
67
|
// runs in parallel with the tool whose cache is being copied, and a temporary name in the checkout
|
|
76
68
|
// root is listed by its tree walk and gone by the time it is read (#3763). `node_modules` is skipped
|
|
77
69
|
// by every tree scan and sits on the checkout's own filesystem, so the rename stays atomic.
|
|
78
|
-
function stage_path(destination_root: string, cache_file: string): string {
|
|
79
|
-
const staging_directory = path.join(destination_root, ...STAGING_SEGMENTS)
|
|
80
|
-
|
|
81
|
-
mkdirSync(staging_directory, { recursive: true })
|
|
82
|
-
|
|
83
|
-
return path.join(staging_directory, `${cache_file}.${String(process.pid)}.${randomUUID()}.tmp`)
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
function publish_staged(temporary_path: string, destination_path: string, content: string): void {
|
|
87
|
-
try {
|
|
88
|
-
writeFileSync(temporary_path, content, { flag: 'wx' })
|
|
89
|
-
renameSync(temporary_path, destination_path)
|
|
90
|
-
} finally {
|
|
91
|
-
rmSync(temporary_path, { force: true })
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
|
|
95
70
|
function write_atomically(destination_root: string, cache_file: string, content: string): void {
|
|
96
71
|
if (!existsSync(destination_root)) return
|
|
97
72
|
|
|
98
73
|
try {
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
74
|
+
atomic_write.replace_file(path.join(destination_root, cache_file), content, {
|
|
75
|
+
staging_directory: path.join(destination_root, ...STAGING_SEGMENTS),
|
|
76
|
+
})
|
|
102
77
|
} catch {
|
|
103
78
|
// Best-effort: a cache that could not be published simply leaves the destination unchanged.
|
|
104
79
|
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { cli_flags, type PositiveSetting } from '#scripts/lib/cli-flags'
|
|
1
2
|
import { lane_limit_override } from './lane-limit-override'
|
|
2
3
|
import type { LaneEnvironment } from './lane-paths'
|
|
3
4
|
import { lane_seed_policy } from './lane-seed'
|
|
@@ -21,32 +22,16 @@ import { lane_seed_policy } from './lane-seed'
|
|
|
21
22
|
// the swap peak, the slowest gates and most of the gate and commit failures.
|
|
22
23
|
const DEFAULT_LANE_LIMIT = 4
|
|
23
24
|
const LANE_LIMIT_KEY = 'JOSH_LANE_LIMIT'
|
|
24
|
-
const POSITIVE_INTEGER = /^[1-9]\d*$/u
|
|
25
25
|
const NO_LANES = 0
|
|
26
26
|
|
|
27
|
-
// The limit, or why it could not be read.
|
|
28
|
-
|
|
29
|
-
// ends the command or is reported and worked around, and only it knows which.
|
|
30
|
-
type LimitChoice = { kind: 'limit'; limit: number } | { kind: 'problem'; problem: string }
|
|
27
|
+
// The limit, or why it could not be read.
|
|
28
|
+
type LimitChoice = PositiveSetting
|
|
31
29
|
|
|
32
30
|
// **An invalid value is a hard error, never a silent fall back to the default** — the rule
|
|
33
|
-
// `PORT_SEED` already holds to.
|
|
34
|
-
//
|
|
35
|
-
//
|
|
36
|
-
// Blank is unset, not invalid: an `.env` line left as `JOSH_LANE_LIMIT=` is a variable nobody
|
|
37
|
-
// configured, exactly as `lane_paths.lane_root` reads a blank root.
|
|
38
|
-
//
|
|
39
|
-
// `name` is what the problem names: `josh lane:limit` reads its argument by the same rule.
|
|
31
|
+
// `PORT_SEED` already holds to. `name` is what the problem names: `josh lane:limit` reads its argument
|
|
32
|
+
// by the same rule.
|
|
40
33
|
function read_limit(raw: string | undefined, name: string): LimitChoice {
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
if (trimmed === '') return { kind: 'limit', limit: DEFAULT_LANE_LIMIT }
|
|
44
|
-
|
|
45
|
-
if (!POSITIVE_INTEGER.test(trimmed)) {
|
|
46
|
-
return { kind: 'problem', problem: `${name} must be a positive integer, not "${trimmed}"` }
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
return { kind: 'limit', limit: Number(trimmed) }
|
|
34
|
+
return cli_flags.read_positive_setting(raw, name, DEFAULT_LANE_LIMIT)
|
|
50
35
|
}
|
|
51
36
|
|
|
52
37
|
// **A live run's `lane:limit` override outranks the environment**: a running
|
|
@@ -73,14 +58,26 @@ function seated_limit(limit: number): number {
|
|
|
73
58
|
// Never negative: a repository holding more `in-progress` issues than the limit allows — the limit
|
|
74
59
|
// was lowered, or a stale label outlived its run — has no free lane, and a negative count read as
|
|
75
60
|
// "how many to offer" would be a slice nobody meant.
|
|
76
|
-
|
|
61
|
+
//
|
|
62
|
+
// **A lane that holds no place under the limit still holds its port seat** (joshuafolkken/kit#3967):
|
|
63
|
+
// `seated` counts every open lane, so the free count never offers more launches than seats are left.
|
|
64
|
+
// The places left under the limit, port seats aside: what resuming a lane that keeps its seat is
|
|
65
|
+
// weighed against (joshuafolkken/kit#4107).
|
|
66
|
+
function limit_room(limit: number, occupied: number): number {
|
|
77
67
|
return Math.max(NO_LANES, seated_limit(limit) - occupied)
|
|
78
68
|
}
|
|
79
69
|
|
|
70
|
+
function free_lanes(limit: number, occupied: number, seated = occupied): number {
|
|
71
|
+
const by_seats = lane_seed_policy.LAST_LANE_SEAT - seated
|
|
72
|
+
|
|
73
|
+
return Math.max(NO_LANES, Math.min(limit_room(limit, occupied), by_seats))
|
|
74
|
+
}
|
|
75
|
+
|
|
80
76
|
const lane_capacity = {
|
|
81
77
|
LANE_LIMIT_KEY,
|
|
82
78
|
free_lanes,
|
|
83
79
|
lane_limit,
|
|
80
|
+
limit_room,
|
|
84
81
|
read_limit,
|
|
85
82
|
seated_limit,
|
|
86
83
|
}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { MS_PER_SECOND } from '#scripts/lib/timeouts'
|
|
2
|
+
import { lane_ledger, type GateCheckRecord, type GateEntry, type LedgerEntry } from './lane-ledger'
|
|
3
|
+
import { lane_stage_stats } from './lane-stage-stats'
|
|
4
|
+
import { lane_stats, type StatsWindow } from './lane-stats'
|
|
5
|
+
|
|
6
|
+
// Which check a gate waited on: one period's per-check rows reduced to one row per check — median,
|
|
7
|
+
// maximum, runs, reuses, no-ops and whole-suite fallbacks — printed last by `josh lane:stats`.
|
|
8
|
+
//
|
|
9
|
+
// The whole gate is the first row, since its reuse started no check (joshuafolkken/kit#4397); the
|
|
10
|
+
// checks follow in the order they first appear.
|
|
11
|
+
//
|
|
12
|
+
// **A reused check is counted, never timed.** It started no process, so its zero would pull the median
|
|
13
|
+
// toward a check that never ran; a check with only reused rows prints `not measured`. **The unit leg's
|
|
14
|
+
// since-green no-op is counted the same way** (joshuafolkken/kit#4457): it ran no test, so its second
|
|
15
|
+
// would stand for a run that tested nothing.
|
|
16
|
+
//
|
|
17
|
+
// **The fallbacks are broken down by why** in a second table, one row per reason kind, so a slow unit
|
|
18
|
+
// leg can be read as the full suite it ran and the reason it had to.
|
|
19
|
+
|
|
20
|
+
const DECIMALS = 1
|
|
21
|
+
const WHOLE_GATE_LABEL = 'gate (whole)'
|
|
22
|
+
const COLUMNS = ['check', 'median (s)', 'max (s)', 'runs', 'reused', 'no-op', 'fallback'] as const
|
|
23
|
+
const FALLBACK_COLUMNS = ['fallback reason', 'runs'] as const
|
|
24
|
+
|
|
25
|
+
function is_gate(entry: LedgerEntry): entry is GateEntry {
|
|
26
|
+
return entry.kind === lane_ledger.KIND.GATE
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function cell(milliseconds: number | undefined): string {
|
|
30
|
+
return milliseconds === undefined
|
|
31
|
+
? lane_stage_stats.NOT_MEASURED
|
|
32
|
+
: (milliseconds / MS_PER_SECOND).toFixed(DECIMALS)
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function header(columns: ReadonlyArray<string>): Array<string> {
|
|
36
|
+
return [lane_stats.to_row(columns), lane_stats.to_row(columns.map(() => '---'))]
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function count(
|
|
40
|
+
runs: ReadonlyArray<GateCheckRecord>,
|
|
41
|
+
is_counted: (check: GateCheckRecord) => boolean,
|
|
42
|
+
): string {
|
|
43
|
+
return String(runs.filter((check) => is_counted(check)).length)
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
function check_row(label: string, checks: ReadonlyArray<GateCheckRecord>): string {
|
|
47
|
+
const runs = checks.filter((check) => check.label === label)
|
|
48
|
+
const timed = runs.filter((check) => check.is_reused !== true && check.is_unmoved !== true)
|
|
49
|
+
const elapsed = timed.map((check) => check.elapsed_ms)
|
|
50
|
+
|
|
51
|
+
return lane_stats.to_row([
|
|
52
|
+
label,
|
|
53
|
+
cell(lane_stats.median(elapsed)),
|
|
54
|
+
cell(lane_stats.peak(elapsed)),
|
|
55
|
+
String(runs.length),
|
|
56
|
+
count(runs, (check) => check.is_reused === true),
|
|
57
|
+
count(runs, (check) => check.is_unmoved === true),
|
|
58
|
+
count(runs, (check) => check.fallback !== undefined),
|
|
59
|
+
])
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// The whole gate read as one more check, so its reuse is counted the way a check's is.
|
|
63
|
+
function whole_gate(gate: GateEntry): GateCheckRecord {
|
|
64
|
+
return {
|
|
65
|
+
label: WHOLE_GATE_LABEL,
|
|
66
|
+
elapsed_ms: gate.elapsed_ms,
|
|
67
|
+
is_passed: gate.is_passed,
|
|
68
|
+
is_reused: gate.is_reused,
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
function fallback_table(checks: ReadonlyArray<GateCheckRecord>): string {
|
|
73
|
+
const reasons = checks.map((check) => check.fallback).filter((reason) => reason !== undefined)
|
|
74
|
+
const kinds = [...new Set(reasons)]
|
|
75
|
+
const rows = kinds.map((kind) =>
|
|
76
|
+
lane_stats.to_row([kind, String(reasons.filter((reason) => reason === kind).length)]),
|
|
77
|
+
)
|
|
78
|
+
|
|
79
|
+
return [...header(FALLBACK_COLUMNS), ...rows].join('\n')
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// The period's tables: `entries` is the whole ledger, filtered here to `window`.
|
|
83
|
+
function table(entries: ReadonlyArray<LedgerEntry>, window: StatsWindow): string {
|
|
84
|
+
const gates = lane_stats.in_window(entries, window).filter(is_gate)
|
|
85
|
+
const checks = gates.flatMap((gate) => gate.checks ?? [])
|
|
86
|
+
const rows = [...gates.map((gate) => whole_gate(gate)), ...checks]
|
|
87
|
+
const labels = [...new Set(rows.map((row) => row.label))]
|
|
88
|
+
|
|
89
|
+
return [
|
|
90
|
+
[...header(COLUMNS), ...labels.map((label) => check_row(label, rows))].join('\n'),
|
|
91
|
+
fallback_table(checks),
|
|
92
|
+
].join('\n\n')
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
const lane_check_stats = { WHOLE_GATE_LABEL, table }
|
|
96
|
+
|
|
97
|
+
export { lane_check_stats }
|
|
@@ -1,13 +1,17 @@
|
|
|
1
|
+
import { agent_role_profile } from '#scripts/agent/agent-role-profile'
|
|
1
2
|
import { issue_cite } from '#scripts/issue/issue-cite'
|
|
2
3
|
import { issue_number_shape } from '#scripts/issue/issue-number-shape'
|
|
3
4
|
import { run_ship_next, type ShipResume } from '#scripts/run/ship/run-ship-next'
|
|
4
5
|
import type { Stage } from '#scripts/run/ship/run-ship-stage'
|
|
6
|
+
import { run_ship_stop_context, type StopContext } from '#scripts/run/ship/run-ship-stop-context'
|
|
5
7
|
|
|
6
8
|
interface ShipStop extends ShipResume {
|
|
7
9
|
stage: Stage
|
|
10
|
+
context?: StopContext
|
|
8
11
|
}
|
|
9
12
|
|
|
10
13
|
const CHILD_INVOCATION = 'fullrun'
|
|
14
|
+
const LINE_BREAK = '\n'
|
|
11
15
|
// What a brokered reviewer's prompt ends with, so the one pattern below finds it too.
|
|
12
16
|
const REVIEW_INVOCATION = 'the reviewer of lane'
|
|
13
17
|
const RESUME_GUIDE = '.claude/skills/workflow-commands/pre-gate-cut.md'
|
|
@@ -43,6 +47,13 @@ function process_pattern(issue: string): string {
|
|
|
43
47
|
return `(${CHILD_INVOCATION}|${REVIEW_INVOCATION}|${SHIP_PROCESS} .*) ${issue_cite.plain(issue)}$`
|
|
44
48
|
}
|
|
45
49
|
|
|
50
|
+
// The `pgrep -f` pattern that finds the detached ship supervisor of `issue` alone.
|
|
51
|
+
function ship_pattern(issue: string): string {
|
|
52
|
+
issue_number_shape.require_issue_number(issue)
|
|
53
|
+
|
|
54
|
+
return `${SHIP_PROCESS} .* ${issue_cite.plain(issue)}$`
|
|
55
|
+
}
|
|
56
|
+
|
|
46
57
|
function review_invocation(issue: string): string {
|
|
47
58
|
issue_number_shape.require_issue_number(issue)
|
|
48
59
|
|
|
@@ -79,14 +90,41 @@ function outage_resume_invocation(issue: string): string {
|
|
|
79
90
|
// **A known stage puts the next command in the prompt**, so the relaunched
|
|
80
91
|
// session runs it rather than re-deriving it from `chain-rule.md`. An OpenAI lane's supervisor sees only
|
|
81
92
|
// that the ship failed, not where, so without a stage the prompt points at `run:step` as before.
|
|
93
|
+
//
|
|
94
|
+
// **A stop that carries its context puts it in the prompt too** — the failed output's
|
|
95
|
+
// tail and the changed files (`run-ship-stop-context.ts`), so the session starts at the fix rather than
|
|
96
|
+
// at `josh ship --log` and `git diff` (joshuafolkken/kit#3923).
|
|
97
|
+
//
|
|
98
|
+
// The context gets what the rest of the prompt leaves of the one argv element's cap, so the whole
|
|
99
|
+
// prompt still launches (joshuafolkken/kit#3964).
|
|
100
|
+
function known_stop_lines(
|
|
101
|
+
issue: string,
|
|
102
|
+
stop: ShipStop,
|
|
103
|
+
frame: ReadonlyArray<string>,
|
|
104
|
+
): ReadonlyArray<string> {
|
|
105
|
+
const { context } = stop
|
|
106
|
+
const is_excerpted = run_ship_stop_context.has_excerpt(context)
|
|
107
|
+
const next = run_ship_next.next_step(issue, stop.stage, stop, is_excerpted)
|
|
108
|
+
|
|
109
|
+
if (context === undefined) return [next]
|
|
110
|
+
|
|
111
|
+
const fixed = [...frame, next].join(LINE_BREAK).length + LINE_BREAK.length
|
|
112
|
+
const budget = agent_role_profile.MAX_VALUE_LENGTH - fixed
|
|
113
|
+
|
|
114
|
+
return [next, run_ship_stop_context.describe(issue, context, budget)]
|
|
115
|
+
}
|
|
116
|
+
|
|
82
117
|
function ship_stop_invocation(issue: string, stop?: ShipStop): string {
|
|
83
118
|
const opening = `Resuming the lane child for issue ${issue_cite.plain(issue)} after its detached ship supervisor stopped at a failed stage — do not re-read the workflow-commands entry documents (SKILL.md, fullrun.md).`
|
|
84
|
-
const
|
|
119
|
+
const closing = `Do not re-plan or re-implement what is already on the branch. ${child_invocation(issue)}`
|
|
120
|
+
const middle =
|
|
85
121
|
stop === undefined
|
|
86
|
-
?
|
|
87
|
-
|
|
122
|
+
? [
|
|
123
|
+
`Run \`pnpm josh run:step ${issue}\` and read the stopped report it names, fix what stopped the ship, then hand the region back per chain-rule.md.`,
|
|
124
|
+
]
|
|
125
|
+
: known_stop_lines(issue, stop, [opening, closing])
|
|
88
126
|
|
|
89
|
-
return
|
|
127
|
+
return [opening, ...middle, closing].join(LINE_BREAK)
|
|
90
128
|
}
|
|
91
129
|
|
|
92
130
|
const lane_child_invocation = {
|
|
@@ -95,6 +133,7 @@ const lane_child_invocation = {
|
|
|
95
133
|
process_pattern,
|
|
96
134
|
resume_invocation,
|
|
97
135
|
review_invocation,
|
|
136
|
+
ship_pattern,
|
|
98
137
|
ship_stop_invocation,
|
|
99
138
|
}
|
|
100
139
|
|
package/scripts/lane/lane-cli.ts
CHANGED
|
@@ -17,6 +17,7 @@ import { lane_open, type OpenOutcome } from './lane-open'
|
|
|
17
17
|
import { lane_output, type ReadOutcome, type RecordOutcome } from './lane-output'
|
|
18
18
|
import { lane_registry, type LaneInfo } from './lane-registry'
|
|
19
19
|
import { lane_report } from './lane-report'
|
|
20
|
+
import { lane_residents } from './lane-residents'
|
|
20
21
|
import { lane_seed_policy } from './lane-seed'
|
|
21
22
|
import type { KeptLane } from './lane-spent'
|
|
22
23
|
import { lane_stray } from './lane-stray'
|
|
@@ -111,16 +112,25 @@ function report_issues(issues: ReadonlyArray<string>): number {
|
|
|
111
112
|
return SUCCESS_EXIT_CODE
|
|
112
113
|
}
|
|
113
114
|
|
|
114
|
-
//
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
115
|
+
// What the close terminated: the lane child that had not ended, and what else ran from the checkout.
|
|
116
|
+
function report_terminated(outcome: CloseOutcome): void {
|
|
117
|
+
const cited = session_cite.issue(outcome.issue)
|
|
118
|
+
|
|
118
119
|
if (outcome.reaped.length > 0) {
|
|
119
120
|
console.error(
|
|
120
|
-
`Terminated the lane child for ${
|
|
121
|
+
`Terminated the lane child for ${cited} that had not ended by itself: process ${outcome.reaped.join(', ')}.`,
|
|
121
122
|
)
|
|
122
123
|
}
|
|
123
124
|
|
|
125
|
+
lane_residents.report(outcome.residents, cited)
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
// A close that left something behind exits non-zero and names it. Reported as a success, it would
|
|
129
|
+
// send the caller to the next `lane:open`, which then fails on git's own message about a branch that
|
|
130
|
+
// still exists.
|
|
131
|
+
function report_close(outcome: CloseOutcome): number {
|
|
132
|
+
report_terminated(outcome)
|
|
133
|
+
|
|
124
134
|
if (outcome.kind !== 'incomplete') {
|
|
125
135
|
return report_issues(outcome.kind === 'closed' ? [outcome.issue] : [])
|
|
126
136
|
}
|