@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
|
@@ -1,7 +1,9 @@
|
|
|
1
|
+
import { lane_state, type LaneStateRecord } from '#scripts/lane/lane-state'
|
|
1
2
|
import { error_text } from '#scripts/lib/error-message'
|
|
3
|
+
import { run_board_lane_time } from '#scripts/run/board/run-board-lane-time'
|
|
2
4
|
import { run_carry } from '#scripts/run/carry/run-carry'
|
|
3
5
|
import { run_event_scope } from './run-event-scope'
|
|
4
|
-
import { run_event_stream, type RunEvent } from './run-event-stream'
|
|
6
|
+
import { run_event_stream, type AppendResult, type RunEvent } from './run-event-stream'
|
|
5
7
|
|
|
6
8
|
// The write side of the run's event stream. It resolves the run's identity and
|
|
7
9
|
// appends, and it is where the "reporting must not break the work it reports on" contract is kept: every
|
|
@@ -27,17 +29,66 @@ async function stream_target(): Promise<string | undefined> {
|
|
|
27
29
|
return repository === undefined ? undefined : run_event_stream.target_of(repository)
|
|
28
30
|
}
|
|
29
31
|
|
|
32
|
+
// The child's lane record; an unreadable one reads as none, so the ending is still written.
|
|
33
|
+
async function lane_record(issue: string): Promise<LaneStateRecord | undefined> {
|
|
34
|
+
try {
|
|
35
|
+
return await lane_state.read_state(issue)
|
|
36
|
+
} catch (error) {
|
|
37
|
+
error_text.trace_swallowed('run_event_stream_emit.lane_record', error)
|
|
38
|
+
|
|
39
|
+
return undefined
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
async function ending_fields(
|
|
44
|
+
target: string,
|
|
45
|
+
event: Omit<RunEvent, 'pos'>,
|
|
46
|
+
): Promise<Pick<RunEvent, 'elapsed_ms'>> {
|
|
47
|
+
const issue = run_event_scope.issue_named(event)
|
|
48
|
+
|
|
49
|
+
if (issue === undefined || !run_board_lane_time.OFF_LANE_KINDS.has(event.kind)) return {}
|
|
50
|
+
|
|
51
|
+
const elapsed_ms = run_board_lane_time.ending_elapsed({
|
|
52
|
+
events: run_event_stream.read_events(target),
|
|
53
|
+
issue: Number(issue),
|
|
54
|
+
record: await lane_record(issue),
|
|
55
|
+
ended_ms: Date.parse(event.at),
|
|
56
|
+
})
|
|
57
|
+
|
|
58
|
+
return elapsed_ms === undefined ? {} : { elapsed_ms }
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Append one event at `at`, an ending with its child's lane time (joshuafolkken/kit#4481). Every writer
|
|
63
|
+
* of an ending — `emit` and `run:event --append` — appends through here, so the time is computed once,
|
|
64
|
+
* as the ending is written, with the board's own count.
|
|
65
|
+
*/
|
|
66
|
+
async function append_at(
|
|
67
|
+
target: string,
|
|
68
|
+
kind: string,
|
|
69
|
+
text: string,
|
|
70
|
+
at: Date,
|
|
71
|
+
): Promise<AppendResult> {
|
|
72
|
+
const event = { kind, text, at: at.toISOString() }
|
|
73
|
+
|
|
74
|
+
return run_event_stream.append_event(target, {
|
|
75
|
+
...event,
|
|
76
|
+
...(await ending_fields(target, event)),
|
|
77
|
+
})
|
|
78
|
+
}
|
|
79
|
+
|
|
30
80
|
/**
|
|
31
81
|
* Append one session-facing event, best-effort. A kind outside the enumeration is refused by `append`;
|
|
32
82
|
* every error is swallowed, because the reporting path must never fail the work it reports on.
|
|
83
|
+
* `at` is the caller's instant where another record must carry the same one.
|
|
33
84
|
*/
|
|
34
|
-
async function emit(kind: string, text: string): Promise<void> {
|
|
85
|
+
async function emit(kind: string, text: string, at: Date = new Date()): Promise<void> {
|
|
35
86
|
try {
|
|
36
87
|
const target = await stream_target()
|
|
37
88
|
|
|
38
89
|
if (target === undefined) return
|
|
39
90
|
|
|
40
|
-
|
|
91
|
+
await append_at(target, kind, text, at)
|
|
41
92
|
} catch {
|
|
42
93
|
// Reporting is best-effort: a failed append is dropped rather than raised into the caller's work.
|
|
43
94
|
}
|
|
@@ -85,37 +136,52 @@ function invocation_events(repository: string, target: string): ReadonlyArray<Ru
|
|
|
85
136
|
* Append one event unless this kind is already on the stream since the newest `reset_kind` — the
|
|
86
137
|
* episode marker for a condition that holds across other events. `emit_once`'s newest-event test would
|
|
87
138
|
* re-fire each time a parallel lane appended a merge or a park; this ends the episode only at
|
|
88
|
-
* `reset_kind`.
|
|
139
|
+
* `reset_kind`. The text is composed only once the episode is new, so a caller polled every pass whose
|
|
140
|
+
* text costs a network read pays it once. Returns the appended text, or `undefined` when nothing was.
|
|
89
141
|
*/
|
|
90
|
-
async function
|
|
142
|
+
async function emit_once_since_with(
|
|
143
|
+
kind: string,
|
|
144
|
+
reset_kind: string,
|
|
145
|
+
compose: () => Promise<string>,
|
|
146
|
+
): Promise<string | undefined> {
|
|
91
147
|
try {
|
|
92
148
|
const repository = await run_carry.repository_directory()
|
|
93
149
|
|
|
94
|
-
if (repository === undefined) return
|
|
150
|
+
if (repository === undefined) return undefined
|
|
95
151
|
|
|
96
152
|
const target = run_event_stream.target_of(repository)
|
|
97
153
|
|
|
98
154
|
if (run_event_stream.has_since(invocation_events(repository, target), kind, reset_kind)) {
|
|
99
|
-
return
|
|
155
|
+
return undefined
|
|
100
156
|
}
|
|
101
157
|
|
|
102
|
-
|
|
158
|
+
const text = await compose()
|
|
159
|
+
|
|
160
|
+
return run_event_stream.append(target, kind, text, now_iso()).appended ? text : undefined
|
|
103
161
|
} catch (error) {
|
|
104
162
|
// Best-effort: a failed append is dropped rather than raised into the caller's work.
|
|
105
163
|
error_text.trace_swallowed('run_event_stream_emit.emit_once_since', error)
|
|
106
164
|
|
|
107
|
-
return
|
|
165
|
+
return undefined
|
|
108
166
|
}
|
|
109
167
|
}
|
|
110
168
|
|
|
169
|
+
// `emit_once_since_with` for a text already in hand. Returns whether it appended, as `emit_once` does.
|
|
170
|
+
async function emit_once_since(kind: string, text: string, reset_kind: string): Promise<boolean> {
|
|
171
|
+
const appended = await emit_once_since_with(kind, reset_kind, async () => text)
|
|
172
|
+
|
|
173
|
+
return appended !== undefined
|
|
174
|
+
}
|
|
175
|
+
|
|
111
176
|
// One progress heartbeat line onto the stream, so a relay reaches it across a cut.
|
|
112
177
|
async function emit_heartbeat(line: string): Promise<void> {
|
|
113
178
|
await emit(run_event_stream.EVENT_KIND.HEARTBEAT, line)
|
|
114
179
|
}
|
|
115
180
|
|
|
116
|
-
// The events of the invocation now running,
|
|
117
|
-
//
|
|
118
|
-
|
|
181
|
+
// The events of the invocation now running, for a reader restoring the run from its stream
|
|
182
|
+
// (`backlog:drive`). Fail-quiet like the writers: no repository, an unreadable stream or an
|
|
183
|
+
// undetermined scope is an empty invocation.
|
|
184
|
+
async function current_events(): Promise<ReadonlyArray<RunEvent>> {
|
|
119
185
|
try {
|
|
120
186
|
const repository = await run_carry.repository_directory()
|
|
121
187
|
|
|
@@ -125,19 +191,12 @@ async function scoped_current_events(): Promise<ReadonlyArray<RunEvent> | undefi
|
|
|
125
191
|
const scope = run_event_scope.scope_of(read)
|
|
126
192
|
const events = run_event_stream.read_events(run_event_stream.target_of(repository))
|
|
127
193
|
|
|
128
|
-
return run_event_scope.scoped_events(events, scope)
|
|
194
|
+
return run_event_scope.scoped_events(events, scope) ?? []
|
|
129
195
|
} catch {
|
|
130
|
-
return
|
|
196
|
+
return []
|
|
131
197
|
}
|
|
132
198
|
}
|
|
133
199
|
|
|
134
|
-
// The events of the invocation now running, for a reader restoring the run from its stream
|
|
135
|
-
// (`backlog:drive`). Fail-quiet like the writers: no repository, an unreadable stream or an
|
|
136
|
-
// undetermined scope is an empty invocation.
|
|
137
|
-
async function current_events(): Promise<ReadonlyArray<RunEvent>> {
|
|
138
|
-
return (await scoped_current_events()) ?? []
|
|
139
|
-
}
|
|
140
|
-
|
|
141
200
|
// The invocation's events for a writer deciding whether a marker is already there: unlike
|
|
142
201
|
// `current_events`, an undetermined scope keeps the whole stream, so a run with no carry record skips a
|
|
143
202
|
// marker it already wrote rather than writing it twice.
|
|
@@ -167,13 +226,14 @@ async function all_events(): Promise<ReadonlyArray<RunEvent>> {
|
|
|
167
226
|
|
|
168
227
|
const run_event_stream_emit = {
|
|
169
228
|
all_events,
|
|
229
|
+
append_at,
|
|
170
230
|
current_events,
|
|
171
231
|
emit,
|
|
172
232
|
emit_heartbeat,
|
|
173
233
|
emit_once,
|
|
174
234
|
emit_once_since,
|
|
235
|
+
emit_once_since_with,
|
|
175
236
|
invocation_or_all_events,
|
|
176
|
-
scoped_current_events,
|
|
177
237
|
stream_target,
|
|
178
238
|
}
|
|
179
239
|
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { repository_lock } from '#scripts/git/repository-lock'
|
|
2
|
+
import { durable_state } from '#scripts/josh/durable-state'
|
|
2
3
|
import { stamp_file } from '#scripts/josh/stamp-file'
|
|
3
4
|
import { json_value } from '#scripts/lib/json-value'
|
|
4
5
|
import { run_ship_stage } from '#scripts/run/ship/run-ship-stage'
|
|
@@ -24,15 +25,16 @@ import { z } from 'zod'
|
|
|
24
25
|
// must never fail the work it reports on, so `run-event-stream-emit.ts` wraps
|
|
25
26
|
// every append in a swallow; this module is free to throw on a genuinely broken write.
|
|
26
27
|
|
|
27
|
-
const EVENT_PREFIX =
|
|
28
|
+
const EVENT_PREFIX = durable_state.PREFIX.EVENTS
|
|
28
29
|
// `.jsonl` rather than `.json`: the file is one JSON event per line, appended to, and the suffix tells
|
|
29
30
|
// every reader — a person, an editor — that it is a line stream rather than a single document, the same
|
|
30
31
|
// distinction the ambient `.log` draws.
|
|
31
32
|
const EVENT_SUFFIX = '.jsonl'
|
|
32
|
-
// A run's
|
|
33
|
-
//
|
|
34
|
-
//
|
|
35
|
-
|
|
33
|
+
// A week of a busy run's events, so `josh lane:stats --period 7` reads the parks that end a stop's wait
|
|
34
|
+
// and `run:board` keeps every ship stage (joshuafolkken/kit#3997). A four-lane `backlogrun` wrote about
|
|
35
|
+
// 75 events an hour (1,877 in 25 hours), so fifteen thousand holds about eight days at that rate and
|
|
36
|
+
// still bounds the file to a few megabytes — past it the oldest events roll off.
|
|
37
|
+
const EVENT_CAP = 15_000
|
|
36
38
|
const FIRST_POSITION = 0
|
|
37
39
|
const POSITION_INCREMENT = 1
|
|
38
40
|
const LINE_SEPARATOR = '\n'
|
|
@@ -55,6 +57,10 @@ const EVENT_KIND = {
|
|
|
55
57
|
PARK: 'park',
|
|
56
58
|
SPLIT: 'split',
|
|
57
59
|
OUTAGE: 'outage',
|
|
60
|
+
// A Claude usage limit stopped a lane child (joshuafolkken/kit#4745). Its text names the reset time,
|
|
61
|
+
// which `backlog:drive` reads to hold launches until then; it counts against no streak, so it is not an
|
|
62
|
+
// `OUTAGE`.
|
|
63
|
+
USAGE_LIMIT: 'usage-limit',
|
|
58
64
|
CUT: 'cut',
|
|
59
65
|
// A fresh session adopted an implementation cut — `run:cut --resume` answered `resume-impl`. The
|
|
60
66
|
// resume clears the cut record, so without this the `cut` would stay the newest position and
|
|
@@ -64,7 +70,7 @@ const EVENT_KIND = {
|
|
|
64
70
|
// (`lane:restart`). It follows the fresh dispatch's `CHILD_LAUNCH`, so it is a launch to the parent and
|
|
65
71
|
// the board, and — like that launch — a batch record a lane child never reads as its own position.
|
|
66
72
|
RESTART: 'restart',
|
|
67
|
-
// A person withdrew a lane child — stopped it and
|
|
73
|
+
// A person withdrew a lane child — stopped it and left its issue open for the next run (`lane:withdraw`).
|
|
68
74
|
// It is written before the stop, so `run:merge` settles the child as withdrawn whatever GitHub says
|
|
69
75
|
// by the time the parent collects it, and counts it as neither a merge, a failure nor an outage.
|
|
70
76
|
WITHDRAW: 'withdraw',
|
|
@@ -115,6 +121,11 @@ const EVENT_KIND = {
|
|
|
115
121
|
// The position that hands control back: `run:step` prints the command that
|
|
116
122
|
// shows the stopped report, so the agent fixes it and relaunches rather than rebuilding the context.
|
|
117
123
|
SHIP_STOP: 'ship-stop',
|
|
124
|
+
// The relaunch meant to answer a `SHIP_STOP` started nothing — the broker refused it, or the direct
|
|
125
|
+
// spawn failed (joshuafolkken/kit#4765). `run:merge` reads it, not the transcript's mtime, to tell the
|
|
126
|
+
// stop went unanswered, and a re-dispatch cap's park names its reason. A trace: the stop stays the
|
|
127
|
+
// position `run:step` answers.
|
|
128
|
+
RELAUNCH_FAILED: 'relaunch-failed',
|
|
118
129
|
// An Issue the run filed on its way, written by `issue:file`, so a run started from the command line
|
|
119
130
|
// still surfaces what it found — `run:board`'s findings section reads it.
|
|
120
131
|
FILED: 'filed',
|
|
@@ -143,6 +154,27 @@ const EVENT_KIND = {
|
|
|
143
154
|
// in followup without asking GitHub (joshuafolkken/kit#3770). A trace: it says how the checks stand,
|
|
144
155
|
// not where the run is.
|
|
145
156
|
PR_CHECKS: 'pr-checks',
|
|
157
|
+
// `backlog:drive` reached a watch with no child running and nothing to dispatch — the point a person's
|
|
158
|
+
// hand is wanted. Emitted once per idle episode (`emit_once_since_with`, reset by `CHILD_LAUNCH`), it
|
|
159
|
+
// is the dedup marker for the one idle Telegram. A trace: a drain's retrospective is read off the
|
|
160
|
+
// position beneath it, so the marker must not stand over it.
|
|
161
|
+
IDLE_NOTICE: 'idle-notice',
|
|
162
|
+
// A person paused or resumed a lane child (`lane:pause` / `lane:resume`), so who halted a lane and
|
|
163
|
+
// when is on the stream rather than only in a shell history (joshuafolkken/kit#4268). A trace: it
|
|
164
|
+
// says what a lane's processes were told, not where the run is.
|
|
165
|
+
LANE_STATE: 'lane-state',
|
|
166
|
+
// `backlog:drive` found nothing of the run in flight and only paused lanes left, paused past the
|
|
167
|
+
// silent window (joshuafolkken/kit#4270). Emitted once per pause episode (`emit_once_since_with`,
|
|
168
|
+
// reset by `LANE_STATE`), it is the dedup marker for the one paused-lane Telegram. A trace.
|
|
169
|
+
PAUSED_NOTICE: 'paused-notice',
|
|
170
|
+
// `backlog:drive` ran a due issue's measurement declaration itself, found it within its bound and
|
|
171
|
+
// closed the issue through `issue:measured` — no lane was launched for it (joshuafolkken/kit#4621).
|
|
172
|
+
// `run:board` draws it merged. A trace: the parent's position is the drive's, not this close.
|
|
173
|
+
MEASURED: 'measured',
|
|
174
|
+
// The host slept while `backlog:drive` sampled its load (joshuafolkken/kit#5032): the sampler's timer
|
|
175
|
+
// ran late by more than a few intervals. `at` is the wake and `elapsed_ms` how long the sleep
|
|
176
|
+
// lasted; every lane's net time takes it out (`lane-sleep.ts`). A trace.
|
|
177
|
+
SLEEP: 'sleep',
|
|
146
178
|
} as const
|
|
147
179
|
|
|
148
180
|
type EventKind = (typeof EVENT_KIND)[keyof typeof EVENT_KIND]
|
|
@@ -162,6 +194,12 @@ const TRACE_KINDS: ReadonlySet<string> = new Set([
|
|
|
162
194
|
EVENT_KIND.LANE_LIMIT,
|
|
163
195
|
EVENT_KIND.SETUP,
|
|
164
196
|
EVENT_KIND.PR_CHECKS,
|
|
197
|
+
EVENT_KIND.IDLE_NOTICE,
|
|
198
|
+
EVENT_KIND.LANE_STATE,
|
|
199
|
+
EVENT_KIND.PAUSED_NOTICE,
|
|
200
|
+
EVENT_KIND.MEASURED,
|
|
201
|
+
EVENT_KIND.RELAUNCH_FAILED,
|
|
202
|
+
EVENT_KIND.SLEEP,
|
|
165
203
|
])
|
|
166
204
|
|
|
167
205
|
// The trace kinds that say only that the run was alive, so the bound rolls them off first. A `filed` or
|
|
@@ -181,6 +219,10 @@ const event_schema = z.object({
|
|
|
181
219
|
at: z.string(),
|
|
182
220
|
kind: z.string(),
|
|
183
221
|
text: z.string(),
|
|
222
|
+
// The child's time on a lane, recorded once by the writer of an ending (joshuafolkken/kit#4481), so a
|
|
223
|
+
// reader never has to find its launch again. An event written before it has none. A `sleep` event
|
|
224
|
+
// carries the sleep's length here.
|
|
225
|
+
elapsed_ms: z.number().optional(),
|
|
184
226
|
})
|
|
185
227
|
|
|
186
228
|
type RunEvent = z.infer<typeof event_schema>
|
|
@@ -204,7 +246,7 @@ function is_event_kind(value: string): value is EventKind {
|
|
|
204
246
|
// The stream's path, keyed on the run's identity the caller resolved. `.jsonl` so the append surface is
|
|
205
247
|
// named for what it is.
|
|
206
248
|
function target_of(repository: string): string {
|
|
207
|
-
return
|
|
249
|
+
return durable_state.path(EVENT_PREFIX, repository, EVENT_SUFFIX)
|
|
208
250
|
}
|
|
209
251
|
|
|
210
252
|
function is_present(event: RunEvent | undefined): event is RunEvent {
|
|
@@ -346,12 +388,12 @@ function append_held(target: string, event: Omit<RunEvent, 'pos'>): number {
|
|
|
346
388
|
* unlocked read-then-rewrite would lose one writer's event to another's. A lock still
|
|
347
389
|
* held after the wait is reported on stderr and thrown, which the best-effort emit side swallows.
|
|
348
390
|
*/
|
|
349
|
-
function
|
|
350
|
-
if (!is_event_kind(kind)) return { appended: false, position: FIRST_POSITION }
|
|
391
|
+
function append_event(target: string, event: Omit<RunEvent, 'pos'>): AppendResult {
|
|
392
|
+
if (!is_event_kind(event.kind)) return { appended: false, position: FIRST_POSITION }
|
|
351
393
|
|
|
352
394
|
const lock = `${target}${LOCK_SUFFIX}`
|
|
353
395
|
const position = repository_lock.with_lock_sync(
|
|
354
|
-
() => append_held(target,
|
|
396
|
+
() => append_held(target, event),
|
|
355
397
|
lock,
|
|
356
398
|
LOCK_WAIT_MS,
|
|
357
399
|
)
|
|
@@ -366,6 +408,11 @@ function append(target: string, kind: string, text: string, at: string): AppendR
|
|
|
366
408
|
return { appended: true, position }
|
|
367
409
|
}
|
|
368
410
|
|
|
411
|
+
// `append_event` for an event that records nothing beyond its kind, text and instant.
|
|
412
|
+
function append(target: string, kind: string, text: string, at: string): AppendResult {
|
|
413
|
+
return append_event(target, { at, kind, text })
|
|
414
|
+
}
|
|
415
|
+
|
|
369
416
|
/**
|
|
370
417
|
* Every event after `position`, in order, and the position a reader passes back next time.
|
|
371
418
|
*
|
|
@@ -415,6 +462,7 @@ const run_event_stream = {
|
|
|
415
462
|
EVENT_KINDS,
|
|
416
463
|
TRACE_KINDS,
|
|
417
464
|
append,
|
|
465
|
+
append_event,
|
|
418
466
|
format_event,
|
|
419
467
|
has_since,
|
|
420
468
|
is_stage_start,
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { stamp_file } from '#scripts/josh/stamp-file'
|
|
2
|
+
import { run_halfrun_resume } from '#scripts/run/run-halfrun-resume'
|
|
3
|
+
import { run_label } from '#scripts/run/run-label'
|
|
4
|
+
import { run_hold } from './run-hold'
|
|
5
|
+
|
|
6
|
+
// `josh run:hold --adopt <N>` — a `new` run's hand-over once its Issue is filed (joshuafolkken/kit#4156).
|
|
7
|
+
// The unnumbered record is re-keyed in place to `<N>`, so every later stop of the run releases with
|
|
8
|
+
// `run:release <N>` and that release takes `in-progress` back off; the adopt applies the label the
|
|
9
|
+
// numbered entry would have. **In place, not released and re-claimed**: a release would free the tree
|
|
10
|
+
// for a moment another session could claim it in, and the record's owner and stop marks stay as written.
|
|
11
|
+
|
|
12
|
+
const ADOPTED = 'adopted'
|
|
13
|
+
// The tree holds no record, so there is nothing to hand over.
|
|
14
|
+
const NO_RECORD = 'none'
|
|
15
|
+
const FOREIGN = 'foreign'
|
|
16
|
+
const UNREADABLE = 'unreadable'
|
|
17
|
+
|
|
18
|
+
type AdoptResult = typeof ADOPTED | typeof FOREIGN | typeof NO_RECORD | typeof UNREADABLE
|
|
19
|
+
|
|
20
|
+
// The record re-keyed: the unnumbered run's own, or one already naming `<N>` — a repeated adopt is
|
|
21
|
+
// the same hand-over, so it answers alike. Another issue's record is never touched.
|
|
22
|
+
function rekey(target: string, issue: string): AdoptResult {
|
|
23
|
+
const read = run_hold.read_hold(target)
|
|
24
|
+
|
|
25
|
+
if (read.kind === 'unreadable') return UNREADABLE
|
|
26
|
+
|
|
27
|
+
const hold = run_halfrun_resume.hold_of(read)
|
|
28
|
+
|
|
29
|
+
if (hold === undefined) return NO_RECORD
|
|
30
|
+
|
|
31
|
+
if (hold.issue !== run_hold.UNNUMBERED_ISSUE && hold.issue !== issue) return FOREIGN
|
|
32
|
+
|
|
33
|
+
stamp_file.write_stamp(target, { ...hold, issue })
|
|
34
|
+
|
|
35
|
+
return ADOPTED
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function no_record_message(issue: string): string {
|
|
39
|
+
return `run:hold --adopt: this tree holds no record to adopt — claim it with \`pnpm josh run:hold ${issue}\`.`
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// Not the claim race's message: that one advises `--force`, which here would free another run's tree.
|
|
43
|
+
function foreign_message(issue: string): string {
|
|
44
|
+
return `run:hold --adopt: this tree is held for another issue, so it is not handed to issue ${issue}; \`--adopt\` only re-keys a \`new\` run's unnumbered record.`
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
async function adopt(target: string, issue: string): Promise<AdoptResult> {
|
|
48
|
+
const result = rekey(target, issue)
|
|
49
|
+
|
|
50
|
+
if (result === ADOPTED) await run_label.mark(issue)
|
|
51
|
+
|
|
52
|
+
return result
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
const run_hold_adopt = {
|
|
56
|
+
ADOPTED,
|
|
57
|
+
NO_RECORD,
|
|
58
|
+
UNREADABLE,
|
|
59
|
+
adopt,
|
|
60
|
+
foreign_message,
|
|
61
|
+
no_record_message,
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export type { AdoptResult }
|
|
65
|
+
export { run_hold_adopt }
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
#!/usr/bin/env tsx
|
|
2
|
-
import { fileURLToPath } from 'node:url'
|
|
3
1
|
import { issue_number_shape } from '#scripts/issue/issue-number-shape'
|
|
4
2
|
import { run_cli_fault } from '#scripts/run/run-cli-fault'
|
|
5
3
|
import { run_halfrun_resume } from '#scripts/run/run-halfrun-resume'
|
|
@@ -7,7 +5,10 @@ import { run_label } from '#scripts/run/run-label'
|
|
|
7
5
|
import { run_preflight, type PreflightDecision } from '#scripts/run/run-preflight'
|
|
8
6
|
import { run_prrun_resume } from '#scripts/run/run-prrun-resume'
|
|
9
7
|
import { run_tidy_cli } from '#scripts/run/tidy/run-tidy-cli'
|
|
8
|
+
import { test_e2e_stamp } from '#scripts/test/test-e2e-stamp'
|
|
10
9
|
import { run_hold, type HoldRead, type RunHold } from './run-hold'
|
|
10
|
+
import { run_hold_adopt } from './run-hold-adopt'
|
|
11
|
+
import { run_stop_notify } from './run-stop-notify'
|
|
11
12
|
|
|
12
13
|
// `josh run:hold [<N>]` and `josh run:release [<N> | --force]` — the working-tree guard the typed
|
|
13
14
|
// entry points ask before they start.
|
|
@@ -37,7 +38,6 @@ import { run_hold, type HoldRead, type RunHold } from './run-hold'
|
|
|
37
38
|
|
|
38
39
|
const SUCCESS_EXIT_CODE = 0
|
|
39
40
|
const FAILURE_EXIT_CODE = 1
|
|
40
|
-
const ARGV_OFFSET = 2
|
|
41
41
|
const RELEASE_FLAG = '--release'
|
|
42
42
|
// What removes a record this run did not write. **Deliberate friction**: every release names the run
|
|
43
43
|
// it belongs to, and the one act that cannot — clearing a record somebody else left behind — is
|
|
@@ -49,10 +49,14 @@ const FULLRUN_FLAG = '--fullrun'
|
|
|
49
49
|
const HALFRUN_STOP_FLAG = '--halfrun-stop'
|
|
50
50
|
// A `prrun`'s stop before merge: its record keeps the commit it stopped on.
|
|
51
51
|
const PRRUN_STOP_FLAG = '--prrun-stop'
|
|
52
|
+
// A `needs-human-review` stop: marked as a `halfrun` stop is, with its own confirmation.
|
|
53
|
+
const HUMAN_REVIEW_STOP_FLAG = '--human-review-stop'
|
|
54
|
+
// A `new` run's hand-over of its unnumbered record to the Issue it filed (`run-hold-adopt.ts`).
|
|
55
|
+
const ADOPT_FLAG = '--adopt'
|
|
52
56
|
// The most a claim reads: the issue number and the one flag after it.
|
|
53
57
|
const MAX_CLAIM_ARGUMENTS = 2
|
|
54
58
|
const USAGE =
|
|
55
|
-
'Usage: josh run:hold [<issue-number> [--fullrun | --halfrun-stop | --prrun-stop]] | josh run:release [<issue-number> | --force]'
|
|
59
|
+
'Usage: josh run:hold [<issue-number> [--fullrun | --halfrun-stop | --human-review-stop | --prrun-stop]] | josh run:hold --adopt <issue-number> | josh run:release [<issue-number> | --force]'
|
|
56
60
|
|
|
57
61
|
const COMMAND = 'run:hold'
|
|
58
62
|
|
|
@@ -64,10 +68,16 @@ const NONE_VERDICT = 'none'
|
|
|
64
68
|
// The record is another run's, so nothing was removed. **It is not `none`**: a release that did not
|
|
65
69
|
// happen must never read to a script as a tree it has just freed.
|
|
66
70
|
const HELD_VERDICT = 'held'
|
|
71
|
+
// A stop before commit asked on a tree `josh test:e2e` has not answered green on: nothing was marked.
|
|
72
|
+
const E2E_OWED_VERDICT = 'e2e-owed'
|
|
67
73
|
|
|
68
74
|
const FORCE_RELEASE_KIND = 'force-release'
|
|
69
75
|
const HALFRUN_STOP_KIND = 'halfrun-stop'
|
|
76
|
+
const HUMAN_REVIEW_STOP_KIND = 'human-review-stop'
|
|
70
77
|
const PRRUN_STOP_KIND = 'prrun-stop'
|
|
78
|
+
const ADOPT_KIND = 'adopt'
|
|
79
|
+
|
|
80
|
+
type StopKind = typeof HALFRUN_STOP_KIND | typeof HUMAN_REVIEW_STOP_KIND | typeof PRRUN_STOP_KIND
|
|
71
81
|
|
|
72
82
|
interface ClaimRequest {
|
|
73
83
|
kind: 'claim'
|
|
@@ -76,18 +86,25 @@ interface ClaimRequest {
|
|
|
76
86
|
}
|
|
77
87
|
|
|
78
88
|
interface StopRequest {
|
|
79
|
-
kind:
|
|
89
|
+
kind: StopKind
|
|
80
90
|
issue: string
|
|
81
91
|
}
|
|
82
92
|
|
|
83
93
|
type HoldRequest =
|
|
84
94
|
| ClaimRequest
|
|
85
95
|
| StopRequest
|
|
96
|
+
| { kind: typeof ADOPT_KIND; issue: string }
|
|
86
97
|
| { kind: 'release'; claimant: string }
|
|
87
98
|
| { kind: typeof FORCE_RELEASE_KIND }
|
|
88
99
|
|
|
100
|
+
const STOP_KINDS: ReadonlySet<string> = new Set([
|
|
101
|
+
HALFRUN_STOP_KIND,
|
|
102
|
+
HUMAN_REVIEW_STOP_KIND,
|
|
103
|
+
PRRUN_STOP_KIND,
|
|
104
|
+
])
|
|
105
|
+
|
|
89
106
|
function is_stop_request(request: HoldRequest): request is StopRequest {
|
|
90
|
-
return
|
|
107
|
+
return STOP_KINDS.has(request.kind)
|
|
91
108
|
}
|
|
92
109
|
|
|
93
110
|
const FORCE_RELEASE_REQUEST: HoldRequest = { kind: FORCE_RELEASE_KIND }
|
|
@@ -96,14 +113,14 @@ function release_request(claimant: string): HoldRequest {
|
|
|
96
113
|
return { kind: 'release', claimant }
|
|
97
114
|
}
|
|
98
115
|
|
|
99
|
-
const STOP_KIND_BY_FLAG: ReadonlyMap<string,
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
116
|
+
const STOP_KIND_BY_FLAG: ReadonlyMap<string, StopKind> = new Map([
|
|
117
|
+
[HALFRUN_STOP_FLAG, HALFRUN_STOP_KIND],
|
|
118
|
+
[HUMAN_REVIEW_STOP_FLAG, HUMAN_REVIEW_STOP_KIND],
|
|
119
|
+
[PRRUN_STOP_FLAG, PRRUN_STOP_KIND],
|
|
120
|
+
])
|
|
104
121
|
|
|
105
|
-
// The flag after a numbered claim: absent, `--fullrun`, `--halfrun-stop
|
|
106
|
-
// else is a usage error.
|
|
122
|
+
// The flag after a numbered claim: absent, `--fullrun`, `--halfrun-stop`, `--human-review-stop` or
|
|
123
|
+
// `--prrun-stop`. Anything else is a usage error.
|
|
107
124
|
function numbered_claim(issue: string, flag: string | undefined): HoldRequest | undefined {
|
|
108
125
|
if (flag === undefined) return { kind: 'claim', issue }
|
|
109
126
|
|
|
@@ -142,9 +159,21 @@ function parse_release(argv: ReadonlyArray<string>): HoldRequest | undefined {
|
|
|
142
159
|
return argv.length > 1 ? undefined : parse_release_argument(first)
|
|
143
160
|
}
|
|
144
161
|
|
|
162
|
+
function parse_adopt(argv: ReadonlyArray<string>): HoldRequest | undefined {
|
|
163
|
+
const [issue] = argv
|
|
164
|
+
|
|
165
|
+
if (issue === undefined || argv.length > 1) return undefined
|
|
166
|
+
|
|
167
|
+
return issue_number_shape.ISSUE_NUMBER_PATTERN.test(issue)
|
|
168
|
+
? { kind: ADOPT_KIND, issue }
|
|
169
|
+
: undefined
|
|
170
|
+
}
|
|
171
|
+
|
|
145
172
|
function parse_request(argv: ReadonlyArray<string>): HoldRequest | undefined {
|
|
146
173
|
if (argv[0] === RELEASE_FLAG) return parse_release(argv.slice(1))
|
|
147
174
|
|
|
175
|
+
if (argv[0] === ADOPT_FLAG) return parse_adopt(argv.slice(1))
|
|
176
|
+
|
|
148
177
|
return parse_claim(argv)
|
|
149
178
|
}
|
|
150
179
|
|
|
@@ -339,25 +368,73 @@ function report_usage(): number {
|
|
|
339
368
|
return FAILURE_EXIT_CODE
|
|
340
369
|
}
|
|
341
370
|
|
|
371
|
+
const SEND_BY_KIND: Readonly<Record<StopKind, (target: string, issue: string) => Promise<void>>> = {
|
|
372
|
+
[HALFRUN_STOP_KIND]: run_stop_notify.send_halfrun,
|
|
373
|
+
[HUMAN_REVIEW_STOP_KIND]: run_stop_notify.send_human_review,
|
|
374
|
+
[PRRUN_STOP_KIND]: run_stop_notify.send_prrun,
|
|
375
|
+
}
|
|
376
|
+
|
|
342
377
|
// **A `halfrun` stop marks its own record** — the positive "this run has ended over its verified diff"
|
|
343
|
-
// that `run:entry` adopts on `fullrun #N`. Another run's record is left alone. A `
|
|
344
|
-
//
|
|
378
|
+
// that `run:entry` adopts on `fullrun #N`. Another run's record is left alone. A `needs-human-review`
|
|
379
|
+
// stop is the same mark, since its resume is `halfrun`'s. A `prrun` stop marks its record the same
|
|
380
|
+
// way, with the commit it stopped on. **A marked stop then sends its own `confirmation`**
|
|
381
|
+
// (`run-stop-notify.ts`), after the mark, since the mark rewrites the record its send is stamped on.
|
|
382
|
+
async function marked_stop(target: string, request: StopRequest): Promise<number> {
|
|
383
|
+
await SEND_BY_KIND[request.kind](target, request.issue)
|
|
384
|
+
|
|
385
|
+
return report_hold()
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
// **A stop before commit has no CI E2E job behind it**, so it is refused until `josh test:e2e` has
|
|
389
|
+
// answered green on this exact tree (`test-e2e-stamp.ts`). A `prrun` stop has a pull request, and CI's.
|
|
390
|
+
async function e2e_refusal(request: StopRequest): Promise<number | undefined> {
|
|
391
|
+
if (request.kind === PRRUN_STOP_KIND || (await test_e2e_stamp.is_current_tree())) return undefined
|
|
392
|
+
|
|
393
|
+
return report(
|
|
394
|
+
'run:hold: `pnpm josh test:e2e` has not answered green on this tree — run it, then mark the stop again.',
|
|
395
|
+
E2E_OWED_VERDICT,
|
|
396
|
+
FAILURE_EXIT_CODE,
|
|
397
|
+
)
|
|
398
|
+
}
|
|
399
|
+
|
|
345
400
|
async function mark_stop(target: string, request: StopRequest): Promise<number> {
|
|
401
|
+
const refusal = await e2e_refusal(request)
|
|
402
|
+
|
|
403
|
+
if (refusal !== undefined) return refusal
|
|
404
|
+
|
|
346
405
|
const mark =
|
|
347
406
|
request.kind === PRRUN_STOP_KIND
|
|
348
407
|
? await run_prrun_resume.mark_stop_at(target, request.issue)
|
|
349
408
|
: run_halfrun_resume.mark_stop_at(target, request.issue)
|
|
350
409
|
|
|
351
|
-
if (mark === run_halfrun_resume.MARKED) return
|
|
410
|
+
if (mark === run_halfrun_resume.MARKED) return await marked_stop(target, request)
|
|
352
411
|
|
|
353
412
|
if (mark === run_halfrun_resume.UNREADABLE) return report_unreadable_record()
|
|
354
413
|
|
|
355
414
|
return report_busy(run_hold.race_message(run_hold.read_hold(target), target))
|
|
356
415
|
}
|
|
357
416
|
|
|
417
|
+
// The re-keyed record answers `hold`; no record answers `none` and another issue's `busy`, each a
|
|
418
|
+
// failure, since the run asking holds nothing it can stop on.
|
|
419
|
+
async function adopt(target: string, issue: string): Promise<number> {
|
|
420
|
+
const result = await run_hold_adopt.adopt(target, issue)
|
|
421
|
+
|
|
422
|
+
if (result === run_hold_adopt.ADOPTED) return report_hold()
|
|
423
|
+
|
|
424
|
+
if (result === run_hold_adopt.UNREADABLE) return report_unreadable_record()
|
|
425
|
+
|
|
426
|
+
if (result === run_hold_adopt.NO_RECORD) {
|
|
427
|
+
return report(run_hold_adopt.no_record_message(issue), NONE_VERDICT, FAILURE_EXIT_CODE)
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
return report(run_hold_adopt.foreign_message(issue), BUSY_VERDICT, FAILURE_EXIT_CODE)
|
|
431
|
+
}
|
|
432
|
+
|
|
358
433
|
async function dispatch(request: HoldRequest, target: string, is_linked: boolean): Promise<number> {
|
|
359
434
|
if (request.kind === 'claim') return await claim(target, request, is_linked)
|
|
360
435
|
|
|
436
|
+
if (request.kind === ADOPT_KIND) return await adopt(target, request.issue)
|
|
437
|
+
|
|
361
438
|
if (is_stop_request(request)) return await mark_stop(target, request)
|
|
362
439
|
|
|
363
440
|
if (request.kind === FORCE_RELEASE_KIND) return force_release(target)
|
|
@@ -392,10 +469,6 @@ async function run(argv: ReadonlyArray<string>): Promise<number> {
|
|
|
392
469
|
}
|
|
393
470
|
}
|
|
394
471
|
|
|
395
|
-
async function main(argv: ReadonlyArray<string>): Promise<void> {
|
|
396
|
-
process.exitCode = await run(argv)
|
|
397
|
-
}
|
|
398
|
-
|
|
399
472
|
const run_hold_cli = {
|
|
400
473
|
BUSY_VERDICT,
|
|
401
474
|
HELD_VERDICT,
|
|
@@ -408,6 +481,4 @@ const run_hold_cli = {
|
|
|
408
481
|
run,
|
|
409
482
|
}
|
|
410
483
|
|
|
411
|
-
if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
|
|
412
|
-
|
|
413
484
|
export { run_hold_cli }
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
import { fileURLToPath } from 'node:url'
|
|
3
|
+
import { run_hold_cli } from './run-hold-cli'
|
|
4
|
+
|
|
5
|
+
// The `josh run:hold` and `josh run:release` entry, kept apart from `run-hold-cli.ts` because other
|
|
6
|
+
// modules import that one: a bundle is one file, so a main guard there would fire for every command
|
|
7
|
+
// that carries it (joshuafolkken/kit#4186).
|
|
8
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) {
|
|
9
|
+
const ARGV_OFFSET = 2
|
|
10
|
+
|
|
11
|
+
process.exitCode = await run_hold_cli.run(process.argv.slice(ARGV_OFFSET))
|
|
12
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { lane_child_marker } from '#scripts/lane/lane-child-marker'
|
|
2
|
+
import { run_hold, type RunHold, type SessionOwner } from './run-hold'
|
|
3
|
+
import { run_hold_session } from './run-hold-session'
|
|
4
|
+
|
|
5
|
+
// Whether this session is one of a run's own (joshuafolkken/kit#4099): a lane child, or the session
|
|
6
|
+
// holding the run's hold on this working tree. The run's event stream is the repository's, so a
|
|
7
|
+
// session outside the run — a question answered beside a `backlogrun` — writes to it too, and what it
|
|
8
|
+
// files is not the run's.
|
|
9
|
+
//
|
|
10
|
+
// **Unknown is outside.** Unlike the `Stop` hook's question (`run-hold-session.ts`), a hold or a session
|
|
11
|
+
// with no owner recorded is not this session's: counting another session's filing as the run's is the
|
|
12
|
+
// failure this answers.
|
|
13
|
+
|
|
14
|
+
function is_owned(hold: RunHold, owner: SessionOwner): boolean {
|
|
15
|
+
if (hold.owner_pid === undefined || owner.owner_pid === undefined) return false
|
|
16
|
+
|
|
17
|
+
return run_hold_session.is_session_hold(hold, owner)
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
async function is_hold_owner(owner: SessionOwner): Promise<boolean> {
|
|
21
|
+
const directory = await run_hold.worktree_directory()
|
|
22
|
+
if (directory === undefined) return false
|
|
23
|
+
|
|
24
|
+
const read = run_hold.read_hold(run_hold.hold_path(directory))
|
|
25
|
+
|
|
26
|
+
return read.kind === 'held' && is_owned(read.hold, owner)
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
async function is_run_member(owner: SessionOwner = run_hold.session_owner()): Promise<boolean> {
|
|
30
|
+
if (lane_child_marker.marked_issue() !== undefined) return true
|
|
31
|
+
|
|
32
|
+
return await is_hold_owner(owner)
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
const run_hold_member = { is_run_member }
|
|
36
|
+
|
|
37
|
+
export { run_hold_member }
|