@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,44 +1,175 @@
|
|
|
1
1
|
#!/usr/bin/env tsx
|
|
2
2
|
import { fileURLToPath } from 'node:url'
|
|
3
|
+
import { git_branch } from '#scripts/git/git-branch'
|
|
4
|
+
import { git_command } from '#scripts/git/git-command'
|
|
5
|
+
import { PROJECT_ROOT } from '#scripts/init/init-paths'
|
|
6
|
+
import { stamp_file } from '#scripts/josh/stamp-file'
|
|
7
|
+
import { lane_child_marker } from '#scripts/lane/lane-child-marker'
|
|
8
|
+
import { lane_session_broker } from '#scripts/lane/lane-session-broker'
|
|
9
|
+
import { review_attest, type ReviewSlot } from '#scripts/review/review-attest'
|
|
3
10
|
import { review_brief_cli } from '#scripts/review/review-brief-cli'
|
|
11
|
+
import { review_interaction } from '#scripts/review/review-interaction'
|
|
12
|
+
import { review_lane_handover } from '#scripts/review/review-lane-handover'
|
|
4
13
|
import { review_stamps } from '#scripts/review/review-stamps'
|
|
14
|
+
import { run_ship_review } from '#scripts/run/ship/run-ship-review'
|
|
15
|
+
import { test_pinned_record, type PinnedSummary } from '#scripts/test/test-pinned-record'
|
|
5
16
|
import { run_review, type GateState, type ReviewTiming } from './run-review'
|
|
17
|
+
import { run_review_early_push } from './run-review-early-push'
|
|
18
|
+
import { run_review_join_read, type JoinVerdict } from './run-review-join-read'
|
|
19
|
+
import { run_review_pinned } from './run-review-pinned'
|
|
20
|
+
import { run_review_pinned_accepted } from './run-review-pinned-accepted'
|
|
21
|
+
import { run_review_pinned_join } from './run-review-pinned-join'
|
|
22
|
+
import { run_review_pinned_steps } from './run-review-pinned-steps'
|
|
23
|
+
import { run_review_pinned_tree } from './run-review-pinned-tree'
|
|
6
24
|
import { run_review_steps } from './run-review-steps'
|
|
7
25
|
|
|
8
|
-
// `josh run:review` — one call that leaves `josh gate` running in the background and
|
|
9
|
-
// `/code-review` brief, so a lane child launches the two together and they
|
|
26
|
+
// `josh run:review` — one call that leaves `josh gate` running in the background and writes the
|
|
27
|
+
// `/code-review` brief to a file, printing its path, so a lane child launches the two together and they
|
|
28
|
+
// overlap.
|
|
10
29
|
// It composes `josh gate` and `josh review:brief` and changes neither: the gate is the same command
|
|
11
30
|
// spawned detached, and the brief is `review:brief` run unchanged, so the nonce/checkout contract
|
|
12
31
|
// `review:attest --check` enforces is minted exactly as a standalone brief mints it.
|
|
13
32
|
//
|
|
33
|
+
// `josh test:pinned` runs in the background beside the pair, and the join stops on an unpinned change;
|
|
34
|
+
// under `--unpinned-ok "<reason>"` it runs there too and the join carries on (`run-review-pinned.ts`).
|
|
35
|
+
//
|
|
14
36
|
// **The default mode opens the pair; `--join` closes it.** The child runs the default, reads the brief
|
|
15
|
-
// off stdout, launches the review subagent, and — once it returns — runs `--join`, which waits for the
|
|
16
|
-
// gate to finish, records the overlap, and exits non-zero if the gate came back red
|
|
37
|
+
// path off stdout, launches the review subagent, and — once it returns — runs `--join`, which waits for the
|
|
38
|
+
// gate and the check to finish, records the overlap, and exits non-zero if the gate came back red or
|
|
39
|
+
// the check found an unpinned change. That exit code is
|
|
17
40
|
// what makes "a red gate is not adopted over" a mechanical guarantee rather than an ordering
|
|
18
41
|
// (`run-review.ts` → `adopt_verdict`).
|
|
42
|
+
//
|
|
43
|
+
// **Where the interaction review is due and not yet recorded, its brief follows code's**
|
|
44
|
+
// (joshuafolkken/kit#4802), so the child's round 1 reviews both and `josh ship` reuses both rather than
|
|
45
|
+
// running the interaction pass alone after it. `--code-only` is the ship's own open, which mints the
|
|
46
|
+
// interaction brief itself.
|
|
47
|
+
//
|
|
48
|
+
// **`--pinned` reads the check alone** (joshuafolkken/kit#4834): `josh review:record` (or a lane child's
|
|
49
|
+
// `josh check:related` before its round is recorded, joshuafolkken/kit#4948) starts it again on a tree a round-1 fix
|
|
50
|
+
// moved, after the join has closed the pair, and reads its answer without joining a gate that already
|
|
51
|
+
// settled. The ship's pre-detach reads that answer anyway, so a lane need not
|
|
52
|
+
// (joshuafolkken/kit#4895), and a lane child's `--pinned` returns at once rather than wait in the
|
|
53
|
+
// foreground (joshuafolkken/kit#5293). **`--join --fixing` waits no grace on the check**: round 1's fixes will move
|
|
54
|
+
// its tree. **A lane child's open commits first and `--push` pushes at the green gate**
|
|
55
|
+
// (`run-review-early-push.ts`).
|
|
19
56
|
|
|
20
57
|
const ARGV_OFFSET = 2
|
|
21
58
|
const JOIN_FLAG = '--join'
|
|
59
|
+
const FIXING_FLAG = '--fixing'
|
|
60
|
+
const PINNED_FLAG = '--pinned'
|
|
61
|
+
const LANE_PINNED_NOTE =
|
|
62
|
+
"Lane child — not waiting on test:pinned; the ship's pre-detach joins this check."
|
|
63
|
+
const INTERACTION_FLAG = '--interaction'
|
|
22
64
|
const SUCCESS_EXIT_CODE = 0
|
|
23
65
|
const FAILURE_EXIT_CODE = 1
|
|
24
|
-
const USAGE =
|
|
66
|
+
const USAGE =
|
|
67
|
+
'Usage: josh run:review [--code-only] [--unpinned-ok "<reason>"] | --join [--fixing] | --pinned | --push'
|
|
68
|
+
const { CODE, INTERACTION } = review_attest.REVIEW_SLOT
|
|
25
69
|
|
|
26
70
|
function now_iso(): string {
|
|
27
71
|
return new Date().toISOString()
|
|
28
72
|
}
|
|
29
73
|
|
|
30
74
|
// The join exits 0 only on a green gate. `--join` is run before the review verdict is acted on, so a
|
|
31
|
-
// non-zero exit here is what stops a run adopting a review over a red gate.
|
|
75
|
+
// non-zero exit here is what stops a run adopting a review over a red gate. A gate that passed on a tree
|
|
76
|
+
// that has since moved exits with its own code, so `josh ship` tells it from a red gate by the code
|
|
77
|
+
// rather than by a findings file the reviewer may have misnamed (joshuafolkken/kit#4774).
|
|
32
78
|
function join_exit_code(state: GateState): number {
|
|
79
|
+
if (state === run_review.GATE_MOVED) return run_review.MOVED_EXIT_CODE
|
|
80
|
+
|
|
33
81
|
return run_review.adopt_verdict(state === run_review.GATE_GREEN) === run_review.ADOPT
|
|
34
82
|
? SUCCESS_EXIT_CODE
|
|
35
83
|
: FAILURE_EXIT_CODE
|
|
36
84
|
}
|
|
37
85
|
|
|
38
86
|
const JOIN_HINT =
|
|
39
|
-
'Gate is running in the background. Launch the /code-review subagent with the brief
|
|
87
|
+
'Gate is running in the background. Launch the /code-review subagent as the `reviewer` agent type (`kit:reviewer` in a consumer), with the prompt printed under its brief file, verbatim; when it returns, run `pnpm josh run:review --join` to join the gate and test:pinned and check their verdicts before committing.'
|
|
88
|
+
|
|
89
|
+
const INTERACTION_HINT =
|
|
90
|
+
'Two brief files above: launch one `reviewer` per brief side by side, each with its own printed prompt, and once both are attested record the interaction pass with `pnpm josh review:record --interaction --issue <N> [<finding> ...]` beside round 1.'
|
|
91
|
+
|
|
92
|
+
// The briefs an open writes: the slots this branch's issue owes round 1, and whether this is the ship's
|
|
93
|
+
// own `--code-only` open, which prints code's brief instead.
|
|
94
|
+
interface BriefPlan {
|
|
95
|
+
is_code_only: boolean
|
|
96
|
+
slots: ReadonlyArray<ReviewSlot>
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
const SLOT_ARGV: Readonly<Record<ReviewSlot, ReadonlyArray<string>>> = {
|
|
100
|
+
code: [],
|
|
101
|
+
interaction: [INTERACTION_FLAG],
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// The slots this branch's issue owes round 1. A branch that names no issue, or the ship's own open,
|
|
105
|
+
// briefs code alone.
|
|
106
|
+
async function brief_slots(is_code_only: boolean): Promise<ReadonlyArray<ReviewSlot>> {
|
|
107
|
+
if (is_code_only) return [CODE]
|
|
108
|
+
const issue = git_branch.issue_from_branch(await git_command.branch())
|
|
109
|
+
if (issue === undefined) return [CODE]
|
|
110
|
+
|
|
111
|
+
return review_interaction.round_one_slots(await review_interaction.status(issue))
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// A lane child's reopen after a round 1 the ship reuses is refused before anything is launched
|
|
115
|
+
// (`review-lane-handover.ts`); the ship's own `--code-only` open is never refused.
|
|
116
|
+
async function handover_refusal(is_code_only: boolean): Promise<string | undefined> {
|
|
117
|
+
if (is_code_only) return undefined
|
|
118
|
+
const issue = git_branch.issue_from_branch(await git_command.branch())
|
|
119
|
+
if (issue === undefined) return undefined
|
|
120
|
+
|
|
121
|
+
return (await review_lane_handover.is_handed_over(issue))
|
|
122
|
+
? review_lane_handover.refusal(issue)
|
|
123
|
+
: undefined
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
// One slot's brief, written to the file `josh ship` hands that slot's reviewer, with only its path on
|
|
127
|
+
// stdout: the two briefs together exceed the Bash output cap, and a truncated brief sent the lane back
|
|
128
|
+
// to `review:brief`, whose new code nonce dropped the interaction slot (joshuafolkken/kit#4863). Its
|
|
129
|
+
// launch prompt follows, the one `josh ship` opens a reviewer with: the brief no longer travels in the
|
|
130
|
+
// prompt, and `/code-review` beside `review:attest` is how the time and cost readers tell a review.
|
|
131
|
+
function save_brief(slot: ReviewSlot, text: string): void {
|
|
132
|
+
const { brief } = lane_session_broker.review_paths(PROJECT_ROOT, slot)
|
|
40
133
|
|
|
41
|
-
|
|
134
|
+
stamp_file.write_text_stamp(brief, `${text}\n`)
|
|
135
|
+
process.stdout.write(
|
|
136
|
+
`${slot} brief: ${brief}\n${slot} prompt: ${run_ship_review.round_one_opening(brief)}\n`,
|
|
137
|
+
)
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
async function write_brief(slot: ReviewSlot): Promise<number> {
|
|
141
|
+
const texts: Array<string> = []
|
|
142
|
+
const code = await review_brief_cli.run_to(SLOT_ARGV[slot], (text) => {
|
|
143
|
+
texts.push(text)
|
|
144
|
+
})
|
|
145
|
+
|
|
146
|
+
if (code === SUCCESS_EXIT_CODE) save_brief(slot, texts.join('\n'))
|
|
147
|
+
|
|
148
|
+
return code
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
// Code's brief, then the interaction brief — never after a code brief that refused. `--code-only`, the
|
|
152
|
+
// ship's own open, prints code's brief: the ship reads it off stdout and writes that file itself.
|
|
153
|
+
async function open_briefs(plan: BriefPlan): Promise<number> {
|
|
154
|
+
if (plan.is_code_only) return await review_brief_cli.run([])
|
|
155
|
+
const code = await write_brief(CODE)
|
|
156
|
+
|
|
157
|
+
if (code !== SUCCESS_EXIT_CODE || !plan.slots.includes(INTERACTION)) return code
|
|
158
|
+
|
|
159
|
+
return await write_brief(INTERACTION)
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
function join_hint(slots: ReadonlyArray<ReviewSlot>): string {
|
|
163
|
+
return slots.includes(INTERACTION) ? `${JOIN_HINT}\n${INTERACTION_HINT}` : JOIN_HINT
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
// The early push waits on the gate this pair launched, so it follows a written brief alone.
|
|
167
|
+
function follow_brief(slots: ReadonlyArray<ReviewSlot>, is_early_push: boolean): void {
|
|
168
|
+
process.stderr.write(`${join_hint(slots)}\n`)
|
|
169
|
+
if (is_early_push) run_review_early_push.launch()
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
async function start_pair(plan: BriefPlan, is_early_push: boolean): Promise<number> {
|
|
42
173
|
const gate_started_at = now_iso()
|
|
43
174
|
const launch = run_review_steps.launch_gate()
|
|
44
175
|
|
|
@@ -50,16 +181,56 @@ async function run_start(): Promise<number> {
|
|
|
50
181
|
|
|
51
182
|
await run_review_steps.mark_gate_starting()
|
|
52
183
|
run_review_steps.write_timing_start({ gate_started_at, review_started_at: now_iso() })
|
|
53
|
-
const code = await
|
|
184
|
+
const code = await open_briefs(plan)
|
|
54
185
|
|
|
55
|
-
// The hint follows a
|
|
186
|
+
// The hint follows a written brief and nothing else: a brief that refused (a tree the scoped pair
|
|
56
187
|
// has not been green on) exits non-zero, and a "gate running, launch the review" line under that
|
|
57
188
|
// refusal would send the child to review a tree there is no brief for.
|
|
58
|
-
if (code === SUCCESS_EXIT_CODE)
|
|
189
|
+
if (code === SUCCESS_EXIT_CODE) follow_brief(plan.slots, is_early_push)
|
|
59
190
|
|
|
60
191
|
return code
|
|
61
192
|
}
|
|
62
193
|
|
|
194
|
+
// A fresh `josh test:pinned` on this tree in place of the last one.
|
|
195
|
+
async function launch_pinned(reason: string | undefined): Promise<void> {
|
|
196
|
+
const tree = await run_review_pinned_tree.key()
|
|
197
|
+
|
|
198
|
+
run_review_pinned_steps.clear()
|
|
199
|
+
const launched = run_review_pinned_steps.launch(PROJECT_ROOT, reason, tree)
|
|
200
|
+
|
|
201
|
+
if (launched.kind === 'failed') {
|
|
202
|
+
process.stderr.write(test_pinned_record.not_run_summary(new Error(launched.note)).text)
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
// `josh test:pinned` runs in the background beside the pair, `--unpinned-ok` or not, so the pair never
|
|
207
|
+
// waits on it (joshuafolkken/kit#4793); the join judges its answer by the reason it was launched with.
|
|
208
|
+
// A check that could not be launched fails open, as one that could not run does. A tree the scoped
|
|
209
|
+
// pair has not been green on is refused before either is launched, so a refused start leaves nothing
|
|
210
|
+
// running (joshuafolkken/kit#4828).
|
|
211
|
+
async function run_start(plan: BriefPlan, reason?: string): Promise<number> {
|
|
212
|
+
const refusal = await review_brief_cli.scoped_refusal()
|
|
213
|
+
|
|
214
|
+
if (refusal !== undefined) return review_brief_cli.report_error(refusal)
|
|
215
|
+
const is_early_push = await run_review_early_push.prepare(plan)
|
|
216
|
+
|
|
217
|
+
await launch_pinned(reason)
|
|
218
|
+
run_review_join_read.mark_due()
|
|
219
|
+
|
|
220
|
+
return await start_pair(plan, is_early_push)
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
// The background check's answer, on stderr beside the other run notes. The join waits as the end of
|
|
224
|
+
// the pair; `--pinned` waits for a check started moments before (`run_review_pinned_steps.wait_alone`).
|
|
225
|
+
async function show_pinned(read: Promise<JoinVerdict | undefined>): Promise<boolean> {
|
|
226
|
+
const joined = await read
|
|
227
|
+
|
|
228
|
+
if (joined === undefined) return false
|
|
229
|
+
process.stderr.write(joined.text)
|
|
230
|
+
|
|
231
|
+
return joined.is_stop
|
|
232
|
+
}
|
|
233
|
+
|
|
63
234
|
// The gate's own green stamp carries the moment it finished; a red gate leaves none, so the join's own
|
|
64
235
|
// clock is the end there — the review overlapped a gate that ran up to this point either way.
|
|
65
236
|
function gate_ended_at(is_green: boolean): string {
|
|
@@ -71,10 +242,22 @@ function gate_ended_at(is_green: boolean): string {
|
|
|
71
242
|
const GREEN_NOTE = 'Gate green — the review verdict may be adopted.'
|
|
72
243
|
const RED_NOTE =
|
|
73
244
|
'Gate RED — the review verdict is blocked; fix the gate and re-run it before committing.'
|
|
245
|
+
const MOVED_NOTE =
|
|
246
|
+
'Gate passed on an earlier tree — the tree moved after it (a review fix in place); re-run the gate on this tree before committing.'
|
|
247
|
+
|
|
248
|
+
// A moved tree's gate passed, so its log is no failure to show.
|
|
249
|
+
function settled_note(state: GateState): string | undefined {
|
|
250
|
+
if (state === run_review.GATE_GREEN) return GREEN_NOTE
|
|
251
|
+
if (state === run_review.GATE_MOVED) return MOVED_NOTE
|
|
252
|
+
|
|
253
|
+
return undefined
|
|
254
|
+
}
|
|
74
255
|
|
|
75
256
|
function report_gate(state: GateState): void {
|
|
76
|
-
|
|
77
|
-
|
|
257
|
+
const settled = settled_note(state)
|
|
258
|
+
|
|
259
|
+
if (settled !== undefined) {
|
|
260
|
+
process.stdout.write(`${settled}\n`)
|
|
78
261
|
|
|
79
262
|
return
|
|
80
263
|
}
|
|
@@ -91,33 +274,136 @@ function report_timing(timing: ReviewTiming | undefined): void {
|
|
|
91
274
|
process.stdout.write(`${run_review.format_timing(timing)}\n`)
|
|
92
275
|
}
|
|
93
276
|
|
|
94
|
-
async function run_join(): Promise<number> {
|
|
277
|
+
async function run_join(is_fixing = false): Promise<number> {
|
|
95
278
|
const state = await run_review_steps.wait_for_gate_finish()
|
|
96
279
|
const timing = run_review_steps.complete_timing({
|
|
97
|
-
gate_ended_at: gate_ended_at(state
|
|
280
|
+
gate_ended_at: gate_ended_at(settled_note(state) !== undefined),
|
|
98
281
|
review_ended_at: now_iso(),
|
|
99
282
|
})
|
|
100
283
|
|
|
101
284
|
report_gate(state)
|
|
102
285
|
report_timing(timing)
|
|
103
286
|
|
|
104
|
-
|
|
287
|
+
// An unpinned change stops the round whatever the gate answered; a tree a fix moved is checked again.
|
|
288
|
+
const is_unpinned = await show_pinned(run_review_join_read.read(PROJECT_ROOT, is_fixing))
|
|
289
|
+
|
|
290
|
+
return is_unpinned ? run_review.UNPINNED_EXIT_CODE : join_exit_code(state)
|
|
105
291
|
}
|
|
106
292
|
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
293
|
+
// `--join --fixing`: round 1 has fixes to make, so the join waits no grace on test:pinned
|
|
294
|
+
// (joshuafolkken/kit#4895).
|
|
295
|
+
async function run_join_fixing(): Promise<number> {
|
|
296
|
+
return await run_join(true)
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
const REUSED_NOTE =
|
|
300
|
+
'Judged the finished test:pinned answer on this tree and its green gate with the reason; nothing ran again — go on as after a join that passed.'
|
|
301
|
+
const RECHECK_NOTE =
|
|
302
|
+
'The finished test:pinned answer stopped at its first unpinned place, so the reason launched the check of the whole change under it; the gate and the pair did not run again — go on as after a join that passed (`pnpm josh ship --review` reads its answer).'
|
|
303
|
+
|
|
304
|
+
// The answer the join stopped on: unpinned places, judged with no reason. A clear answer, or one
|
|
305
|
+
// launched under a reason, stopped nothing, so a reopen there is a new round that needs its brief.
|
|
306
|
+
function is_stopped_answer(summary: PinnedSummary): boolean {
|
|
307
|
+
return summary.unpinned.length > 0 && run_review_pinned_steps.launched_reason() === undefined
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
// An answer cut at its first unpinned hunk (joshuafolkken/kit#5153) is not every place, so the reason
|
|
311
|
+
// launches the whole check under it on this tree, and the pair, green on it already, does not run again.
|
|
312
|
+
async function recheck_whole(reason: string): Promise<number> {
|
|
313
|
+
await launch_pinned(reason)
|
|
314
|
+
process.stderr.write(`${RECHECK_NOTE}\n`)
|
|
315
|
+
|
|
316
|
+
return SUCCESS_EXIT_CODE
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
// The finished check's stopped answer on this tree, when the pair's gate is green on it too.
|
|
320
|
+
async function finished_pair(): Promise<PinnedSummary | undefined> {
|
|
321
|
+
const summary = await run_review_pinned_join.finished_on_tree()
|
|
322
|
+
if (summary === undefined || !is_stopped_answer(summary)) return undefined
|
|
323
|
+
|
|
324
|
+
return (await run_review_steps.read_gate_state()) === run_review.GATE_GREEN ? summary : undefined
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
// `--unpinned-ok` given after the join stopped, on the tree it stopped on, judges the finished check
|
|
328
|
+
// with the reason and re-runs neither it nor the pair (joshuafolkken/kit#4920). `undefined` where the
|
|
329
|
+
// tree moved, no answer was left, the answer stopped nothing or the gate is not green: the open runs as
|
|
330
|
+
// before. The ship's own `--code-only` open needs the brief, so it never takes this path.
|
|
331
|
+
async function accept_finished(
|
|
332
|
+
is_code_only: boolean,
|
|
333
|
+
reason: string | undefined,
|
|
334
|
+
): Promise<number | undefined> {
|
|
335
|
+
if (reason === undefined || is_code_only) return undefined
|
|
336
|
+
const summary = await finished_pair()
|
|
337
|
+
if (summary === undefined) return undefined
|
|
338
|
+
if (summary.is_cut === true) return await recheck_whole(reason)
|
|
339
|
+
|
|
340
|
+
run_review_pinned_steps.carry_reason(reason)
|
|
341
|
+
const verdict = await run_review_pinned_accepted.judge(summary, reason)
|
|
110
342
|
|
|
111
|
-
process.stderr.write(`${
|
|
343
|
+
process.stderr.write(`${verdict.text}${REUSED_NOTE}\n`)
|
|
344
|
+
|
|
345
|
+
return SUCCESS_EXIT_CODE
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
function refuse(text: string): number {
|
|
349
|
+
process.stderr.write(`${text}\n`)
|
|
112
350
|
|
|
113
351
|
return FAILURE_EXIT_CODE
|
|
114
352
|
}
|
|
115
353
|
|
|
354
|
+
// The open's arguments after `--code-only`: none, or `--unpinned-ok "<reason>"`.
|
|
355
|
+
async function run_open(is_code_only: boolean, argv: ReadonlyArray<string>): Promise<number> {
|
|
356
|
+
const reason = run_review_pinned.ok_reason_of(argv)
|
|
357
|
+
|
|
358
|
+
if (reason === undefined && argv.length > 0) return refuse(USAGE)
|
|
359
|
+
const accepted = await accept_finished(is_code_only, reason)
|
|
360
|
+
|
|
361
|
+
if (accepted !== undefined) return accepted
|
|
362
|
+
const handover = await handover_refusal(is_code_only)
|
|
363
|
+
|
|
364
|
+
if (handover !== undefined) return refuse(handover)
|
|
365
|
+
|
|
366
|
+
return await run_start({ is_code_only, slots: await brief_slots(is_code_only) }, reason)
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
async function run_pinned(): Promise<number> {
|
|
370
|
+
if (lane_child_marker.is_child_of(process.cwd())) {
|
|
371
|
+
process.stdout.write(`${LANE_PINNED_NOTE}\n`)
|
|
372
|
+
|
|
373
|
+
return SUCCESS_EXIT_CODE
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
const is_unpinned = await show_pinned(
|
|
377
|
+
run_review_join_read.read_with(run_review_pinned_steps.wait_alone),
|
|
378
|
+
)
|
|
379
|
+
|
|
380
|
+
return is_unpinned ? run_review.UNPINNED_EXIT_CODE : SUCCESS_EXIT_CODE
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
// The modes a whole argv selects; a `Map`, so no prototype key reads as a mode.
|
|
384
|
+
const LONE_MODES: ReadonlyMap<string, () => Promise<number>> = new Map([
|
|
385
|
+
[JOIN_FLAG, run_join],
|
|
386
|
+
[`${JOIN_FLAG} ${FIXING_FLAG}`, run_join_fixing],
|
|
387
|
+
[PINNED_FLAG, run_pinned],
|
|
388
|
+
[run_review_early_push.PUSH_FLAG, run_review_early_push.push],
|
|
389
|
+
])
|
|
390
|
+
|
|
391
|
+
async function run(argv: ReadonlyArray<string>): Promise<number> {
|
|
392
|
+
const lone = LONE_MODES.get(argv.join(' '))
|
|
393
|
+
|
|
394
|
+
if (lone !== undefined) return await lone()
|
|
395
|
+
const is_code_only = argv[0] === run_review.CODE_ONLY_FLAG
|
|
396
|
+
|
|
397
|
+
return await run_open(is_code_only, argv.slice(is_code_only ? 1 : 0))
|
|
398
|
+
}
|
|
399
|
+
|
|
116
400
|
async function main(argv: ReadonlyArray<string>): Promise<void> {
|
|
117
401
|
process.exitCode = await run(argv)
|
|
118
402
|
}
|
|
119
403
|
|
|
120
404
|
const run_review_cli = {
|
|
405
|
+
INTERACTION_HINT,
|
|
406
|
+
JOIN_HINT,
|
|
121
407
|
join_exit_code,
|
|
122
408
|
run,
|
|
123
409
|
}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { git_branch } from '#scripts/git/git-branch'
|
|
2
|
+
import { git_command } from '#scripts/git/git-command'
|
|
3
|
+
import { PROJECT_ROOT } from '#scripts/init/init-paths'
|
|
4
|
+
import { josh_command } from '#scripts/josh/josh-run'
|
|
5
|
+
import { stamp_file } from '#scripts/josh/stamp-file'
|
|
6
|
+
import { lane_child_marker } from '#scripts/lane/lane-child-marker'
|
|
7
|
+
import { review_attest, type ReviewSlot } from '#scripts/review/review-attest'
|
|
8
|
+
import { run_hold } from '#scripts/run/hold/run-hold'
|
|
9
|
+
import { run_ship_body_draft } from '#scripts/run/ship/run-ship-body-draft'
|
|
10
|
+
import { run_review } from './run-review'
|
|
11
|
+
import { run_review_steps } from './run-review-steps'
|
|
12
|
+
|
|
13
|
+
// **A lane child's `josh run:review` pushes at the first green gate** (joshuafolkken/kit#4907), so the
|
|
14
|
+
// pull request's CI runs beside round 1 rather than after the ship's commit stage. The open commits the
|
|
15
|
+
// tree locally before the brief is minted — the attest compares `HEAD`, and the gate, brief and reuse
|
|
16
|
+
// records are keyed by the file map a no-change commit leaves alone — then leaves `josh run:review
|
|
17
|
+
// --push` waiting on the gate in the background. On a green gate over a clean tree it pushes and opens
|
|
18
|
+
// the pull request (CI triggers on `pull_request` only); a red or moved gate, or a tree a round-1 fix
|
|
19
|
+
// already moved, pushes nothing and the ship's commit stage pushes as before. A round recorded once
|
|
20
|
+
// the branch is pushed goes to the issue (`review-record-comment.ts`).
|
|
21
|
+
//
|
|
22
|
+
// Only a lane child's own open, briefing code alone: the ship's `--code-only` open commits through its
|
|
23
|
+
// own sync stage, and an interaction review is still to come.
|
|
24
|
+
|
|
25
|
+
const PUSH_FLAG = '--push'
|
|
26
|
+
const RUN_REVIEW_COMMAND = 'run:review'
|
|
27
|
+
const PUSH_LOG_PREFIX = 'josh-run-review-push-log-'
|
|
28
|
+
const COMMIT_ARGS = ['git', '-y', '--skip-push', '--skip-pr']
|
|
29
|
+
const PUSH_ARGS = ['git', '-y', '--skip-commit']
|
|
30
|
+
const SUCCESS_EXIT_CODE = 0
|
|
31
|
+
const COMMIT_REFUSED_NOTE =
|
|
32
|
+
'The early commit was refused, so this round pushes nothing early; `josh ship` commits and pushes as before:'
|
|
33
|
+
const SKIPPED_NOTE = 'No early push: '
|
|
34
|
+
const RED_NOTE = 'the gate did not come back green on this tree.'
|
|
35
|
+
const DIRTY_NOTE = 'the tree moved after the gate (a round-1 fix in place).'
|
|
36
|
+
|
|
37
|
+
interface EarlyPushPlan {
|
|
38
|
+
is_code_only: boolean
|
|
39
|
+
slots: ReadonlyArray<ReviewSlot>
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
type Environment = Readonly<Record<string, string | undefined>>
|
|
43
|
+
|
|
44
|
+
function is_code_alone(plan: EarlyPushPlan): boolean {
|
|
45
|
+
if (plan.is_code_only) return false
|
|
46
|
+
|
|
47
|
+
return plan.slots.length === 1 && plan.slots[0] === review_attest.REVIEW_SLOT.CODE
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// The mark counts only in the checkout of the issue it names: a leaked one pushes nothing.
|
|
51
|
+
function is_due(
|
|
52
|
+
plan: EarlyPushPlan,
|
|
53
|
+
environment: Environment = process.env,
|
|
54
|
+
directory = PROJECT_ROOT,
|
|
55
|
+
): boolean {
|
|
56
|
+
return lane_child_marker.is_child_of(directory, environment) && is_code_alone(plan)
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// A clean tree is already committed; a refused commit says why and leaves the round to the ship.
|
|
60
|
+
async function commit_locally(): Promise<boolean> {
|
|
61
|
+
if (!(await run_hold.is_tree_dirty())) return true
|
|
62
|
+
const result = await josh_command.josh_run(COMMIT_ARGS)
|
|
63
|
+
|
|
64
|
+
if (result.code === SUCCESS_EXIT_CODE) return true
|
|
65
|
+
process.stderr.write(`${COMMIT_REFUSED_NOTE}\n${result.out}\n${result.err ?? ''}\n`)
|
|
66
|
+
|
|
67
|
+
return false
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// Whether this open pushes early: due here, and the tree committed for the brief to attest.
|
|
71
|
+
async function prepare(
|
|
72
|
+
plan: EarlyPushPlan,
|
|
73
|
+
environment?: Environment,
|
|
74
|
+
directory?: string,
|
|
75
|
+
): Promise<boolean> {
|
|
76
|
+
return is_due(plan, environment, directory) && (await commit_locally())
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
function launch(): void {
|
|
80
|
+
const log_path = stamp_file.stamp_path(PUSH_LOG_PREFIX, PROJECT_ROOT)
|
|
81
|
+
const result = run_review_steps.launch_josh([RUN_REVIEW_COMMAND, PUSH_FLAG], log_path)
|
|
82
|
+
|
|
83
|
+
if (result.kind === 'failed') {
|
|
84
|
+
process.stderr.write(`${SKIPPED_NOTE}the push could not be started: ${result.note}\n`)
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
async function skip_reason(): Promise<string | undefined> {
|
|
89
|
+
if ((await run_review_steps.wait_for_gate_finish()) !== run_review.GATE_GREEN) return RED_NOTE
|
|
90
|
+
|
|
91
|
+
return (await run_hold.is_tree_dirty()) ? DIRTY_NOTE : undefined
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// The ship's body draft goes with the pull request it opens; the ship's commit stage replaces it.
|
|
95
|
+
async function body_arguments(): Promise<ReadonlyArray<string>> {
|
|
96
|
+
const issue = git_branch.issue_from_branch(await git_command.branch())
|
|
97
|
+
const draft = issue === undefined ? undefined : await run_ship_body_draft.existing(String(issue))
|
|
98
|
+
|
|
99
|
+
return run_ship_body_draft.body_arguments(draft)
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// `josh run:review --push`, the background half: a skipped push exits 0, as nothing failed.
|
|
103
|
+
async function push(): Promise<number> {
|
|
104
|
+
const reason = await skip_reason()
|
|
105
|
+
|
|
106
|
+
if (reason !== undefined) {
|
|
107
|
+
process.stdout.write(`${SKIPPED_NOTE}${reason}\n`)
|
|
108
|
+
|
|
109
|
+
return SUCCESS_EXIT_CODE
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
const result = await josh_command.josh_run([...PUSH_ARGS, ...(await body_arguments())], true)
|
|
113
|
+
|
|
114
|
+
process.stdout.write(`${result.out}\n`)
|
|
115
|
+
|
|
116
|
+
return result.code
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
const run_review_early_push = { PUSH_FLAG, is_due, launch, prepare, push }
|
|
120
|
+
|
|
121
|
+
export { run_review_early_push }
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { PROJECT_ROOT } from '#scripts/init/init-paths'
|
|
2
|
+
import { stamp_file } from '#scripts/josh/stamp-file'
|
|
3
|
+
import { error_text } from '#scripts/lib/error-message'
|
|
4
|
+
import { test_pinned_logic } from '#scripts/test/test-pinned-logic'
|
|
5
|
+
import type { PinnedSummary } from '#scripts/test/test-pinned-record'
|
|
6
|
+
import { run_review_pinned_accepted } from './run-review-pinned-accepted'
|
|
7
|
+
import { run_review_pinned_join } from './run-review-pinned-join'
|
|
8
|
+
import { run_review_pinned_steps } from './run-review-pinned-steps'
|
|
9
|
+
|
|
10
|
+
// The read of `josh run:review --join` on the background `josh test:pinned` (joshuafolkken/kit#5212).
|
|
11
|
+
// **A join is due from the start of a pair until something reads it**: `run:review` marks it, and the
|
|
12
|
+
// read clears the mark first. A lane that skipped `--join` went on to `josh review:record` and the
|
|
13
|
+
// ship, and the unpinned places surfaced only as the ship's pre-detach failure. `review:record` asks
|
|
14
|
+
// whether the join is still due and, if so, reads it with this same function.
|
|
15
|
+
|
|
16
|
+
const DUE_PREFIX = 'josh-run-review-join-due-'
|
|
17
|
+
|
|
18
|
+
type PinnedWait = () => Promise<PinnedSummary | undefined>
|
|
19
|
+
|
|
20
|
+
interface JoinVerdict {
|
|
21
|
+
summary: PinnedSummary
|
|
22
|
+
is_stop: boolean
|
|
23
|
+
text: string
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function due_path(root: string): string {
|
|
27
|
+
return stamp_file.stamp_path(DUE_PREFIX, root)
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// A mark that could not be written loses only `review:record`'s read, never the pair's start.
|
|
31
|
+
function mark_due(root: string = PROJECT_ROOT): void {
|
|
32
|
+
try {
|
|
33
|
+
stamp_file.replace_stamp(due_path(root), { due: true })
|
|
34
|
+
} catch (error) {
|
|
35
|
+
error_text.trace_swallowed('run_review_join_read.mark_due', error)
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function is_due(root: string = PROJECT_ROOT): boolean {
|
|
40
|
+
return stamp_file.read_stamp_text(due_path(root)) !== undefined
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// A partial answer (joshuafolkken/kit#4936) is shown, but neither stops the round nor replaces the
|
|
44
|
+
// accepted `--unpinned-ok` record (`run_review_pinned_accepted.remember`). `undefined` when no check
|
|
45
|
+
// was launched.
|
|
46
|
+
async function verdict(wait: PinnedWait): Promise<JoinVerdict | undefined> {
|
|
47
|
+
const summary = await wait()
|
|
48
|
+
|
|
49
|
+
if (summary === undefined) return undefined
|
|
50
|
+
|
|
51
|
+
if (summary.is_partial === true) {
|
|
52
|
+
return { summary, is_stop: false, text: test_pinned_logic.report_text(summary) }
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
const judged = await run_review_pinned_accepted.judge(
|
|
56
|
+
summary,
|
|
57
|
+
run_review_pinned_steps.launched_reason(),
|
|
58
|
+
)
|
|
59
|
+
|
|
60
|
+
return { summary, is_stop: judged.kind === 'stop', text: judged.text }
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// Any read of the join: the mark is cleared first, so the same answer is not shown twice.
|
|
64
|
+
async function read_with(
|
|
65
|
+
wait: PinnedWait,
|
|
66
|
+
root: string = PROJECT_ROOT,
|
|
67
|
+
): Promise<JoinVerdict | undefined> {
|
|
68
|
+
stamp_file.remove_stamp(due_path(root))
|
|
69
|
+
|
|
70
|
+
return await verdict(wait)
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// `--join`'s read: the current tree's answer (`run_review_pinned_join.wait_for_join`).
|
|
74
|
+
async function read(
|
|
75
|
+
root: string = PROJECT_ROOT,
|
|
76
|
+
is_fixing = false,
|
|
77
|
+
): Promise<JoinVerdict | undefined> {
|
|
78
|
+
return await read_with(
|
|
79
|
+
async () => await run_review_pinned_join.wait_for_join(root, undefined, is_fixing),
|
|
80
|
+
root,
|
|
81
|
+
)
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// `review:record`'s read: only an answer already left on this very tree
|
|
85
|
+
// (`run_review_pinned_join.finished_on_tree`). It neither waits (joshuafolkken/kit#4895) nor starts a
|
|
86
|
+
// check, so the restart that follows on a moved tree still says who reads its answer.
|
|
87
|
+
async function read_finished(root: string = PROJECT_ROOT): Promise<JoinVerdict | undefined> {
|
|
88
|
+
return await read_with(async () => await run_review_pinned_join.finished_on_tree(root), root)
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
const run_review_join_read = { is_due, mark_due, read, read_finished, read_with, verdict }
|
|
92
|
+
|
|
93
|
+
export type { JoinVerdict, PinnedWait }
|
|
94
|
+
export { run_review_join_read }
|