@joshuafolkken/kit 1.1514.0 → 1.2114.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/agents/reviewer-verification.md +19 -0
- package/.claude/agents/reviewer.md +19 -0
- package/.claude/settings.json +5 -6
- package/.claude/skills/dependency-update/SKILL.md +9 -10
- package/.claude/skills/epic-commands/SKILL.md +26 -65
- package/.claude/skills/epic-commands/epic-bundle.md +3 -1
- package/.claude/skills/workflow-commands/SKILL.md +11 -11
- package/.claude/skills/workflow-commands/background-commands.md +13 -10
- package/.claude/skills/workflow-commands/backlogrun-child.md +12 -8
- package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +7 -25
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +18 -14
- package/.claude/skills/workflow-commands/backlogrun-park.md +18 -24
- package/.claude/skills/workflow-commands/backlogrun-progress.md +4 -5
- package/.claude/skills/workflow-commands/backlogrun-recovery.md +6 -6
- package/.claude/skills/workflow-commands/backlogrun-steps.md +12 -11
- package/.claude/skills/workflow-commands/backlogrun.md +1 -1
- package/.claude/skills/workflow-commands/chain-rule.md +43 -28
- package/.claude/skills/workflow-commands/delegation.md +11 -10
- package/.claude/skills/workflow-commands/entry-sequence.md +10 -10
- package/.claude/skills/workflow-commands/followup.md +16 -36
- package/.claude/skills/workflow-commands/fullrun-steps.md +38 -47
- package/.claude/skills/workflow-commands/fullrun.md +3 -3
- package/.claude/skills/workflow-commands/halfrun.md +17 -25
- package/.claude/skills/workflow-commands/issue-comments.md +25 -16
- package/.claude/skills/workflow-commands/issue-fold-existing.md +2 -1
- package/.claude/skills/workflow-commands/issue-scout.md +2 -2
- package/.claude/skills/workflow-commands/kickoff.md +24 -23
- package/.claude/skills/workflow-commands/latest-gate.md +7 -12
- package/.claude/skills/workflow-commands/needs-human-review.md +9 -14
- package/.claude/skills/workflow-commands/observation-filing.md +4 -36
- package/.claude/skills/workflow-commands/observation-ledger.md +6 -4
- package/.claude/skills/workflow-commands/pre-gate-cut.md +22 -37
- package/.claude/skills/workflow-commands/prerequisite.md +11 -16
- package/.claude/skills/workflow-commands/progress-watcher.md +1 -1
- package/.claude/skills/workflow-commands/prrun.md +3 -7
- package/.claude/skills/workflow-commands/retrospective.md +2 -2
- package/.claude/skills/workflow-commands/split-assessment.md +15 -1
- package/.claude/skills/workflow-commands/working-tree-hold.md +9 -9
- package/.codex/hooks.json +5 -5
- package/.github/actions/setup-node/action.yml +9 -0
- package/.github/actions/setup-pnpm/action.yml +10 -17
- package/.github/dependabot.yml +32 -0
- package/.github/release.yml +0 -2
- package/.github/workflows/auto-tag.yml +45 -0
- package/.github/workflows/ci.yml +267 -17
- package/.github/workflows/dependabot-auto-merge.yml +63 -4
- package/.github/workflows/production.yml +8 -0
- package/.github/workflows/publish.yml +67 -46
- package/.github/workflows/sonar-qube.yml +1 -0
- package/.prettierignore +2 -0
- package/.vscode/settings.json +19 -0
- package/.vscode/tasks.json +1 -2
- package/CLAUDE.md +7 -18
- package/README.md +4 -2
- package/SECURITY.md +3 -3
- package/dist/CLAUDE.md +7 -18
- package/dist/commands/document-read-cli.js +883 -0
- package/dist/commands/{document-section-cli.js → document-section-main.js} +81 -38
- package/dist/commands/read-set-cli.js +1927 -0
- package/dist/commands/run-prep-main.js +21174 -0
- package/dist/commands/run-step-cli.js +27733 -0
- package/dist/config-merge/index.js +5 -1
- package/dist/hooks/audit-provision.js +39 -36
- package/dist/hooks/chunk-3GKE653K.js +6204 -0
- package/dist/hooks/chunk-45CJJOO7.js +1243 -0
- package/dist/hooks/chunk-5PM2JRGV.js +7780 -0
- package/dist/hooks/chunk-7SIUNQXK.js +3591 -0
- package/dist/hooks/chunk-CQD4LJE6.js +4858 -0
- package/dist/hooks/{chunk-723HKZO5.js → chunk-OPSRGWFU.js} +1 -1
- package/dist/hooks/chunk-UJ3FPMMM.js +628 -0
- package/dist/hooks/chunk-VVNYJWEI.js +30 -0
- package/dist/hooks/chunk-Z6DQJKH3.js +2806 -0
- package/dist/hooks/codex-hook-adapter.js +10 -22
- package/dist/hooks/format-edited.js +4 -6
- package/dist/hooks/inputs.json +460 -308
- package/dist/hooks/pretool-guard.js +8 -25
- package/dist/hooks/session-lang.js +135 -299
- package/dist/hooks/stop-guard.js +6496 -1799
- package/dist/josh.js +7412 -4228
- package/dist/self-sync-guard/index.js +74 -10
- package/dist/version/index.js +276 -407
- package/eslint/base.js +1 -1
- package/eslint/rules/comment-why-only.js +108 -0
- package/lefthook/base.yml +3 -1
- package/package.json +23 -54
- package/pnpm-workspace.yaml +4 -2
- package/prompts/coding-standards.md +2 -2
- package/prompts/collaboration-workflow/file-edits.md +14 -17
- package/prompts/collaboration-workflow/issue-citation.md +0 -4
- package/prompts/collaboration-workflow/issue-template.md +54 -18
- package/prompts/collaboration-workflow/lane-instructions.md +3 -2
- package/prompts/collaboration-workflow/measurement.md +44 -0
- package/prompts/collaboration-workflow/operating-rules.md +15 -8
- package/prompts/collaboration-workflow/output-bounds.md +6 -7
- package/prompts/collaboration-workflow/plan-comment.md +3 -42
- package/prompts/collaboration-workflow/principles.md +14 -0
- package/prompts/collaboration-workflow/report-format.md +31 -60
- package/prompts/collaboration-workflow/residency.md +3 -2
- package/prompts/collaboration-workflow/rule-delivery.md +13 -1
- package/prompts/collaboration-workflow/shell-body.md +6 -16
- package/prompts/collaboration-workflow/turn-batching.md +0 -2
- package/prompts/collaboration-workflow/upstream-interrupt.md +15 -5
- package/prompts/collaboration-workflow/wip-cap.md +4 -2
- package/prompts/collaboration-workflow.md +3 -7
- package/prompts/refactoring.md +1 -1
- package/prompts/review-rubric.md +9 -2
- package/prompts/review.md +65 -36
- package/prompts/testing-guide.md +9 -43
- package/scripts/agent/agent-argv.ts +14 -16
- package/scripts/agent/agent-event.ts +15 -15
- package/scripts/agent/agent-exit-record.ts +13 -1
- package/scripts/agent/agent-provider.ts +138 -0
- package/scripts/agent/agent-role-profile.ts +108 -156
- package/scripts/agent/agent-safe-text.ts +20 -5
- package/scripts/agent/api-auth.ts +41 -0
- package/scripts/agent/api-outage.ts +1 -1
- package/scripts/agent/api-usage-limit.ts +65 -0
- package/scripts/agent/claude-agent-argv.ts +19 -9
- package/scripts/agent/codex-agent-argv.ts +118 -22
- package/scripts/agent/usage-limit-reset.ts +179 -0
- package/scripts/auth/claude-token-output.ts +2 -2
- package/scripts/auto-ok/auto-ok-author.ts +53 -0
- package/scripts/auto-ok/auto-ok-cli.ts +25 -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 +2 -3
- package/scripts/backlog/backlog-defect-priority.ts +5 -4
- 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 +118 -28
- package/scripts/backlog/backlog-drive-hold.ts +162 -0
- package/scripts/backlog/backlog-drive-idle.ts +161 -0
- package/scripts/backlog/backlog-drive-judge.ts +25 -0
- package/scripts/backlog/backlog-drive-launch-pass.ts +90 -0
- package/scripts/backlog/backlog-drive-launch.ts +8 -2
- package/scripts/backlog/backlog-drive-memory.ts +126 -0
- package/scripts/backlog/backlog-drive-named-offer.ts +73 -35
- package/scripts/backlog/backlog-drive-named.ts +81 -13
- package/scripts/backlog/backlog-drive-offer-argv.ts +3 -8
- package/scripts/backlog/backlog-drive-paused.ts +170 -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 +96 -131
- package/scripts/backlog/backlog-gate-scope.ts +61 -0
- package/scripts/backlog/backlog-measure-close.ts +112 -0
- package/scripts/backlog/backlog-next-main.ts +16 -0
- package/scripts/backlog/backlog-next-shared.ts +73 -0
- package/scripts/backlog/backlog-next.ts +78 -56
- package/scripts/backlog/backlog-occupied.ts +52 -39
- 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 +62 -10
- package/scripts/backlog/backlog-plan-cli.ts +4 -1
- package/scripts/backlog/backlog-plan-comment.ts +81 -0
- package/scripts/backlog/backlog-plan-read.ts +22 -5
- package/scripts/backlog/backlog-plan.ts +18 -4
- package/scripts/backlog/backlog-pool.ts +60 -22
- package/scripts/backlog/backlog-rank.ts +70 -15
- package/scripts/backlog/backlog-ready.ts +112 -30
- package/scripts/backlog/backlog-stalled-detect.ts +110 -36
- package/scripts/backlog/backlog-stalled.ts +52 -16
- package/scripts/backlog/backlog-wait-cause.ts +86 -0
- package/scripts/backlog/backlog-waves.ts +56 -15
- package/scripts/backlog/backlogrun-args.ts +19 -7
- package/scripts/backlog/backlogrun-cli.ts +19 -5
- package/scripts/backlog/backlogrun-launch.ts +13 -4
- 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/context-cut-payback.ts +27 -25
- package/scripts/cost-runtime/cost-blocks.ts +22 -37
- package/scripts/cost-runtime/cost-cli.ts +67 -29
- package/scripts/cost-runtime/cost-main.ts +12 -0
- package/scripts/cost-runtime/cost-pricing.ts +9 -0
- package/scripts/cost-runtime/cost-transcript.ts +1 -0
- package/scripts/cost-runtime/cost-verdict.ts +4 -1
- package/scripts/delegation/delegation-policy.ts +18 -5
- package/scripts/delegation/duplicate-read-guard.ts +1 -8
- package/scripts/delegation/investigation-guard.ts +12 -8
- package/scripts/delegation/investigation-reads.ts +48 -27
- package/scripts/dependabot/dependabot-cooldown.ts +195 -0
- package/scripts/discovery/repo-discovery.ts +24 -6
- package/scripts/discovery/repo-party.ts +80 -20
- package/scripts/discovery/session-owner-pin.ts +51 -0
- package/scripts/doctor/doctor-consumer.ts +2 -5
- package/scripts/document/capped-print.ts +1 -1
- package/scripts/document/command-reference-line-budget.ts +42 -0
- package/scripts/document/document-byte-budget.ts +18 -6
- package/scripts/document/document-checks.ts +20 -0
- package/scripts/document/document-ratchet-check.ts +101 -0
- package/scripts/document/document-scan.ts +1 -1
- package/scripts/document/document-section-cli.ts +0 -8
- package/scripts/document/document-section-main.ts +12 -0
- package/scripts/document/document-section.ts +1 -0
- package/scripts/document/entry-read-budget.ts +7 -3
- package/scripts/document/issue-citation-budget.ts +94 -0
- package/scripts/epic/epic-audit-cli.ts +12 -6
- package/scripts/epic/epic-bundle-apply.ts +137 -0
- package/scripts/epic/epic-bundle-cli.ts +32 -121
- package/scripts/epic/epic-bundle-format.ts +116 -0
- package/scripts/epic/epic-bundle-main.ts +17 -0
- package/scripts/epic/epic-busy.ts +5 -12
- package/scripts/epic/epic-classify.ts +24 -15
- package/scripts/epic/epic-cli-argv.ts +33 -2
- 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 +6 -0
- package/scripts/epic/epic-graph.ts +8 -1
- package/scripts/epic/epic-issue.ts +8 -2
- 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-rank.ts +5 -0
- 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-check.ts +62 -0
- package/scripts/exports/unused-members-cli.ts +6 -51
- package/scripts/followup/followup-checks-event.ts +8 -3
- package/scripts/followup/followup-ci-path.ts +67 -0
- package/scripts/followup/followup-coderabbit-retrigger.ts +261 -0
- package/scripts/followup/followup-coderabbit-wait.ts +85 -0
- package/scripts/followup/followup-failed-tests.ts +160 -0
- package/scripts/followup/followup-job-needs.ts +100 -0
- package/scripts/followup/followup-job-rerun.ts +303 -0
- package/scripts/followup/followup-main-move.ts +113 -0
- package/scripts/followup/followup-review-gates.ts +81 -0
- package/scripts/followup/git-followup-finish.ts +43 -11
- package/scripts/followup/git-followup-pending.ts +3 -3
- package/scripts/followup/git-followup-stages.ts +52 -12
- package/scripts/followup/git-followup-workflow.ts +19 -66
- package/scripts/followup/git-pr-followup-checks.ts +55 -16
- package/scripts/followup/git-pr-followup-wrapup.ts +32 -18
- package/scripts/followup/git-pr-followup.ts +96 -33
- package/scripts/fresh-machine/fresh-machine-cli.ts +1 -1
- package/scripts/fresh-machine/fresh-machine-run.ts +8 -8
- package/scripts/fresh-machine/fresh-machine-script.ts +5 -9
- package/scripts/fresh-machine/specs/kit-test-backlogrun-python.json +2 -2
- package/scripts/fresh-machine/specs/kit-test-backlogrun.json +3 -3
- package/scripts/gate/busy-average.ts +90 -0
- package/scripts/gate/check-cpu.ts +60 -0
- package/scripts/gate/check-inputs.ts +39 -95
- package/scripts/gate/check-related-pinned.ts +43 -0
- package/scripts/gate/check-related-reuse.ts +64 -0
- package/scripts/gate/check-related-section.ts +57 -0
- package/scripts/gate/check-related-unplanned.ts +34 -0
- package/scripts/gate/check-related.ts +265 -0
- package/scripts/gate/check-reuse.ts +33 -54
- package/scripts/gate/command-memory.ts +192 -0
- package/scripts/gate/core-admission.ts +236 -28
- package/scripts/gate/core-budget-timing.ts +51 -0
- package/scripts/gate/core-budget.ts +111 -100
- package/scripts/gate/core-wait-record.ts +49 -0
- package/scripts/gate/core-wait.ts +62 -7
- package/scripts/gate/core-weights.ts +94 -0
- package/scripts/gate/free-cores.ts +27 -4
- package/scripts/gate/gate-labels.ts +46 -0
- package/scripts/gate/gate-ledger.ts +44 -8
- package/scripts/gate/gate-plan.ts +130 -78
- package/scripts/gate/gate-report.ts +23 -9
- package/scripts/gate/gate-run-steps.ts +77 -9
- package/scripts/gate/gate-skip.ts +57 -8
- package/scripts/gate/gate-static-group.ts +60 -0
- package/scripts/gate/gate-steps.ts +14 -2
- package/scripts/gate/gate-tree.ts +4 -2
- package/scripts/gate/hook-gate-reuse.ts +19 -2
- package/scripts/gate/input-fingerprint.ts +42 -0
- package/scripts/gate/machine-capacity.ts +65 -31
- package/scripts/gate/metrics-totals.ts +59 -0
- package/scripts/gate/moved-paths.ts +67 -0
- package/scripts/gate/project-checks.ts +5 -12
- package/scripts/gate/scoped-green.ts +76 -19
- package/scripts/gate/since-green.ts +70 -0
- package/scripts/gate/structural-checks.ts +96 -0
- package/scripts/gate/toolchain-inputs.ts +115 -0
- package/scripts/gate/verification-gate.ts +70 -32
- package/scripts/gate/verification-inputs.ts +265 -0
- package/scripts/gate/verification-tail.ts +52 -0
- package/scripts/gh/gh-author-association.ts +117 -9
- package/scripts/gh/git-ai-review-scan.ts +5 -3
- package/scripts/gh/git-gh-api-path.ts +26 -2
- package/scripts/gh/git-gh-branch-rules.ts +73 -0
- package/scripts/gh/git-gh-comments-unreadable.ts +36 -0
- package/scripts/gh/git-gh-conditional.ts +5 -2
- package/scripts/gh/git-gh-exec.ts +32 -2
- package/scripts/gh/git-gh-issue-read.ts +7 -1
- package/scripts/gh/git-gh-issue-rest.ts +1 -0
- package/scripts/gh/git-gh-issue-write.ts +75 -31
- package/scripts/gh/git-gh-issue.ts +19 -8
- package/scripts/gh/git-gh-poll-read.ts +89 -0
- package/scripts/gh/git-gh-pr-auto-merge.ts +21 -9
- package/scripts/gh/git-gh-pr-graphql-state.ts +56 -0
- package/scripts/gh/git-gh-pr-read.ts +74 -13
- package/scripts/gh/git-gh-pr-rest.ts +4 -2
- package/scripts/gh/git-gh-pr-snapshot.ts +48 -20
- package/scripts/gh/git-gh-pr-too-large.ts +20 -0
- package/scripts/gh/git-gh-pr.ts +48 -22
- package/scripts/gh/git-gh-retry.ts +141 -0
- package/scripts/gh/git-pr-ai-review.ts +15 -6
- package/scripts/gh/git-pr-checks-eval.ts +42 -7
- package/scripts/gh/git-pr-checks-parse.ts +39 -9
- package/scripts/gh/git-pr-checks.ts +5 -5
- package/scripts/gh/git-pr-merge-checked.ts +80 -0
- package/scripts/git/base-tree.ts +49 -2
- package/scripts/git/change-base.ts +4 -10
- package/scripts/git/changed-file-scope.ts +6 -4
- package/scripts/git/changed-paths-sync.ts +63 -0
- package/scripts/git/changed-paths.ts +34 -2
- package/scripts/git/git-common-directory.ts +11 -1
- package/scripts/git/git-diff-reads.ts +91 -20
- package/scripts/git/git-error.ts +9 -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 +30 -7
- package/scripts/git/git-spawn.ts +1 -2
- package/scripts/git/git-status.ts +4 -4
- package/scripts/git/git-worktree.ts +13 -0
- package/scripts/git/gone-branch.ts +4 -1
- package/scripts/git/main-merge-budget-conflict.ts +89 -0
- package/scripts/git/main-merge-guard.ts +55 -18
- package/scripts/git/main-merge-main.ts +12 -0
- package/scripts/git/main-merge-regenerate.ts +59 -25
- package/scripts/git/main-merge.ts +77 -13
- package/scripts/git/main-sync-main.ts +12 -0
- package/scripts/git/main-sync.ts +0 -9
- package/scripts/git/no-base-checkout.ts +127 -0
- package/scripts/git/stash/git-stash.ts +38 -6
- 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 +86 -0
- package/scripts/git/stash/stash-push-main.ts +12 -0
- package/scripts/hooks/batch-guard.ts +38 -27
- package/scripts/hooks/check-commit-message-main.ts +8 -0
- package/scripts/hooks/check-commit-message.ts +4 -7
- package/scripts/hooks/edited-cspell.ts +37 -11
- package/scripts/hooks/format-edited-file.ts +29 -25
- package/scripts/hooks/lane-plan-guard.ts +50 -0
- package/scripts/hooks/pre-commit-lint-switch.ts +9 -0
- package/scripts/hooks/pre-commit-lint.ts +44 -4
- package/scripts/hooks/pre-push-related-switch.ts +10 -0
- package/scripts/hooks/pre-push-unit.ts +77 -9
- package/scripts/hooks/pretool-guard-cli.ts +1 -8
- package/scripts/hooks/pretool-guard.ts +34 -19
- package/scripts/hooks/reserved-run.ts +81 -10
- package/scripts/hooks/run-hook.sh +30 -6
- package/scripts/hooks/shell-rules-notice.ts +37 -0
- package/scripts/hooks/step-zero-notice.ts +6 -1
- package/scripts/hooks/stop-actions.ts +5 -36
- package/scripts/hooks/stop-guard.ts +20 -15
- package/scripts/init/distributed-paths.ts +1 -0
- package/scripts/init/hook-command-rewrite.ts +23 -5
- package/scripts/init/hook-launch.ts +17 -17
- 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/aggregation-split.ts +52 -0
- package/scripts/issue/defect-origin-cli.ts +106 -0
- package/scripts/issue/defect-origin-line.ts +78 -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 +38 -179
- 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/effect-audit-cli.ts +178 -0
- package/scripts/issue/effect-audit.ts +185 -0
- package/scripts/issue/expected-effect-lint.ts +65 -9
- package/scripts/issue/git-next-issues.ts +5 -0
- package/scripts/issue/issue-already-done-cli.ts +62 -0
- package/scripts/issue/issue-body-or-comment.ts +74 -0
- package/scripts/issue/issue-cite-cli.ts +1 -12
- package/scripts/issue/issue-cite-main.ts +12 -0
- package/scripts/issue/issue-classification.ts +13 -7
- package/scripts/issue/issue-closing-pr.ts +8 -1
- 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 +102 -0
- package/scripts/issue/issue-file-cap.ts +58 -0
- package/scripts/issue/issue-file-cli.ts +131 -36
- package/scripts/issue/issue-file-deferral.ts +52 -0
- package/scripts/issue/issue-file-fold.ts +29 -10
- package/scripts/issue/issue-file-interrupt.ts +85 -0
- package/scripts/issue/issue-file-lane-hint.ts +30 -0
- package/scripts/issue/issue-file.ts +56 -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 +97 -89
- package/scripts/issue/issue-lint-cli.ts +29 -12
- package/scripts/issue/issue-lint-main.ts +12 -0
- package/scripts/issue/issue-measured-cli.ts +34 -0
- package/scripts/issue/issue-measured-close.ts +58 -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 +114 -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-cli.ts +60 -0
- package/scripts/issue/issue-priority-raise.ts +55 -0
- package/scripts/issue/issue-priority.ts +282 -0
- package/scripts/issue/issue-rank.ts +27 -4
- package/scripts/issue/issue-read-cli.ts +35 -16
- package/scripts/issue/issue-read-main.ts +12 -0
- package/scripts/issue/issue-read.ts +62 -13
- 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 +213 -0
- package/scripts/issue/issue-sample-prime.ts +127 -0
- package/scripts/issue/issue-sample-required.ts +57 -0
- package/scripts/issue/issue-sample-source.ts +77 -0
- package/scripts/issue/issue-scout-cli.ts +0 -11
- package/scripts/issue/issue-scout-main.ts +14 -0
- package/scripts/issue/issue-search.ts +124 -0
- package/scripts/issue/issue-state-cli.ts +0 -10
- package/scripts/issue/issue-state-main.ts +12 -0
- package/scripts/issue/issue-state.ts +13 -1
- package/scripts/issue/issue-template-section.ts +43 -0
- package/scripts/issue/issue-watch-diff.ts +87 -16
- package/scripts/issue/issue-watch-hook.ts +11 -2
- package/scripts/issue/issue-watch.ts +55 -11
- package/scripts/issue/issue-wip.ts +2 -7
- package/scripts/issue/markdown-section.ts +1 -0
- package/scripts/issue/measure-declaration.ts +121 -0
- package/scripts/issue/measure-rerun-cli.ts +7 -65
- 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 +76 -0
- package/scripts/issue/plan-consumers.ts +127 -0
- package/scripts/issue/reproduction-measure.ts +3 -1
- package/scripts/issue/size-estimate.ts +90 -0
- package/scripts/issue/trusted-measure.ts +84 -0
- package/scripts/josh/agent-session-environment.ts +1 -1
- package/scripts/josh/command-usage.ts +17 -44
- package/scripts/josh/durable-state-migrate.ts +105 -0
- package/scripts/josh/durable-state.ts +112 -0
- package/scripts/josh/file-map-stamp.ts +49 -16
- package/scripts/josh/hook-decision.ts +32 -20
- package/scripts/josh/josh-aliases.ts +95 -0
- package/scripts/josh/josh-command-map.ts +1 -79
- package/scripts/josh/josh-command-types.ts +12 -6
- package/scripts/josh/josh-commands-agent-hooks.ts +83 -0
- package/scripts/josh/josh-commands-ai.ts +160 -161
- 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 +142 -101
- 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 +25 -2
- package/scripts/josh/josh-commands-issue-write.ts +200 -0
- package/scripts/josh/josh-commands-issue.ts +156 -24
- package/scripts/josh/josh-commands-lane.ts +187 -3
- package/scripts/josh/josh-commands-lint.ts +34 -10
- package/scripts/josh/josh-commands-maintenance.ts +127 -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 +159 -0
- package/scripts/josh/josh-commands-run.ts +211 -23
- package/scripts/josh/josh-commands-ship.ts +217 -0
- package/scripts/josh/josh-commands-split.ts +9 -0
- package/scripts/josh/josh-commands-test-check.ts +80 -0
- package/scripts/josh/josh-commands-versioning.ts +49 -2
- package/scripts/josh/josh-commands-workflow.ts +144 -6
- package/scripts/josh/josh-environment-file.ts +43 -3
- package/scripts/josh/josh-in-process.ts +2 -2
- package/scripts/josh/josh-logic.ts +11 -16
- package/scripts/josh/josh-run.ts +19 -1
- package/scripts/josh/package-directory.ts +2 -4
- package/scripts/josh/process-identity.ts +13 -4
- package/scripts/josh/run-record-path.ts +15 -0
- 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 +20 -17
- package/scripts/lane/lane-adopt-cli.ts +98 -0
- package/scripts/lane/lane-adopt.ts +208 -0
- package/scripts/lane/lane-await.ts +56 -20
- package/scripts/lane/lane-baseline.ts +123 -0
- package/scripts/lane/lane-breakdown-cli.ts +64 -0
- package/scripts/lane/lane-breakdown-implement.ts +170 -0
- package/scripts/lane/lane-breakdown-laps.ts +107 -0
- package/scripts/lane/lane-breakdown-pinned.ts +76 -0
- package/scripts/lane/lane-breakdown-text.ts +145 -0
- package/scripts/lane/lane-breakdown.ts +239 -0
- package/scripts/lane/lane-cache.ts +5 -30
- package/scripts/lane/lane-capacity.ts +14 -23
- package/scripts/lane/lane-check-stats.ts +84 -22
- package/scripts/lane/lane-child-invocation.ts +17 -2
- package/scripts/lane/lane-child-mark-keys.ts +12 -0
- package/scripts/lane/lane-child-marker.ts +20 -1
- package/scripts/lane/lane-ci-path-stats.ts +73 -0
- package/scripts/lane/lane-claim-stats.ts +84 -0
- package/scripts/lane/lane-cli.ts +15 -5
- package/scripts/lane/lane-close.ts +91 -18
- package/scripts/lane/lane-core-wait-stats.ts +66 -0
- package/scripts/lane/lane-dispatch-log.ts +3 -3
- package/scripts/lane/lane-dispatch.ts +26 -5
- package/scripts/lane/lane-gap-stats.ts +157 -0
- package/scripts/lane/lane-guard-policy.ts +7 -1
- package/scripts/lane/lane-handoff.ts +69 -1
- package/scripts/lane/lane-held-stats.ts +129 -0
- package/scripts/lane/lane-implement-stats.ts +207 -0
- package/scripts/lane/lane-implement-subagents.ts +90 -0
- package/scripts/lane/lane-install.ts +4 -11
- package/scripts/lane/lane-investigation-switch.ts +16 -0
- package/scripts/lane/lane-launch-cli.ts +0 -9
- package/scripts/lane/lane-launch-main.ts +12 -0
- package/scripts/lane/lane-ledger-kind.ts +31 -0
- package/scripts/lane/lane-ledger-schema-ship.ts +49 -0
- package/scripts/lane/lane-ledger-schema.ts +349 -0
- package/scripts/lane/lane-ledger-write.ts +257 -0
- package/scripts/lane/lane-ledger.ts +56 -233
- package/scripts/lane/lane-limit-cli.ts +12 -1
- package/scripts/lane/lane-load.ts +1 -1
- package/scripts/lane/lane-measure-cli.ts +193 -30
- package/scripts/lane/lane-net-read.ts +44 -0
- package/scripts/lane/lane-net-time.ts +212 -0
- package/scripts/lane/lane-open.ts +25 -8
- package/scripts/lane/lane-output.ts +2 -4
- package/scripts/lane/lane-overrun-prompt.ts +147 -0
- package/scripts/lane/lane-overrun.ts +274 -0
- package/scripts/lane/lane-parked.ts +3 -3
- package/scripts/lane/lane-paths.ts +24 -1
- package/scripts/lane/lane-pause-cli.ts +133 -0
- package/scripts/lane/lane-pause.ts +158 -0
- package/scripts/lane/lane-paused-spans.ts +97 -0
- package/scripts/lane/lane-plan-check.ts +207 -0
- package/scripts/lane/lane-plan-cli.ts +41 -0
- package/scripts/lane/lane-plan.ts +144 -0
- 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 +38 -4
- package/scripts/lane/lane-relaunch.ts +1 -1
- package/scripts/lane/lane-residents.ts +162 -0
- package/scripts/lane/lane-restart.ts +22 -2
- package/scripts/lane/lane-round-one-stats.ts +51 -0
- package/scripts/lane/lane-round-two-stats.ts +49 -0
- package/scripts/lane/lane-sampler.ts +26 -3
- package/scripts/lane/lane-session-action.ts +112 -23
- package/scripts/lane/lane-session-broker.ts +146 -37
- package/scripts/lane/lane-session-reread-main.ts +14 -0
- package/scripts/lane/lane-session-reread.ts +51 -0
- package/scripts/lane/lane-ship-lap-stats.ts +74 -0
- package/scripts/lane/lane-sleep.ts +58 -0
- package/scripts/lane/lane-snapshot-trace.ts +84 -0
- package/scripts/lane/lane-spans.ts +51 -0
- package/scripts/lane/lane-spent.ts +7 -4
- package/scripts/lane/lane-split-stats.ts +28 -0
- package/scripts/lane/lane-stage-stats.ts +20 -3
- package/scripts/lane/lane-state.ts +334 -0
- package/scripts/lane/lane-stats-tables.ts +58 -0
- package/scripts/lane/lane-stats.ts +74 -4
- package/scripts/lane/lane-stop-stats.ts +145 -37
- package/scripts/lane/lane-tail-stats.ts +32 -0
- package/scripts/lane/lane-test-related-stats.ts +127 -0
- package/scripts/lane/lane-transcript-calls.ts +202 -0
- package/scripts/lane/lane-transcript-stats.ts +200 -0
- package/scripts/lane/lane-vacant.ts +13 -3
- package/scripts/lane/lane-value-cell.ts +72 -0
- package/scripts/lane/lane-value.ts +118 -0
- package/scripts/lane/lane-withdraw-cli.ts +5 -4
- package/scripts/lane/lane-withdraw-closed.ts +124 -0
- package/scripts/lane/lane-withdraw.ts +149 -71
- package/scripts/lane/lane-yield.ts +85 -0
- package/scripts/lane/openai-lane-ship.ts +12 -11
- package/scripts/lane/openai-lane-supervisor-decision.ts +6 -8
- package/scripts/lane/openai-lane-supervisor-owner.ts +5 -8
- package/scripts/lane/openai-lane-supervisor.ts +5 -4
- 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/poll.ts +38 -9
- package/scripts/lib/read-file.ts +3 -1
- package/scripts/lib/settled-together.ts +10 -0
- package/scripts/lib/shell-quote.ts +21 -0
- 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/token-shape.ts +111 -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-sources.ts +79 -0
- package/scripts/lint/eslint-daemon.ts +304 -0
- package/scripts/lint/eslint-warm-cli.ts +7 -0
- package/scripts/lint/eslint-warm.ts +66 -0
- package/scripts/lint/format.ts +11 -2
- package/scripts/lint/import-graph.ts +409 -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 +113 -33
- package/scripts/lint/lint-related-scope.ts +30 -24
- package/scripts/lint/lint-related.ts +183 -30
- package/scripts/lint/rename-cli.ts +179 -0
- package/scripts/lint/rename-identifier.ts +192 -0
- package/scripts/lint/type-only-imports.ts +58 -0
- package/scripts/notify/confirmation-options.ts +1 -2
- package/scripts/notify/telegram-notify.ts +32 -23
- package/scripts/notify/telegram-test-logic.ts +0 -1
- package/scripts/notify/telegram-test-main.ts +8 -0
- package/scripts/notify/telegram-test.ts +2 -6
- package/scripts/observations/observation-ledger.ts +13 -0
- package/scripts/observations/observation-record.ts +42 -16
- package/scripts/observations/observations-flush-landing.ts +5 -3
- package/scripts/observations/observations-flush.ts +38 -10
- package/scripts/overrides/overrides-check.ts +11 -6
- 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 +24 -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 +10 -16
- package/scripts/repo/ruleset-check.ts +4 -3
- package/scripts/report/markdown-shape.ts +28 -0
- package/scripts/report/report-format-reference.ts +17 -1
- package/scripts/report/report-labels.ts +166 -0
- package/scripts/report/report-lint-child-summary.ts +94 -0
- package/scripts/report/report-lint-cli.ts +29 -7
- package/scripts/report/report-lint.ts +85 -128
- package/scripts/report/report-template-cli.ts +59 -0
- package/scripts/report/report-template.ts +112 -0
- package/scripts/review/acceptance-map.ts +1 -0
- package/scripts/review/prose-stale-cli.ts +88 -0
- package/scripts/review/prose-stale-scan.ts +152 -0
- package/scripts/review/removed-tests-check.ts +86 -0
- package/scripts/review/removed-tests.ts +149 -0
- package/scripts/review/review-attest.ts +73 -23
- package/scripts/review/review-brief-cli.ts +138 -23
- package/scripts/review/review-brief-main.ts +12 -0
- package/scripts/review/review-brief-paths.ts +22 -0
- package/scripts/review/review-brief.ts +45 -10
- package/scripts/review/review-code-tree.ts +10 -6
- package/scripts/review/review-comment-carry.ts +47 -0
- package/scripts/review/review-comment-round.ts +111 -30
- package/scripts/review/review-finding-ledger.ts +135 -18
- package/scripts/review/review-finding-text.ts +43 -0
- package/scripts/review/review-interaction.ts +105 -0
- package/scripts/review/review-lane-handover.ts +68 -0
- package/scripts/review/review-lint-cli.ts +57 -0
- package/scripts/review/review-lint-findings.ts +92 -0
- package/scripts/review/review-lint-sections.ts +80 -0
- package/scripts/review/review-lint.ts +221 -0
- package/scripts/review/review-prior-findings.ts +102 -0
- package/scripts/review/review-readers-scan.ts +165 -0
- package/scripts/review/review-record-cli.ts +236 -74
- package/scripts/review/review-record-code-round.ts +55 -0
- package/scripts/review/review-record-comment.ts +60 -0
- package/scripts/review/review-record-interaction.ts +35 -0
- package/scripts/review/review-record-main.ts +12 -0
- package/scripts/review/review-record-pinned.ts +108 -0
- package/scripts/review/review-record.ts +25 -1
- package/scripts/review/review-reviewed-tree.ts +307 -0
- package/scripts/review/review-round-one-blobs.ts +221 -0
- package/scripts/review/review-round-one-closure.ts +62 -0
- package/scripts/review/review-round-reuse.ts +106 -0
- package/scripts/review/review-round2-cli.ts +135 -36
- package/scripts/review/review-round2-skip-comment.ts +55 -0
- package/scripts/review/review-round2.ts +103 -19
- package/scripts/review/review-stamps.ts +23 -1
- package/scripts/review/review-stop-log.ts +110 -0
- package/scripts/review/review-stops-cli.ts +86 -0
- package/scripts/review/review-submit-cli.ts +101 -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 +9 -1
- package/scripts/rules/bash-triggers.ts +49 -6
- package/scripts/rules/concise-reply.ts +88 -0
- package/scripts/rules/credential-body.ts +77 -0
- package/scripts/rules/decision-oracle-batch.ts +9 -1
- package/scripts/rules/decision-oracle.ts +3 -3
- package/scripts/rules/delivered-rules.ts +115 -18
- package/scripts/rules/destructive-command.ts +11 -12
- package/scripts/rules/direct-filing.ts +10 -2
- package/scripts/rules/direct-issue-comment.ts +139 -0
- package/scripts/rules/direct-issue-read.ts +191 -0
- package/scripts/rules/direct-pr-create.ts +72 -26
- package/scripts/rules/early-heartbeat.ts +4 -1
- package/scripts/rules/edit-tool.ts +27 -0
- package/scripts/rules/file-body.ts +7 -0
- package/scripts/rules/file-edit-rows.ts +17 -0
- package/scripts/rules/file-rewrite.ts +146 -0
- package/scripts/rules/firing-point.ts +3 -2
- package/scripts/rules/gh-api.ts +128 -7
- package/scripts/rules/gh-repo-selector.ts +84 -0
- package/scripts/rules/git-argv.ts +72 -14
- package/scripts/rules/git-force.ts +14 -4
- package/scripts/rules/guard-remedy.ts +17 -4
- package/scripts/rules/implementation-cut-verdict.ts +1 -1
- package/scripts/rules/implementation-cut.ts +68 -27
- package/scripts/rules/index-guard.ts +8 -1
- package/scripts/rules/investigator-foreground.ts +231 -0
- package/scripts/rules/issue-citation.ts +15 -60
- package/scripts/rules/issue-comments.ts +18 -5
- package/scripts/rules/josh-git-bare.ts +7 -0
- package/scripts/rules/lane-background.ts +103 -33
- package/scripts/rules/lane-carry-conflict.ts +6 -0
- package/scripts/rules/lane-direct-tool.ts +172 -0
- package/scripts/rules/lane-interactive-ask.ts +12 -2
- package/scripts/rules/lane-park.ts +49 -25
- package/scripts/rules/lane-spilled-read.ts +90 -0
- package/scripts/rules/lane-split-park.ts +11 -3
- package/scripts/rules/lane-switch-main.ts +11 -4
- package/scripts/rules/last-prompt.ts +20 -47
- package/scripts/rules/oracle-consulted.ts +11 -1
- package/scripts/rules/oracle-firing.ts +1 -0
- package/scripts/rules/permission-guards.ts +7 -0
- package/scripts/rules/piped-verification-shapes.ts +110 -0
- package/scripts/rules/piped-verification.ts +68 -18
- package/scripts/rules/poll-loop.ts +78 -8
- package/scripts/rules/pr-merge.ts +123 -0
- package/scripts/rules/pre-gate-cut.ts +3 -3
- package/scripts/rules/protected-files.ts +113 -22
- package/scripts/rules/raw-field-body.ts +6 -0
- package/scripts/rules/reply-language.ts +3 -17
- package/scripts/rules/reply-prose.ts +34 -0
- package/scripts/rules/repo-admin.ts +132 -0
- package/scripts/rules/reviewer-foreground.ts +88 -0
- package/scripts/rules/round-one-check-related.ts +120 -0
- package/scripts/rules/rule-body-guard.ts +13 -15
- package/scripts/rules/rule-list.ts +9 -28
- package/scripts/rules/rule-value-cache.ts +57 -14
- package/scripts/rules/rule-value-candidates.ts +84 -0
- package/scripts/rules/rule-value-cli.ts +106 -39
- package/scripts/rules/rule-value.ts +18 -5
- package/scripts/rules/run-tail-rule.ts +1 -1
- package/scripts/rules/sed-in-place.ts +196 -0
- package/scripts/rules/shell-segments.ts +43 -0
- package/scripts/rules/stop-rule-rows.ts +52 -0
- package/scripts/rules/stop-rules.ts +36 -62
- package/scripts/rules/test-declared-commit.ts +11 -1
- package/scripts/rules/third-party-write.ts +115 -21
- package/scripts/rules/timed-rerun.ts +69 -0
- package/scripts/rules/turn-filings.ts +90 -0
- package/scripts/rules/worktree-guard.ts +32 -7
- package/scripts/run/board/run-board-app-name.ts +23 -0
- package/scripts/run/board/run-board-cli.ts +65 -32
- package/scripts/run/board/run-board-earlier.ts +94 -0
- package/scripts/run/board/run-board-ending-reason.ts +71 -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 +177 -37
- package/scripts/run/board/run-board-fold.ts +123 -0
- package/scripts/run/board/run-board-found.ts +134 -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 +118 -38
- package/scripts/run/board/run-board-header.ts +90 -20
- 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 +126 -71
- package/scripts/run/board/run-board-lane-state.ts +109 -0
- package/scripts/run/board/run-board-lane-time.ts +123 -0
- package/scripts/run/board/run-board-layout.ts +239 -60
- package/scripts/run/board/run-board-length.ts +52 -0
- package/scripts/run/board/run-board-link.ts +15 -2
- 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 +59 -32
- package/scripts/run/board/run-board-now.ts +1 -1
- package/scripts/run/board/run-board-operation.ts +19 -35
- package/scripts/run/board/run-board-phase.ts +3 -6
- package/scripts/run/board/run-board-plan-shared.ts +115 -0
- package/scripts/run/board/run-board-plan.ts +56 -4
- 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 +197 -28
- package/scripts/run/board/run-board-reason.ts +247 -51
- package/scripts/run/board/run-board-released.ts +35 -0
- package/scripts/run/board/run-board-render-checks.ts +42 -7
- package/scripts/run/board/run-board-render-condition.ts +96 -0
- package/scripts/run/board/run-board-render-drawn.ts +78 -0
- package/scripts/run/board/run-board-render-foot.ts +59 -0
- package/scripts/run/board/run-board-render-found.ts +157 -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 +89 -0
- package/scripts/run/board/run-board-render-legend.ts +136 -48
- 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 +104 -20
- package/scripts/run/board/run-board-render.ts +264 -258
- package/scripts/run/board/run-board-roots.ts +54 -0
- package/scripts/run/board/run-board-row-yield.ts +9 -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 +3 -5
- package/scripts/run/board/run-board-state.ts +22 -33
- package/scripts/run/board/run-board-status.ts +149 -71
- package/scripts/run/board/run-board-thanks-read.ts +2 -2
- package/scripts/run/board/run-board-tick.ts +158 -114
- 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-ended.ts +3 -2
- package/scripts/run/carry/run-carry.ts +12 -6
- package/scripts/run/cut/run-cut-cli.ts +33 -133
- package/scripts/run/cut/run-cut-digest.ts +152 -0
- package/scripts/run/cut/run-cut-handoff.ts +54 -10
- package/scripts/run/cut/run-cut-report.ts +24 -3
- package/scripts/run/cut/run-cut-resume.ts +129 -0
- package/scripts/run/cut/run-cut-review.ts +105 -0
- package/scripts/run/cut/run-cut.ts +18 -7
- package/scripts/run/detached-launch.ts +1 -1
- package/scripts/run/entry/run-entry-cli.ts +88 -19
- package/scripts/run/entry/run-entry-spill.ts +83 -0
- package/scripts/run/entry/run-entry-stop.ts +5 -1
- package/scripts/run/entry/run-entry-trust.ts +91 -0
- package/scripts/run/event/run-event-baseline.ts +56 -0
- package/scripts/run/event/run-event-cli.ts +1 -5
- package/scripts/run/event/run-event-filed.ts +18 -6
- package/scripts/run/event/run-event-follow.ts +2 -3
- package/scripts/run/event/run-event-overrun.ts +197 -0
- package/scripts/run/event/run-event-render.ts +10 -10
- package/scripts/run/event/run-event-scope.ts +2 -2
- package/scripts/run/event/run-event-stream-emit.ts +82 -22
- package/scripts/run/event/run-event-stream.ts +58 -10
- 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-stop-notify.ts +178 -0
- package/scripts/run/merge/run-merge-auth.ts +31 -0
- package/scripts/run/merge/run-merge-cap.ts +57 -0
- package/scripts/run/merge/run-merge-cli.ts +119 -62
- 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 +25 -0
- package/scripts/run/merge/run-merge-restart.ts +39 -0
- package/scripts/run/merge/run-merge-ship.ts +33 -7
- package/scripts/run/merge/run-merge-signals.ts +66 -25
- package/scripts/run/merge/run-merge-steps.ts +162 -107
- package/scripts/run/merge/run-merge-usage-limit.ts +53 -0
- package/scripts/run/merge/run-merge-withdrawn.ts +53 -0
- package/scripts/run/merge/run-merge.ts +76 -48
- 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-cli.ts +306 -20
- package/scripts/run/review/run-review-early-push.ts +121 -0
- package/scripts/run/review/run-review-join-read.ts +94 -0
- package/scripts/run/review/run-review-pinned-accepted.ts +126 -0
- package/scripts/run/review/run-review-pinned-join.ts +216 -0
- package/scripts/run/review/run-review-pinned-steps.ts +383 -0
- package/scripts/run/review/run-review-pinned-tree.ts +37 -0
- package/scripts/run/review/run-review-pinned.ts +53 -0
- package/scripts/run/review/run-review-steps.ts +70 -34
- package/scripts/run/review/run-review.ts +28 -7
- 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 +60 -29
- package/scripts/run/run-next.ts +1 -1
- package/scripts/run/run-parent-cut-hook.ts +3 -4
- 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 +7 -0
- package/scripts/run/run-report-cli.ts +101 -13
- package/scripts/run/run-report-handoff.ts +114 -0
- package/scripts/run/run-stage-read.ts +2 -6
- package/scripts/run/run-step-cli.ts +17 -5
- package/scripts/run/run-step-lane-plan.ts +27 -0
- package/scripts/run/run-step-section.ts +26 -7
- package/scripts/run/run-step.ts +6 -3
- 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 +140 -0
- package/scripts/run/ship/run-ship-body-draft.ts +110 -0
- package/scripts/run/ship/run-ship-brokered-review.ts +106 -0
- package/scripts/run/ship/run-ship-cli.ts +181 -166
- package/scripts/run/ship/run-ship-conflict-probe.ts +59 -0
- package/scripts/run/ship/run-ship-detach.ts +29 -12
- package/scripts/run/ship/run-ship-handover.ts +106 -0
- package/scripts/run/ship/run-ship-infra-retry.ts +74 -0
- package/scripts/run/ship/run-ship-lap.ts +63 -0
- package/scripts/run/ship/run-ship-next.ts +44 -27
- package/scripts/run/ship/run-ship-overlap.ts +49 -7
- package/scripts/run/ship/run-ship-place.ts +103 -0
- package/scripts/run/ship/run-ship-planned.ts +92 -0
- package/scripts/run/ship/run-ship-pre-detach-pinned.ts +197 -0
- package/scripts/run/ship/run-ship-pre-detach-timed.ts +42 -0
- package/scripts/run/ship/run-ship-pre-detach.ts +144 -33
- package/scripts/run/ship/run-ship-preflight.ts +150 -33
- package/scripts/run/ship/run-ship-probe.ts +28 -6
- package/scripts/run/ship/run-ship-relaunch-cap.ts +106 -0
- package/scripts/run/ship/run-ship-relaunch.ts +51 -0
- package/scripts/run/ship/run-ship-removed-rows.ts +61 -0
- package/scripts/run/ship/run-ship-return.ts +183 -25
- package/scripts/run/ship/run-ship-review-reason.ts +24 -0
- package/scripts/run/ship/run-ship-review-steps.ts +296 -171
- package/scripts/run/ship/run-ship-review.ts +222 -35
- package/scripts/run/ship/run-ship-reviewer.ts +303 -0
- package/scripts/run/ship/run-ship-scoped.ts +39 -10
- package/scripts/run/ship/run-ship-stage.ts +101 -16
- package/scripts/run/ship/run-ship-steps.ts +68 -17
- package/scripts/run/ship/run-ship-stop-cause.ts +176 -0
- package/scripts/run/ship/run-ship-stop-context.ts +50 -13
- package/scripts/run/ship/run-ship-stop-text.ts +11 -6
- package/scripts/run/ship/run-ship-sync.ts +212 -34
- package/scripts/run/ship/run-ship-synced-scope.ts +178 -0
- package/scripts/run/ship/run-ship-wait-cli.ts +145 -0
- package/scripts/run/ship/run-ship-waiter.ts +114 -0
- package/scripts/run/ship/run-ship.ts +44 -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-caffeinate.ts +48 -0
- package/scripts/run/wake/run-wake-cli.ts +121 -209
- package/scripts/run/wake/run-wake-code.ts +125 -0
- package/scripts/run/wake/run-wake-driver.ts +22 -9
- package/scripts/run/wake/run-wake-finish.ts +137 -0
- package/scripts/run/wake/run-wake-loop.ts +36 -3
- package/scripts/run/wake/run-wake-main.ts +13 -0
- package/scripts/run/wake/run-wake-ports.ts +98 -0
- package/scripts/run/wake/run-wake-session.ts +2 -0
- package/scripts/run/wake/run-wake-takeover.ts +66 -0
- package/scripts/run/wake/run-wake.ts +5 -3
- package/scripts/safe-chain/ci-installer-pin.ts +49 -8
- 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 +6 -11
- package/scripts/security/secretlint-scan.ts +42 -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 +20 -0
- package/scripts/security/security-audit-provision.ts +12 -27
- package/scripts/security/security-audit.ts +27 -8
- package/scripts/security/sonar-file.ts +10 -5
- 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 +25 -1
- package/scripts/split/split-early-notice.ts +116 -0
- package/scripts/split/split-measure.ts +83 -0
- package/scripts/split/split-resolution.ts +107 -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/direct-importers.ts +185 -0
- package/scripts/test/pure-files-entries.ts +83 -0
- package/scripts/test/related-heavy-tests.ts +81 -0
- package/scripts/test/test-declared-changed.ts +2 -2
- package/scripts/test/test-declared.ts +1 -1
- package/scripts/test/test-e2e-guard.ts +25 -1
- package/scripts/test/test-e2e-stamp.ts +38 -0
- package/scripts/test/test-no-base.ts +88 -0
- package/scripts/test/test-pinned-cache-logic.ts +363 -0
- package/scripts/test/test-pinned-cache.ts +337 -0
- package/scripts/test/test-pinned-emit.ts +49 -0
- package/scripts/test/test-pinned-functions.ts +116 -0
- package/scripts/test/test-pinned-ledger.ts +80 -0
- package/scripts/test/test-pinned-logic.ts +333 -0
- package/scripts/test/test-pinned-main.ts +144 -0
- package/scripts/test/test-pinned-pool.ts +73 -0
- package/scripts/test/test-pinned-probe.ts +254 -0
- package/scripts/test/test-pinned-prune-logic.ts +118 -0
- package/scripts/test/test-pinned-reach.ts +194 -0
- package/scripts/test/test-pinned-record.ts +196 -0
- package/scripts/test/test-pinned-rewire.ts +148 -0
- package/scripts/test/test-pinned-spawn.ts +81 -0
- package/scripts/test/test-pinned-stage.ts +70 -0
- package/scripts/test/test-pinned.ts +311 -0
- package/scripts/test/test-reach-cli.ts +61 -0
- package/scripts/test/test-read-map.ts +288 -0
- package/scripts/test/test-read-recording.ts +103 -0
- package/scripts/test/test-read-trace.ts +166 -0
- package/scripts/test/test-red-logic.ts +46 -7
- package/scripts/test/test-red-main.ts +12 -0
- package/scripts/test/test-red.ts +39 -37
- package/scripts/test/test-related-claim.ts +37 -0
- package/scripts/test/test-related-main.ts +21 -0
- package/scripts/test/test-related-moved.ts +91 -0
- package/scripts/test/test-related-record.ts +139 -0
- package/scripts/test/test-related-scope.ts +292 -41
- package/scripts/test/test-related-synced.ts +135 -0
- package/scripts/test/test-related-touched.ts +84 -0
- package/scripts/test/test-related.ts +381 -19
- package/scripts/test/test-unit-guard-main.ts +15 -0
- package/scripts/test/test-unit-guard.ts +66 -25
- package/scripts/test/unit-count-file.ts +37 -0
- package/scripts/test/unit-durations.ts +41 -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 +64 -151
- package/scripts/test/vitest-cache-directory.ts +19 -0
- package/scripts/test/vitest-cli-excludes.ts +14 -0
- package/scripts/test/vitest-failure-summary.ts +111 -0
- package/scripts/test/whole-suite-files.ts +74 -0
- package/scripts/time-runtime/time-background.ts +20 -2
- package/scripts/time-runtime/time-batch-guard.ts +42 -4
- package/scripts/time-runtime/time-bundle-call.ts +1 -1
- package/scripts/time-runtime/time-bundles.ts +40 -8
- 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 +12 -3
- package/scripts/time-runtime/time-search-call.ts +38 -0
- package/scripts/time-runtime/time-shell.ts +98 -11
- package/scripts/time-runtime/time-transcript-line.ts +65 -66
- 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/development-engines-verdict.ts +124 -0
- package/scripts/version/effective-upstream.ts +6 -12
- package/scripts/version/latest-corepack.ts +19 -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 +6 -1
- package/templates/pnpm-workspace.basic.yaml +1 -1
- package/templates/sonar-project.properties +3 -2
- package/templates/workflows/ci.yml +53 -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-4KKD2UTK.js +0 -66
- package/dist/hooks/chunk-6TS2JD6D.js +0 -237
- package/dist/hooks/chunk-7DSBJVFH.js +0 -50
- package/dist/hooks/chunk-A65Y4YOR.js +0 -79
- package/dist/hooks/chunk-APUO6U4J.js +0 -2451
- package/dist/hooks/chunk-CDY4NFQG.js +0 -15
- package/dist/hooks/chunk-DGT54IH5.js +0 -161
- package/dist/hooks/chunk-EFXE6C37.js +0 -81
- package/dist/hooks/chunk-GP4IEC4O.js +0 -20
- package/dist/hooks/chunk-JP45SOCJ.js +0 -56
- package/dist/hooks/chunk-LAOV7NLM.js +0 -45
- package/dist/hooks/chunk-M4HGZV7U.js +0 -83
- package/dist/hooks/chunk-O6GDRNJB.js +0 -343
- package/dist/hooks/chunk-PF2NZL2A.js +0 -131
- package/dist/hooks/chunk-PTICX4OL.js +0 -358
- package/dist/hooks/chunk-RT27QRJW.js +0 -6247
- package/dist/hooks/chunk-SYOTDYCI.js +0 -3533
- package/dist/hooks/chunk-TNUMY6NL.js +0 -4838
- package/dist/hooks/chunk-UPUZF3AN.js +0 -279
- package/dist/hooks/chunk-WK6SMBIC.js +0 -3180
- package/dist/hooks/duplicate-read-guard.js +0 -30
- package/dist/hooks/investigation-guard.js +0 -29
- package/scripts/backlog/backlog-stalled-cli.ts +0 -30
- package/scripts/cost-runtime/context-cut-threshold.ts +0 -11
- 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/josh/josh-usage-automation.ts +0 -121
- package/scripts/josh/josh-usage-backlog.ts +0 -180
- package/scripts/josh/josh-usage-developer.ts +0 -230
- package/scripts/josh/josh-usage-hooks.ts +0 -38
- package/scripts/josh/josh-usage-issue.ts +0 -205
- package/scripts/josh/josh-usage-review.ts +0 -101
- package/scripts/josh/josh-usage-run.ts +0 -252
- package/scripts/josh/josh-usage-session.ts +0 -238
- package/scripts/josh/josh-usage-workflow.ts +0 -212
- 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/filing-cap.ts +0 -132
- package/scripts/rules/rule-guard.ts +0 -23
- package/scripts/rules/rule-registry-rows.ts +0 -292
- package/scripts/rules/rule-registry.ts +0 -112
- package/scripts/run/run-stranded-cli.ts +0 -27
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import { userInfo } from 'node:os'
|
|
2
|
+
import { lane_reap } from './lane-reap'
|
|
3
|
+
import { lane_residents, type ResidentLane } from './lane-residents'
|
|
4
|
+
|
|
5
|
+
// What a close does about the lane's processes once the SIGTERM went out (joshuafolkken/kit#4300).
|
|
6
|
+
//
|
|
7
|
+
// **A SIGTERM is a request, so the close looks again.** After a grace window the lane's directory is
|
|
8
|
+
// read again; whatever is still there gets a SIGKILL, and after a short wait the directory is read a
|
|
9
|
+
// last time. What survives that is reported, each with why it could — another account owns it, or it
|
|
10
|
+
// is stuck in the kernel — so `lane:close` answers `incomplete` and `run:board` can say what is wrong
|
|
11
|
+
// rather than only that something is left.
|
|
12
|
+
|
|
13
|
+
// Long enough for a node process to run its exit handlers.
|
|
14
|
+
const GRACE_MS = 3000
|
|
15
|
+
// A SIGKILL is not handled, so what still answers after this is not going to go.
|
|
16
|
+
const KILL_WAIT_MS = 1000
|
|
17
|
+
const KILL_SIGNAL = 'SIGKILL'
|
|
18
|
+
const STATE_FORMAT = ['-o', 'user=,stat=', '-p']
|
|
19
|
+
const FIELD_SEPARATOR = /\s+/u
|
|
20
|
+
const UNREADABLE_TEXT = "the lane's processes (lsof or ps failed)"
|
|
21
|
+
|
|
22
|
+
interface SettleProbes {
|
|
23
|
+
// `undefined` where the lane's processes could not be read (`lane_residents.residents`).
|
|
24
|
+
residents: (lane: ResidentLane) => Array<number> | undefined
|
|
25
|
+
kill: (pid: number) => boolean
|
|
26
|
+
wait: (milliseconds: number) => Promise<void>
|
|
27
|
+
// Why a process outlived the SIGKILL.
|
|
28
|
+
reason_of: (pid: number) => string
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
interface Survivor {
|
|
32
|
+
pid: number
|
|
33
|
+
reason: string
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function kill(pid: number): boolean {
|
|
37
|
+
try {
|
|
38
|
+
process.kill(pid, KILL_SIGNAL)
|
|
39
|
+
|
|
40
|
+
return true
|
|
41
|
+
} catch {
|
|
42
|
+
return false
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
async function wait(milliseconds: number): Promise<void> {
|
|
47
|
+
await new Promise((resolve) => setTimeout(resolve, milliseconds))
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// Another account's process is the usual survivor — a SIGKILL from this one is refused; otherwise
|
|
51
|
+
// `ps`'s state says it, `U` for an uninterruptible wait.
|
|
52
|
+
function reason_from(user: string, state: string): string {
|
|
53
|
+
if (user !== userInfo().username) return `owned by ${user}`
|
|
54
|
+
|
|
55
|
+
return `state ${state}`
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
function reason_of(pid: number): string {
|
|
59
|
+
const printed = lane_reap.run_probe(lane_reap.PS_COMMAND, [...STATE_FORMAT, String(pid)])
|
|
60
|
+
const [user = '', state = ''] = printed.trim().split(FIELD_SEPARATOR)
|
|
61
|
+
|
|
62
|
+
return user.length === 0 ? 'unreadable' : reason_from(user, state)
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
const SYSTEM_PROBES: SettleProbes = {
|
|
66
|
+
residents: (lane) => lane_residents.residents(lane),
|
|
67
|
+
kill,
|
|
68
|
+
wait,
|
|
69
|
+
reason_of,
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// A reading that failed is not an empty one.
|
|
73
|
+
function is_empty(reading: ReadonlyArray<number> | undefined): boolean {
|
|
74
|
+
return reading?.length === 0
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
async function kill_all(
|
|
78
|
+
lingering: ReadonlyArray<number> | undefined,
|
|
79
|
+
probes: SettleProbes,
|
|
80
|
+
): Promise<void> {
|
|
81
|
+
const targets = lingering ?? []
|
|
82
|
+
|
|
83
|
+
for (const pid of targets) probes.kill(pid)
|
|
84
|
+
|
|
85
|
+
await probes.wait(KILL_WAIT_MS)
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
function survivors(lane: ResidentLane, probes: SettleProbes): Array<Survivor> | undefined {
|
|
89
|
+
return probes.residents(lane)?.map((pid) => ({ pid, reason: probes.reason_of(pid) }))
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Wait out the SIGTERM a reap sent, SIGKILL what is still in the lane's directory, and answer what
|
|
94
|
+
* outlived even that — the empty list is a lane with no process left, `undefined` a last reading that
|
|
95
|
+
* failed. A failed reading is never read as none: it is read again, and nothing is killed on it.
|
|
96
|
+
*/
|
|
97
|
+
async function settle(
|
|
98
|
+
lane: ResidentLane,
|
|
99
|
+
probes: SettleProbes = SYSTEM_PROBES,
|
|
100
|
+
): Promise<Array<Survivor> | undefined> {
|
|
101
|
+
if (is_empty(probes.residents(lane))) return []
|
|
102
|
+
|
|
103
|
+
await probes.wait(GRACE_MS)
|
|
104
|
+
|
|
105
|
+
const lingering = probes.residents(lane)
|
|
106
|
+
|
|
107
|
+
if (is_empty(lingering)) return []
|
|
108
|
+
|
|
109
|
+
await kill_all(lingering, probes)
|
|
110
|
+
|
|
111
|
+
return survivors(lane, probes)
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/** How a close's `left_behind` names what `settle` answered; a failed reading is named as such. */
|
|
115
|
+
function survivor_texts(settled: ReadonlyArray<Survivor> | undefined): Array<string> {
|
|
116
|
+
if (settled === undefined) return [UNREADABLE_TEXT]
|
|
117
|
+
|
|
118
|
+
return settled.map((survivor) => `process ${String(survivor.pid)} (${survivor.reason})`)
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
const lane_reap_settle = { GRACE_MS, KILL_WAIT_MS, reason_from, settle, survivor_texts }
|
|
122
|
+
|
|
123
|
+
export type { SettleProbes, Survivor }
|
|
124
|
+
export { lane_reap_settle }
|
|
@@ -18,6 +18,9 @@ import { process_tools } from './process-tools'
|
|
|
18
18
|
//
|
|
19
19
|
// **The caller's own ancestry is never touched.** A `lane:close` issued from inside the lane it
|
|
20
20
|
// closes would otherwise end the very session running it, before it could report.
|
|
21
|
+
//
|
|
22
|
+
// **What runs from the lane outside the tree is `lane-residents.ts`'s** (joshuafolkken/kit#4300): the
|
|
23
|
+
// edit hook's `eslint_d`, a `script` wrapper re-parented to pid 1, found by working directory or mark.
|
|
21
24
|
|
|
22
25
|
const PGREP_COMMAND = 'pgrep'
|
|
23
26
|
const MATCH_FULL_COMMAND_LINE = '-f'
|
|
@@ -26,13 +29,24 @@ const CHILDREN_OF_FLAG = '-P'
|
|
|
26
29
|
const PS_COMMAND = '/bin/ps'
|
|
27
30
|
const PARENT_FORMAT = ['-o', 'ppid=', '-p']
|
|
28
31
|
const TERMINATE_SIGNAL = 'SIGTERM'
|
|
32
|
+
const CONTINUE_SIGNAL = 'SIGCONT'
|
|
29
33
|
// `0` addresses the caller's own process group and `1` is init — neither is ever a lane child.
|
|
30
34
|
const LOWEST_CHILD_PID = 2
|
|
31
35
|
|
|
32
|
-
|
|
36
|
+
// The lane a reap or a pause acts on: the child by its issue, the rest by its directory.
|
|
37
|
+
interface LaneProcesses {
|
|
38
|
+
issue: string
|
|
39
|
+
directory: string
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// What collecting a lane's process tree reads — shared with `lane:pause` (`lane-pause.ts`).
|
|
43
|
+
interface TreeProbes {
|
|
33
44
|
matching: (pattern: string) => Array<number>
|
|
34
45
|
children_of: (pid: number) => Array<number>
|
|
35
46
|
parent_of: (pid: number) => number | undefined
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
interface ReapProbes extends TreeProbes {
|
|
36
50
|
terminate: (pid: number) => boolean
|
|
37
51
|
}
|
|
38
52
|
|
|
@@ -64,9 +78,9 @@ function parent_of(pid: number): number | undefined {
|
|
|
64
78
|
return parse_pids(run_probe(PS_COMMAND, [...PARENT_FORMAT, String(pid)]))[0]
|
|
65
79
|
}
|
|
66
80
|
|
|
67
|
-
function
|
|
81
|
+
function send(pid: number, name: NodeJS.Signals): boolean {
|
|
68
82
|
try {
|
|
69
|
-
process.kill(pid,
|
|
83
|
+
process.kill(pid, name)
|
|
70
84
|
|
|
71
85
|
return true
|
|
72
86
|
} catch {
|
|
@@ -74,6 +88,16 @@ function terminate(pid: number): boolean {
|
|
|
74
88
|
}
|
|
75
89
|
}
|
|
76
90
|
|
|
91
|
+
// A stopped process (`lane:pause`) holds a SIGTERM it handles pending until it is continued, so the
|
|
92
|
+
// terminate is followed by a SIGCONT; a running process ignores it.
|
|
93
|
+
function terminate(pid: number): boolean {
|
|
94
|
+
if (!send(pid, TERMINATE_SIGNAL)) return false
|
|
95
|
+
|
|
96
|
+
send(pid, CONTINUE_SIGNAL)
|
|
97
|
+
|
|
98
|
+
return true
|
|
99
|
+
}
|
|
100
|
+
|
|
77
101
|
const SYSTEM_PROBES: ReapProbes = {
|
|
78
102
|
matching: (pattern) => parse_pids(run_probe(PGREP_COMMAND, [MATCH_FULL_COMMAND_LINE, pattern])),
|
|
79
103
|
children_of: (pid) => parse_pids(run_probe(PGREP_COMMAND, [CHILDREN_OF_FLAG, String(pid)])),
|
|
@@ -81,7 +105,7 @@ const SYSTEM_PROBES: ReapProbes = {
|
|
|
81
105
|
terminate,
|
|
82
106
|
}
|
|
83
107
|
|
|
84
|
-
function ancestry_of(pid: number, probes:
|
|
108
|
+
function ancestry_of(pid: number, probes: TreeProbes): Set<number> {
|
|
85
109
|
const ancestry = new Set<number>([pid])
|
|
86
110
|
let current = probes.parent_of(pid)
|
|
87
111
|
|
|
@@ -95,11 +119,11 @@ function ancestry_of(pid: number, probes: ReapProbes): Set<number> {
|
|
|
95
119
|
|
|
96
120
|
// This process and every process above it. The Stop hook reads it to tell whether the session that
|
|
97
121
|
// declared a carry record's `--owner "$PPID"` is the one it runs under.
|
|
98
|
-
function own_ancestry(probes:
|
|
122
|
+
function own_ancestry(probes: TreeProbes = SYSTEM_PROBES): Set<number> {
|
|
99
123
|
return ancestry_of(process.pid, probes)
|
|
100
124
|
}
|
|
101
125
|
|
|
102
|
-
function tree_of(roots: ReadonlyArray<number>, probes:
|
|
126
|
+
function tree_of(roots: ReadonlyArray<number>, probes: TreeProbes): Array<number> {
|
|
103
127
|
const tree: Array<number> = []
|
|
104
128
|
const pending = [...roots]
|
|
105
129
|
let next = pending.shift()
|
|
@@ -116,35 +140,46 @@ function tree_of(roots: ReadonlyArray<number>, probes: ReapProbes): Array<number
|
|
|
116
140
|
return tree
|
|
117
141
|
}
|
|
118
142
|
|
|
119
|
-
function roots_of(issue: string, own: Set<number>, probes:
|
|
143
|
+
function roots_of(issue: string, own: Set<number>, probes: TreeProbes): Array<number> {
|
|
120
144
|
const pattern = lane_child_invocation.process_pattern(issue)
|
|
121
145
|
|
|
122
146
|
return probes.matching(pattern).filter((pid) => !own.has(pid))
|
|
123
147
|
}
|
|
124
148
|
|
|
125
149
|
/**
|
|
126
|
-
*
|
|
127
|
-
*
|
|
128
|
-
* that had already ended by itself.
|
|
150
|
+
* Every process of the lane child for `issue` and everything under it, collected before anything is
|
|
151
|
+
* signalled, the caller's own ancestry left out.
|
|
129
152
|
*/
|
|
130
|
-
function
|
|
153
|
+
function lane_tree(issue: string, probes: TreeProbes = SYSTEM_PROBES): Array<number> {
|
|
131
154
|
const own = own_ancestry(probes)
|
|
132
|
-
const doomed = tree_of(roots_of(issue, own, probes), probes).filter((pid) => !own.has(pid))
|
|
133
155
|
|
|
134
|
-
return
|
|
156
|
+
return tree_of(roots_of(issue, own, probes), probes).filter((pid) => !own.has(pid))
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* Terminate every process of the lane child for `lane.issue` and everything under it, sparing the
|
|
161
|
+
* caller's own ancestry. Returns the pids that were signalled — the empty list is the healthy case, a
|
|
162
|
+
* child that had already ended by itself.
|
|
163
|
+
*/
|
|
164
|
+
function reap_child(lane: LaneProcesses, probes: ReapProbes = SYSTEM_PROBES): Array<number> {
|
|
165
|
+
return lane_tree(lane.issue, probes).filter((pid) => probes.terminate(pid))
|
|
135
166
|
}
|
|
136
167
|
|
|
137
168
|
/** Whether a lane child for `issue` is running, by the same match `reap_child` would end. */
|
|
138
|
-
function is_child_running(issue: string, probes:
|
|
169
|
+
function is_child_running(issue: string, probes: TreeProbes = SYSTEM_PROBES): boolean {
|
|
139
170
|
return roots_of(issue, own_ancestry(probes), probes).length > 0
|
|
140
171
|
}
|
|
141
172
|
|
|
142
173
|
const lane_reap = {
|
|
143
174
|
is_child_running,
|
|
175
|
+
lane_tree,
|
|
144
176
|
own_ancestry,
|
|
145
177
|
parse_pids,
|
|
178
|
+
PS_COMMAND,
|
|
146
179
|
reap_child,
|
|
180
|
+
run_probe,
|
|
181
|
+
SYSTEM_PROBES,
|
|
147
182
|
}
|
|
148
183
|
|
|
149
|
-
export type { ReapProbes }
|
|
184
|
+
export type { LaneProcesses, ReapProbes, TreeProbes }
|
|
150
185
|
export { lane_reap }
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { existsSync, statSync } from 'node:fs'
|
|
1
|
+
import { chmodSync, existsSync, statSync, writeFileSync } from 'node:fs'
|
|
2
2
|
import path from 'node:path'
|
|
3
3
|
import { ENV_FILE_NAME } from '#ports'
|
|
4
4
|
import type { AgentProfile } from '#scripts/agent/agent-role-profile'
|
|
@@ -20,6 +20,8 @@ import { lane_paths } from './lane-paths'
|
|
|
20
20
|
// that can go stale. A counter, or a ledger beside the trees, would let a lane that was closed and
|
|
21
21
|
// reopened take a seat a running lane is still using.
|
|
22
22
|
|
|
23
|
+
const OWNER_ONLY_MODE = 0o600
|
|
24
|
+
|
|
23
25
|
interface LaneInfo {
|
|
24
26
|
issue: string
|
|
25
27
|
branch: string
|
|
@@ -109,6 +111,15 @@ function read_environment(directory: string): string | undefined {
|
|
|
109
111
|
return file_reader.read_if_readable(path.join(directory, ENV_FILE_NAME))
|
|
110
112
|
}
|
|
111
113
|
|
|
114
|
+
// The lane's `.env` carries the root's secrets (the Telegram token), so it is readable by its owner
|
|
115
|
+
// alone. `mode` applies only to a file the write creates, so an existing one is narrowed after.
|
|
116
|
+
function write_environment(directory: string, content: string): void {
|
|
117
|
+
const file = path.join(directory, ENV_FILE_NAME)
|
|
118
|
+
|
|
119
|
+
writeFileSync(file, content, { mode: OWNER_ONLY_MODE })
|
|
120
|
+
chmodSync(file, OWNER_ONLY_MODE)
|
|
121
|
+
}
|
|
122
|
+
|
|
112
123
|
function dispatched_at(directory: string): number | undefined {
|
|
113
124
|
return statSync(path.join(directory, ENV_FILE_NAME), { throwIfNoEntry: false })?.mtimeMs
|
|
114
125
|
}
|
|
@@ -222,9 +233,28 @@ async function main_repository_root(): Promise<string> {
|
|
|
222
233
|
return repo_discovery.main_worktree(await git_command.repository_root())
|
|
223
234
|
}
|
|
224
235
|
|
|
225
|
-
/**
|
|
226
|
-
|
|
227
|
-
|
|
236
|
+
/**
|
|
237
|
+
* The directory this repository's lanes live in, read from the main work tree rather than this one —
|
|
238
|
+
* derived from the current work tree, a command run inside a lane would look for lanes inside it.
|
|
239
|
+
*/
|
|
240
|
+
async function lane_root_directory(): Promise<string> {
|
|
241
|
+
return lane_paths.lane_root(await main_repository_root())
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
/**
|
|
245
|
+
* The issue's lane by the directory its number implies, registered or not — what ending its processes
|
|
246
|
+
* needs (`lane_reap.reap_child`), so a lane `list_lanes` no longer reads is still reached.
|
|
247
|
+
*/
|
|
248
|
+
async function lane_location(issue: string): Promise<Pick<LaneInfo, 'issue' | 'directory'>> {
|
|
249
|
+
return { issue, directory: lane_paths.lane_directory(await lane_root_directory(), issue) }
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
/**
|
|
253
|
+
* Every open lane of this repository, lowest issue number first. `main_root` is the main work tree a
|
|
254
|
+
* caller already resolved — `run:board` resolves it once rather than with a `git` call each read.
|
|
255
|
+
*/
|
|
256
|
+
async function list_lanes(main_root?: string): Promise<Array<LaneInfo>> {
|
|
257
|
+
const root = lane_paths.lane_root(main_root ?? (await main_repository_root()))
|
|
228
258
|
const blocks = await worktree_blocks()
|
|
229
259
|
const lanes = blocks.map((block) => parse_block(block, root)).filter(is_lane)
|
|
230
260
|
|
|
@@ -279,6 +309,8 @@ const lane_registry = {
|
|
|
279
309
|
find_lane,
|
|
280
310
|
find_open_lane,
|
|
281
311
|
has_lanes_in_flight,
|
|
312
|
+
lane_location,
|
|
313
|
+
lane_root_directory,
|
|
282
314
|
list_lanes,
|
|
283
315
|
main_repository_root,
|
|
284
316
|
parse_block,
|
|
@@ -286,6 +318,8 @@ const lane_registry = {
|
|
|
286
318
|
registered_directories,
|
|
287
319
|
unreadable_lanes,
|
|
288
320
|
used_seats,
|
|
321
|
+
write_environment,
|
|
322
|
+
OWNER_ONLY_MODE,
|
|
289
323
|
}
|
|
290
324
|
|
|
291
325
|
export type { LaneInfo }
|
|
@@ -7,7 +7,7 @@ import { lane_dispatch_log } from './lane-dispatch-log'
|
|
|
7
7
|
import type { LaneInfo } from './lane-registry'
|
|
8
8
|
|
|
9
9
|
// Relaunching a lane child session into its own lane — a fresh agent process started detached, under
|
|
10
|
-
// the lane's stored profile at the effort of the phase it resumes into, logging to the lane's dispatch
|
|
10
|
+
// the lane's stored profile at the effort (and any model override) of the phase it resumes into, logging to the lane's dispatch
|
|
11
11
|
// log and carrying the dispatch mark afresh. **It was `run:cut`'s alone until a second caller needed it**:
|
|
12
12
|
// the detached `josh ship` supervisor hands a stopped stage back to an agent
|
|
13
13
|
// the same way the pre-gate cut hands the gate to one, so the launch is shared rather than copied — the
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
import { spawnSync } from 'node:child_process'
|
|
2
|
+
import path from 'node:path'
|
|
3
|
+
import { PROBE_TIMEOUT_MS } from '#scripts/lib/timeouts'
|
|
4
|
+
import { lane_reap } from './lane-reap'
|
|
5
|
+
import { process_directories } from './process-directories'
|
|
6
|
+
import { process_lane_marks } from './process-lane-marks'
|
|
7
|
+
|
|
8
|
+
// Ending what still runs from a lane's checkout, or carries its mark, when the lane closes
|
|
9
|
+
// (joshuafolkken/kit#4304, joshuafolkken/kit#4315).
|
|
10
|
+
//
|
|
11
|
+
// **The lane child's tree and its `eslint_d` are not everything a lane starts.** A diagnostic the
|
|
12
|
+
// child launched under `script`, or a `node` it detached, is re-parented to pid 1 and outlives the
|
|
13
|
+
// merge: no tree reaches it and no title names it, and `run:board` drew such processes as a leftover
|
|
14
|
+
// holding gigabytes while nothing ended them. Its working directory still sits under the lane, which
|
|
15
|
+
// is what finds it — the same reading the board's leftover is drawn from (`process-directories.ts`).
|
|
16
|
+
// **A process the child started from elsewhere** — a measurement run from the main checkout or `/tmp`
|
|
17
|
+
// — has no such directory, so the lane's mark it inherited finds it instead (`process-lane-marks.ts`):
|
|
18
|
+
// the issue number `lane:dispatch` put in the child's environment. A process without the mark, or with
|
|
19
|
+
// another issue's, is never this lane's.
|
|
20
|
+
//
|
|
21
|
+
// **Only that lane's processes, and never the caller.** Another lane's and the main checkout's
|
|
22
|
+
// unmarked processes are not its. A `lane:close` run from inside the lane would match itself, so its
|
|
23
|
+
// ancestry is spared, as `lane-reap.ts` spares it — and so is its process group: its own helpers
|
|
24
|
+
// (`tsx`'s `esbuild`) and the commands piped beside it share the group, while a detached process
|
|
25
|
+
// (`script`, a new session) has left it.
|
|
26
|
+
|
|
27
|
+
const GROUP_ARGUMENTS = ['-o', 'pid=,pgid=', '-p']
|
|
28
|
+
const PID_SEPARATOR = ','
|
|
29
|
+
// `ps`'s line: the process and its group.
|
|
30
|
+
const PAIR_LENGTH = 2
|
|
31
|
+
|
|
32
|
+
interface ResidentLane {
|
|
33
|
+
issue: string
|
|
34
|
+
directory: string
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
interface ResidentProbes {
|
|
38
|
+
// `undefined` where the working directories could not be read.
|
|
39
|
+
directories: () => ReadonlyMap<number, string> | undefined
|
|
40
|
+
// Each marked process's issue; `undefined` where the marks could not be read.
|
|
41
|
+
marks: () => ReadonlyMap<number, string> | undefined
|
|
42
|
+
own: () => ReadonlySet<number>
|
|
43
|
+
// Each listed process's group; a process gone by then is missing.
|
|
44
|
+
groups_of: (pids: ReadonlyArray<number>) => ReadonlyMap<number, number>
|
|
45
|
+
terminate: (pid: number) => boolean
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function parse_groups(printed: string): Map<number, number> {
|
|
49
|
+
const pairs = printed
|
|
50
|
+
.split('\n')
|
|
51
|
+
.map((line) => line.trim().split(/\s+/u).map(Number))
|
|
52
|
+
.filter((pair) => pair.length === PAIR_LENGTH && pair.every((id) => Number.isSafeInteger(id)))
|
|
53
|
+
|
|
54
|
+
return new Map(pairs.map(([pid = 0, group = 0]) => [pid, group] as const))
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// `ps` exits non-zero when a listed process is gone and still prints the rest, so its output is read
|
|
58
|
+
// whatever the exit status.
|
|
59
|
+
function groups_of(pids: ReadonlyArray<number>): Map<number, number> {
|
|
60
|
+
const result = spawnSync(lane_reap.PS_COMMAND, [...GROUP_ARGUMENTS, pids.join(PID_SEPARATOR)], {
|
|
61
|
+
encoding: 'utf8',
|
|
62
|
+
timeout: PROBE_TIMEOUT_MS,
|
|
63
|
+
stdio: ['ignore', 'pipe', 'ignore'],
|
|
64
|
+
})
|
|
65
|
+
|
|
66
|
+
return parse_groups(result.stdout)
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
const SYSTEM_PROBES: ResidentProbes = {
|
|
70
|
+
directories: () => process_directories.list_all(),
|
|
71
|
+
marks: () => process_lane_marks.list_all(),
|
|
72
|
+
own: () => lane_reap.own_ancestry(),
|
|
73
|
+
groups_of,
|
|
74
|
+
terminate: (pid) => lane_reap.SYSTEM_PROBES.terminate(pid),
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// The candidates outside the caller's process group. The caller's own group unread spares nothing
|
|
78
|
+
// more: its ancestry is spared regardless.
|
|
79
|
+
function outside_own_group(candidates: Array<number>, probes: ResidentProbes): Array<number> {
|
|
80
|
+
if (candidates.length === 0) return candidates
|
|
81
|
+
const groups = probes.groups_of([process.pid, ...candidates])
|
|
82
|
+
const own_group = groups.get(process.pid)
|
|
83
|
+
|
|
84
|
+
return candidates.filter((pid) => own_group === undefined || groups.get(pid) !== own_group)
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// Every process running from the lane's directory or carrying its mark, once each.
|
|
88
|
+
function lane_processes(
|
|
89
|
+
lane: ResidentLane,
|
|
90
|
+
directories: ReadonlyMap<number, string>,
|
|
91
|
+
marks: ReadonlyMap<number, string>,
|
|
92
|
+
): Array<number> {
|
|
93
|
+
const root = path.dirname(lane.directory)
|
|
94
|
+
const within = [...directories]
|
|
95
|
+
.filter(([, cwd]) => process_directories.lane_of(cwd, root) === lane.issue)
|
|
96
|
+
.map(([pid]) => pid)
|
|
97
|
+
const marked = [...marks].filter(([, issue]) => issue === lane.issue).map(([pid]) => pid)
|
|
98
|
+
|
|
99
|
+
return [...new Set([...within, ...marked])]
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* The processes running from `lane`'s directory or carrying its mark, the caller's ancestry and process
|
|
104
|
+
* group left out; `undefined` where the working directories or the marks could not be read.
|
|
105
|
+
*/
|
|
106
|
+
function residents(
|
|
107
|
+
lane: ResidentLane,
|
|
108
|
+
probes: ResidentProbes = SYSTEM_PROBES,
|
|
109
|
+
): Array<number> | undefined {
|
|
110
|
+
const directories = probes.directories()
|
|
111
|
+
const marks = probes.marks()
|
|
112
|
+
|
|
113
|
+
if (directories === undefined || marks === undefined) return undefined
|
|
114
|
+
const own = probes.own()
|
|
115
|
+
const candidates = lane_processes(lane, directories, marks).filter((pid) => !own.has(pid))
|
|
116
|
+
|
|
117
|
+
return outside_own_group(candidates, probes)
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Terminate the processes still running from `lane`'s directory or carrying its mark, except `spared`
|
|
122
|
+
* — what the close already ended. Returns the pids the signal reached, `undefined` where they could
|
|
123
|
+
* not be read.
|
|
124
|
+
*/
|
|
125
|
+
function end_residents(
|
|
126
|
+
lane: ResidentLane,
|
|
127
|
+
spared: ReadonlyArray<number>,
|
|
128
|
+
probes: ResidentProbes = SYSTEM_PROBES,
|
|
129
|
+
): Array<number> | undefined {
|
|
130
|
+
return residents(lane, probes)
|
|
131
|
+
?.filter((pid) => !spared.includes(pid))
|
|
132
|
+
.filter((pid) => probes.terminate(pid))
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* What `end_residents` did, said for the issue `cited`; `undefined` when nothing of the lane still ran.
|
|
137
|
+
* A reading that failed is said, never read as none.
|
|
138
|
+
*/
|
|
139
|
+
function residents_sentence(
|
|
140
|
+
ended: ReadonlyArray<number> | undefined,
|
|
141
|
+
cited: string,
|
|
142
|
+
): string | undefined {
|
|
143
|
+
if (ended === undefined) {
|
|
144
|
+
return `Could not read which processes still run from the lane for ${cited} (lsof or ps failed); none of them was ended.`
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
if (ended.length === 0) return undefined
|
|
148
|
+
|
|
149
|
+
return `Terminated ${String(ended.length)} process(es) still running from the lane for ${cited}: ${ended.join(', ')}.`
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/** Print `residents_sentence` to stderr, where a close reports what it ended. */
|
|
153
|
+
function report(ended: ReadonlyArray<number> | undefined, cited: string): void {
|
|
154
|
+
const sentence = residents_sentence(ended, cited)
|
|
155
|
+
|
|
156
|
+
if (sentence !== undefined) console.error(sentence)
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
const lane_residents = { end_residents, parse_groups, report, residents, residents_sentence }
|
|
160
|
+
|
|
161
|
+
export type { ResidentLane, ResidentProbes }
|
|
162
|
+
export { lane_residents }
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { git_stash } from '#scripts/git/stash/git-stash'
|
|
1
2
|
import { issue_cite } from '#scripts/issue/issue-cite'
|
|
2
3
|
import { IN_PROGRESS_LABEL } from '#scripts/issue/issue-labels'
|
|
3
4
|
import { issue_number_shape } from '#scripts/issue/issue-number-shape'
|
|
@@ -9,13 +10,14 @@ import { lane_dispatch, type DispatchOutcome } from './lane-dispatch'
|
|
|
9
10
|
import { lane_preserve, type KeptWork } from './lane-preserve'
|
|
10
11
|
import { lane_reap } from './lane-reap'
|
|
11
12
|
import { lane_registry, type LaneInfo } from './lane-registry'
|
|
13
|
+
import { lane_residents } from './lane-residents'
|
|
12
14
|
|
|
13
15
|
// `josh lane:restart <N>` — a person stops a running lane child and starts its issue over in a fresh
|
|
14
16
|
// session, typically after correcting the Issue's specification mid-run.
|
|
15
17
|
//
|
|
16
18
|
// **The restart is a hand-off inside the parent's re-confirm window, not a recovery.** Killing the child
|
|
17
19
|
// alone would let `lane:await` book it stopped and `run:merge` classify it — an `outage` resumes the old
|
|
18
|
-
// session with the old specification in mind, anything else is parked `
|
|
20
|
+
// session with the old specification in mind, anything else is parked `run:stalled` and counted as a
|
|
19
21
|
// failure. `run:cut` already hands a lane to a new process inside `lane:await`'s re-confirm window, so a
|
|
20
22
|
// child that disappears and reappears under the same `fullrun #<N>` pattern is never collected: the
|
|
21
23
|
// restart stops, stashes and re-dispatches within that window, and no failure or outage is counted.
|
|
@@ -35,6 +37,7 @@ const DISPATCHED_KIND = 'dispatched'
|
|
|
35
37
|
const NO_LANE_KIND = 'no-lane'
|
|
36
38
|
const NOT_RUNNING_KIND = 'not-running'
|
|
37
39
|
const UNCLAIMED_KIND = 'unclaimed'
|
|
40
|
+
const CONFLICTED_KIND = 'conflicted'
|
|
38
41
|
|
|
39
42
|
type Unsaved = Extract<KeptWork, { kind: 'unsaved' }>
|
|
40
43
|
|
|
@@ -48,6 +51,7 @@ type Refused =
|
|
|
48
51
|
| { kind: typeof NO_LANE_KIND }
|
|
49
52
|
| { kind: typeof NOT_RUNNING_KIND }
|
|
50
53
|
| { kind: typeof UNCLAIMED_KIND; reason: string }
|
|
54
|
+
| { kind: typeof CONFLICTED_KIND; directory: string }
|
|
51
55
|
type RestartOutcome = Restarted | Unsaved | Refused
|
|
52
56
|
|
|
53
57
|
// A cut the stopped child carried would hand its successor the old session's hand-off at
|
|
@@ -85,12 +89,19 @@ async function relaunch(lane: LaneInfo): Promise<RestartOutcome> {
|
|
|
85
89
|
|
|
86
90
|
// A child that ended on its own during the claim (say, right after merging its PR) is a finished child
|
|
87
91
|
// for `run:merge` to collect — relaunching it would re-run a done issue inside the re-confirm window.
|
|
92
|
+
// What the stopped child started outside its tree goes with it, so the fresh session starts beside none
|
|
93
|
+
// of it (`lane-residents.ts`).
|
|
88
94
|
async function stop_and_relaunch(lane: LaneInfo): Promise<RestartOutcome> {
|
|
89
|
-
|
|
95
|
+
const reaped = lane_reap.reap_child(lane)
|
|
96
|
+
|
|
97
|
+
if (reaped.length === 0) return { kind: NOT_RUNNING_KIND }
|
|
98
|
+
lane_residents.report(lane_residents.end_residents(lane, reaped), session_cite.issue(lane.issue))
|
|
90
99
|
|
|
91
100
|
return await relaunch(lane)
|
|
92
101
|
}
|
|
93
102
|
|
|
103
|
+
// A tree with unresolved conflicts (a sync's merge stopped mid-way) cannot be stashed, so it is refused
|
|
104
|
+
// before the stop — stopping first would strand the lane with no child and nothing re-dispatched.
|
|
94
105
|
/** Stop the running child of `#<N>`'s lane and re-dispatch the issue there in a fresh session. */
|
|
95
106
|
async function restart(issue: string): Promise<RestartOutcome> {
|
|
96
107
|
issue_number_shape.require_issue_number(issue)
|
|
@@ -98,6 +109,11 @@ async function restart(issue: string): Promise<RestartOutcome> {
|
|
|
98
109
|
|
|
99
110
|
if (lane === undefined) return { kind: NO_LANE_KIND }
|
|
100
111
|
if (!lane_reap.is_child_running(issue)) return { kind: NOT_RUNNING_KIND }
|
|
112
|
+
|
|
113
|
+
if (await git_stash.has_conflict(lane.directory)) {
|
|
114
|
+
return { kind: CONFLICTED_KIND, directory: lane.directory }
|
|
115
|
+
}
|
|
116
|
+
|
|
101
117
|
const claim = await lane_dispatch.claim_marker(issue)
|
|
102
118
|
|
|
103
119
|
if (!claim.is_applied) return { kind: UNCLAIMED_KIND, reason: claim.reason }
|
|
@@ -133,6 +149,10 @@ function refused_text(outcome: Refused, issue: string): string {
|
|
|
133
149
|
return `No lane is open for ${cited}, so there is no child to restart.`
|
|
134
150
|
}
|
|
135
151
|
|
|
152
|
+
if (outcome.kind === CONFLICTED_KIND) {
|
|
153
|
+
return `The lane for ${cited} has unresolved conflicts, which \`git stash\` cannot keep, so the running child was left as it is — nothing was stopped or re-dispatched. Resolve them, or run \`git -C ${outcome.directory} merge --abort\`, then run \`pnpm josh lane:restart ${issue}\` again.`
|
|
154
|
+
}
|
|
155
|
+
|
|
136
156
|
if (outcome.kind === UNCLAIMED_KIND) {
|
|
137
157
|
return `The \`${IN_PROGRESS_LABEL}\` label could not be confirmed on ${cited} (${outcome.reason}), so the running child was left as it is — nothing was stopped or re-dispatched.`
|
|
138
158
|
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { lane_ledger, type LedgerEntry, type RoundOneEntry } from './lane-ledger'
|
|
2
|
+
import { lane_stats, type StatsWindow } from './lane-stats'
|
|
3
|
+
|
|
4
|
+
// How a `josh ship`'s round 1 ended: the ledger's `round-one` entries of one period, one row per
|
|
5
|
+
// verdict, with each reviewed verdict's share of the rounds the ship ran. The `clean` share is the rate
|
|
6
|
+
// a ship-time round 1 passed with no fix — the number the "CI beside the review" break-even of
|
|
7
|
+
// `docs/maintainers/lane-limit-measurement.md` is read against (joshuafolkken/kit#4620). A `reused`
|
|
8
|
+
// round never ran, so it has a count and no share.
|
|
9
|
+
|
|
10
|
+
const COLUMNS = ['round 1', 'rounds', 'share'] as const
|
|
11
|
+
const VERDICTS = ['clean', 'fixed', 'blocking'] as const
|
|
12
|
+
const { ROUND_ONE_REUSED: REUSED } = lane_ledger
|
|
13
|
+
const NO_SHARE = '-'
|
|
14
|
+
const PERCENT = 100
|
|
15
|
+
|
|
16
|
+
function is_round_one(entry: LedgerEntry): entry is RoundOneEntry {
|
|
17
|
+
return entry.kind === lane_ledger.KIND.ROUND_ONE
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
function count_of(rounds: ReadonlyArray<RoundOneEntry>, verdict: string): number {
|
|
21
|
+
return rounds.filter((round) => round.verdict === verdict).length
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function share_of(count: number, ran: number): string {
|
|
25
|
+
if (ran === 0) return NO_SHARE
|
|
26
|
+
|
|
27
|
+
return `${String(Math.round((count * PERCENT) / ran))}%`
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// The period's table: `entries` is the whole ledger, filtered here to `window`.
|
|
31
|
+
function table(entries: ReadonlyArray<LedgerEntry>, window: StatsWindow): string {
|
|
32
|
+
const rounds = lane_stats.in_window(entries, window).filter(is_round_one)
|
|
33
|
+
const counts = VERDICTS.map((verdict) => count_of(rounds, verdict))
|
|
34
|
+
const ran = counts.reduce((sum, count) => sum + count, 0)
|
|
35
|
+
const rows = VERDICTS.map((verdict, index) => {
|
|
36
|
+
const count = counts[index] ?? 0
|
|
37
|
+
|
|
38
|
+
return lane_stats.to_row([verdict, String(count), share_of(count, ran)])
|
|
39
|
+
})
|
|
40
|
+
|
|
41
|
+
return [
|
|
42
|
+
lane_stats.to_row(COLUMNS),
|
|
43
|
+
lane_stats.to_row(COLUMNS.map(() => '---')),
|
|
44
|
+
...rows,
|
|
45
|
+
lane_stats.to_row([REUSED, String(count_of(rounds, REUSED)), NO_SHARE]),
|
|
46
|
+
].join('\n')
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
const lane_round_one_stats = { table }
|
|
50
|
+
|
|
51
|
+
export { lane_round_one_stats }
|