@joshuafolkken/kit 1.1240.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 +19 -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 +26 -16
- package/.claude/skills/workflow-commands/latest-gate.md +17 -28
- 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/.vscode/tasks.json +14 -0
- package/CLAUDE.md +10 -61
- package/README.md +29 -47
- 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-KHGB5S3Y.js → chunk-43G45XJF.js} +18 -20
- package/dist/hooks/{chunk-4TZVB44A.js → chunk-4TW4MQUL.js} +284 -362
- package/dist/hooks/{chunk-XZYKEM6J.js → chunk-76RK6E3H.js} +13 -11
- package/dist/hooks/{chunk-F3ELQ2AF.js → chunk-DZWZ3DKY.js} +4 -4
- package/dist/hooks/{chunk-5VNDSNG3.js → chunk-FZ6FUSBM.js} +1 -1
- package/dist/hooks/{chunk-GPTFMK5E.js → chunk-GG72ANKI.js} +1 -1
- package/dist/hooks/{chunk-ZQGD4GBY.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-QVSWU24O.js → chunk-NZBHG6FW.js} +7 -5
- package/dist/hooks/chunk-NZN2UFI6.js +2409 -0
- package/dist/hooks/{chunk-KRBERBBI.js → chunk-R6CRQEAL.js} +4 -4
- package/dist/hooks/chunk-SYSRHRWU.js +1589 -0
- package/dist/hooks/{chunk-WK2XSHSI.js → chunk-TLJYAGZK.js} +549 -874
- 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 +216 -202
- 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 -187
- package/dist/josh.js +281 -94
- 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 +3 -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 +2 -2
- package/scripts/gate/core-budget.ts +15 -26
- package/scripts/gate/gate-ledger.ts +114 -0
- package/scripts/gate/gate-log.ts +7 -9
- package/scripts/gate/gate-plan.ts +70 -35
- package/scripts/gate/gate-report.ts +14 -15
- 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 +168 -30
- 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 +53 -51
- 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 +7 -7
- 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 +1 -1
- 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 +24 -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 +52 -15
- package/scripts/issue/issue-file-fold.ts +155 -0
- package/scripts/issue/issue-file.ts +9 -6
- package/scripts/issue/issue-fold-cli.ts +14 -9
- package/scripts/issue/issue-fold.ts +23 -8
- package/scripts/issue/issue-labels.ts +34 -38
- 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 +17 -7
- package/scripts/issue/issue-release.ts +3 -3
- 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 +30 -35
- 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 +25 -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 +4 -5
- package/scripts/josh/josh-commands-lane.ts +14 -4
- package/scripts/josh/josh-commands-lint.ts +1 -1
- 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 +6 -7
- 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 +12 -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 +2 -2
- 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 +20 -19
- package/scripts/lane/lane-output.ts +4 -3
- package/scripts/lane/lane-paths.ts +12 -11
- package/scripts/lane/lane-phase.ts +33 -0
- package/scripts/lane/lane-reap.ts +2 -2
- package/scripts/lane/lane-registry.ts +16 -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 +1 -1
- 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-runs.ts +1 -1
- 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 +54 -36
- 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 +9 -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 +171 -46
- 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 +58 -47
- 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 -32
- package/scripts/run/wake/run-wake-describe.ts +24 -28
- 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 +9 -9
- 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 -279
- 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 +26 -26
- 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/dist/hooks/chunk-KHX4U3BG.js +0 -6400
- 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
|
@@ -16,18 +16,18 @@ import {
|
|
|
16
16
|
type RollupCheck,
|
|
17
17
|
} from './git-pr-checks-parse'
|
|
18
18
|
|
|
19
|
-
// The bounded look at a pull request's checks that `gh pr checks <branch> --watch`
|
|
19
|
+
// The bounded look at a pull request's checks that `gh pr checks <branch> --watch` gives.
|
|
20
20
|
//
|
|
21
21
|
// **`--watch` is a streaming call and REST has no counterpart** — it holds the connection open and
|
|
22
|
-
// redraws a table as each check settles, which no sequence of `gh api` requests reproduces
|
|
23
|
-
//
|
|
22
|
+
// redraws a table as each check settles, which no sequence of `gh api` requests reproduces.
|
|
23
|
+
// What it is *used* for does have one: `git-pr-followup.ts` discards its
|
|
24
24
|
// result entirely, so the answer its one caller needs is "did the checks settle within two minutes",
|
|
25
25
|
// which the poll loop in `git-pr-checks.ts` already computes. No new loop is written here; this is
|
|
26
|
-
// that loop with a two-minute budget
|
|
26
|
+
// that loop with a two-minute budget.
|
|
27
27
|
//
|
|
28
|
-
// **`git-pr.ts`
|
|
29
|
-
//
|
|
30
|
-
//
|
|
28
|
+
// **`git-pr.ts` does not call this.** It would read only `timed_out`, and `followup` restarts the
|
|
29
|
+
// same wait the moment it returns — the same answer waited for twice — so `pnpm josh git` returns as
|
|
30
|
+
// soon as the pull request is open.
|
|
31
31
|
//
|
|
32
32
|
// **What is lost is the live table.** `gh` printed each check's name and state as it changed; the
|
|
33
33
|
// poll prints `Checking PR status… (n/N)` instead. The trade is accepted because the display was
|
|
@@ -49,12 +49,12 @@ interface WatchResult {
|
|
|
49
49
|
|
|
50
50
|
// **The watch asks a weaker question than the merge gate, and that difference is load-bearing.**
|
|
51
51
|
// `evaluate_pr_state` answers `success` only for a pull request that is *mergeable*: `CLEAN` merge
|
|
52
|
-
// state, every required check green, no change request standing. `gh pr checks --watch`
|
|
53
|
-
// about any of that — it
|
|
52
|
+
// state, every required check green, no change request standing. `gh pr checks --watch` knows
|
|
53
|
+
// nothing about any of that — it waits for the checks and exits non-zero if one fails. Handing the watch
|
|
54
54
|
// the merge gate's verdict would break it on a repository that requires an approving review, where
|
|
55
55
|
// `mergeable_state` is `blocked`: the watch could never succeed, so it would report "CI still
|
|
56
56
|
// running" over a green build, and a standing change request would end it non-zero on something the
|
|
57
|
-
//
|
|
57
|
+
// `--watch` ignores outright.
|
|
58
58
|
//
|
|
59
59
|
// **An empty rollup is `pending`, not `failure`** — deliberately, and it is the one place the watch
|
|
60
60
|
// answers differently on the first poll than at the end. `followup` starts this right after the
|
|
@@ -62,12 +62,12 @@ interface WatchResult {
|
|
|
62
62
|
// there would end the run red on a perfectly healthy one. Whether the branch really has no checks is
|
|
63
63
|
// asked once, after the budget runs out — see `pr_checks_watch`.
|
|
64
64
|
|
|
65
|
-
// Temporary
|
|
65
|
+
// Temporary: CodeRabbit blocks nothing end to end, so a look-ahead that waits on it waits
|
|
66
66
|
// for something no verdict downstream reads. Its commit status posts `Review queued` within seconds
|
|
67
|
-
// of the pull request opening and stays pending for the whole review
|
|
68
|
-
//
|
|
69
|
-
//
|
|
70
|
-
//
|
|
67
|
+
// of the pull request opening and stays pending for the whole review, often well past the budget —
|
|
68
|
+
// so counting it as pending would spend the entire two-minute budget on **every** run and end in the
|
|
69
|
+
// timeout note, before the merge gate merges anyway under the CodeRabbit non-blocking exemption.
|
|
70
|
+
// The name comes from `is_coderabbit_check`, the one predicate the merge
|
|
71
71
|
// gate's exemption is also written in terms of, so the two cannot drift apart.
|
|
72
72
|
//
|
|
73
73
|
// **Only the *pending* reading is dropped.** A CodeRabbit check that has already failed still makes
|
|
@@ -114,7 +114,7 @@ function describe_checks_failure(snapshot: PrStateSnapshot): string {
|
|
|
114
114
|
|
|
115
115
|
// **The watch never reads `review_decision`**, so the poll must not spend a request fetching it. It
|
|
116
116
|
// is the same difference `evaluate_checks_settled` is written for, said to the fetcher instead of to
|
|
117
|
-
// the verdict: three requests a poll rather than four
|
|
117
|
+
// the verdict: three requests a poll rather than four.
|
|
118
118
|
function should_never_read_review_decision(): boolean {
|
|
119
119
|
return false
|
|
120
120
|
}
|
|
@@ -141,7 +141,7 @@ async function watch_until_settled(branch_name: string): Promise<void> {
|
|
|
141
141
|
|
|
142
142
|
// `gh pr checks` exited non-zero for a branch with no checks at all just as it did for a failed one,
|
|
143
143
|
// and `git-pr-followup.ts` relies on that to fail rather than spend its whole 32-minute budget on a
|
|
144
|
-
// required check that is *missing* rather than pending
|
|
144
|
+
// required check that is *missing* rather than pending. Asking after the
|
|
145
145
|
// budget rather than on every poll is what keeps a pull request whose checks have not registered yet
|
|
146
146
|
// from failing on the first read: two minutes is the grace, and an empty rollup at the end of them
|
|
147
147
|
// is the answer `gh` gave immediately.
|
|
@@ -24,9 +24,9 @@ const CHECK_WAIT_INTERVAL_MS = 10_000
|
|
|
24
24
|
// needs (2), so 27 minutes is the longest run that workflow permits, and five minutes of
|
|
25
25
|
// runner-queue headroom goes on top. A unit test walks the `needs` graph of the distributed
|
|
26
26
|
// workflows and fails if any declared budget outgrows this value; a job that declares no cap is a
|
|
27
|
-
// gap the number cannot promise to cover rather than a reason to inflate it. Waiting longer costs
|
|
28
|
-
// soon as the checks settle, and a failed check throws
|
|
29
|
-
//
|
|
27
|
+
// gap the number cannot promise to cover rather than a reason to inflate it. Waiting longer costs
|
|
28
|
+
// nothing on a fast project: polling returns as soon as the checks settle, and a failed check throws
|
|
29
|
+
// immediately rather than waiting out the budget.
|
|
30
30
|
const DEFAULT_TIMEOUT_SECONDS = 1920
|
|
31
31
|
|
|
32
32
|
// The poll loop sleeps between attempts and not after the last one, so spanning a budget takes one
|
|
@@ -51,14 +51,13 @@ const DEFAULT_STABLE_READS = 2
|
|
|
51
51
|
// One authoritative gate poll is enough once `pr_checks_watch` has already seen every check finish:
|
|
52
52
|
// the watch is the first confirmation, so the poll that follows need only agree once. The two reads
|
|
53
53
|
// exist for the pending→settled window a bare poll opens on, and the watch has itself already spanned
|
|
54
|
-
// that window — so waiting a second interval after it merely re-proves what the watch established
|
|
55
|
-
// (joshuafolkken/kit#2029).
|
|
54
|
+
// that window — so waiting a second interval after it merely re-proves what the watch established.
|
|
56
55
|
const WATCH_CONFIRMED_STABLE_READS = 1
|
|
57
56
|
|
|
58
57
|
// **A read that failed is not a verdict.** The loop reads every ten seconds, so a dropped connection,
|
|
59
58
|
// a rate limit or one request over its budget is the kind of failure the *next* poll answers — and
|
|
60
|
-
// ending a 32-minute wait on one of them costs the whole run again
|
|
61
|
-
//
|
|
59
|
+
// ending a 32-minute wait on one of them costs the whole run again, so the fetch catches them rather
|
|
60
|
+
// than rejecting straight out of the loop.
|
|
62
61
|
//
|
|
63
62
|
// **The cap is what keeps "ask again" from becoming "wait out the budget in silence".** Three
|
|
64
63
|
// consecutive failures and the wait ends carrying the failure that caused it, so an endpoint that has
|
|
@@ -68,12 +67,12 @@ const WATCH_CONFIRMED_STABLE_READS = 1
|
|
|
68
67
|
//
|
|
69
68
|
// **The loop's own budget is unchanged**, so nothing here can extend a wait: a fetch that never
|
|
70
69
|
// succeeds still runs out of attempts. And a failed read never counts as a passing one — it resets
|
|
71
|
-
// the stable-read window,
|
|
70
|
+
// the stable-read window, so an unread state is never taken as a settled answer.
|
|
72
71
|
const MAX_CONSECUTIVE_READ_FAILURES = 3
|
|
73
72
|
|
|
74
73
|
// The wait's own timeout, named so a caller can tell it apart from a failing check. The bounded
|
|
75
74
|
// watch in `git-pr-checks-watch.ts` answers `timed_out` for one and rethrows the other, and matching
|
|
76
|
-
// on prose is the only distinction the loop offers
|
|
75
|
+
// on prose is the only distinction the loop offers.
|
|
77
76
|
const PR_CHECKS_TIMEOUT_MESSAGE = 'Timed out while waiting for PR checks to complete.'
|
|
78
77
|
|
|
79
78
|
function is_pr_checks_timeout(error: unknown): boolean {
|
|
@@ -82,11 +81,10 @@ function is_pr_checks_timeout(error: unknown): boolean {
|
|
|
82
81
|
|
|
83
82
|
// Whether this poll has to read the review listing, asked of the snapshot *without* one. It is a
|
|
84
83
|
// question about the current poll rather than a cache key: answering `false` skips one request now
|
|
85
|
-
// and nothing is carried into the next poll
|
|
84
|
+
// and nothing is carried into the next poll.
|
|
86
85
|
type ReviewDecisionPredicate = (snapshot: PrStateSnapshot) => boolean
|
|
87
86
|
|
|
88
|
-
// The conservative answer, and the one every evaluator that does not say gets: read it every poll
|
|
89
|
-
// which is what all of them did before the predicate existed.
|
|
87
|
+
// The conservative answer, and the one every evaluator that does not say gets: read it every poll.
|
|
90
88
|
function should_always_read_review_decision(): boolean {
|
|
91
89
|
return true
|
|
92
90
|
}
|
|
@@ -98,12 +96,12 @@ type PrStateFetcher = (
|
|
|
98
96
|
|
|
99
97
|
// What the loop asks of each snapshot, and what it says when the answer is `failure`.
|
|
100
98
|
//
|
|
101
|
-
// The
|
|
102
|
-
//
|
|
103
|
-
//
|
|
104
|
-
//
|
|
105
|
-
//
|
|
106
|
-
//
|
|
99
|
+
// The merge gate's own verdict is the strictest question anyone asks of a pull request: mergeable
|
|
100
|
+
// *and* every required check green *and* no change request standing. `gh pr checks --watch` asks a
|
|
101
|
+
// much weaker one — have the checks finished? Hard-coding the strict verdict in the loop would hand
|
|
102
|
+
// it to the watch too: on a repository whose `mergeable_state` is `blocked`, the watch could never
|
|
103
|
+
// succeed, and a standing change request would make it *throw*. Naming the question is what keeps
|
|
104
|
+
// the two apart.
|
|
107
105
|
//
|
|
108
106
|
// **`should_read_review_decision` is part of the same question.** An evaluator that never reads
|
|
109
107
|
// `review_decision` must not make the fetcher pay for it, and one that does must get a value read in
|
|
@@ -190,7 +188,7 @@ interface PollAttemptResult {
|
|
|
190
188
|
|
|
191
189
|
// The two things one poll can come back with, kept apart so that only the *read* is retried. The
|
|
192
190
|
// throw `classify_poll_result` raises on a `failure` verdict is an answer — the checks are red — and
|
|
193
|
-
// retrying it would undo the fast fail
|
|
191
|
+
// retrying it would undo the fast fail on a red check.
|
|
194
192
|
type SnapshotRead =
|
|
195
193
|
{ kind: 'read'; snapshot: PrStateSnapshot } | { kind: 'unreadable'; cause: unknown }
|
|
196
194
|
|
|
@@ -289,14 +287,13 @@ async function wait_for_pr_success(options: WaitForPrSuccessOptions): Promise<Pr
|
|
|
289
287
|
}
|
|
290
288
|
|
|
291
289
|
// The snapshot module rather than `git-gh-command`, which is deliberate: `git-gh-command` also
|
|
292
|
-
// exposes the watch, and the watch now polls through this file
|
|
290
|
+
// exposes the watch, and the watch now polls through this file. Naming the
|
|
293
291
|
// one read it actually needs keeps that from closing into an import cycle.
|
|
294
292
|
//
|
|
295
293
|
// **Three requests, and a fourth only where it can change the answer.** The pull request detail and
|
|
296
294
|
// the two commit listings are read every poll because `mergeable_state` and the rollup both move
|
|
297
295
|
// while CI runs; the review listing is read when the predicate says this poll's verdict turns on it.
|
|
298
|
-
// A `followup` that waits out its whole 32-minute budget went from about 800 requests to about 600
|
|
299
|
-
// (joshuafolkken/kit#1043).
|
|
296
|
+
// A `followup` that waits out its whole 32-minute budget went from about 800 requests to about 600.
|
|
300
297
|
async function default_fetch_pr_state(
|
|
301
298
|
branch_name: string,
|
|
302
299
|
should_read_review_decision: ReviewDecisionPredicate = should_always_read_review_decision,
|
|
@@ -327,7 +324,7 @@ async function wait_for_pr_success_default(
|
|
|
327
324
|
})
|
|
328
325
|
}
|
|
329
326
|
|
|
330
|
-
// Where a pull request GitHub merges on its own stands
|
|
327
|
+
// Where a pull request GitHub merges on its own stands. `failed` is what
|
|
331
328
|
// auto-merge never fires under — a red required check, a conflict, a requested change — so a wait on
|
|
332
329
|
// it ends now rather than at the budget; a red check outside the required list is not among them
|
|
333
330
|
// (`is_auto_merge_blocked`). A read that failed answers `waiting`, so a poll asks again.
|
|
@@ -20,7 +20,7 @@ interface PullComment {
|
|
|
20
20
|
}
|
|
21
21
|
|
|
22
22
|
// `undefined` when the listing could not be read, which is not the same as a pull request with no
|
|
23
|
-
// line comments
|
|
23
|
+
// line comments.
|
|
24
24
|
function parse_pull_comments(raw_json: string | undefined): Array<PullComment> | undefined {
|
|
25
25
|
if (raw_json === undefined) return undefined
|
|
26
26
|
|
|
@@ -58,13 +58,14 @@ function log_unresolved_coderabbit(urls: ReadonlyArray<string>): void {
|
|
|
58
58
|
}
|
|
59
59
|
}
|
|
60
60
|
|
|
61
|
-
// Temporary
|
|
61
|
+
// Temporary: unresolved CodeRabbit line comments do not block the merge. They are
|
|
62
62
|
// logged, returned as audit notes for the completion notification, and — when an ignore reason is
|
|
63
|
-
// supplied — still documented on the PR. Revert together with
|
|
63
|
+
// supplied — still documented on the PR. Revert together with the rest of the temporary CodeRabbit
|
|
64
|
+
// non-blocking policy.
|
|
64
65
|
// Unreadable is reported, never blocked — the opposite of the AI review gate's handling of the same
|
|
65
|
-
// gap, and for the
|
|
66
|
+
// gap, and for the policy's own reason: CodeRabbit does not block the merge at all right now, so an
|
|
66
67
|
// unreadable CodeRabbit listing cannot either. What it must not do is pass as "nothing unresolved",
|
|
67
|
-
// which is what
|
|
68
|
+
// which is what reading it as `'[]'` would make of it.
|
|
68
69
|
const UNREADABLE_CR_NOTE =
|
|
69
70
|
'CodeRabbit line comments could not be read; unresolved findings were not checked (kit#753).'
|
|
70
71
|
|
|
@@ -87,7 +88,8 @@ async function report_unreadable_cr(input: {
|
|
|
87
88
|
}
|
|
88
89
|
|
|
89
90
|
// Documented on the pull request when a reason was given, logged when it was not. Either way the
|
|
90
|
-
// finding is recorded rather than dropped —
|
|
91
|
+
// finding is recorded rather than dropped — the non-blocking policy removes the block, not the
|
|
92
|
+
// audit trail.
|
|
91
93
|
async function record_unresolved_cr(input: {
|
|
92
94
|
branch_name: string
|
|
93
95
|
ignore_reason: string | undefined
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { telegram_notify, type TelegramSendInput } from '#scripts/notify/telegram-notify'
|
|
2
2
|
|
|
3
|
-
// What to type when the confirmation notification itself could not be delivered
|
|
4
|
-
//
|
|
3
|
+
// What to type when the confirmation notification itself could not be delivered.
|
|
4
|
+
// The `--body-file` spelling rather than `--body`, because the body names
|
|
5
5
|
// commands and a backtick inside shell double quotes is evaluated before the command runs.
|
|
6
6
|
const CONFIRMATION_RECOVERY =
|
|
7
7
|
'send it by hand — `pnpm josh notify --task-type confirmation --issue-url <url> ' +
|
|
@@ -28,7 +28,7 @@ function build_confirmation_input(input: {
|
|
|
28
28
|
}
|
|
29
29
|
}
|
|
30
30
|
|
|
31
|
-
// **The tolerant send
|
|
31
|
+
// **The tolerant send**. What stops the run is the blocker this
|
|
32
32
|
// notification is *about*, and it is raised by the caller — so a failed send must not replace that
|
|
33
33
|
// diagnosis with a Telegram error. It is reported and the caller's own stop still happens.
|
|
34
34
|
//
|
|
@@ -47,8 +47,8 @@ function has_ignore_reason(reason: string | undefined): reason is string {
|
|
|
47
47
|
return reason !== undefined && reason.trim().length > 0
|
|
48
48
|
}
|
|
49
49
|
|
|
50
|
-
// Shared by every `followup` gate that can stop the run — the AI review scan and
|
|
51
|
-
//
|
|
50
|
+
// Shared by every `followup` gate that can stop the run — the AI review scan and the managed
|
|
51
|
+
// config-file gate. They ask the same two questions (was a reason
|
|
52
52
|
// given, and how is the confirmation sent), and a second copy of either answer is what lets the two
|
|
53
53
|
// gates drift apart.
|
|
54
54
|
const git_pr_confirmation = {
|
|
@@ -27,18 +27,16 @@ function build_report(hits: ReadonlyArray<ManagedHit>): Array<string> {
|
|
|
27
27
|
return [REPORT_HEADING, REPORT_PATHS_HEADING, managed_config_scope.format_hits(hits)]
|
|
28
28
|
}
|
|
29
29
|
|
|
30
|
-
// **This reports; it does not stop the merge
|
|
31
|
-
//
|
|
32
|
-
//
|
|
33
|
-
//
|
|
34
|
-
//
|
|
35
|
-
// both the distributed file was what the Issue's own acceptance criteria had ordered changed. The
|
|
36
|
-
// gate was not catching an unintended edit; it was stopping the work.
|
|
30
|
+
// **This reports; it does not stop the merge**. In kit the condition it tests is nearly always
|
|
31
|
+
// true: kit is the distribution source, so every change to `CLAUDE.md`, to `prompts/`, to
|
|
32
|
+
// `.claude/skills/` or to the distributed part of `docs/` is by definition a change to a distributed
|
|
33
|
+
// path, usually one the Issue's own acceptance criteria ordered changed. A gate that exits non-zero
|
|
34
|
+
// here would not catch an unintended edit; it would stop the work.
|
|
37
35
|
//
|
|
38
36
|
// **There is deliberately no branch on which repository this is.** The alternative — stop in a
|
|
39
37
|
// consumer, where editing a distributed file really is the mistake `CLAUDE.md` → "Route
|
|
40
|
-
// distributed-doc / config changes upstream to kit" names, and stay quiet in kit —
|
|
41
|
-
//
|
|
38
|
+
// distributed-doc / config changes upstream to kit" names, and stay quiet in kit — is rejected: it
|
|
39
|
+
// needs a distribution-source test this package does not have,
|
|
42
40
|
// no case is recorded of the gate saving a consumer's work, and the report below reaches a consumer's
|
|
43
41
|
// reader just as well. `managed_config_scope` matches both ends of every mapping and distinguishes no
|
|
44
42
|
// repository, and that property is kept rather than worked around.
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// What `pnpm josh git` prints once the pull request is open. It no longer claims anything about the
|
|
2
|
-
// checks: this command returns before they have run
|
|
2
|
+
// checks: this command returns before they have run, and the old
|
|
3
3
|
// "All checks passed successfully." was printed on the strength of a watch whose verdict decided
|
|
4
4
|
// nothing. Naming `pnpm josh followup` here is the whole replacement — it is what waits, and what
|
|
5
5
|
// merges.
|
package/scripts/gh/git-pr.ts
CHANGED
|
@@ -1,14 +1,17 @@
|
|
|
1
1
|
import { pr_classification, type ReleaseClassification } from '#scripts/ci/pr-classification'
|
|
2
2
|
import type { IssueInfo } from '#scripts/git/git-issue'
|
|
3
3
|
import { pr_info_schema } from '#scripts/git/git-schemas'
|
|
4
|
+
import { issue_cite } from '#scripts/issue/issue-cite'
|
|
5
|
+
import { session_cite } from '#scripts/issue/session-cite'
|
|
4
6
|
import { animation_helpers, type AnimationOptions } from '#scripts/lib/animation-helpers'
|
|
7
|
+
import { json_value } from '#scripts/lib/json-value'
|
|
5
8
|
import { git_gh_command } from './git-gh-command'
|
|
6
9
|
import { git_pr_error } from './git-pr-error'
|
|
7
10
|
import { git_pr_messages } from './git-pr-messages'
|
|
8
11
|
|
|
9
12
|
// **Answers the new pull request's URL, and `undefined` when one already existed.** `pr_create`
|
|
10
13
|
// filters its REST response to `.html_url`, so the address is in hand the moment the call returns —
|
|
11
|
-
// which matters now that nothing waits before reporting it
|
|
14
|
+
// which matters now that nothing waits before reporting it. `pr_get_url`
|
|
12
15
|
// resolves the branch through the `?head=…` listing, and that listing is eventually consistent: read
|
|
13
16
|
// in the same instant the pull request was created it can answer nothing, and `pr_get_url` folds
|
|
14
17
|
// "not there yet" and "the read failed" into the same `undefined`. The five-second sleep used to
|
|
@@ -49,8 +52,8 @@ async function display_pr_url_if_available(branch_name: string): Promise<void> {
|
|
|
49
52
|
}
|
|
50
53
|
}
|
|
51
54
|
|
|
52
|
-
// **This command stops at "the pull request is open"; it does not wait for the checks
|
|
53
|
-
//
|
|
55
|
+
// **This command stops at "the pull request is open"; it does not wait for the checks**.
|
|
56
|
+
// It used to sleep five seconds and then watch the rollup on a two-minute
|
|
54
57
|
// budget — measured at 119.8 seconds of one 1555-second run, 7.7% of it — and the answer decided
|
|
55
58
|
// nothing: only `timed_out` was read, and only to pick which message to print. What actually blocks
|
|
56
59
|
// a merge is `pnpm josh followup`, whose `wait_for_pr_success` asks a stricter question (CLEAN merge
|
|
@@ -89,17 +92,11 @@ async function create_and_report(
|
|
|
89
92
|
}
|
|
90
93
|
|
|
91
94
|
function parse_pr_state(pr_info_json: string): string | undefined {
|
|
92
|
-
|
|
93
|
-
const result = pr_info_schema.safeParse(JSON.parse(pr_info_json))
|
|
94
|
-
|
|
95
|
-
return result.success ? result.data.state : undefined
|
|
96
|
-
} catch {
|
|
97
|
-
return undefined
|
|
98
|
-
}
|
|
95
|
+
return json_value.parse_with(pr_info_json, pr_info_schema)?.state
|
|
99
96
|
}
|
|
100
97
|
|
|
101
98
|
// A read that failed throws rather than answering `undefined`: "no state" is read as "not merged",
|
|
102
|
-
// which would write onto a pull request that already merged
|
|
99
|
+
// which would write onto a pull request that already merged.
|
|
103
100
|
async function get_pr_state(branch_name: string): Promise<string | undefined> {
|
|
104
101
|
const pr_info_json = await git_gh_command.pr_view(branch_name)
|
|
105
102
|
|
|
@@ -113,7 +110,7 @@ function is_pr_state_merged(pr_state: string | undefined): boolean {
|
|
|
113
110
|
}
|
|
114
111
|
|
|
115
112
|
// A body the caller supplied is written onto the pull request that is already open, rather than
|
|
116
|
-
// dropped with the create that did not happen
|
|
113
|
+
// dropped with the create that did not happen: a rerun carrying the
|
|
117
114
|
// live-execution evidence is how a merge `followup` refused for lacking it is recovered.
|
|
118
115
|
async function report_existing_pr(
|
|
119
116
|
body: string,
|
|
@@ -164,11 +161,11 @@ async function create(
|
|
|
164
161
|
}
|
|
165
162
|
|
|
166
163
|
function build_title(issue_info: IssueInfo): string {
|
|
167
|
-
return `${issue_info.title}
|
|
164
|
+
return `${issue_info.title} ${issue_cite.plain(issue_info.number)}`
|
|
168
165
|
}
|
|
169
166
|
|
|
170
167
|
function build_body(issue_info: IssueInfo, extra_body?: string): string {
|
|
171
|
-
const closes = `closes
|
|
168
|
+
const closes = `closes ${issue_cite.plain(issue_info.number)}`
|
|
172
169
|
|
|
173
170
|
if (extra_body === undefined) return closes
|
|
174
171
|
|
|
@@ -199,7 +196,7 @@ async function create_for_issue(
|
|
|
199
196
|
}
|
|
200
197
|
|
|
201
198
|
// The label the pull request is opened with — also asked by `git-preflight.ts` before the commit, so
|
|
202
|
-
// a missing classification is reported beside the other unmet preconditions
|
|
199
|
+
// a missing classification is reported beside the other unmet preconditions.
|
|
203
200
|
async function release_classification(
|
|
204
201
|
issue_number: string,
|
|
205
202
|
branch_name: string,
|
|
@@ -211,7 +208,9 @@ async function release_classification(
|
|
|
211
208
|
const issue_json = await git_gh_command.issue_view_json(issue_number, 'labels,body')
|
|
212
209
|
|
|
213
210
|
if (issue_json === undefined) {
|
|
214
|
-
throw new Error(
|
|
211
|
+
throw new Error(
|
|
212
|
+
`Could not read issue ${session_cite.issue(issue_number)} for release classification`,
|
|
213
|
+
)
|
|
215
214
|
}
|
|
216
215
|
|
|
217
216
|
return pr_classification.select_issue_classification(issue_json)
|
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
// Reading a GitHub issue or pull-request URL as an identity: which repository it is in, and which
|
|
2
2
|
// number. `josh notify` resolves the repository a notification is *about* this way, because the
|
|
3
3
|
// working directory answers a different question — which repository the session happens to be
|
|
4
|
-
// running in
|
|
5
|
-
//
|
|
6
|
-
//
|
|
7
|
-
// here rather than beside it.
|
|
4
|
+
// running in; reading it instead would file a notification about another repository under this
|
|
5
|
+
// repository's name. Both the issue and the pull-request form live here, so a notification carrying
|
|
6
|
+
// only a pull-request URL resolves the same way.
|
|
8
7
|
//
|
|
9
8
|
// Two other modules read a URL for something narrower and keep their own patterns. `epic-parse`
|
|
10
9
|
// scans an epic body for task-list rows, so its regex is anchored to the row marker and runs
|
|
@@ -21,9 +20,9 @@ const REPOSITORY_SOURCE = `^${GITHUB_URL_PREFIX_SOURCE}([^/]+)/([^/]+)`
|
|
|
21
20
|
// caller's fallback is the working directory, which is a visibly wrong answer rather than a
|
|
22
21
|
// plausible one. A trailing `#anchor` or `?query` still parses, since neither is a word character.
|
|
23
22
|
const ISSUE_URL_PATTERN = new RegExp(String.raw`${REPOSITORY_SOURCE}/issues/(\d+)\b`, 'u')
|
|
24
|
-
// The same shape for a pull request
|
|
25
|
-
//
|
|
26
|
-
//
|
|
23
|
+
// The same shape for a pull request, not anchored to the end of the string: reading
|
|
24
|
+
// `.../pull/12/files` yields the repository it names instead of nothing, which is the better answer
|
|
25
|
+
// for every caller.
|
|
27
26
|
const PULL_URL_PATTERN = new RegExp(String.raw`${REPOSITORY_SOURCE}/pull/(\d+)\b`, 'u')
|
|
28
27
|
|
|
29
28
|
// What both forms answer: which repository the URL names.
|
|
@@ -40,7 +39,7 @@ interface RepoIdentity {
|
|
|
40
39
|
// The two forms carry their number under different names on purpose. A pull target is then not
|
|
41
40
|
// assignable where an issue target is expected, so handing a PR number to a reader that asks the
|
|
42
41
|
// issue endpoint is a compile error rather than a notification carrying an unrelated issue's title
|
|
43
|
-
// — the
|
|
42
|
+
// — the mismatch class this module exists to close.
|
|
44
43
|
interface IssueUrlTarget extends RepoIdentity {
|
|
45
44
|
issue_number: string
|
|
46
45
|
}
|
|
@@ -91,7 +90,7 @@ function parse(issue_url: string | undefined): IssueUrlTarget | undefined {
|
|
|
91
90
|
|
|
92
91
|
// A pull-request URL names the same repository an issue URL does. `josh notify` reads it when it was
|
|
93
92
|
// given no `--issue-url`, so a completion notification carrying only a PR link stops being filed
|
|
94
|
-
// under the working directory's repository
|
|
93
|
+
// under the working directory's repository.
|
|
95
94
|
function parse_pull(pull_url: string | undefined): PullUrlTarget | undefined {
|
|
96
95
|
const parsed = parse_with(PULL_URL_PATTERN, pull_url)
|
|
97
96
|
if (parsed === undefined) return undefined
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { mkdtemp, rm, symlink } from 'node:fs/promises'
|
|
2
|
+
import { tmpdir } from 'node:os'
|
|
3
|
+
import path from 'node:path'
|
|
4
|
+
import { git_worktree } from './git-worktree'
|
|
5
|
+
|
|
6
|
+
// A throwaway tree at one commit, for a command that has to run something on a tree other than the
|
|
7
|
+
// caller's — `josh test:red` runs the new tests on the merge-base, `josh metrics` measures it.
|
|
8
|
+
//
|
|
9
|
+
// **It is a detached worktree, never the caller's checkout**: the caller's tree and index are neither
|
|
10
|
+
// read back nor written. The worktree borrows this checkout's `node_modules` through a symlink rather
|
|
11
|
+
// than installing its own: what is asked about is the source at that commit, and an install would add
|
|
12
|
+
// seconds and a network dependency to every run.
|
|
13
|
+
|
|
14
|
+
const TREE_NAME = 'tree'
|
|
15
|
+
const NODE_MODULES = 'node_modules'
|
|
16
|
+
|
|
17
|
+
interface BaseTree {
|
|
18
|
+
// The temp directory holding the tree — a file written here sits beside the tree, never in it.
|
|
19
|
+
parent: string
|
|
20
|
+
tree: string
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
async function prepare(tree: string, commit: string): Promise<void> {
|
|
24
|
+
await git_worktree.worktree_add_detached(tree, commit)
|
|
25
|
+
await symlink(path.resolve(NODE_MODULES), path.join(tree, NODE_MODULES), 'dir')
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// Best effort: a removal that fails leaves a registration `worktree prune` drops once the directory is
|
|
29
|
+
// gone, so the cleanup never replaces the caller's answer with its own error.
|
|
30
|
+
async function remove(base_tree: BaseTree): Promise<void> {
|
|
31
|
+
try {
|
|
32
|
+
await git_worktree.worktree_remove(base_tree.tree)
|
|
33
|
+
} catch {
|
|
34
|
+
// The directory is deleted below and the prune drops the stale registration.
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
await rm(base_tree.parent, { force: true, recursive: true })
|
|
38
|
+
|
|
39
|
+
try {
|
|
40
|
+
await git_worktree.worktree_prune()
|
|
41
|
+
} catch {
|
|
42
|
+
// A failed prune leaves a stale registration the next prune drops; the answer stands.
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
async function with_tree<T>(
|
|
47
|
+
prefix: string,
|
|
48
|
+
commit: string,
|
|
49
|
+
use: (base_tree: BaseTree) => Promise<T>,
|
|
50
|
+
): Promise<T> {
|
|
51
|
+
const parent = await mkdtemp(path.join(tmpdir(), prefix))
|
|
52
|
+
const base_tree = { parent, tree: path.join(parent, TREE_NAME) }
|
|
53
|
+
|
|
54
|
+
try {
|
|
55
|
+
await prepare(base_tree.tree, commit)
|
|
56
|
+
|
|
57
|
+
return await use(base_tree)
|
|
58
|
+
} finally {
|
|
59
|
+
await remove(base_tree)
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
const base_tree = { NODE_MODULES, with_tree }
|
|
64
|
+
|
|
65
|
+
export type { BaseTree }
|
|
66
|
+
export { base_tree }
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { git_command } from './git-command'
|
|
2
|
+
import { git_spawn } from './git-spawn'
|
|
2
3
|
|
|
3
|
-
// **The change base as a commit, or nothing — never a ref name
|
|
4
|
+
// **The change base as a commit, or nothing — never a ref name**.
|
|
4
5
|
//
|
|
5
6
|
// `git_command.change_base` degrades to the default-branch *name* when `merge-base` cannot answer,
|
|
6
7
|
// and a name moves. Any reader that stores one reading and compares it against a later one — the
|
|
@@ -21,6 +22,45 @@ async function resolved(): Promise<string | undefined> {
|
|
|
21
22
|
}
|
|
22
23
|
}
|
|
23
24
|
|
|
24
|
-
const
|
|
25
|
+
const MERGE_BASE_COMMAND = 'merge-base'
|
|
26
|
+
const MERGE_HEAD = 'MERGE_HEAD'
|
|
27
|
+
const LINE_BREAK = '\n'
|
|
28
|
+
|
|
29
|
+
// Where the side a merge in progress brings in left the default branch — `undefined` where no merge
|
|
30
|
+
// is in progress, which is every ordinary run.
|
|
31
|
+
async function incoming_base(): Promise<string | undefined> {
|
|
32
|
+
try {
|
|
33
|
+
const reference = await git_command.default_branch_reference()
|
|
34
|
+
|
|
35
|
+
return await git_spawn.read([MERGE_BASE_COMMAND, reference, MERGE_HEAD])
|
|
36
|
+
} catch {
|
|
37
|
+
return undefined
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// `--independent` drops every commit another one listed reaches, so of two commits on the default
|
|
42
|
+
// branch's history it keeps the later.
|
|
43
|
+
async function later_of(base: string, incoming: string): Promise<string> {
|
|
44
|
+
const kept = await git_spawn.read([MERGE_BASE_COMMAND, '--independent', base, incoming])
|
|
45
|
+
const [later = base] = kept.split(LINE_BREAK)
|
|
46
|
+
|
|
47
|
+
return later
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// **The base of the tree, not of `HEAD`, while a merge is in progress.** A merge of the default
|
|
51
|
+
// branch that stopped on a conflict has already put the default branch's files in the work tree, but
|
|
52
|
+
// `HEAD` is still the commit before it — so `resolved` answers the old merge-base and everything the
|
|
53
|
+
// default branch brought in reads as this branch's own change. The commit the merge is about to make
|
|
54
|
+
// has both parents, and its merge-base is the later of theirs; that is the commit a reader measuring
|
|
55
|
+
// the *tree* has to hold it to, and the one `resolved` answers by itself once the merge is committed.
|
|
56
|
+
async function resolved_through_merge(): Promise<string | undefined> {
|
|
57
|
+
const [base, incoming] = await Promise.all([resolved(), incoming_base()])
|
|
58
|
+
|
|
59
|
+
if (base === undefined || incoming === undefined) return base
|
|
60
|
+
|
|
61
|
+
return await later_of(base, incoming)
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
const change_base = { resolved, resolved_through_merge }
|
|
25
65
|
|
|
26
66
|
export { change_base }
|
|
@@ -5,11 +5,11 @@ import { git_command } from './git-command'
|
|
|
5
5
|
// The narrowing every scoped re-check shares: which files a check was narrowed by, or why it could
|
|
6
6
|
// not be narrowed at all.
|
|
7
7
|
//
|
|
8
|
-
//
|
|
9
|
-
//
|
|
10
|
-
//
|
|
11
|
-
//
|
|
12
|
-
//
|
|
8
|
+
// The unit suite and lint share this shape. The two differ only in which extensions they can read
|
|
9
|
+
// and in the words they print; everything else — where the changed files come from, dropping what
|
|
10
|
+
// the tree no longer holds, telling an unreadable change list apart from one that narrowed to
|
|
11
|
+
// nothing, and listing what was narrowed by — is identical, so it lives here once rather than in
|
|
12
|
+
// each command.
|
|
13
13
|
//
|
|
14
14
|
// **A narrowed run is added in front of the whole check, never in place of it.** Both fallbacks
|
|
15
15
|
// therefore end at the whole check, and each says which of the two it was: the one thing this must
|
|
@@ -3,8 +3,7 @@ import { git_command } from './git-command'
|
|
|
3
3
|
// The set of changed paths a mechanical, path-driven decision is made from.
|
|
4
4
|
//
|
|
5
5
|
// `josh review:level` asks this same question of the same tree (which level to review at), and a
|
|
6
|
-
// second copy would let a caller disagree about what "changed" means.
|
|
7
|
-
// this reading is the moment it stopped being one command's private helper.
|
|
6
|
+
// second copy would let a caller disagree about what "changed" means.
|
|
8
7
|
|
|
9
8
|
function to_paths(raw: string): Array<string> {
|
|
10
9
|
return raw
|
package/scripts/git/constants.ts
CHANGED
|
@@ -7,12 +7,12 @@ const SEPARATOR_LINE = '──────────────────
|
|
|
7
7
|
const GIT_COMMAND_UNIX = '/usr/bin/git'
|
|
8
8
|
// git's machine-readable output, asked for by the readers that parse rather than display. It lives
|
|
9
9
|
// here rather than beside either of them because `status` and `worktree_list` now sit in different
|
|
10
|
-
// modules
|
|
10
|
+
// modules and a copy in each is a second answer to one question.
|
|
11
11
|
const PORCELAIN_FLAG = '--porcelain'
|
|
12
12
|
// The untracked-files mode every porcelain status reading passes (`git-command.ts` carries why it is
|
|
13
13
|
// passed and why it is `all`), shared so another module's own reading cannot drift from it.
|
|
14
14
|
const UNTRACKED_FILES_FLAG = '--untracked-files=all'
|
|
15
|
-
// The git binary a spawn runs in place of the platform's own
|
|
15
|
+
// The git binary a spawn runs in place of the platform's own. The spawn path
|
|
16
16
|
// is absolute, so a `git` placed in front on `PATH` never stands in for it: the unit suite's network
|
|
17
17
|
// guard shimmed `git` that way, and `josh ship`'s tests fetched and merged the default branch into the
|
|
18
18
|
// checkout they ran in without the guard ever seeing the call. The guard names its shim here instead.
|
|
@@ -135,7 +135,7 @@ const git_branch = {
|
|
|
135
135
|
check_and_create_branch,
|
|
136
136
|
is_mismatch,
|
|
137
137
|
// Exported so a lane's branch name can be checked against the real matcher rather than against a
|
|
138
|
-
// second copy of the pattern
|
|
138
|
+
// second copy of the pattern. A copy is what let `lane/<N>` ship: nothing
|
|
139
139
|
// asserted that the name `lane:open` writes is one this function accepts.
|
|
140
140
|
has_same_issue_prefix,
|
|
141
141
|
issue_from_branch,
|