@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
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// Captures the number, so the one pattern answers every question asked of a PR body: whether the
|
|
2
|
-
// linked issue will auto-close, which issue that is when the invocation did not say
|
|
3
|
-
//
|
|
4
|
-
// unfinished
|
|
2
|
+
// linked issue will auto-close, which issue that is when the invocation did not say,
|
|
3
|
+
// and whether a merged pull request closes a child a `backlogrun` judged
|
|
4
|
+
// unfinished. A second pattern would be two readings of "closes #N" to disagree.
|
|
5
5
|
const CLOSES_PATTERN = /closes\s+#(\d+)/iu
|
|
6
6
|
|
|
7
7
|
function parse_closes_issue_number(body: string | undefined): string | undefined {
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { SUITE_TIMEOUT_MS } from '#scripts/lib/timeouts'
|
|
1
2
|
import { PORCELAIN_FLAG, UNTRACKED_FILES_FLAG } from './constants'
|
|
2
3
|
import { git_diff_reads } from './git-diff-reads'
|
|
3
4
|
import { create_spawn_error } from './git-execa-error'
|
|
@@ -10,7 +11,7 @@ async function branch(): Promise<string> {
|
|
|
10
11
|
return await git_spawn.read(['rev-parse', '--abbrev-ref', 'HEAD'])
|
|
11
12
|
}
|
|
12
13
|
|
|
13
|
-
// **The untracked-files mode is passed rather than inherited
|
|
14
|
+
// **The untracked-files mode is passed rather than inherited**. Every
|
|
14
15
|
// reader of this output depends on the `??` lines being there: `git-staging.ts` stages exactly those,
|
|
15
16
|
// and `hook-gate-reuse.ts` reads an empty output as "this push carries the recorded tree". A person
|
|
16
17
|
// with `status.showUntrackedFiles=no` in their git config — a common setting on large repositories —
|
|
@@ -18,8 +19,8 @@ async function branch(): Promise<string> {
|
|
|
18
19
|
// pre-push hook reuses a record for a commit that does not contain them. Naming the mode makes the
|
|
19
20
|
// reading answer to this codebase rather than to whoever ran it.
|
|
20
21
|
//
|
|
21
|
-
// **`all` rather than `normal`, so a new file is named even inside an untracked directory
|
|
22
|
-
//
|
|
22
|
+
// **`all` rather than `normal`, so a new file is named even inside an untracked directory**.
|
|
23
|
+
// `normal` collapses it to `?? docs/maintainers/`, and every reader that
|
|
23
24
|
// recognizes the observation ledger by its path then misses it: `git-staging.ts` stages the directory
|
|
24
25
|
// — ledger included — into an unrelated pull request, and the flush refuses the directory as "other
|
|
25
26
|
// changes".
|
|
@@ -33,7 +34,7 @@ async function status(directory?: string): Promise<string> {
|
|
|
33
34
|
// The absolute path every other git command's output is relative to. Asking git rather than reading
|
|
34
35
|
// `process.cwd()` is the whole point: run from a subdirectory, joining a repository-relative path
|
|
35
36
|
// onto the working directory resolves to nothing, and a digest map built that way collapses to
|
|
36
|
-
// "every file absent" — which compares *equal* to another such map
|
|
37
|
+
// "every file absent" — which compares *equal* to another such map.
|
|
37
38
|
async function repository_root(): Promise<string> {
|
|
38
39
|
const result = git_spawn_sync.toplevel()
|
|
39
40
|
if (result.exit_code !== 0) throw create_spawn_error('rev-parse', result.exit_code)
|
|
@@ -43,8 +44,7 @@ async function repository_root(): Promise<string> {
|
|
|
43
44
|
|
|
44
45
|
// The commit this checkout is sitting on, as opposed to `change_base_commit`'s commit a change is
|
|
45
46
|
// measured against. Read by `josh review:brief` to say which tree a review was
|
|
46
|
-
// briefed on, so a review that read a different one can be told apart from one that read this one
|
|
47
|
-
// (joshuafolkken/kit#1522).
|
|
47
|
+
// briefed on, so a review that read a different one can be told apart from one that read this one.
|
|
48
48
|
async function head_commit(): Promise<string> {
|
|
49
49
|
return await git_spawn.read(['rev-parse', 'HEAD'])
|
|
50
50
|
}
|
|
@@ -53,9 +53,9 @@ async function head_commit(): Promise<string> {
|
|
|
53
53
|
// same path; in a linked work tree the first is `<repo>/.git/worktrees/<name>` and the second is
|
|
54
54
|
// `<repo>/.git`, and the commit-message file lives under the first. Asking git rather than assuming
|
|
55
55
|
// a directory named `.git` is what makes a bare repository and a `--separate-git-dir` clone answer
|
|
56
|
-
// correctly too
|
|
56
|
+
// correctly too.
|
|
57
57
|
// Exported so a caller that must ask the same question **synchronously** asks it with the same
|
|
58
|
-
// arguments rather than a second spelling of them
|
|
58
|
+
// arguments rather than a second spelling of them. `git_spawn` is
|
|
59
59
|
// asynchronous throughout and a `PreToolUse` guard is synchronous by contract, so the one place that
|
|
60
60
|
// needs it runs these arguments itself — sharing the list is what keeps that from becoming a clone.
|
|
61
61
|
const GIT_DIRECTORY_ARGUMENTS: ReadonlyArray<string> = [
|
|
@@ -76,7 +76,7 @@ async function diff_cached(file_path: string): Promise<string> {
|
|
|
76
76
|
}
|
|
77
77
|
|
|
78
78
|
// One branch from `origin`, fetched by name. `gh pr checkout` did this itself after resolving the
|
|
79
|
-
// head branch through GraphQL, which a cloud session is answered 403 for
|
|
79
|
+
// head branch through GraphQL, which a cloud session is answered 403 for;
|
|
80
80
|
// the resolution moved to REST and the fetch is spelled out here instead of being re-wrapped.
|
|
81
81
|
//
|
|
82
82
|
// The refspec is written out rather than left to the remote's configuration. A bare branch name is
|
|
@@ -84,61 +84,73 @@ async function diff_cached(file_path: string): Promise<string> {
|
|
|
84
84
|
// clone, and every `actions/checkout` checkout, narrow it to one branch, and there a bare name
|
|
85
85
|
// updates `FETCH_HEAD` alone. The `checkout` and the fast-forward that follow both read
|
|
86
86
|
// `refs/remotes/origin/<branch>`, so naming the destination is what keeps them working off this
|
|
87
|
-
// repository's own machine
|
|
87
|
+
// repository's own machine. `+` allows a forced update, matching what the
|
|
88
88
|
// default refspec does.
|
|
89
89
|
async function fetch_branch(branch_name: string): Promise<string> {
|
|
90
90
|
const refspec = `+refs/heads/${branch_name}:refs/remotes/origin/${branch_name}`
|
|
91
91
|
|
|
92
|
-
return await git_spawn.
|
|
92
|
+
return await git_spawn.read_remote(['fetch', 'origin', refspec])
|
|
93
93
|
}
|
|
94
94
|
|
|
95
95
|
// The fast-forward `gh pr checkout` ran after its fetch, for the case the branch is already local.
|
|
96
96
|
// Without it a second `josh sdp <pr>` run works on the commit the first one left behind: the pin
|
|
97
97
|
// sync reads a stale `.github/workflows` and either reports "already in sync" or commits onto a base
|
|
98
|
-
// that `push` then rejects
|
|
98
|
+
// that `push` then rejects.
|
|
99
99
|
//
|
|
100
100
|
// `--ff-only` is the whole point — a branch that has diverged fails loudly rather than growing a
|
|
101
101
|
// merge commit nobody asked for, which is the behavior the CLI had.
|
|
102
|
+
//
|
|
103
|
+
// It moves the working tree, so it runs the `post-merge` hook and takes a suite's budget for it.
|
|
102
104
|
async function merge_fast_forward(branch_name: string): Promise<string> {
|
|
103
|
-
return await git_spawn.read(['merge', '--ff-only', `origin/${branch_name}`])
|
|
105
|
+
return await git_spawn.read(['merge', '--ff-only', `origin/${branch_name}`], SUITE_TIMEOUT_MS)
|
|
104
106
|
}
|
|
105
107
|
|
|
106
|
-
// The same fast-forward for a branch that is *not* checked out, so no file in the working tree moves
|
|
107
|
-
//
|
|
108
|
+
// The same fast-forward for a branch that is *not* checked out, so no file in the working tree moves.
|
|
109
|
+
// A plain refspec refuses a non-fast-forward update, and git refuses it
|
|
108
110
|
// outright for a branch checked out in any work tree — both are failures, never a rewrite.
|
|
109
111
|
async function fast_forward_local(branch_name: string): Promise<string> {
|
|
110
|
-
return await git_spawn.
|
|
112
|
+
return await git_spawn.read_remote(['fetch', 'origin', `${branch_name}:${branch_name}`])
|
|
111
113
|
}
|
|
112
114
|
|
|
113
115
|
// The merge `josh main:merge` runs, and the deliberate opposite of the one above: **no `--ff-only`**,
|
|
114
|
-
// because the branch it is called on has diverged whenever the command is worth typing at all
|
|
115
|
-
//
|
|
116
|
+
// because the branch it is called on has diverged whenever the command is worth typing at all.
|
|
117
|
+
// Naming the strategy here is the whole fix — `git pull` decides it from
|
|
116
118
|
// `pull.rebase` / `pull.ff`, and with neither set it decides nothing and aborts.
|
|
117
119
|
//
|
|
118
120
|
// `with_output` rather than `read`: a merge that conflicts has to put git's own report in front of
|
|
119
121
|
// the person, which is what the `git pull` this replaced did.
|
|
120
122
|
//
|
|
121
123
|
// `message` replaces git's default merge message, which carries no `#N` and is therefore refused
|
|
122
|
-
// by the `commit-msg` hook on an issue branch
|
|
124
|
+
// by the `commit-msg` hook on an issue branch.
|
|
125
|
+
//
|
|
126
|
+
// The budget is a suite's, not a local git command's: the merge commit runs the `commit-msg` hook,
|
|
127
|
+
// which is not git's own work.
|
|
123
128
|
async function merge_branch(branch_name: string, message?: string): Promise<void> {
|
|
124
129
|
const message_arguments = message === undefined ? [] : ['-m', message]
|
|
125
130
|
|
|
126
|
-
await git_spawn.with_output('merge', [...message_arguments, `origin/${branch_name}`]
|
|
131
|
+
await git_spawn.with_output('merge', [...message_arguments, `origin/${branch_name}`], {
|
|
132
|
+
timeout_ms: SUITE_TIMEOUT_MS,
|
|
133
|
+
})
|
|
127
134
|
}
|
|
128
135
|
|
|
136
|
+
// Both checkouts run the `post-checkout` hook — a `pnpm install` in some consumers — so they take the
|
|
137
|
+
// budget of a suite rather than a local git command's, which would end them inside that hook with the
|
|
138
|
+
// branch already created.
|
|
129
139
|
async function checkout_b(branch_name: string): Promise<string> {
|
|
130
|
-
return await git_spawn.read(['checkout', '-b', branch_name])
|
|
140
|
+
return await git_spawn.read(['checkout', '-b', branch_name], SUITE_TIMEOUT_MS)
|
|
131
141
|
}
|
|
132
142
|
|
|
133
143
|
async function checkout(branch_name: string): Promise<string> {
|
|
134
|
-
return await git_spawn.read(['checkout', branch_name])
|
|
144
|
+
return await git_spawn.read(['checkout', branch_name], SUITE_TIMEOUT_MS)
|
|
135
145
|
}
|
|
136
146
|
|
|
147
|
+
// A commit runs the `pre-commit` and `commit-msg` hooks — a type check among them — so it takes the
|
|
148
|
+
// budget of the suite those hooks may run rather than a local git command's.
|
|
137
149
|
async function commit(message: string): Promise<void> {
|
|
138
|
-
await git_spawn.with_output('commit', ['-m', message])
|
|
150
|
+
await git_spawn.with_output('commit', ['-m', message], { timeout_ms: SUITE_TIMEOUT_MS })
|
|
139
151
|
}
|
|
140
152
|
|
|
141
|
-
// **`-d` rather than `-D`, and that is the safety rather than a preference
|
|
153
|
+
// **`-d` rather than `-D`, and that is the safety rather than a preference**.
|
|
142
154
|
// The one caller is a rollback that removes a branch it created moments earlier, so `-d`'s refusal to
|
|
143
155
|
// delete a branch holding an unmerged commit is exactly the net it wants: a rollback can never be the
|
|
144
156
|
// thing that destroys a commit.
|
|
@@ -148,7 +160,7 @@ async function delete_branch(branch_name: string): Promise<void> {
|
|
|
148
160
|
|
|
149
161
|
// How many commits `tip` holds that `base` does not. **`0` is the answer that distinguishes a flush
|
|
150
162
|
// branch carrying the only copy of an appended line from one an aborted flush merely left behind**,
|
|
151
|
-
// and the two get opposite advice
|
|
163
|
+
// and the two get opposite advice.
|
|
152
164
|
// **Output that is not a count throws rather than parsing to `0`.** `Number('')` is `0`, and `0` is
|
|
153
165
|
// the answer that says a branch holds nothing — so a read that came back empty or unparseable would
|
|
154
166
|
// report "nothing is stranded" about a branch nobody measured, which is the one wrong answer that
|
|
@@ -180,8 +192,9 @@ function is_upstream_not_set_error(error: unknown): boolean {
|
|
|
180
192
|
const NO_VERIFY_FLAG = '--no-verify'
|
|
181
193
|
|
|
182
194
|
// Both pushes go through `git_push_transport` rather than `git_spawn.with_output`, which is
|
|
183
|
-
// what gives them a timeout and an SSH keepalive the local git commands beside them do not
|
|
184
|
-
//
|
|
195
|
+
// what gives them a transfer's timeout and an SSH keepalive the local git commands beside them do not
|
|
196
|
+
// need.
|
|
197
|
+
// The thrown error keeps the same `cause.exit_code` shape, so the 128
|
|
185
198
|
// fallback below reads it exactly as it did.
|
|
186
199
|
async function push_with_upstream(
|
|
187
200
|
branch_name: string,
|
|
@@ -190,8 +203,8 @@ async function push_with_upstream(
|
|
|
190
203
|
await git_push_transport.push([...verify_flags, '--set-upstream', 'origin', branch_name])
|
|
191
204
|
}
|
|
192
205
|
|
|
193
|
-
// **The push budget bounds the transfer alone
|
|
194
|
-
//
|
|
206
|
+
// **The push budget bounds the transfer alone**. The pre-push hook runs once,
|
|
207
|
+
// on a suite's budget of its own, before either push and outside the `try`; both transfers then skip it with `--no-verify`,
|
|
195
208
|
// so neither the timeout retry nor the `--set-upstream` fallback repeats it, and a failed hook is not
|
|
196
209
|
// mistaken for a missing upstream. A git too old to run the hook ahead leaves it to the push, as before.
|
|
197
210
|
async function push(): Promise<void> {
|
|
@@ -212,15 +225,14 @@ async function push(): Promise<void> {
|
|
|
212
225
|
}
|
|
213
226
|
}
|
|
214
227
|
|
|
215
|
-
// **`--ff-only` is named here rather than read out of whoever's git configuration is in force
|
|
216
|
-
//
|
|
228
|
+
// **`--ff-only` is named here rather than read out of whoever's git configuration is in force**.
|
|
229
|
+
// A bare `git pull` decides its strategy from `pull.rebase` / `pull.ff`,
|
|
217
230
|
// and with neither set — the state of a checkout nobody has configured — it decides nothing and
|
|
218
231
|
// aborts the moment the two sides have each moved:
|
|
219
232
|
//
|
|
220
233
|
// fatal: Need to specify how to reconcile divergent branches
|
|
221
234
|
//
|
|
222
|
-
//
|
|
223
|
-
// there deliberately because the callers and the conditions differ. Every caller turns out to want
|
|
235
|
+
// Every caller wants
|
|
224
236
|
// the same thing: it is on the default branch, bringing it up to date before doing something else —
|
|
225
237
|
// `main-sync.ts` for `josh ms`, `release-cli.ts` / `release-publish.ts` around the release pull
|
|
226
238
|
// request, `scripts-ai/prep.ts` before it snapshots the overrides, and `git-branch.ts` →
|
|
@@ -237,7 +249,7 @@ async function pull_fast_forward(): Promise<void> {
|
|
|
237
249
|
// Every local branch matching a `git branch --list` pattern, one name per line. The boolean below is
|
|
238
250
|
// this same read, expressed on top of it rather than beside it: `run:hold`'s preflight check needs the name
|
|
239
251
|
// itself, because the pull request an interrupted run left behind is keyed by its head branch and the
|
|
240
|
-
// slug is not derivable from an issue number alone
|
|
252
|
+
// slug is not derivable from an issue number alone.
|
|
241
253
|
const SHORT_NAME_FORMAT = '--format=%(refname:short)'
|
|
242
254
|
const REMOTES_FLAG = '--remotes'
|
|
243
255
|
|
|
@@ -286,7 +298,7 @@ function exclude_pathspec(file_path: string): string {
|
|
|
286
298
|
return `:(exclude,top)${file_path}`
|
|
287
299
|
}
|
|
288
300
|
|
|
289
|
-
// Every tracked modification, minus the paths the caller names
|
|
301
|
+
// Every tracked modification, minus the paths the caller names. **The
|
|
290
302
|
// positive pathspec is not decoration**: a pathspec list made only of exclusions matches nothing at
|
|
291
303
|
// all, so `ALL_PATHS_PATHSPEC` is what the exclusions are subtracted from. The one caller is
|
|
292
304
|
// `git-staging.ts`, which keeps the observation ledger out of every ordinary commit.
|
|
@@ -302,18 +314,18 @@ async function add_path(file_path: string): Promise<void> {
|
|
|
302
314
|
|
|
303
315
|
// Main's own line of history. Both reads below restrict themselves to it, and for one reason: a
|
|
304
316
|
// child's commits are merged into main rather than being main's, so a walk that follows every parent
|
|
305
|
-
// answers about everything ever merged instead of about main
|
|
317
|
+
// answers about everything ever merged instead of about main.
|
|
306
318
|
const FIRST_PARENT_FLAG = '--first-parent'
|
|
307
319
|
|
|
308
320
|
// The commits that touched `file_path` along `tip`'s own first-parent line, newest first.
|
|
309
321
|
// **`--first-parent` is what keeps the answer about main's history rather than about everything ever
|
|
310
322
|
// merged into it**: a child's own commits are not main's, and the version question
|
|
311
|
-
//
|
|
323
|
+
// is asked of main.
|
|
312
324
|
//
|
|
313
325
|
// **`tip` is not decoration.** `--first-parent` only reads as "main's line" when the walk starts on
|
|
314
326
|
// main; started on a feature branch it walks that branch's commits first, and any merge main took
|
|
315
327
|
// after the branch was cut is not an ancestor at all. A caller that is not on main names the ref it
|
|
316
|
-
// means — `origin/main`, say — rather than inheriting `HEAD
|
|
328
|
+
// means — `origin/main`, say — rather than inheriting `HEAD`.
|
|
317
329
|
async function log_first_parent(
|
|
318
330
|
limit: number,
|
|
319
331
|
file_path: string,
|
|
@@ -344,7 +356,7 @@ async function show_file(spec: string): Promise<string> {
|
|
|
344
356
|
// merges made *inside* a pull request branch — GitHub's "Update branch" button, or a local
|
|
345
357
|
// `git merge main` before pushing. Measured on this repository, `HEAD~200..HEAD` counts 201 merges
|
|
346
358
|
// unrestricted and 200 along the first-parent line, so one such merge is already in the last two
|
|
347
|
-
// hundred commits and would have inflated a release by a whole minor
|
|
359
|
+
// hundred commits and would have inflated a release by a whole minor.
|
|
348
360
|
const MERGE_COUNT_ARGUMENTS: ReadonlyArray<string> = [
|
|
349
361
|
'rev-list',
|
|
350
362
|
'--count',
|
|
@@ -374,8 +386,8 @@ const git_command = {
|
|
|
374
386
|
head_commit,
|
|
375
387
|
git_directories,
|
|
376
388
|
diff_cached,
|
|
377
|
-
// The default branch, the change base and every reading against it are `git-diff-reads.ts`'s
|
|
378
|
-
//
|
|
389
|
+
// The default branch, the change base and every reading against it are `git-diff-reads.ts`'s,
|
|
390
|
+
// re-exported here so no call site, mock or spy moved with them.
|
|
379
391
|
...git_diff_reads,
|
|
380
392
|
fetch_branch,
|
|
381
393
|
merge_fast_forward,
|
|
@@ -3,7 +3,7 @@ import { git_utilities } from './constants'
|
|
|
3
3
|
import { git_command } from './git-command'
|
|
4
4
|
import { git_location_environment, GIT_LOCATION_VARIABLES } from './git-location-environment'
|
|
5
5
|
|
|
6
|
-
// The one synchronous read of a checkout's two git directories
|
|
6
|
+
// The one synchronous read of a checkout's two git directories — the same
|
|
7
7
|
// `GIT_DIRECTORY_ARGUMENTS` `git_command.git_directories` asks asynchronously, so the two spellings
|
|
8
8
|
// cannot name different directories. It had been run in three places with three timeouts and no
|
|
9
9
|
// memory of the answer, though a `PreToolUse` hook may ask it several times in one call.
|
|
@@ -20,8 +20,8 @@ const PROBE_TIMEOUT_MS = 5000
|
|
|
20
20
|
const answers = new Map<string, ReadonlyArray<string>>()
|
|
21
21
|
|
|
22
22
|
// With an explicit `cwd`, the git location variables are cleared so that directory is what git answers
|
|
23
|
-
// for: a hook exports `GIT_DIR`, which beats `cwd` and would name the hook's checkout instead
|
|
24
|
-
//
|
|
23
|
+
// for: a hook exports `GIT_DIR`, which beats `cwd` and would name the hook's checkout instead.
|
|
24
|
+
// Without one the environment is kept, so the read resolves the same
|
|
25
25
|
// checkout as the asynchronous `git_directories`.
|
|
26
26
|
function probe_environment(cwd: string | undefined): NodeJS.ProcessEnv {
|
|
27
27
|
if (cwd === undefined) return process.env
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { git_spawn } from './git-spawn'
|
|
2
2
|
|
|
3
3
|
// The default branch, the base a change is measured against, and every "changed" reading taken
|
|
4
|
-
// against that base — split out of `git-command.ts` when it reached its line limit
|
|
5
|
-
//
|
|
4
|
+
// against that base — split out of `git-command.ts` when it reached its line limit.
|
|
5
|
+
// `git_command` re-exports each one under the name it always had, so the
|
|
6
6
|
// move changed no call site and no suite that mocks or spies on `git_command`.
|
|
7
7
|
|
|
8
8
|
const REFS_REMOTES_ORIGIN_PREFIX = 'refs/remotes/origin/'
|
|
@@ -26,8 +26,8 @@ async function get_default_branch(): Promise<string> {
|
|
|
26
26
|
|
|
27
27
|
const MERGE_BASE_COMMAND = 'merge-base'
|
|
28
28
|
|
|
29
|
-
// **The ref the default branch is actually at**, which is not the same thing as its name
|
|
30
|
-
//
|
|
29
|
+
// **The ref the default branch is actually at**, which is not the same thing as its name.
|
|
30
|
+
// `get_default_branch` returns the bare name, and git resolves that to the
|
|
31
31
|
// *local* `refs/heads/<default>` — a ref nothing in this workflow advances, because merges happen on
|
|
32
32
|
// GitHub and the default branch is checked out in no work tree. This is the single source both the
|
|
33
33
|
// lane's start point and `change_base` below resolve through, so a lane cut from
|
|
@@ -59,7 +59,7 @@ async function default_branch_reference(): Promise<string> {
|
|
|
59
59
|
// against, in place of the default branch itself.
|
|
60
60
|
//
|
|
61
61
|
// **A two-dot `git diff <default-branch>` compares a moving *ref* to the working tree, and in a
|
|
62
|
-
// linked work tree that ref is shared with every other lane
|
|
62
|
+
// linked work tree that ref is shared with every other lane**. So when one
|
|
63
63
|
// lane merges, an unmerged lane's diff picks that lane's files up in reverse: files this branch
|
|
64
64
|
// never touched arrive in `josh review:brief`'s target list, in the digest map `josh gate` stamps,
|
|
65
65
|
// and in `josh review:round2`'s fix delta.
|
|
@@ -96,24 +96,24 @@ async function diff_main(file_path: string): Promise<string> {
|
|
|
96
96
|
|
|
97
97
|
// Names only, for callers that classify a change rather than read it — `josh review:level` decides
|
|
98
98
|
// the review depth from the paths alone, and reading the whole diff to get them would be the
|
|
99
|
-
// expensive half of the thing it exists to make cheaper
|
|
99
|
+
// expensive half of the thing it exists to make cheaper.
|
|
100
100
|
//
|
|
101
101
|
// `core.quotePath=false` is not cosmetic. With git's default, a path containing any non-ASCII byte
|
|
102
102
|
// comes back C-quoted — `"prompts/\343\202\263.md"` — and a classifier testing `startsWith('prompts/')`
|
|
103
103
|
// against a string that begins with a quote character answers no. `review:level` fails safe there
|
|
104
104
|
// (non-inert wins), but a classifier that answered `skip` would drop a change it is meant to catch,
|
|
105
|
-
// so the quoting is turned off at the source every reader shares
|
|
105
|
+
// so the quoting is turned off at the source every reader shares.
|
|
106
106
|
const NO_PATH_QUOTING: ReadonlyArray<string> = ['-c', 'core.quotePath=false']
|
|
107
107
|
|
|
108
108
|
// Repository-root-relative paths, whatever the checkout is configured to prefer. `diff.relative` is
|
|
109
109
|
// a per-repository setting a person may have turned on for their own reading, and with it `git diff
|
|
110
110
|
// --name-only` run from a subdirectory prints cwd-relative paths — which every caller of this
|
|
111
|
-
// reading then joins onto the repository root
|
|
111
|
+
// reading then joins onto the repository root. The flag pins the spelling
|
|
112
112
|
// at the source rather than leaving each caller to discover the configuration.
|
|
113
113
|
const NO_RELATIVE_PATHS = '--no-relative'
|
|
114
114
|
|
|
115
115
|
// **Rename detection is turned off because this listing is a description of a tree, not a summary of
|
|
116
|
-
// a change
|
|
116
|
+
// a change**. With git's default `diff.renames=true`, a rename prints only
|
|
117
117
|
// its *destination*: `git diff --name-only <base>` across a commit that moved `scripts/init-logic.ts`
|
|
118
118
|
// to `scripts/init/init-logic.ts` names the second path and never the first.
|
|
119
119
|
//
|
|
@@ -139,10 +139,9 @@ const NO_RENAME_DETECTION = '--no-renames'
|
|
|
139
139
|
// The commit `change_base` resolves to. Every "changed" reading below is a diff against it, so a set
|
|
140
140
|
// of changed paths — or a map of their digests — means nothing without it: fetch an advanced default
|
|
141
141
|
// branch and rebase onto it, and each digest can stay identical while the rest of the tree is
|
|
142
|
-
// replaced by code no check has read
|
|
142
|
+
// replaced by code no check has read. A rebase still invalidates a stamp
|
|
143
143
|
// taken against it — the rebase moves `HEAD`, and with it the merge base — while another lane
|
|
144
|
-
// merging into the shared default branch no longer does, because it moves neither
|
|
145
|
-
// (joshuafolkken/kit#1527).
|
|
144
|
+
// merging into the shared default branch no longer does, because it moves neither.
|
|
146
145
|
async function change_base_commit(): Promise<string> {
|
|
147
146
|
return await git_spawn.read(['rev-parse', await change_base()])
|
|
148
147
|
}
|
|
@@ -187,10 +186,10 @@ async function diff_main_numstat(): Promise<string> {
|
|
|
187
186
|
|
|
188
187
|
// Files git is not tracking yet. `git diff` never lists them, so a classifier built on the diff
|
|
189
188
|
// alone sees a change that adds a whole new module as an empty one — which is how a run adding new
|
|
190
|
-
// code could have been handed a reduced review level
|
|
189
|
+
// code could have been handed a reduced review level.
|
|
191
190
|
//
|
|
192
|
-
// **`--full-name` and the `:/` pathspec are what make this reading agree with the diff beside it
|
|
193
|
-
//
|
|
191
|
+
// **`--full-name` and the `:/` pathspec are what make this reading agree with the diff beside it**.
|
|
192
|
+
// `git diff --name-only` prints repository-root-relative paths for the
|
|
194
193
|
// whole tree wherever it is run; `git ls-files --others` prints *cwd*-relative paths and lists only
|
|
195
194
|
// what is below cwd. Read from a subdirectory, the two halves of `changed_paths` therefore came
|
|
196
195
|
// back in two different coordinate systems, and every caller that resolves a path against the
|
package/scripts/git/git-error.ts
CHANGED
|
@@ -37,7 +37,7 @@ function display_error_details(cause: unknown): void {
|
|
|
37
37
|
const FAILURE_EXIT_CODE = 1
|
|
38
38
|
const OPERATION_CANCELLED_MESSAGE = '💡 Operation cancelled.'
|
|
39
39
|
|
|
40
|
-
// **A library refuses by throwing; only the CLI entry decides the exit code
|
|
40
|
+
// **A library refuses by throwing; only the CLI entry decides the exit code**.
|
|
41
41
|
// `process.exit()` from an imported module skips every `finally` above it (a lock release included)
|
|
42
42
|
// and truncates a piped stdout, so these modules throw a typed error instead, and `handle` — the catch
|
|
43
43
|
// at each entry — renders it and sets `process.exitCode`.
|
|
@@ -14,8 +14,7 @@ function get_exit_code(error: unknown): number | undefined {
|
|
|
14
14
|
// had printed one line first would otherwise be reported as whatever that line happened to say.
|
|
15
15
|
//
|
|
16
16
|
// It lives here rather than beside either caller because both `gh` and `git push` now pass a
|
|
17
|
-
// timeout, and a second copy of the same three lines is the duplication `CLAUDE.md` prohibits
|
|
18
|
-
// (joshuafolkken/kit#1251).
|
|
17
|
+
// timeout, and a second copy of the same three lines is the duplication `CLAUDE.md` prohibits.
|
|
19
18
|
function has_timed_out(error: unknown): boolean {
|
|
20
19
|
if (typeof error !== 'object' || error === null || !('timedOut' in error)) return false
|
|
21
20
|
|
package/scripts/git/git-issue.ts
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import { git_gh_issue_read } from '#scripts/gh/git-gh-issue-read'
|
|
2
|
+
import { issue_cite } from '#scripts/issue/issue-cite'
|
|
3
|
+
import { session_cite } from '#scripts/issue/session-cite'
|
|
2
4
|
import { lane_paths } from '#scripts/lane/lane-paths'
|
|
3
5
|
import { SEPARATOR_LINE } from './constants'
|
|
4
6
|
import { git_prompt } from './git-prompt'
|
|
@@ -52,7 +54,7 @@ function parse_issue_input(input: string): IssueInfo {
|
|
|
52
54
|
const issue_number = extract_issue_number(trimmed_input)
|
|
53
55
|
const title = extract_issue_title(trimmed_input)
|
|
54
56
|
const branch_name = create_branch_name(issue_number, title)
|
|
55
|
-
const commit_message = `${title}
|
|
57
|
+
const commit_message = `${title} ${issue_cite.plain(issue_number)}`
|
|
56
58
|
|
|
57
59
|
return {
|
|
58
60
|
title,
|
|
@@ -64,10 +66,10 @@ function parse_issue_input(input: string): IssueInfo {
|
|
|
64
66
|
|
|
65
67
|
const BRANCH_NUMBER_PATTERN = /^(\d+)-(.+)$/u
|
|
66
68
|
|
|
67
|
-
// A lane's branch is `<N>-lane
|
|
68
|
-
// `lane` rather than a slug of the title — de-slugging it
|
|
69
|
-
//
|
|
70
|
-
// second copy of the suffix, so the two ends cannot drift apart
|
|
69
|
+
// A lane's branch is `<N>-lane`, so its second segment is the fixed word
|
|
70
|
+
// `lane` rather than a slug of the title — de-slugging it would produce commit messages like
|
|
71
|
+
// `lane #1465`. The shape is recognized through `lane_paths.lane_branch` rather than a
|
|
72
|
+
// second copy of the suffix, so the two ends cannot drift apart.
|
|
71
73
|
function is_lane_branch(branch_name: string, issue_number: string): boolean {
|
|
72
74
|
return branch_name === lane_paths.lane_branch(issue_number)
|
|
73
75
|
}
|
|
@@ -75,7 +77,7 @@ function is_lane_branch(branch_name: string, issue_number: string): boolean {
|
|
|
75
77
|
const EXAMPLE_ISSUE_NUMBER = '42'
|
|
76
78
|
|
|
77
79
|
function argument_hint(issue_number: string): string {
|
|
78
|
-
return `Provide an issue argument like "title
|
|
80
|
+
return `Provide an issue argument like "title ${issue_cite.plain(issue_number)}".`
|
|
79
81
|
}
|
|
80
82
|
|
|
81
83
|
// Never falls back to the branch's own word: `lane` is not a title, and a commit message cannot be
|
|
@@ -85,7 +87,7 @@ async function lane_issue_title(branch_name: string, issue_number: string): Prom
|
|
|
85
87
|
|
|
86
88
|
if (title === undefined) {
|
|
87
89
|
throw new Error(
|
|
88
|
-
`Cannot read the title of issue
|
|
90
|
+
`Cannot read the title of issue ${session_cite.issue(issue_number)} for lane branch "${branch_name}". ${argument_hint(issue_number)}`,
|
|
89
91
|
)
|
|
90
92
|
}
|
|
91
93
|
|
|
@@ -110,7 +112,7 @@ async function derive_issue_input_from_branch(branch_name: string): Promise<stri
|
|
|
110
112
|
? await lane_issue_title(branch_name, number)
|
|
111
113
|
: slug.replaceAll('-', ' ').trim()
|
|
112
114
|
|
|
113
|
-
return `${title}
|
|
115
|
+
return `${title} ${issue_cite.plain(number)}`
|
|
114
116
|
}
|
|
115
117
|
|
|
116
118
|
async function derive_from_branch(branch_name: string): Promise<IssueInfo> {
|
|
@@ -4,11 +4,10 @@
|
|
|
4
4
|
// git exports them to every hook it runs, so a child process spawned from inside `pre-commit` or
|
|
5
5
|
// `pre-push` inherits a pointer at the repository the hook is firing in. A helper that passes
|
|
6
6
|
// `{ cwd: fixture_directory }` and nothing else therefore writes into the **real** checkout, with no
|
|
7
|
-
// error anywhere
|
|
8
|
-
//
|
|
9
|
-
// test fixture's own commits onto a lane's live branch during the pre-push gate.
|
|
7
|
+
// error anywhere — a test fixture's own commits can land on a lane's live branch during the pre-push
|
|
8
|
+
// gate.
|
|
10
9
|
//
|
|
11
|
-
// The list is single-sourced here because it
|
|
10
|
+
// The list is single-sourced here because it has three consumers that must not drift apart: the
|
|
12
11
|
// probes that clear it, the fixture that clears it, and the unit-suite guard that refuses a write
|
|
13
12
|
// while any of it is set (`scripts/test/test-repository-guard.ts`).
|
|
14
13
|
//
|
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
// How origin is asked whether it carries a branch — the one place that says it
|
|
2
|
-
// (joshuafolkken/kit#1732).
|
|
1
|
+
// How origin is asked whether it carries a branch — the one place that says it.
|
|
3
2
|
//
|
|
4
3
|
// **The pattern is the full ref path, because `ls-remote` matches a pattern against the *tail* of a
|
|
5
|
-
// ref at a slash boundary
|
|
4
|
+
// ref at a slash boundary**. A bare name therefore answers for any branch
|
|
6
5
|
// ending in it: `1641-lane` matches `refs/heads/wip/1641-lane`, and `release/v1.2.0` matches
|
|
7
6
|
// `refs/heads/foo/release/v1.2.0`. **`--heads` does not close it** — that limits which refs are
|
|
8
7
|
// considered, not where inside one the pattern may match. Anchored at `refs/heads/`, only the exact
|
|
@@ -11,11 +10,10 @@
|
|
|
11
10
|
// slash.
|
|
12
11
|
//
|
|
13
12
|
// **It is the arguments that are shared, not the spawn.** `git_worktree.ls_remote_branch` runs this
|
|
14
|
-
// asynchronously against the process's own cwd
|
|
15
|
-
//
|
|
16
|
-
//
|
|
17
|
-
//
|
|
18
|
-
// joshuafolkken/kit#1732 was filed for. Kept in one module, the next such fix reaches both.
|
|
13
|
+
// asynchronously against the process's own cwd, while `propagate_git.has_remote_branch` runs it
|
|
14
|
+
// synchronously against a consumer's path — both under a remote budget, and two differences that
|
|
15
|
+
// belong to those callers. What is shared is the knowledge above:
|
|
16
|
+
// kept in one module, a fix to it reaches both.
|
|
19
17
|
const LS_REMOTE_COMMAND = 'ls-remote'
|
|
20
18
|
const HEADS_FLAG = '--heads'
|
|
21
19
|
const ORIGIN_REMOTE = 'origin'
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { mkdtemp, rm, writeFile } from 'node:fs/promises'
|
|
2
2
|
import { tmpdir } from 'node:os'
|
|
3
3
|
import path from 'node:path'
|
|
4
|
+
import { SUITE_TIMEOUT_MS } from '#scripts/lib/timeouts'
|
|
4
5
|
import { git_spawn } from './git-spawn'
|
|
5
6
|
|
|
6
|
-
// The pre-push hook, run ahead of the push instead of inside it
|
|
7
|
+
// The pre-push hook, run ahead of the push instead of inside it.
|
|
7
8
|
//
|
|
8
9
|
// **The push budget is a transfer budget, and a hook is not a transfer.** `PUSH_TIMEOUT_MS` was read
|
|
9
10
|
// off what moving objects costs here, but `git push` runs the pre-push hook first and the budget
|
|
@@ -13,9 +14,10 @@ import { git_spawn } from './git-spawn'
|
|
|
13
14
|
// either: lefthook and vitest outlived it, and the retry started a second suite in the same work tree,
|
|
14
15
|
// where each `test-state-guard` read the other's temporary files as a mutation and both failed.
|
|
15
16
|
//
|
|
16
|
-
// So the hook runs here, once,
|
|
17
|
-
// follows with `--no-verify`. The retry then repeats the transfer
|
|
18
|
-
// running cannot exist for it to overlap
|
|
17
|
+
// So the hook runs here, once, on a suite's budget rather than a transfer's, and `git_command.push`
|
|
18
|
+
// spawns the bounded transfer that follows with `--no-verify`. The retry then repeats the transfer
|
|
19
|
+
// alone, and a hook that is still running cannot exist for it to overlap: a hook cut at
|
|
20
|
+
// `SUITE_TIMEOUT_MS` fails the push instead of reaching the transfer.
|
|
19
21
|
//
|
|
20
22
|
// **What git hands the hook is reproduced rather than dropped.** `git hook run` executes whatever
|
|
21
23
|
// hook is configured — lefthook's or anyone's — and the arguments and stdin are git's pre-push
|
|
@@ -108,12 +110,11 @@ async function run_with_stdin(stdin_line: string): Promise<boolean> {
|
|
|
108
110
|
if (!(await can_run_hooks(stdin_path))) return false
|
|
109
111
|
const url = await git_spawn.read(['remote', 'get-url', REMOTE])
|
|
110
112
|
|
|
111
|
-
await git_spawn.with_output(
|
|
112
|
-
|
|
113
|
-
'--',
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
])
|
|
113
|
+
await git_spawn.with_output(
|
|
114
|
+
'hook',
|
|
115
|
+
[...to_hook_run_arguments(stdin_path, HOOK_NAME), '--', REMOTE, url],
|
|
116
|
+
{ timeout_ms: SUITE_TIMEOUT_MS },
|
|
117
|
+
)
|
|
117
118
|
|
|
118
119
|
return true
|
|
119
120
|
} finally {
|
|
@@ -7,10 +7,10 @@ import { git_branch } from './git-branch'
|
|
|
7
7
|
import { git_command } from './git-command'
|
|
8
8
|
import { git_issue, type IssueInfo } from './git-issue'
|
|
9
9
|
|
|
10
|
-
//
|
|
11
|
-
//
|
|
12
|
-
//
|
|
13
|
-
//
|
|
10
|
+
// A later stage of `josh git -y` refuses on an unmet precondition — the title's issue number, the
|
|
11
|
+
// branch name, the issue's release classification — only after the stage before it has already
|
|
12
|
+
// staged, switched or pushed. **Every precondition decidable at the start is asked here, before
|
|
13
|
+
// anything changes, and all of them are reported at once.** No rule is new: each
|
|
14
14
|
// answer comes from the function the later stage refuses with, so the two cannot drift apart.
|
|
15
15
|
|
|
16
16
|
interface PreflightInput {
|
|
@@ -131,7 +131,7 @@ async function answer(input: PreflightInput): Promise<PreflightAnswer> {
|
|
|
131
131
|
return { pr_target, problems: [...problems, ...pr_problems] }
|
|
132
132
|
}
|
|
133
133
|
|
|
134
|
-
//
|
|
134
|
+
// The unmet preconditions as a list, so `josh ship` can ask them before its
|
|
135
135
|
// review and gate start instead of meeting the refusal at the commit stage.
|
|
136
136
|
async function problems_of(input: PreflightInput): Promise<Array<string>> {
|
|
137
137
|
const { problems } = await answer(input)
|
|
@@ -10,8 +10,8 @@ import { git_ssh_keepalive } from './git-ssh-keepalive'
|
|
|
10
10
|
|
|
11
11
|
const MS_PER_SECOND = 1000
|
|
12
12
|
|
|
13
|
-
// The budget for one `git push`, and the reason a push can no longer wait without end
|
|
14
|
-
//
|
|
13
|
+
// The budget for one `git push`, and the reason a push can no longer wait without end.
|
|
14
|
+
// Measured on PR #1244: the commit itself took 0.6 seconds and the push
|
|
15
15
|
// then sat silent for 8 minutes 13 seconds before it was found by hand and killed — about 9 minutes
|
|
16
16
|
// 50 seconds of a 72-minute run, with no way while waiting to tell a stalled push from a slow one.
|
|
17
17
|
// `execa` has always accepted a `timeout`; the push path never passed one, which left it the single
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { git_worktree } from './git-worktree'
|
|
2
2
|
|
|
3
|
-
// Does origin still have this branch, and could we even tell?
|
|
4
|
-
// `scripts/lane/lane-start-point.ts`, which asked the question first.)
|
|
3
|
+
// Does origin still have this branch, and could we even tell?
|
|
5
4
|
//
|
|
6
5
|
// **The remote-tracking ref is not evidence that the remote still has the branch.** Nothing here
|
|
7
6
|
// prunes it — `lane:close` removes the work tree and the local branch, GitHub deletes the remote
|