@joshuafolkken/kit 1.1229.0 → 1.1370.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 -0
- package/.claude/settings.json +4 -0
- package/.claude/skills/dependency-update/SKILL.md +5 -3
- package/.claude/skills/epic-commands/SKILL.md +82 -113
- package/.claude/skills/epic-commands/epic-bundle.md +38 -63
- package/.claude/skills/epic-commands/execution-waves.md +30 -51
- package/.claude/skills/verify-ui/SKILL.md +13 -20
- package/.claude/skills/workflow-commands/SKILL.md +10 -10
- package/.claude/skills/workflow-commands/background-commands.md +4 -4
- package/.claude/skills/workflow-commands/backlogrun-child.md +30 -105
- package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +29 -0
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +45 -131
- package/.claude/skills/workflow-commands/backlogrun-park.md +36 -53
- package/.claude/skills/workflow-commands/backlogrun-progress.md +81 -331
- package/.claude/skills/workflow-commands/backlogrun-recovery.md +29 -83
- package/.claude/skills/workflow-commands/backlogrun-steps.md +105 -424
- package/.claude/skills/workflow-commands/backlogrun.md +50 -61
- package/.claude/skills/workflow-commands/chain-rule.md +36 -40
- package/.claude/skills/workflow-commands/entry-sequence.md +6 -6
- package/.claude/skills/workflow-commands/followup.md +24 -20
- package/.claude/skills/workflow-commands/fullrun-steps.md +23 -27
- package/.claude/skills/workflow-commands/fullrun.md +10 -10
- package/.claude/skills/workflow-commands/halfrun.md +9 -8
- package/.claude/skills/workflow-commands/into-target.md +12 -18
- package/.claude/skills/workflow-commands/issue-comments.md +11 -26
- package/.claude/skills/workflow-commands/kickoff.md +27 -16
- package/.claude/skills/workflow-commands/latest-gate.md +18 -29
- package/.claude/skills/workflow-commands/needs-human-review.md +13 -24
- package/.claude/skills/workflow-commands/observation-filing.md +37 -28
- package/.claude/skills/workflow-commands/observation-ledger.md +48 -38
- package/.claude/skills/workflow-commands/pre-gate-cut.md +9 -9
- package/.claude/skills/workflow-commands/prerequisite.md +23 -15
- package/.claude/skills/workflow-commands/progress-watcher.md +17 -11
- package/.claude/skills/workflow-commands/prrun.md +3 -3
- package/.claude/skills/workflow-commands/retrospective.md +13 -18
- package/.claude/skills/workflow-commands/split-assessment.md +6 -4
- package/.claude/skills/workflow-commands/target-repository.md +25 -28
- package/.claude/skills/workflow-commands/working-tree-hold.md +11 -17
- package/.gitattributes +2 -1
- package/.github/workflows/ci.yml +14 -0
- package/.github/workflows/publish.yml +2 -0
- package/.vscode/tasks.json +14 -0
- package/CLAUDE.md +10 -61
- package/README.md +38 -57
- package/SECURITY.md +1 -1
- package/dist/CLAUDE.md +10 -61
- package/dist/commands/document-section-cli.js +42 -10
- package/dist/config-merge/index.js +11 -2
- package/dist/hooks/audit-provision.js +2 -2
- package/dist/hooks/batch-guard.js +7 -7
- package/dist/hooks/{chunk-FIVDHQGT.js → chunk-43G45XJF.js} +18 -20
- package/dist/hooks/{chunk-JUDKDCDP.js → chunk-4TW4MQUL.js} +284 -362
- package/dist/hooks/{chunk-5VMKCCC4.js → chunk-76RK6E3H.js} +13 -11
- package/dist/hooks/{chunk-RNWHN5BP.js → chunk-DZWZ3DKY.js} +4 -4
- package/dist/hooks/{chunk-5VNDSNG3.js → chunk-FZ6FUSBM.js} +1 -1
- package/dist/hooks/{chunk-VC3PZPZO.js → chunk-GG72ANKI.js} +1 -1
- package/dist/hooks/{chunk-6HJJXRBX.js → chunk-KPM4YIIX.js} +8 -44
- package/dist/hooks/chunk-MXVQMLDP.js +3705 -0
- package/dist/hooks/{chunk-ELCN5LCH.js → chunk-NEC4AT4Z.js} +34 -12
- package/dist/hooks/{chunk-TQNPDZNH.js → chunk-NZBHG6FW.js} +7 -5
- package/dist/hooks/chunk-NZN2UFI6.js +2409 -0
- package/dist/hooks/{chunk-F56MFS4B.js → chunk-R6CRQEAL.js} +4 -4
- package/dist/hooks/chunk-SYSRHRWU.js +1589 -0
- package/dist/hooks/{chunk-55HHG5PX.js → chunk-TLJYAGZK.js} +799 -903
- package/dist/hooks/chunk-Z5TMJIPW.js +45 -0
- package/dist/hooks/codex-hook-adapter.js +26 -21
- package/dist/hooks/duplicate-read-guard.js +8 -8
- package/dist/hooks/format-edited.js +4 -4
- package/dist/hooks/inputs.json +213 -197
- package/dist/hooks/investigation-guard.js +8 -8
- package/dist/hooks/pretool-guard.js +15 -15
- package/dist/hooks/session-lang.js +406 -8
- package/dist/hooks/stop-guard.js +122 -201
- package/dist/josh.js +540 -137
- package/dist/version/index.js +15 -13
- package/eslint/base.js +43 -5
- package/eslint/rules/english-only-prose.js +3 -3
- package/eslint/rules/import.js +12 -0
- package/eslint/rules/namespace-object-export.js +2 -2
- package/package.json +16 -10
- package/pnpm-workspace.yaml +2 -4
- package/prompts/coding-standards.md +14 -48
- package/prompts/collaboration-workflow/file-edits.md +1 -1
- package/prompts/collaboration-workflow/issue-citation.md +1 -1
- package/prompts/collaboration-workflow/issue-template.md +4 -10
- package/prompts/collaboration-workflow/operating-rules.md +7 -8
- package/prompts/collaboration-workflow/output-bounds.md +1 -1
- package/prompts/collaboration-workflow/overview.md +1 -1
- package/prompts/collaboration-workflow/plan-comment.md +2 -1
- package/prompts/collaboration-workflow/principles.md +21 -3
- package/prompts/collaboration-workflow/report-format.md +16 -29
- package/prompts/collaboration-workflow/residency.md +1 -1
- package/prompts/collaboration-workflow/rule-delivery.md +7 -95
- package/prompts/collaboration-workflow/shell-body.md +3 -23
- package/prompts/collaboration-workflow/turn-batching.md +4 -13
- package/prompts/collaboration-workflow/wip-cap.md +5 -11
- package/prompts/refactoring.md +1 -1
- package/prompts/review-rubric.md +3 -22
- package/prompts/review.md +15 -38
- package/prompts/testing-guide.md +2 -4
- package/scripts/adopt/adopt-logic.ts +5 -5
- package/scripts/adopt/adopt-toolkits.ts +4 -5
- package/scripts/adopt/adopt.ts +2 -3
- package/scripts/agent/agent-argv.ts +7 -7
- package/scripts/agent/agent-diagnostics.ts +2 -2
- package/scripts/agent/agent-exit-record.ts +1 -1
- package/scripts/agent/agent-headless.ts +1 -1
- package/scripts/agent/agent-launch-environment.ts +6 -1
- package/scripts/agent/agent-role-profile.ts +49 -22
- package/scripts/agent/agent-session-role.ts +32 -0
- package/scripts/agent/api-outage.ts +1 -1
- package/scripts/agent/claude-agent-argv.ts +4 -4
- package/scripts/agent/claude-result-event.ts +4 -4
- package/scripts/agent/codex-hooks.ts +2 -2
- package/scripts/agent/interactive-ask.ts +3 -6
- package/scripts/auto-ok/auto-ok-cli.ts +46 -60
- package/scripts/backlog/backlog-arrival-added.ts +34 -0
- package/scripts/backlog/backlog-arrival.ts +54 -17
- package/scripts/backlog/backlog-budget-cli.ts +34 -6
- package/scripts/backlog/backlog-budget.ts +17 -24
- package/scripts/backlog/backlog-defect-priority.ts +1 -1
- package/scripts/backlog/backlog-drive-args.ts +5 -4
- package/scripts/backlog/backlog-drive-cli.ts +14 -10
- package/scripts/backlog/backlog-drive-epic.ts +85 -0
- package/scripts/backlog/backlog-drive-launch.ts +1 -1
- package/scripts/backlog/backlog-drive-named-offer.ts +60 -9
- package/scripts/backlog/backlog-drive-named.ts +39 -9
- package/scripts/backlog/backlog-drive-offer-argv.ts +1 -1
- package/scripts/backlog/backlog-drive-restore.ts +1 -1
- package/scripts/backlog/backlog-drive-retrospective.ts +2 -2
- package/scripts/backlog/backlog-drive.ts +43 -28
- package/scripts/backlog/backlog-idle.ts +88 -0
- package/scripts/backlog/backlog-named.ts +11 -15
- package/scripts/backlog/backlog-next.ts +26 -30
- package/scripts/backlog/backlog-offer-cli.ts +28 -23
- package/scripts/backlog/backlog-offer.ts +7 -7
- package/scripts/backlog/backlog-overlap.ts +178 -0
- package/scripts/backlog/backlog-plan-cli.ts +14 -90
- package/scripts/backlog/backlog-plan-read.ts +111 -0
- package/scripts/backlog/backlog-plan.ts +11 -10
- package/scripts/backlog/backlog-pool.ts +13 -14
- package/scripts/backlog/backlog-rank.ts +11 -11
- package/scripts/backlog/backlog-ready.ts +15 -10
- package/scripts/backlog/backlog-scope.ts +14 -15
- package/scripts/backlog/backlog-stalled-cli.ts +2 -2
- package/scripts/backlog/backlog-stalled-detect.ts +4 -4
- package/scripts/backlog/backlog-stalled.ts +5 -6
- package/scripts/backlog/backlog-waves.ts +4 -4
- package/scripts/backlog/backlogrun-args.ts +74 -0
- package/scripts/backlog/backlogrun-cli.ts +113 -0
- package/scripts/backlog/backlogrun-launch.ts +178 -0
- package/scripts/behavior/behavior-assertion.ts +6 -8
- package/scripts/behavior/behavior-cli.ts +1 -1
- package/scripts/behavior/behavior-rules.ts +3 -3
- package/scripts/build/build-claude-md.ts +4 -4
- package/scripts/build/build-codex-hooks.ts +2 -2
- package/scripts/build/build-commands.ts +1 -1
- package/scripts/build/build-hooks.ts +5 -5
- package/scripts/build/build.ts +1 -1
- package/scripts/build/hook-bundle-stamp.ts +109 -7
- package/scripts/build/local-bin.ts +2 -2
- package/scripts/cases/cases-cli.ts +1 -1
- package/scripts/cases/cases-logic.ts +2 -2
- package/scripts/ci/composite-actions.ts +1 -2
- package/scripts/ci/pr-classification.ts +2 -2
- package/scripts/claude/workflow-destination.ts +1 -1
- package/scripts/clone/clone-aggregate.ts +1 -1
- package/scripts/clone/clone-fingerprint.ts +1 -1
- package/scripts/clone/clone-scan-cli.ts +1 -1
- package/scripts/clone/clone-scan.ts +1 -1
- package/scripts/config-merge/index.ts +1 -1
- package/scripts/config-merge/json-format.ts +1 -3
- package/scripts/config-merge/patch-json-array.ts +90 -0
- package/scripts/config-merge/patch-json-key.ts +6 -3
- package/scripts/config-merge/patch-json-list.ts +1 -1
- package/scripts/cost-runtime/codex-usage.ts +1 -1
- package/scripts/cost-runtime/context-cut-payback.ts +4 -5
- package/scripts/cost-runtime/context-cut-threshold.ts +4 -6
- package/scripts/cost-runtime/cost-attribute.ts +3 -3
- package/scripts/cost-runtime/cost-blocks.ts +3 -4
- package/scripts/cost-runtime/cost-cli.ts +14 -11
- package/scripts/cost-runtime/cost-corpus.ts +11 -11
- package/scripts/cost-runtime/cost-pricing.ts +4 -4
- package/scripts/cost-runtime/cost-tokens.ts +1 -2
- package/scripts/cost-runtime/cost-transcript.ts +29 -29
- package/scripts/cost-runtime/cost-usage.ts +6 -7
- package/scripts/cost-runtime/cost-verdict.ts +10 -11
- package/scripts/cost-runtime/own-session.ts +1 -1
- package/scripts/cost-runtime/transcript-cwd.ts +2 -2
- package/scripts/delegation/delegation-cli.ts +4 -4
- package/scripts/delegation/delegation-policy.ts +13 -15
- package/scripts/delegation/duplicate-read-guard.ts +9 -10
- package/scripts/delegation/fanout-cli.ts +1 -1
- package/scripts/delegation/fanout.ts +1 -1
- package/scripts/delegation/investigation-guard.ts +18 -22
- package/scripts/delegation/investigation-reads.ts +48 -238
- package/scripts/discovery/repo-discovery.ts +1 -1
- package/scripts/discovery/repo-map-logic.ts +1 -2
- package/scripts/discovery/repo-origin.ts +3 -3
- package/scripts/discovery/repo-party-cli.ts +2 -2
- package/scripts/discovery/repo-party.ts +2 -2
- package/scripts/doctor/doctor-consumer.ts +1 -1
- package/scripts/doctor/doctor-io.ts +6 -7
- package/scripts/doctor/doctor-logic.ts +1 -1
- package/scripts/doctor/doctor-ports.ts +1 -1
- package/scripts/doctor/doctor.ts +8 -9
- package/scripts/document/backlogrun-parent-read-set.ts +5 -6
- package/scripts/document/bash-output-cap.ts +5 -7
- package/scripts/document/capped-print-part.ts +1 -1
- package/scripts/document/capped-print.ts +1 -1
- package/scripts/document/document-byte-budget.ts +33 -64
- package/scripts/document/document-byte-check.ts +4 -4
- package/scripts/document/document-reachability.ts +7 -8
- package/scripts/document/document-read-cli.ts +2 -2
- package/scripts/document/document-scan.ts +26 -2
- package/scripts/document/document-section-cli.ts +6 -8
- package/scripts/document/document-section.ts +8 -12
- package/scripts/document/edit-files-cli.ts +3 -4
- package/scripts/document/entry-read-budget.ts +8 -70
- package/scripts/document/entry-read-set.ts +51 -34
- package/scripts/document/lane-child-read-set.ts +9 -9
- package/scripts/document/read-files-cli.ts +1 -2
- package/scripts/document/read-set-cli.ts +16 -19
- package/scripts/document/read-set-cost.ts +4 -4
- package/scripts/document/read-set-point-of-use.ts +28 -38
- package/scripts/document/read-set-pricing.ts +1 -1
- package/scripts/document/read-set-trim.ts +3 -3
- package/scripts/document/resident-budget.ts +8 -10
- package/scripts/epic/epic-add-body.ts +15 -18
- package/scripts/epic/epic-add-plan.ts +26 -28
- package/scripts/epic/epic-add.ts +32 -25
- package/scripts/epic/epic-audit-checks.ts +27 -37
- package/scripts/epic/epic-audit-cli.ts +21 -22
- package/scripts/epic/epic-audit-orphans.ts +16 -17
- package/scripts/epic/epic-audit-rationale.ts +10 -15
- package/scripts/epic/epic-audit-report.ts +2 -5
- package/scripts/epic/epic-audit.ts +18 -14
- package/scripts/epic/epic-body.ts +10 -10
- package/scripts/epic/epic-bundle-cli.ts +36 -34
- package/scripts/epic/epic-bundle-evidence.ts +5 -5
- package/scripts/epic/epic-bundle-gaps.ts +6 -9
- package/scripts/epic/epic-bundle-poll.ts +1 -1
- package/scripts/epic/epic-bundle-referenced.ts +11 -14
- package/scripts/epic/epic-bundle.ts +19 -20
- package/scripts/epic/epic-busy.ts +44 -21
- package/scripts/epic/epic-candidate-confirm.ts +15 -18
- package/scripts/epic/epic-chains.ts +18 -23
- package/scripts/epic/epic-classify.ts +11 -12
- package/scripts/epic/epic-cli-argv.ts +5 -6
- package/scripts/epic/epic-cli-remove.ts +9 -4
- package/scripts/epic/epic-cli.ts +38 -26
- package/scripts/epic/epic-close-comment.ts +14 -15
- package/scripts/epic/epic-close.ts +25 -29
- package/scripts/epic/epic-cross-repo.ts +18 -21
- package/scripts/epic/epic-decision.ts +14 -18
- package/scripts/epic/epic-fetch.ts +25 -31
- package/scripts/epic/epic-graph.ts +15 -17
- package/scripts/epic/epic-index.ts +14 -16
- package/scripts/epic/epic-issue.ts +9 -11
- package/scripts/epic/epic-label-age.ts +74 -0
- package/scripts/epic/epic-lane-offer.ts +35 -24
- package/scripts/epic/epic-nested.ts +1 -1
- package/scripts/epic/epic-next-read.ts +8 -8
- package/scripts/epic/epic-next-views.ts +12 -12
- package/scripts/epic/epic-next.ts +29 -33
- package/scripts/epic/epic-outside-blocker.ts +11 -10
- package/scripts/epic/epic-parse.ts +22 -24
- package/scripts/epic/epic-promote.ts +3 -2
- package/scripts/epic/epic-rank.ts +1 -1
- package/scripts/epic/epic-read.ts +10 -8
- package/scripts/epic/epic-reconcile.ts +8 -6
- package/scripts/epic/epic-reference.ts +5 -4
- package/scripts/epic/epic-relation-recheck.ts +10 -11
- package/scripts/epic/epic-relations.ts +9 -8
- package/scripts/epic/epic-remove-plan.ts +4 -5
- package/scripts/epic/epic-remove.ts +7 -5
- package/scripts/epic/epic-report.ts +18 -20
- package/scripts/epic/epic-run.ts +6 -5
- package/scripts/epic/epic-sections.ts +2 -2
- package/scripts/epic/epic-shape.ts +3 -3
- package/scripts/epic/epic-solo-stale.ts +3 -2
- package/scripts/epic/epic-solo.ts +8 -8
- package/scripts/epic/epic-triage.ts +5 -4
- package/scripts/epic/epic-validate.ts +8 -7
- package/scripts/epic/epic.ts +5 -5
- package/scripts/exports/unused-members-cli.ts +1 -1
- package/scripts/followup/followup-issue-number.ts +1 -2
- package/scripts/followup/git-followup-cleanup.ts +6 -7
- package/scripts/followup/git-followup-finish.ts +11 -13
- package/scripts/followup/git-followup-flush.ts +11 -7
- package/scripts/followup/git-followup-issue-close.ts +16 -13
- package/scripts/followup/git-followup-label.ts +9 -6
- package/scripts/followup/git-followup-merged.ts +1 -1
- package/scripts/followup/git-followup-pending.ts +7 -9
- package/scripts/followup/git-followup-stages.ts +28 -17
- package/scripts/followup/git-followup-workflow.ts +19 -21
- package/scripts/followup/git-pr-followup-checks.ts +13 -20
- package/scripts/followup/git-pr-followup-wrapup.ts +7 -7
- package/scripts/followup/git-pr-followup.ts +18 -17
- package/scripts/gate/core-admission.ts +162 -0
- package/scripts/gate/core-budget.ts +134 -91
- package/scripts/gate/gate-ledger.ts +114 -0
- package/scripts/gate/gate-log.ts +7 -9
- package/scripts/gate/gate-plan.ts +103 -35
- package/scripts/gate/gate-report.ts +39 -21
- package/scripts/gate/gate-skip.ts +11 -13
- package/scripts/gate/gate-steps.ts +5 -1
- package/scripts/gate/gate-tree.ts +3 -4
- package/scripts/gate/hook-gate-reuse.ts +9 -9
- package/scripts/gate/machine-capacity.ts +313 -0
- package/scripts/gate/pre-commit-type-check.ts +4 -4
- package/scripts/gate/project-checks.ts +12 -4
- package/scripts/gate/scoped-green.ts +11 -18
- package/scripts/gate/type-check-command.ts +2 -2
- package/scripts/gate/type-check-step.ts +4 -4
- package/scripts/gate/verification-gate.ts +60 -53
- package/scripts/gh/gh-spawn.ts +2 -2
- package/scripts/gh/git-ai-review-scan.ts +3 -2
- package/scripts/gh/git-gh-api-path.ts +10 -11
- package/scripts/gh/git-gh-exec.ts +43 -48
- package/scripts/gh/git-gh-failure.ts +6 -9
- package/scripts/gh/git-gh-helpers.ts +1 -1
- package/scripts/gh/git-gh-issue-list.ts +15 -19
- package/scripts/gh/git-gh-issue-read.ts +43 -60
- package/scripts/gh/git-gh-issue-rest.ts +14 -15
- package/scripts/gh/git-gh-issue-write.ts +52 -40
- package/scripts/gh/git-gh-issue.ts +23 -24
- package/scripts/gh/git-gh-pr-auto-merge.ts +3 -3
- package/scripts/gh/git-gh-pr-read.ts +46 -50
- package/scripts/gh/git-gh-pr-rest.ts +23 -26
- package/scripts/gh/git-gh-pr-review.ts +2 -2
- package/scripts/gh/git-gh-pr-rollup.ts +4 -4
- package/scripts/gh/git-gh-pr-snapshot.ts +8 -10
- package/scripts/gh/git-gh-pr.ts +16 -16
- package/scripts/gh/git-gh-reachability.ts +11 -12
- package/scripts/gh/git-gh-repo.ts +2 -3
- package/scripts/gh/git-gh-rest-state.ts +1 -1
- package/scripts/gh/git-pr-ai-review.ts +6 -5
- package/scripts/gh/git-pr-checks-eval.ts +28 -30
- package/scripts/gh/git-pr-checks-parse.ts +14 -16
- package/scripts/gh/git-pr-checks-watch.ts +17 -17
- package/scripts/gh/git-pr-checks.ts +20 -23
- package/scripts/gh/git-pr-coderabbit.ts +8 -6
- package/scripts/gh/git-pr-confirmation.ts +5 -5
- package/scripts/gh/git-pr-managed-config.ts +7 -9
- package/scripts/gh/git-pr-messages.ts +1 -1
- package/scripts/gh/git-pr.ts +15 -16
- package/scripts/gh/github-issue-url.ts +8 -9
- package/scripts/git/base-tree.ts +66 -0
- package/scripts/git/change-base.ts +42 -2
- package/scripts/git/changed-file-scope.ts +5 -5
- package/scripts/git/changed-paths.ts +1 -2
- package/scripts/git/constants.ts +2 -2
- package/scripts/git/git-branch.ts +1 -1
- package/scripts/git/git-closes-keyword.ts +3 -3
- package/scripts/git/git-command.ts +53 -41
- package/scripts/git/git-common-directory.ts +3 -3
- package/scripts/git/git-diff-reads.ts +14 -15
- package/scripts/git/git-error.ts +1 -1
- package/scripts/git/git-execa-error.ts +1 -2
- package/scripts/git/git-issue.ts +10 -8
- package/scripts/git/git-location-environment.ts +3 -4
- package/scripts/git/git-ls-remote.ts +6 -8
- package/scripts/git/git-pre-push-hook.ts +11 -10
- package/scripts/git/git-preflight.ts +5 -5
- package/scripts/git/git-push-transport.ts +2 -2
- package/scripts/git/git-remote-branch.ts +1 -2
- package/scripts/git/git-schemas.ts +16 -23
- package/scripts/git/git-spawn-sync.ts +1 -1
- package/scripts/git/git-spawn.ts +37 -14
- package/scripts/git/git-ssh-keepalive.ts +12 -5
- package/scripts/git/git-staging.ts +7 -8
- package/scripts/git/git-workflow.ts +1 -1
- package/scripts/git/git-worktree.ts +35 -27
- package/scripts/git/gone-branch.ts +2 -2
- package/scripts/git/listing-cutoff.ts +1 -2
- package/scripts/git/lockfile-sync.ts +65 -0
- package/scripts/git/main-merge-guard.ts +1 -2
- package/scripts/git/main-merge.ts +7 -7
- package/scripts/git/main-sync.ts +23 -8
- package/scripts/git/parse-json-array.ts +18 -23
- package/scripts/git/repository-lock.ts +34 -2
- package/scripts/git/stash/git-stash.ts +4 -5
- package/scripts/git/stash/stash-orphans.ts +5 -3
- package/scripts/git/stash/stash-pop-args.ts +1 -1
- package/scripts/git/stash/stash-pop-cli.ts +3 -3
- package/scripts/git/stash/stash-sweep-lock.ts +2 -2
- package/scripts/hooks/batch-guard.ts +11 -13
- package/scripts/hooks/check-commit-message.ts +12 -9
- package/scripts/hooks/codex-hook-adapter.ts +16 -10
- package/scripts/hooks/edited-cspell.ts +3 -4
- package/scripts/hooks/format-edited-cli.ts +1 -1
- package/scripts/hooks/format-edited-file.ts +11 -17
- package/scripts/hooks/format-rewrite-notice.ts +19 -17
- package/scripts/hooks/pre-push-unit.ts +10 -14
- package/scripts/hooks/pretool-guard-cli.ts +4 -4
- package/scripts/hooks/pretool-guard.ts +93 -18
- package/scripts/hooks/reserved-run.ts +2 -2
- package/scripts/hooks/step-zero-notice.ts +1 -1
- package/scripts/hooks/stop-guard.ts +21 -10
- package/scripts/init/basic-path-migration.ts +2 -2
- package/scripts/init/claude-kit-only-settings.ts +2 -2
- package/scripts/init/claude-plugin-config.ts +2 -2
- package/scripts/init/distributed-paths.ts +4 -4
- package/scripts/init/hook-command-rewrite.ts +3 -3
- package/scripts/init/hook-launch.ts +5 -5
- package/scripts/init/init-actions.ts +13 -0
- package/scripts/init/init-ai-copy.ts +11 -11
- package/scripts/init/init-bootstrap.ts +3 -3
- package/scripts/init/init-copy-content.ts +4 -4
- package/scripts/init/init-logic-json-merge.ts +7 -9
- package/scripts/init/init-logic-migrate.ts +1 -1
- package/scripts/init/init-logic-templates.ts +1 -1
- package/scripts/init/init-logic-workspace.ts +4 -4
- package/scripts/init/init-logic-yaml-merge.ts +2 -2
- package/scripts/init/init-logic.ts +19 -22
- package/scripts/init/init.ts +12 -8
- package/scripts/init/kit-base-preset.ts +1 -1
- package/scripts/init/kit-setup-state.ts +1 -1
- package/scripts/init/kit-written-paths.ts +1 -2
- package/scripts/init/package-manager-pin.ts +35 -0
- package/scripts/init/project-profile-cli.ts +1 -1
- package/scripts/init/project-profile.ts +3 -3
- package/scripts/init/session-language-environment.ts +1 -1
- package/scripts/init/start-exec.ts +3 -4
- package/scripts/init/start-plan.ts +2 -2
- package/scripts/init/start-setup-pr.ts +3 -2
- package/scripts/init/start-steps.ts +2 -2
- package/scripts/init/tsconfig-preset-migration.ts +1 -1
- package/scripts/init/vscode-tasks.ts +62 -0
- package/scripts/issue/baseline-measure.ts +2 -2
- package/scripts/issue/behavior-change-lint.ts +2 -2
- package/scripts/issue/defect-rate-cli.ts +6 -7
- package/scripts/issue/defect-rate.ts +37 -27
- package/scripts/issue/git-next-issues.ts +9 -8
- package/scripts/issue/issue-auto-ok.ts +49 -11
- package/scripts/issue/issue-backlinks-cli.ts +5 -5
- package/scripts/issue/issue-backlinks.ts +6 -6
- package/scripts/issue/issue-cite-cli.ts +20 -18
- package/scripts/issue/issue-cite.ts +18 -8
- package/scripts/issue/issue-closing-pr.ts +4 -4
- package/scripts/issue/issue-comment-cli.ts +6 -4
- package/scripts/issue/issue-file-cli.ts +75 -15
- package/scripts/issue/issue-file-fold.ts +155 -0
- package/scripts/issue/issue-file.ts +14 -6
- package/scripts/issue/issue-fold-cli.ts +14 -9
- package/scripts/issue/issue-fold.ts +23 -8
- package/scripts/issue/issue-labels.ts +46 -37
- package/scripts/issue/issue-lint-cli.ts +2 -2
- package/scripts/issue/issue-lint.ts +1 -1
- package/scripts/issue/issue-merged.ts +10 -4
- package/scripts/issue/issue-number-shape.ts +27 -0
- package/scripts/issue/issue-rank.ts +1 -1
- package/scripts/issue/issue-read-cli.ts +4 -5
- package/scripts/issue/issue-read.ts +4 -5
- package/scripts/issue/issue-reference.ts +5 -5
- package/scripts/issue/issue-release-cli.ts +165 -0
- package/scripts/issue/issue-release.ts +58 -0
- package/scripts/issue/issue-report-failures.ts +7 -4
- package/scripts/issue/issue-scout-cli.ts +11 -11
- package/scripts/issue/issue-scout-closed.ts +4 -4
- package/scripts/issue/issue-scout.ts +4 -5
- package/scripts/issue/issue-state-cli.ts +17 -10
- package/scripts/issue/issue-state.ts +12 -13
- package/scripts/issue/issue-wip.ts +7 -7
- package/scripts/issue/markdown-section.ts +3 -3
- package/scripts/issue/measure-rerun-cli.ts +10 -9
- package/scripts/issue/reproduction-measure.ts +3 -3
- package/scripts/issue/session-cite.ts +56 -0
- package/scripts/josh/agent-session-environment.ts +10 -8
- package/scripts/josh/cli-body.ts +2 -2
- package/scripts/josh/command-suggest.ts +1 -1
- package/scripts/josh/file-map-stamp.ts +20 -23
- package/scripts/josh/hook-decision.ts +24 -28
- package/scripts/josh/josh-command-map.ts +4 -1
- package/scripts/josh/josh-command-types.ts +32 -34
- package/scripts/josh/josh-commands-ai.ts +6 -6
- package/scripts/josh/josh-commands-backlog.ts +15 -3
- package/scripts/josh/josh-commands-clone.ts +1 -1
- package/scripts/josh/josh-commands-development.ts +33 -4
- package/scripts/josh/josh-commands-document.ts +3 -3
- package/scripts/josh/josh-commands-guard.ts +3 -3
- package/scripts/josh/josh-commands-issue.ts +11 -5
- package/scripts/josh/josh-commands-lane.ts +16 -5
- package/scripts/josh/josh-commands-lint.ts +1 -1
- package/scripts/josh/josh-commands-maintenance.ts +2 -2
- package/scripts/josh/josh-commands-run.ts +20 -6
- package/scripts/josh/josh-commands-split.ts +1 -2
- package/scripts/josh/josh-commands-versioning.ts +5 -5
- package/scripts/josh/josh-commands-workflow.ts +30 -22
- package/scripts/josh/josh-environment-file.ts +1 -1
- package/scripts/josh/josh-in-process.ts +3 -3
- package/scripts/josh/josh-logic.ts +10 -10
- package/scripts/josh/josh-run.ts +3 -3
- package/scripts/josh/josh-verdict.ts +9 -12
- package/scripts/josh/josh.ts +3 -3
- package/scripts/josh/kit-only.ts +2 -2
- package/scripts/josh/path-decision.ts +3 -3
- package/scripts/josh/platform-temporary.ts +7 -5
- package/scripts/josh/process-identity.ts +24 -6
- package/scripts/josh/process-owner.ts +4 -4
- package/scripts/josh/session-language-cli.ts +53 -11
- package/scripts/josh/session-language.ts +1 -1
- package/scripts/josh/stamp-file.ts +48 -29
- package/scripts/josh/stamp-record.ts +57 -0
- package/scripts/lane/lane-await.ts +35 -11
- package/scripts/lane/lane-cache.ts +6 -6
- package/scripts/lane/lane-capacity.ts +32 -17
- package/scripts/lane/lane-child-invocation.ts +17 -15
- package/scripts/lane/lane-child-marker.ts +12 -12
- package/scripts/lane/lane-cli.ts +20 -13
- package/scripts/lane/lane-close.ts +6 -6
- package/scripts/lane/lane-dispatch.ts +61 -72
- package/scripts/lane/lane-environment.ts +5 -5
- package/scripts/lane/lane-guard-policy.ts +7 -21
- package/scripts/lane/lane-handoff.ts +2 -2
- package/scripts/lane/lane-install.ts +9 -10
- package/scripts/lane/lane-launch-cli.ts +13 -8
- package/scripts/lane/lane-ledger.ts +73 -11
- package/scripts/lane/lane-leftover.ts +44 -30
- package/scripts/lane/lane-limit-cli.ts +160 -0
- package/scripts/lane/lane-limit-override.ts +74 -0
- package/scripts/lane/lane-load.ts +19 -68
- package/scripts/lane/lane-measure-cli.ts +15 -25
- package/scripts/lane/lane-occupancy.ts +6 -4
- package/scripts/lane/lane-open.ts +25 -24
- package/scripts/lane/lane-output.ts +4 -3
- package/scripts/lane/lane-paths.ts +22 -8
- package/scripts/lane/lane-phase.ts +33 -0
- package/scripts/lane/lane-reap.ts +2 -2
- package/scripts/lane/lane-registry.ts +27 -15
- package/scripts/lane/lane-relaunch.ts +9 -9
- package/scripts/lane/lane-report.ts +5 -4
- package/scripts/lane/lane-resume.ts +2 -2
- package/scripts/lane/lane-sampler.ts +55 -0
- package/scripts/lane/lane-seed.ts +7 -7
- package/scripts/lane/lane-stage-stats.ts +135 -0
- package/scripts/lane/lane-start-point.ts +8 -11
- package/scripts/lane/lane-stats.ts +60 -15
- package/scripts/lane/lane-stray.ts +140 -0
- package/scripts/lane/lane-vacant.ts +1 -1
- package/scripts/lane/openai-lane-supervisor-decision.ts +3 -7
- package/scripts/lane/openai-lane-supervisor-owner.ts +3 -9
- package/scripts/lane/openai-review-broker.ts +2 -4
- package/scripts/lib/ancestor-directories.ts +1 -1
- package/scripts/lib/bounded-pool.ts +2 -2
- package/scripts/lib/buffered-process.ts +4 -6
- package/scripts/lib/caddy-logs.sh +0 -0
- package/scripts/lib/cli-flags.ts +39 -6
- package/scripts/lib/error-message.ts +1 -1
- package/scripts/lib/json-value.ts +17 -3
- package/scripts/lib/poll.ts +1 -1
- package/scripts/lib/status-icons.ts +3 -3
- package/scripts/lib/timed-fetch.ts +1 -1
- package/scripts/lib/timeouts.ts +1 -1
- package/scripts/lines/bytes-command.ts +3 -4
- package/scripts/lines/effective-limit.ts +25 -12
- package/scripts/lines/line-budget.ts +47 -55
- package/scripts/lines/line-targets.ts +6 -2
- package/scripts/lines/lines-command.ts +3 -3
- package/scripts/lint/cspell-cached.ts +1 -1
- package/scripts/lint/cycle-recheck.ts +122 -0
- package/scripts/lint/format.ts +1 -2
- package/scripts/lint/lint-parallel.ts +34 -19
- package/scripts/lint/lint-related-scope.ts +25 -15
- package/scripts/lint/lint-related.ts +6 -7
- package/scripts/managed-marker/index.ts +1 -1
- package/scripts/managed-marker/managed-marker-logic.ts +1 -2
- package/scripts/notify/git-notify.ts +9 -7
- package/scripts/notify/telegram-notify.ts +53 -37
- package/scripts/notify/telegram-test-logic.ts +3 -3
- package/scripts/notify/telegram-test.ts +45 -30
- package/scripts/observations/observation-ledger-home.ts +14 -8
- package/scripts/observations/observation-ledger-line.ts +3 -2
- package/scripts/observations/observation-ledger-migrate.ts +3 -4
- package/scripts/observations/observation-ledger-prepare.ts +4 -4
- package/scripts/observations/observation-ledger.ts +14 -15
- package/scripts/observations/observation-record-cli.ts +83 -0
- package/scripts/observations/observation-record.ts +91 -0
- package/scripts/observations/observations-flush-cli.ts +1 -1
- package/scripts/observations/observations-flush-landing.ts +7 -6
- package/scripts/observations/observations-flush.ts +26 -27
- package/scripts/overrides/overrides-check.ts +18 -8
- package/scripts/package/package-scout-cli.ts +1 -1
- package/scripts/package/package-scout-format.ts +2 -2
- package/scripts/package/package-scout.ts +1 -1
- package/scripts/propagate/propagate-git-failure.ts +1 -1
- package/scripts/propagate/propagate-git.ts +7 -7
- package/scripts/propagate/propagate-plan.ts +2 -2
- package/scripts/propagate/propagate-publish.ts +2 -3
- package/scripts/propagate/propagate-run.ts +5 -7
- package/scripts/propagate/propagate-select.ts +1 -1
- package/scripts/propagate/propagate-steps.ts +19 -20
- package/scripts/propagate/propagate-targets.ts +6 -10
- package/scripts/propagate/propagate.ts +5 -5
- package/scripts/refactor/import-graph.ts +1 -1
- package/scripts/refactor/refactor-lint.ts +4 -10
- package/scripts/refactor/refactor-scan-cli.ts +1 -1
- package/scripts/refactor/refactor-scan.ts +2 -2
- package/scripts/refactor/refactor-targets.ts +1 -1
- package/scripts/release/github-release-cli.ts +25 -3
- package/scripts/release/github-release-environment.ts +1 -0
- package/scripts/release/github-release-runs.ts +115 -0
- package/scripts/release/github-release.ts +13 -67
- package/scripts/release/release-cli.ts +21 -4
- package/scripts/release/release-history.ts +6 -10
- package/scripts/release/release-plan.ts +3 -3
- package/scripts/release/release-progress.ts +3 -4
- package/scripts/release/release-publish.ts +8 -9
- package/scripts/release/release-scope-cli.ts +8 -10
- package/scripts/release/release-tag.ts +6 -8
- package/scripts/release/release-worktree.ts +5 -5
- package/scripts/repo/auto-merge-setting-logic.ts +7 -9
- package/scripts/repo/auto-merge-setting.ts +1 -1
- package/scripts/repo/repo-setting.ts +4 -4
- package/scripts/repo/repository-labels.ts +1 -1
- package/scripts/repo/required-checks-logic.ts +3 -3
- package/scripts/repo/required-checks-report.ts +1 -1
- package/scripts/repo/ruleset-check-cli.ts +1 -1
- package/scripts/repo/ruleset-check.ts +1 -1
- package/scripts/report/report-format-reference.ts +26 -0
- package/scripts/report/report-lint-cli.ts +2 -2
- package/scripts/report/report-lint.ts +16 -2
- package/scripts/review/disposition-cli.ts +2 -2
- package/scripts/review/disposition-logic.ts +1 -1
- package/scripts/review/live-evidence.ts +9 -6
- package/scripts/review/review-attest-cli.ts +1 -2
- package/scripts/review/review-attest.ts +3 -3
- package/scripts/review/review-brief-cli.ts +19 -20
- package/scripts/review/review-brief.ts +29 -32
- package/scripts/review/review-checkout.ts +2 -2
- package/scripts/review/review-diff-parts.ts +3 -5
- package/scripts/review/review-diff-write.ts +1 -1
- package/scripts/review/review-finding-ledger.ts +7 -4
- package/scripts/review/review-findings-cli.ts +2 -2
- package/scripts/review/review-level.ts +4 -7
- package/scripts/review/review-record-cli.ts +73 -16
- package/scripts/review/review-record.ts +5 -4
- package/scripts/review/review-round2-cli.ts +2 -3
- package/scripts/review/review-round2.ts +13 -21
- package/scripts/review/review-stamps.ts +9 -71
- package/scripts/review/review-tree.ts +4 -5
- package/scripts/rules/bash-triggers.ts +4 -4
- package/scripts/rules/decision-oracle-batch.ts +5 -6
- package/scripts/rules/decision-oracle-stage.ts +1 -1
- package/scripts/rules/decision-oracle-tokens.ts +1 -2
- package/scripts/rules/decision-oracle.ts +2 -2
- package/scripts/rules/delivered-rules.ts +61 -406
- package/scripts/rules/destructive-command.ts +2 -2
- package/scripts/rules/direct-filing.ts +4 -4
- package/scripts/rules/direct-pr-create.ts +2 -2
- package/scripts/rules/early-heartbeat.ts +15 -19
- package/scripts/rules/file-body.ts +5 -6
- package/scripts/rules/filing-cap.ts +6 -7
- package/scripts/rules/filing-offer.ts +1 -1
- package/scripts/rules/firing-point.ts +6 -6
- package/scripts/rules/gh-api.ts +2 -2
- package/scripts/rules/git-argv.ts +3 -3
- package/scripts/rules/git-force.ts +2 -2
- package/scripts/rules/hook-context-line.ts +31 -0
- package/scripts/rules/implementation-cut-verdict.ts +5 -8
- package/scripts/rules/implementation-cut.ts +35 -32
- package/scripts/rules/index-guard.ts +2 -2
- package/scripts/rules/issue-citation.ts +7 -7
- package/scripts/rules/issue-comments.ts +21 -13
- package/scripts/rules/josh-git-bare.ts +2 -2
- package/scripts/rules/lane-background.ts +14 -16
- package/scripts/rules/lane-carry-conflict.ts +41 -5
- package/scripts/rules/lane-interactive-ask.ts +6 -9
- package/scripts/rules/lane-park.ts +12 -16
- package/scripts/rules/lane-split-park.ts +1 -2
- package/scripts/rules/lane-switch-main.ts +10 -13
- package/scripts/rules/last-prompt.ts +1 -1
- package/scripts/rules/oracle-consulted.ts +5 -5
- package/scripts/rules/oracle-firing.ts +6 -9
- package/scripts/rules/oracle-list-cli.ts +2 -2
- package/scripts/rules/permission-guards.ts +2 -2
- package/scripts/rules/piped-verification.ts +79 -9
- package/scripts/rules/poll-loop.ts +9 -11
- package/scripts/rules/pre-gate-cut.ts +33 -30
- package/scripts/rules/prior-comment-read.ts +3 -3
- package/scripts/rules/protected-files.ts +25 -13
- package/scripts/rules/raw-field-body.ts +3 -4
- package/scripts/rules/reply-language.ts +1 -1
- package/scripts/rules/rule-body-guard.ts +10 -12
- package/scripts/rules/rule-guard.ts +1 -1
- package/scripts/rules/rule-list.ts +51 -0
- package/scripts/rules/rule-registry-rows.ts +282 -0
- package/scripts/rules/rule-registry.ts +109 -0
- package/scripts/rules/rule-value-cache.ts +2 -2
- package/scripts/rules/rule-value-cli.ts +6 -4
- package/scripts/rules/rule-value.ts +61 -22
- package/scripts/rules/run-tail-rule.ts +11 -15
- package/scripts/rules/shell-body-trigger.ts +7 -7
- package/scripts/rules/shell-segments.ts +2 -4
- package/scripts/rules/stop-rules.ts +54 -41
- package/scripts/rules/tail-commands.ts +1 -1
- package/scripts/rules/test-declared-commit.ts +2 -2
- package/scripts/rules/third-party-write.ts +3 -3
- package/scripts/rules/worktree-guard.ts +12 -5
- package/scripts/run/add/run-add-cli.ts +165 -0
- package/scripts/run/add/run-add.ts +124 -0
- package/scripts/run/board/run-board-cli.ts +207 -0
- package/scripts/run/board/run-board-closed.ts +95 -0
- package/scripts/run/board/run-board-every.ts +60 -0
- package/scripts/run/board/run-board-fetch.ts +38 -0
- package/scripts/run/board/run-board-fit.ts +219 -0
- package/scripts/run/board/run-board-github.ts +162 -0
- package/scripts/run/board/run-board-header.ts +275 -0
- package/scripts/run/board/run-board-kind.ts +35 -0
- package/scripts/run/board/run-board-labels.ts +299 -0
- package/scripts/run/board/run-board-layout.ts +222 -0
- package/scripts/run/board/run-board-link.ts +31 -0
- package/scripts/run/board/run-board-machine.ts +198 -0
- package/scripts/run/board/run-board-notes.ts +103 -0
- package/scripts/run/board/run-board-phase.ts +136 -0
- package/scripts/run/board/run-board-plan.ts +129 -0
- package/scripts/run/board/run-board-read.ts +62 -0
- package/scripts/run/board/run-board-render-legend.ts +82 -0
- package/scripts/run/board/run-board-render-notes.ts +77 -0
- package/scripts/run/board/run-board-render-slot.ts +50 -0
- package/scripts/run/board/run-board-render.ts +407 -0
- package/scripts/run/board/run-board-scope.ts +17 -0
- package/scripts/run/board/run-board-screen.ts +43 -0
- package/scripts/run/board/run-board-span.ts +66 -0
- package/scripts/run/board/run-board-spin.ts +115 -0
- package/scripts/run/board/run-board-state.ts +113 -0
- package/scripts/run/board/run-board-status.ts +279 -0
- package/scripts/run/board/run-board-tick.ts +210 -0
- package/scripts/run/board/run-board-track.ts +22 -0
- package/scripts/run/board/run-board-usage-read.ts +255 -0
- package/scripts/run/board/run-board-usage-rusage.ts +124 -0
- package/scripts/run/board/run-board-usage-text.ts +80 -0
- package/scripts/run/board/run-board-usage.ts +165 -0
- package/scripts/run/carry/run-carry-added.ts +62 -0
- package/scripts/run/carry/run-carry-args.ts +25 -22
- package/scripts/run/carry/run-carry-change.ts +1 -1
- package/scripts/run/carry/run-carry-cli.ts +71 -48
- package/scripts/run/carry/run-carry-conversation.ts +6 -7
- package/scripts/run/carry/run-carry-ended.ts +85 -0
- package/scripts/run/carry/run-carry-reclaim.ts +1 -1
- package/scripts/run/carry/run-carry-stash.ts +3 -2
- package/scripts/run/carry/run-carry-streak.ts +8 -10
- package/scripts/run/carry/run-carry.ts +85 -89
- package/scripts/run/cut/run-cut-args.ts +7 -7
- package/scripts/run/cut/run-cut-cli.ts +68 -37
- package/scripts/run/cut/run-cut-handoff.ts +15 -15
- package/scripts/run/cut/run-cut-report.ts +37 -16
- package/scripts/run/cut/run-cut.ts +63 -77
- package/scripts/run/detached-launch.ts +35 -50
- package/scripts/run/entry/run-entry-cli.ts +48 -27
- package/scripts/run/entry/run-entry-stop.ts +7 -9
- package/scripts/run/entry/run-entry.ts +5 -6
- package/scripts/run/event/run-event-cli.ts +5 -6
- package/scripts/run/event/run-event-filed.ts +69 -0
- package/scripts/run/event/run-event-follow.ts +3 -3
- package/scripts/run/event/run-event-plan.ts +38 -0
- package/scripts/run/event/run-event-render.ts +10 -4
- package/scripts/run/event/run-event-scope.ts +47 -18
- package/scripts/run/event/run-event-stream-emit.ts +64 -11
- package/scripts/run/event/run-event-stream.ts +172 -43
- package/scripts/run/event/run-event-watch.ts +4 -6
- package/scripts/run/hold/run-hold-cli.ts +65 -62
- package/scripts/run/hold/run-hold.ts +88 -46
- package/scripts/run/merge/run-merge-cli.ts +116 -77
- package/scripts/run/merge/run-merge-collect.ts +107 -0
- package/scripts/run/merge/run-merge-steps.ts +112 -65
- package/scripts/run/merge/run-merge-token.ts +30 -0
- package/scripts/run/merge/run-merge.ts +31 -22
- package/scripts/run/progress/run-progress-args.ts +4 -4
- package/scripts/run/progress/run-progress-cli.ts +39 -50
- package/scripts/run/progress/run-progress-clock.ts +25 -32
- package/scripts/run/progress/run-progress-config.ts +6 -9
- package/scripts/run/progress/run-progress-read.ts +9 -10
- package/scripts/run/progress/run-progress.ts +48 -53
- package/scripts/run/review/run-review-cli.ts +6 -6
- package/scripts/run/review/run-review-steps.ts +6 -6
- package/scripts/run/review/run-review.ts +9 -11
- package/scripts/run/run-cli-fault.ts +29 -0
- package/scripts/run/run-ending-cli.ts +3 -3
- package/scripts/run/run-ending.ts +10 -14
- package/scripts/run/run-halfrun-resume.ts +6 -8
- package/scripts/run/run-headless.ts +25 -12
- package/scripts/run/run-invocation.ts +17 -22
- package/scripts/run/run-label.ts +7 -5
- package/scripts/run/run-liveness-cli.ts +19 -6
- package/scripts/run/run-liveness.ts +27 -38
- package/scripts/run/run-next-cli.ts +5 -9
- package/scripts/run/run-next.ts +4 -5
- package/scripts/run/run-parent-cut-hook.ts +10 -12
- package/scripts/run/run-preflight.ts +25 -29
- package/scripts/run/run-prep-cli.ts +17 -13
- package/scripts/run/run-prep-locate.ts +4 -5
- package/scripts/run/run-prep.ts +7 -10
- package/scripts/run/run-prrun-resume.ts +2 -2
- package/scripts/run/run-report-cli.ts +4 -4
- package/scripts/run/run-report.ts +9 -14
- package/scripts/run/run-retrospective.ts +3 -3
- package/scripts/run/run-section.ts +42 -0
- package/scripts/run/run-stage-read.ts +2 -2
- package/scripts/run/run-stage.ts +6 -4
- package/scripts/run/run-status-cli.ts +7 -5
- package/scripts/run/run-status.ts +6 -7
- package/scripts/run/run-step-cli.ts +13 -15
- package/scripts/run/run-step.ts +62 -48
- package/scripts/run/run-stop-notify.ts +7 -8
- package/scripts/run/run-stranded-cli.ts +1 -1
- package/scripts/run/run-stranded-detect.ts +4 -4
- package/scripts/run/run-stranded.ts +11 -13
- package/scripts/run/run-tail-cli.ts +15 -16
- package/scripts/run/run-tail.ts +14 -33
- package/scripts/run/run-watcher-guard-cli.ts +3 -4
- package/scripts/run/run-watcher-guard.ts +11 -12
- package/scripts/run/run-watcher-hook.ts +6 -12
- package/scripts/run/ship/run-ship-cli.ts +67 -33
- package/scripts/run/ship/run-ship-detach.ts +15 -13
- package/scripts/run/ship/run-ship-lock.ts +1 -1
- package/scripts/run/ship/run-ship-next.ts +7 -8
- package/scripts/run/ship/run-ship-pre-detach.ts +27 -11
- package/scripts/run/ship/run-ship-preflight.ts +10 -11
- package/scripts/run/ship/run-ship-probe.ts +4 -4
- package/scripts/run/ship/run-ship-return.ts +1 -1
- package/scripts/run/ship/run-ship-review-steps.ts +43 -24
- package/scripts/run/ship/run-ship-review.ts +12 -14
- package/scripts/run/ship/run-ship-scoped.ts +15 -6
- package/scripts/run/ship/run-ship-stage.ts +80 -26
- package/scripts/run/ship/run-ship-steps.ts +26 -16
- package/scripts/run/ship/run-ship-stop-text.ts +4 -2
- package/scripts/run/ship/run-ship-sync.ts +9 -8
- package/scripts/run/ship/run-ship.ts +17 -32
- package/scripts/run/tidy/run-tidy-cli.ts +9 -5
- package/scripts/run/tidy/run-tidy-lanes.ts +18 -7
- package/scripts/run/tidy/run-tidy-stashes.ts +8 -8
- package/scripts/run/tidy/run-tidy.ts +4 -3
- package/scripts/run/wake/run-wake-cli.ts +27 -33
- package/scripts/run/wake/run-wake-describe.ts +76 -29
- package/scripts/run/wake/run-wake-driver.ts +14 -14
- package/scripts/run/wake/run-wake-handoff.ts +6 -6
- package/scripts/run/wake/run-wake-loop.ts +13 -21
- package/scripts/run/wake/run-wake-restart.ts +4 -5
- package/scripts/run/wake/run-wake-session.ts +23 -27
- package/scripts/run/wake/run-wake.ts +57 -328
- package/scripts/safe-chain/ci-installer-pin.ts +3 -3
- package/scripts/safe-chain/pack-hook.ts +2 -2
- package/scripts/safe-chain/preinstall-command.ts +2 -2
- package/scripts/security/security-audit-logic.ts +1 -1
- package/scripts/security/security-audit-provision-logic.ts +1 -1
- package/scripts/security/security-audit-provision.ts +2 -2
- package/scripts/security/security-audit.ts +5 -5
- package/scripts/security/security-updates-logic.ts +2 -3
- package/scripts/security/security-updates.ts +2 -4
- package/scripts/self-sync-guard/index.ts +1 -1
- package/scripts/self-sync-guard/self-sync-guard-logic.ts +2 -2
- package/scripts/self-sync-guard/self-sync-refusal.ts +1 -1
- package/scripts/sonar/sonar-hotspots-cli.ts +1 -1
- package/scripts/sonar/sonar-hotspots.ts +1 -1
- package/scripts/sonar/sonar-new-code-cli.ts +1 -1
- package/scripts/sonar/sonar-new-code.ts +1 -1
- package/scripts/sonar/sonar-project.ts +1 -1
- package/scripts/split/split-assess-cli.ts +1 -1
- package/scripts/split/split-assess.ts +3 -3
- package/scripts/sync/directory-copy-guard.ts +2 -3
- package/scripts/sync/managed-config-scope-cli.ts +1 -2
- package/scripts/sync/managed-config-scope.ts +4 -4
- package/scripts/sync/plugin-skill-directories.ts +2 -2
- package/scripts/sync/reconcile-templates.ts +17 -8
- package/scripts/sync/removed-skill-manifest.ts +2 -3
- package/scripts/sync/sync-ai-files.ts +7 -7
- package/scripts/sync/sync-configs.ts +30 -3
- package/scripts/sync/sync-hook-safety.ts +2 -2
- package/scripts/sync/sync.ts +23 -10
- package/scripts/sync/synced-paths.ts +2 -1
- package/scripts/sync/workflow-pin-logic.ts +1 -1
- package/scripts/test/test-declared-changed.ts +4 -4
- package/scripts/test/test-declared-logic.ts +2 -3
- package/scripts/test/test-declared-match.ts +25 -4
- package/scripts/test/test-declared.ts +26 -9
- package/scripts/test/test-red-commit.ts +3 -2
- package/scripts/test/test-red-logic.ts +7 -14
- package/scripts/test/test-red.ts +12 -47
- package/scripts/test/test-related-scope.ts +2 -3
- package/scripts/test/test-related.ts +3 -3
- package/scripts/test/test-type-logic.ts +1 -2
- package/scripts/test/test-unit-guard.ts +13 -17
- package/scripts/test/unit-worker-share.ts +7 -8
- package/scripts/time-runtime/time-agent-bundles.ts +2 -4
- package/scripts/time-runtime/time-background.ts +17 -21
- package/scripts/time-runtime/time-batch-guard.ts +67 -342
- package/scripts/time-runtime/time-bundle-call.ts +26 -28
- package/scripts/time-runtime/time-bundles.ts +11 -12
- package/scripts/time-runtime/time-call-identity.ts +1 -1
- package/scripts/time-runtime/time-command-key.ts +2 -2
- package/scripts/time-runtime/time-density-hook.ts +8 -11
- package/scripts/time-runtime/time-density.ts +5 -5
- package/scripts/time-runtime/time-followup-stage.ts +7 -7
- package/scripts/time-runtime/time-format.ts +5 -5
- package/scripts/time-runtime/time-hook-transcript.ts +3 -3
- package/scripts/time-runtime/time-instant.ts +1 -1
- package/scripts/time-runtime/time-markers.ts +15 -19
- package/scripts/time-runtime/time-phase-names.ts +3 -3
- package/scripts/time-runtime/time-reported-failure.ts +15 -19
- package/scripts/time-runtime/time-round-trips.ts +20 -23
- package/scripts/time-runtime/time-shell.ts +8 -8
- package/scripts/time-runtime/time-single-check.ts +1 -2
- package/scripts/time-runtime/time-spans.ts +35 -40
- package/scripts/time-runtime/time-tool-call.ts +15 -16
- package/scripts/time-runtime/time-transcript-line.ts +53 -34
- package/scripts/time-runtime/time-writes.ts +5 -5
- package/scripts/ui/ui-routes-cli.ts +1 -2
- package/scripts/ui/ui-routes.ts +1 -2
- package/scripts/version/bump-version.ts +1 -1
- package/scripts/version/fresh-metadata-cache.ts +2 -2
- package/scripts/version/latest-corepack.ts +129 -98
- package/scripts/version/latest-lane-guard.ts +1 -1
- package/scripts/version/latest-scope-cli.ts +2 -2
- package/scripts/version/latest-stamp.ts +1 -2
- package/scripts/version/latest-update.ts +2 -2
- package/scripts/version/npm-registry.ts +2 -2
- package/scripts/version/package-manager-version.ts +18 -0
- package/scripts/version/publishable-range-check.ts +2 -1
- package/scripts/version/publishable-range.ts +1 -1
- package/scripts/version/release-age.ts +11 -11
- package/scripts/version/release-hold.ts +2 -2
- package/scripts/version/safe-chain-version-update.ts +3 -3
- package/scripts/version/version-check-logic.ts +2 -3
- package/scripts/version/version-check.ts +1 -2
- package/scripts/version/version-command-config.ts +2 -2
- package/scripts/version/version-commands.ts +3 -3
- package/scripts/version/version-remote.ts +4 -4
- package/scripts/version/version-targets.ts +2 -2
- package/templates/gitignore +7 -0
- package/templates/workflows/github-release.yml +4 -0
- package/dist/hooks/chunk-NV2JRZZO.js +0 -6385
- package/dist/hooks/chunk-RKUAD3I6.js +0 -90
- package/dist/hooks/chunk-WPALEIRX.js +0 -18
- package/scripts/backlog/backlog-restructure.ts +0 -152
- package/scripts/rules/issue-fold-rule.ts +0 -72
- package/scripts/rules/wip-cap.ts +0 -63
- package/scripts/run/run-issue-number.ts +0 -19
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
import { rest_comment_schema } from '#scripts/git/git-schemas'
|
|
2
2
|
import {
|
|
3
3
|
parse_json_array_or_undefined,
|
|
4
|
-
|
|
4
|
+
parse_json_object_or_undefined,
|
|
5
5
|
} from '#scripts/git/parse-json-array'
|
|
6
6
|
import { z } from 'zod'
|
|
7
7
|
import { MERGED_STATE, to_gh_state } from './git-gh-rest-state'
|
|
8
8
|
|
|
9
9
|
// The translation between one REST pull request (`repos/{owner}/{repo}/pulls/{N}`) and the JSON
|
|
10
|
-
// shape `gh pr view --json <fields>`
|
|
10
|
+
// shape `gh pr view --json <fields>` answers with.
|
|
11
11
|
//
|
|
12
12
|
// `gh pr view` goes through GraphQL, which a cloud session is answered 403 for while the REST
|
|
13
|
-
// endpoint is served normally
|
|
13
|
+
// endpoint is served normally. The mapping lives here rather than beside
|
|
14
14
|
// the requests because it is pure: given the response, it decides the answer with nothing else to
|
|
15
|
-
// know — the same split `git-gh-issue-rest.ts` already makes
|
|
15
|
+
// know — the same split `git-gh-issue-rest.ts` already makes.
|
|
16
16
|
|
|
17
17
|
// Only the fields the mapping itself reads are named; every other key passes through untouched.
|
|
18
18
|
//
|
|
@@ -24,7 +24,7 @@ import { MERGED_STATE, to_gh_state } from './git-gh-rest-state'
|
|
|
24
24
|
// `mergeable` and `mergeable_state` are served by the single-pull endpoint only — the listing omits
|
|
25
25
|
// both — which is why the branch lookup resolves a number and the reads go back for the detail.
|
|
26
26
|
// `repo.full_name` is what tells a fork's head from this repository's own — `head.ref` is a bare
|
|
27
|
-
// branch name that says nothing about which repository holds it
|
|
27
|
+
// branch name that says nothing about which repository holds it. Named once
|
|
28
28
|
// because both sides of a pull request carry the same shape.
|
|
29
29
|
const rest_repo_schema = z.looseObject({ full_name: z.string().optional() }).nullish()
|
|
30
30
|
const rest_pull_side_schema = z.looseObject({ repo: rest_repo_schema })
|
|
@@ -42,14 +42,13 @@ const rest_pull_schema = z.looseObject({
|
|
|
42
42
|
mergeable_state: z.string().optional(),
|
|
43
43
|
// `sha` is the head commit, which is what both halves of the merge-gate rollup are keyed by —
|
|
44
44
|
// REST hangs the check runs and the status contexts off the commit rather than off the pull
|
|
45
|
-
// request
|
|
45
|
+
// request.
|
|
46
46
|
head: z
|
|
47
47
|
.looseObject({ ref: z.string().optional(), sha: z.string().optional(), repo: rest_repo_schema })
|
|
48
48
|
.nullish(),
|
|
49
49
|
base: rest_pull_side_schema.nullish(),
|
|
50
50
|
// `node_id` is what the GraphQL auto-merge mutation addresses a pull request by, and `auto_merge`
|
|
51
|
-
// is `null` until auto-merge is enabled — both read by `git-gh-pr-auto-merge.ts
|
|
52
|
-
// (joshuafolkken/kit#2497).
|
|
51
|
+
// is `null` until auto-merge is enabled — both read by `git-gh-pr-auto-merge.ts`.
|
|
53
52
|
node_id: z.string().optional(),
|
|
54
53
|
auto_merge: z.looseObject({}).nullish(),
|
|
55
54
|
})
|
|
@@ -64,15 +63,14 @@ const OPEN_STATE = 'open'
|
|
|
64
63
|
const EMPTY_BODY = ''
|
|
65
64
|
|
|
66
65
|
function parse_rest_pull(rest_json: string): RestPull {
|
|
67
|
-
const parsed =
|
|
66
|
+
const parsed = parse_json_object_or_undefined(rest_json, rest_pull_schema)
|
|
68
67
|
if (parsed === undefined) throw new Error(NOT_A_PULL_MESSAGE)
|
|
69
68
|
|
|
70
69
|
return parsed
|
|
71
70
|
}
|
|
72
71
|
|
|
73
72
|
// A response that is not a listing must not degrade into an empty one: `pr_exists` reads an empty
|
|
74
|
-
// listing as "this branch has no pull request", and `git-pr.ts` answers that by opening
|
|
75
|
-
// (joshuafolkken/kit#950 is the same misread on the issue side).
|
|
73
|
+
// listing as "this branch has no pull request", and `git-pr.ts` answers that by opening another.
|
|
76
74
|
function parse_rest_pulls(rest_json: string): Array<RestPull> {
|
|
77
75
|
const parsed = parse_json_array_or_undefined(rest_json, rest_pull_schema)
|
|
78
76
|
if (parsed === undefined) throw new Error(NOT_A_PULL_LISTING_MESSAGE)
|
|
@@ -80,7 +78,7 @@ function parse_rest_pulls(rest_json: string): Array<RestPull> {
|
|
|
80
78
|
return parsed
|
|
81
79
|
}
|
|
82
80
|
|
|
83
|
-
// Which pull request a branch name means. `gh pr view <branch>`
|
|
81
|
+
// Which pull request a branch name means. `gh pr view <branch>` prefers the open one and falls back
|
|
84
82
|
// to the most recent, and the difference is reachable in this repository's own flow: `git-pr.ts`
|
|
85
83
|
// opens a *second* pull request on a branch whose first one merged, so a lookup that answered
|
|
86
84
|
// "newest first, whatever its state" would still be right there while "the first row" alone would
|
|
@@ -93,7 +91,7 @@ function select_pull(pulls: ReadonlyArray<RestPull>): RestPull | undefined {
|
|
|
93
91
|
// REST reports a merge as a field beside the state rather than as a state, and both spellings of it
|
|
94
92
|
// are accepted: the single-pull endpoint carries `merged`, the listing carries only `merged_at`.
|
|
95
93
|
//
|
|
96
|
-
// Exported
|
|
94
|
+
// Exported because `pr_merge` asks the same question directly: a merge
|
|
97
95
|
// request that failed after the merge landed is settled by reading the pull request back, and the
|
|
98
96
|
// merge-or-not verdict must be the one `to_pr_state` already uses rather than a second spelling of it.
|
|
99
97
|
function is_merged(pull: RestPull): boolean {
|
|
@@ -112,7 +110,7 @@ function to_pr_state(pull: RestPull): string | undefined {
|
|
|
112
110
|
// `gh pr checkout` reached a fork's head through `refs/pull/<N>/head`, which a plain
|
|
113
111
|
// `git fetch origin <branch>` cannot: the fetch either fails outright, or — where `origin` happens to
|
|
114
112
|
// carry a branch of the same name — succeeds on an unrelated branch. Both halves are read out of the
|
|
115
|
-
// one response, so the test costs no second request
|
|
113
|
+
// one response, so the test costs no second request.
|
|
116
114
|
function to_repo_name(side: RestPullSide | null | undefined): string | undefined {
|
|
117
115
|
return side?.repo?.full_name
|
|
118
116
|
}
|
|
@@ -125,19 +123,18 @@ function is_same_repository_head(pull: RestPull): boolean {
|
|
|
125
123
|
|
|
126
124
|
// The three fields `gh pr view --json mergeable,mergeStateStatus,state` answered with.
|
|
127
125
|
//
|
|
128
|
-
// `mergeable`
|
|
129
|
-
//
|
|
130
|
-
//
|
|
126
|
+
// `mergeable` is a GraphQL enum (`MERGEABLE` / `CONFLICTING` / `UNKNOWN`) and a nullable boolean in
|
|
127
|
+
// REST; `pr_info_schema` accepts both, so the boolean passes through as it arrives — including the
|
|
128
|
+
// JSON null GitHub sends while it is still computing.
|
|
131
129
|
//
|
|
132
|
-
// **Nothing reads `mergeable
|
|
133
|
-
//
|
|
134
|
-
//
|
|
135
|
-
//
|
|
136
|
-
//
|
|
130
|
+
// **Nothing reads `mergeable`** — the conflict verdict comes off `mergeStateStatus` in
|
|
131
|
+
// `git-pr-checks-eval.ts`. It stays because this function's contract is *the shape
|
|
132
|
+
// `gh pr view --json …` answers with*, not the subset today's callers happen to read — trimming a
|
|
133
|
+
// wire shape to its current readers is what makes the next one look for a field the mapping
|
|
134
|
+
// silently dropped.
|
|
137
135
|
//
|
|
138
|
-
// `mergeStateStatus` is upper-cased because that is how `gh`
|
|
139
|
-
// snapshot in `git-pr-checks-eval.ts` compares strictly against that spelling
|
|
140
|
-
// (joshuafolkken/kit#1028 converts the snapshot itself).
|
|
136
|
+
// `mergeStateStatus` is upper-cased because that is how `gh` spells it, and because the merge-gate
|
|
137
|
+
// snapshot in `git-pr-checks-eval.ts` compares strictly against that spelling.
|
|
141
138
|
function to_pr_info(pull: RestPull): Record<string, unknown> {
|
|
142
139
|
return {
|
|
143
140
|
mergeable: pull.mergeable,
|
|
@@ -148,7 +145,7 @@ function to_pr_info(pull: RestPull): Record<string, unknown> {
|
|
|
148
145
|
|
|
149
146
|
// The conversation comments in the shape `gh pr view --json comments` answered with. A listing that
|
|
150
147
|
// will not parse throws rather than answering an empty one — `git-pr-ai-review.ts` reads an empty
|
|
151
|
-
// listing as "no reviewer left a finding" and merges
|
|
148
|
+
// listing as "no reviewer left a finding" and merges.
|
|
152
149
|
function to_pr_comments(rest_json: string): Array<Record<string, unknown>> {
|
|
153
150
|
const parsed = parse_json_array_or_undefined(rest_json, rest_comment_schema)
|
|
154
151
|
if (parsed === undefined) throw new Error(NOT_A_COMMENT_LISTING_MESSAGE)
|
|
@@ -5,7 +5,7 @@ import { z } from 'zod'
|
|
|
5
5
|
//
|
|
6
6
|
// **REST has no field for it.** `repos/{owner}/{repo}/pulls/{N}/reviews` answers every review ever
|
|
7
7
|
// submitted, so the one value `gh pr view --json reviewDecision` gave has to be folded out of that
|
|
8
|
-
// listing
|
|
8
|
+
// listing.
|
|
9
9
|
//
|
|
10
10
|
// The only consumer is `is_review_blocked` in `git-pr-checks-eval.ts`, which asks one question: is
|
|
11
11
|
// `CHANGES_REQUESTED` standing? `APPROVED` and the empty string are therefore interchangeable to the
|
|
@@ -41,7 +41,7 @@ type RestReview = z.infer<typeof rest_review_schema>
|
|
|
41
41
|
const NOT_A_REVIEW_LISTING = 'gh api answered something other than a review listing'
|
|
42
42
|
|
|
43
43
|
// A listing that will not parse throws rather than answering "nobody requested changes" — the
|
|
44
|
-
//
|
|
44
|
+
// an unread answer must never let the merge gate pass.
|
|
45
45
|
function parse_rest_reviews(reviews_json: string): Array<RestReview> {
|
|
46
46
|
const parsed = parse_json_array_or_undefined(reviews_json, rest_review_schema)
|
|
47
47
|
if (parsed === undefined) throw new Error(NOT_A_REVIEW_LISTING)
|
|
@@ -7,7 +7,7 @@ import { z } from 'zod'
|
|
|
7
7
|
// `gh` answered a single `statusCheckRollup` whose elements were of two kinds; REST splits them
|
|
8
8
|
// across `commits/{sha}/check-runs` (`status` / `conclusion` / `name`) and `commits/{sha}/status`
|
|
9
9
|
// (`state` / `context`). The merge is pure — given the two responses it decides the answer with
|
|
10
|
-
// nothing else to know — so it lives here rather than beside the requests
|
|
10
|
+
// nothing else to know — so it lives here rather than beside the requests.
|
|
11
11
|
|
|
12
12
|
// `__typename` is what `git-pr-checks-parse.ts` distinguishes the two kinds by, and only the status
|
|
13
13
|
// contexts carry it: the parser's default branch is the check run, so a check run needs no marker
|
|
@@ -45,7 +45,7 @@ const NOT_A_STATUS_LISTING = 'gh api answered something other than a commit stat
|
|
|
45
45
|
// A response that will not parse throws rather than degrading to an empty rollup. The direction is
|
|
46
46
|
// what makes it worth the throw: an empty rollup reads as "this pull request has no checks", and
|
|
47
47
|
// `git-pr-followup.ts` treats that as a reason to stop watching rather than as a failure — so a rate
|
|
48
|
-
// limit would arrive as a pull request nothing was ever required to pass
|
|
48
|
+
// limit would arrive as a pull request nothing was ever required to pass.
|
|
49
49
|
function read_pages<T>(raw_json: string, schema: z.ZodType<T>, message: string): Array<T> {
|
|
50
50
|
const pages = parse_json_array_or_undefined(raw_json, schema)
|
|
51
51
|
if (pages === undefined) throw new Error(message)
|
|
@@ -85,9 +85,9 @@ function read_rank(run: RollupElement): RunRank | undefined {
|
|
|
85
85
|
// *within* a suite (a re-run job lands in the suite it re-runs), so what is left is one run per
|
|
86
86
|
// suite. Across suites GitHub takes the one from the newer suite: PR #2717's cancelled suite was the
|
|
87
87
|
// older one and GitHub read the pull request `CLEAN`, while PR #2698's cancelled suite was the newer
|
|
88
|
-
// one and GitHub held it `BLOCKED`. Ranking by run id alone
|
|
88
|
+
// one and GitHub held it `BLOCKED`. Ranking by run id alone picked #2698's
|
|
89
89
|
// older, successful suite — its jobs had queued later — so `followup` read green beside a `BLOCKED`
|
|
90
|
-
// pull request and waited out its whole budget
|
|
90
|
+
// pull request and waited out its whole budget.
|
|
91
91
|
function is_ranked_above(candidate: RunRank, current: RunRank): boolean {
|
|
92
92
|
if (candidate.suite !== current.suite) return candidate.suite > current.suite
|
|
93
93
|
|
|
@@ -9,11 +9,10 @@ import { to_gh_state } from './git-gh-rest-state'
|
|
|
9
9
|
// The merge gate's pull request state snapshot, rebuilt from REST.
|
|
10
10
|
//
|
|
11
11
|
// `gh pr view --json mergeStateStatus,reviewDecision,statusCheckRollup` is answered 403 in a cloud
|
|
12
|
-
// session
|
|
12
|
+
// session, and all three fields are GraphQL-only: one has no REST
|
|
13
13
|
// counterpart at all, one is spelled differently, and one is two endpoints that `gh` merged.
|
|
14
14
|
// `pnpm josh followup` decides a pull request is green from this value, so a mistake here
|
|
15
|
-
// ships as a merge no gate ever cleared rather than as a command that stops working
|
|
16
|
-
// (joshuafolkken/kit#1028).
|
|
15
|
+
// ships as a merge no gate ever cleared rather than as a command that stops working.
|
|
17
16
|
//
|
|
18
17
|
// The answer stays the JSON string `parse_pr_state_snapshot` already parses. Nothing downstream —
|
|
19
18
|
// `git-pr-checks-parse.ts`, `git-pr-checks-eval.ts`, `git-pr-followup.ts` — changes.
|
|
@@ -59,18 +58,17 @@ async function read_status_check_rollup(commit_sha: string): Promise<Array<objec
|
|
|
59
58
|
}
|
|
60
59
|
|
|
61
60
|
// The review history, folded into GraphQL's `reviewDecision`. One request, and the only one of the
|
|
62
|
-
// four the merge gate does not need on every poll — see `is_review_decision_decisive
|
|
63
|
-
// (joshuafolkken/kit#1043).
|
|
61
|
+
// four the merge gate does not need on every poll — see `is_review_decision_decisive`.
|
|
64
62
|
async function pr_get_review_decision(pr_number: number): Promise<string> {
|
|
65
63
|
const path = git_gh_api_path.pull_reviews_api_path(String(pr_number))
|
|
66
64
|
|
|
67
65
|
return git_gh_pr_review.to_review_decision(await read_array_pages(path))
|
|
68
66
|
}
|
|
69
67
|
|
|
70
|
-
// `mergeStateStatus` is upper-cased because that is the spelling `gh`
|
|
68
|
+
// `mergeStateStatus` is upper-cased because that is the spelling `gh` uses and the spelling
|
|
71
69
|
// `git-pr-checks-eval.ts` compares strictly against: `MERGE_STATE_CLEAN` never matches a lower-case
|
|
72
|
-
// `clean`, which would also take every pull request out of the
|
|
73
|
-
// `UNSTABLE`. The rule is shared with `to_pr_info` rather than written twice.
|
|
70
|
+
// `clean`, which would also take every pull request out of the CodeRabbit non-blocking exemption
|
|
71
|
+
// keyed on `UNSTABLE`. The rule is shared with `to_pr_info` rather than written twice.
|
|
74
72
|
async function build_checks_fields(pull: RestPull): Promise<Record<string, unknown>> {
|
|
75
73
|
return {
|
|
76
74
|
statusCheckRollup: await read_status_check_rollup(read_head_sha(pull)),
|
|
@@ -93,7 +91,7 @@ async function resolve_pull(branch_name: string): Promise<ResolvedPull> {
|
|
|
93
91
|
|
|
94
92
|
// Everything the snapshot carries except the review decision: three requests rather than four.
|
|
95
93
|
// `pr_number` travels with it so a caller that then *does* want the review decision needs no second
|
|
96
|
-
// resolution
|
|
94
|
+
// resolution.
|
|
97
95
|
interface PrChecksSnapshot {
|
|
98
96
|
pr_number: number
|
|
99
97
|
snapshot_json: string
|
|
@@ -112,7 +110,7 @@ async function pr_get_checks_snapshot(branch_name: string): Promise<PrChecksSnap
|
|
|
112
110
|
// **This is the definition the two halves above must compose to.** The merge gate reads them
|
|
113
111
|
// separately so it can skip the review listing on a poll that cannot conclude anything, but the
|
|
114
112
|
// three-field value `gh pr view --json …` answered with is still one thing, and it is asserted here
|
|
115
|
-
// rather than reassembled inside a test
|
|
113
|
+
// rather than reassembled inside a test.
|
|
116
114
|
async function pr_get_state_snapshot(branch_name: string): Promise<string> {
|
|
117
115
|
const { pr_number, pull } = await resolve_pull(branch_name)
|
|
118
116
|
const [fields, review_decision] = await Promise.all([
|
package/scripts/gh/git-gh-pr.ts
CHANGED
|
@@ -13,16 +13,16 @@ import { git_gh_pr_snapshot } from './git-gh-pr-snapshot'
|
|
|
13
13
|
// The pull-request writes, through REST.
|
|
14
14
|
//
|
|
15
15
|
// `gh pr create` / `comment` / `merge` / `checkout` all go through GraphQL, which a cloud session is
|
|
16
|
-
// answered 403 for while the REST endpoints are served normally
|
|
17
|
-
// converted first — the ones `gh pr view` served in `git-gh-pr-read.ts`
|
|
18
|
-
// the merge gate's snapshot in `git-gh-pr-snapshot.ts`
|
|
16
|
+
// answered 403 for while the REST endpoints are served normally. The reads
|
|
17
|
+
// converted first — the ones `gh pr view` served in `git-gh-pr-read.ts` and
|
|
18
|
+
// the merge gate's snapshot in `git-gh-pr-snapshot.ts` — and these are the
|
|
19
19
|
// last four calls, plus the one whose API use the epic left unconfirmed.
|
|
20
20
|
//
|
|
21
21
|
// **Every path here was measured against the live API before it was written**, on a throwaway pull
|
|
22
22
|
// request opened between two throwaway branches so that neither `main` nor any real pull request was
|
|
23
23
|
// touched. Two of the four did not behave as reading the documentation would suggest: see
|
|
24
24
|
// `pr_create` for the duplicate-head response. The other, `pr_checkout`, is gone with its one caller,
|
|
25
|
-
// `sync-dependabot-pins
|
|
25
|
+
// `sync-dependabot-pins`.
|
|
26
26
|
//
|
|
27
27
|
// `pr_checks` — a `gh pr checks <branch>` wrapper — is gone rather than converted. Nothing called it:
|
|
28
28
|
// the merge gate reads the rollup out of the snapshot and `git-pr-checks-watch.ts` runs the watching
|
|
@@ -41,7 +41,7 @@ const MERGE_COMMIT_METHOD = 'merge'
|
|
|
41
41
|
// least idempotent request the layer makes, so the failure the shared 60-second budget produces is
|
|
42
42
|
// the expensive one: a merge that landed while the request was already being abandoned. Three
|
|
43
43
|
// minutes lowers how often that happens without leaving the request unbounded — the recovery below
|
|
44
|
-
// is what actually removes the failure mode, and this only makes it rarer
|
|
44
|
+
// is what actually removes the failure mode, and this only makes it rarer.
|
|
45
45
|
const MERGE_REQUEST_TIMEOUT_MS = 180_000
|
|
46
46
|
// What a failed merge whose outcome could not be read back is reported as. Deliberately neither
|
|
47
47
|
// "merged" nor "not merged": nobody read it.
|
|
@@ -102,7 +102,7 @@ async function pr_ensure_classification(
|
|
|
102
102
|
// `{"message":"Validation Failed","errors":[{"resource":"PullRequest","code":"custom","message":"A
|
|
103
103
|
// pull request already exists for <owner>:<branch>."}]}` — which `gh` writes to **stdout**, putting
|
|
104
104
|
// only `gh: Validation Failed (HTTP 422)` on stderr. The body reaches the thrown Error because
|
|
105
|
-
// `to_gh_error` appends stdout
|
|
105
|
+
// `to_gh_error` appends stdout; the `already exists` match itself is
|
|
106
106
|
// unchanged, because both wordings contain it and the 422 carries no machine-readable code for the
|
|
107
107
|
// case (`"code":"custom"`).
|
|
108
108
|
async function post_pull_request(title: string, body: string): Promise<string> {
|
|
@@ -152,8 +152,8 @@ async function pr_comment(branch_name: string, body: string): Promise<string> {
|
|
|
152
152
|
|
|
153
153
|
// Replaces the body of the branch's open pull request. `git -y` opens a pull request once, so a
|
|
154
154
|
// body supplied on a later run — the live-execution evidence `followup` gates the merge on
|
|
155
|
-
//
|
|
156
|
-
// detail read holds the old body, so it is cleared first
|
|
155
|
+
// — reaches an already-open one only through this write. The remembered
|
|
156
|
+
// detail read holds the old body, so it is cleared first.
|
|
157
157
|
async function pr_update_body(branch_name: string, body: string): Promise<void> {
|
|
158
158
|
const pr_number = await require_pr_number(branch_name)
|
|
159
159
|
|
|
@@ -165,7 +165,7 @@ async function pr_update_body(branch_name: string, body: string): Promise<void>
|
|
|
165
165
|
})
|
|
166
166
|
}
|
|
167
167
|
|
|
168
|
-
// A merge moves the remembered detail read's state, so it is cleared first
|
|
168
|
+
// A merge moves the remembered detail read's state, so it is cleared first.
|
|
169
169
|
async function put_merge(pr_number: number): Promise<void> {
|
|
170
170
|
forget_pr_numbers()
|
|
171
171
|
await git_gh_exec.exec_gh_api({
|
|
@@ -177,7 +177,7 @@ async function put_merge(pr_number: number): Promise<void> {
|
|
|
177
177
|
}
|
|
178
178
|
|
|
179
179
|
// `undefined` is "nobody read it", kept apart from the `false` that means "the pull request is not
|
|
180
|
-
// merged". Folding the two
|
|
180
|
+
// merged". Folding the two would report an unread state as a settled answer.
|
|
181
181
|
async function read_merge_state(pr_number: number): Promise<boolean | undefined> {
|
|
182
182
|
try {
|
|
183
183
|
return git_gh_pr_rest.is_merged(await read_pull(pr_number))
|
|
@@ -222,13 +222,13 @@ async function has_merge_landed(pr_number: number, merge_error: unknown): Promis
|
|
|
222
222
|
throw new Error(MERGE_UNCONFIRMED_MESSAGE, { cause: merge_error })
|
|
223
223
|
}
|
|
224
224
|
|
|
225
|
-
// **The least idempotent write in this layer, made re-entrant
|
|
225
|
+
// **The least idempotent write in this layer, made re-entrant**.
|
|
226
226
|
//
|
|
227
|
-
// The request carries a budget like everything else
|
|
228
|
-
//
|
|
229
|
-
//
|
|
230
|
-
//
|
|
231
|
-
//
|
|
227
|
+
// The request carries a budget like everything else, and a merge that lands server-side but overruns
|
|
228
|
+
// it throws: on its own that would make `followup` skip its completion notification and the epic
|
|
229
|
+
// auto-close, and a re-run answer 405 on a pull request that is already merged. The budget does not
|
|
230
|
+
// create that — without it the same request hangs forever, with no notification either and no end to
|
|
231
|
+
// the run — it only turns a silent hang into a loud failure.
|
|
232
232
|
//
|
|
233
233
|
// **A failed merge request is not proof the merge did not happen**, so the pull request's own state
|
|
234
234
|
// settles it: merged, and this returns as if the request had succeeded, which is what lets
|
|
@@ -1,20 +1,19 @@
|
|
|
1
1
|
// Whether GitHub answered at all — the question a failed read has to ask before it calls itself a
|
|
2
|
-
// structural failure
|
|
2
|
+
// structural failure.
|
|
3
3
|
//
|
|
4
|
-
// **The question is
|
|
5
|
-
//
|
|
6
|
-
//
|
|
7
|
-
//
|
|
8
|
-
//
|
|
9
|
-
//
|
|
10
|
-
// on its own error document.
|
|
4
|
+
// **The question is asked of the failed request itself, not of a later one.** A probe fired at
|
|
5
|
+
// `rate_limit` after the reads are over would misread a connection that dropped for a few hundred
|
|
6
|
+
// milliseconds: it fails a read at t=0 and answers the probe `reachable`, so the run would keep the
|
|
7
|
+
// verdict the probe gave it rather than the one the read had. What lives here is the
|
|
8
|
+
// classification — status to retryable-or-not — which `git-gh-issue-read.ts` applies to the status
|
|
9
|
+
// the failed request carried on its own error document.
|
|
11
10
|
//
|
|
12
11
|
// A dropped connection, a name that would not resolve, a rate limit and a 5xx are **retryable**: the
|
|
13
12
|
// same request a moment later can succeed, and nothing about the repository has to change first. A
|
|
14
13
|
// 404 or a 401 is not — the issue is absent or the credentials are wrong, and asking again answers
|
|
15
|
-
// the same. Callers that cannot tell the two apart have to choose one meaning for both, and
|
|
16
|
-
//
|
|
17
|
-
//
|
|
14
|
+
// the same. Callers that cannot tell the two apart have to choose one meaning for both, and the
|
|
15
|
+
// cost is concrete: an unattended run can report thirteen runnable issues as an unresolvable
|
|
16
|
+
// dependency graph because DNS hiccuped once.
|
|
18
17
|
//
|
|
19
18
|
// **It classifies by status code and not by gh's wording**, which is the same argument
|
|
20
19
|
// `issue_view_json_classified` records for separating 404 from the rest: a message is prose that can
|
|
@@ -25,7 +24,7 @@
|
|
|
25
24
|
// **403 is deliberately not retryable.** GitHub does spell some secondary rate limits that way, but
|
|
26
25
|
// it is equally how a SAML-SSO-unauthorized token, an IP allowlist and an org policy each answer —
|
|
27
26
|
// all permanent, and all diagnosed correctly by the `gh auth status` advice the unusable-graph
|
|
28
|
-
// report already carries. Reading one of those as a connection problem would be
|
|
27
|
+
// report already carries. Reading one of those as a connection problem would be the same
|
|
29
28
|
// misdirection pointed the other way, so the ambiguous status is left with the permanent meaning and
|
|
30
29
|
// only the unambiguous ones — 429, 5xx, and no answer at all — are treated as worth asking again.
|
|
31
30
|
const RATE_LIMITED_STATUS = 429
|
|
@@ -6,13 +6,12 @@ import { git_gh_helpers } from './git-gh-helpers'
|
|
|
6
6
|
//
|
|
7
7
|
// Read through REST rather than `gh repo view --json nameWithOwner`: the `gh <noun> <verb>` form
|
|
8
8
|
// goes through GraphQL, which a cloud session is refused outright (403), so this read answered
|
|
9
|
-
// `undefined` there and every caller needing the name inherited that answer
|
|
10
|
-
// (joshuafolkken/kit#1023).
|
|
9
|
+
// `undefined` there and every caller needing the name inherited that answer.
|
|
11
10
|
//
|
|
12
11
|
// The pull-request reads no longer go through it at all: they address `repos/{owner}/{repo}` and
|
|
13
12
|
// name the head filter's owner as `{owner}` too, which `gh api` expands inside a query string as
|
|
14
13
|
// readily as inside a path. That keeps six branch-keyed reads from gaining a second way to fail, and
|
|
15
|
-
// it is what makes `pr_get_review_comments` REST end to end
|
|
14
|
+
// it is what makes `pr_get_review_comments` REST end to end. The remaining
|
|
16
15
|
// caller is the completion notification, which puts the name in its Telegram body.
|
|
17
16
|
//
|
|
18
17
|
// The failure contract is unchanged: `undefined` when the read fails, for a caller that has nothing
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
// answered `OPEN` / `CLOSED` / `MERGED` and every reader downstream compares against that spelling.
|
|
5
5
|
// Two endpoints have to recompose the third value from different fields — the issue endpoint from
|
|
6
6
|
// `pull_request.merged_at`, the pulls endpoint from `merged` — so the rule they share is named here
|
|
7
|
-
// rather than in either of them
|
|
7
|
+
// rather than in either of them.
|
|
8
8
|
const MERGED_STATE = 'MERGED'
|
|
9
9
|
|
|
10
10
|
function to_gh_state(state: string | undefined): string | undefined {
|
|
@@ -16,7 +16,7 @@ interface AiReviewPullComment {
|
|
|
16
16
|
}
|
|
17
17
|
|
|
18
18
|
// `undefined` when the answer was not a listing at all. `parse_json_array_safe` returned `[]` for
|
|
19
|
-
// that, which this gate reads as "no reviewer left a finding"
|
|
19
|
+
// that, which this gate reads as "no reviewer left a finding".
|
|
20
20
|
function parse_ai_review_comments(
|
|
21
21
|
raw_json: string | undefined,
|
|
22
22
|
): Array<AiReviewPullComment> | undefined {
|
|
@@ -39,8 +39,9 @@ function format_ai_review_finding(finding: ClassifiedFinding): string {
|
|
|
39
39
|
return `- ${finding.author_login}: ${finding.summary}${suffix}`
|
|
40
40
|
}
|
|
41
41
|
|
|
42
|
-
// Temporary
|
|
43
|
-
// completion notification instead of blocking the merge. Revert together with
|
|
42
|
+
// Temporary: CodeRabbit findings are surfaced as console info and audit notes for the
|
|
43
|
+
// completion notification instead of blocking the merge. Revert together with the rest of the
|
|
44
|
+
// temporary CodeRabbit non-blocking policy.
|
|
44
45
|
function log_info_findings(infos: ReadonlyArray<ClassifiedFinding>): Array<string> {
|
|
45
46
|
if (infos.length === 0) return []
|
|
46
47
|
|
|
@@ -111,8 +112,8 @@ async function handle_blockers(input: {
|
|
|
111
112
|
|
|
112
113
|
// A gate that could not be read is not a gate that passed. An unreadable listing is handled exactly
|
|
113
114
|
// like an unresolved finding — the same `confirmation` Telegram, the same non-zero exit — because
|
|
114
|
-
// what it means is the same: nobody has confirmed the reviewers had nothing to say
|
|
115
|
-
//
|
|
115
|
+
// what it means is the same: nobody has confirmed the reviewers had nothing to say.
|
|
116
|
+
// An ignore reason still gets past it, for the same reason it gets past a
|
|
116
117
|
// real finding: the person has looked.
|
|
117
118
|
const UNREADABLE_COMMENTS_BODY =
|
|
118
119
|
'The AI reviewer comments could not be read, so no finding could be ruled out.\n' +
|
|
@@ -7,14 +7,14 @@ import {
|
|
|
7
7
|
} from './git-pr-checks-parse'
|
|
8
8
|
|
|
9
9
|
// cspell:words coderabbit
|
|
10
|
-
// Temporary
|
|
10
|
+
// Temporary: CodeRabbit is excluded from the default required checks so slow or
|
|
11
11
|
// rate-limited CodeRabbit reviews never block the merge gate. Re-add it via JOSH_REQUIRED_CHECKS
|
|
12
|
-
// to restore the old behavior. Revert once the fresh-context review subagent
|
|
12
|
+
// to restore the old behavior. Revert once the fresh-context review subagent replaces it.
|
|
13
13
|
const DEFAULT_REQUIRED_CHECKS = ['SonarQube']
|
|
14
14
|
// The single source of the check name every CodeRabbit exemption is keyed on — the merge gate's
|
|
15
15
|
// `is_unstable_only_from_coderabbit`, the look-ahead's `is_awaited_check`, and the fixtures the two
|
|
16
16
|
// are tested from. A second literal spelling of it anywhere is how one of them silently stops
|
|
17
|
-
// matching after CodeRabbit renames its context
|
|
17
|
+
// matching after CodeRabbit renames its context.
|
|
18
18
|
const CODERABBIT_CHECK_NAME = 'CodeRabbit'
|
|
19
19
|
const REQUIRED_CHECKS_ENV_VAR = 'JOSH_REQUIRED_CHECKS'
|
|
20
20
|
|
|
@@ -73,19 +73,17 @@ function is_review_blocked(review_decision: string | undefined): boolean {
|
|
|
73
73
|
return review_decision === REVIEW_CHANGES_REQUESTED
|
|
74
74
|
}
|
|
75
75
|
|
|
76
|
-
// **A conflicting pull request ends the wait instead of polling through it
|
|
77
|
-
//
|
|
78
|
-
//
|
|
79
|
-
//
|
|
80
|
-
//
|
|
81
|
-
// soon as the pull request is open, so the first poll here is what reports a conflict — about ten
|
|
82
|
-
// seconds against that two minutes.
|
|
76
|
+
// **A conflicting pull request ends the wait instead of polling through it**.
|
|
77
|
+
// `DIRTY` is not CLEAN, so it would otherwise answer `pending` and run the whole 32-minute budget
|
|
78
|
+
// out on a state that resolves only when a person rebases — ending in a timeout that names no cause.
|
|
79
|
+
// `pnpm josh git` returns as soon as the pull request is open, so the first poll here is what
|
|
80
|
+
// reports a conflict.
|
|
83
81
|
//
|
|
84
82
|
// **`BLOCKED` is deliberately not here.** GitHub reports it while a required check is merely queued,
|
|
85
|
-
// which is every healthy pull request for its first seconds.
|
|
86
|
-
//
|
|
87
|
-
//
|
|
88
|
-
//
|
|
83
|
+
// which is every healthy pull request for its first seconds. Treating it as a conflict is safe only
|
|
84
|
+
// after the checks have settled; there is no such moment on this path, and a green-but-`BLOCKED`
|
|
85
|
+
// pull request (branch protection requiring a review, which this repository does not set)
|
|
86
|
+
// therefore reaches the timeout rather than a named failure.
|
|
89
87
|
function is_merge_conflict(merge_state_status: string | undefined): boolean {
|
|
90
88
|
return merge_state_status === MERGE_STATE_DIRTY
|
|
91
89
|
}
|
|
@@ -121,8 +119,8 @@ function is_coderabbit_check(check_name: string): boolean {
|
|
|
121
119
|
return is_required_match(check_name, CODERABBIT_CHECK_NAME)
|
|
122
120
|
}
|
|
123
121
|
|
|
124
|
-
// Temporary
|
|
125
|
-
// though CodeRabbit is
|
|
122
|
+
// Temporary: a pending or failing CodeRabbit check makes GitHub report UNSTABLE even
|
|
123
|
+
// though CodeRabbit is not required. Accept that state only when CodeRabbit checks are the
|
|
126
124
|
// sole non-passing ones — any other non-passing check keeps the gate strict.
|
|
127
125
|
function is_unstable_only_from_coderabbit(snapshot: PrStateSnapshot): boolean {
|
|
128
126
|
if (snapshot.merge_state_status !== MERGE_STATE_UNSTABLE) return false
|
|
@@ -136,16 +134,16 @@ function is_required_check(check_name: string): boolean {
|
|
|
136
134
|
return REQUIRED_CHECKS.some((required) => is_required_match(check_name, required))
|
|
137
135
|
}
|
|
138
136
|
|
|
139
|
-
// A failing job outside the required list
|
|
140
|
-
// UNSTABLE
|
|
141
|
-
//
|
|
142
|
-
//
|
|
143
|
-
//
|
|
137
|
+
// A failing job outside the required list does not fail the pull request on GitHub: it reports
|
|
138
|
+
// UNSTABLE, so `evaluate_pr_state` alone would answer `pending` and the wait would run out its whole
|
|
139
|
+
// 32-minute budget before ending in a timeout that never names the cause. Any failed check
|
|
140
|
+
// therefore ends the wait — except CodeRabbit's, which the temporary CodeRabbit non-blocking policy
|
|
141
|
+
// keeps non-blocking end to end, unless a project has put it back on the required list via
|
|
144
142
|
// `JOSH_REQUIRED_CHECKS`. This only makes the gate report sooner: nothing here can produce
|
|
145
143
|
// `success`, so no failing check gains a path to a merge. What counts as failed is whatever the
|
|
146
144
|
// parser records as `fail` — `cancelled` and `timed_out` among them — which is the rule the required
|
|
147
|
-
// list
|
|
148
|
-
//
|
|
145
|
+
// list follows; the cost is that a job cancelled and re-run by hand is not picked up by a wait
|
|
146
|
+
// already in progress, and `followup` has to be run again.
|
|
149
147
|
function is_blocking_failure(check: RollupCheck): boolean {
|
|
150
148
|
if (check.status !== CHECK_STATUS_FAIL) return false
|
|
151
149
|
|
|
@@ -163,7 +161,7 @@ function is_mergeable_state(snapshot: PrStateSnapshot): boolean {
|
|
|
163
161
|
}
|
|
164
162
|
|
|
165
163
|
// The wait's own error text: naming the checks that failed is what turns a red `followup` into
|
|
166
|
-
// something actionable without opening the pull request
|
|
164
|
+
// something actionable without opening the pull request.
|
|
167
165
|
function collect_failure_reasons(snapshot: PrStateSnapshot): Array<string> {
|
|
168
166
|
const reasons: Array<string> = []
|
|
169
167
|
if (is_merge_conflict(snapshot.merge_state_status)) reasons.push(FAILURE_REASON_CONFLICT)
|
|
@@ -204,7 +202,7 @@ function evaluate_pr_state(snapshot: PrStateSnapshot): PrEvaluation {
|
|
|
204
202
|
// `failure` without one is a poll that ends the wait, and both need it — `success` because a standing
|
|
205
203
|
// change request must demote it, `failure` because `describe_pr_failure` names the reasons and
|
|
206
204
|
// dropping "review requested changes" from a message that also lists failed checks loses half the
|
|
207
|
-
// diagnosis
|
|
205
|
+
// diagnosis.
|
|
208
206
|
//
|
|
209
207
|
// **This is a freshness rule, not a cache.** Nothing is remembered between polls, which is the one
|
|
210
208
|
// shape that would be wrong here — a stale non-blocking decision is exactly the direction that ships
|
|
@@ -212,7 +210,7 @@ function evaluate_pr_state(snapshot: PrStateSnapshot): PrEvaluation {
|
|
|
212
210
|
// read in that same poll.
|
|
213
211
|
//
|
|
214
212
|
// **What it costs, stated rather than glossed.** A change request standing on a pull request whose
|
|
215
|
-
// checks never settle
|
|
213
|
+
// checks never settle does not end the wait on the first poll with `review requested changes`; it
|
|
216
214
|
// runs the budget out and ends with the wait's own timeout, which names no cause. That run was red
|
|
217
215
|
// either way — the trade only ever moves a red result later, never a green one earlier — but the
|
|
218
216
|
// diagnosis is genuinely worse in that one case.
|
|
@@ -220,9 +218,9 @@ function is_review_decision_decisive(snapshot: PrStateSnapshot): boolean {
|
|
|
220
218
|
return evaluate_pr_state(snapshot) !== 'pending'
|
|
221
219
|
}
|
|
222
220
|
|
|
223
|
-
// **Whether GitHub's auto-merge can never fire on this pull request
|
|
224
|
-
// narrower than the merge gate's `failure`: the gate also fails a red check outside the required list
|
|
225
|
-
//
|
|
221
|
+
// **Whether GitHub's auto-merge can never fire on this pull request**. This is
|
|
222
|
+
// narrower than the merge gate's `failure`: the gate also fails a red check outside the required list,
|
|
223
|
+
// but auto-merge waits only on the required ones, so such a pull request still
|
|
226
224
|
// lands — reading it as blocked would call a landing flush stuck.
|
|
227
225
|
function is_auto_merge_blocked(snapshot: PrStateSnapshot): boolean {
|
|
228
226
|
const failed_required = snapshot.rollup.filter(
|
|
@@ -238,7 +236,7 @@ function is_auto_merge_blocked(snapshot: PrStateSnapshot): boolean {
|
|
|
238
236
|
)
|
|
239
237
|
}
|
|
240
238
|
|
|
241
|
-
// A failed wait whose cause is a merge conflict
|
|
239
|
+
// A failed wait whose cause is a merge conflict, so `followup` names its last
|
|
242
240
|
// lap `conflict` rather than `interrupted` and the cause is read from the stage block, not looked up.
|
|
243
241
|
class PrConflictError extends Error {
|
|
244
242
|
override name = 'PrConflictError'
|
|
@@ -7,20 +7,19 @@ const CHECK_STATUS_FAIL = 'fail'
|
|
|
7
7
|
const CHECK_STATUS_MISSING = 'missing'
|
|
8
8
|
|
|
9
9
|
// GitHub reports a job whose `if:` condition was false as COMPLETED with conclusion `skipped`, and
|
|
10
|
-
// counts it as satisfied for branch protection —
|
|
11
|
-
//
|
|
12
|
-
//
|
|
13
|
-
// non-passing check is CodeRabbit's, so kit's own conditional jobs (`auto-merge`, `E2E`,
|
|
14
|
-
// `Notify Auto Tag`)
|
|
15
|
-
//
|
|
16
|
-
//
|
|
10
|
+
// counts it as satisfied for branch protection — a pull request reaches CLEAN with such jobs in its
|
|
11
|
+
// rollup. Recording them as `fail` would disagree with GitHub itself, and it would disable the
|
|
12
|
+
// CodeRabbit non-blocking exemption: `is_unstable_only_from_coderabbit` opens the gate only when
|
|
13
|
+
// every non-passing check is CodeRabbit's, so kit's own conditional jobs (`auto-merge`, `E2E`,
|
|
14
|
+
// `Notify Auto Tag`) would keep a slow review blocking the merge until the wait loop timed out. That
|
|
15
|
+
// is invisible on fast reviews, where CLEAN short-circuits the predicate — it surfaces only on the
|
|
16
|
+
// exact path the exemption exists to protect.
|
|
17
17
|
//
|
|
18
|
-
// `neutral` is here for the same reason `skipped` is
|
|
19
|
-
//
|
|
20
|
-
//
|
|
21
|
-
//
|
|
22
|
-
//
|
|
23
|
-
// nothing to report would kill a `followup` on a pull request GitHub considers mergeable.
|
|
18
|
+
// `neutral` is here for the same reason `skipped` is. GitHub's own rollup counts a neutral
|
|
19
|
+
// conclusion as satisfied, so such a pull request reports CLEAN and merges in the UI — reading it as
|
|
20
|
+
// `fail` would disagree with GitHub exactly as `skipped` would. Because a non-required failure ends
|
|
21
|
+
// the wait outright, a bot that emits `neutral` to say it has nothing to report would kill a
|
|
22
|
+
// `followup` on a pull request GitHub considers mergeable.
|
|
24
23
|
// `action_required` and `stale` stay out on purpose: GitHub does not count either as satisfied, and
|
|
25
24
|
// a wrongly-blocked run costs one re-run of `followup` while a wrongly-passed one ships code no gate
|
|
26
25
|
// ever cleared.
|
|
@@ -53,9 +52,8 @@ function read_string(value: unknown): string | undefined {
|
|
|
53
52
|
}
|
|
54
53
|
|
|
55
54
|
// `EXPECTED` is GitHub's state for a required status context that has not been posted yet, so it is
|
|
56
|
-
// a check still to come rather than one that failed. Reading it as `fail`
|
|
57
|
-
//
|
|
58
|
-
// legitimately progressing — the premature red exit kit#851 was filed to remove.
|
|
55
|
+
// a check still to come rather than one that failed. Reading it as `fail` would end the wait on the
|
|
56
|
+
// first poll of a run that is still legitimately progressing — a premature red exit.
|
|
59
57
|
const PENDING_STATUS_STATES = new Set(['pending', 'expected'])
|
|
60
58
|
|
|
61
59
|
function parse_status_context(item: RollupItemData): string {
|