@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
|
@@ -9,10 +9,11 @@ import { review_record } from '#scripts/review/review-record'
|
|
|
9
9
|
import { detached_launch } from '#scripts/run/detached-launch'
|
|
10
10
|
import { run_ship_review, type RoundOutcome, type ScoredVerdict } from './run-ship-review'
|
|
11
11
|
import { run_ship_scoped, type Phase } from './run-ship-scoped'
|
|
12
|
+
import type { StepResult } from './run-ship-sync'
|
|
12
13
|
|
|
13
|
-
// The side effects of `josh ship --review
|
|
14
|
-
//
|
|
15
|
-
//
|
|
14
|
+
// The side effects of `josh ship --review`: the round-1 review — open, launch, join, attest and
|
|
15
|
+
// record — run by the supervisor beside the gate rather than across agent turns. Each step is the
|
|
16
|
+
// existing command or mechanism, composed rather than cloned:
|
|
16
17
|
//
|
|
17
18
|
// 1. `run:review` starts the gate detached and mints the brief — the nonce `review:attest` checks.
|
|
18
19
|
// 2. the reviewer is launched the way `run:wake` launches a session — `agent_argv` under the reviewer
|
|
@@ -20,14 +21,14 @@ import { run_ship_scoped, type Phase } from './run-ship-scoped'
|
|
|
20
21
|
// 3. `run:review --join` blocks a verdict over a red gate; `review:attest --check` refuses a review
|
|
21
22
|
// that read another checkout; `review:record` writes the round the merge gate reads.
|
|
22
23
|
//
|
|
23
|
-
// **Round 1's local fixes and round 2 stay inside the supervisor
|
|
24
|
+
// **Round 1's local fixes and round 2 stay inside the supervisor**. A round-1
|
|
24
25
|
// reviewer that fixed its local Mediums in place changed the tree the background gate read, so that
|
|
25
26
|
// join drains the gate rather than judging it — the ship's gate stage re-runs on the fixed tree. After
|
|
26
27
|
// the commit, `round_two_stage` asks `review:round2 --round-1-closed` whether the fix delta owes a
|
|
27
28
|
// second round, and on `required` runs it through the same commands the chain does: the scoped pair
|
|
28
29
|
// `review:brief` requires, `review:brief --round 2`, a fresh reviewer session, attest and record.
|
|
29
30
|
//
|
|
30
|
-
// **A precondition the supervisor can meet itself is met, not stopped on
|
|
31
|
+
// **A precondition the supervisor can meet itself is met, not stopped on**.
|
|
31
32
|
// The scoped pair `run:review` and the local gate refuse without is run in place when this tree has no
|
|
32
33
|
// green record, and a round-1 fix is counted only once that pair is green on the fixed tree.
|
|
33
34
|
//
|
|
@@ -43,14 +44,19 @@ const ATTEST_CHECK = ['review:attest', '--check']
|
|
|
43
44
|
const ROUND_TWO_DECISION = ['review:round2', '--round-1-closed']
|
|
44
45
|
const ROUND_TWO_BRIEF = ['review:brief', '--round', '2']
|
|
45
46
|
const ROUND_TWO_REQUIRED = 'required'
|
|
47
|
+
const ROUND_ONE = '1'
|
|
48
|
+
const ROUND_TWO = '2'
|
|
49
|
+
const COMMENT_FLAG = '--comment'
|
|
50
|
+
|
|
51
|
+
type Round = typeof ROUND_ONE | typeof ROUND_TWO
|
|
46
52
|
const FIXED_JOIN_NOTE =
|
|
47
53
|
'the round-1 gate read the tree before the review fixes — drained, not judged; the gate re-runs once the tree is fixed.'
|
|
48
54
|
const ROUND_TWO_SKIPPED_NOTE = 'round 2 not due — nothing left to verify; shipping on.'
|
|
49
55
|
const ROUND_ONE_RECORDED_NOTE =
|
|
50
56
|
'round 1 already recorded for this issue — not reviewed again; the gate reads the fixed tree and round 2 decides after the commit.'
|
|
51
57
|
|
|
52
|
-
// The scoped pair's precondition, met by the supervisor itself rather than stopped on
|
|
53
|
-
//
|
|
58
|
+
// The scoped pair's precondition, met by the supervisor itself rather than stopped on,
|
|
59
|
+
// single-sourced with the preflight and gate stages.
|
|
54
60
|
const { run_phases, scoped_pair } = run_ship_scoped
|
|
55
61
|
|
|
56
62
|
type PromptOf = (brief_path: string, findings_path: string) => string
|
|
@@ -92,7 +98,7 @@ async function run_session(
|
|
|
92
98
|
prompt: string,
|
|
93
99
|
log_path: string,
|
|
94
100
|
issue: string,
|
|
95
|
-
round:
|
|
101
|
+
round: Round,
|
|
96
102
|
): Promise<JoshResult> {
|
|
97
103
|
const built = agent_argv.resolve_in(prompt, agent_role_profile.REVIEWER, PROJECT_ROOT)
|
|
98
104
|
if (built.kind === 'rejected') return failure(`reviewer profile rejected: ${built.note}`)
|
|
@@ -112,7 +118,7 @@ async function launch_reviewer(
|
|
|
112
118
|
brief: string,
|
|
113
119
|
prompt_of: PromptOf,
|
|
114
120
|
issue: string,
|
|
115
|
-
round:
|
|
121
|
+
round: Round,
|
|
116
122
|
): Promise<JoshResult> {
|
|
117
123
|
const target = paths()
|
|
118
124
|
|
|
@@ -130,7 +136,7 @@ function current_verdict(): ReturnType<typeof run_ship_review.read_verdict> {
|
|
|
130
136
|
// tree before the fixes, so its verdict describes a tree that no longer exists. The join still ran to
|
|
131
137
|
// its end, so the gate stage that follows never races it. Any fix drains it, not only a round whose
|
|
132
138
|
// every finding was fixed — a partial fix moved the tree just the same, and the round then stops on its
|
|
133
|
-
// unfixed finding at the record rather than on a `Gate RED` the gate never earned
|
|
139
|
+
// unfixed finding at the record rather than on a `Gate RED` the gate never earned.
|
|
134
140
|
async function join_gate(): Promise<JoshResult> {
|
|
135
141
|
const joined = await josh([RUN_REVIEW, '--join'])
|
|
136
142
|
|
|
@@ -142,19 +148,29 @@ async function join_gate(): Promise<JoshResult> {
|
|
|
142
148
|
return { code: SUCCESS_EXIT_CODE, out: joined.out }
|
|
143
149
|
}
|
|
144
150
|
|
|
151
|
+
// **A passing round 2 is recorded on the issue, not in the tree**: it ran after the commit and reads
|
|
152
|
+
// only, so no commit of the run's follows it, and a line appended now would be pushed onto the open
|
|
153
|
+
// pull request by `pnpm josh followup` — restarting the CI the round ran beside. A blocking round 2
|
|
154
|
+
// keeps the tree: the fix it stops for is pushed anyway, and carries the lines.
|
|
155
|
+
function record_flags(round: Round, outcome: RoundOutcome): ReadonlyArray<string> {
|
|
156
|
+
return round === ROUND_TWO && outcome.is_passing ? [COMMENT_FLAG] : []
|
|
157
|
+
}
|
|
158
|
+
|
|
145
159
|
async function record_and_route(
|
|
146
160
|
issue: string,
|
|
161
|
+
round: Round,
|
|
147
162
|
outcome_of: (verdict: ScoredVerdict) => RoundOutcome,
|
|
148
163
|
): Promise<JoshResult> {
|
|
149
164
|
const verdict = current_verdict()
|
|
150
165
|
|
|
151
166
|
if (verdict.kind === run_ship_review.VERDICT.INVALID) return failure(verdict.note)
|
|
152
167
|
|
|
153
|
-
const
|
|
168
|
+
const outcome = outcome_of(verdict)
|
|
169
|
+
const flags = record_flags(round, outcome)
|
|
170
|
+
const recorded = await josh(['review:record', '--issue', issue, ...flags, ...verdict.specs])
|
|
154
171
|
|
|
155
172
|
if (recorded.code !== SUCCESS_EXIT_CODE) return recorded
|
|
156
173
|
|
|
157
|
-
const outcome = outcome_of(verdict)
|
|
158
174
|
const out = [...verdict.report, outcome.note].join('\n')
|
|
159
175
|
|
|
160
176
|
return outcome.is_passing ? { code: SUCCESS_EXIT_CODE, out } : failure(out)
|
|
@@ -165,7 +181,7 @@ function reviewed(
|
|
|
165
181
|
open: ReadonlyArray<string>,
|
|
166
182
|
prompt_of: PromptOf,
|
|
167
183
|
issue: string,
|
|
168
|
-
round:
|
|
184
|
+
round: Round,
|
|
169
185
|
): ReadonlyArray<Phase> {
|
|
170
186
|
const opened = { brief: '' }
|
|
171
187
|
|
|
@@ -189,26 +205,31 @@ async function round_one_record(issue: string): Promise<JoshResult> {
|
|
|
189
205
|
const checked = is_fixed ? await scoped_pair() : undefined
|
|
190
206
|
const is_verified = checked === undefined || checked.code === SUCCESS_EXIT_CODE
|
|
191
207
|
|
|
192
|
-
return await record_and_route(issue, (verdict) =>
|
|
208
|
+
return await record_and_route(issue, ROUND_ONE, (verdict) =>
|
|
193
209
|
is_verified ? run_ship_review.round_one_outcome(verdict) : run_ship_review.UNVERIFIED_OUTCOME,
|
|
194
210
|
)
|
|
195
211
|
}
|
|
196
212
|
|
|
213
|
+
// A round that had nothing to review: it passes, and the ship does not time it as a review that ran.
|
|
214
|
+
function skipped(out: string): StepResult {
|
|
215
|
+
return { code: SUCCESS_EXIT_CODE, out, is_skipped: true }
|
|
216
|
+
}
|
|
217
|
+
|
|
197
218
|
// The round-1 review, beside the gate: scoped pair → open → review → join → attest → record, stopping
|
|
198
219
|
// at the first that did not pass.
|
|
199
220
|
//
|
|
200
|
-
// **A recorded round 1 is not run again
|
|
221
|
+
// **A recorded round 1 is not run again**. A ship relaunched with `--review`
|
|
201
222
|
// after a round-1 stop would otherwise review the whole change a second time as round 1 — a new Medium
|
|
202
223
|
// there stops it again, and round 2 after the commit makes a third. The fix delta is round 2's to
|
|
203
224
|
// verify, and `round_two_stage` asks whether it is due after the commit.
|
|
204
|
-
async function review_stage(issue: string): Promise<
|
|
225
|
+
async function review_stage(issue: string): Promise<StepResult> {
|
|
205
226
|
const recorded = await review_record.check(Number(issue))
|
|
206
227
|
|
|
207
|
-
if (recorded.status === 'ok') return
|
|
228
|
+
if (recorded.status === 'ok') return skipped(ROUND_ONE_RECORDED_NOTE)
|
|
208
229
|
|
|
209
230
|
return await run_phases([
|
|
210
231
|
scoped_pair,
|
|
211
|
-
...reviewed([RUN_REVIEW], run_ship_review.reviewer_prompt, issue,
|
|
232
|
+
...reviewed([RUN_REVIEW], run_ship_review.reviewer_prompt, issue, ROUND_ONE),
|
|
212
233
|
join_gate,
|
|
213
234
|
async () => await josh(ATTEST_CHECK),
|
|
214
235
|
async () => await round_one_record(issue),
|
|
@@ -217,21 +238,19 @@ async function review_stage(issue: string): Promise<JoshResult> {
|
|
|
217
238
|
|
|
218
239
|
// The round-2 verification pass, after the commit so it runs beside CI: due only when the round-1 fix
|
|
219
240
|
// delta says so, then scoped pair → brief → fresh reviewer → attest → record.
|
|
220
|
-
async function round_two_stage(issue: string): Promise<
|
|
241
|
+
async function round_two_stage(issue: string): Promise<StepResult> {
|
|
221
242
|
const decision = await josh(ROUND_TWO_DECISION)
|
|
222
243
|
const answer = decision.out.trim()
|
|
223
244
|
|
|
224
245
|
if (decision.code !== SUCCESS_EXIT_CODE) return decision
|
|
225
246
|
|
|
226
|
-
if (answer !== ROUND_TWO_REQUIRED) {
|
|
227
|
-
return { code: SUCCESS_EXIT_CODE, out: `${answer}\n${ROUND_TWO_SKIPPED_NOTE}` }
|
|
228
|
-
}
|
|
247
|
+
if (answer !== ROUND_TWO_REQUIRED) return skipped(`${answer}\n${ROUND_TWO_SKIPPED_NOTE}`)
|
|
229
248
|
|
|
230
249
|
return await run_phases([
|
|
231
250
|
scoped_pair,
|
|
232
|
-
...reviewed(ROUND_TWO_BRIEF, run_ship_review.verification_prompt, issue,
|
|
251
|
+
...reviewed(ROUND_TWO_BRIEF, run_ship_review.verification_prompt, issue, ROUND_TWO),
|
|
233
252
|
async () => await josh(ATTEST_CHECK),
|
|
234
|
-
async () => await record_and_route(issue, run_ship_review.round_two_outcome),
|
|
253
|
+
async () => await record_and_route(issue, ROUND_TWO, run_ship_review.round_two_outcome),
|
|
235
254
|
])
|
|
236
255
|
}
|
|
237
256
|
|
|
@@ -1,18 +1,17 @@
|
|
|
1
1
|
import { review_finding_ledger } from '#scripts/review/review-finding-ledger'
|
|
2
2
|
import { review_record_cli } from '#scripts/review/review-record-cli'
|
|
3
3
|
|
|
4
|
-
// The pure half of `josh ship --review
|
|
5
|
-
//
|
|
6
|
-
//
|
|
7
|
-
//
|
|
8
|
-
// ever starting.
|
|
4
|
+
// The pure half of `josh ship --review`: the one-line prompts the supervised reviewers are launched
|
|
5
|
+
// with, the verdict read back off the findings file each writes, and where that verdict routes the
|
|
6
|
+
// ship. Kept apart from the launch and the joins (`run-ship-review-steps.ts`) the way `run-review.ts`
|
|
7
|
+
// is kept apart from `run-review-steps.ts`, so every branch is pinned without a session ever starting.
|
|
9
8
|
//
|
|
10
9
|
// **The reviewer is the one the chain already runs.** Its prompt hands it the brief `run:review`
|
|
11
10
|
// printed — the same level, rubric, checkout and `review:attest` nonce a `/code-review` subagent was
|
|
12
11
|
// given — and asks only that the findings also be written in the `review:record` grammar, so the
|
|
13
12
|
// supervisor records and routes them without an agent reading the prose.
|
|
14
13
|
//
|
|
15
|
-
// **Round 1 fixes what is local; round 2 only reads
|
|
14
|
+
// **Round 1 fixes what is local; round 2 only reads**. The round-1 reviewer
|
|
16
15
|
// applies a Medium whose fix is small and local — the "small, local asks" `chain-rule.md` names — and
|
|
17
16
|
// marks that finding `fixed`, so the supervisor carries the ship through the gate, the commit and a
|
|
18
17
|
// round-2 verification pass instead of handing a lane child back for a fix it could not make. A High is
|
|
@@ -24,7 +23,7 @@ const HIGH = 'high'
|
|
|
24
23
|
const MEDIUM = 'medium'
|
|
25
24
|
const FIXED_PREFIX = 'fixed '
|
|
26
25
|
// What a finding line carries after its spec: one sentence saying what is wrong, so a stopped ship's
|
|
27
|
-
// log tells the resumed lane child the defect rather than only its location
|
|
26
|
+
// log tells the resumed lane child the defect rather than only its location.
|
|
28
27
|
const DESCRIPTION_SEPARATOR = ' — '
|
|
29
28
|
// Where the spec ends on read: a reviewer that types the dash as `-`, `--` or `–` still ends it there,
|
|
30
29
|
// so its sentence never lands in the ledger's file field.
|
|
@@ -175,18 +174,17 @@ function round_one_outcome(verdict: ScoredVerdict): RoundOutcome {
|
|
|
175
174
|
return { is_passing: true, note: verdict.kind === VERDICT.FIXED ? FIXED_NOTE : CLEAN_NOTE }
|
|
176
175
|
}
|
|
177
176
|
|
|
178
|
-
// Whether a findings file records a clean round 1
|
|
179
|
-
//
|
|
180
|
-
//
|
|
181
|
-
//
|
|
177
|
+
// Whether a findings file records a clean round 1. A resumed round 1 narrows to the delta only past a
|
|
178
|
+
// review that found nothing to fix. A blocking one has a finding in a file the delta may not touch. A
|
|
179
|
+
// fixed one approved its own edits, not the briefed tree the delta is measured from, so a file
|
|
180
|
+
// reverted to that tree would drop out of the delta with its finding back in it.
|
|
182
181
|
function is_clean_round_one(text: string | undefined): boolean {
|
|
183
182
|
return read_verdict(text).kind === VERDICT.CLEAN
|
|
184
183
|
}
|
|
185
184
|
|
|
186
185
|
// Whether the reviewer edited the tree — any finding marked fixed, whether or not another one still
|
|
187
|
-
// blocks
|
|
188
|
-
//
|
|
189
|
-
// one Medium and left another stopped at a misleading `Gate RED` before its own blocking note.
|
|
186
|
+
// blocks. A partial fix moves the tree the background gate read as surely as a full one, so the join
|
|
187
|
+
// reads it red either way.
|
|
190
188
|
function has_fixes(text: string | undefined): boolean {
|
|
191
189
|
if (text === undefined) return false
|
|
192
190
|
|
|
@@ -1,11 +1,12 @@
|
|
|
1
|
+
import { gate_skip } from '#scripts/gate/gate-skip'
|
|
1
2
|
import { gate_tree } from '#scripts/gate/gate-tree'
|
|
2
3
|
import { scoped_green } from '#scripts/gate/scoped-green'
|
|
3
4
|
import { josh_command, type JoshResult } from '#scripts/josh/josh-run'
|
|
4
5
|
|
|
5
|
-
// The scoped pair `josh ship` meets itself rather than stops on
|
|
6
|
-
//
|
|
7
|
-
//
|
|
8
|
-
//
|
|
6
|
+
// The scoped pair `josh ship` meets itself rather than stops on, shared by every stage that needs a
|
|
7
|
+
// green record for this tree: the preflight stage at the start, the review rounds, and the gate
|
|
8
|
+
// stage — a reviewer may have edited the tree after round 1's pair ran, and `josh gate` refuses a
|
|
9
|
+
// tree with no green record.
|
|
9
10
|
|
|
10
11
|
const SUCCESS_EXIT_CODE = 0
|
|
11
12
|
const should_forward_stderr = true
|
|
@@ -40,7 +41,7 @@ async function scoped_pair(): Promise<JoshResult> {
|
|
|
40
41
|
}
|
|
41
42
|
|
|
42
43
|
// The scoped pair and then `josh gate` — the gate stage, and the followup's gate over a merged tree
|
|
43
|
-
// before its push
|
|
44
|
+
// before its push, so both leave the record the pre-push hook reuses.
|
|
44
45
|
async function scoped_gate(): Promise<JoshResult> {
|
|
45
46
|
return await run_phases([
|
|
46
47
|
scoped_pair,
|
|
@@ -48,7 +49,15 @@ async function scoped_gate(): Promise<JoshResult> {
|
|
|
48
49
|
])
|
|
49
50
|
}
|
|
50
51
|
|
|
51
|
-
|
|
52
|
+
// Whether `josh gate` would only reuse this tree's green record: the gate's own reuse test rather than
|
|
53
|
+
// a second copy of it, so the ship calls a gate stage a reuse on exactly the trees the gate skips.
|
|
54
|
+
async function is_gate_green(): Promise<boolean> {
|
|
55
|
+
const tree = await gate_tree.read_gate_tree()
|
|
56
|
+
|
|
57
|
+
return gate_skip.reusable_green_gate(tree.files, tree.base) !== undefined
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
const run_ship_scoped = { is_gate_green, run_phases, scoped_gate, scoped_pair }
|
|
52
61
|
|
|
53
62
|
export type { Phase }
|
|
54
63
|
export { run_ship_scoped }
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
+
import { issue_cite } from '#scripts/issue/issue-cite'
|
|
1
2
|
import { stamp_file } from '#scripts/josh/stamp-file'
|
|
3
|
+
import { json_value } from '#scripts/lib/json-value'
|
|
2
4
|
import { z } from 'zod'
|
|
3
5
|
|
|
4
|
-
// `josh ship`'s durable stage record, and the decision of which stage a resumed ship may pass over
|
|
5
|
-
//
|
|
6
|
-
//
|
|
7
|
-
// already happened.
|
|
6
|
+
// `josh ship`'s durable stage record, and the decision of which stage a resumed ship may pass over,
|
|
7
|
+
// so a ship that died mid-way neither re-runs what already happened nor commits, pushes or merges
|
|
8
|
+
// twice.
|
|
8
9
|
//
|
|
9
10
|
// **The record is a hint; the repository's actual state is the authority.** A record can be lost — a
|
|
10
11
|
// temp directory wiped — or outlived by the tree it describes, when new work was committed after it
|
|
@@ -49,8 +50,21 @@ const RECORD_PREFIX = 'josh-ship-stages-'
|
|
|
49
50
|
const RECORD_SEPARATOR = '-'
|
|
50
51
|
const SKIP_COMMIT_FLAG = '--skip-commit'
|
|
51
52
|
const SKIP_PUSH_FLAG = '--skip-push'
|
|
53
|
+
const WORD_SEPARATOR = ' '
|
|
54
|
+
const STARTED_SEPARATOR = ','
|
|
55
|
+
const STARTED_INDEX = 3
|
|
56
|
+
const WORD_COUNT = STARTED_INDEX + 1
|
|
52
57
|
|
|
53
|
-
|
|
58
|
+
// `started` lists the stages the current attempt started, kept across a supervisor that ended without a
|
|
59
|
+
// stop so its successor's lines still carry them.
|
|
60
|
+
const record_schema = z.object({
|
|
61
|
+
done: z.array(z.string()),
|
|
62
|
+
started: z.array(z.string()).default([]),
|
|
63
|
+
})
|
|
64
|
+
|
|
65
|
+
type ShipRecord = z.infer<typeof record_schema>
|
|
66
|
+
|
|
67
|
+
const EMPTY_RECORD: ShipRecord = { done: [], started: [] }
|
|
54
68
|
|
|
55
69
|
// Keyed on the repository and the issue: every lane of one repository shares the common git directory,
|
|
56
70
|
// and two issues shipping from two lanes keep two records.
|
|
@@ -58,26 +72,44 @@ function record_path(repository: string, issue: string): string {
|
|
|
58
72
|
return stamp_file.stamp_path(`${RECORD_PREFIX}${issue}${RECORD_SEPARATOR}`, repository)
|
|
59
73
|
}
|
|
60
74
|
|
|
61
|
-
function
|
|
62
|
-
|
|
63
|
-
return new Set(record_schema.parse(JSON.parse(raw)).done)
|
|
64
|
-
} catch {
|
|
65
|
-
return new Set()
|
|
66
|
-
}
|
|
75
|
+
function parse_record(raw: string): ShipRecord {
|
|
76
|
+
return json_value.parse_with(raw, record_schema) ?? EMPTY_RECORD
|
|
67
77
|
}
|
|
68
78
|
|
|
69
|
-
//
|
|
70
|
-
//
|
|
71
|
-
function
|
|
79
|
+
// An absent, planted or malformed record reads as empty — the state decides from there, so "no
|
|
80
|
+
// record" is always the safe answer.
|
|
81
|
+
function read_record(target: string): ShipRecord {
|
|
72
82
|
const raw = stamp_file.read_stamp_text(target)
|
|
73
83
|
|
|
74
|
-
return raw === undefined ?
|
|
84
|
+
return raw === undefined ? EMPTY_RECORD : parse_record(raw)
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// The stages the record says completed.
|
|
88
|
+
function read_done(target: string): ReadonlySet<string> {
|
|
89
|
+
return new Set(read_record(target).done)
|
|
75
90
|
}
|
|
76
91
|
|
|
77
92
|
function mark_done(target: string, stage: Stage): void {
|
|
78
|
-
const
|
|
93
|
+
const record = read_record(target)
|
|
94
|
+
|
|
95
|
+
stamp_file.replace_stamp(target, { ...record, done: [...new Set([...record.done, stage])] })
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// The stages the current attempt has started, in the order it started them.
|
|
99
|
+
function read_started(target: string): ReadonlyArray<string> {
|
|
100
|
+
return read_record(target).started
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
function mark_started(target: string, stage: Stage): void {
|
|
104
|
+
const record = read_record(target)
|
|
79
105
|
|
|
80
|
-
stamp_file.replace_stamp(target, {
|
|
106
|
+
stamp_file.replace_stamp(target, { ...record, started: [...new Set([...record.started, stage])] })
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// A `ship-stop` ends the attempt on the board (`run-board-phase.ts`), so the next attempt lists afresh
|
|
110
|
+
// while the completed stages stay recorded.
|
|
111
|
+
function end_attempt(target: string): void {
|
|
112
|
+
stamp_file.replace_stamp(target, { ...read_record(target), started: [] })
|
|
81
113
|
}
|
|
82
114
|
|
|
83
115
|
// Removed once the report stage completes, so a later ship of the same issue starts from the preflight.
|
|
@@ -92,19 +124,19 @@ function is_shipped(state: ShipState): boolean {
|
|
|
92
124
|
}
|
|
93
125
|
|
|
94
126
|
const DONE_BY: Record<Stage, (done: ReadonlySet<string>, state: ShipState) => boolean> = {
|
|
95
|
-
// The preflight
|
|
127
|
+
// The preflight asks what the commit stage would refuse on, so a commit is
|
|
96
128
|
// its output as it is the gate's; a resumed commit stage still asks `git -y`'s own preflight.
|
|
97
129
|
[STAGE.PREFLIGHT]: (_done, state) => state.is_merged || state.is_committed,
|
|
98
|
-
// The `--review` round
|
|
130
|
+
// The `--review` round precedes the commit, so a commit is its output as it
|
|
99
131
|
// is the gate's. A record alone is not honored: before a commit the tree may have been edited since
|
|
100
132
|
// the recorded round, and only a commit pins the tree that round read.
|
|
101
133
|
[STAGE.REVIEW]: (_done, state) => state.is_merged || state.is_committed,
|
|
102
134
|
[STAGE.GATE]: (_done, state) => state.is_merged || state.is_committed,
|
|
103
|
-
// The merge of the default branch before the commit
|
|
135
|
+
// The merge of the default branch before the commit: once committed, a
|
|
104
136
|
// conflicting pull request is the followup's to merge again.
|
|
105
137
|
[STAGE.SYNC]: (_done, state) => state.is_merged || state.is_committed,
|
|
106
138
|
[STAGE.COMMIT]: (done, state) => state.is_merged || (done.has(STAGE.COMMIT) && is_shipped(state)),
|
|
107
|
-
// The round-2 pass
|
|
139
|
+
// The round-2 pass reads the pushed fix delta, so its record is honored only
|
|
108
140
|
// while that push still stands — new work pushed on top reruns it.
|
|
109
141
|
[STAGE.ROUND_TWO]: (done, state) =>
|
|
110
142
|
state.is_merged || (done.has(STAGE.ROUND_TWO) && is_shipped(state)),
|
|
@@ -115,7 +147,7 @@ const DONE_BY: Record<Stage, (done: ReadonlySet<string>, state: ShipState) => bo
|
|
|
115
147
|
[STAGE.REPORT]: (done) => done.has(STAGE.REPORT),
|
|
116
148
|
}
|
|
117
149
|
|
|
118
|
-
// A supplied PR body is work only the commit stage delivers
|
|
150
|
+
// A supplied PR body is work only the commit stage delivers: a rerun carrying
|
|
119
151
|
// the live-execution evidence a refused `followup` asked for reruns `git -y`, whose skip flags leave the
|
|
120
152
|
// commit and push alone while the body reaches the already-open pull request.
|
|
121
153
|
function is_done(
|
|
@@ -138,12 +170,30 @@ function commit_flags(state: ShipState): ReadonlyArray<string> {
|
|
|
138
170
|
return state.is_pushed ? [SKIP_COMMIT_FLAG, SKIP_PUSH_FLAG] : [SKIP_COMMIT_FLAG]
|
|
139
171
|
}
|
|
140
172
|
|
|
141
|
-
|
|
142
|
-
|
|
173
|
+
// **The newest line carries the attempt's history**: a fourth word lists every
|
|
174
|
+
// stage the attempt has started, so the one line per issue a stream full of positions keeps still
|
|
175
|
+
// draws the whole track. A line with no started stage keeps the three-word form.
|
|
176
|
+
function event_text(
|
|
177
|
+
issue: string,
|
|
178
|
+
stage: Stage,
|
|
179
|
+
phase: Phase,
|
|
180
|
+
started: ReadonlyArray<string> = [],
|
|
181
|
+
): string {
|
|
182
|
+
const words = [issue_cite.plain(issue), stage, phase]
|
|
183
|
+
const listed = [...new Set(started)].join(STARTED_SEPARATOR)
|
|
184
|
+
|
|
185
|
+
const full = started.length > 0 ? [...words, listed] : words
|
|
186
|
+
|
|
187
|
+
return full.join(WORD_SEPARATOR)
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
// The stages a line says its attempt has started, `undefined` for a three-word line.
|
|
191
|
+
function started_of(text: string): ReadonlyArray<string> | undefined {
|
|
192
|
+
return text.split(WORD_SEPARATOR, WORD_COUNT)[STARTED_INDEX]?.split(STARTED_SEPARATOR)
|
|
143
193
|
}
|
|
144
194
|
|
|
145
|
-
// A stop on a merge git could not finish is named `conflict` rather than by the stage it happened in
|
|
146
|
-
//
|
|
195
|
+
// A stop on a merge git could not finish is named `conflict` rather than by the stage it happened in,
|
|
196
|
+
// so the event stream reads the cause without anyone opening the report.
|
|
147
197
|
const CONFLICT = 'conflict'
|
|
148
198
|
|
|
149
199
|
function stop_reason(stage: Stage, conflicts: ReadonlyArray<string> = []): string {
|
|
@@ -155,11 +205,15 @@ const run_ship_stage = {
|
|
|
155
205
|
STAGE,
|
|
156
206
|
clear,
|
|
157
207
|
commit_flags,
|
|
208
|
+
end_attempt,
|
|
158
209
|
event_text,
|
|
159
210
|
is_done,
|
|
160
211
|
mark_done,
|
|
212
|
+
mark_started,
|
|
161
213
|
read_done,
|
|
214
|
+
read_started,
|
|
162
215
|
record_path,
|
|
216
|
+
started_of,
|
|
163
217
|
stop_reason,
|
|
164
218
|
}
|
|
165
219
|
|
|
@@ -6,8 +6,8 @@ import { run_ship_scoped } from './run-ship-scoped'
|
|
|
6
6
|
import { run_ship_stage, type ShipState, type Stage } from './run-ship-stage'
|
|
7
7
|
import { run_ship_sync, type StepResult } from './run-ship-sync'
|
|
8
8
|
|
|
9
|
-
// The stages `josh ship` runs, in the order a change ships
|
|
10
|
-
//
|
|
9
|
+
// The stages `josh ship` runs, in the order a change ships, kept apart from the chaining
|
|
10
|
+
// CLI so the order is read in one place.
|
|
11
11
|
|
|
12
12
|
const should_forward_stderr = true
|
|
13
13
|
|
|
@@ -34,8 +34,8 @@ async function josh(argv: ReadonlyArray<string>): Promise<JoshResult> {
|
|
|
34
34
|
return await josh_command.josh_run(argv, should_forward_stderr)
|
|
35
35
|
}
|
|
36
36
|
|
|
37
|
-
//
|
|
38
|
-
//
|
|
37
|
+
// The pull request's preconditions and the scoped pair are asked first, so a stop they would cause
|
|
38
|
+
// lands before the review and the gate rather than after them.
|
|
39
39
|
const PREFLIGHT_STEP: Step = {
|
|
40
40
|
stage: STAGE.PREFLIGHT,
|
|
41
41
|
header: run_ship.PREFLIGHT_HEADER,
|
|
@@ -43,15 +43,25 @@ const PREFLIGHT_STEP: Step = {
|
|
|
43
43
|
await run_ship_preflight.stage({ title: args.title, body_path: args.body_path }),
|
|
44
44
|
}
|
|
45
45
|
|
|
46
|
+
// The gate stage. **A gate that only reused the tree's green record is not timed**: after `--review`
|
|
47
|
+
// launched the gate itself, this stage ends in seconds without running a check, and those seconds
|
|
48
|
+
// would pull the `gate` row `lane:stats` reads for `JOSH_LANE_LIMIT` toward zero. The record is asked
|
|
49
|
+
// for before the stage runs — afterwards every green gate has one.
|
|
50
|
+
async function gate_stage(): Promise<StepResult> {
|
|
51
|
+
const is_skipped = await run_ship_scoped.is_gate_green()
|
|
52
|
+
const result = await run_ship_scoped.scoped_gate()
|
|
53
|
+
|
|
54
|
+
return { ...result, is_skipped }
|
|
55
|
+
}
|
|
56
|
+
|
|
46
57
|
// The gate before the commit, the commit/push/PR before the merge. The gate meets the scoped pair
|
|
47
58
|
// first: a round-1 reviewer may have edited the tree since the preflight, and `josh gate` refuses a tree
|
|
48
|
-
// with no green record
|
|
49
|
-
//
|
|
59
|
+
// with no green record. The commit step carries the `--skip-*` flags a resumed ship needs, so an
|
|
60
|
+
// existing commit or push is never made twice.
|
|
50
61
|
const COMMIT_STEPS: ReadonlyArray<Step> = [
|
|
51
|
-
//
|
|
52
|
-
//
|
|
53
|
-
//
|
|
54
|
-
// pre-push hook could never reuse that record and re-ran the whole unit suite on every merged ship.
|
|
62
|
+
// The default branch is merged again before the commit, so the pull request opens on a branch that
|
|
63
|
+
// is current; a clean merge goes on without waking anyone. It runs before the gate: a merge after it
|
|
64
|
+
// would move the merge base the gate's record pins, so the pre-push hook could not reuse that record.
|
|
55
65
|
{
|
|
56
66
|
stage: STAGE.SYNC,
|
|
57
67
|
header: run_ship.SYNC_HEADER,
|
|
@@ -60,7 +70,7 @@ const COMMIT_STEPS: ReadonlyArray<Step> = [
|
|
|
60
70
|
{
|
|
61
71
|
stage: STAGE.GATE,
|
|
62
72
|
header: run_ship.GATE_HEADER,
|
|
63
|
-
run: async () => await
|
|
73
|
+
run: async () => await gate_stage(),
|
|
64
74
|
},
|
|
65
75
|
{
|
|
66
76
|
stage: STAGE.COMMIT,
|
|
@@ -84,11 +94,11 @@ const MERGE_STEPS: ReadonlyArray<Step> = [
|
|
|
84
94
|
},
|
|
85
95
|
]
|
|
86
96
|
|
|
87
|
-
// `--review`
|
|
88
|
-
//
|
|
89
|
-
//
|
|
90
|
-
//
|
|
91
|
-
//
|
|
97
|
+
// `--review` puts the supervised round-1 review in front of the gate: it launches the gate itself, so
|
|
98
|
+
// the gate stage that follows reuses that tree's green record unless the sync stage between them
|
|
99
|
+
// merged the default branch and changed the tree. It also puts the round-2 pass between the commit
|
|
100
|
+
// and the followup, so the PR opens between the rounds and round 2 runs beside CI — a no-op when
|
|
101
|
+
// round 1 left no fix delta.
|
|
92
102
|
const REVIEW_STEP: Step = {
|
|
93
103
|
stage: STAGE.REVIEW,
|
|
94
104
|
header: run_ship.REVIEW_HEADER,
|
|
@@ -1,9 +1,11 @@
|
|
|
1
|
+
import { issue_cite } from '#scripts/issue/issue-cite'
|
|
2
|
+
|
|
1
3
|
// The text a `josh ship` supervisor records when a stage stops, written and read in one place so the
|
|
2
|
-
// retrospective's per-stage count never drifts from the writer
|
|
4
|
+
// retrospective's per-stage count never drifts from the writer.
|
|
3
5
|
const STOP_PATTERN = /^#\d+ (\S+) failed — /u
|
|
4
6
|
|
|
5
7
|
function format(issue: string, reason: string): string {
|
|
6
|
-
return
|
|
8
|
+
return `${issue_cite.plain(issue)} ${reason} failed — pnpm josh ship --log ${issue}`
|
|
7
9
|
}
|
|
8
10
|
|
|
9
11
|
function reason_of(text: string): string | undefined {
|
|
@@ -6,13 +6,11 @@ import { josh_command, type JoshResult } from '#scripts/josh/josh-run'
|
|
|
6
6
|
import { error_text } from '#scripts/lib/error-message'
|
|
7
7
|
import { run_ship_scoped } from './run-ship-scoped'
|
|
8
8
|
|
|
9
|
-
// `josh ship` keeps the branch current with the default branch itself
|
|
10
|
-
//
|
|
11
|
-
//
|
|
12
|
-
// relaunched session spent its first turns finding out that the cause was a conflict. Most of those
|
|
13
|
-
// conflicts were not conflicts at all to git: merging the default branch again resolved them.
|
|
9
|
+
// `josh ship` keeps the branch current with the default branch itself: a default branch that moves
|
|
10
|
+
// while the pull request opens and CI runs would otherwise stop the followup as `interrupted`, though
|
|
11
|
+
// merging the default branch again usually resolves it.
|
|
14
12
|
//
|
|
15
|
-
// So the merge happens
|
|
13
|
+
// So the merge happens mechanically: once before the commit (`sync_stage`), and once when
|
|
16
14
|
// the followup fails on a pull request GitHub reports `DIRTY` (`followup_stage`). Only a merge git
|
|
17
15
|
// itself cannot finish stops the ship, and it stops as `conflict`, naming the unmerged paths so the
|
|
18
16
|
// resumed session goes straight to them.
|
|
@@ -29,7 +27,10 @@ const CURRENT_SUFFIX = ' brings nothing in'
|
|
|
29
27
|
const MERGED_PREFIX = 'merged '
|
|
30
28
|
|
|
31
29
|
// A stage's result, plus the paths a stopped merge left unmerged — carried to the stop prompt.
|
|
30
|
+
// `is_skipped` marks a stage that found nothing to do — a review round with nothing to review, a gate
|
|
31
|
+
// that reused a green record — so its few seconds are not timed as a run of it.
|
|
32
32
|
interface StepResult extends JoshResult {
|
|
33
|
+
is_skipped?: boolean
|
|
33
34
|
conflicts?: ReadonlyArray<string>
|
|
34
35
|
}
|
|
35
36
|
|
|
@@ -63,7 +64,7 @@ function sync_note(outcome: Exclude<MergeOutcome, { kind: 'conflict' }>): string
|
|
|
63
64
|
|
|
64
65
|
// A refusal does not stop the commit: the guard refuses only uncommitted work the default branch also
|
|
65
66
|
// touches, and once that work is committed the followup merges again on a clean tree. A merge that changed
|
|
66
|
-
// the tree is checked by the gate stage that follows
|
|
67
|
+
// the tree is checked by the gate stage that follows, so the commit never carries
|
|
67
68
|
// an unchecked merge and the gate's record names the merge base the push carries.
|
|
68
69
|
async function sync_stage(): Promise<StepResult> {
|
|
69
70
|
const outcome = await merge_outcome()
|
|
@@ -84,7 +85,7 @@ async function is_conflicting(): Promise<boolean> {
|
|
|
84
85
|
}
|
|
85
86
|
}
|
|
86
87
|
|
|
87
|
-
// The merged tree is gated before it is pushed
|
|
88
|
+
// The merged tree is gated before it is pushed: the push then carries the tree
|
|
88
89
|
// the gate's record describes, so the pre-push hook reuses it rather than re-running the unit suite.
|
|
89
90
|
async function push_merged(title: string): Promise<StepResult | undefined> {
|
|
90
91
|
const gate = await run_ship_scoped.scoped_gate()
|