@joshuafolkken/kit 1.1229.0 → 1.1370.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/agents/investigator.md +1 -0
- package/.claude/settings.json +4 -0
- package/.claude/skills/dependency-update/SKILL.md +5 -3
- package/.claude/skills/epic-commands/SKILL.md +82 -113
- package/.claude/skills/epic-commands/epic-bundle.md +38 -63
- package/.claude/skills/epic-commands/execution-waves.md +30 -51
- package/.claude/skills/verify-ui/SKILL.md +13 -20
- package/.claude/skills/workflow-commands/SKILL.md +10 -10
- package/.claude/skills/workflow-commands/background-commands.md +4 -4
- package/.claude/skills/workflow-commands/backlogrun-child.md +30 -105
- package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +29 -0
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +45 -131
- package/.claude/skills/workflow-commands/backlogrun-park.md +36 -53
- package/.claude/skills/workflow-commands/backlogrun-progress.md +81 -331
- package/.claude/skills/workflow-commands/backlogrun-recovery.md +29 -83
- package/.claude/skills/workflow-commands/backlogrun-steps.md +105 -424
- package/.claude/skills/workflow-commands/backlogrun.md +50 -61
- package/.claude/skills/workflow-commands/chain-rule.md +36 -40
- package/.claude/skills/workflow-commands/entry-sequence.md +6 -6
- package/.claude/skills/workflow-commands/followup.md +24 -20
- package/.claude/skills/workflow-commands/fullrun-steps.md +23 -27
- package/.claude/skills/workflow-commands/fullrun.md +10 -10
- package/.claude/skills/workflow-commands/halfrun.md +9 -8
- package/.claude/skills/workflow-commands/into-target.md +12 -18
- package/.claude/skills/workflow-commands/issue-comments.md +11 -26
- package/.claude/skills/workflow-commands/kickoff.md +27 -16
- package/.claude/skills/workflow-commands/latest-gate.md +18 -29
- package/.claude/skills/workflow-commands/needs-human-review.md +13 -24
- package/.claude/skills/workflow-commands/observation-filing.md +37 -28
- package/.claude/skills/workflow-commands/observation-ledger.md +48 -38
- package/.claude/skills/workflow-commands/pre-gate-cut.md +9 -9
- package/.claude/skills/workflow-commands/prerequisite.md +23 -15
- package/.claude/skills/workflow-commands/progress-watcher.md +17 -11
- package/.claude/skills/workflow-commands/prrun.md +3 -3
- package/.claude/skills/workflow-commands/retrospective.md +13 -18
- package/.claude/skills/workflow-commands/split-assessment.md +6 -4
- package/.claude/skills/workflow-commands/target-repository.md +25 -28
- package/.claude/skills/workflow-commands/working-tree-hold.md +11 -17
- package/.gitattributes +2 -1
- package/.github/workflows/ci.yml +14 -0
- package/.github/workflows/publish.yml +2 -0
- package/.vscode/tasks.json +14 -0
- package/CLAUDE.md +10 -61
- package/README.md +38 -57
- package/SECURITY.md +1 -1
- package/dist/CLAUDE.md +10 -61
- package/dist/commands/document-section-cli.js +42 -10
- package/dist/config-merge/index.js +11 -2
- package/dist/hooks/audit-provision.js +2 -2
- package/dist/hooks/batch-guard.js +7 -7
- package/dist/hooks/{chunk-FIVDHQGT.js → chunk-43G45XJF.js} +18 -20
- package/dist/hooks/{chunk-JUDKDCDP.js → chunk-4TW4MQUL.js} +284 -362
- package/dist/hooks/{chunk-5VMKCCC4.js → chunk-76RK6E3H.js} +13 -11
- package/dist/hooks/{chunk-RNWHN5BP.js → chunk-DZWZ3DKY.js} +4 -4
- package/dist/hooks/{chunk-5VNDSNG3.js → chunk-FZ6FUSBM.js} +1 -1
- package/dist/hooks/{chunk-VC3PZPZO.js → chunk-GG72ANKI.js} +1 -1
- package/dist/hooks/{chunk-6HJJXRBX.js → chunk-KPM4YIIX.js} +8 -44
- package/dist/hooks/chunk-MXVQMLDP.js +3705 -0
- package/dist/hooks/{chunk-ELCN5LCH.js → chunk-NEC4AT4Z.js} +34 -12
- package/dist/hooks/{chunk-TQNPDZNH.js → chunk-NZBHG6FW.js} +7 -5
- package/dist/hooks/chunk-NZN2UFI6.js +2409 -0
- package/dist/hooks/{chunk-F56MFS4B.js → chunk-R6CRQEAL.js} +4 -4
- package/dist/hooks/chunk-SYSRHRWU.js +1589 -0
- package/dist/hooks/{chunk-55HHG5PX.js → chunk-TLJYAGZK.js} +799 -903
- package/dist/hooks/chunk-Z5TMJIPW.js +45 -0
- package/dist/hooks/codex-hook-adapter.js +26 -21
- package/dist/hooks/duplicate-read-guard.js +8 -8
- package/dist/hooks/format-edited.js +4 -4
- package/dist/hooks/inputs.json +213 -197
- package/dist/hooks/investigation-guard.js +8 -8
- package/dist/hooks/pretool-guard.js +15 -15
- package/dist/hooks/session-lang.js +406 -8
- package/dist/hooks/stop-guard.js +122 -201
- package/dist/josh.js +540 -137
- package/dist/version/index.js +15 -13
- package/eslint/base.js +43 -5
- package/eslint/rules/english-only-prose.js +3 -3
- package/eslint/rules/import.js +12 -0
- package/eslint/rules/namespace-object-export.js +2 -2
- package/package.json +16 -10
- package/pnpm-workspace.yaml +2 -4
- package/prompts/coding-standards.md +14 -48
- package/prompts/collaboration-workflow/file-edits.md +1 -1
- package/prompts/collaboration-workflow/issue-citation.md +1 -1
- package/prompts/collaboration-workflow/issue-template.md +4 -10
- package/prompts/collaboration-workflow/operating-rules.md +7 -8
- package/prompts/collaboration-workflow/output-bounds.md +1 -1
- package/prompts/collaboration-workflow/overview.md +1 -1
- package/prompts/collaboration-workflow/plan-comment.md +2 -1
- package/prompts/collaboration-workflow/principles.md +21 -3
- package/prompts/collaboration-workflow/report-format.md +16 -29
- package/prompts/collaboration-workflow/residency.md +1 -1
- package/prompts/collaboration-workflow/rule-delivery.md +7 -95
- package/prompts/collaboration-workflow/shell-body.md +3 -23
- package/prompts/collaboration-workflow/turn-batching.md +4 -13
- package/prompts/collaboration-workflow/wip-cap.md +5 -11
- package/prompts/refactoring.md +1 -1
- package/prompts/review-rubric.md +3 -22
- package/prompts/review.md +15 -38
- package/prompts/testing-guide.md +2 -4
- package/scripts/adopt/adopt-logic.ts +5 -5
- package/scripts/adopt/adopt-toolkits.ts +4 -5
- package/scripts/adopt/adopt.ts +2 -3
- package/scripts/agent/agent-argv.ts +7 -7
- package/scripts/agent/agent-diagnostics.ts +2 -2
- package/scripts/agent/agent-exit-record.ts +1 -1
- package/scripts/agent/agent-headless.ts +1 -1
- package/scripts/agent/agent-launch-environment.ts +6 -1
- package/scripts/agent/agent-role-profile.ts +49 -22
- package/scripts/agent/agent-session-role.ts +32 -0
- package/scripts/agent/api-outage.ts +1 -1
- package/scripts/agent/claude-agent-argv.ts +4 -4
- package/scripts/agent/claude-result-event.ts +4 -4
- package/scripts/agent/codex-hooks.ts +2 -2
- package/scripts/agent/interactive-ask.ts +3 -6
- package/scripts/auto-ok/auto-ok-cli.ts +46 -60
- package/scripts/backlog/backlog-arrival-added.ts +34 -0
- package/scripts/backlog/backlog-arrival.ts +54 -17
- package/scripts/backlog/backlog-budget-cli.ts +34 -6
- package/scripts/backlog/backlog-budget.ts +17 -24
- package/scripts/backlog/backlog-defect-priority.ts +1 -1
- package/scripts/backlog/backlog-drive-args.ts +5 -4
- package/scripts/backlog/backlog-drive-cli.ts +14 -10
- package/scripts/backlog/backlog-drive-epic.ts +85 -0
- package/scripts/backlog/backlog-drive-launch.ts +1 -1
- package/scripts/backlog/backlog-drive-named-offer.ts +60 -9
- package/scripts/backlog/backlog-drive-named.ts +39 -9
- package/scripts/backlog/backlog-drive-offer-argv.ts +1 -1
- package/scripts/backlog/backlog-drive-restore.ts +1 -1
- package/scripts/backlog/backlog-drive-retrospective.ts +2 -2
- package/scripts/backlog/backlog-drive.ts +43 -28
- package/scripts/backlog/backlog-idle.ts +88 -0
- package/scripts/backlog/backlog-named.ts +11 -15
- package/scripts/backlog/backlog-next.ts +26 -30
- package/scripts/backlog/backlog-offer-cli.ts +28 -23
- package/scripts/backlog/backlog-offer.ts +7 -7
- package/scripts/backlog/backlog-overlap.ts +178 -0
- package/scripts/backlog/backlog-plan-cli.ts +14 -90
- package/scripts/backlog/backlog-plan-read.ts +111 -0
- package/scripts/backlog/backlog-plan.ts +11 -10
- package/scripts/backlog/backlog-pool.ts +13 -14
- package/scripts/backlog/backlog-rank.ts +11 -11
- package/scripts/backlog/backlog-ready.ts +15 -10
- package/scripts/backlog/backlog-scope.ts +14 -15
- package/scripts/backlog/backlog-stalled-cli.ts +2 -2
- package/scripts/backlog/backlog-stalled-detect.ts +4 -4
- package/scripts/backlog/backlog-stalled.ts +5 -6
- package/scripts/backlog/backlog-waves.ts +4 -4
- package/scripts/backlog/backlogrun-args.ts +74 -0
- package/scripts/backlog/backlogrun-cli.ts +113 -0
- package/scripts/backlog/backlogrun-launch.ts +178 -0
- package/scripts/behavior/behavior-assertion.ts +6 -8
- package/scripts/behavior/behavior-cli.ts +1 -1
- package/scripts/behavior/behavior-rules.ts +3 -3
- package/scripts/build/build-claude-md.ts +4 -4
- package/scripts/build/build-codex-hooks.ts +2 -2
- package/scripts/build/build-commands.ts +1 -1
- package/scripts/build/build-hooks.ts +5 -5
- package/scripts/build/build.ts +1 -1
- package/scripts/build/hook-bundle-stamp.ts +109 -7
- package/scripts/build/local-bin.ts +2 -2
- package/scripts/cases/cases-cli.ts +1 -1
- package/scripts/cases/cases-logic.ts +2 -2
- package/scripts/ci/composite-actions.ts +1 -2
- package/scripts/ci/pr-classification.ts +2 -2
- package/scripts/claude/workflow-destination.ts +1 -1
- package/scripts/clone/clone-aggregate.ts +1 -1
- package/scripts/clone/clone-fingerprint.ts +1 -1
- package/scripts/clone/clone-scan-cli.ts +1 -1
- package/scripts/clone/clone-scan.ts +1 -1
- package/scripts/config-merge/index.ts +1 -1
- package/scripts/config-merge/json-format.ts +1 -3
- package/scripts/config-merge/patch-json-array.ts +90 -0
- package/scripts/config-merge/patch-json-key.ts +6 -3
- package/scripts/config-merge/patch-json-list.ts +1 -1
- package/scripts/cost-runtime/codex-usage.ts +1 -1
- package/scripts/cost-runtime/context-cut-payback.ts +4 -5
- package/scripts/cost-runtime/context-cut-threshold.ts +4 -6
- package/scripts/cost-runtime/cost-attribute.ts +3 -3
- package/scripts/cost-runtime/cost-blocks.ts +3 -4
- package/scripts/cost-runtime/cost-cli.ts +14 -11
- package/scripts/cost-runtime/cost-corpus.ts +11 -11
- package/scripts/cost-runtime/cost-pricing.ts +4 -4
- package/scripts/cost-runtime/cost-tokens.ts +1 -2
- package/scripts/cost-runtime/cost-transcript.ts +29 -29
- package/scripts/cost-runtime/cost-usage.ts +6 -7
- package/scripts/cost-runtime/cost-verdict.ts +10 -11
- package/scripts/cost-runtime/own-session.ts +1 -1
- package/scripts/cost-runtime/transcript-cwd.ts +2 -2
- package/scripts/delegation/delegation-cli.ts +4 -4
- package/scripts/delegation/delegation-policy.ts +13 -15
- package/scripts/delegation/duplicate-read-guard.ts +9 -10
- package/scripts/delegation/fanout-cli.ts +1 -1
- package/scripts/delegation/fanout.ts +1 -1
- package/scripts/delegation/investigation-guard.ts +18 -22
- package/scripts/delegation/investigation-reads.ts +48 -238
- package/scripts/discovery/repo-discovery.ts +1 -1
- package/scripts/discovery/repo-map-logic.ts +1 -2
- package/scripts/discovery/repo-origin.ts +3 -3
- package/scripts/discovery/repo-party-cli.ts +2 -2
- package/scripts/discovery/repo-party.ts +2 -2
- package/scripts/doctor/doctor-consumer.ts +1 -1
- package/scripts/doctor/doctor-io.ts +6 -7
- package/scripts/doctor/doctor-logic.ts +1 -1
- package/scripts/doctor/doctor-ports.ts +1 -1
- package/scripts/doctor/doctor.ts +8 -9
- package/scripts/document/backlogrun-parent-read-set.ts +5 -6
- package/scripts/document/bash-output-cap.ts +5 -7
- package/scripts/document/capped-print-part.ts +1 -1
- package/scripts/document/capped-print.ts +1 -1
- package/scripts/document/document-byte-budget.ts +33 -64
- package/scripts/document/document-byte-check.ts +4 -4
- package/scripts/document/document-reachability.ts +7 -8
- package/scripts/document/document-read-cli.ts +2 -2
- package/scripts/document/document-scan.ts +26 -2
- package/scripts/document/document-section-cli.ts +6 -8
- package/scripts/document/document-section.ts +8 -12
- package/scripts/document/edit-files-cli.ts +3 -4
- package/scripts/document/entry-read-budget.ts +8 -70
- package/scripts/document/entry-read-set.ts +51 -34
- package/scripts/document/lane-child-read-set.ts +9 -9
- package/scripts/document/read-files-cli.ts +1 -2
- package/scripts/document/read-set-cli.ts +16 -19
- package/scripts/document/read-set-cost.ts +4 -4
- package/scripts/document/read-set-point-of-use.ts +28 -38
- package/scripts/document/read-set-pricing.ts +1 -1
- package/scripts/document/read-set-trim.ts +3 -3
- package/scripts/document/resident-budget.ts +8 -10
- package/scripts/epic/epic-add-body.ts +15 -18
- package/scripts/epic/epic-add-plan.ts +26 -28
- package/scripts/epic/epic-add.ts +32 -25
- package/scripts/epic/epic-audit-checks.ts +27 -37
- package/scripts/epic/epic-audit-cli.ts +21 -22
- package/scripts/epic/epic-audit-orphans.ts +16 -17
- package/scripts/epic/epic-audit-rationale.ts +10 -15
- package/scripts/epic/epic-audit-report.ts +2 -5
- package/scripts/epic/epic-audit.ts +18 -14
- package/scripts/epic/epic-body.ts +10 -10
- package/scripts/epic/epic-bundle-cli.ts +36 -34
- package/scripts/epic/epic-bundle-evidence.ts +5 -5
- package/scripts/epic/epic-bundle-gaps.ts +6 -9
- package/scripts/epic/epic-bundle-poll.ts +1 -1
- package/scripts/epic/epic-bundle-referenced.ts +11 -14
- package/scripts/epic/epic-bundle.ts +19 -20
- package/scripts/epic/epic-busy.ts +44 -21
- package/scripts/epic/epic-candidate-confirm.ts +15 -18
- package/scripts/epic/epic-chains.ts +18 -23
- package/scripts/epic/epic-classify.ts +11 -12
- package/scripts/epic/epic-cli-argv.ts +5 -6
- package/scripts/epic/epic-cli-remove.ts +9 -4
- package/scripts/epic/epic-cli.ts +38 -26
- package/scripts/epic/epic-close-comment.ts +14 -15
- package/scripts/epic/epic-close.ts +25 -29
- package/scripts/epic/epic-cross-repo.ts +18 -21
- package/scripts/epic/epic-decision.ts +14 -18
- package/scripts/epic/epic-fetch.ts +25 -31
- package/scripts/epic/epic-graph.ts +15 -17
- package/scripts/epic/epic-index.ts +14 -16
- package/scripts/epic/epic-issue.ts +9 -11
- package/scripts/epic/epic-label-age.ts +74 -0
- package/scripts/epic/epic-lane-offer.ts +35 -24
- package/scripts/epic/epic-nested.ts +1 -1
- package/scripts/epic/epic-next-read.ts +8 -8
- package/scripts/epic/epic-next-views.ts +12 -12
- package/scripts/epic/epic-next.ts +29 -33
- package/scripts/epic/epic-outside-blocker.ts +11 -10
- package/scripts/epic/epic-parse.ts +22 -24
- package/scripts/epic/epic-promote.ts +3 -2
- package/scripts/epic/epic-rank.ts +1 -1
- package/scripts/epic/epic-read.ts +10 -8
- package/scripts/epic/epic-reconcile.ts +8 -6
- package/scripts/epic/epic-reference.ts +5 -4
- package/scripts/epic/epic-relation-recheck.ts +10 -11
- package/scripts/epic/epic-relations.ts +9 -8
- package/scripts/epic/epic-remove-plan.ts +4 -5
- package/scripts/epic/epic-remove.ts +7 -5
- package/scripts/epic/epic-report.ts +18 -20
- package/scripts/epic/epic-run.ts +6 -5
- package/scripts/epic/epic-sections.ts +2 -2
- package/scripts/epic/epic-shape.ts +3 -3
- package/scripts/epic/epic-solo-stale.ts +3 -2
- package/scripts/epic/epic-solo.ts +8 -8
- package/scripts/epic/epic-triage.ts +5 -4
- package/scripts/epic/epic-validate.ts +8 -7
- package/scripts/epic/epic.ts +5 -5
- package/scripts/exports/unused-members-cli.ts +1 -1
- package/scripts/followup/followup-issue-number.ts +1 -2
- package/scripts/followup/git-followup-cleanup.ts +6 -7
- package/scripts/followup/git-followup-finish.ts +11 -13
- package/scripts/followup/git-followup-flush.ts +11 -7
- package/scripts/followup/git-followup-issue-close.ts +16 -13
- package/scripts/followup/git-followup-label.ts +9 -6
- package/scripts/followup/git-followup-merged.ts +1 -1
- package/scripts/followup/git-followup-pending.ts +7 -9
- package/scripts/followup/git-followup-stages.ts +28 -17
- package/scripts/followup/git-followup-workflow.ts +19 -21
- package/scripts/followup/git-pr-followup-checks.ts +13 -20
- package/scripts/followup/git-pr-followup-wrapup.ts +7 -7
- package/scripts/followup/git-pr-followup.ts +18 -17
- package/scripts/gate/core-admission.ts +162 -0
- package/scripts/gate/core-budget.ts +134 -91
- package/scripts/gate/gate-ledger.ts +114 -0
- package/scripts/gate/gate-log.ts +7 -9
- package/scripts/gate/gate-plan.ts +103 -35
- package/scripts/gate/gate-report.ts +39 -21
- package/scripts/gate/gate-skip.ts +11 -13
- package/scripts/gate/gate-steps.ts +5 -1
- package/scripts/gate/gate-tree.ts +3 -4
- package/scripts/gate/hook-gate-reuse.ts +9 -9
- package/scripts/gate/machine-capacity.ts +313 -0
- package/scripts/gate/pre-commit-type-check.ts +4 -4
- package/scripts/gate/project-checks.ts +12 -4
- package/scripts/gate/scoped-green.ts +11 -18
- package/scripts/gate/type-check-command.ts +2 -2
- package/scripts/gate/type-check-step.ts +4 -4
- package/scripts/gate/verification-gate.ts +60 -53
- package/scripts/gh/gh-spawn.ts +2 -2
- package/scripts/gh/git-ai-review-scan.ts +3 -2
- package/scripts/gh/git-gh-api-path.ts +10 -11
- package/scripts/gh/git-gh-exec.ts +43 -48
- package/scripts/gh/git-gh-failure.ts +6 -9
- package/scripts/gh/git-gh-helpers.ts +1 -1
- package/scripts/gh/git-gh-issue-list.ts +15 -19
- package/scripts/gh/git-gh-issue-read.ts +43 -60
- package/scripts/gh/git-gh-issue-rest.ts +14 -15
- package/scripts/gh/git-gh-issue-write.ts +52 -40
- package/scripts/gh/git-gh-issue.ts +23 -24
- package/scripts/gh/git-gh-pr-auto-merge.ts +3 -3
- package/scripts/gh/git-gh-pr-read.ts +46 -50
- package/scripts/gh/git-gh-pr-rest.ts +23 -26
- package/scripts/gh/git-gh-pr-review.ts +2 -2
- package/scripts/gh/git-gh-pr-rollup.ts +4 -4
- package/scripts/gh/git-gh-pr-snapshot.ts +8 -10
- package/scripts/gh/git-gh-pr.ts +16 -16
- package/scripts/gh/git-gh-reachability.ts +11 -12
- package/scripts/gh/git-gh-repo.ts +2 -3
- package/scripts/gh/git-gh-rest-state.ts +1 -1
- package/scripts/gh/git-pr-ai-review.ts +6 -5
- package/scripts/gh/git-pr-checks-eval.ts +28 -30
- package/scripts/gh/git-pr-checks-parse.ts +14 -16
- package/scripts/gh/git-pr-checks-watch.ts +17 -17
- package/scripts/gh/git-pr-checks.ts +20 -23
- package/scripts/gh/git-pr-coderabbit.ts +8 -6
- package/scripts/gh/git-pr-confirmation.ts +5 -5
- package/scripts/gh/git-pr-managed-config.ts +7 -9
- package/scripts/gh/git-pr-messages.ts +1 -1
- package/scripts/gh/git-pr.ts +15 -16
- package/scripts/gh/github-issue-url.ts +8 -9
- package/scripts/git/base-tree.ts +66 -0
- package/scripts/git/change-base.ts +42 -2
- package/scripts/git/changed-file-scope.ts +5 -5
- package/scripts/git/changed-paths.ts +1 -2
- package/scripts/git/constants.ts +2 -2
- package/scripts/git/git-branch.ts +1 -1
- package/scripts/git/git-closes-keyword.ts +3 -3
- package/scripts/git/git-command.ts +53 -41
- package/scripts/git/git-common-directory.ts +3 -3
- package/scripts/git/git-diff-reads.ts +14 -15
- package/scripts/git/git-error.ts +1 -1
- package/scripts/git/git-execa-error.ts +1 -2
- package/scripts/git/git-issue.ts +10 -8
- package/scripts/git/git-location-environment.ts +3 -4
- package/scripts/git/git-ls-remote.ts +6 -8
- package/scripts/git/git-pre-push-hook.ts +11 -10
- package/scripts/git/git-preflight.ts +5 -5
- package/scripts/git/git-push-transport.ts +2 -2
- package/scripts/git/git-remote-branch.ts +1 -2
- package/scripts/git/git-schemas.ts +16 -23
- package/scripts/git/git-spawn-sync.ts +1 -1
- package/scripts/git/git-spawn.ts +37 -14
- package/scripts/git/git-ssh-keepalive.ts +12 -5
- package/scripts/git/git-staging.ts +7 -8
- package/scripts/git/git-workflow.ts +1 -1
- package/scripts/git/git-worktree.ts +35 -27
- package/scripts/git/gone-branch.ts +2 -2
- package/scripts/git/listing-cutoff.ts +1 -2
- package/scripts/git/lockfile-sync.ts +65 -0
- package/scripts/git/main-merge-guard.ts +1 -2
- package/scripts/git/main-merge.ts +7 -7
- package/scripts/git/main-sync.ts +23 -8
- package/scripts/git/parse-json-array.ts +18 -23
- package/scripts/git/repository-lock.ts +34 -2
- package/scripts/git/stash/git-stash.ts +4 -5
- package/scripts/git/stash/stash-orphans.ts +5 -3
- package/scripts/git/stash/stash-pop-args.ts +1 -1
- package/scripts/git/stash/stash-pop-cli.ts +3 -3
- package/scripts/git/stash/stash-sweep-lock.ts +2 -2
- package/scripts/hooks/batch-guard.ts +11 -13
- package/scripts/hooks/check-commit-message.ts +12 -9
- package/scripts/hooks/codex-hook-adapter.ts +16 -10
- package/scripts/hooks/edited-cspell.ts +3 -4
- package/scripts/hooks/format-edited-cli.ts +1 -1
- package/scripts/hooks/format-edited-file.ts +11 -17
- package/scripts/hooks/format-rewrite-notice.ts +19 -17
- package/scripts/hooks/pre-push-unit.ts +10 -14
- package/scripts/hooks/pretool-guard-cli.ts +4 -4
- package/scripts/hooks/pretool-guard.ts +93 -18
- package/scripts/hooks/reserved-run.ts +2 -2
- package/scripts/hooks/step-zero-notice.ts +1 -1
- package/scripts/hooks/stop-guard.ts +21 -10
- package/scripts/init/basic-path-migration.ts +2 -2
- package/scripts/init/claude-kit-only-settings.ts +2 -2
- package/scripts/init/claude-plugin-config.ts +2 -2
- package/scripts/init/distributed-paths.ts +4 -4
- package/scripts/init/hook-command-rewrite.ts +3 -3
- package/scripts/init/hook-launch.ts +5 -5
- package/scripts/init/init-actions.ts +13 -0
- package/scripts/init/init-ai-copy.ts +11 -11
- package/scripts/init/init-bootstrap.ts +3 -3
- package/scripts/init/init-copy-content.ts +4 -4
- package/scripts/init/init-logic-json-merge.ts +7 -9
- package/scripts/init/init-logic-migrate.ts +1 -1
- package/scripts/init/init-logic-templates.ts +1 -1
- package/scripts/init/init-logic-workspace.ts +4 -4
- package/scripts/init/init-logic-yaml-merge.ts +2 -2
- package/scripts/init/init-logic.ts +19 -22
- package/scripts/init/init.ts +12 -8
- package/scripts/init/kit-base-preset.ts +1 -1
- package/scripts/init/kit-setup-state.ts +1 -1
- package/scripts/init/kit-written-paths.ts +1 -2
- package/scripts/init/package-manager-pin.ts +35 -0
- package/scripts/init/project-profile-cli.ts +1 -1
- package/scripts/init/project-profile.ts +3 -3
- package/scripts/init/session-language-environment.ts +1 -1
- package/scripts/init/start-exec.ts +3 -4
- package/scripts/init/start-plan.ts +2 -2
- package/scripts/init/start-setup-pr.ts +3 -2
- package/scripts/init/start-steps.ts +2 -2
- package/scripts/init/tsconfig-preset-migration.ts +1 -1
- package/scripts/init/vscode-tasks.ts +62 -0
- package/scripts/issue/baseline-measure.ts +2 -2
- package/scripts/issue/behavior-change-lint.ts +2 -2
- package/scripts/issue/defect-rate-cli.ts +6 -7
- package/scripts/issue/defect-rate.ts +37 -27
- package/scripts/issue/git-next-issues.ts +9 -8
- package/scripts/issue/issue-auto-ok.ts +49 -11
- package/scripts/issue/issue-backlinks-cli.ts +5 -5
- package/scripts/issue/issue-backlinks.ts +6 -6
- package/scripts/issue/issue-cite-cli.ts +20 -18
- package/scripts/issue/issue-cite.ts +18 -8
- package/scripts/issue/issue-closing-pr.ts +4 -4
- package/scripts/issue/issue-comment-cli.ts +6 -4
- package/scripts/issue/issue-file-cli.ts +75 -15
- package/scripts/issue/issue-file-fold.ts +155 -0
- package/scripts/issue/issue-file.ts +14 -6
- package/scripts/issue/issue-fold-cli.ts +14 -9
- package/scripts/issue/issue-fold.ts +23 -8
- package/scripts/issue/issue-labels.ts +46 -37
- package/scripts/issue/issue-lint-cli.ts +2 -2
- package/scripts/issue/issue-lint.ts +1 -1
- package/scripts/issue/issue-merged.ts +10 -4
- package/scripts/issue/issue-number-shape.ts +27 -0
- package/scripts/issue/issue-rank.ts +1 -1
- package/scripts/issue/issue-read-cli.ts +4 -5
- package/scripts/issue/issue-read.ts +4 -5
- package/scripts/issue/issue-reference.ts +5 -5
- package/scripts/issue/issue-release-cli.ts +165 -0
- package/scripts/issue/issue-release.ts +58 -0
- package/scripts/issue/issue-report-failures.ts +7 -4
- package/scripts/issue/issue-scout-cli.ts +11 -11
- package/scripts/issue/issue-scout-closed.ts +4 -4
- package/scripts/issue/issue-scout.ts +4 -5
- package/scripts/issue/issue-state-cli.ts +17 -10
- package/scripts/issue/issue-state.ts +12 -13
- package/scripts/issue/issue-wip.ts +7 -7
- package/scripts/issue/markdown-section.ts +3 -3
- package/scripts/issue/measure-rerun-cli.ts +10 -9
- package/scripts/issue/reproduction-measure.ts +3 -3
- package/scripts/issue/session-cite.ts +56 -0
- package/scripts/josh/agent-session-environment.ts +10 -8
- package/scripts/josh/cli-body.ts +2 -2
- package/scripts/josh/command-suggest.ts +1 -1
- package/scripts/josh/file-map-stamp.ts +20 -23
- package/scripts/josh/hook-decision.ts +24 -28
- package/scripts/josh/josh-command-map.ts +4 -1
- package/scripts/josh/josh-command-types.ts +32 -34
- package/scripts/josh/josh-commands-ai.ts +6 -6
- package/scripts/josh/josh-commands-backlog.ts +15 -3
- package/scripts/josh/josh-commands-clone.ts +1 -1
- package/scripts/josh/josh-commands-development.ts +33 -4
- package/scripts/josh/josh-commands-document.ts +3 -3
- package/scripts/josh/josh-commands-guard.ts +3 -3
- package/scripts/josh/josh-commands-issue.ts +11 -5
- package/scripts/josh/josh-commands-lane.ts +16 -5
- package/scripts/josh/josh-commands-lint.ts +1 -1
- package/scripts/josh/josh-commands-maintenance.ts +2 -2
- package/scripts/josh/josh-commands-run.ts +20 -6
- package/scripts/josh/josh-commands-split.ts +1 -2
- package/scripts/josh/josh-commands-versioning.ts +5 -5
- package/scripts/josh/josh-commands-workflow.ts +30 -22
- package/scripts/josh/josh-environment-file.ts +1 -1
- package/scripts/josh/josh-in-process.ts +3 -3
- package/scripts/josh/josh-logic.ts +10 -10
- package/scripts/josh/josh-run.ts +3 -3
- package/scripts/josh/josh-verdict.ts +9 -12
- package/scripts/josh/josh.ts +3 -3
- package/scripts/josh/kit-only.ts +2 -2
- package/scripts/josh/path-decision.ts +3 -3
- package/scripts/josh/platform-temporary.ts +7 -5
- package/scripts/josh/process-identity.ts +24 -6
- package/scripts/josh/process-owner.ts +4 -4
- package/scripts/josh/session-language-cli.ts +53 -11
- package/scripts/josh/session-language.ts +1 -1
- package/scripts/josh/stamp-file.ts +48 -29
- package/scripts/josh/stamp-record.ts +57 -0
- package/scripts/lane/lane-await.ts +35 -11
- package/scripts/lane/lane-cache.ts +6 -6
- package/scripts/lane/lane-capacity.ts +32 -17
- package/scripts/lane/lane-child-invocation.ts +17 -15
- package/scripts/lane/lane-child-marker.ts +12 -12
- package/scripts/lane/lane-cli.ts +20 -13
- package/scripts/lane/lane-close.ts +6 -6
- package/scripts/lane/lane-dispatch.ts +61 -72
- package/scripts/lane/lane-environment.ts +5 -5
- package/scripts/lane/lane-guard-policy.ts +7 -21
- package/scripts/lane/lane-handoff.ts +2 -2
- package/scripts/lane/lane-install.ts +9 -10
- package/scripts/lane/lane-launch-cli.ts +13 -8
- package/scripts/lane/lane-ledger.ts +73 -11
- package/scripts/lane/lane-leftover.ts +44 -30
- package/scripts/lane/lane-limit-cli.ts +160 -0
- package/scripts/lane/lane-limit-override.ts +74 -0
- package/scripts/lane/lane-load.ts +19 -68
- package/scripts/lane/lane-measure-cli.ts +15 -25
- package/scripts/lane/lane-occupancy.ts +6 -4
- package/scripts/lane/lane-open.ts +25 -24
- package/scripts/lane/lane-output.ts +4 -3
- package/scripts/lane/lane-paths.ts +22 -8
- package/scripts/lane/lane-phase.ts +33 -0
- package/scripts/lane/lane-reap.ts +2 -2
- package/scripts/lane/lane-registry.ts +27 -15
- package/scripts/lane/lane-relaunch.ts +9 -9
- package/scripts/lane/lane-report.ts +5 -4
- package/scripts/lane/lane-resume.ts +2 -2
- package/scripts/lane/lane-sampler.ts +55 -0
- package/scripts/lane/lane-seed.ts +7 -7
- package/scripts/lane/lane-stage-stats.ts +135 -0
- package/scripts/lane/lane-start-point.ts +8 -11
- package/scripts/lane/lane-stats.ts +60 -15
- package/scripts/lane/lane-stray.ts +140 -0
- package/scripts/lane/lane-vacant.ts +1 -1
- package/scripts/lane/openai-lane-supervisor-decision.ts +3 -7
- package/scripts/lane/openai-lane-supervisor-owner.ts +3 -9
- package/scripts/lane/openai-review-broker.ts +2 -4
- package/scripts/lib/ancestor-directories.ts +1 -1
- package/scripts/lib/bounded-pool.ts +2 -2
- package/scripts/lib/buffered-process.ts +4 -6
- package/scripts/lib/caddy-logs.sh +0 -0
- package/scripts/lib/cli-flags.ts +39 -6
- package/scripts/lib/error-message.ts +1 -1
- package/scripts/lib/json-value.ts +17 -3
- package/scripts/lib/poll.ts +1 -1
- package/scripts/lib/status-icons.ts +3 -3
- package/scripts/lib/timed-fetch.ts +1 -1
- package/scripts/lib/timeouts.ts +1 -1
- package/scripts/lines/bytes-command.ts +3 -4
- package/scripts/lines/effective-limit.ts +25 -12
- package/scripts/lines/line-budget.ts +47 -55
- package/scripts/lines/line-targets.ts +6 -2
- package/scripts/lines/lines-command.ts +3 -3
- package/scripts/lint/cspell-cached.ts +1 -1
- package/scripts/lint/cycle-recheck.ts +122 -0
- package/scripts/lint/format.ts +1 -2
- package/scripts/lint/lint-parallel.ts +34 -19
- package/scripts/lint/lint-related-scope.ts +25 -15
- package/scripts/lint/lint-related.ts +6 -7
- package/scripts/managed-marker/index.ts +1 -1
- package/scripts/managed-marker/managed-marker-logic.ts +1 -2
- package/scripts/notify/git-notify.ts +9 -7
- package/scripts/notify/telegram-notify.ts +53 -37
- package/scripts/notify/telegram-test-logic.ts +3 -3
- package/scripts/notify/telegram-test.ts +45 -30
- package/scripts/observations/observation-ledger-home.ts +14 -8
- package/scripts/observations/observation-ledger-line.ts +3 -2
- package/scripts/observations/observation-ledger-migrate.ts +3 -4
- package/scripts/observations/observation-ledger-prepare.ts +4 -4
- package/scripts/observations/observation-ledger.ts +14 -15
- package/scripts/observations/observation-record-cli.ts +83 -0
- package/scripts/observations/observation-record.ts +91 -0
- package/scripts/observations/observations-flush-cli.ts +1 -1
- package/scripts/observations/observations-flush-landing.ts +7 -6
- package/scripts/observations/observations-flush.ts +26 -27
- package/scripts/overrides/overrides-check.ts +18 -8
- package/scripts/package/package-scout-cli.ts +1 -1
- package/scripts/package/package-scout-format.ts +2 -2
- package/scripts/package/package-scout.ts +1 -1
- package/scripts/propagate/propagate-git-failure.ts +1 -1
- package/scripts/propagate/propagate-git.ts +7 -7
- package/scripts/propagate/propagate-plan.ts +2 -2
- package/scripts/propagate/propagate-publish.ts +2 -3
- package/scripts/propagate/propagate-run.ts +5 -7
- package/scripts/propagate/propagate-select.ts +1 -1
- package/scripts/propagate/propagate-steps.ts +19 -20
- package/scripts/propagate/propagate-targets.ts +6 -10
- package/scripts/propagate/propagate.ts +5 -5
- package/scripts/refactor/import-graph.ts +1 -1
- package/scripts/refactor/refactor-lint.ts +4 -10
- package/scripts/refactor/refactor-scan-cli.ts +1 -1
- package/scripts/refactor/refactor-scan.ts +2 -2
- package/scripts/refactor/refactor-targets.ts +1 -1
- package/scripts/release/github-release-cli.ts +25 -3
- package/scripts/release/github-release-environment.ts +1 -0
- package/scripts/release/github-release-runs.ts +115 -0
- package/scripts/release/github-release.ts +13 -67
- package/scripts/release/release-cli.ts +21 -4
- package/scripts/release/release-history.ts +6 -10
- package/scripts/release/release-plan.ts +3 -3
- package/scripts/release/release-progress.ts +3 -4
- package/scripts/release/release-publish.ts +8 -9
- package/scripts/release/release-scope-cli.ts +8 -10
- package/scripts/release/release-tag.ts +6 -8
- package/scripts/release/release-worktree.ts +5 -5
- package/scripts/repo/auto-merge-setting-logic.ts +7 -9
- package/scripts/repo/auto-merge-setting.ts +1 -1
- package/scripts/repo/repo-setting.ts +4 -4
- package/scripts/repo/repository-labels.ts +1 -1
- package/scripts/repo/required-checks-logic.ts +3 -3
- package/scripts/repo/required-checks-report.ts +1 -1
- package/scripts/repo/ruleset-check-cli.ts +1 -1
- package/scripts/repo/ruleset-check.ts +1 -1
- package/scripts/report/report-format-reference.ts +26 -0
- package/scripts/report/report-lint-cli.ts +2 -2
- package/scripts/report/report-lint.ts +16 -2
- package/scripts/review/disposition-cli.ts +2 -2
- package/scripts/review/disposition-logic.ts +1 -1
- package/scripts/review/live-evidence.ts +9 -6
- package/scripts/review/review-attest-cli.ts +1 -2
- package/scripts/review/review-attest.ts +3 -3
- package/scripts/review/review-brief-cli.ts +19 -20
- package/scripts/review/review-brief.ts +29 -32
- package/scripts/review/review-checkout.ts +2 -2
- package/scripts/review/review-diff-parts.ts +3 -5
- package/scripts/review/review-diff-write.ts +1 -1
- package/scripts/review/review-finding-ledger.ts +7 -4
- package/scripts/review/review-findings-cli.ts +2 -2
- package/scripts/review/review-level.ts +4 -7
- package/scripts/review/review-record-cli.ts +73 -16
- package/scripts/review/review-record.ts +5 -4
- package/scripts/review/review-round2-cli.ts +2 -3
- package/scripts/review/review-round2.ts +13 -21
- package/scripts/review/review-stamps.ts +9 -71
- package/scripts/review/review-tree.ts +4 -5
- package/scripts/rules/bash-triggers.ts +4 -4
- package/scripts/rules/decision-oracle-batch.ts +5 -6
- package/scripts/rules/decision-oracle-stage.ts +1 -1
- package/scripts/rules/decision-oracle-tokens.ts +1 -2
- package/scripts/rules/decision-oracle.ts +2 -2
- package/scripts/rules/delivered-rules.ts +61 -406
- package/scripts/rules/destructive-command.ts +2 -2
- package/scripts/rules/direct-filing.ts +4 -4
- package/scripts/rules/direct-pr-create.ts +2 -2
- package/scripts/rules/early-heartbeat.ts +15 -19
- package/scripts/rules/file-body.ts +5 -6
- package/scripts/rules/filing-cap.ts +6 -7
- package/scripts/rules/filing-offer.ts +1 -1
- package/scripts/rules/firing-point.ts +6 -6
- package/scripts/rules/gh-api.ts +2 -2
- package/scripts/rules/git-argv.ts +3 -3
- package/scripts/rules/git-force.ts +2 -2
- package/scripts/rules/hook-context-line.ts +31 -0
- package/scripts/rules/implementation-cut-verdict.ts +5 -8
- package/scripts/rules/implementation-cut.ts +35 -32
- package/scripts/rules/index-guard.ts +2 -2
- package/scripts/rules/issue-citation.ts +7 -7
- package/scripts/rules/issue-comments.ts +21 -13
- package/scripts/rules/josh-git-bare.ts +2 -2
- package/scripts/rules/lane-background.ts +14 -16
- package/scripts/rules/lane-carry-conflict.ts +41 -5
- package/scripts/rules/lane-interactive-ask.ts +6 -9
- package/scripts/rules/lane-park.ts +12 -16
- package/scripts/rules/lane-split-park.ts +1 -2
- package/scripts/rules/lane-switch-main.ts +10 -13
- package/scripts/rules/last-prompt.ts +1 -1
- package/scripts/rules/oracle-consulted.ts +5 -5
- package/scripts/rules/oracle-firing.ts +6 -9
- package/scripts/rules/oracle-list-cli.ts +2 -2
- package/scripts/rules/permission-guards.ts +2 -2
- package/scripts/rules/piped-verification.ts +79 -9
- package/scripts/rules/poll-loop.ts +9 -11
- package/scripts/rules/pre-gate-cut.ts +33 -30
- package/scripts/rules/prior-comment-read.ts +3 -3
- package/scripts/rules/protected-files.ts +25 -13
- package/scripts/rules/raw-field-body.ts +3 -4
- package/scripts/rules/reply-language.ts +1 -1
- package/scripts/rules/rule-body-guard.ts +10 -12
- package/scripts/rules/rule-guard.ts +1 -1
- package/scripts/rules/rule-list.ts +51 -0
- package/scripts/rules/rule-registry-rows.ts +282 -0
- package/scripts/rules/rule-registry.ts +109 -0
- package/scripts/rules/rule-value-cache.ts +2 -2
- package/scripts/rules/rule-value-cli.ts +6 -4
- package/scripts/rules/rule-value.ts +61 -22
- package/scripts/rules/run-tail-rule.ts +11 -15
- package/scripts/rules/shell-body-trigger.ts +7 -7
- package/scripts/rules/shell-segments.ts +2 -4
- package/scripts/rules/stop-rules.ts +54 -41
- package/scripts/rules/tail-commands.ts +1 -1
- package/scripts/rules/test-declared-commit.ts +2 -2
- package/scripts/rules/third-party-write.ts +3 -3
- package/scripts/rules/worktree-guard.ts +12 -5
- package/scripts/run/add/run-add-cli.ts +165 -0
- package/scripts/run/add/run-add.ts +124 -0
- package/scripts/run/board/run-board-cli.ts +207 -0
- package/scripts/run/board/run-board-closed.ts +95 -0
- package/scripts/run/board/run-board-every.ts +60 -0
- package/scripts/run/board/run-board-fetch.ts +38 -0
- package/scripts/run/board/run-board-fit.ts +219 -0
- package/scripts/run/board/run-board-github.ts +162 -0
- package/scripts/run/board/run-board-header.ts +275 -0
- package/scripts/run/board/run-board-kind.ts +35 -0
- package/scripts/run/board/run-board-labels.ts +299 -0
- package/scripts/run/board/run-board-layout.ts +222 -0
- package/scripts/run/board/run-board-link.ts +31 -0
- package/scripts/run/board/run-board-machine.ts +198 -0
- package/scripts/run/board/run-board-notes.ts +103 -0
- package/scripts/run/board/run-board-phase.ts +136 -0
- package/scripts/run/board/run-board-plan.ts +129 -0
- package/scripts/run/board/run-board-read.ts +62 -0
- package/scripts/run/board/run-board-render-legend.ts +82 -0
- package/scripts/run/board/run-board-render-notes.ts +77 -0
- package/scripts/run/board/run-board-render-slot.ts +50 -0
- package/scripts/run/board/run-board-render.ts +407 -0
- package/scripts/run/board/run-board-scope.ts +17 -0
- package/scripts/run/board/run-board-screen.ts +43 -0
- package/scripts/run/board/run-board-span.ts +66 -0
- package/scripts/run/board/run-board-spin.ts +115 -0
- package/scripts/run/board/run-board-state.ts +113 -0
- package/scripts/run/board/run-board-status.ts +279 -0
- package/scripts/run/board/run-board-tick.ts +210 -0
- package/scripts/run/board/run-board-track.ts +22 -0
- package/scripts/run/board/run-board-usage-read.ts +255 -0
- package/scripts/run/board/run-board-usage-rusage.ts +124 -0
- package/scripts/run/board/run-board-usage-text.ts +80 -0
- package/scripts/run/board/run-board-usage.ts +165 -0
- package/scripts/run/carry/run-carry-added.ts +62 -0
- package/scripts/run/carry/run-carry-args.ts +25 -22
- package/scripts/run/carry/run-carry-change.ts +1 -1
- package/scripts/run/carry/run-carry-cli.ts +71 -48
- package/scripts/run/carry/run-carry-conversation.ts +6 -7
- package/scripts/run/carry/run-carry-ended.ts +85 -0
- package/scripts/run/carry/run-carry-reclaim.ts +1 -1
- package/scripts/run/carry/run-carry-stash.ts +3 -2
- package/scripts/run/carry/run-carry-streak.ts +8 -10
- package/scripts/run/carry/run-carry.ts +85 -89
- package/scripts/run/cut/run-cut-args.ts +7 -7
- package/scripts/run/cut/run-cut-cli.ts +68 -37
- package/scripts/run/cut/run-cut-handoff.ts +15 -15
- package/scripts/run/cut/run-cut-report.ts +37 -16
- package/scripts/run/cut/run-cut.ts +63 -77
- package/scripts/run/detached-launch.ts +35 -50
- package/scripts/run/entry/run-entry-cli.ts +48 -27
- package/scripts/run/entry/run-entry-stop.ts +7 -9
- package/scripts/run/entry/run-entry.ts +5 -6
- package/scripts/run/event/run-event-cli.ts +5 -6
- package/scripts/run/event/run-event-filed.ts +69 -0
- package/scripts/run/event/run-event-follow.ts +3 -3
- package/scripts/run/event/run-event-plan.ts +38 -0
- package/scripts/run/event/run-event-render.ts +10 -4
- package/scripts/run/event/run-event-scope.ts +47 -18
- package/scripts/run/event/run-event-stream-emit.ts +64 -11
- package/scripts/run/event/run-event-stream.ts +172 -43
- package/scripts/run/event/run-event-watch.ts +4 -6
- package/scripts/run/hold/run-hold-cli.ts +65 -62
- package/scripts/run/hold/run-hold.ts +88 -46
- package/scripts/run/merge/run-merge-cli.ts +116 -77
- package/scripts/run/merge/run-merge-collect.ts +107 -0
- package/scripts/run/merge/run-merge-steps.ts +112 -65
- package/scripts/run/merge/run-merge-token.ts +30 -0
- package/scripts/run/merge/run-merge.ts +31 -22
- package/scripts/run/progress/run-progress-args.ts +4 -4
- package/scripts/run/progress/run-progress-cli.ts +39 -50
- package/scripts/run/progress/run-progress-clock.ts +25 -32
- package/scripts/run/progress/run-progress-config.ts +6 -9
- package/scripts/run/progress/run-progress-read.ts +9 -10
- package/scripts/run/progress/run-progress.ts +48 -53
- package/scripts/run/review/run-review-cli.ts +6 -6
- package/scripts/run/review/run-review-steps.ts +6 -6
- package/scripts/run/review/run-review.ts +9 -11
- package/scripts/run/run-cli-fault.ts +29 -0
- package/scripts/run/run-ending-cli.ts +3 -3
- package/scripts/run/run-ending.ts +10 -14
- package/scripts/run/run-halfrun-resume.ts +6 -8
- package/scripts/run/run-headless.ts +25 -12
- package/scripts/run/run-invocation.ts +17 -22
- package/scripts/run/run-label.ts +7 -5
- package/scripts/run/run-liveness-cli.ts +19 -6
- package/scripts/run/run-liveness.ts +27 -38
- package/scripts/run/run-next-cli.ts +5 -9
- package/scripts/run/run-next.ts +4 -5
- package/scripts/run/run-parent-cut-hook.ts +10 -12
- package/scripts/run/run-preflight.ts +25 -29
- package/scripts/run/run-prep-cli.ts +17 -13
- package/scripts/run/run-prep-locate.ts +4 -5
- package/scripts/run/run-prep.ts +7 -10
- package/scripts/run/run-prrun-resume.ts +2 -2
- package/scripts/run/run-report-cli.ts +4 -4
- package/scripts/run/run-report.ts +9 -14
- package/scripts/run/run-retrospective.ts +3 -3
- package/scripts/run/run-section.ts +42 -0
- package/scripts/run/run-stage-read.ts +2 -2
- package/scripts/run/run-stage.ts +6 -4
- package/scripts/run/run-status-cli.ts +7 -5
- package/scripts/run/run-status.ts +6 -7
- package/scripts/run/run-step-cli.ts +13 -15
- package/scripts/run/run-step.ts +62 -48
- package/scripts/run/run-stop-notify.ts +7 -8
- package/scripts/run/run-stranded-cli.ts +1 -1
- package/scripts/run/run-stranded-detect.ts +4 -4
- package/scripts/run/run-stranded.ts +11 -13
- package/scripts/run/run-tail-cli.ts +15 -16
- package/scripts/run/run-tail.ts +14 -33
- package/scripts/run/run-watcher-guard-cli.ts +3 -4
- package/scripts/run/run-watcher-guard.ts +11 -12
- package/scripts/run/run-watcher-hook.ts +6 -12
- package/scripts/run/ship/run-ship-cli.ts +67 -33
- package/scripts/run/ship/run-ship-detach.ts +15 -13
- package/scripts/run/ship/run-ship-lock.ts +1 -1
- package/scripts/run/ship/run-ship-next.ts +7 -8
- package/scripts/run/ship/run-ship-pre-detach.ts +27 -11
- package/scripts/run/ship/run-ship-preflight.ts +10 -11
- package/scripts/run/ship/run-ship-probe.ts +4 -4
- package/scripts/run/ship/run-ship-return.ts +1 -1
- package/scripts/run/ship/run-ship-review-steps.ts +43 -24
- package/scripts/run/ship/run-ship-review.ts +12 -14
- package/scripts/run/ship/run-ship-scoped.ts +15 -6
- package/scripts/run/ship/run-ship-stage.ts +80 -26
- package/scripts/run/ship/run-ship-steps.ts +26 -16
- package/scripts/run/ship/run-ship-stop-text.ts +4 -2
- package/scripts/run/ship/run-ship-sync.ts +9 -8
- package/scripts/run/ship/run-ship.ts +17 -32
- package/scripts/run/tidy/run-tidy-cli.ts +9 -5
- package/scripts/run/tidy/run-tidy-lanes.ts +18 -7
- package/scripts/run/tidy/run-tidy-stashes.ts +8 -8
- package/scripts/run/tidy/run-tidy.ts +4 -3
- package/scripts/run/wake/run-wake-cli.ts +27 -33
- package/scripts/run/wake/run-wake-describe.ts +76 -29
- package/scripts/run/wake/run-wake-driver.ts +14 -14
- package/scripts/run/wake/run-wake-handoff.ts +6 -6
- package/scripts/run/wake/run-wake-loop.ts +13 -21
- package/scripts/run/wake/run-wake-restart.ts +4 -5
- package/scripts/run/wake/run-wake-session.ts +23 -27
- package/scripts/run/wake/run-wake.ts +57 -328
- package/scripts/safe-chain/ci-installer-pin.ts +3 -3
- package/scripts/safe-chain/pack-hook.ts +2 -2
- package/scripts/safe-chain/preinstall-command.ts +2 -2
- package/scripts/security/security-audit-logic.ts +1 -1
- package/scripts/security/security-audit-provision-logic.ts +1 -1
- package/scripts/security/security-audit-provision.ts +2 -2
- package/scripts/security/security-audit.ts +5 -5
- package/scripts/security/security-updates-logic.ts +2 -3
- package/scripts/security/security-updates.ts +2 -4
- package/scripts/self-sync-guard/index.ts +1 -1
- package/scripts/self-sync-guard/self-sync-guard-logic.ts +2 -2
- package/scripts/self-sync-guard/self-sync-refusal.ts +1 -1
- package/scripts/sonar/sonar-hotspots-cli.ts +1 -1
- package/scripts/sonar/sonar-hotspots.ts +1 -1
- package/scripts/sonar/sonar-new-code-cli.ts +1 -1
- package/scripts/sonar/sonar-new-code.ts +1 -1
- package/scripts/sonar/sonar-project.ts +1 -1
- package/scripts/split/split-assess-cli.ts +1 -1
- package/scripts/split/split-assess.ts +3 -3
- package/scripts/sync/directory-copy-guard.ts +2 -3
- package/scripts/sync/managed-config-scope-cli.ts +1 -2
- package/scripts/sync/managed-config-scope.ts +4 -4
- package/scripts/sync/plugin-skill-directories.ts +2 -2
- package/scripts/sync/reconcile-templates.ts +17 -8
- package/scripts/sync/removed-skill-manifest.ts +2 -3
- package/scripts/sync/sync-ai-files.ts +7 -7
- package/scripts/sync/sync-configs.ts +30 -3
- package/scripts/sync/sync-hook-safety.ts +2 -2
- package/scripts/sync/sync.ts +23 -10
- package/scripts/sync/synced-paths.ts +2 -1
- package/scripts/sync/workflow-pin-logic.ts +1 -1
- package/scripts/test/test-declared-changed.ts +4 -4
- package/scripts/test/test-declared-logic.ts +2 -3
- package/scripts/test/test-declared-match.ts +25 -4
- package/scripts/test/test-declared.ts +26 -9
- package/scripts/test/test-red-commit.ts +3 -2
- package/scripts/test/test-red-logic.ts +7 -14
- package/scripts/test/test-red.ts +12 -47
- package/scripts/test/test-related-scope.ts +2 -3
- package/scripts/test/test-related.ts +3 -3
- package/scripts/test/test-type-logic.ts +1 -2
- package/scripts/test/test-unit-guard.ts +13 -17
- package/scripts/test/unit-worker-share.ts +7 -8
- package/scripts/time-runtime/time-agent-bundles.ts +2 -4
- package/scripts/time-runtime/time-background.ts +17 -21
- package/scripts/time-runtime/time-batch-guard.ts +67 -342
- package/scripts/time-runtime/time-bundle-call.ts +26 -28
- package/scripts/time-runtime/time-bundles.ts +11 -12
- package/scripts/time-runtime/time-call-identity.ts +1 -1
- package/scripts/time-runtime/time-command-key.ts +2 -2
- package/scripts/time-runtime/time-density-hook.ts +8 -11
- package/scripts/time-runtime/time-density.ts +5 -5
- package/scripts/time-runtime/time-followup-stage.ts +7 -7
- package/scripts/time-runtime/time-format.ts +5 -5
- package/scripts/time-runtime/time-hook-transcript.ts +3 -3
- package/scripts/time-runtime/time-instant.ts +1 -1
- package/scripts/time-runtime/time-markers.ts +15 -19
- package/scripts/time-runtime/time-phase-names.ts +3 -3
- package/scripts/time-runtime/time-reported-failure.ts +15 -19
- package/scripts/time-runtime/time-round-trips.ts +20 -23
- package/scripts/time-runtime/time-shell.ts +8 -8
- package/scripts/time-runtime/time-single-check.ts +1 -2
- package/scripts/time-runtime/time-spans.ts +35 -40
- package/scripts/time-runtime/time-tool-call.ts +15 -16
- package/scripts/time-runtime/time-transcript-line.ts +53 -34
- package/scripts/time-runtime/time-writes.ts +5 -5
- package/scripts/ui/ui-routes-cli.ts +1 -2
- package/scripts/ui/ui-routes.ts +1 -2
- package/scripts/version/bump-version.ts +1 -1
- package/scripts/version/fresh-metadata-cache.ts +2 -2
- package/scripts/version/latest-corepack.ts +129 -98
- package/scripts/version/latest-lane-guard.ts +1 -1
- package/scripts/version/latest-scope-cli.ts +2 -2
- package/scripts/version/latest-stamp.ts +1 -2
- package/scripts/version/latest-update.ts +2 -2
- package/scripts/version/npm-registry.ts +2 -2
- package/scripts/version/package-manager-version.ts +18 -0
- package/scripts/version/publishable-range-check.ts +2 -1
- package/scripts/version/publishable-range.ts +1 -1
- package/scripts/version/release-age.ts +11 -11
- package/scripts/version/release-hold.ts +2 -2
- package/scripts/version/safe-chain-version-update.ts +3 -3
- package/scripts/version/version-check-logic.ts +2 -3
- package/scripts/version/version-check.ts +1 -2
- package/scripts/version/version-command-config.ts +2 -2
- package/scripts/version/version-commands.ts +3 -3
- package/scripts/version/version-remote.ts +4 -4
- package/scripts/version/version-targets.ts +2 -2
- package/templates/gitignore +7 -0
- package/templates/workflows/github-release.yml +4 -0
- package/dist/hooks/chunk-NV2JRZZO.js +0 -6385
- package/dist/hooks/chunk-RKUAD3I6.js +0 -90
- package/dist/hooks/chunk-WPALEIRX.js +0 -18
- package/scripts/backlog/backlog-restructure.ts +0 -152
- package/scripts/rules/issue-fold-rule.ts +0 -72
- package/scripts/rules/wip-cap.ts +0 -63
- package/scripts/run/run-issue-number.ts +0 -19
|
@@ -11,6 +11,7 @@ import { review_stamps } from '#scripts/review/review-stamps'
|
|
|
11
11
|
import { review_tree } from '#scripts/review/review-tree'
|
|
12
12
|
import { unit_worker_share } from '#scripts/test/unit-worker-share'
|
|
13
13
|
import { core_budget } from './core-budget'
|
|
14
|
+
import { gate_ledger, type GateLedgerStart } from './gate-ledger'
|
|
14
15
|
import { gate_plan, type GatePlan } from './gate-plan'
|
|
15
16
|
import { gate_report, type GateStep, type GateStepResult } from './gate-report'
|
|
16
17
|
import { gate_skip } from './gate-skip'
|
|
@@ -19,15 +20,10 @@ import { gate_tree, type GateTree } from './gate-tree'
|
|
|
19
20
|
import { project_checks } from './project-checks'
|
|
20
21
|
import { scoped_green, type ScopedSources } from './scoped-green'
|
|
21
22
|
|
|
22
|
-
//
|
|
23
|
-
//
|
|
24
|
-
//
|
|
25
|
-
//
|
|
26
|
-
// discover.
|
|
27
|
-
//
|
|
28
|
-
// The margin has narrowed as the checks gained caches and is re-measured rather than repeated: on
|
|
29
|
-
// this repository today, 19.1s back to back against 15.1s together (joshuafolkken/kit#1258). How
|
|
30
|
-
// many run at once, and how wide the unit suite fans out, are `gate-plan.ts`'s to decide.
|
|
23
|
+
// The completion gate's four checks are independent and share no mutable state, so they run
|
|
24
|
+
// together. Beyond the seconds: a serial gate reports one failure at a time, so a tree with a lint
|
|
25
|
+
// error and a type error would cost two full round trips to discover. How many run at once, and how
|
|
26
|
+
// wide the unit suite fans out, are `gate-plan.ts`'s to decide.
|
|
31
27
|
//
|
|
32
28
|
// Each step shells out to the `josh` sub-command that already defines it, rather than repeating the
|
|
33
29
|
// underlying tool invocations here — one definition per check, in `josh-commands-development.ts`.
|
|
@@ -59,7 +55,7 @@ async function run_gate_step(step: GateStep): Promise<GateStepResult> {
|
|
|
59
55
|
}
|
|
60
56
|
|
|
61
57
|
// The record `josh review:brief` reads, written only on a fully green run and only with the tree it
|
|
62
|
-
// was green on
|
|
58
|
+
// was green on. `/code-review` runs in a forked process that reads none of
|
|
63
59
|
// this repository's documents, so "the unit tests already passed" reaches it only if the invocation
|
|
64
60
|
// carries it — and it may only carry it if something wrote down that they did, on **this** tree.
|
|
65
61
|
//
|
|
@@ -68,15 +64,16 @@ async function run_gate_step(step: GateStep): Promise<GateStepResult> {
|
|
|
68
64
|
// project has no tests — must not become "the unit tests all passed": the gate keeps that skip
|
|
69
65
|
// visible on the console, and a record erasing it would have the brief tell a review agent not to
|
|
70
66
|
// re-run tests that never ran. A step that passed **with a checker's warnings** is withheld for the
|
|
71
|
-
// same reason one place further on
|
|
72
|
-
//
|
|
73
|
-
//
|
|
74
|
-
// `
|
|
67
|
+
// same reason one place further on: since the record is reused instead of the checks being re-run, a
|
|
68
|
+
// warning printed once would never be printed again on that tree, and hiding an eslint or
|
|
69
|
+
// svelte-check finding is the same failure as hiding a skip. It is `has_checker_warning`, not
|
|
70
|
+
// `has_warnings`, that decides this: the loose
|
|
75
71
|
// marker match is right for the print path, where a false positive costs one printed body, but here a
|
|
76
72
|
// false positive withholds the whole record and turns a green gate's `run:review --join` red — so a
|
|
77
73
|
// benign line from another tool (a Vite config deprecation on `test:unit`) must not withhold it. A
|
|
78
74
|
// tree that moved while
|
|
79
|
-
// the checks were in flight (the `PostToolUse` formatter, an editor save) is not the tree they read
|
|
75
|
+
// the checks were in flight (the `PostToolUse` formatter, an editor save) is not the tree they read —
|
|
76
|
+
// with no exception: no gate step writes to the tree.
|
|
80
77
|
// And a failed write leaves no record at all, which a temp-directory problem must never turn into a
|
|
81
78
|
// red gate.
|
|
82
79
|
//
|
|
@@ -105,7 +102,7 @@ async function record_green_gate(
|
|
|
105
102
|
}
|
|
106
103
|
}
|
|
107
104
|
|
|
108
|
-
// The marker that says a gate is running on this tree right now
|
|
105
|
+
// The marker that says a gate is running on this tree right now. The gate
|
|
109
106
|
// and `/code-review` are started together — neither writes to the working tree — so by the time
|
|
110
107
|
// `josh review:brief` composes the invocation the checks are usually still in flight. Without this
|
|
111
108
|
// record that state reads as "no gate was ever run", and the review agent runs the unit suite the
|
|
@@ -114,8 +111,8 @@ async function record_green_gate(
|
|
|
114
111
|
// **Both halves swallow their failure, and for the same reason `record_green_gate` does**: the
|
|
115
112
|
// marker is a convenience for the next command and nothing about it may reach the gate's verdict. A
|
|
116
113
|
// marker that could not be written costs a brief that says `Not verified`, which is the safe
|
|
117
|
-
// direction; one that could not be cleared costs nothing beyond the file itself, because
|
|
118
|
-
//
|
|
114
|
+
// direction; one that could not be cleared costs nothing beyond the file itself, because the record
|
|
115
|
+
// names the writing process by pid **and** start time — so a marker
|
|
119
116
|
// this gate leaves behind reads as not running from the moment the gate exits, however long it sits
|
|
120
117
|
// there and whatever the operating system later does with that pid. The next gate overwrites it.
|
|
121
118
|
function mark_gate_running(before: Record<string, string>, target?: string): void {
|
|
@@ -154,8 +151,8 @@ async function with_gate_marker<T>(
|
|
|
154
151
|
}
|
|
155
152
|
}
|
|
156
153
|
|
|
157
|
-
// This gate's share of the machine, resolved once at the gate's entry and carried down as one value
|
|
158
|
-
//
|
|
154
|
+
// This gate's share of the machine, resolved once at the gate's entry and carried down as one value.
|
|
155
|
+
// `available_cores` is the budget every check reserves against; `is_reserved`
|
|
159
156
|
// is false for a gate nested inside another gate's unit suite — this repository's own gate tests — so
|
|
160
157
|
// the outer gate reserves and every gate beneath it does not. Captured before this gate sets
|
|
161
158
|
// `JOSH_UNIT_RUN_MARKED`, which is why it is read at entry rather than re-derived here.
|
|
@@ -171,12 +168,13 @@ function default_budget(): BudgetContext {
|
|
|
171
168
|
}
|
|
172
169
|
}
|
|
173
170
|
|
|
174
|
-
// A gate step paired with the cores it reserves from the machine-wide budget while it runs
|
|
175
|
-
//
|
|
171
|
+
// A gate step paired with the cores it reserves from the machine-wide budget while it runs.
|
|
172
|
+
// The weight travels with the step so `run_gate_steps` never has to re-pair a
|
|
176
173
|
// step with its check by index.
|
|
177
174
|
interface ReservedStep {
|
|
178
175
|
step: GateStep
|
|
179
176
|
weight: number
|
|
177
|
+
memory_mb: number
|
|
180
178
|
}
|
|
181
179
|
|
|
182
180
|
async function build_reserved_steps(
|
|
@@ -188,12 +186,13 @@ async function build_reserved_steps(
|
|
|
188
186
|
plan.checks.map(async (check) => ({
|
|
189
187
|
step: await build_gate_step(check, start_directory, plan),
|
|
190
188
|
weight: gate_plan.check_weight(check, plan, available_cores),
|
|
189
|
+
memory_mb: gate_plan.check_memory(check, plan, available_cores),
|
|
191
190
|
})),
|
|
192
191
|
)
|
|
193
192
|
}
|
|
194
193
|
|
|
195
194
|
// **A nested gate takes no reservation, and the budget is what makes that necessary rather than
|
|
196
|
-
// merely tidy
|
|
195
|
+
// merely tidy**. The unit step spawns the suite, which runs this repository's
|
|
197
196
|
// own gate tests; each of those is a gate inside the outer gate's unit reservation, and a place it
|
|
198
197
|
// claimed would wait for cores the outer gate cannot free until the suite — this test included —
|
|
199
198
|
// finishes.
|
|
@@ -205,26 +204,29 @@ async function run_reserved_step(
|
|
|
205
204
|
|
|
206
205
|
return await core_budget.with_core_reservation(
|
|
207
206
|
reserved.weight,
|
|
208
|
-
async () =>
|
|
209
|
-
|
|
207
|
+
async (admission) => ({
|
|
208
|
+
...(await run_gate_step(reserved.step)),
|
|
209
|
+
budget_note: core_budget.describe_overflow(admission),
|
|
210
|
+
}),
|
|
211
|
+
{ budget: budget.available_cores, memory_mb: reserved.memory_mb },
|
|
210
212
|
)
|
|
211
213
|
}
|
|
212
214
|
|
|
213
215
|
// `bounded_pool` rather than a bare `Promise.all`, so the plan's `concurrency` is what decides how
|
|
214
|
-
// many run at once
|
|
216
|
+
// many run at once. **The all-failures-in-one-pass property survives the
|
|
215
217
|
// change** because no check ever rejects: `buffered_process` reports a non-zero exit as a value, so
|
|
216
218
|
// the pool's first-failure abort — written for callers that spawn real Claude sessions — never
|
|
217
219
|
// fires here and every queued check still runs. Results come back in input order however they
|
|
218
220
|
// finished, which is what keeps the printed sections in declaration order. Each step first claims its
|
|
219
|
-
// place in the machine-wide budget and waits while the budget is full
|
|
221
|
+
// place in the machine-wide budget and waits while the budget is full.
|
|
220
222
|
async function run_gate_steps(
|
|
221
223
|
plan: GatePlan,
|
|
222
224
|
budget: BudgetContext = default_budget(),
|
|
223
225
|
): Promise<ReadonlyArray<GateStepResult>> {
|
|
224
226
|
const reserved = await build_reserved_steps(process.cwd(), plan, budget.available_cores)
|
|
225
227
|
|
|
226
|
-
// **The checks run under the held mark, so a check's own dispatch claims nothing
|
|
227
|
-
//
|
|
228
|
+
// **The checks run under the held mark, so a check's own dispatch claims nothing**.
|
|
229
|
+
// Each check is a `pnpm josh <target>` child, and a target that declares
|
|
228
230
|
// a weight would otherwise claim a second place for the cores reserved for it here. A nested gate
|
|
229
231
|
// sets the mark too, since its checks are covered by the outer gate's reservation.
|
|
230
232
|
return await core_budget.with_held_mark(
|
|
@@ -237,15 +239,15 @@ async function run_gate_steps(
|
|
|
237
239
|
)
|
|
238
240
|
}
|
|
239
241
|
|
|
240
|
-
// **Both markers are claims about the unit suite, so a gate that is not running it makes neither
|
|
241
|
-
//
|
|
242
|
+
// **Both markers are claims about the unit suite, so a gate that is not running it makes neither**.
|
|
243
|
+
// The in-flight marker tells the next `josh review:brief` that a gate is
|
|
242
244
|
// covering this tree right now, which is what stops a review agent re-running the suite; the
|
|
243
245
|
// unit-run marker tells a sibling lane a vitest run is on the machine, which is what makes that
|
|
244
246
|
// lane divide its own workers. A `--no-unit` gate that wrote either would be answering for a check
|
|
245
247
|
// it never started — the first by telling a review the tests are covered when they are running in a
|
|
246
248
|
// different CI job, the second by throttling a lane on its behalf.
|
|
247
249
|
//
|
|
248
|
-
// **The work the markers cover ends at the green record, not at the last check
|
|
250
|
+
// **The work the markers cover ends at the green record, not at the last check**.
|
|
249
251
|
// Cleared before `record_green_gate` wrote, the in-flight marker left a gap of tens of milliseconds in
|
|
250
252
|
// which `run:review --join` read neither a running gate nor a green one — and answered RED for a gate
|
|
251
253
|
// that was about to record green. Cleared after it, a reader that sees no marker is reading a gate
|
|
@@ -271,11 +273,16 @@ async function run_marked_gate<T>(
|
|
|
271
273
|
// a core count the plan was not derived from — the one misreading this line exists to prevent.
|
|
272
274
|
// The concurrent-run count is read here rather than inside `gate-plan.ts` for the reason the core
|
|
273
275
|
// count already is: that module stays a pure function of its inputs, and the machine is asked once and
|
|
274
|
-
// handed to both calls. Counted *before* the unit step writes its own marker, so `+ 1` is this gate
|
|
275
|
-
// (joshuafolkken/kit#1515).
|
|
276
|
+
// handed to both calls. Counted *before* the unit step writes its own marker, so `+ 1` is this gate.
|
|
276
277
|
function announce_gate_plan(is_unit_included: boolean, available_cores: number): GatePlan {
|
|
277
278
|
const concurrent_runs = unit_worker_share.live_run_count() + unit_worker_share.SOLO_RUNS
|
|
278
|
-
const
|
|
279
|
+
const is_kit_repository = project_checks.is_kit_repository(process.cwd())
|
|
280
|
+
const plan = gate_plan.resolve_gate_plan(
|
|
281
|
+
available_cores,
|
|
282
|
+
concurrent_runs,
|
|
283
|
+
is_unit_included,
|
|
284
|
+
is_kit_repository,
|
|
285
|
+
)
|
|
279
286
|
|
|
280
287
|
process.stdout.write(`${gate_plan.format_gate_plan(plan, available_cores, concurrent_runs)}\n`)
|
|
281
288
|
|
|
@@ -300,20 +307,20 @@ interface GateOptions {
|
|
|
300
307
|
// inside `pnpm josh gate`, so a test writing to the shared path would overwrite the live gate's
|
|
301
308
|
// own log with the output of four checks that never ran.
|
|
302
309
|
log_path?: string
|
|
303
|
-
// **The scoped pre-check the CLI entry turns on
|
|
310
|
+
// **The scoped pre-check the CLI entry turns on**. Off everywhere else so
|
|
304
311
|
// that a direct `run_verification_gate` call — the whole of `verification-gate.test.ts` — is never
|
|
305
312
|
// refused by a real checkout's missing scoped record; `run_gate_command` sets it true.
|
|
306
313
|
is_scoped_enforced?: boolean
|
|
307
314
|
// The scoped records' paths, overridable so a test can plant a green pair rather than depend on the
|
|
308
315
|
// surrounding checkout's — the reason `scoped-green.ts` takes a `source` per stamp.
|
|
309
316
|
scoped_sources?: ScopedSources
|
|
310
|
-
// The lane ledger a finished gate's duration is appended to
|
|
317
|
+
// The lane ledger a finished gate's duration is appended to. Only the CLI
|
|
311
318
|
// entry resolves it, so a suite driving the gate never writes a measurement of checks that never ran.
|
|
312
319
|
ledger_path?: string | undefined
|
|
313
320
|
}
|
|
314
321
|
|
|
315
322
|
// **The gate refuses to start when the scoped pair has not been green on this tree**
|
|
316
|
-
//
|
|
323
|
+
// — the same record `josh review:brief` reads, applied one step earlier so the
|
|
317
324
|
// first gate is the only gate. It is the CLI entry's check alone (`is_scoped_enforced`), and it never
|
|
318
325
|
// fires for CI's `--no-unit` gate or a `--force` run: CI has no scoped record in front of it, and
|
|
319
326
|
// `--force` is the caller saying to run regardless. `scoped_green` owns the record and the `JOSH_SCOPED_GREEN`
|
|
@@ -325,12 +332,12 @@ function scoped_precheck_refusal(tree: GateTree, options: GateOptions): string |
|
|
|
325
332
|
return scoped_green.refusal_for(tree.files, tree.base, options.scoped_sources)
|
|
326
333
|
}
|
|
327
334
|
|
|
328
|
-
// **A partial gate records nothing green, and this is the same rule as the skip one layer out
|
|
329
|
-
//
|
|
335
|
+
// **A partial gate records nothing green, and this is the same rule as the skip one layer out**.
|
|
336
|
+
// The record's whole meaning to `josh review:brief` and to `gate_skip` is
|
|
330
337
|
// "every check this repository gates on passed on exactly this tree"; a `--no-unit` run proves three
|
|
331
338
|
// of the four, so writing it would let the next full `josh gate` be skipped on a tree whose unit
|
|
332
|
-
// suite nobody ran here — a check reporting success without having run, which is the state
|
|
333
|
-
//
|
|
339
|
+
// suite nobody ran here — a check reporting success without having run, which is the state the
|
|
340
|
+
// skip rule exists to refuse.
|
|
334
341
|
async function record_whole_gate(
|
|
335
342
|
plan: GatePlan,
|
|
336
343
|
results: ReadonlyArray<GateStepResult>,
|
|
@@ -343,12 +350,12 @@ async function record_whole_gate(
|
|
|
343
350
|
}
|
|
344
351
|
|
|
345
352
|
// Reports the checks and records a green result — inside the markers, so the in-flight one outlives
|
|
346
|
-
// the record it announces
|
|
353
|
+
// the record it announces.
|
|
347
354
|
async function settle_gate(
|
|
348
355
|
plan: GatePlan,
|
|
349
356
|
results: ReadonlyArray<GateStepResult>,
|
|
350
357
|
tree: GateTree,
|
|
351
|
-
options: GateOptions & { started_at: number },
|
|
358
|
+
options: GateOptions & { started_at: number; ledger: GateLedgerStart },
|
|
352
359
|
): Promise<number> {
|
|
353
360
|
const elapsed_ms = performance.now() - options.started_at
|
|
354
361
|
const failed_labels = gate_report.report_gate_steps(results, {
|
|
@@ -359,9 +366,7 @@ async function settle_gate(
|
|
|
359
366
|
})
|
|
360
367
|
const is_passed = failed_labels.length === 0
|
|
361
368
|
|
|
362
|
-
|
|
363
|
-
await lane_ledger.record_gate(options.ledger_path, elapsed_ms, is_passed)
|
|
364
|
-
}
|
|
369
|
+
await gate_ledger.record(options.ledger, results, { elapsed_ms, is_passed })
|
|
365
370
|
|
|
366
371
|
if (!is_passed) return FAIL_EXIT_CODE
|
|
367
372
|
|
|
@@ -373,15 +378,18 @@ async function settle_gate(
|
|
|
373
378
|
// The plan line is printed by the checked path alone. A run that announced a four-way fan-out and
|
|
374
379
|
// then skipped would be describing something that never happened, and the skip's own line already
|
|
375
380
|
// says everything there is to say about a gate that started no process. The reporting itself is
|
|
376
|
-
// `gate-report.ts`'s
|
|
381
|
+
// `gate-report.ts`'s.
|
|
377
382
|
async function run_checked_gate(
|
|
378
383
|
tree: GateTree,
|
|
379
384
|
options: GateOptions,
|
|
380
385
|
started_at: number,
|
|
381
386
|
): Promise<number> {
|
|
382
387
|
const is_unit_included = options.is_unit_included ?? true
|
|
388
|
+
// Read before the concurrent-run count, never between it and the marker below: the reading waits out
|
|
389
|
+
// a sample window, and a lane counting inside that window would miss this gate.
|
|
390
|
+
const ledger = await gate_ledger.start(options.ledger_path)
|
|
383
391
|
// Resolved at the gate's entry, before this gate sets `JOSH_UNIT_RUN_MARKED`, so a gate nested in the
|
|
384
|
-
// unit suite reads the flag as set and reserves nothing
|
|
392
|
+
// unit suite reads the flag as set and reserves nothing.
|
|
385
393
|
const budget = default_budget()
|
|
386
394
|
const plan = announce_gate_plan(is_unit_included, budget.available_cores)
|
|
387
395
|
|
|
@@ -390,11 +398,11 @@ async function run_checked_gate(
|
|
|
390
398
|
// together — the shape `epicrun` produces — would both read "nothing else is running" and both take
|
|
391
399
|
// the whole machine. Claimed here, after the count and before any check, it is already there when
|
|
392
400
|
// the next lane asks; the guard inside the spawned `josh test:unit` sees the handoff and adds no
|
|
393
|
-
// second marker for the same run
|
|
401
|
+
// second marker for the same run.
|
|
394
402
|
async function run_and_settle(): Promise<number> {
|
|
395
403
|
const results = await run_gate_steps(plan, budget)
|
|
396
404
|
|
|
397
|
-
return await settle_gate(plan, results, tree, { ...options, started_at })
|
|
405
|
+
return await settle_gate(plan, results, tree, { ...options, started_at, ledger })
|
|
398
406
|
}
|
|
399
407
|
|
|
400
408
|
return await run_marked_gate(tree.files, plan, run_and_settle, options.marker_path)
|
|
@@ -410,8 +418,7 @@ function reusable_stamp(tree: GateTree, options: GateOptions): FileMapStamp | un
|
|
|
410
418
|
|
|
411
419
|
// The two ways a gate ends before it runs a check: a green record it can reuse (exit 0), and the
|
|
412
420
|
// scoped pre-check refusing a tree the pair has not been green on (exit 1). `undefined` means neither
|
|
413
|
-
// fired and the checks run. **Nothing else stands between the skip and the checks
|
|
414
|
-
// joshuafolkken/kit#1437's `package.json` refusal was removed once children stopped bumping.
|
|
421
|
+
// fired and the checks run. **Nothing else stands between the skip and the checks.**
|
|
415
422
|
function short_circuit_gate(tree: GateTree, options: GateOptions): number | undefined {
|
|
416
423
|
const reusable = reusable_stamp(tree, options)
|
|
417
424
|
|
package/scripts/gh/gh-spawn.ts
CHANGED
|
@@ -6,7 +6,7 @@ import { git_gh_exec } from './git-gh-exec'
|
|
|
6
6
|
// synchronously because `josh init` / `josh sync` / `josh doctor` decide before they can await.
|
|
7
7
|
// It asks REST for the same reason — `gh repo view` goes through GraphQL, which a cloud session is
|
|
8
8
|
// refused (403), and a repository that reads as unresolved makes `init` / `sync` skip
|
|
9
|
-
// `sonar-project.properties` outright
|
|
9
|
+
// `sonar-project.properties` outright. The path comes from the shared
|
|
10
10
|
// builder rather than being spelled out again here.
|
|
11
11
|
//
|
|
12
12
|
// An unbounded lookup asks for `NO_BUDGET`, execa's own "no timeout": the shared layer otherwise
|
|
@@ -29,7 +29,7 @@ function fetch_repo_name(timeout_ms: number | undefined): string | undefined {
|
|
|
29
29
|
// The unbounded lookup, for callers whose *writes* depend on the answer. A timeout would surface as
|
|
30
30
|
// an unresolved repository, and `josh init` / `josh sync` react to that by skipping
|
|
31
31
|
// `sonar-project.properties` entirely — so a latency spike would silently leave a consumer's Sonar
|
|
32
|
-
// config stale. Waiting is the safer failure mode there
|
|
32
|
+
// config stale. Waiting is the safer failure mode there.
|
|
33
33
|
function get_repo_name_with_owner(): string | undefined {
|
|
34
34
|
return fetch_repo_name(undefined)
|
|
35
35
|
}
|
|
@@ -111,8 +111,9 @@ function classify_claude_comment(comment: ReviewComment): ClassifiedFinding {
|
|
|
111
111
|
}
|
|
112
112
|
}
|
|
113
113
|
|
|
114
|
-
// Temporary
|
|
115
|
-
// slow CodeRabbit review cannot stall the merge gate. Revert together with
|
|
114
|
+
// Temporary: CodeRabbit actionable comments are informational, never blockers, so a
|
|
115
|
+
// slow CodeRabbit review cannot stall the merge gate. Revert together with the rest of the
|
|
116
|
+
// temporary CodeRabbit non-blocking policy.
|
|
116
117
|
function build_coderabbit_info(comment: ReviewComment, count: number): ClassifiedFinding {
|
|
117
118
|
return {
|
|
118
119
|
author_login: comment.author_login,
|
|
@@ -4,11 +4,11 @@
|
|
|
4
4
|
// decision was already being spelled out per call site — in `git-gh-issue-read.ts`, and as a bare
|
|
5
5
|
// string concatenation in `git-gh-pr.ts` and `epic-cross-repo.ts`. All three now build their paths
|
|
6
6
|
// from here. Converting kit's GitHub calls to REST multiplies those call sites, so the decision is
|
|
7
|
-
// made once rather than at each one
|
|
7
|
+
// made once rather than at each one.
|
|
8
8
|
|
|
9
9
|
// One full page of a listing. REST answers 30 rows by default, and every listing this tooling reads
|
|
10
10
|
// is paged through with `--paginate`, so asking for the largest page turns a long listing into fewer
|
|
11
|
-
// round trips. Named once because three readers append it
|
|
11
|
+
// round trips. Named once because three readers append it.
|
|
12
12
|
const FULL_PAGE_QUERY = '?per_page=100'
|
|
13
13
|
|
|
14
14
|
// `gh api` expands `{owner}` and `{repo}` from the current repository, so the unqualified form needs
|
|
@@ -19,7 +19,7 @@ function repo_api_path(repo = '{owner}/{repo}'): string {
|
|
|
19
19
|
}
|
|
20
20
|
|
|
21
21
|
// The issue collection — what a listing pages through and what a creation posts to. One segment,
|
|
22
|
-
// named once: the reads, the listing and the writes all build on it
|
|
22
|
+
// named once: the reads, the listing and the writes all build on it.
|
|
23
23
|
function issues_api_path(repo?: string): string {
|
|
24
24
|
return `${repo_api_path(repo)}/issues`
|
|
25
25
|
}
|
|
@@ -30,15 +30,14 @@ function issue_api_path(issue_number: string, repo?: string): string {
|
|
|
30
30
|
|
|
31
31
|
// The dependency relations, which REST serves from their own endpoint rather than inside the issue.
|
|
32
32
|
// Named here because three call sites address it — the read in `git-gh-issue-read.ts` and both
|
|
33
|
-
// writes in `git-gh-issue-write.ts
|
|
33
|
+
// writes in `git-gh-issue-write.ts`.
|
|
34
34
|
function blocked_by_api_path(issue_number: string, repo?: string): string {
|
|
35
35
|
return `${issue_api_path(issue_number, repo)}/dependencies/blocked_by`
|
|
36
36
|
}
|
|
37
37
|
|
|
38
38
|
// A pull request's *conversation* comments. REST serves them from the issue endpoint rather than the
|
|
39
39
|
// pull one — `pulls/{N}/comments` is the review thread, which is a different listing with a
|
|
40
|
-
// different shape, and reading one where the other was meant is a silent mistake rather than a 404
|
|
41
|
-
// (joshuafolkken/kit#1027).
|
|
40
|
+
// different shape, and reading one where the other was meant is a silent mistake rather than a 404.
|
|
42
41
|
function issue_comments_api_path(issue_number: string, repo?: string): string {
|
|
43
42
|
return `${issue_api_path(issue_number, repo)}/comments`
|
|
44
43
|
}
|
|
@@ -49,14 +48,14 @@ function pulls_api_path(repo?: string): string {
|
|
|
49
48
|
}
|
|
50
49
|
|
|
51
50
|
// One pull request, addressed by number. `gh pr view` accepted a branch name and REST does not, so
|
|
52
|
-
// every read below the branch lookup names the number instead
|
|
51
|
+
// every read below the branch lookup names the number instead.
|
|
53
52
|
function pull_api_path(pr_number: string, repo?: string): string {
|
|
54
53
|
return `${pulls_api_path(repo)}/${pr_number}`
|
|
55
54
|
}
|
|
56
55
|
|
|
57
56
|
// The merge of one pull request. `gh pr merge <branch> --merge` is the GraphQL call this replaces,
|
|
58
57
|
// and the method it named is sent as the `merge_method` field of the request body rather than being
|
|
59
|
-
// left to the endpoint's default
|
|
58
|
+
// left to the endpoint's default.
|
|
60
59
|
function pull_merge_api_path(pr_number: string, repo?: string): string {
|
|
61
60
|
return `${pull_api_path(pr_number, repo)}/merge`
|
|
62
61
|
}
|
|
@@ -68,7 +67,7 @@ function pull_comments_api_path(pr_number: string, repo?: string): string {
|
|
|
68
67
|
}
|
|
69
68
|
|
|
70
69
|
// The review history of one pull request. There is no REST counterpart to GraphQL's
|
|
71
|
-
// `reviewDecision`, so the merge gate folds this listing into one instead
|
|
70
|
+
// `reviewDecision`, so the merge gate folds this listing into one instead.
|
|
72
71
|
function pull_reviews_api_path(pr_number: string, repo?: string): string {
|
|
73
72
|
return `${pull_api_path(pr_number, repo)}/reviews`
|
|
74
73
|
}
|
|
@@ -92,13 +91,13 @@ function commit_status_api_path(commit_sha: string, repo?: string): string {
|
|
|
92
91
|
}
|
|
93
92
|
|
|
94
93
|
// A single tag reference. REST answers 404 when the tag does not exist, which is the whole of the
|
|
95
|
-
// question the release command's tag watch asks
|
|
94
|
+
// question the release command's tag watch asks.
|
|
96
95
|
function tag_reference_api_path(tag: string, repo?: string): string {
|
|
97
96
|
return `${repo_api_path(repo)}/git/ref/tags/${tag}`
|
|
98
97
|
}
|
|
99
98
|
|
|
100
99
|
// The GitHub Release published for one tag. REST answers 404 until `publish.yml`'s `create-release`
|
|
101
|
-
// job has run, which is what the release command's progress watch asks
|
|
100
|
+
// job has run, which is what the release command's progress watch asks.
|
|
102
101
|
function release_by_tag_api_path(tag: string, repo?: string): string {
|
|
103
102
|
return `${repo_api_path(repo)}/releases/tags/${tag}`
|
|
104
103
|
}
|
|
@@ -7,10 +7,10 @@ import { gh_failure } from './git-gh-failure'
|
|
|
7
7
|
|
|
8
8
|
const BODY_FROM_STDIN = '-'
|
|
9
9
|
|
|
10
|
-
// The budget for **one** request through this layer, and the reason nothing here waits forever
|
|
11
|
-
//
|
|
12
|
-
//
|
|
13
|
-
//
|
|
10
|
+
// The budget for **one** request through this layer, and the reason nothing here waits forever.
|
|
11
|
+
// Every GitHub access kit makes funnels through the four entries below, so without it a single hung
|
|
12
|
+
// `gh` would hold the caller open with no upper bound — most visibly in `josh propagate`, whose
|
|
13
|
+
// runner is single-threaded and would process no further consumer at all.
|
|
14
14
|
//
|
|
15
15
|
// **It is a request's budget, not a step's.** `STEP_TIMEOUT_MS` (30 minutes, `propagate-steps.ts`)
|
|
16
16
|
// covers a consumer's whole unit suite and a `pnpm add`; one REST call has no business borrowing
|
|
@@ -33,7 +33,7 @@ const BODY_FROM_STDIN = '-'
|
|
|
33
33
|
//
|
|
34
34
|
// **What a timed-out read costs its caller is decided by that caller, and two are worth naming.**
|
|
35
35
|
// In the merge gate's poll loop (`wait_for_pr_success`) it is one unreadable poll: the loop retries
|
|
36
|
-
// on its next interval and gives up on the third consecutive failure
|
|
36
|
+
// on its next interval and gives up on the third consecutive failure, so a
|
|
37
37
|
// timeout, a 403, a rate limit and a dropped connection all end the wait loudly rather than hanging
|
|
38
38
|
// or reading as a verdict, and re-running `followup` resumes it. In `followup`'s look-ahead it costs
|
|
39
39
|
// a log line: `handle_watch_failure` absorbs the error and falls through to the polling.
|
|
@@ -59,22 +59,22 @@ function to_timeout_option(timeout_ms?: number): { timeout: number } {
|
|
|
59
59
|
return { timeout: timeout_ms ?? GH_REQUEST_TIMEOUT_MS }
|
|
60
60
|
}
|
|
61
61
|
|
|
62
|
-
// **`gh` dials GitHub directly, never through a proxy this machine stood up on loopback
|
|
63
|
-
//
|
|
62
|
+
// **`gh` dials GitHub directly, never through a proxy this machine stood up on loopback**.
|
|
63
|
+
// A package-manager wrapper writes one into the environment of everything
|
|
64
64
|
// its invocation spawns, and it exists to inspect package downloads — api.github.com crosses it
|
|
65
|
-
// without inspection, so the hop buys nothing and can fail on its own:
|
|
66
|
-
//
|
|
67
|
-
//
|
|
68
|
-
// the list of spellings are the agent-session launcher's
|
|
65
|
+
// without inspection, so the hop buys nothing and can fail on its own: one 30-second stall makes the
|
|
66
|
+
// wrapper refuse every later GitHub connection of that `followup`, and the retries in the poll loop
|
|
67
|
+
// can then only ever fail. The loopback test and
|
|
68
|
+
// the list of spellings are the agent-session launcher's, shared rather than
|
|
69
69
|
// restated. Only the scanner's proxy goes — recognized by its CA — because any other loopback proxy
|
|
70
70
|
// may be this machine's only route out; a proxy naming a real host is somebody's network and stays.
|
|
71
71
|
// Nothing is spread when there is nothing to remove, so a spawn outside such a wrapper keeps its
|
|
72
72
|
// options exactly as they were.
|
|
73
73
|
//
|
|
74
74
|
// **It is exported for the one spawn that is not a REST request** — `josh start`'s `gh repo create`
|
|
75
|
-
// step (`start-exec.ts`). Every `gh api` request goes through the entries below
|
|
76
|
-
//
|
|
77
|
-
//
|
|
75
|
+
// step (`start-exec.ts`). Every `gh api` request goes through the entries below, which
|
|
76
|
+
// `gh-subcommand-guard.test.ts` enforces, and `git-gh-exec-proxy.test.ts` still refuses a `gh api`
|
|
77
|
+
// spawn that does not spread it.
|
|
78
78
|
interface DirectEnvironment {
|
|
79
79
|
env?: Record<string, undefined>
|
|
80
80
|
}
|
|
@@ -92,7 +92,7 @@ interface SpawnOptions extends DirectEnvironment {
|
|
|
92
92
|
|
|
93
93
|
// `cwd` is spread in only when given: `{owner}/{repo}` in a path is resolved from the checkout gh
|
|
94
94
|
// runs in, so a caller pinned to the project root says so, and every other caller keeps inheriting
|
|
95
|
-
// the process's own directory
|
|
95
|
+
// the process's own directory.
|
|
96
96
|
function to_spawn_options(timeout_ms?: number, cwd?: string): SpawnOptions {
|
|
97
97
|
return {
|
|
98
98
|
...to_timeout_option(timeout_ms),
|
|
@@ -103,10 +103,10 @@ function to_spawn_options(timeout_ms?: number, cwd?: string): SpawnOptions {
|
|
|
103
103
|
|
|
104
104
|
// What a request that ran out of time is labelled with, ahead of whatever gh managed to write.
|
|
105
105
|
//
|
|
106
|
-
// The
|
|
107
|
-
//
|
|
108
|
-
//
|
|
109
|
-
//
|
|
106
|
+
// "The server said no" and "nobody ever got an answer" are different diagnoses, and a timeout is
|
|
107
|
+
// the second. execa names it on the error it throws, and without the prefix a hang that had written
|
|
108
|
+
// a line to stderr first would arrive as that line — reported as whatever it happened to say
|
|
109
|
+
// instead of as a timeout.
|
|
110
110
|
const GH_REQUEST_TIMEOUT_MESSAGE = 'gh request timed out'
|
|
111
111
|
|
|
112
112
|
function has_stderr_field(error: unknown): error is Error & { stderr: string } {
|
|
@@ -120,26 +120,24 @@ function has_stdout_field(error: unknown): error is Error & { stdout: string } {
|
|
|
120
120
|
}
|
|
121
121
|
|
|
122
122
|
// `has_timed_out` is shared with the push transport rather than restated here: execa marks a spawn
|
|
123
|
-
// it killed the same way whichever binary was spawned, and `git push`
|
|
124
|
-
// joshuafolkken/kit#1251.
|
|
123
|
+
// it killed the same way whichever binary was spawned, and `git push` has a budget of its own.
|
|
125
124
|
function to_timeout_prefix(error: unknown): string {
|
|
126
125
|
return has_timed_out(error) ? `${GH_REQUEST_TIMEOUT_MESSAGE}: ` : ''
|
|
127
126
|
}
|
|
128
127
|
|
|
129
|
-
// Surface the gh CLI's stderr as the thrown message when present
|
|
130
|
-
//
|
|
128
|
+
// Surface the gh CLI's stderr as the thrown message when present, otherwise fall back to execa's
|
|
129
|
+
// own message — **and append what gh wrote to stdout**.
|
|
131
130
|
//
|
|
132
131
|
// The append is not cosmetic. `gh api` splits a failed request across both streams: stderr carries
|
|
133
132
|
// one summary line (`gh: Validation Failed (HTTP 422)`) and **stdout carries the JSON error body**,
|
|
134
|
-
// which is the only place the reason is written. Every caller here is
|
|
135
|
-
//
|
|
136
|
-
//
|
|
137
|
-
//
|
|
138
|
-
// joshuafolkken/kit#1029).
|
|
133
|
+
// which is the only place the reason is written. Every caller here is a REST request, so dropping
|
|
134
|
+
// stdout would drop the diagnosis from every REST failure — and `handle_pr_create_error` reads the
|
|
135
|
+
// reason: a duplicate pull request is `A pull request already exists for <owner>:<branch>.` inside
|
|
136
|
+
// that body, and matching it against stderr alone answers no.
|
|
139
137
|
//
|
|
140
138
|
// The same stdout is what carries the request's own failure nature, so the classification is
|
|
141
139
|
// attached here rather than reconstructed by a later probe: GitHub's error document names its status
|
|
142
|
-
// and a request that never arrived wrote no document at all
|
|
140
|
+
// and a request that never arrived wrote no document at all.
|
|
143
141
|
function to_gh_error(error: unknown): Error {
|
|
144
142
|
const stderr = has_stderr_field(error) ? error.stderr.trim() : ''
|
|
145
143
|
const stdout = has_stdout_field(error) ? error.stdout.trim() : ''
|
|
@@ -210,24 +208,22 @@ function status_of_failure(error: unknown): number | undefined {
|
|
|
210
208
|
// The HTTP status of one `gh api` request, read from the status line rather than from `gh`'s error
|
|
211
209
|
// text. A message is prose that can be reworded between releases; the status code is the protocol,
|
|
212
210
|
// so a caller distinguishing "there is nothing at that number" (404) from "the read failed" (403,
|
|
213
|
-
// 429, 5xx) is matching a contract instead of a string
|
|
211
|
+
// 429, 5xx) is matching a contract instead of a string.
|
|
214
212
|
//
|
|
215
213
|
// `--silent` drops the response body, so only the headers are parsed; `--include` keeps them even
|
|
216
214
|
// when the request failed, and execa carries that output on the error it throws. `undefined` means
|
|
217
215
|
// no status was reached at all — gh missing, a dropped connection — which is itself a failed read.
|
|
218
216
|
//
|
|
219
|
-
// **The fifth spawn in this file, and guarded like the other four
|
|
220
|
-
//
|
|
221
|
-
//
|
|
222
|
-
//
|
|
223
|
-
// `undefined`, which already means "no status was reached", which its one caller already reads as a
|
|
224
|
-
// failed read rather than as a 404.
|
|
217
|
+
// **The fifth spawn in this file, and guarded like the other four**: leaving one unbounded `gh`
|
|
218
|
+
// spawn beside four bounded ones would be an inconsistency in the same file. A timeout reaches the
|
|
219
|
+
// `catch` and answers `undefined`, which already means "no status was reached", which its one
|
|
220
|
+
// caller already reads as a failed read rather than as a 404.
|
|
225
221
|
async function exec_gh_api_status(path: string, timeout_ms?: number): Promise<number | undefined> {
|
|
226
222
|
// Hoisted so the spawn below fits on one line, which `// NOSONAR` requires — it suppresses only
|
|
227
223
|
// the line it sits on. The **argument list** stays an inline literal for the opposite reason:
|
|
228
224
|
// `gh-subcommand-guard.ts` resolves the subcommand from it, and hoisting that into a `const`
|
|
229
225
|
// makes the scan report `<dynamic>` instead of `api`, leaving a future edit to
|
|
230
|
-
// `['issue', 'view', …]` uncaught
|
|
226
|
+
// `['issue', 'view', …]` uncaught.
|
|
231
227
|
const options = to_spawn_options(timeout_ms)
|
|
232
228
|
|
|
233
229
|
try {
|
|
@@ -241,7 +237,7 @@ async function exec_gh_api_status(path: string, timeout_ms?: number): Promise<nu
|
|
|
241
237
|
}
|
|
242
238
|
|
|
243
239
|
// The synchronous twin of `exec_gh_api_status`, for `epic-cross-repo.ts`, whose resolver is
|
|
244
|
-
// synchronous all the way up to `epic_classify
|
|
240
|
+
// synchronous all the way up to `epic_classify`. Same request, same
|
|
245
241
|
// answer: the status line, or `undefined` when no status was reached. It cannot run
|
|
246
242
|
// `check_gh_installed`, which awaits — a missing gh is a spawn that throws without stdout, so it
|
|
247
243
|
// answers `undefined`, which is what that check would have led to anyway.
|
|
@@ -280,7 +276,7 @@ const JQ_FLAG = '--jq'
|
|
|
280
276
|
// this field exists for: `--paginate` alone emits one document per page, so a two-page response
|
|
281
277
|
// arrives as `{…}{…}`, which `JSON.parse` rejects, and `--slurp` wraps those pages in one outer
|
|
282
278
|
// array instead. It is a separate field rather than implied by `should_paginate` for that reason,
|
|
283
|
-
// and because gh refuses it alongside `--jq
|
|
279
|
+
// and because gh refuses it alongside `--jq`.
|
|
284
280
|
interface GhApiRequest {
|
|
285
281
|
path: string
|
|
286
282
|
method?: string
|
|
@@ -289,9 +285,9 @@ interface GhApiRequest {
|
|
|
289
285
|
should_slurp?: boolean
|
|
290
286
|
jq_filter?: string
|
|
291
287
|
// The budget for this one request, overriding `GH_REQUEST_TIMEOUT_MS`. A field rather than a
|
|
292
|
-
// second argument for the reason recorded beside that constant
|
|
288
|
+
// second argument for the reason recorded beside that constant. `0` is
|
|
293
289
|
// execa's own "no budget", kept for the one reader whose caller's writes depend on the answer
|
|
294
|
-
// (`gh-spawn.ts
|
|
290
|
+
// (`gh-spawn.ts`).
|
|
295
291
|
timeout_ms?: number
|
|
296
292
|
// The checkout gh runs in, which is what `{owner}/{repo}` in `path` resolves against. Absent means
|
|
297
293
|
// the process's own directory.
|
|
@@ -319,8 +315,8 @@ function to_gh_api_args(request: GhApiRequest): Array<string> {
|
|
|
319
315
|
}
|
|
320
316
|
|
|
321
317
|
// The response body of one `gh api` request, as text. Every REST caller that can await one goes
|
|
322
|
-
// through it, so the verb, the body and the paging stop being spelled out per call site
|
|
323
|
-
//
|
|
318
|
+
// through it, so the verb, the body and the paging stop being spelled out per call site.
|
|
319
|
+
// A caller that cannot await uses `exec_gh_api_sync` or
|
|
324
320
|
// `read_gh_api_sync` below.
|
|
325
321
|
//
|
|
326
322
|
// Failure handling funnels through `to_gh_error` on both paths below, so a failed request throws
|
|
@@ -344,12 +340,11 @@ async function exec_gh_api(request: GhApiRequest): Promise<string> {
|
|
|
344
340
|
// consumer's steps as a sequential chain of `execaSync` spawns with inherited stdio, and that shape
|
|
345
341
|
// reaches from `open_issue` up through `RunStep`, `run_target` and `run_targets` — so the issue it
|
|
346
342
|
// opens in the consumer is created here rather than by turning the whole runner asynchronous for
|
|
347
|
-
// one request
|
|
343
|
+
// one request.
|
|
348
344
|
//
|
|
349
|
-
// It
|
|
350
|
-
//
|
|
351
|
-
//
|
|
352
|
-
// with its own error handling, timeout and proxy handling.
|
|
345
|
+
// It serves the write side and the synchronous readers alike — `gh-spawn.ts`, `epic-cross-repo.ts`,
|
|
346
|
+
// `repo-setting.ts`, `propagate-publish.ts`, `version-remote.ts` go through it rather than each
|
|
347
|
+
// spelling its own `execaSync('gh', …)` with its own error handling, timeout and proxy handling.
|
|
353
348
|
//
|
|
354
349
|
// **It is the same layer, not a second one.** The argument builder and the error translation are
|
|
355
350
|
// shared with the asynchronous path above, so `--input -` for the body, `--jq` for the unwrap, and
|