@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
|
@@ -42,17 +42,16 @@ const epic_issue_schema = z.object({
|
|
|
42
42
|
})
|
|
43
43
|
|
|
44
44
|
// One blocker as `gh` reports it inside the `blockedBy` connection. `state` comes back with the
|
|
45
|
-
// number, so telling a resolved blocker from a standing one costs no extra request
|
|
46
|
-
// (joshuafolkken/kit#996).
|
|
45
|
+
// number, so telling a resolved blocker from a standing one costs no extra request.
|
|
47
46
|
// `number` is **required**. Relaxing it looks harmless and is not: `epic_issue.blockers_of` maps the
|
|
48
47
|
// nodes to their numbers, so an optional one turns a `blockedBy` shape change from a failed parse —
|
|
49
48
|
// which marks the child unreadable — into an empty blocker list, and `epic:next` then hands a
|
|
50
49
|
// dependent to an unattended run before its prerequisite. Fail-safe is the direction that matters
|
|
51
|
-
// here
|
|
50
|
+
// here.
|
|
52
51
|
//
|
|
53
52
|
// `repository_url` is the repository the blocker lives in, as REST names it
|
|
54
|
-
// (`https://api.github.com/repos/<owner>/<repo>`). Carried
|
|
55
|
-
//
|
|
53
|
+
// (`https://api.github.com/repos/<owner>/<repo>`). Carried because a `blocked-by` relation may
|
|
54
|
+
// cross a repository, and a reader that keeps only the number resolves it
|
|
56
55
|
// against the blocked child's own repository — a different issue, or none. Optional because a
|
|
57
56
|
// caller that only wants numbers must not be made to fail on a response shape it never reads.
|
|
58
57
|
const blocking_issue_schema = z.object({
|
|
@@ -62,16 +61,11 @@ const blocking_issue_schema = z.object({
|
|
|
62
61
|
})
|
|
63
62
|
|
|
64
63
|
// The blocker relations arrive as a connection — `{ nodes, totalCount }` — not a bare array.
|
|
65
|
-
//
|
|
66
|
-
//
|
|
67
|
-
// issue's own `dependencies/blocked_by` endpoint and `git-gh-issue-rest.ts` maps it back into this
|
|
68
|
-
// shape, so every reader below is unchanged.
|
|
64
|
+
// REST serves a bare array from the issue's own `dependencies/blocked_by` endpoint and
|
|
65
|
+
// `git-gh-issue-rest.ts` maps it back into this shape.
|
|
69
66
|
//
|
|
70
|
-
// **One definition, every reader.**
|
|
71
|
-
//
|
|
72
|
-
// so a shape change had three places to reach and one of them would not be noticed. That is the
|
|
73
|
-
// duplication joshuafolkken/kit#862 removed from the epic commands, reintroduced by the readers that
|
|
74
|
-
// came after (joshuafolkken/kit#1005).
|
|
67
|
+
// **One definition, every reader.** A copy per reader, each naming only the fields its own caller
|
|
68
|
+
// wants, would give a shape change several places to reach, one of which would not be noticed.
|
|
75
69
|
//
|
|
76
70
|
// `nodes` is a page — `blockedBy(first:50)` under GraphQL, one unpaged `per_page=100` request under
|
|
77
71
|
// REST — while `totalCount` is exact, read from the issue's own dependency summary. A reader that
|
|
@@ -80,8 +74,7 @@ const blocking_issue_schema = z.object({
|
|
|
80
74
|
// reads as complete. Every issue the reads go through carries one, so that is a guard rather than
|
|
81
75
|
// a case. **Only the `auto-ok` pickup compares them**; the epic readers judge from the page they
|
|
82
76
|
// were given, so an epic child declaring more blockers than one page holds is read from the first
|
|
83
|
-
// page. Carried here so the field is available, not because every reader consults it
|
|
84
|
-
// (joshuafolkken/kit#1005).
|
|
77
|
+
// page. Carried here so the field is available, not because every reader consults it.
|
|
85
78
|
const blocked_by_schema = z
|
|
86
79
|
.object({
|
|
87
80
|
nodes: z.array(blocking_issue_schema).default([]),
|
|
@@ -99,7 +92,7 @@ const epic_child_schema = z.object({
|
|
|
99
92
|
//
|
|
100
93
|
// Carried here rather than beside either reader: the pull request's conversation comments and an
|
|
101
94
|
// epic's are the *same endpoint* answering the same objects, so a second declaration of this shape
|
|
102
|
-
// would be the clone `CLAUDE.md` prohibits
|
|
95
|
+
// would be the clone `CLAUDE.md` prohibits. `ai_review_pull_comment_schema`
|
|
103
96
|
// above is the `gh --json` spelling the scan reads after the mapping, not this one.
|
|
104
97
|
const rest_comment_schema = z.looseObject({
|
|
105
98
|
body: z.string().nullish(),
|
|
@@ -112,7 +105,7 @@ const rest_comment_schema = z.looseObject({
|
|
|
112
105
|
const issue_label_schema = z.object({ name: z.string() })
|
|
113
106
|
|
|
114
107
|
// `state` is optional because most readers ignore it — only `epic-add.ts` consults it, to refuse
|
|
115
|
-
// adding a child to a closed epic
|
|
108
|
+
// adding a child to a closed epic. A reader that never asks the state field
|
|
116
109
|
// still parses cleanly.
|
|
117
110
|
const epic_subject_schema = z.object({
|
|
118
111
|
number: z.number(),
|
|
@@ -123,11 +116,11 @@ const epic_subject_schema = z.object({
|
|
|
123
116
|
|
|
124
117
|
// One row of an open-issue listing, under the field names `gh issue list --json` answered with.
|
|
125
118
|
// Three readers parse a listing through this shape: the next-issues display printed when a workflow
|
|
126
|
-
// completes
|
|
127
|
-
// `epic:next` makes before it offers a child
|
|
119
|
+
// completes, the `auto-ok` pickup, and the per-repository busy check
|
|
120
|
+
// `epic:next` makes before it offers a child.
|
|
128
121
|
//
|
|
129
|
-
// The row is *assembled* under those names rather than returned under them.
|
|
130
|
-
//
|
|
122
|
+
// The row is *assembled* under those names rather than returned under them. The listing is REST,
|
|
123
|
+
// and `blockedBy` is not part of a listing response at
|
|
131
124
|
// all: `git-gh-issue-list.ts` reads the relations from each row's own dependencies endpoint, and
|
|
132
125
|
// only for the pickup, which is the one caller whose field list names `blockedBy` at all.
|
|
133
126
|
//
|
|
@@ -140,7 +133,7 @@ const open_issue_schema = z.object({
|
|
|
140
133
|
labels: z.array(issue_label_schema).optional(),
|
|
141
134
|
createdAt: z.string(),
|
|
142
135
|
blockedBy: blocked_by_schema,
|
|
143
|
-
// Present only on the pickup listing, which reads it for the
|
|
136
|
+
// Present only on the pickup listing, which reads it for the paths each issue declares.
|
|
144
137
|
body: z.string().optional(),
|
|
145
138
|
})
|
|
146
139
|
|
|
@@ -3,7 +3,7 @@ import { GIT_TIMEOUT_MS } from '#scripts/lib/timeouts'
|
|
|
3
3
|
import { execaSync } from 'execa'
|
|
4
4
|
import { git_utilities } from './constants'
|
|
5
5
|
|
|
6
|
-
// The one place a synchronous git command is spawned from
|
|
6
|
+
// The one place a synchronous git command is spawned from — the sync
|
|
7
7
|
// counterpart of `git-spawn.ts`. Every caller here wants an answer rather than an exception, so a
|
|
8
8
|
// non-zero exit is returned as a result, and every call is bounded: a git that never answers is an
|
|
9
9
|
// unknown the caller already handles, never a hang.
|
package/scripts/git/git-spawn.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { GIT_TIMEOUT_MS } from '#scripts/lib/timeouts'
|
|
1
2
|
import { execa } from 'execa'
|
|
2
3
|
import { git_utilities } from './constants'
|
|
3
4
|
import {
|
|
@@ -9,7 +10,7 @@ import {
|
|
|
9
10
|
import { PUSH_TIMEOUT_MS } from './git-push-transport'
|
|
10
11
|
import { git_ssh_keepalive } from './git-ssh-keepalive'
|
|
11
12
|
|
|
12
|
-
// The one place the ordinary git commands are spawned from
|
|
13
|
+
// The one place the ordinary git commands are spawned from. It sits in a
|
|
13
14
|
// module of its own rather than inside `git-command.ts` so that a second command module —
|
|
14
15
|
// `git-worktree.ts` — can read it without importing the first. `read` is what resolves the git binary
|
|
15
16
|
// and turns a non-zero exit into an error, and a second spawn helper beside it would be the clone
|
|
@@ -19,26 +20,32 @@ import { git_ssh_keepalive } from './git-ssh-keepalive'
|
|
|
19
20
|
// second helper of this kind: a push needs a transport-fault retry that no other command has, so it
|
|
20
21
|
// spawns git itself. The timeout it carries is shared here by `read_remote` / `with_output_remote`. Those two files are the spawn sites of the ordinary command
|
|
21
22
|
// modules — the claim stops there. A synchronous caller goes through `git-spawn-sync.ts`, the same
|
|
22
|
-
// binary resolution with a result instead of an exception
|
|
23
|
+
// binary resolution with a result instead of an exception. Other parts of
|
|
23
24
|
// this package spawn git for their own purposes (`scripts/run/progress/run-progress-clock.ts`,
|
|
24
25
|
// `scripts/git/git-fixture-workspace.ts`), and an audit of how the git binary is resolved has to read
|
|
25
26
|
// those too.
|
|
26
27
|
|
|
27
|
-
|
|
28
|
+
// Bounded by `GIT_TIMEOUT_MS` unless the caller says otherwise, as the synchronous `git_spawn_sync.run`
|
|
29
|
+
// is: a local git that never answers ends the call instead of holding an unattended run open.
|
|
30
|
+
async function read(
|
|
31
|
+
arguments_: Array<string>,
|
|
32
|
+
timeout_ms: number = GIT_TIMEOUT_MS,
|
|
33
|
+
): Promise<string> {
|
|
28
34
|
const git_cmd = git_utilities.get_git_command_for_spawn()
|
|
29
35
|
// execa runs the binary directly with an argument array and no `shell` option, so CLI
|
|
30
36
|
// args cannot break out of a shell sandbox; the git command and args are internally
|
|
31
37
|
// controlled, never untrusted input. tssecurity:S8705 is a false positive here.
|
|
32
|
-
const { stdout } = await execa(git_cmd, arguments_) // NOSONAR
|
|
38
|
+
const { stdout } = await execa(git_cmd, arguments_, { timeout: timeout_ms }) // NOSONAR
|
|
33
39
|
|
|
34
40
|
return stdout.trimEnd()
|
|
35
41
|
}
|
|
36
42
|
|
|
37
|
-
// The budget for a git call that talks to the remote — `fetch` and `pull
|
|
38
|
-
// `read` and `with_output`
|
|
39
|
-
// a dead ssh connection for 37 minutes, stalling the unattended backlog driver whose merge step
|
|
40
|
-
// it.
|
|
41
|
-
//
|
|
43
|
+
// The budget for a git call that talks to the remote — `fetch` and `pull`.
|
|
44
|
+
// `read` and `with_output` once waited without end, and a `git fetch --prune` under `josh main:sync`
|
|
45
|
+
// sat on a dead ssh connection for 37 minutes, stalling the unattended backlog driver whose merge step
|
|
46
|
+
// runs it. Their default now is a local command's, far too short for a transfer, so a remote call
|
|
47
|
+
// still takes this one. The push's budget is reused rather than a second number chosen: both transfer
|
|
48
|
+
// objects over the same transport, and that one is already read off what a healthy transfer costs here.
|
|
42
49
|
const REMOTE_TIMEOUT_MS = PUSH_TIMEOUT_MS
|
|
43
50
|
const MS_PER_SECOND = 1000
|
|
44
51
|
|
|
@@ -46,7 +53,7 @@ const MS_PER_SECOND = 1000
|
|
|
46
53
|
// `cause` carries the same `TIMEOUT_EXIT_CODE` a timed-out push does. Unlike the push it is not
|
|
47
54
|
// retried here: what the issue needed is that the wait ends, and a failure then surfaces to the
|
|
48
55
|
// caller — `run:merge` raises a failed `main:sync` — instead of a second budget doubling the wait.
|
|
49
|
-
function
|
|
56
|
+
function to_budget_error(command: string, error: unknown, timeout_ms: number): Error {
|
|
50
57
|
if (!has_timed_out(error)) return create_spawn_error(command, get_exit_code(error))
|
|
51
58
|
|
|
52
59
|
const seconds = String(Math.round(timeout_ms / MS_PER_SECOND))
|
|
@@ -75,7 +82,7 @@ async function spawn_remote(arguments_: Array<string>, options: RemoteOptions):
|
|
|
75
82
|
|
|
76
83
|
return typeof stdout === 'string' ? stdout.trimEnd() : ''
|
|
77
84
|
} catch (error) {
|
|
78
|
-
throw
|
|
85
|
+
throw to_budget_error(arguments_[0] ?? '', error, options.timeout)
|
|
79
86
|
}
|
|
80
87
|
}
|
|
81
88
|
|
|
@@ -101,16 +108,32 @@ async function with_output_remote(command: string, arguments_list: Array<string>
|
|
|
101
108
|
})
|
|
102
109
|
}
|
|
103
110
|
|
|
104
|
-
|
|
111
|
+
// `config_options` are `-c <key>=<value>` pairs, which git reads only ahead of the command name and
|
|
112
|
+
// which last for this one call — nothing is written into anyone's git configuration.
|
|
113
|
+
//
|
|
114
|
+
// `timeout_ms` defaults to a local command's budget. A command that runs hooks — a commit, a merge,
|
|
115
|
+
// `git hook run` — is not one, and names the longer budget itself.
|
|
116
|
+
interface OutputOptions {
|
|
117
|
+
config_options?: ReadonlyArray<string>
|
|
118
|
+
timeout_ms?: number
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
async function with_output(
|
|
122
|
+
command: string,
|
|
123
|
+
arguments_list: Array<string>,
|
|
124
|
+
options: OutputOptions = {},
|
|
125
|
+
): Promise<void> {
|
|
126
|
+
const { config_options = [], timeout_ms = GIT_TIMEOUT_MS } = options
|
|
105
127
|
const git_command_bin = git_utilities.get_git_command_for_spawn()
|
|
128
|
+
const spawn_arguments = [...config_options, command, ...arguments_list]
|
|
106
129
|
|
|
107
130
|
try {
|
|
108
131
|
// execa runs the binary directly with an argument array and no `shell` option, so CLI
|
|
109
132
|
// args cannot break out of a shell sandbox; the git command and args are internally
|
|
110
133
|
// controlled, never untrusted input. tssecurity:S8705 is a false positive here.
|
|
111
|
-
await execa(git_command_bin,
|
|
134
|
+
await execa(git_command_bin, spawn_arguments, { stdio: 'inherit', timeout: timeout_ms }) // NOSONAR
|
|
112
135
|
} catch (error) {
|
|
113
|
-
throw
|
|
136
|
+
throw to_budget_error(command, error, timeout_ms)
|
|
114
137
|
}
|
|
115
138
|
}
|
|
116
139
|
|
|
@@ -1,8 +1,10 @@
|
|
|
1
|
+
import { PROBE_TIMEOUT_MS } from '#scripts/lib/timeouts'
|
|
1
2
|
import { execa } from 'execa'
|
|
2
3
|
import { git_utilities } from './constants'
|
|
4
|
+
import { has_timed_out } from './git-execa-error'
|
|
3
5
|
|
|
4
|
-
// The ssh environment every git network call runs under
|
|
5
|
-
// `git-push-transport.ts` as the push's own
|
|
6
|
+
// The ssh environment every git network call runs under. It began inside
|
|
7
|
+
// `git-push-transport.ts` as the push's own, and moved here when the fetch
|
|
6
8
|
// and pull of `josh main:sync` turned out to need the same thing: a dead connection under a `git
|
|
7
9
|
// fetch` was waited on for 37 minutes, stalling the unattended backlog driver behind it.
|
|
8
10
|
//
|
|
@@ -16,6 +18,8 @@ const SSH_COMMAND_VARIABLE = 'GIT_SSH_COMMAND'
|
|
|
16
18
|
const SSH_LEGACY_VARIABLE = 'GIT_SSH'
|
|
17
19
|
const KEEPALIVE_SSH_COMMAND = `ssh ${SSH_KEEPALIVE_OPTIONS}`
|
|
18
20
|
const SSH_COMMAND_CONFIG_KEY = 'core.sshCommand'
|
|
21
|
+
const CONFIG_PROBE_ARGUMENTS = ['config', '--get', SSH_COMMAND_CONFIG_KEY]
|
|
22
|
+
const PROBE_OPTIONS = { timeout: PROBE_TIMEOUT_MS }
|
|
19
23
|
|
|
20
24
|
// Whatever already decides how ssh is invoked, or an empty string when nothing does. git reads three
|
|
21
25
|
// sources in this order — `GIT_SSH_COMMAND`, `core.sshCommand`, then the legacy `GIT_SSH` — and the
|
|
@@ -50,12 +54,15 @@ async function has_configured_ssh_command(): Promise<boolean> {
|
|
|
50
54
|
// execa runs the binary directly with an argument array and no `shell` option, so CLI
|
|
51
55
|
// args cannot break out of a shell sandbox; the git command and args are internally
|
|
52
56
|
// controlled, never untrusted input. tssecurity:S8705 is a false positive here.
|
|
53
|
-
const { stdout } = await execa(git_command_bin,
|
|
57
|
+
const { stdout } = await execa(git_command_bin, CONFIG_PROBE_ARGUMENTS, PROBE_OPTIONS) // NOSONAR
|
|
54
58
|
|
|
55
59
|
return stdout.trim() !== ''
|
|
56
|
-
} catch {
|
|
60
|
+
} catch (error) {
|
|
57
61
|
// `git config --get` exits 1 when the key is unset, which is the answer rather than a failure.
|
|
58
|
-
|
|
62
|
+
// A probe that never answers lands here as well: the remote call awaits this before its own
|
|
63
|
+
// budget starts, so a wait here is one that budget cannot end. It did not say the key is unset,
|
|
64
|
+
// so it reads as configured — guessing "unset" would put a plain `ssh` over a per-repository key.
|
|
65
|
+
return has_timed_out(error)
|
|
59
66
|
}
|
|
60
67
|
}
|
|
61
68
|
|
|
@@ -68,17 +68,16 @@ async function stage_untracked_files(files: ReadonlyArray<string>): Promise<void
|
|
|
68
68
|
for (const file of files) console.info(` + ${file}`)
|
|
69
69
|
}
|
|
70
70
|
|
|
71
|
-
// **The observation ledger rides the run's own commit
|
|
72
|
-
//
|
|
73
|
-
//
|
|
74
|
-
//
|
|
75
|
-
// the pull request whose run recorded them, while CI for that pull request is the only wait.
|
|
71
|
+
// **The observation ledger rides the run's own commit**. Committing it separately would cost a
|
|
72
|
+
// second branch, CI wait and merge behind every run that appended a line. Staged with the run, the
|
|
73
|
+
// lines are reviewed and merged with the pull request whose run recorded them, while CI for that pull
|
|
74
|
+
// request is the only wait.
|
|
76
75
|
//
|
|
77
|
-
// **A line that breaks the grammar keeps the old exclusion
|
|
76
|
+
// **A line that breaks the grammar keeps the old exclusion**: the commit
|
|
78
77
|
// goes ahead without the ledger, and `pnpm josh observations:flush` — which refuses the same line and
|
|
79
78
|
// names it — is where it is repaired. The migration is run first, as the flush runs it, so a line
|
|
80
|
-
// still on an old path
|
|
81
|
-
// own lines
|
|
79
|
+
// still on an old path is committed in the directory. **A lane carries its
|
|
80
|
+
// own lines**: its writers append to its own tree's issue file, so this is
|
|
82
81
|
// the step that takes them to the default branch.
|
|
83
82
|
const LEDGER_PATHSPECS: ReadonlyArray<string> = [
|
|
84
83
|
...LEDGER_DIRECTORIES,
|
|
@@ -189,7 +189,7 @@ function build_commit_message(
|
|
|
189
189
|
}
|
|
190
190
|
|
|
191
191
|
// The file form exists because the PR body now carries a live-execution evidence section of commands
|
|
192
|
-
// and their output
|
|
192
|
+
// and their output — text an inline double-quoted `--body` would have the shell
|
|
193
193
|
// evaluate first. Resolved through `cli_body`, the shared reader every `*-file` flag uses.
|
|
194
194
|
function resolve_pr_body(values: CliArguments['values']): string | undefined {
|
|
195
195
|
return cli_body.resolve({
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
+
import { INSTALL_TIMEOUT_MS, SUITE_TIMEOUT_MS } from '#scripts/lib/timeouts'
|
|
1
2
|
import { PORCELAIN_FLAG } from './constants'
|
|
2
3
|
import { ls_remote_branch_arguments } from './git-ls-remote'
|
|
3
4
|
import { git_spawn } from './git-spawn'
|
|
4
5
|
import { repository_lock } from './repository-lock'
|
|
5
6
|
|
|
6
|
-
// The four worktree reads and writes a lane's lifecycle needs, plus the branch deletion that ends it
|
|
7
|
-
//
|
|
7
|
+
// The four worktree reads and writes a lane's lifecycle needs, plus the branch deletion that ends it.
|
|
8
|
+
// They live
|
|
8
9
|
// beside the other git commands rather than in `scripts/lane/` because `git_spawn.read` is what
|
|
9
10
|
// resolves the git binary and turns a non-zero exit into an error — a second spawn helper next to it
|
|
10
11
|
// would be the clone `CLAUDE.md` prohibits, so this module imports the shared one.
|
|
@@ -13,15 +14,14 @@ import { repository_lock } from './repository-lock'
|
|
|
13
14
|
// asynchronous `git ls-remote` spawn, and a second spawn helper beside it would be that same clone.
|
|
14
15
|
// **It is not the only one in this package** — `propagate_git.has_remote_branch` runs the same query
|
|
15
16
|
// synchronously against a consumer's path, and the two share their arguments through
|
|
16
|
-
// `git-ls-remote.ts` rather than the spawn
|
|
17
|
-
//
|
|
18
|
-
//
|
|
19
|
-
//
|
|
20
|
-
// (joshuafolkken/kit#1641; before it, `lane-start-point.ts` was the only reader and did both).
|
|
17
|
+
// `git-ls-remote.ts` rather than the spawn. Its sole caller is `git-remote-branch.ts`, which turns
|
|
18
|
+
// the raw output into the three-way answer (`absent` / `present` / `unreachable`) that
|
|
19
|
+
// `lane-start-point.ts` and `release-publish.ts` both act on — so this module stops at "what git
|
|
20
|
+
// printed" and the meaning of it is decided there.
|
|
21
21
|
const WORKTREE = 'worktree'
|
|
22
22
|
|
|
23
|
-
// **Every call that writes `.git/worktrees/` runs under one repository-wide lock
|
|
24
|
-
//
|
|
23
|
+
// **Every call that writes `.git/worktrees/` runs under one repository-wide lock**.
|
|
24
|
+
// `git worktree add` is not safe against itself: while one add is still
|
|
25
25
|
// building `.git/worktrees/<id>/` — its `commondir` not yet written — a second add enumerates the
|
|
26
26
|
// existing registrations, reads the half-built one and fails with `fatal: failed to read
|
|
27
27
|
// .git/worktrees/<id>/commondir`. Two lanes opened at once do exactly that, and the per-seat lock in
|
|
@@ -33,10 +33,13 @@ const WORKTREE_LOCK_PREFIX = 'josh-worktree-lock-'
|
|
|
33
33
|
// because a large repository's checkout is itself several seconds, and several lanes queue behind it.
|
|
34
34
|
const WORKTREE_LOCK_MAX_WAIT_MS = 120_000
|
|
35
35
|
|
|
36
|
-
|
|
36
|
+
// `timeout_ms` is left out by every call that only edits git's own records. An add checks a tree out
|
|
37
|
+
// and so runs the `post-checkout` hook — a `pnpm install` in some consumers — on a suite's budget
|
|
38
|
+
// instead of a local git command's, and a removal names the budget of what it deletes.
|
|
39
|
+
async function locked(arguments_: Array<string>, timeout_ms?: number): Promise<string> {
|
|
37
40
|
const target = repository_lock.lock_path(WORKTREE_LOCK_PREFIX)
|
|
38
41
|
const output = await repository_lock.with_lock(
|
|
39
|
-
async () => await git_spawn.read(arguments_),
|
|
42
|
+
async () => await git_spawn.read(arguments_, timeout_ms),
|
|
40
43
|
target,
|
|
41
44
|
WORKTREE_LOCK_MAX_WAIT_MS,
|
|
42
45
|
)
|
|
@@ -61,15 +64,15 @@ async function worktree_list(): Promise<string> {
|
|
|
61
64
|
// a detached HEAD; `start_point` is passed explicitly rather than left to `HEAD`, because a lane is
|
|
62
65
|
// branched from the default branch whatever the checkout that opened it happens to be sitting on.
|
|
63
66
|
//
|
|
64
|
-
// **`--no-track` is load-bearing now that the start point is a remote-tracking ref
|
|
65
|
-
//
|
|
67
|
+
// **`--no-track` is load-bearing now that the start point is a remote-tracking ref**.
|
|
68
|
+
// Branching from `refs/remotes/origin/<default>` makes git's default
|
|
66
69
|
// `branch.autoSetupMerge` set `branch.<lane>.merge=refs/heads/<default>`, and a bare `git push` from
|
|
67
70
|
// the lane then fails with "the upstream branch of your current branch does not match the name of
|
|
68
71
|
// your current branch" — which is *not* the missing-upstream error `push()` retries as
|
|
69
72
|
// `--set-upstream`, so every lane's `pnpm josh git` would stop there. Measured against git 2.x.
|
|
70
73
|
//
|
|
71
74
|
// **An absent `start_point` attaches the tree to the branch that is already there, and neither flag
|
|
72
|
-
// is passed then
|
|
75
|
+
// is passed then**. `-b` refuses a branch that exists, so a lane whose child
|
|
73
76
|
// had already pushed could not be reopened at all; deleting the branch first to get `-b` back would
|
|
74
77
|
// discard those commits and orphan the pull request. `--no-track` cannot ride along either — git
|
|
75
78
|
// answers `--[no-]track can only be used if a new branch is created` — and it has nothing to do here:
|
|
@@ -81,22 +84,25 @@ async function worktree_add(
|
|
|
81
84
|
): Promise<string> {
|
|
82
85
|
const flags = start_point === undefined ? ['add'] : ['add', '--no-track', '-b', branch_name]
|
|
83
86
|
|
|
84
|
-
return await locked([WORKTREE, ...flags, directory, start_point ?? branch_name])
|
|
87
|
+
return await locked([WORKTREE, ...flags, directory, start_point ?? branch_name], SUITE_TIMEOUT_MS)
|
|
85
88
|
}
|
|
86
89
|
|
|
87
90
|
// A throwaway tree at one commit, on no branch — `josh test:red` checks the merge-base out here, so
|
|
88
|
-
// the pre-fix tree is built without creating a branch or touching the caller's tree and index
|
|
89
|
-
// (joshuafolkken/kit#2448).
|
|
91
|
+
// the pre-fix tree is built without creating a branch or touching the caller's tree and index.
|
|
90
92
|
async function worktree_add_detached(directory: string, commit: string): Promise<string> {
|
|
91
|
-
return await locked([WORKTREE, 'add', '--detach', directory, commit])
|
|
93
|
+
return await locked([WORKTREE, 'add', '--detach', directory, commit], SUITE_TIMEOUT_MS)
|
|
92
94
|
}
|
|
93
95
|
|
|
94
96
|
// **`--force` is the point, not a convenience.** A lane is closed after a park, a failure or an
|
|
95
97
|
// interruption as readily as after a success, and in each of those the tree still holds uncommitted
|
|
96
98
|
// or untracked work. Refusing to remove it there would leave exactly the debris the close exists to
|
|
97
99
|
// prevent.
|
|
100
|
+
//
|
|
101
|
+
// **It takes an install's budget, not a local git command's.** The tree it deletes holds the
|
|
102
|
+
// `node_modules` an install wrote, and a removal cut partway leaves a half-deleted tree git still
|
|
103
|
+
// registers — which `release_worktree.remove` does not step over, so the release branch stays too.
|
|
98
104
|
async function worktree_remove(directory: string): Promise<string> {
|
|
99
|
-
return await locked([WORKTREE, 'remove', '--force', directory])
|
|
105
|
+
return await locked([WORKTREE, 'remove', '--force', directory], INSTALL_TIMEOUT_MS)
|
|
100
106
|
}
|
|
101
107
|
|
|
102
108
|
// Drops the registrations whose directories are already gone — what makes a lane whose directory was
|
|
@@ -105,21 +111,23 @@ async function worktree_prune(): Promise<string> {
|
|
|
105
111
|
return await locked([WORKTREE, 'prune'])
|
|
106
112
|
}
|
|
107
113
|
|
|
108
|
-
// **Asked of the remote itself, because nothing prunes the remote-tracking refs
|
|
109
|
-
//
|
|
114
|
+
// **Asked of the remote itself, because nothing prunes the remote-tracking refs**.
|
|
115
|
+
// `lane:close` deletes the local branch, GitHub deletes the remote one at
|
|
110
116
|
// the merge, and `refs/remotes/origin/<N>-lane` outlives both: this repository carried sixteen of
|
|
111
117
|
// them for branches the remote no longer had. Empty output on a zero exit is therefore "not on the
|
|
112
118
|
// remote", which a stale ref cannot say, and a non-zero exit is "could not ask" — a different answer
|
|
113
119
|
// again, and the reason the caller cannot use `fetch` for this: `fetch` fails identically for a
|
|
114
120
|
// branch that is gone and for a network that is down, and prunes neither (measured on git 2.x).
|
|
115
121
|
//
|
|
116
|
-
// **The arguments come from `git-ls-remote.ts`, which is the single source of the full ref path
|
|
117
|
-
//
|
|
118
|
-
//
|
|
119
|
-
//
|
|
120
|
-
//
|
|
122
|
+
// **The arguments come from `git-ls-remote.ts`, which is the single source of the full ref path.**
|
|
123
|
+
// An unanchored ref would make the message untruthful rather than the answer unsafe: `lane:open`
|
|
124
|
+
// would be told origin has the lane branch and then stop naming a branch nobody could find there,
|
|
125
|
+
// and the release guard would refuse a name that was free.
|
|
126
|
+
//
|
|
127
|
+
// **It takes the remote budget, not `read`'s**: that default is a local command's, and an ssh that
|
|
128
|
+
// is slow to connect or waiting at a passphrase prompt would be cut there and read as `unreachable`.
|
|
121
129
|
async function ls_remote_branch(branch_name: string): Promise<string> {
|
|
122
|
-
return await git_spawn.
|
|
130
|
+
return await git_spawn.read_remote(ls_remote_branch_arguments(branch_name))
|
|
123
131
|
}
|
|
124
132
|
|
|
125
133
|
// `-D` rather than `-d`: a lane branch is deleted whatever state its work reached, and `-d` refuses
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { git_spawn } from './git-spawn'
|
|
2
2
|
|
|
3
|
-
// The local branches `josh ms` removes after it syncs
|
|
3
|
+
// The local branches `josh ms` removes after it syncs. The repository
|
|
4
4
|
// deletes a pull request's remote branch at the merge, and nothing removed the local copy: measured on
|
|
5
5
|
// 2026-09-24, 212 of the primary checkout's 244 local branches tracked an upstream that was `[gone]`.
|
|
6
6
|
//
|
|
@@ -102,7 +102,7 @@ async function delete_each(names: ReadonlyArray<string>): Promise<PruneResult> {
|
|
|
102
102
|
|
|
103
103
|
// `fetch --prune` first, because `[gone]` is read from the remote-tracking refs and those outlive the
|
|
104
104
|
// remote branch until something prunes them. The fetch is the one call here that reaches the remote,
|
|
105
|
-
// so it is the one bounded
|
|
105
|
+
// so it is the one bounded.
|
|
106
106
|
async function prune(default_branch: string): Promise<PruneResult> {
|
|
107
107
|
await git_spawn.read_remote(['fetch', '--prune'])
|
|
108
108
|
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { MAX_SCANNED } from '#scripts/gh/git-gh-issue-list'
|
|
2
2
|
|
|
3
|
-
// Why an open-issue listing stopped short of the end of the backlog, or that it did not
|
|
4
|
-
// (joshuafolkken/kit#1067).
|
|
3
|
+
// Why an open-issue listing stopped short of the end of the backlog, or that it did not.
|
|
5
4
|
//
|
|
6
5
|
// Every caller of `issue_list` asks this same question, and before this the answer was written
|
|
7
6
|
// out again at each of them — `rows.length >= LIMIT` in `epic:bundle` and the `auto-ok` pickup, a
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto'
|
|
2
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs'
|
|
3
|
+
import path from 'node:path'
|
|
4
|
+
import { lane_install } from '#scripts/lane/lane-install'
|
|
5
|
+
|
|
6
|
+
// Keeping the primary checkout's `node_modules` in step with its lock. A
|
|
7
|
+
// fast-forward that brought in a merge adding `cli-spinners` left the primary checkout without it, and
|
|
8
|
+
// every `josh` typed there — the supervisor's driver included — failed with `ERR_MODULE_NOT_FOUND`
|
|
9
|
+
// until someone ran the install by hand.
|
|
10
|
+
//
|
|
11
|
+
// **The trigger is the lock differing from the one last installed, not the sync itself.** Most syncs
|
|
12
|
+
// pull no dependency change, and an install on every one would cost seconds per child for nothing. The
|
|
13
|
+
// comparison is against a record written after a successful install rather than against the lock read
|
|
14
|
+
// before the sync: a sync-relative trigger forgets a failed install, so the retry saw an unchanged lock
|
|
15
|
+
// and left `node_modules` stale, where this one keeps asking until an install succeeds. The record lives
|
|
16
|
+
// inside `node_modules`, so deleting the directory forgets it too. The install is `lane_install`'s, so
|
|
17
|
+
// `--frozen-lockfile`, the buffered output and the timeout stay single-sourced with the lane's own fill.
|
|
18
|
+
|
|
19
|
+
const LOCKFILE_NAME = 'pnpm-lock.yaml'
|
|
20
|
+
const RECORD_PATH = path.join('node_modules', '.josh-installed-lock')
|
|
21
|
+
|
|
22
|
+
const UP_TO_DATE = { is_installed: true, output: '' }
|
|
23
|
+
|
|
24
|
+
interface LockfileSyncResult {
|
|
25
|
+
is_installed: boolean
|
|
26
|
+
output: string
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function read_text(file_path: string): string | undefined {
|
|
30
|
+
return existsSync(file_path) ? readFileSync(file_path, 'utf8') : undefined
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function digest(content: string): string {
|
|
34
|
+
return createHash('sha256').update(content).digest('hex')
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
function record(directory: string, lock_digest: string): void {
|
|
38
|
+
const record_path = path.join(directory, RECORD_PATH)
|
|
39
|
+
|
|
40
|
+
mkdirSync(path.dirname(record_path), { recursive: true })
|
|
41
|
+
writeFileSync(record_path, lock_digest)
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Reinstall when the lock in `directory` differs from the one the last successful install recorded.
|
|
46
|
+
* A checkout with no lock, or one already installed, spawns nothing and reports installed.
|
|
47
|
+
*/
|
|
48
|
+
async function reinstall_if_stale(directory: string): Promise<LockfileSyncResult> {
|
|
49
|
+
const lock = read_text(path.join(directory, LOCKFILE_NAME))
|
|
50
|
+
|
|
51
|
+
if (lock === undefined) return UP_TO_DATE
|
|
52
|
+
const lock_digest = digest(lock)
|
|
53
|
+
|
|
54
|
+
if (read_text(path.join(directory, RECORD_PATH)) === lock_digest) return UP_TO_DATE
|
|
55
|
+
const result = await lane_install.install_dependencies(directory)
|
|
56
|
+
|
|
57
|
+
if (result.is_installed) record(directory, lock_digest)
|
|
58
|
+
|
|
59
|
+
return result
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
const lockfile_sync = { reinstall_if_stale }
|
|
63
|
+
|
|
64
|
+
export type { LockfileSyncResult }
|
|
65
|
+
export { lockfile_sync, LOCKFILE_NAME, RECORD_PATH }
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { git_spawn } from './git-spawn'
|
|
2
2
|
|
|
3
|
-
// What `josh main:merge` refuses before it merges, and what it tells the run to do instead
|
|
4
|
-
// (joshuafolkken/kit#2445).
|
|
3
|
+
// What `josh main:merge` refuses before it merges, and what it tells the run to do instead.
|
|
5
4
|
//
|
|
6
5
|
// **A dirty tree is not refused as such.** The chain runs `main:merge` before the commit, over the
|
|
7
6
|
// uncommitted implementation, and git carries uncommitted changes through a merge that touches none of
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
#!/usr/bin/env tsx
|
|
2
2
|
import { fileURLToPath } from 'node:url'
|
|
3
3
|
import { extract_issue_number } from '#scripts/hooks/check-commit-message'
|
|
4
|
+
import { issue_cite } from '#scripts/issue/issue-cite'
|
|
4
5
|
import { composite_arguments, USAGE_ERROR_EXIT_CODE } from '#scripts/josh/josh-composite-arguments'
|
|
5
6
|
import { error_text } from '#scripts/lib/error-message'
|
|
6
7
|
import { git_command } from './git-command'
|
|
7
8
|
import { main_merge_guard } from './main-merge-guard'
|
|
8
9
|
|
|
9
|
-
// `josh main:merge` (`josh mm`) — bring the default branch into the branch this checkout is on
|
|
10
|
-
// (joshuafolkken/kit#1659).
|
|
10
|
+
// `josh main:merge` (`josh mm`) — bring the default branch into the branch this checkout is on.
|
|
11
11
|
//
|
|
12
12
|
// **It stopped being a `git pull` because `git pull` cannot decide anything on a diverged branch.**
|
|
13
13
|
// With neither `pull.rebase` nor `pull.ff` set — the state of a checkout nobody has configured — git
|
|
@@ -21,7 +21,7 @@ import { main_merge_guard } from './main-merge-guard'
|
|
|
21
21
|
//
|
|
22
22
|
// The strategy is therefore named by this file rather than read out of whoever's git configuration
|
|
23
23
|
// happens to be in force: **fetch, then merge `origin/<default>` into the current branch.** Merging
|
|
24
|
-
// rather than rebasing
|
|
24
|
+
// rather than rebasing because a rebase rewrites
|
|
25
25
|
// commits that are already pushed, so it needs a force push, which `.claude/settings.json` denies.
|
|
26
26
|
//
|
|
27
27
|
// `git_command.merge_fast_forward` is deliberately not reused: it passes `--ff-only`, which fails
|
|
@@ -33,7 +33,7 @@ const ARGV_OFFSET = 2
|
|
|
33
33
|
const COMMAND_NAME = 'main:merge'
|
|
34
34
|
|
|
35
35
|
// git's default merge message carries no `#N`, so on an issue branch the `commit-msg` hook refuses
|
|
36
|
-
// it and leaves the index mid-merge
|
|
36
|
+
// it and leaves the index mid-merge. The number is read with the hook's
|
|
37
37
|
// own parser, so the message this writes is exactly the one that hook accepts; a branch without a
|
|
38
38
|
// number keeps git's default.
|
|
39
39
|
function merge_message(default_branch: string, current_branch: string): string | undefined {
|
|
@@ -41,10 +41,10 @@ function merge_message(default_branch: string, current_branch: string): string |
|
|
|
41
41
|
|
|
42
42
|
if (issue_number === undefined) return undefined
|
|
43
43
|
|
|
44
|
-
return `Merge ${default_branch} into ${current_branch}
|
|
44
|
+
return `Merge ${default_branch} into ${current_branch} ${issue_cite.plain(issue_number)}`
|
|
45
45
|
}
|
|
46
46
|
|
|
47
|
-
// What one merge of the default branch came to
|
|
47
|
+
// What one merge of the default branch came to. `josh ship` merges it again
|
|
48
48
|
// before the commit and on a conflicting pull request, and branches on the answer rather than on an
|
|
49
49
|
// exit code: `current` brought nothing in, so the tree is unchanged; `merged` changed it; `refused`
|
|
50
50
|
// is the guard's answer, nothing attempted; `conflict` names the paths git left unmerged, so a resumed
|
|
@@ -81,7 +81,7 @@ async function merge_into(target: MergeTarget): Promise<MergeOutcome> {
|
|
|
81
81
|
|
|
82
82
|
// The fetch is what makes `origin/<default>` current before the merge reads it. `git pull` did the
|
|
83
83
|
// two together, which is the only thing it was doing here that is worth keeping. The refusal is read
|
|
84
|
-
// after the fetch, so the incoming paths are the ones the merge would bring in
|
|
84
|
+
// after the fetch, so the incoming paths are the ones the merge would bring in.
|
|
85
85
|
async function merge(): Promise<MergeOutcome> {
|
|
86
86
|
const default_branch = await git_command.get_default_branch()
|
|
87
87
|
const current_branch = await git_command.branch()
|