@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
|
@@ -36,7 +36,6 @@ const LABEL_NAMES_FILTER = '.[].name'
|
|
|
36
36
|
const LABELS_SEGMENT = '/labels'
|
|
37
37
|
const COMMENTS_SEGMENT = '/comments'
|
|
38
38
|
const CLOSED_STATE = 'closed'
|
|
39
|
-
const NOT_PLANNED_REASON = 'not_planned'
|
|
40
39
|
const COLOR_HASH = '#'
|
|
41
40
|
const UNPROCESSABLE_STATUS = 422
|
|
42
41
|
const ALREADY_EXISTS_CODE = 'already_exists'
|
|
@@ -57,21 +56,39 @@ async function did_write_succeed(write: () => Promise<unknown>): Promise<boolean
|
|
|
57
56
|
}
|
|
58
57
|
}
|
|
59
58
|
|
|
60
|
-
async function
|
|
59
|
+
async function issue_patch(
|
|
60
|
+
issue_number: string,
|
|
61
|
+
fields: Readonly<Record<string, string>>,
|
|
62
|
+
repo?: string,
|
|
63
|
+
): Promise<string> {
|
|
61
64
|
return await git_gh_exec.exec_gh_api({
|
|
62
|
-
path: git_gh_api_path.issue_api_path(issue_number),
|
|
65
|
+
path: git_gh_api_path.issue_api_path(issue_number, repo),
|
|
63
66
|
method: PATCH_METHOD,
|
|
64
|
-
body: JSON.stringify(
|
|
67
|
+
body: JSON.stringify(fields),
|
|
65
68
|
jq_filter: HTML_URL_FILTER,
|
|
66
69
|
})
|
|
67
70
|
}
|
|
68
71
|
|
|
72
|
+
// The optional `repo` (`owner/name`) on these writes addresses an issue in another repository; left
|
|
73
|
+
// out, the path keeps gh's `{owner}/{repo}` placeholder — the checkout's own repository.
|
|
74
|
+
async function issue_edit_body(issue_number: string, body: string, repo?: string): Promise<string> {
|
|
75
|
+
return await issue_patch(issue_number, { body }, repo)
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
async function issue_edit_title(
|
|
79
|
+
issue_number: string,
|
|
80
|
+
title: string,
|
|
81
|
+
repo?: string,
|
|
82
|
+
): Promise<string> {
|
|
83
|
+
return await issue_patch(issue_number, { title }, repo)
|
|
84
|
+
}
|
|
85
|
+
|
|
69
86
|
// **Every comment josh posts carries `RUN_MARKER`**, an HTML comment GitHub does not render. A run
|
|
70
87
|
// posts under the person's own `gh` login, so the marker is the only thing that tells the issue watch
|
|
71
88
|
// (`issue-watch-diff.ts`) a run's comment from a person's update.
|
|
72
|
-
async function issue_comment(issue_number: string, body: string): Promise<string> {
|
|
89
|
+
async function issue_comment(issue_number: string, body: string, repo?: string): Promise<string> {
|
|
73
90
|
return await git_gh_exec.exec_gh_api({
|
|
74
|
-
path: `${git_gh_api_path.issue_api_path(issue_number)}${COMMENTS_SEGMENT}`,
|
|
91
|
+
path: `${git_gh_api_path.issue_api_path(issue_number, repo)}${COMMENTS_SEGMENT}`,
|
|
75
92
|
body: JSON.stringify({ body: `${body}\n\n${issue_watch_diff.RUN_MARKER}` }),
|
|
76
93
|
jq_filter: HTML_URL_FILTER,
|
|
77
94
|
})
|
|
@@ -81,8 +98,12 @@ async function issue_comment(issue_number: string, body: string): Promise<string
|
|
|
81
98
|
// **after** the epic body already carries the record, so a refused comment costs that child's copy and
|
|
82
99
|
// nothing else — an exception there would leave the caller unable to tell a landed insertion from one
|
|
83
100
|
// that wrote nothing.
|
|
84
|
-
async function issue_try_comment(
|
|
85
|
-
|
|
101
|
+
async function issue_try_comment(
|
|
102
|
+
issue_number: string,
|
|
103
|
+
body: string,
|
|
104
|
+
repo?: string,
|
|
105
|
+
): Promise<boolean> {
|
|
106
|
+
return await did_write_succeed(async () => await issue_comment(issue_number, body, repo))
|
|
86
107
|
}
|
|
87
108
|
|
|
88
109
|
// `gh issue close --comment` posted the comment and closed the issue in one call; REST splits them.
|
|
@@ -119,18 +140,6 @@ async function issue_close(issue_number: string, comment: string | undefined): P
|
|
|
119
140
|
return await close_with(issue_number, comment, { state: CLOSED_STATE })
|
|
120
141
|
}
|
|
121
142
|
|
|
122
|
-
// The same close as "not planned" — the reason `issue-merged.ts` reads as no merge, so a closed issue
|
|
123
|
-
// that was withdrawn is never taken for one whose work landed.
|
|
124
|
-
async function issue_close_not_planned(
|
|
125
|
-
issue_number: string,
|
|
126
|
-
comment: string | undefined,
|
|
127
|
-
): Promise<boolean> {
|
|
128
|
-
return await close_with(issue_number, comment, {
|
|
129
|
-
state: CLOSED_STATE,
|
|
130
|
-
state_reason: NOT_PLANNED_REASON,
|
|
131
|
-
})
|
|
132
|
-
}
|
|
133
|
-
|
|
134
143
|
// REST answers 422 `{"resource":"Label","code":"invalid","field":"color"}` for a color carrying a
|
|
135
144
|
// leading `#`. The one caller passes the hash form (`EPIC_LABEL_COLOR`), so dropping it here is what
|
|
136
145
|
// keeps that call site unchanged.
|
|
@@ -206,6 +215,8 @@ function issue_create_request(input: {
|
|
|
206
215
|
body: input.body,
|
|
207
216
|
}),
|
|
208
217
|
jq_filter: HTML_URL_FILTER,
|
|
218
|
+
// A 502 can follow an issue GitHub already opened, and a retry would open a second one.
|
|
219
|
+
should_retry: false,
|
|
209
220
|
}
|
|
210
221
|
}
|
|
211
222
|
|
|
@@ -225,12 +236,16 @@ async function issue_create_with_label(input: {
|
|
|
225
236
|
// say why it refused.
|
|
226
237
|
type LabelWrite = { is_applied: true } | { is_applied: false; reason: string }
|
|
227
238
|
|
|
228
|
-
// The issue's label names, read back after a failed write
|
|
229
|
-
//
|
|
230
|
-
|
|
239
|
+
// The issue's label names, every page of them — read back after a failed write, and by a pull
|
|
240
|
+
// request's classification read. A read that itself fails answers `undefined`, which the write
|
|
241
|
+
// treats as "not applied" — its own error is the reason then.
|
|
242
|
+
async function read_label_names(
|
|
243
|
+
issue_number: string,
|
|
244
|
+
repo?: string,
|
|
245
|
+
): Promise<Array<string> | undefined> {
|
|
231
246
|
try {
|
|
232
247
|
const raw = await git_gh_exec.exec_gh_api({
|
|
233
|
-
path:
|
|
248
|
+
path: git_gh_api_path.issue_labels_api_path(issue_number, repo),
|
|
234
249
|
should_paginate: true,
|
|
235
250
|
jq_filter: LABEL_NAMES_FILTER,
|
|
236
251
|
})
|
|
@@ -247,15 +262,19 @@ async function read_label_names(issue_number: string): Promise<Array<string> | u
|
|
|
247
262
|
// after the write or a secondary rate limit can each throw after the label landed — which refused a
|
|
248
263
|
// lane dispatch whose label was in fact applied. So a throw is confirmed by
|
|
249
264
|
// reading the labels back, and only a label that is really absent answers `is_applied: false`.
|
|
250
|
-
async function issue_apply_label(
|
|
251
|
-
|
|
265
|
+
async function issue_apply_label(
|
|
266
|
+
issue_number: string,
|
|
267
|
+
label: string,
|
|
268
|
+
repo?: string,
|
|
269
|
+
): Promise<LabelWrite> {
|
|
270
|
+
const labels_path = git_gh_api_path.issue_labels_api_path(issue_number, repo)
|
|
252
271
|
|
|
253
272
|
try {
|
|
254
273
|
await git_gh_exec.exec_gh_api({ path: labels_path, body: JSON.stringify({ labels: [label] }) })
|
|
255
274
|
|
|
256
275
|
return { is_applied: true }
|
|
257
276
|
} catch (error) {
|
|
258
|
-
const names = await read_label_names(issue_number)
|
|
277
|
+
const names = await read_label_names(issue_number, repo)
|
|
259
278
|
|
|
260
279
|
if (names?.includes(label) === true) return { is_applied: true }
|
|
261
280
|
error_text.trace_swallowed('git_gh_issue_write.issue_apply_label', error)
|
|
@@ -271,8 +290,12 @@ async function issue_apply_label(issue_number: string, label: string): Promise<L
|
|
|
271
290
|
// Applied after the body edit so a failure leaves an issue with the epic sections and no label,
|
|
272
291
|
// which `epic:check` reports — rather than a labelled issue with nothing to track. The caller checks
|
|
273
292
|
// the return: the label is what the auto-close filters on.
|
|
274
|
-
async function issue_add_label(
|
|
275
|
-
|
|
293
|
+
async function issue_add_label(
|
|
294
|
+
issue_number: string,
|
|
295
|
+
label: string,
|
|
296
|
+
repo?: string,
|
|
297
|
+
): Promise<boolean> {
|
|
298
|
+
const write = await issue_apply_label(issue_number, label, repo)
|
|
276
299
|
|
|
277
300
|
return write.is_applied
|
|
278
301
|
}
|
|
@@ -287,7 +310,7 @@ async function issue_add_label(issue_number: string, label: string): Promise<boo
|
|
|
287
310
|
// a `false` swallowed here would reach that guard as a success and the step would be reported as
|
|
288
311
|
// done.
|
|
289
312
|
async function issue_remove_label(issue_number: string, label: string): Promise<void> {
|
|
290
|
-
const labels_path =
|
|
313
|
+
const labels_path = git_gh_api_path.issue_labels_api_path(issue_number)
|
|
291
314
|
|
|
292
315
|
await git_gh_exec.exec_gh_api({
|
|
293
316
|
path: `${labels_path}/${encodeURIComponent(label)}`,
|
|
@@ -295,6 +318,25 @@ async function issue_remove_label(issue_number: string, label: string): Promise<
|
|
|
295
318
|
})
|
|
296
319
|
}
|
|
297
320
|
|
|
321
|
+
// **The removal for a caller that wants the label gone, not removed by this call** — a release that
|
|
322
|
+
// may find the label already off. A failed DELETE is confirmed against the labels the issue carries,
|
|
323
|
+
// the read `issue_apply_label` confirms an addition with, so an absent label answers `true` and a
|
|
324
|
+
// failure that left the label on answers `false`.
|
|
325
|
+
async function issue_clear_label(issue_number: string, label: string): Promise<boolean> {
|
|
326
|
+
try {
|
|
327
|
+
await issue_remove_label(issue_number, label)
|
|
328
|
+
|
|
329
|
+
return true
|
|
330
|
+
} catch (error) {
|
|
331
|
+
const names = await read_label_names(issue_number)
|
|
332
|
+
|
|
333
|
+
if (names?.includes(label) === false) return true
|
|
334
|
+
error_text.trace_swallowed('git_gh_issue_write.issue_clear_label', error)
|
|
335
|
+
|
|
336
|
+
return false
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
|
|
298
340
|
// The blocker's **database id**, which is the only thing the dependencies endpoint accepts — and the
|
|
299
341
|
// reason this resolution exists rather than the issue number being sent straight through.
|
|
300
342
|
//
|
|
@@ -354,16 +396,18 @@ async function issue_remove_blocked_by(issue_number: string, blocker: string): P
|
|
|
354
396
|
|
|
355
397
|
const git_gh_issue_write = {
|
|
356
398
|
issue_edit_body,
|
|
399
|
+
issue_edit_title,
|
|
357
400
|
issue_comment,
|
|
358
401
|
issue_try_comment,
|
|
359
402
|
issue_close,
|
|
360
|
-
issue_close_not_planned,
|
|
361
403
|
label_ensure,
|
|
362
404
|
issue_create_request,
|
|
363
405
|
issue_create_with_label,
|
|
406
|
+
read_label_names,
|
|
364
407
|
issue_apply_label,
|
|
365
408
|
issue_add_label,
|
|
366
409
|
issue_remove_label,
|
|
410
|
+
issue_clear_label,
|
|
367
411
|
issue_add_blocked_by,
|
|
368
412
|
issue_remove_blocked_by,
|
|
369
413
|
}
|
|
@@ -1,9 +1,13 @@
|
|
|
1
|
+
import { gh_author_association } from './gh-author-association'
|
|
1
2
|
import { git_gh_issue_list, type IssueListOutcome } from './git-gh-issue-list'
|
|
2
3
|
import { git_gh_issue_read } from './git-gh-issue-read'
|
|
3
4
|
import { BLOCKED_BY_COUNT_FIELD } from './git-gh-issue-rest'
|
|
4
5
|
import { git_gh_issue_write } from './git-gh-issue-write'
|
|
5
6
|
|
|
6
7
|
const NUMBER_AND_BODY_FIELDS = 'number,body'
|
|
8
|
+
// The label listing's fields. `stateReason` rides along on the same response: the epic auto-close
|
|
9
|
+
// reads `reopened` off it, so its sweep leaves an epic a person reopened to them (#4564).
|
|
10
|
+
const LABELLED_FIELDS = 'number,body,stateReason'
|
|
7
11
|
// The backlog scan's fields. The title rides along because the pre-filing scan compares titles
|
|
8
12
|
// and it costs nothing: the same listing request already carries it, so the
|
|
9
13
|
// two consumers share one read rather than each making their own.
|
|
@@ -23,7 +27,8 @@ const BACKLOG_SCAN_FIELDS = `number,title,body,labels,${BLOCKED_BY_COUNT_FIELD}`
|
|
|
23
27
|
// gets that from the epic listing, which by construction holds no closed epic.
|
|
24
28
|
const NUMBER_TITLE_AND_LABELS_FIELDS = 'number,title,labels'
|
|
25
29
|
// The fields every listing that is *ranked* asks for: `createdAt` to order by and `labels` to
|
|
26
|
-
// exclude by. Shared by the next-issues display and the `auto-ok` pickup, which rank identically
|
|
30
|
+
// exclude by. Shared by the next-issues display and the `auto-ok` pickup, which rank identically —
|
|
31
|
+
// each adds `body` for the causing-lane key.
|
|
27
32
|
const SUMMARY_FIELDS = 'number,title,labels,createdAt'
|
|
28
33
|
// The pickup's list, which is the display's plus the native blocker relation. Kept apart from
|
|
29
34
|
// `SUMMARY_FIELDS` on purpose: a listing carries no `blockedBy`, so the field is answered from each
|
|
@@ -31,8 +36,9 @@ const SUMMARY_FIELDS = 'number,title,labels,createdAt'
|
|
|
31
36
|
// behind the next-issues display too — where a refused one becomes a failure with no message at all,
|
|
32
37
|
// since the listing swallows the error. `body` costs
|
|
33
38
|
// no request — the REST listing row already carries it — and is what the backlog offer reads for
|
|
34
|
-
// the paths each issue declares.
|
|
35
|
-
|
|
39
|
+
// the paths each issue declares. The author fields are the same row's too, and decide whether an
|
|
40
|
+
// unattended run may act on that body at all.
|
|
41
|
+
const PICKUP_FIELDS = `${SUMMARY_FIELDS},blockedBy,body,${gh_author_association.AUTHOR_FIELDS}`
|
|
36
42
|
|
|
37
43
|
// Every listing below goes through the one REST invocation in `git-gh-issue-list.ts`. It kept the
|
|
38
44
|
// `json_fields` / `limit` contract it had as a `gh issue list` wrapper, so these callers changed
|
|
@@ -59,9 +65,13 @@ const PICKUP_FIELDS = `${SUMMARY_FIELDS},blockedBy,body`
|
|
|
59
65
|
const { issue_list } = git_gh_issue_list
|
|
60
66
|
|
|
61
67
|
// The newest open issues, for the next-issues display at workflow completion. `createdAt`
|
|
62
|
-
// rides along because the caller re-sorts explicitly rather than inheriting the listing's order
|
|
68
|
+
// rides along because the caller re-sorts explicitly rather than inheriting the listing's order, and
|
|
69
|
+
// `body` because the ranking reads its causing-lane minutes — without it the display would order a
|
|
70
|
+
// priority differently from the pickup (joshuafolkken/kit#4859). It adds no listing request, as
|
|
71
|
+
// above; `backlog:plan`'s read now also hands the bodies to `issue_sample_prime.prime`, which reads
|
|
72
|
+
// the pull requests they cite.
|
|
63
73
|
async function issue_list_recent(limit: number): Promise<IssueListOutcome> {
|
|
64
|
-
return await issue_list({ json_fields: SUMMARY_FIELDS, limit })
|
|
74
|
+
return await issue_list({ json_fields: `${SUMMARY_FIELDS},body`, limit })
|
|
65
75
|
}
|
|
66
76
|
|
|
67
77
|
// Every open issue with its title and body. Used by `epic:bundle` to scan the backlog and by
|
|
@@ -111,7 +121,7 @@ async function issue_search_body(term: string, limit: number): Promise<IssueList
|
|
|
111
121
|
}
|
|
112
122
|
|
|
113
123
|
async function issue_list_by_label(label: string, limit: number): Promise<IssueListOutcome> {
|
|
114
|
-
return await issue_list({ json_fields:
|
|
124
|
+
return await issue_list({ json_fields: LABELLED_FIELDS, limit, label })
|
|
115
125
|
}
|
|
116
126
|
|
|
117
127
|
// The same filter with the fields the `auto-ok` pickup needs: it orders by
|
|
@@ -151,8 +161,9 @@ async function issue_list_by_label_in_repo(
|
|
|
151
161
|
}
|
|
152
162
|
|
|
153
163
|
// Every open issue with what `josh auto-ok:judge` judges it by — its labels and body — and `updatedAt`,
|
|
154
|
-
// so the backlog driver's resident check reads an issue's comments again only once it has moved
|
|
155
|
-
|
|
164
|
+
// so the backlog driver's resident check reads an issue's comments again only once it has moved; and
|
|
165
|
+
// `author_association` and `user`, so an issue a third party filed is never judged.
|
|
166
|
+
const JUDGEMENT_FIELDS = 'number,title,body,labels,updatedAt,author_association,user'
|
|
156
167
|
|
|
157
168
|
async function issue_list_open_for_judgement(limit: number): Promise<IssueListOutcome> {
|
|
158
169
|
return await issue_list({ json_fields: JUDGEMENT_FIELDS, limit })
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { error_text } from '#scripts/lib/error-message'
|
|
2
|
+
import { json_value } from '#scripts/lib/json-value'
|
|
3
|
+
import { z } from 'zod'
|
|
4
|
+
import { FULL_PAGE_QUERY } from './git-gh-api-path'
|
|
5
|
+
import { git_gh_conditional, type ConditionalRead } from './git-gh-conditional'
|
|
6
|
+
import { git_gh_exec } from './git-gh-exec'
|
|
7
|
+
|
|
8
|
+
// The merge gate's per-poll reads, each sent with the ETag of this process's previous answer
|
|
9
|
+
// (joshuafolkken/kit#4550).
|
|
10
|
+
//
|
|
11
|
+
// **Never a pull request's detail**: GitHub computes its `mergeable_state` lazily, under an unchanged
|
|
12
|
+
// ETag, so a 304 would keep a stale state (joshuafolkken/kit#4589).
|
|
13
|
+
//
|
|
14
|
+
// **`pnpm josh followup` reads the same pull request every 10 seconds** while its checks run, and
|
|
15
|
+
// every lane waiting on its merge does so at once. A `304 Not Modified` does not count against the
|
|
16
|
+
// rate limit, so a poll that finds nothing changed costs only its pull detail read.
|
|
17
|
+
//
|
|
18
|
+
// **A listing is read one page at a time only while it fits in one.** A listing longer than a page is
|
|
19
|
+
// read through `--paginate --slurp` as before; the conditional read cannot page, and a partial
|
|
20
|
+
// listing would drop checks from the verdict.
|
|
21
|
+
|
|
22
|
+
const UNREADABLE_POLL_MESSAGE = 'gh api could not read a merge-gate poll'
|
|
23
|
+
const PAGE_SIZE = 100
|
|
24
|
+
|
|
25
|
+
interface KeptAnswer {
|
|
26
|
+
etag: string
|
|
27
|
+
body: string
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const kept_by_path = new Map<string, KeptAnswer>()
|
|
31
|
+
|
|
32
|
+
const page_schema = z.object({ total_count: z.number() })
|
|
33
|
+
|
|
34
|
+
// gh's own failure rides along as the cause and in the message: the poll loop's warning prints the
|
|
35
|
+
// message alone, and a rate limit must read differently there from expired auth.
|
|
36
|
+
function unreadable(path: string, answer: ConditionalRead): Error {
|
|
37
|
+
const cause = answer.kind === 'unreadable' ? answer.cause : undefined
|
|
38
|
+
const reason = cause === undefined ? '' : `: ${error_text.message_of(cause)}`
|
|
39
|
+
|
|
40
|
+
return new Error(`${UNREADABLE_POLL_MESSAGE}: ${path}${reason}`, { cause })
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
function to_body(path: string, answer: ConditionalRead): string {
|
|
44
|
+
const previous = kept_by_path.get(path)
|
|
45
|
+
|
|
46
|
+
if (previous !== undefined && answer.kind === 'unchanged') return previous.body
|
|
47
|
+
if (answer.kind !== 'changed') throw unreadable(path, answer)
|
|
48
|
+
if (answer.etag !== undefined) kept_by_path.set(path, { etag: answer.etag, body: answer.body })
|
|
49
|
+
|
|
50
|
+
return answer.body
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// The answer for `path`, or the previous one where GitHub says it has not changed. A failure throws,
|
|
54
|
+
// the contract the unconditional read had.
|
|
55
|
+
async function read(path: string): Promise<string> {
|
|
56
|
+
const answer = await git_gh_conditional.read_conditional(path, kept_by_path.get(path)?.etag)
|
|
57
|
+
|
|
58
|
+
return to_body(path, answer)
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// A page that does not parse as a listing is not taken as the whole one: the full read answers it, and
|
|
62
|
+
// its own parser reports what it was.
|
|
63
|
+
function is_whole_listing(page: string): boolean {
|
|
64
|
+
const total = json_value.parse_with(page, page_schema)?.total_count
|
|
65
|
+
|
|
66
|
+
return total !== undefined && total <= PAGE_SIZE
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// A commit listing in the `--slurp` shape — an array of pages — however it was read.
|
|
70
|
+
async function read_object_pages(path: string): Promise<string> {
|
|
71
|
+
const full_path = `${path}${FULL_PAGE_QUERY}`
|
|
72
|
+
const page = await read(full_path)
|
|
73
|
+
|
|
74
|
+
if (is_whole_listing(page)) return `[${page}]`
|
|
75
|
+
|
|
76
|
+
return await git_gh_exec.exec_gh_api({
|
|
77
|
+
path: full_path,
|
|
78
|
+
should_paginate: true,
|
|
79
|
+
should_slurp: true,
|
|
80
|
+
})
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
function forget_poll_reads(): void {
|
|
84
|
+
kept_by_path.clear()
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
const git_gh_poll_read = { UNREADABLE_POLL_MESSAGE, forget_poll_reads, read, read_object_pages }
|
|
88
|
+
|
|
89
|
+
export { git_gh_poll_read }
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { error_text } from '#scripts/lib/error-message'
|
|
2
2
|
import { git_gh_api_path } from './git-gh-api-path'
|
|
3
3
|
import { git_gh_exec } from './git-gh-exec'
|
|
4
|
-
import {
|
|
4
|
+
import { GRAPHQL_PATH } from './git-gh-pr-graphql-state'
|
|
5
|
+
import { read_pull, read_pull_or_listed, require_pr_number } from './git-gh-pr-read'
|
|
5
6
|
import { git_gh_pr_rest, type RestPull } from './git-gh-pr-rest'
|
|
6
7
|
|
|
7
8
|
// Auto-merge for a pull request a josh command opens and would otherwise have to stay alive to land.
|
|
@@ -9,16 +10,18 @@ import { git_gh_pr_rest, type RestPull } from './git-gh-pr-rest'
|
|
|
9
10
|
// inside its own wait, so a wait that ended early — a session cut, a killed process — left a green
|
|
10
11
|
// pull request open with nobody to merge it.
|
|
11
12
|
//
|
|
12
|
-
// **This is
|
|
13
|
-
// Enabling auto-merge is `enablePullRequestAutoMerge` and
|
|
13
|
+
// **This is a GraphQL request because REST has no equivalent** — the pull-request layer's only other
|
|
14
|
+
// one is `git-gh-pr-graphql-state.ts`. Enabling auto-merge is `enablePullRequestAutoMerge` and
|
|
15
|
+
// nothing else. A cloud session can be
|
|
14
16
|
// answered 403 for GraphQL, so the caller treats a failure here as a lost
|
|
15
17
|
// safety net rather than a failed command — the in-process wait still merges as it always did.
|
|
16
18
|
|
|
17
|
-
const GRAPHQL_PATH = 'graphql'
|
|
18
19
|
const OPEN_PULLS_QUERY = `${git_gh_api_path.FULL_PAGE_QUERY}&state=open`
|
|
19
20
|
const MISSING_NODE_ID_MESSAGE = 'gh api answered a pull request without a node_id'
|
|
21
|
+
// **`expectedHeadOid` binds the auto-merge to the commit the caller pushed** (#4036): GitHub then
|
|
22
|
+
// refuses it if the head has moved, rather than landing a commit nobody here pushed or checked.
|
|
20
23
|
const ENABLE_AUTO_MERGE_MUTATION =
|
|
21
|
-
'mutation($id: ID!) { enablePullRequestAutoMerge(input: { pullRequestId: $id, mergeMethod: MERGE }) { clientMutationId } }'
|
|
24
|
+
'mutation($id: ID!, $head: GitObjectID!) { enablePullRequestAutoMerge(input: { pullRequestId: $id, mergeMethod: MERGE, expectedHeadOid: $head }) { clientMutationId } }'
|
|
22
25
|
|
|
23
26
|
interface OpenPull {
|
|
24
27
|
number: number
|
|
@@ -26,13 +29,22 @@ interface OpenPull {
|
|
|
26
29
|
has_auto_merge: boolean
|
|
27
30
|
}
|
|
28
31
|
|
|
29
|
-
|
|
30
|
-
|
|
32
|
+
// The listing row stands in for a detail GitHub refuses as too many files changed: both carry
|
|
33
|
+
// `node_id` and `merged_at`, which is all the two readers below need (`git-gh-pr-too-large.ts`).
|
|
34
|
+
async function read_branch_pull(branch_name: string): Promise<RestPull> {
|
|
35
|
+
return await read_pull_or_listed(branch_name, await require_pr_number(branch_name), read_pull)
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
async function pr_enable_auto_merge(branch_name: string, head_sha: string): Promise<void> {
|
|
39
|
+
const pull = await read_branch_pull(branch_name)
|
|
31
40
|
if (pull.node_id === undefined) throw new Error(MISSING_NODE_ID_MESSAGE)
|
|
32
41
|
|
|
33
42
|
await git_gh_exec.exec_gh_api({
|
|
34
43
|
path: GRAPHQL_PATH,
|
|
35
|
-
body: JSON.stringify({
|
|
44
|
+
body: JSON.stringify({
|
|
45
|
+
query: ENABLE_AUTO_MERGE_MUTATION,
|
|
46
|
+
variables: { id: pull.node_id, head: head_sha },
|
|
47
|
+
}),
|
|
36
48
|
})
|
|
37
49
|
}
|
|
38
50
|
|
|
@@ -40,7 +52,7 @@ async function pr_enable_auto_merge(branch_name: string): Promise<void> {
|
|
|
40
52
|
// next attempt asks again, and running out of attempts is what ends the wait.
|
|
41
53
|
async function pr_is_merged(branch_name: string): Promise<boolean> {
|
|
42
54
|
try {
|
|
43
|
-
return git_gh_pr_rest.is_merged(await
|
|
55
|
+
return git_gh_pr_rest.is_merged(await read_branch_pull(branch_name))
|
|
44
56
|
} catch (error) {
|
|
45
57
|
error_text.trace_swallowed('git_gh_pr_auto_merge.pr_is_merged', error)
|
|
46
58
|
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { parse_json_object_or_undefined } from '#scripts/git/parse-json-array'
|
|
2
|
+
import { z } from 'zod'
|
|
3
|
+
import { git_gh_exec } from './git-gh-exec'
|
|
4
|
+
import type { RestPull } from './git-gh-pr-rest'
|
|
5
|
+
|
|
6
|
+
// `mergeStateStatus` for a pull request whose single-pull REST read GitHub refuses as too many files
|
|
7
|
+
// changed (`git-gh-pr-too-large.ts`). The listing row that stands in for that read carries no
|
|
8
|
+
// `mergeable_state`, and the merge gate never reads an unknown state as clean — it would wait out its
|
|
9
|
+
// whole budget. GraphQL still answers for the same pull request, so the state is read there.
|
|
10
|
+
//
|
|
11
|
+
// **A failure is a stop with its reason, never a guess.** A cloud session is answered 403 for
|
|
12
|
+
// GraphQL; the merge gate then has no way to judge the pull request, and says so.
|
|
13
|
+
|
|
14
|
+
const GRAPHQL_PATH = 'graphql'
|
|
15
|
+
|
|
16
|
+
const MERGE_STATE_QUERY =
|
|
17
|
+
'query($id: ID!) { node(id: $id) { ... on PullRequest { mergeStateStatus } } }'
|
|
18
|
+
|
|
19
|
+
const NO_MERGE_STATE_MESSAGE =
|
|
20
|
+
'The merge state cannot be judged: GitHub refuses this pull request as too many files changed, and GraphQL did not answer its mergeStateStatus'
|
|
21
|
+
|
|
22
|
+
const merge_state_node_schema = z.looseObject({ mergeStateStatus: z.string() })
|
|
23
|
+
const merge_state_data_schema = z.looseObject({ node: merge_state_node_schema })
|
|
24
|
+
const merge_state_response_schema = z.looseObject({ data: merge_state_data_schema })
|
|
25
|
+
|
|
26
|
+
async function query_merge_state(node_id: string): Promise<string | undefined> {
|
|
27
|
+
const json = await git_gh_exec.exec_gh_api({
|
|
28
|
+
path: GRAPHQL_PATH,
|
|
29
|
+
body: JSON.stringify({ query: MERGE_STATE_QUERY, variables: { id: node_id } }),
|
|
30
|
+
})
|
|
31
|
+
|
|
32
|
+
return parse_json_object_or_undefined(json, merge_state_response_schema)?.data.node
|
|
33
|
+
.mergeStateStatus
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
async function try_query_merge_state(node_id: string | undefined): Promise<string | undefined> {
|
|
37
|
+
if (node_id === undefined) return undefined
|
|
38
|
+
|
|
39
|
+
try {
|
|
40
|
+
return await query_merge_state(node_id)
|
|
41
|
+
} catch {
|
|
42
|
+
return undefined
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// `detail_error` is the 422 that sent the read here, kept as the cause so the stop names it.
|
|
47
|
+
async function read_merge_state_status(listed: RestPull, detail_error: unknown): Promise<string> {
|
|
48
|
+
const state = await try_query_merge_state(listed.node_id)
|
|
49
|
+
if (state === undefined) throw new Error(NO_MERGE_STATE_MESSAGE, { cause: detail_error })
|
|
50
|
+
|
|
51
|
+
return state
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
const git_gh_pr_graphql_state = { read_merge_state_status }
|
|
55
|
+
|
|
56
|
+
export { git_gh_pr_graphql_state, GRAPHQL_PATH, MERGE_STATE_QUERY, NO_MERGE_STATE_MESSAGE }
|
|
@@ -1,7 +1,10 @@
|
|
|
1
|
+
import { error_text } from '#scripts/lib/error-message'
|
|
1
2
|
import { FULL_PAGE_QUERY, git_gh_api_path } from './git-gh-api-path'
|
|
3
|
+
import { note_unreadable_comments } from './git-gh-comments-unreadable'
|
|
2
4
|
import { git_gh_exec } from './git-gh-exec'
|
|
3
5
|
import { git_gh_helpers } from './git-gh-helpers'
|
|
4
6
|
import { git_gh_pr_rest, type RestPull } from './git-gh-pr-rest'
|
|
7
|
+
import { git_gh_pr_too_large } from './git-gh-pr-too-large'
|
|
5
8
|
import { to_gh_state } from './git-gh-rest-state'
|
|
6
9
|
|
|
7
10
|
// Reading pull requests through REST, in the answers `gh pr view` gives.
|
|
@@ -61,10 +64,16 @@ function lookup_path(branch_name: string): string {
|
|
|
61
64
|
return `${git_gh_api_path.pulls_api_path()}?head=${head}&${LOOKUP_QUERY}`
|
|
62
65
|
}
|
|
63
66
|
|
|
64
|
-
async function
|
|
67
|
+
async function fetch_branch_pull(branch_name: string): Promise<RestPull | undefined> {
|
|
65
68
|
const json = await git_gh_exec.exec_gh_api({ path: lookup_path(branch_name) })
|
|
66
69
|
|
|
67
|
-
return git_gh_pr_rest.select_pull(git_gh_pr_rest.parse_rest_pulls(json))
|
|
70
|
+
return git_gh_pr_rest.select_pull(git_gh_pr_rest.parse_rest_pulls(json))
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
async function fetch_pr_number(branch_name: string): Promise<number | undefined> {
|
|
74
|
+
const pull = await fetch_branch_pull(branch_name)
|
|
75
|
+
|
|
76
|
+
return pull?.number
|
|
68
77
|
}
|
|
69
78
|
|
|
70
79
|
// Why the resolution produced no number. `missing` is the lookup answering: the listing came back and
|
|
@@ -80,7 +89,7 @@ interface PullMergeState {
|
|
|
80
89
|
is_merged: boolean
|
|
81
90
|
merged_at: string | undefined
|
|
82
91
|
head_sha: string | undefined
|
|
83
|
-
//
|
|
92
|
+
// GitHub's merge state (`DIRTY` on a conflict).
|
|
84
93
|
merge_state_status: string | undefined
|
|
85
94
|
}
|
|
86
95
|
|
|
@@ -100,8 +109,8 @@ const pending_pr_number_by_branch = new Map<string, Promise<PullNumberRead>>()
|
|
|
100
109
|
// same `GET /pulls/{N}` each time. The promise is stored, so readers in one tick share the request as
|
|
101
110
|
// well as its answer; a read that fails is dropped and re-tried, the rule the number memo holds.
|
|
102
111
|
// **Every write to a pull request clears it** through `forget_pr_numbers`, and the two state readers
|
|
103
|
-
// never read it: `pr_get_merge_state` answers where the pull request stands *now*, which `josh
|
|
104
|
-
// asks again after every merge
|
|
112
|
+
// never read it: `pr_get_merge_state` answers where the pull request stands *now*, which `josh followup`
|
|
113
|
+
// asks again after every merge `josh ship` pushes, and `pr_view` decides whether `josh git -y` writes onto the
|
|
105
114
|
// pull request — after a commit and a push its preflight read would otherwise outlast.
|
|
106
115
|
const pull_by_number = new Map<number, Promise<RestPull>>()
|
|
107
116
|
|
|
@@ -168,9 +177,12 @@ async function resolve_pr_number(branch_name: string): Promise<number | undefine
|
|
|
168
177
|
}
|
|
169
178
|
|
|
170
179
|
// One definition, because both callers that refuse to fold an unreadable lookup raise it —
|
|
171
|
-
// `require_pr_number` and `pr_exists`.
|
|
180
|
+
// `require_pr_number` and `pr_exists`. The cause's first line rides in the message: a reader that
|
|
181
|
+
// prints only the message — the `josh git -y` preflight, a `josh ship` log — still says why.
|
|
172
182
|
function to_unreadable_error(branch_name: string, cause: unknown): Error {
|
|
173
|
-
|
|
183
|
+
const [gist = ''] = error_text.message_of(cause).split('\n', 1)
|
|
184
|
+
|
|
185
|
+
return new Error(`${UNREADABLE_PULL_REQUEST_MESSAGE}: ${branch_name} (${gist})`, { cause })
|
|
174
186
|
}
|
|
175
187
|
|
|
176
188
|
// The number for a caller that has nothing to fold an absence into. The reads above answer their own
|
|
@@ -213,6 +225,36 @@ async function read_remembered_pull(pr_number: number): Promise<RestPull> {
|
|
|
213
225
|
}
|
|
214
226
|
}
|
|
215
227
|
|
|
228
|
+
// The listing row for a detail read GitHub refused as too large (`git-gh-pr-too-large.ts`). The row
|
|
229
|
+
// carries neither `mergeable` nor `mergeable_state`, which every reader of them already takes as
|
|
230
|
+
// "not known yet". Any other failure — and a listing that no longer names the number — stays the
|
|
231
|
+
// detail read's own `unreadable`.
|
|
232
|
+
async function read_listed_pull(
|
|
233
|
+
detail_error: unknown,
|
|
234
|
+
branch_name: string,
|
|
235
|
+
pr_number: number,
|
|
236
|
+
): Promise<RestPull | undefined> {
|
|
237
|
+
if (!git_gh_pr_too_large.is_too_many_files(detail_error)) return undefined
|
|
238
|
+
const pull = await fetch_branch_pull(branch_name)
|
|
239
|
+
|
|
240
|
+
return pull?.number === pr_number ? pull : undefined
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
async function read_pull_or_listed(
|
|
244
|
+
branch_name: string,
|
|
245
|
+
pr_number: number,
|
|
246
|
+
read: (pr_number: number) => Promise<RestPull>,
|
|
247
|
+
): Promise<RestPull> {
|
|
248
|
+
try {
|
|
249
|
+
return await read(pr_number)
|
|
250
|
+
} catch (error) {
|
|
251
|
+
const listed = await read_listed_pull(error, branch_name, pr_number)
|
|
252
|
+
if (listed === undefined) throw error
|
|
253
|
+
|
|
254
|
+
return listed
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
|
|
216
258
|
// One pull request named by its branch: the resolution, then the detail read that carries
|
|
217
259
|
// `mergeable` and `mergeable_state`, which the lookup listing does not.
|
|
218
260
|
async function read_pull_of_branch(
|
|
@@ -223,7 +265,10 @@ async function read_pull_of_branch(
|
|
|
223
265
|
if (number_read.kind !== 'read') return number_read
|
|
224
266
|
|
|
225
267
|
try {
|
|
226
|
-
return {
|
|
268
|
+
return {
|
|
269
|
+
kind: 'read',
|
|
270
|
+
pull: await read_pull_or_listed(branch_name, number_read.pr_number, read),
|
|
271
|
+
}
|
|
227
272
|
} catch (error) {
|
|
228
273
|
return { kind: 'unreadable', cause: error }
|
|
229
274
|
}
|
|
@@ -301,25 +346,39 @@ async function pr_view(branch_name: string): Promise<string> {
|
|
|
301
346
|
return JSON.stringify(git_gh_pr_rest.to_pr_info(read.pull))
|
|
302
347
|
}
|
|
303
348
|
|
|
349
|
+
// gh's own reason for a lookup that never answered, or that the branch has no pull request at all.
|
|
350
|
+
function unresolved_reason(read: Exclude<PullNumberRead, { kind: 'read' }>): string {
|
|
351
|
+
return read.kind === 'unreadable' ? error_text.message_of(read.cause) : NO_PULL_REQUEST_MESSAGE
|
|
352
|
+
}
|
|
353
|
+
|
|
304
354
|
// `undefined` when the listing could not be read — a failed request, or a PR whose number could not
|
|
305
355
|
// be resolved. Not `'[]'`.
|
|
306
356
|
//
|
|
307
357
|
// The two are the same string to a caller, and the callers are the merge gate: a rate limit would
|
|
308
358
|
// arrive as "no reviewer left a finding" and the PR merge with the gate never actually read.
|
|
309
359
|
// The direction is what makes it worse than the epic auto-close's version of
|
|
310
|
-
// the same misread — that one only failed to close something.
|
|
360
|
+
// the same misread — that one only failed to close something. Either failure warns its reason
|
|
361
|
+
// (`git-gh-comments-unreadable.ts`).
|
|
311
362
|
async function read_comments(
|
|
312
363
|
branch_name: string,
|
|
313
364
|
to_path: (pr_number: string) => string,
|
|
314
365
|
to_json: (raw: string) => string,
|
|
315
366
|
): Promise<string | undefined> {
|
|
316
|
-
const
|
|
317
|
-
|
|
318
|
-
|
|
367
|
+
const read = await read_pr_number(branch_name)
|
|
368
|
+
|
|
369
|
+
if (read.kind !== 'read') {
|
|
370
|
+
note_unreadable_comments(branch_name, unresolved_reason(read))
|
|
371
|
+
|
|
372
|
+
return undefined
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
const path = `${to_path(String(read.pr_number))}${COMMENTS_QUERY}`
|
|
319
376
|
|
|
320
377
|
try {
|
|
321
378
|
return to_json(await git_gh_exec.exec_gh_api({ path, should_paginate: true }))
|
|
322
|
-
} catch {
|
|
379
|
+
} catch (error) {
|
|
380
|
+
note_unreadable_comments(branch_name, error_text.message_of(error))
|
|
381
|
+
|
|
323
382
|
return undefined
|
|
324
383
|
}
|
|
325
384
|
}
|
|
@@ -362,7 +421,9 @@ export type { PullMergeState }
|
|
|
362
421
|
export {
|
|
363
422
|
git_gh_pr_read,
|
|
364
423
|
forget_pr_numbers,
|
|
424
|
+
read_listed_pull,
|
|
365
425
|
read_pull,
|
|
426
|
+
read_pull_or_listed,
|
|
366
427
|
require_pr_number,
|
|
367
428
|
resolve_pr_number,
|
|
368
429
|
NO_PULL_REQUEST_MESSAGE,
|