@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,26 @@
|
|
|
1
1
|
import { closeSync, constants, openSync, writeSync } from 'node:fs'
|
|
2
2
|
import { stamp_file } from '#scripts/josh/stamp-file'
|
|
3
3
|
import { json_value } from '#scripts/lib/json-value'
|
|
4
|
+
import { stamped_memo } from '#scripts/lib/stamped-memo'
|
|
4
5
|
import { run_carry } from '#scripts/run/carry/run-carry'
|
|
5
|
-
import {
|
|
6
|
+
import {
|
|
7
|
+
lane_ledger_schema,
|
|
8
|
+
type CoreWaitRecord,
|
|
9
|
+
type GateRecord,
|
|
10
|
+
type HeldRecord,
|
|
11
|
+
type LedgerEntry,
|
|
12
|
+
type OverlapRecord,
|
|
13
|
+
type RoundTwoRecord,
|
|
14
|
+
type StageRecord,
|
|
15
|
+
type StopRecord,
|
|
16
|
+
type TestRelatedRecord,
|
|
17
|
+
type UnitFileRecord,
|
|
18
|
+
} from './lane-ledger-schema'
|
|
6
19
|
|
|
7
20
|
// The measurement ledger the lane limit is tuned against: one JSON line per
|
|
8
21
|
// lane merge, per finished `josh gate`, per machine-load sample, per lane dispatch, per finished
|
|
9
|
-
// `josh ship` stage
|
|
22
|
+
// `josh ship` stage, per stopped `josh ship`, per round-2 decision, per core-budget wait and per
|
|
23
|
+
// `josh test:related` run, read back by `josh lane:stats`. Each line's shape is `lane-ledger-schema.ts`.
|
|
10
24
|
//
|
|
11
25
|
// **Its own file rather than the run's event stream.** The stream is capped at 500 events and is
|
|
12
26
|
// rewritten whole on every append, which is right for "where is the run" and wrong for a measurement
|
|
@@ -23,101 +37,20 @@ const LEDGER_SUFFIX = '.jsonl'
|
|
|
23
37
|
const LINE_SEPARATOR = '\n'
|
|
24
38
|
// `followup`'s wait for CI — a stage of a lane's run that no `josh ship` stage is the whole of.
|
|
25
39
|
const CI_WAIT_STAGE = 'ci-wait'
|
|
40
|
+
// The part of `followup`'s waits CodeRabbit spent running or rate-limited, and the rate-limited part
|
|
41
|
+
// alone (joshuafolkken/kit#4574).
|
|
42
|
+
const CODERABBIT_WAIT_STAGE = 'coderabbit-wait'
|
|
43
|
+
const CODERABBIT_RATE_LIMIT_STAGE = 'coderabbit-rate-limit'
|
|
44
|
+
// A detached `josh ship`'s fast checks in the agent's own turn — not a resumable ship stage, since the
|
|
45
|
+
// supervised gate runs them again (joshuafolkken/kit#4382).
|
|
46
|
+
const PRE_DETACH_STAGE = 'pre-detach'
|
|
26
47
|
const LEDGER_FILE_MODE = 0o600
|
|
27
48
|
// The flags `detached-launch.ts` appends its log with, for the same deterministic shared-temp path.
|
|
28
49
|
const { O_APPEND, O_CREAT, O_NOFOLLOW, O_WRONLY } = constants
|
|
29
50
|
// eslint-disable-next-line no-bitwise -- POSIX open flags are a bit field; `||` here would be a bug
|
|
30
51
|
const APPEND_FLAGS = O_WRONLY | O_APPEND | O_CREAT | O_NOFOLLOW
|
|
31
52
|
|
|
32
|
-
const KIND =
|
|
33
|
-
MERGE: 'merge',
|
|
34
|
-
GATE: 'gate',
|
|
35
|
-
LOAD: 'load',
|
|
36
|
-
DISPATCH: 'dispatch',
|
|
37
|
-
STAGE: 'stage',
|
|
38
|
-
STOP: 'stop',
|
|
39
|
-
} as const
|
|
40
|
-
|
|
41
|
-
const merge_schema = z.object({ kind: z.literal(KIND.MERGE), at: z.string(), issue: z.number() })
|
|
42
|
-
const gate_schema = z.object({
|
|
43
|
-
kind: z.literal(KIND.GATE),
|
|
44
|
-
at: z.string(),
|
|
45
|
-
elapsed_ms: z.number(),
|
|
46
|
-
is_passed: z.boolean(),
|
|
47
|
-
// The unit suite's own duration, present when this gate ran it — the one
|
|
48
|
-
// record of a full vitest run `josh metrics` reads, so the suite is never timed twice.
|
|
49
|
-
unit_ms: z.number().optional(),
|
|
50
|
-
// The whole cores busy outside this gate, beyond the machine's baseline, at its start or its end —
|
|
51
|
-
// whichever was higher. Absent when the machine could not be read.
|
|
52
|
-
external_cores: z.number().optional(),
|
|
53
|
-
})
|
|
54
|
-
// `available_mb`, `swapped_mb` and `lanes` are optional because each read can fail on its own — a
|
|
55
|
-
// platform with no memory reading, a `git worktree` call that did not answer — and a sample is still
|
|
56
|
-
// worth its load. `swapped_mb` is `machine_capacity`'s counter, every page swapped since boot.
|
|
57
|
-
// Both memory fields were renamed with their meaning (joshuafolkken/kit#3593): an older row's
|
|
58
|
-
// `free_mb` / `swap_mb` are stripped on read, so the two measurements never share a column.
|
|
59
|
-
const process_kind_schema = z.object({
|
|
60
|
-
kind: z.string(),
|
|
61
|
-
cpu_percent: z.number(),
|
|
62
|
-
rss_mb: z.number(),
|
|
63
|
-
count: z.number(),
|
|
64
|
-
})
|
|
65
|
-
const load_schema = z.object({
|
|
66
|
-
kind: z.literal(KIND.LOAD),
|
|
67
|
-
at: z.string(),
|
|
68
|
-
load: z.number(),
|
|
69
|
-
available_mb: z.number().optional(),
|
|
70
|
-
swapped_mb: z.number().optional(),
|
|
71
|
-
lanes: z.number().optional(),
|
|
72
|
-
// The heaviest process kinds at the instant of the sample (`lane-process-load.ts`), so the load the
|
|
73
|
-
// core budget's ledger does not explain can be read back by what made it (joshuafolkken/kit#3874).
|
|
74
|
-
processes: z.array(process_kind_schema).optional(),
|
|
75
|
-
})
|
|
76
|
-
// A lane child started on `issue` — the instant its implementation is timed from.
|
|
77
|
-
const dispatch_schema = z.object({
|
|
78
|
-
kind: z.literal(KIND.DISPATCH),
|
|
79
|
-
at: z.string(),
|
|
80
|
-
issue: z.number(),
|
|
81
|
-
})
|
|
82
|
-
// One finished stage of a lane's run, passed or failed: `at` is its end and `elapsed_ms` its length, so
|
|
83
|
-
// its start is read from the two. `issue` is absent where the writer does not hold one — `followup`'s
|
|
84
|
-
// CI wait, which is timed on a path that fails before the issue is known.
|
|
85
|
-
const stage_schema = z.object({
|
|
86
|
-
kind: z.literal(KIND.STAGE),
|
|
87
|
-
at: z.string(),
|
|
88
|
-
stage: z.string(),
|
|
89
|
-
elapsed_ms: z.number(),
|
|
90
|
-
issue: z.number().optional(),
|
|
91
|
-
})
|
|
92
|
-
// A `josh ship` that stopped on `issue`: `reason` is the stage it stopped at, or `conflict` — the
|
|
93
|
-
// retrospective's stop reason. How long it stayed stopped is derived from the next ship stage, not
|
|
94
|
-
// recorded, so a resumed ship never has to know the stop it ends.
|
|
95
|
-
const stop_schema = z.object({
|
|
96
|
-
kind: z.literal(KIND.STOP),
|
|
97
|
-
at: z.string(),
|
|
98
|
-
issue: z.number(),
|
|
99
|
-
reason: z.string(),
|
|
100
|
-
})
|
|
101
|
-
const entry_schema = z.discriminatedUnion('kind', [
|
|
102
|
-
merge_schema,
|
|
103
|
-
gate_schema,
|
|
104
|
-
load_schema,
|
|
105
|
-
dispatch_schema,
|
|
106
|
-
stage_schema,
|
|
107
|
-
stop_schema,
|
|
108
|
-
])
|
|
109
|
-
|
|
110
|
-
type LedgerEntry = z.infer<typeof entry_schema>
|
|
111
|
-
type MergeEntry = z.infer<typeof merge_schema>
|
|
112
|
-
type GateEntry = z.infer<typeof gate_schema>
|
|
113
|
-
type LoadEntry = z.infer<typeof load_schema>
|
|
114
|
-
type DispatchEntry = z.infer<typeof dispatch_schema>
|
|
115
|
-
type StageEntry = z.infer<typeof stage_schema>
|
|
116
|
-
type StopEntry = z.infer<typeof stop_schema>
|
|
117
|
-
// What a finished gate reports; the ledger stamps the kind and the time.
|
|
118
|
-
type GateRecord = Omit<GateEntry, 'kind' | 'at'>
|
|
119
|
-
type StageRecord = Omit<StageEntry, 'kind' | 'at'>
|
|
120
|
-
type StopRecord = Omit<StopEntry, 'kind' | 'at'>
|
|
53
|
+
const { KIND, entry_schema } = lane_ledger_schema
|
|
121
54
|
|
|
122
55
|
function target_of(repository: string): string {
|
|
123
56
|
return stamp_file.stamp_path(LEDGER_PREFIX, repository, LEDGER_SUFFIX)
|
|
@@ -144,8 +77,8 @@ async function target(): Promise<string | undefined> {
|
|
|
144
77
|
|
|
145
78
|
// **Append, never rewrite** — `O_APPEND` keeps each short line whole across concurrent writers, and
|
|
146
79
|
// `O_NOFOLLOW` plus `stamp_file`'s ownership test keep a planted link or another account's file from
|
|
147
|
-
// receiving it.
|
|
148
|
-
function append(path: string, entry:
|
|
80
|
+
// receiving it. Any JSON-lines log takes it — the durable review stop log too (joshuafolkken/kit#4519).
|
|
81
|
+
function append(path: string, entry: object): void {
|
|
149
82
|
const descriptor = openSync(path, APPEND_FLAGS, LEDGER_FILE_MODE)
|
|
150
83
|
|
|
151
84
|
try {
|
|
@@ -194,6 +127,45 @@ async function record_stop(stop: StopRecord, path?: string): Promise<void> {
|
|
|
194
127
|
await record({ kind: KIND.STOP, at: now_iso(), ...stop }, path)
|
|
195
128
|
}
|
|
196
129
|
|
|
130
|
+
async function record_overlap(overlap: OverlapRecord, path?: string): Promise<void> {
|
|
131
|
+
await record({ kind: KIND.OVERLAP, at: now_iso(), ...overlap }, path)
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
// `waiting` is written only when the offer named issues, so a hold that waited on none stays one short line.
|
|
135
|
+
async function record_held(held: HeldRecord, path?: string): Promise<void> {
|
|
136
|
+
const waiting = held.waiting ?? []
|
|
137
|
+
const named = waiting.length > 0 ? { waiting: [...waiting] } : {}
|
|
138
|
+
|
|
139
|
+
await record({ kind: KIND.HELD, at: now_iso(), reason: held.reason, ...named }, path)
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
async function record_released(path?: string): Promise<void> {
|
|
143
|
+
await record({ kind: KIND.RELEASED, at: now_iso() }, path)
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
async function record_offerable(is_offerable: boolean, path?: string): Promise<void> {
|
|
147
|
+
await record({ kind: KIND.OFFERABLE, at: now_iso(), is_offerable }, path)
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
async function record_round_two(round_two: RoundTwoRecord, path?: string): Promise<void> {
|
|
151
|
+
await record({ kind: KIND.ROUND_TWO, at: now_iso(), ...round_two }, path)
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
async function record_core_wait(wait: CoreWaitRecord, path?: string): Promise<void> {
|
|
155
|
+
await record({ kind: KIND.CORE_WAIT, at: now_iso(), ...wait }, path)
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
async function record_unit_files(
|
|
159
|
+
files: ReadonlyArray<UnitFileRecord>,
|
|
160
|
+
path?: string,
|
|
161
|
+
): Promise<void> {
|
|
162
|
+
await record({ kind: KIND.UNIT_FILES, at: now_iso(), files: [...files] }, path)
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
async function record_test_related(run: TestRelatedRecord, path?: string): Promise<void> {
|
|
166
|
+
await record({ kind: KIND.TEST_RELATED, at: now_iso(), ...run }, path)
|
|
167
|
+
}
|
|
168
|
+
|
|
197
169
|
function parse_line(line: string): LedgerEntry | undefined {
|
|
198
170
|
return entry_schema.safeParse(json_value.parse_or_undefined(line)).data
|
|
199
171
|
}
|
|
@@ -202,9 +174,7 @@ function is_present(entry: LedgerEntry | undefined): entry is LedgerEntry {
|
|
|
202
174
|
return entry !== undefined
|
|
203
175
|
}
|
|
204
176
|
|
|
205
|
-
|
|
206
|
-
// whole ledger unreadable, and an absent or unowned file is an empty ledger.
|
|
207
|
-
function read_entries(path: string): ReadonlyArray<LedgerEntry> {
|
|
177
|
+
function parse_entries(path: string): ReadonlyArray<LedgerEntry> {
|
|
208
178
|
const raw = stamp_file.read_stamp_text(path)
|
|
209
179
|
|
|
210
180
|
if (raw === undefined) return []
|
|
@@ -215,20 +185,61 @@ function read_entries(path: string): ReadonlyArray<LedgerEntry> {
|
|
|
215
185
|
.filter(is_present)
|
|
216
186
|
}
|
|
217
187
|
|
|
188
|
+
// Each ledger's entries, parsed again only once the file itself has changed (joshuafolkken/kit#4263).
|
|
189
|
+
const parsed_ledgers = stamped_memo.create<ReadonlyArray<LedgerEntry>>()
|
|
190
|
+
|
|
191
|
+
// Every entry, oldest first. A malformed line — a write cut short — is skipped rather than making the
|
|
192
|
+
// whole ledger unreadable, and an absent or unowned file is an empty ledger.
|
|
193
|
+
function read_entries(path: string): ReadonlyArray<LedgerEntry> {
|
|
194
|
+
return parsed_ledgers.of(path, stamped_memo.file_stamp(path), () => parse_entries(path))
|
|
195
|
+
}
|
|
196
|
+
|
|
218
197
|
const lane_ledger = {
|
|
219
198
|
CI_WAIT_STAGE,
|
|
199
|
+
CODERABBIT_RATE_LIMIT_STAGE,
|
|
200
|
+
CODERABBIT_WAIT_STAGE,
|
|
220
201
|
KIND,
|
|
202
|
+
PRE_DETACH_STAGE,
|
|
221
203
|
append,
|
|
222
204
|
read_entries,
|
|
223
205
|
record,
|
|
206
|
+
record_core_wait,
|
|
224
207
|
record_dispatch,
|
|
225
208
|
record_gate,
|
|
209
|
+
record_held,
|
|
210
|
+
record_released,
|
|
226
211
|
record_merge,
|
|
212
|
+
record_overlap,
|
|
213
|
+
record_offerable,
|
|
214
|
+
record_round_two,
|
|
227
215
|
record_stage,
|
|
228
216
|
record_stop,
|
|
217
|
+
record_test_related,
|
|
218
|
+
record_unit_files,
|
|
229
219
|
target,
|
|
230
220
|
target_of,
|
|
231
221
|
}
|
|
232
222
|
|
|
233
|
-
export type {
|
|
223
|
+
export type {
|
|
224
|
+
CoreWaitEntry,
|
|
225
|
+
CoreWaitRecord,
|
|
226
|
+
DispatchEntry,
|
|
227
|
+
GateCheckRecord,
|
|
228
|
+
GateEntry,
|
|
229
|
+
HeldEntry,
|
|
230
|
+
LedgerEntry,
|
|
231
|
+
LoadEntry,
|
|
232
|
+
MergeEntry,
|
|
233
|
+
OfferableEntry,
|
|
234
|
+
OverlapEntry,
|
|
235
|
+
OverlapRecord,
|
|
236
|
+
RoundTwoEntry,
|
|
237
|
+
StageEntry,
|
|
238
|
+
StopEntry,
|
|
239
|
+
StopRecord,
|
|
240
|
+
TestRelatedEntry,
|
|
241
|
+
TestRelatedRecord,
|
|
242
|
+
UnitFileRecord,
|
|
243
|
+
UnitFilesEntry,
|
|
244
|
+
} from './lane-ledger-schema'
|
|
234
245
|
export { lane_ledger }
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
#!/usr/bin/env tsx
|
|
2
2
|
import { fileURLToPath } from 'node:url'
|
|
3
|
-
import { backlog_ready } from '#scripts/backlog/backlog-ready'
|
|
3
|
+
import { backlog_ready, type LaneUse } from '#scripts/backlog/backlog-ready'
|
|
4
|
+
import { session_cite } from '#scripts/issue/session-cite'
|
|
4
5
|
import { cli_flags } from '#scripts/lib/cli-flags'
|
|
5
6
|
import { lane_capacity, type LimitChoice } from './lane-capacity'
|
|
6
7
|
import { lane_limit_override } from './lane-limit-override'
|
|
8
|
+
import { lane_state } from './lane-state'
|
|
7
9
|
|
|
8
10
|
// `josh lane:limit [<limit>] [--reset]` — change a live `backlogrun`'s lane limit without stopping it.
|
|
9
11
|
// A running parent keeps the environment it started with, so `JOSH_LANE_LIMIT`
|
|
@@ -37,13 +39,13 @@ interface LimitPorts {
|
|
|
37
39
|
read_override: () => Promise<number | undefined>
|
|
38
40
|
write_override: (limit: number | undefined) => Promise<boolean>
|
|
39
41
|
emit_raise: (text: string) => Promise<void>
|
|
40
|
-
|
|
42
|
+
lane_use: () => Promise<LaneUse>
|
|
41
43
|
}
|
|
42
44
|
|
|
43
45
|
interface LimitStatus {
|
|
44
46
|
limit: number
|
|
45
47
|
override: number | undefined
|
|
46
|
-
|
|
48
|
+
use: LaneUse
|
|
47
49
|
}
|
|
48
50
|
|
|
49
51
|
const SHOW: LimitRequest = { kind: 'show' }
|
|
@@ -55,7 +57,7 @@ const DEFAULT_PORTS: LimitPorts = {
|
|
|
55
57
|
read_override: lane_limit_override.read_override,
|
|
56
58
|
write_override: lane_limit_override.write_override,
|
|
57
59
|
emit_raise: lane_limit_override.emit_raise,
|
|
58
|
-
|
|
60
|
+
lane_use: backlog_ready.lane_use,
|
|
59
61
|
}
|
|
60
62
|
|
|
61
63
|
function refuse(message: string): number {
|
|
@@ -96,11 +98,21 @@ function limit_text(limit: number): string {
|
|
|
96
98
|
: `${String(seated)} (${String(limit)} capped at the seats)`
|
|
97
99
|
}
|
|
98
100
|
|
|
101
|
+
// The lanes with no state record, counted in use since their state is unknown.
|
|
102
|
+
function unknown_text(unknown: ReadonlyArray<string>): string {
|
|
103
|
+
if (unknown.length === 0) return ''
|
|
104
|
+
|
|
105
|
+
const issues = unknown.map((issue) => session_cite.issue(issue)).join(' ')
|
|
106
|
+
|
|
107
|
+
return ` · ${issues}: ${lane_state.NO_STATE_HINT}`
|
|
108
|
+
}
|
|
109
|
+
|
|
99
110
|
function status_line(status: LimitStatus): string {
|
|
100
111
|
const source = status.override === undefined ? lane_capacity.LANE_LIMIT_KEY : OVERRIDE_SOURCE
|
|
101
|
-
const
|
|
112
|
+
const { occupied, seated } = status.use
|
|
113
|
+
const free = lane_capacity.free_lanes(status.limit, occupied, seated)
|
|
102
114
|
|
|
103
|
-
return `lane limit ${limit_text(status.limit)} (${source}) · in use ${String(
|
|
115
|
+
return `lane limit ${limit_text(status.limit)} (${source}) · in use ${String(occupied)} · free ${String(free)}${unknown_text(status.use.unknown)}`
|
|
104
116
|
}
|
|
105
117
|
|
|
106
118
|
async function show(ports: LimitPorts): Promise<number> {
|
|
@@ -110,9 +122,7 @@ async function show(ports: LimitPorts): Promise<number> {
|
|
|
110
122
|
|
|
111
123
|
const override = await ports.read_override()
|
|
112
124
|
|
|
113
|
-
console.info(
|
|
114
|
-
status_line({ limit: choice.limit, override, in_use: await ports.live_lane_count() }),
|
|
115
|
-
)
|
|
125
|
+
console.info(status_line({ limit: choice.limit, override, use: await ports.lane_use() }))
|
|
116
126
|
|
|
117
127
|
return SUCCESS_EXIT_CODE
|
|
118
128
|
}
|
|
@@ -1,14 +1,26 @@
|
|
|
1
1
|
#!/usr/bin/env tsx
|
|
2
2
|
import { setInterval as every } from 'node:timers/promises'
|
|
3
3
|
import { fileURLToPath } from 'node:url'
|
|
4
|
+
import { cost_transcript } from '#scripts/cost-runtime/cost-transcript'
|
|
4
5
|
import { cli_flags } from '#scripts/lib/cli-flags'
|
|
6
|
+
import { MS_PER_SECOND } from '#scripts/lib/timeouts'
|
|
7
|
+
import { run_event_stream, type RunEvent } from '#scripts/run/event/run-event-stream'
|
|
8
|
+
import { run_event_stream_emit } from '#scripts/run/event/run-event-stream-emit'
|
|
5
9
|
import { lane_capacity } from './lane-capacity'
|
|
10
|
+
import { lane_check_stats } from './lane-check-stats'
|
|
11
|
+
import { lane_core_wait_stats } from './lane-core-wait-stats'
|
|
12
|
+
import { lane_gap_stats } from './lane-gap-stats'
|
|
13
|
+
import { lane_held_stats } from './lane-held-stats'
|
|
6
14
|
import { lane_ledger } from './lane-ledger'
|
|
7
15
|
import { lane_process_stats } from './lane-process-stats'
|
|
16
|
+
import { lane_round_two_stats } from './lane-round-two-stats'
|
|
8
17
|
import { lane_sampler, type MeasureContext } from './lane-sampler'
|
|
9
18
|
import { lane_stage_stats } from './lane-stage-stats'
|
|
10
|
-
import { lane_stats } from './lane-stats'
|
|
19
|
+
import { lane_stats, type StatsWindow } from './lane-stats'
|
|
11
20
|
import { lane_stop_stats } from './lane-stop-stats'
|
|
21
|
+
import { lane_test_related_stats } from './lane-test-related-stats'
|
|
22
|
+
import type { ToolCall } from './lane-transcript-calls'
|
|
23
|
+
import { lane_transcript_stats } from './lane-transcript-stats'
|
|
12
24
|
|
|
13
25
|
// `josh lane:sample` / `josh lane:stats` — the lane-limit measurement.
|
|
14
26
|
//
|
|
@@ -22,7 +34,6 @@ import { lane_stop_stats } from './lane-stop-stats'
|
|
|
22
34
|
|
|
23
35
|
const ARGV_OFFSET = 2
|
|
24
36
|
const FAILURE_EXIT_CODE = 1
|
|
25
|
-
const MS_PER_SECOND = 1000
|
|
26
37
|
const SAMPLE_VERB = 'sample'
|
|
27
38
|
const STATS_VERB = 'stats'
|
|
28
39
|
const USAGE = [
|
|
@@ -101,6 +112,45 @@ async function read_ledger(
|
|
|
101
112
|
return path === undefined ? [] : lane_ledger.read_entries(path)
|
|
102
113
|
}
|
|
103
114
|
|
|
115
|
+
// The run's event stream, read for the parks that end a stop's wait.
|
|
116
|
+
async function read_events(context: MeasureContext): Promise<ReadonlyArray<RunEvent>> {
|
|
117
|
+
if (context.events_path !== undefined) return run_event_stream.read_events(context.events_path)
|
|
118
|
+
|
|
119
|
+
return await run_event_stream_emit.all_events()
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
// Every lane's transcript directory under this checkout's lane root, read from a lane or the main checkout.
|
|
123
|
+
function transcript_directories(context: MeasureContext): ReadonlyArray<string> {
|
|
124
|
+
if (context.transcript_directories !== undefined) return context.transcript_directories
|
|
125
|
+
|
|
126
|
+
const main_cwd = cost_transcript.session_cwd(process.cwd())
|
|
127
|
+
|
|
128
|
+
return cost_transcript.lane_transcript_directories(main_cwd, cost_transcript.home_directory())
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
interface PeriodRecords {
|
|
132
|
+
entries: ReturnType<typeof lane_ledger.read_entries>
|
|
133
|
+
events: ReadonlyArray<RunEvent>
|
|
134
|
+
calls: ReadonlyArray<ToolCall>
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
// The tables under the period's row, in the order `lane:stats` prints them.
|
|
138
|
+
function tables_of({ entries, events, calls }: PeriodRecords, window: StatsWindow): Array<string> {
|
|
139
|
+
return [
|
|
140
|
+
lane_stage_stats.table(entries, window),
|
|
141
|
+
lane_stop_stats.table(entries, window, events),
|
|
142
|
+
lane_gap_stats.table(entries, window, events),
|
|
143
|
+
lane_round_two_stats.table(entries, window),
|
|
144
|
+
lane_held_stats.table(entries, window),
|
|
145
|
+
lane_core_wait_stats.table(entries, window),
|
|
146
|
+
lane_process_stats.table(entries, window),
|
|
147
|
+
lane_check_stats.table(entries, window),
|
|
148
|
+
lane_test_related_stats.table(entries, window),
|
|
149
|
+
lane_test_related_stats.trigger_table(entries, window),
|
|
150
|
+
lane_transcript_stats.table(calls, window),
|
|
151
|
+
]
|
|
152
|
+
}
|
|
153
|
+
|
|
104
154
|
async function stats_command(
|
|
105
155
|
rest: ReadonlyArray<string>,
|
|
106
156
|
context: MeasureContext,
|
|
@@ -114,15 +164,13 @@ async function stats_command(
|
|
|
114
164
|
const label = { limit: await limit_label(values.limit), period_days }
|
|
115
165
|
const entries = await read_ledger(context)
|
|
116
166
|
const row = lane_stats.row(entries, window, label)
|
|
167
|
+
const records = {
|
|
168
|
+
entries,
|
|
169
|
+
events: await read_events(context),
|
|
170
|
+
calls: lane_transcript_stats.read_calls(transcript_directories(context), window),
|
|
171
|
+
}
|
|
117
172
|
|
|
118
|
-
console.info(
|
|
119
|
-
[
|
|
120
|
-
`${lane_stats.header()}\n${row}`,
|
|
121
|
-
lane_stage_stats.table(entries, window),
|
|
122
|
-
lane_stop_stats.table(entries, window),
|
|
123
|
-
lane_process_stats.table(entries, window),
|
|
124
|
-
].join('\n\n'),
|
|
125
|
-
)
|
|
173
|
+
console.info([`${lane_stats.header()}\n${row}`, ...tables_of(records, window)].join('\n\n'))
|
|
126
174
|
|
|
127
175
|
return 0
|
|
128
176
|
}
|
|
@@ -13,6 +13,7 @@ import { lane_paths } from './lane-paths'
|
|
|
13
13
|
import { lane_registry, type LaneInfo } from './lane-registry'
|
|
14
14
|
import { lane_seed_policy } from './lane-seed'
|
|
15
15
|
import { lane_start_point } from './lane-start-point'
|
|
16
|
+
import { lane_state } from './lane-state'
|
|
16
17
|
|
|
17
18
|
// Opening a lane: one linked work tree, one branch, one port seed, and the dependencies to run in it.
|
|
18
19
|
//
|
|
@@ -256,6 +257,13 @@ async function clear_the_way(
|
|
|
256
257
|
await lane_leftover.reclaim(lane_paths.lane_directory(root, issue))
|
|
257
258
|
}
|
|
258
259
|
|
|
260
|
+
// The lane's state record starts here, so no lane opened from now on is without one.
|
|
261
|
+
async function opened(lane: LaneInfo): Promise<OpenOutcome> {
|
|
262
|
+
await lane_state.record_change({ issue: lane.issue, state: 'open', command: 'lane:open' })
|
|
263
|
+
|
|
264
|
+
return { kind: 'opened', lane }
|
|
265
|
+
}
|
|
266
|
+
|
|
259
267
|
/**
|
|
260
268
|
* Open the lane for `issue`, or say why it was not opened.
|
|
261
269
|
*
|
|
@@ -283,7 +291,7 @@ async function open_lane(issue: string): Promise<OpenOutcome> {
|
|
|
283
291
|
|
|
284
292
|
await materialize(plan, repository_root)
|
|
285
293
|
|
|
286
|
-
return
|
|
294
|
+
return await opened(plan.lane)
|
|
287
295
|
}
|
|
288
296
|
|
|
289
297
|
const lane_open = {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { has_parked_label } from '#scripts/issue/issue-labels'
|
|
2
2
|
import { issue_state_cli } from '#scripts/issue/issue-state-cli'
|
|
3
3
|
|
|
4
|
-
// Whether an issue is parked for a person —
|
|
4
|
+
// Whether an issue is parked for a person — any park label (`PARKED_LABELS`) — read live, so a session a
|
|
5
5
|
// lane's broker would start for it is refused once the run has parked it (joshuafolkken/kit#3878).
|
|
6
6
|
//
|
|
7
7
|
// **An issue whose state cannot be read is not parked**: the read gates every brokered review, so
|
|
@@ -10,7 +10,7 @@ import { issue_state_cli } from '#scripts/issue/issue-state-cli'
|
|
|
10
10
|
async function is_parked(issue: string): Promise<boolean> {
|
|
11
11
|
const read = await issue_state_cli.read_issue(issue)
|
|
12
12
|
|
|
13
|
-
return read.kind === 'state' &&
|
|
13
|
+
return read.kind === 'state' && has_parked_label(read.state.labels)
|
|
14
14
|
}
|
|
15
15
|
|
|
16
16
|
const lane_parked = { is_parked }
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
import { fileURLToPath } from 'node:url'
|
|
3
|
+
import { issue_cite } from '#scripts/issue/issue-cite'
|
|
4
|
+
import { issue_number_shape } from '#scripts/issue/issue-number-shape'
|
|
5
|
+
import { run_event_stream } from '#scripts/run/event/run-event-stream'
|
|
6
|
+
import { run_event_stream_emit } from '#scripts/run/event/run-event-stream-emit'
|
|
7
|
+
import { lane_pause, type LaneSignalled } from './lane-pause'
|
|
8
|
+
import type { LaneProcesses } from './lane-reap'
|
|
9
|
+
import { lane_registry } from './lane-registry'
|
|
10
|
+
import { lane_state } from './lane-state'
|
|
11
|
+
|
|
12
|
+
// `josh lane:pause <issue> | --all` and `josh lane:resume <issue> | --all` — one script told apart by
|
|
13
|
+
// the verb the registry passes first. A named lane with no child process to signal exits non-zero, so a
|
|
14
|
+
// caller never takes a pause that stopped nothing as done — a detached resident signalled alone counts
|
|
15
|
+
// as nothing. A lane whose detached processes could not be read exits non-zero too, since a resume
|
|
16
|
+
// may have left one of them stopped. A lane whose child was signalled has the change written to its state record and to the
|
|
17
|
+
// run's event stream, so who halted it is on record.
|
|
18
|
+
|
|
19
|
+
const ARGV_OFFSET = 2
|
|
20
|
+
const SUCCESS_EXIT_CODE = 0
|
|
21
|
+
const FAILURE_EXIT_CODE = 1
|
|
22
|
+
const ALL_FLAG = '--all'
|
|
23
|
+
const USAGE = [
|
|
24
|
+
'Usage: josh lane:pause <issue-number> | josh lane:pause --all',
|
|
25
|
+
' josh lane:resume <issue-number> | josh lane:resume --all',
|
|
26
|
+
].join('\n')
|
|
27
|
+
|
|
28
|
+
const VERBS = {
|
|
29
|
+
pause: { act: 'pause_lane', done: 'paused', state: 'paused' },
|
|
30
|
+
resume: { act: 'resume_lane', done: 'resumed', state: 'running' },
|
|
31
|
+
} as const
|
|
32
|
+
|
|
33
|
+
type Verb = keyof typeof VERBS
|
|
34
|
+
|
|
35
|
+
function is_verb(value: string | undefined): value is Verb {
|
|
36
|
+
return value === 'pause' || value === 'resume'
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
async function lanes_of(target: ReadonlyArray<string>): Promise<Array<LaneProcesses> | undefined> {
|
|
40
|
+
const [issue, ...rest] = target
|
|
41
|
+
|
|
42
|
+
if (issue === undefined || rest.length > 0) return undefined
|
|
43
|
+
if (issue === ALL_FLAG) return await lane_pause.open_lanes()
|
|
44
|
+
if (!issue_number_shape.is_issue_number(issue)) return undefined
|
|
45
|
+
|
|
46
|
+
return [await lane_registry.lane_location(issue)]
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function outcome_of(verb: Verb, result: LaneSignalled): string {
|
|
50
|
+
const { done } = VERBS[verb]
|
|
51
|
+
const count = String(result.signalled.length)
|
|
52
|
+
|
|
53
|
+
if (result.signalled.length === 0) return `no child process running — nothing ${done}`
|
|
54
|
+
|
|
55
|
+
if (result.child.length === 0) {
|
|
56
|
+
return `no child process running — ${done} ${count} detached process(es), state unchanged`
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
return `${done} ${count} process(es)`
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
const UNREAD_NOTE =
|
|
63
|
+
' — could not read the detached processes (lsof or ps failed); any of them was missed'
|
|
64
|
+
|
|
65
|
+
// One line per lane: how many of its processes were signalled, and whether its residents went unread.
|
|
66
|
+
function report(verb: Verb, issue: string, result: LaneSignalled): void {
|
|
67
|
+
const note = result.is_unread ? UNREAD_NOTE : ''
|
|
68
|
+
|
|
69
|
+
console.info(`lane:${verb} ${issue_cite.plain(issue)}: ${outcome_of(verb, result)}${note}`)
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
async function record(verb: Verb, issue: string): Promise<void> {
|
|
73
|
+
const command = `lane:${verb}`
|
|
74
|
+
|
|
75
|
+
await lane_state.record_change({ issue, state: VERBS[verb].state, command })
|
|
76
|
+
await run_event_stream_emit.emit(
|
|
77
|
+
run_event_stream.EVENT_KIND.LANE_STATE,
|
|
78
|
+
`${issue_cite.plain(issue)} ${VERBS[verb].done} by ${command}`,
|
|
79
|
+
)
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
async function settle(verb: Verb, lane: LaneProcesses): Promise<LaneSignalled> {
|
|
83
|
+
const result = lane_pause[VERBS[verb].act](lane)
|
|
84
|
+
|
|
85
|
+
report(verb, lane.issue, result)
|
|
86
|
+
if (result.child.length > 0) await record(verb, lane.issue)
|
|
87
|
+
|
|
88
|
+
return result
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// A named lane with no child signalled fails; any lane whose residents went unread fails.
|
|
92
|
+
function is_failed(result: LaneSignalled, is_named: boolean): boolean {
|
|
93
|
+
return result.is_unread || (is_named && result.child.length === 0)
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
async function apply(
|
|
97
|
+
verb: Verb,
|
|
98
|
+
lanes: ReadonlyArray<LaneProcesses>,
|
|
99
|
+
is_named: boolean,
|
|
100
|
+
): Promise<number> {
|
|
101
|
+
const results = await Promise.all(lanes.map(async (lane) => await settle(verb, lane)))
|
|
102
|
+
|
|
103
|
+
return results.some((result) => is_failed(result, is_named))
|
|
104
|
+
? FAILURE_EXIT_CODE
|
|
105
|
+
: SUCCESS_EXIT_CODE
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
function report_usage(): number {
|
|
109
|
+
console.error(USAGE)
|
|
110
|
+
|
|
111
|
+
return FAILURE_EXIT_CODE
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
async function run(argv: ReadonlyArray<string>): Promise<number> {
|
|
115
|
+
const [verb, ...target] = argv
|
|
116
|
+
if (!is_verb(verb)) return report_usage()
|
|
117
|
+
const lanes = await lanes_of(target)
|
|
118
|
+
|
|
119
|
+
return lanes === undefined ? report_usage() : await apply(verb, lanes, target[0] !== ALL_FLAG)
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
async function main(argv: ReadonlyArray<string>): Promise<void> {
|
|
123
|
+
process.exitCode = await run(argv)
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
const lane_pause_cli = { run }
|
|
127
|
+
|
|
128
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
|
|
129
|
+
|
|
130
|
+
export { lane_pause_cli }
|