@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
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { observation_ledger_home } from './observation-ledger-home'
|
|
2
|
+
import { observation_ledger_line } from './observation-ledger-line'
|
|
3
|
+
|
|
4
|
+
// The count, the append and the promotion verdict of one observation-ledger sighting, as one command.
|
|
5
|
+
// They were a `cat | grep -c … || true` a run typed by hand, an append it
|
|
6
|
+
// wrote itself, and a "does the count answer exactly 1" it judged — three steps whose answers are
|
|
7
|
+
// fixed, now read off the ledger rather than re-derived in every run. The grammar and the promotion
|
|
8
|
+
// rule are `.claude/skills/workflow-commands/observation-ledger.md`'s.
|
|
9
|
+
|
|
10
|
+
const FILE_VERDICT = 'file'
|
|
11
|
+
const LEDGER_VERDICT = 'ledger'
|
|
12
|
+
const REFUSED_VERDICT = 'refused'
|
|
13
|
+
// The sample line in `observation-ledger.md` carries it, so a real sighting under it would be counted
|
|
14
|
+
// against the sample.
|
|
15
|
+
const RESERVED_SLUG = 'example'
|
|
16
|
+
const RESERVED_REASON = '`k:example` is reserved for the sample in observation-ledger.md'
|
|
17
|
+
// The one earlier sighting that makes this one the second — a higher count means the sighting that
|
|
18
|
+
// answered `1` already filed the Issue.
|
|
19
|
+
const PROMOTING_COUNT = 1
|
|
20
|
+
|
|
21
|
+
interface ObservationEntry {
|
|
22
|
+
slug: string
|
|
23
|
+
depth: string
|
|
24
|
+
where: string
|
|
25
|
+
what: string
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
interface RecordRequest {
|
|
29
|
+
entry: ObservationEntry
|
|
30
|
+
checkout: string
|
|
31
|
+
now: Date
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
type RecordResult =
|
|
35
|
+
| { verdict: typeof REFUSED_VERDICT; reason: string }
|
|
36
|
+
| {
|
|
37
|
+
verdict: typeof FILE_VERDICT | typeof LEDGER_VERDICT
|
|
38
|
+
earlier: ReadonlyArray<string>
|
|
39
|
+
line: string
|
|
40
|
+
target: string
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
function entry_line(entry: ObservationEntry, date: string): string {
|
|
44
|
+
return `- k:${entry.slug} | ${entry.depth} | ${date} | ${entry.where} | ${entry.what}`
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function refusal_of(entry: ObservationEntry, line: string): string | undefined {
|
|
48
|
+
if (entry.slug === RESERVED_SLUG) return RESERVED_REASON
|
|
49
|
+
|
|
50
|
+
return observation_ledger_line.line_reason(line)
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// Every ledger line already carrying the key, across every file — a recurrence is a recurrence
|
|
54
|
+
// whichever issue's file each sighting sits in. No ledger at all is a first sighting.
|
|
55
|
+
function sightings(ledger: string | undefined, slug: string): ReadonlyArray<string> {
|
|
56
|
+
const prefix = `- k:${slug} |`
|
|
57
|
+
|
|
58
|
+
return (ledger ?? '').split('\n').filter((line) => line.startsWith(prefix))
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// The count is read before the append, so it is the sightings *before* this one.
|
|
62
|
+
async function record(request: RecordRequest): Promise<RecordResult> {
|
|
63
|
+
const date = observation_ledger_home.ledger_date(request.now)
|
|
64
|
+
const line = entry_line(request.entry, date)
|
|
65
|
+
const reason = refusal_of(request.entry, line)
|
|
66
|
+
|
|
67
|
+
if (reason !== undefined) return { verdict: REFUSED_VERDICT, reason }
|
|
68
|
+
|
|
69
|
+
const earlier = sightings(
|
|
70
|
+
await observation_ledger_home.read(request.checkout),
|
|
71
|
+
request.entry.slug,
|
|
72
|
+
)
|
|
73
|
+
const target = await observation_ledger_home.writer_path(request.now, request.checkout)
|
|
74
|
+
|
|
75
|
+
await observation_ledger_home.append(target, [line])
|
|
76
|
+
|
|
77
|
+
const verdict = earlier.length === PROMOTING_COUNT ? FILE_VERDICT : LEDGER_VERDICT
|
|
78
|
+
|
|
79
|
+
return { verdict, earlier, line, target }
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
const observation_record = { record }
|
|
83
|
+
|
|
84
|
+
export {
|
|
85
|
+
FILE_VERDICT,
|
|
86
|
+
LEDGER_VERDICT,
|
|
87
|
+
observation_record,
|
|
88
|
+
REFUSED_VERDICT,
|
|
89
|
+
type ObservationEntry,
|
|
90
|
+
type RecordResult,
|
|
91
|
+
}
|
|
@@ -9,7 +9,7 @@ const FAILURE_EXIT_CODE = 1
|
|
|
9
9
|
// as a stack: "this checkout is on a feature branch" and "the tree holds somebody else's work" are
|
|
10
10
|
// both things the person fixes in one step, and a trace hides the sentence that says which.
|
|
11
11
|
//
|
|
12
|
-
// **It acts on the checkout it runs in
|
|
12
|
+
// **It acts on the checkout it runs in**. A lane's ledger lines merge with
|
|
13
13
|
// the lane's own pull request, so a lane has nothing to flush and is refused like any feature branch.
|
|
14
14
|
async function main(): Promise<void> {
|
|
15
15
|
try {
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import { git_gh_command } from '#scripts/gh/git-gh-command'
|
|
2
2
|
import type { OpenPull } from '#scripts/gh/git-gh-pr-auto-merge'
|
|
3
3
|
import { git_pr_checks } from '#scripts/gh/git-pr-checks'
|
|
4
|
+
import { issue_cite } from '#scripts/issue/issue-cite'
|
|
4
5
|
import { error_text } from '#scripts/lib/error-message'
|
|
5
6
|
|
|
6
|
-
// **A flush pull request lands whether or not the flush that opened it is still alive
|
|
7
|
-
//
|
|
8
|
-
//
|
|
9
|
-
//
|
|
7
|
+
// **A flush pull request lands whether or not the flush that opened it is still alive**.
|
|
8
|
+
// A merge only inside the flush's own wait would let a session cut or a killed process leave a green
|
|
9
|
+
// pull request open with nobody to merge it — and once a later flush appended to the same ledger
|
|
10
|
+
// tail, it would conflict and could not land at all. Auto-merge moves
|
|
10
11
|
// the merge to GitHub, and the wait that remains is only for fast-forwarding the local default
|
|
11
12
|
// branch.
|
|
12
13
|
|
|
@@ -18,7 +19,7 @@ const MERGE_FAILED_REASON =
|
|
|
18
19
|
'a required check failed or the branch conflicts, so auto-merge will not land the pull request'
|
|
19
20
|
|
|
20
21
|
// **Best-effort, and the answer says which wait to use.** GraphQL — the only way to enable auto-merge
|
|
21
|
-
// — can be refused in a cloud session
|
|
22
|
+
// — can be refused in a cloud session, and that loses the safety net rather
|
|
22
23
|
// than the flush: the in-process wait-and-merge still runs, exactly as before auto-merge existed.
|
|
23
24
|
async function request_auto_merge(branch_name: string): Promise<boolean> {
|
|
24
25
|
try {
|
|
@@ -49,7 +50,7 @@ async function wait_for_landing(branch_name: string, is_auto_merge: boolean): Pr
|
|
|
49
50
|
}
|
|
50
51
|
|
|
51
52
|
function describe_pull(pull: OpenPull): string {
|
|
52
|
-
return
|
|
53
|
+
return `${issue_cite.plain(pull.number)} (\`${pull.head_ref}\`)`
|
|
53
54
|
}
|
|
54
55
|
|
|
55
56
|
// **Landing means GitHub will merge it with nobody watching**: auto-merge is on and the merge gate has
|
|
@@ -7,9 +7,9 @@ import type { BrokenLine } from './observation-ledger-line'
|
|
|
7
7
|
import { observation_ledger_prepare } from './observation-ledger-prepare'
|
|
8
8
|
import { observations_flush_landing } from './observations-flush-landing'
|
|
9
9
|
|
|
10
|
-
// The commit path for the ledger lines no run's own commit carried
|
|
10
|
+
// The commit path for the ledger lines no run's own commit carried. Every run —
|
|
11
11
|
// a lane's included — commits its appended lines with its own pull request (`scripts/git/
|
|
12
|
-
// git-staging.ts
|
|
12
|
+
// git-staging.ts`), and `pnpm josh followup` commits a
|
|
13
13
|
// line appended after that commit before it merges, so what is left here is a line written on the
|
|
14
14
|
// default branch outside any issue's run — the date-named file `observation-ledger-home.ts` resolves.
|
|
15
15
|
//
|
|
@@ -17,7 +17,7 @@ import { observations_flush_landing } from './observations-flush-landing'
|
|
|
17
17
|
// their own over one path, wait on the same required checks every other pull request waits on, and
|
|
18
18
|
// merge — so this reuses the same primitives rather than growing a second answer to "how does a
|
|
19
19
|
// josh command open and land a pull request". The one difference is that this pull request is handed
|
|
20
|
-
// to GitHub's auto-merge as soon as it opens
|
|
20
|
+
// to GitHub's auto-merge as soon as it opens, so it lands even when the wait
|
|
21
21
|
// below does not survive — `observations-flush-landing.ts` carries why.
|
|
22
22
|
|
|
23
23
|
const COMMIT_MESSAGE = 'Record observation ledger entries'
|
|
@@ -72,7 +72,7 @@ function status_paths(status_output: string): ReadonlyArray<string> {
|
|
|
72
72
|
.map((line) => observation_ledger.status_path(line))
|
|
73
73
|
}
|
|
74
74
|
|
|
75
|
-
// **Single-sourced with `pnpm josh followup`'s pre-flush short-circuit
|
|
75
|
+
// **Single-sourced with `pnpm josh followup`'s pre-flush short-circuit**:
|
|
76
76
|
// the ledger-change test lives in `observation-ledger.ts`, so the two callers cannot drift.
|
|
77
77
|
function has_ledger_change(status_output: string): boolean {
|
|
78
78
|
return observation_ledger.has_pending_append(status_output)
|
|
@@ -89,17 +89,17 @@ function other_changed_paths(status_output: string): ReadonlyArray<string> {
|
|
|
89
89
|
// is what the ordinary off-default refusal says — would abandon them without a word, so this branch
|
|
90
90
|
// of the refusal says the opposite.
|
|
91
91
|
//
|
|
92
|
-
// **The exits it names are ones the caller can actually take
|
|
93
|
-
//
|
|
92
|
+
// **The exits it names are ones the caller can actually take**. "Finish or delete that branch" are
|
|
93
|
+
// both closed to an agent: the distributed
|
|
94
94
|
// `.claude/settings.json` denies `Bash(git commit*)` and `Bash(git branch -d*)`, and `pnpm josh git`
|
|
95
|
-
// excludes the ledger from staging by design
|
|
95
|
+
// excludes the ledger from staging by design, so finishing through it is not
|
|
96
96
|
// possible either. Pushing the branch and landing its pull request is the route that is open.
|
|
97
97
|
function stranded_flush_message(current: string): string {
|
|
98
98
|
return `\`${current}\` is a flush branch an earlier \`pnpm josh observations:flush\` left behind, and its appended observations are committed only there. Land it before flushing again — \`git push -u origin ${current}\`, then open and merge its pull request; \`pnpm josh ms\` here would leave the only copy of those lines behind.`
|
|
99
99
|
}
|
|
100
100
|
|
|
101
|
-
// **A flush branch with no commit on it strands nothing, so it is told the opposite
|
|
102
|
-
//
|
|
101
|
+
// **A flush branch with no commit on it strands nothing, so it is told the opposite**.
|
|
102
|
+
// The appended lines never left the working tree, which makes the "only
|
|
103
103
|
// copy" premise above factually false here — and makes `pnpm josh ms` the correct exit, the very one
|
|
104
104
|
// the other message forbids.
|
|
105
105
|
function empty_flush_message(current: string): string {
|
|
@@ -120,9 +120,9 @@ function off_default_message(current: string, default_branch: string): string {
|
|
|
120
120
|
}
|
|
121
121
|
|
|
122
122
|
// **A branch cut from a default branch that predates another merged flush conflicts by
|
|
123
|
-
// construction
|
|
123
|
+
// construction**. The ledger is append-only and every writer adds at the
|
|
124
124
|
// same tail, so a stale start point opens a pull request `wait_for_pr_success` waits on until it
|
|
125
|
-
// exhausts its budget rather than merging. The flush fast-forwards first
|
|
125
|
+
// exhausts its budget rather than merging. The flush fast-forwards first, so
|
|
126
126
|
// this is printed only when that fast-forward was refused — the reason is git's own.
|
|
127
127
|
function behind_default_message(default_branch: string, reason: string): string {
|
|
128
128
|
return `\`pnpm josh observations:flush\` cuts its branch from \`${default_branch}\`, which is behind \`origin/${default_branch}\` and could not be fast-forwarded (${reason}) — a branch cut here would open a pull request that cannot merge. Run \`pnpm josh ms\` first.`
|
|
@@ -183,7 +183,7 @@ async function refuse_off_default(current: string, default_branch: string): Prom
|
|
|
183
183
|
}
|
|
184
184
|
|
|
185
185
|
// **The start point's freshness is judged without moving the working tree**, which is the whole
|
|
186
|
-
// point of doing it here rather than pulling
|
|
186
|
+
// point of doing it here rather than pulling. `git fetch` updates the
|
|
187
187
|
// remote-tracking ref and `git rev-list --count HEAD..origin/<default>` reads it — neither writes a
|
|
188
188
|
// file, so the ledger, dirty by definition when this runs, is left exactly as it is.
|
|
189
189
|
async function commits_behind_default(default_branch: string): Promise<number> {
|
|
@@ -192,8 +192,8 @@ async function commits_behind_default(default_branch: string): Promise<number> {
|
|
|
192
192
|
return await git_command.commit_count_beyond('HEAD', `origin/${default_branch}`)
|
|
193
193
|
}
|
|
194
194
|
|
|
195
|
-
// **A default branch that is only behind is brought forward rather than refused
|
|
196
|
-
//
|
|
195
|
+
// **A default branch that is only behind is brought forward rather than refused**.
|
|
196
|
+
// A lane's flush acts on the primary checkout, whose default branch is
|
|
197
197
|
// behind by the lane's own merge every time — so the refusal alone stopped every lane close. A
|
|
198
198
|
// `--ff-only` merge moves no file the dirty ledger conflicts with: git refuses it, untouched, when an
|
|
199
199
|
// incoming commit changes the ledger too, and only that case is still refused.
|
|
@@ -231,7 +231,7 @@ async function refuse_unsafe_flush(status_output: string): Promise<string> {
|
|
|
231
231
|
// **Its exit code is read rather than discarded**: `run` catches its own errors and returns `1`, so a
|
|
232
232
|
// checkout left on the flush branch would otherwise be reported as a completed flush.
|
|
233
233
|
//
|
|
234
|
-
// **The local default branch is fast-forwarded before it is checked out
|
|
234
|
+
// **The local default branch is fast-forwarded before it is checked out**.
|
|
235
235
|
// Lines appended while the pull request waited leave the ledger dirty, and git refuses to check out a
|
|
236
236
|
// default branch whose ledger differs from the flush branch's. Once the merge is in, the fast-forwarded
|
|
237
237
|
// default branch holds the same ledger the flush branch does, so the checkout carries those lines over.
|
|
@@ -266,9 +266,8 @@ async function push_and_open(branch_name: string): Promise<string> {
|
|
|
266
266
|
}
|
|
267
267
|
}
|
|
268
268
|
|
|
269
|
-
// **The side that created the branch is the side that rolls it back
|
|
270
|
-
//
|
|
271
|
-
// refusal the next run printed named two exits an agent cannot take. Nothing is stranded at this
|
|
269
|
+
// **The side that created the branch is the side that rolls it back**, so a commit rejected by the
|
|
270
|
+
// pre-commit hook does not leave the branch behind with nothing on it. Nothing is stranded at this
|
|
272
271
|
// point — the appended lines are still in the working tree, staged and uncommitted — so returning to
|
|
273
272
|
// the default branch and removing the branch loses none of them.
|
|
274
273
|
//
|
|
@@ -300,7 +299,7 @@ function rejection_message(
|
|
|
300
299
|
return roll_back_failure_message(branch_name, reason, roll_back_reason)
|
|
301
300
|
}
|
|
302
301
|
|
|
303
|
-
// **Every ledger path the status names is staged, not the one constant
|
|
302
|
+
// **Every ledger path the status names is staged, not the one constant**.
|
|
304
303
|
// After a migration the change is the new file together with the old one's deletion, and a commit
|
|
305
304
|
// holding only the first would leave the deletion behind as a change no later flush could tell apart
|
|
306
305
|
// from a fresh append.
|
|
@@ -342,8 +341,8 @@ async function open_pull_request(branch_name: string, default_branch: string): P
|
|
|
342
341
|
// at any more. The next flush would read `has_ledger_change` as false and report `clean`, which is
|
|
343
342
|
// the silent loss the refusals above exist to prevent. Left on the branch, the refusal fires.
|
|
344
343
|
//
|
|
345
|
-
// With auto-merge on, a failed wait
|
|
346
|
-
// the checks pass
|
|
344
|
+
// With auto-merge on, a failed wait does not strand the lines for good — GitHub still merges once
|
|
345
|
+
// the checks pass — but the checkout stays on the branch all the same,
|
|
347
346
|
// because only a merge this command has seen makes returning to the default branch safe.
|
|
348
347
|
async function land(
|
|
349
348
|
branch_name: string,
|
|
@@ -380,9 +379,9 @@ function broken_lines_message(broken: ReadonlyArray<BrokenLine>): string {
|
|
|
380
379
|
}
|
|
381
380
|
|
|
382
381
|
// **A malformed line is refused before a branch is cut, not after.** The ledger path was collected
|
|
383
|
-
// without a line ever being parsed
|
|
382
|
+
// without a line ever being parsed, so a broken append could ride a flush
|
|
384
383
|
// through; validating here keeps the committed ledger to its grammar. The migration and the parse are
|
|
385
|
-
// `observation-ledger-prepare.ts`'s, shared with the run's own commit
|
|
384
|
+
// `observation-ledger-prepare.ts`'s, shared with the run's own commit.
|
|
386
385
|
async function prepare_ledger(): Promise<void> {
|
|
387
386
|
const broken = await observation_ledger_prepare.prepare(process.cwd())
|
|
388
387
|
|
|
@@ -392,12 +391,12 @@ async function prepare_ledger(): Promise<void> {
|
|
|
392
391
|
// **Nothing pulls in front of the branch, and that is deliberate.** The ledger is dirty by
|
|
393
392
|
// definition at this point, so `git pull --ff-only` aborts on it in exactly the case a pull would
|
|
394
393
|
// have been for — an upstream flush that already advanced the ledger — and reports a failure about
|
|
395
|
-
// the wrong thing
|
|
396
|
-
// point is read from the remote first
|
|
397
|
-
// only where git can do it without touching the ledger
|
|
394
|
+
// the wrong thing. So the freshness of the start
|
|
395
|
+
// point is read from the remote first, and `catch_up_default` fast-forwards
|
|
396
|
+
// only where git can do it without touching the ledger: a default branch
|
|
398
397
|
// that predates another merged flush still stops here — before a branch is cut — rather than opening
|
|
399
398
|
// a pull request that cannot merge. An earlier flush pull request still open is checked for the same
|
|
400
|
-
// reason
|
|
399
|
+
// reason: a branch cut beside it conflicts with it at the ledger's tail.
|
|
401
400
|
async function flush(now: Date): Promise<string> {
|
|
402
401
|
const status_output = await git_command.status()
|
|
403
402
|
const default_branch = await refuse_unsafe_flush(status_output)
|
|
@@ -10,11 +10,15 @@
|
|
|
10
10
|
*/
|
|
11
11
|
import { readFileSync, writeFileSync } from 'node:fs'
|
|
12
12
|
import { fileURLToPath } from 'node:url'
|
|
13
|
-
import {
|
|
13
|
+
import { cli_flags } from '#scripts/lib/cli-flags'
|
|
14
14
|
import { overrides_snapshot_schema } from '#scripts/lib/schemas'
|
|
15
15
|
import { overrides_files } from './overrides-files'
|
|
16
16
|
import { overrides_check, type OverridesDiff } from './overrides-logic'
|
|
17
17
|
|
|
18
|
+
const ARGV_OFFSET = 2
|
|
19
|
+
const OPTIONS = { save: { type: 'boolean', default: false } } as const
|
|
20
|
+
const USAGE = cli_flags.usage_line(['--save'], 'overrides')
|
|
21
|
+
|
|
18
22
|
function is_file_not_found(error: unknown): boolean {
|
|
19
23
|
return error instanceof Error && 'code' in error && error.code === 'ENOENT'
|
|
20
24
|
}
|
|
@@ -70,15 +74,21 @@ function run_overrides_check(should_save: boolean): void {
|
|
|
70
74
|
console.info(`✔ overrides unchanged (${summary}).`)
|
|
71
75
|
}
|
|
72
76
|
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
77
|
+
// A line nobody can read is refused before the snapshot is read or written: a misspelled `--save` that
|
|
78
|
+
// fell through would compare against the record the caller meant to replace.
|
|
79
|
+
function refuse_usage(): never {
|
|
80
|
+
console.error(USAGE)
|
|
81
|
+
|
|
82
|
+
return process.exit(1)
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
function main(argv: ReadonlyArray<string>): void {
|
|
86
|
+
const values = cli_flags.values_of(argv, OPTIONS)
|
|
78
87
|
|
|
88
|
+
if (values === undefined) refuse_usage()
|
|
79
89
|
run_overrides_check(values.save)
|
|
80
90
|
}
|
|
81
91
|
|
|
82
|
-
if (process.argv[1] === fileURLToPath(import.meta.url)) main()
|
|
92
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) main(process.argv.slice(ARGV_OFFSET))
|
|
83
93
|
|
|
84
|
-
export { run_overrides_check }
|
|
94
|
+
export { run_overrides_check, main }
|
|
@@ -13,7 +13,7 @@ import { package_scout_format } from './package-scout-format'
|
|
|
13
13
|
|
|
14
14
|
// `josh pkg:scout <keywords> [--size <n>]` — before the Package-First tier decision, rank the
|
|
15
15
|
// candidate packages by measured metrics so "clearly best (Tier A)" and "genuine toss-up (Tier B)"
|
|
16
|
-
// are read off the output rather than judged
|
|
16
|
+
// are read off the output rather than judged.
|
|
17
17
|
//
|
|
18
18
|
// The registry answers in three reads: one search for the candidates, then per candidate a downloads
|
|
19
19
|
// point and the latest version metadata (bundled types, license, unpacked size). A per-candidate read
|
|
@@ -6,8 +6,8 @@ import {
|
|
|
6
6
|
} from './package-scout'
|
|
7
7
|
|
|
8
8
|
// The printed shape of `josh pkg:scout` — one line per candidate with each metric labelled, then a
|
|
9
|
-
// verdict line that names whether the choice is a Tier A pick or a Tier B question
|
|
10
|
-
//
|
|
9
|
+
// verdict line that names whether the choice is a Tier A pick or a Tier B question.
|
|
10
|
+
// Formatting is pure so the layout and the verdict wording are unit-tested
|
|
11
11
|
// without a registry.
|
|
12
12
|
|
|
13
13
|
// The blank shown for a metric the registry did not report — a fact absent, never a zero measured.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// The measured metrics behind `josh pkg:scout` — the ranking of package candidates and the near-tie
|
|
2
2
|
// verdict that turns the Package-First "clearly best (Tier A) / genuine toss-up (Tier B)" branch from
|
|
3
|
-
// an impression into a computed answer
|
|
3
|
+
// an impression into a computed answer.
|
|
4
4
|
//
|
|
5
5
|
// This module is the pure half: it takes candidates already gathered from the npm registry and
|
|
6
6
|
// answers two things — the order they rank in, and whether the top two are close enough that the
|
|
@@ -7,7 +7,7 @@ import type { StepResult } from './propagate-run'
|
|
|
7
7
|
// a failed spawn reports one exit code for all three. The run's report then appended "upgrade/sync
|
|
8
8
|
// changes left uncommitted" to that code, which names the *first* of the three: so a consumer whose
|
|
9
9
|
// pre-push hook refused the push was reported as a consumer whose sync never got committed, and the
|
|
10
|
-
// reader went looking at a sync that had worked
|
|
10
|
+
// reader went looking at a sync that had worked.
|
|
11
11
|
//
|
|
12
12
|
// **Nothing here changes whether a push is blocked.** A consumer's pre-push gate refusing a push is
|
|
13
13
|
// the gate doing its job, and the probes below are read-only. What is fixed is the sentence.
|
|
@@ -10,7 +10,7 @@ import { GIT_TIMEOUT_MS } from '#scripts/lib/timeouts'
|
|
|
10
10
|
// Propagation commits and pushes. A consumer with uncommitted work would have that work swept into
|
|
11
11
|
// the upgrade commit — `josh git` stages the whole tree — and a supplier repository that is behind
|
|
12
12
|
// its remote would propagate the *previous* release, which is already published and would report
|
|
13
|
-
// success
|
|
13
|
+
// success.
|
|
14
14
|
|
|
15
15
|
// The probes that talk to the remote get their own budget. Ten seconds is generous for a local
|
|
16
16
|
// `rev-parse` and tight for an ssh handshake, and a probe that times out answers "no" — which for
|
|
@@ -27,7 +27,7 @@ interface TreeState {
|
|
|
27
27
|
reason?: string
|
|
28
28
|
}
|
|
29
29
|
|
|
30
|
-
// **`cwd` alone does not say which repository this is about
|
|
30
|
+
// **`cwd` alone does not say which repository this is about**. `GIT_DIR` and
|
|
31
31
|
// `GIT_WORK_TREE` beat it outright, and git exports both to every hook it runs — so under
|
|
32
32
|
// `pnpm josh git`'s pre-push hook every probe below silently answered about the checkout the hook was
|
|
33
33
|
// firing in rather than the path it was handed. The visible cost was in the unit suite, where
|
|
@@ -42,8 +42,8 @@ interface TreeState {
|
|
|
42
42
|
// because every call below already passes the path this way and a second spelling of the same intent
|
|
43
43
|
// is one more thing to keep in step.
|
|
44
44
|
//
|
|
45
|
-
// **The list itself
|
|
46
|
-
//
|
|
45
|
+
// **The list itself lives in `#scripts/git/git-location-environment`**: three consumers clear the
|
|
46
|
+
// same names, and a list kept
|
|
47
47
|
// in one of them is a list the other two drift away from. It widened there past `GIT_DIR` /
|
|
48
48
|
// `GIT_WORK_TREE` to the index and object-store variables, which redirect a *write* rather than a
|
|
49
49
|
// lookup — inert for the read-only probes below, and required by the fixture that commits.
|
|
@@ -116,8 +116,8 @@ function commit_ahead(repository_path: string, default_name: string): string | u
|
|
|
116
116
|
// remote-tracking ref: a push that was refused leaves no such ref behind, and neither does a branch
|
|
117
117
|
// that was never pushed at all, so the ref cannot tell the two apart.
|
|
118
118
|
//
|
|
119
|
-
// **The arguments come from `git-ls-remote.ts`, which anchors the pattern at `refs/heads
|
|
120
|
-
//
|
|
119
|
+
// **The arguments come from `git-ls-remote.ts`, which anchors the pattern at `refs/heads/`**.
|
|
120
|
+
// Built here from the bare name, the query answered for any branch whose
|
|
121
121
|
// ref ends in it — so a lane pushed as `wip/1641-lane` reported `1641-lane` as already on origin,
|
|
122
122
|
// and propagation classified an unpushed branch as pushed.
|
|
123
123
|
function has_remote_branch(repository_path: string, branch: string): boolean {
|
|
@@ -130,7 +130,7 @@ function has_remote_branch(repository_path: string, branch: string): boolean {
|
|
|
130
130
|
// --git-path` does not. Without this the classification would name a hook on the strength of a dry
|
|
131
131
|
// run alone, and **any** push failure that has cleared by the time the probe runs satisfies that: a
|
|
132
132
|
// dropped ssh connection, a refreshed token, one 500 from GitHub. Naming a hook that does not exist
|
|
133
|
-
// is the same misattribution
|
|
133
|
+
// is the same misattribution as blaming the wrong push sub-step, pointed the other way.
|
|
134
134
|
function hooks_directory(repository_path: string): string | undefined {
|
|
135
135
|
const configured = run_git(repository_path, ['config', '--get', 'core.hooksPath'])
|
|
136
136
|
if (configured !== undefined && configured !== '') return configured
|
|
@@ -3,7 +3,7 @@ import { propagate_run, type RunStep, type StepResult } from './propagate-run'
|
|
|
3
3
|
import { propagate_steps, type Release, type ReleasePlan } from './propagate-steps'
|
|
4
4
|
import { propagate_targets, type Manifest, type PropagateTarget } from './propagate-targets'
|
|
5
5
|
|
|
6
|
-
// What one `josh propagate` run carries, decided from the repository it runs in
|
|
6
|
+
// What one `josh propagate` run carries, decided from the repository it runs in.
|
|
7
7
|
//
|
|
8
8
|
// The supplier is kit or any toolkit built on it — app-kit, game-kit — and a toolkit's propagation
|
|
9
9
|
// carries the base packages under it too, at the versions that toolkit itself has installed and was
|
|
@@ -77,7 +77,7 @@ function pin_installed(project_root: string, release: Release): Release | undefi
|
|
|
77
77
|
}
|
|
78
78
|
|
|
79
79
|
// Why a declared base toolkit would fall out of the plan, naming it — either way `josh adopt` refuses
|
|
80
|
-
// one for
|
|
80
|
+
// one for. A base left out is not merely left behind: every consumer that
|
|
81
81
|
// installs it would then read it as a toolkit above this one and be skipped.
|
|
82
82
|
function incomplete_cause(project_root: string): string | undefined {
|
|
83
83
|
const misplaced = adopt_toolkits.misplaced_toolkits(project_root)
|
|
@@ -7,9 +7,8 @@ import { with_page_size } from '#scripts/version/version-remote'
|
|
|
7
7
|
//
|
|
8
8
|
// A merge is not a publish: kit's auto-tag and publish workflows run after the merge commit lands,
|
|
9
9
|
// so a consumer told to upgrade the instant the PR merged resolves the previous release. The wait is
|
|
10
|
-
// implemented once here because
|
|
11
|
-
// condition — two implementations would drift, and the looser one would decide
|
|
12
|
-
// (joshuafolkken/kit#863).
|
|
10
|
+
// implemented once here because resolving a cross-repository epic child waits on the same
|
|
11
|
+
// condition — two implementations would drift, and the looser one would decide.
|
|
13
12
|
|
|
14
13
|
const VERSIONS_PAGE_SIZE = 100
|
|
15
14
|
const NAMES_JQ = '[.[] | .name]'
|
|
@@ -5,11 +5,11 @@ import type { PropagateTarget } from './propagate-targets'
|
|
|
5
5
|
//
|
|
6
6
|
// One consumer's failure never stops another: the whole point of the command is to leave the run
|
|
7
7
|
// knowing which consumers took the release and which did not, and a run that aborts on the first
|
|
8
|
-
// failure answers that for a prefix of them
|
|
8
|
+
// failure answers that for a prefix of them.
|
|
9
9
|
|
|
10
10
|
// The steps, in order, that carry a release into one consumer. `josh` here is the consumer's own
|
|
11
11
|
// installed CLI, run from the consumer's directory — which is what keeps kit's self-sync guard
|
|
12
|
-
//
|
|
12
|
+
// out of the way: the sync runs in a consumer project, where it belongs.
|
|
13
13
|
const STEP_PRECHECK = 'working tree check'
|
|
14
14
|
const STEP_UPGRADE = 'josh vu'
|
|
15
15
|
const STEP_SYNC = 'josh sync'
|
|
@@ -44,8 +44,7 @@ interface StepResult {
|
|
|
44
44
|
// file, for instance. The sequence ends here as a skip rather than opening an empty pull request.
|
|
45
45
|
is_complete?: boolean
|
|
46
46
|
// What this failure actually left in the consumer, as the failing step measured it. Only the
|
|
47
|
-
// steps that can probe set it; for the rest the standing note below is what they always leave
|
|
48
|
-
// (joshuafolkken/kit#1417).
|
|
47
|
+
// steps that can probe set it; for the rest the standing note below is what they always leave.
|
|
49
48
|
leftover?: string
|
|
50
49
|
}
|
|
51
50
|
|
|
@@ -89,9 +88,8 @@ function has_leftover_changes(steps: ReadonlyArray<StepResult>): boolean {
|
|
|
89
88
|
|
|
90
89
|
// What to say the failure left behind. A step that measured it wins; the note above stands in only
|
|
91
90
|
// where none did, which is every step before the commit — and there it is accurate, since nothing
|
|
92
|
-
// has committed yet.
|
|
93
|
-
//
|
|
94
|
-
// pre-push hook was reported as changes that were never committed.
|
|
91
|
+
// has committed yet. Appended to *every* failure after the upgrade, it would report a push refused
|
|
92
|
+
// by the consumer's pre-push hook as changes that were never committed.
|
|
95
93
|
function leftover_of(result: StepResult, steps: ReadonlyArray<StepResult>): string | undefined {
|
|
96
94
|
if (!has_leftover_changes(steps)) return undefined
|
|
97
95
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { propagate_run } from './propagate-run'
|
|
2
2
|
import type { PropagateTarget, TargetState } from './propagate-targets'
|
|
3
3
|
|
|
4
|
-
// Narrowing a run to the one consumer `--target` names
|
|
4
|
+
// Narrowing a run to the one consumer `--target` names.
|
|
5
5
|
//
|
|
6
6
|
// Every other consumer stays in the list as `not_selected`, so the report still accounts for each
|
|
7
7
|
// repository considered and says why it was left alone. A name that matches nothing — or matches a
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { pr_classification } from '#scripts/ci/pr-classification'
|
|
2
2
|
import { git_gh_exec } from '#scripts/gh/git-gh-exec'
|
|
3
3
|
import { git_gh_issue_write } from '#scripts/gh/git-gh-issue-write'
|
|
4
|
+
import { issue_cite } from '#scripts/issue/issue-cite'
|
|
4
5
|
import { OTHER_CHANGE_LABEL } from '#scripts/issue/issue-labels'
|
|
5
6
|
import { GATE_COMMAND } from '#scripts/josh/josh-command-types'
|
|
6
7
|
import { error_text } from '#scripts/lib/error-message'
|
|
@@ -18,11 +19,11 @@ import type { PropagateTarget } from './propagate-targets'
|
|
|
18
19
|
// Kept out of the command module because two of the steps are not plain spawns: the pre-check is a
|
|
19
20
|
// decision made from git probes, and the pull-request step needs the issue number the step before it
|
|
20
21
|
// created. A closure carries that number instead of module-level state, so a run is self-contained
|
|
21
|
-
// and the sequencing stays testable
|
|
22
|
+
// and the sequencing stays testable.
|
|
22
23
|
|
|
23
24
|
const SUCCESS_EXIT_CODE = 0
|
|
24
25
|
// The consumer-side gate. `josh gate` is the same command the AI documents require of a person
|
|
25
|
-
//
|
|
26
|
+
// — running the four checks concurrently and reporting every failure in one
|
|
26
27
|
// pass — so the chain is not repeated here. It resolves in the consumer's directory, which by this
|
|
27
28
|
// point has already been upgraded to the version being propagated, so the command is present.
|
|
28
29
|
const VERIFY_SCRIPT = `pnpm josh ${GATE_COMMAND}`
|
|
@@ -37,12 +38,11 @@ const STEP_COMMANDS: Readonly<Record<string, ReadonlyArray<string>>> = {
|
|
|
37
38
|
|
|
38
39
|
// kit's own CLI name. The sync is spelled through the *toolkit's* bin rather than hardcoded, because
|
|
39
40
|
// `@joshuafolkken/app-kit` syncs with `josh-app` and `@joshuafolkken/game-kit` with `josh-game`; a
|
|
40
|
-
// run that synced only `josh` would leave the other toolkit's managed files behind
|
|
41
|
-
// (joshuafolkken/kit#1085).
|
|
41
|
+
// run that synced only `josh` would leave the other toolkit's managed files behind.
|
|
42
42
|
const JOSH_BIN = 'josh'
|
|
43
43
|
|
|
44
44
|
// `pnpm <bin>` resolves the target's own installed CLI, never this checkout — which is what keeps
|
|
45
|
-
// the sync a consumer-side sync and leaves kit's self-sync guard
|
|
45
|
+
// the sync a consumer-side sync and leaves kit's self-sync guard satisfied.
|
|
46
46
|
function sync_command(bin_name: string): ReadonlyArray<string> {
|
|
47
47
|
return ['pnpm', bin_name, 'sync']
|
|
48
48
|
}
|
|
@@ -67,9 +67,9 @@ const PROPAGATE_ORIGIN =
|
|
|
67
67
|
'Opened by `josh propagate` from the supplier repository after the release was published.'
|
|
68
68
|
const RUN_NOTE =
|
|
69
69
|
'The upgrade, the managed-file sync and the verification gate have already run here.'
|
|
70
|
-
// `josh git` refuses to open a pull request for an issue that declares no release classification
|
|
71
|
-
//
|
|
72
|
-
// the consumer's own, which is what `other-change` covers
|
|
70
|
+
// `josh git` refuses to open a pull request for an issue that declares no release classification,
|
|
71
|
+
// so the upgrade issue declares one. A dependency upgrade changes no code of
|
|
72
|
+
// the consumer's own, which is what `other-change` covers.
|
|
73
73
|
const UPGRADE_CLASSIFICATION = OTHER_CHANGE_LABEL
|
|
74
74
|
const EMPTY_PLAN_TITLE = 'Upgrade the installed toolkits'
|
|
75
75
|
const LAST_SEPARATOR = ' and '
|
|
@@ -91,8 +91,8 @@ function release_names(releases: ReadonlyArray<Release>): string {
|
|
|
91
91
|
}
|
|
92
92
|
|
|
93
93
|
// Each release with its own version, for a plan whose releases disagree on one — a toolkit's
|
|
94
|
-
// propagation carries the base packages at the versions that toolkit was verified with
|
|
95
|
-
//
|
|
94
|
+
// propagation carries the base packages at the versions that toolkit was verified with,
|
|
95
|
+
// so one shared "to <version>" would name a version most of them are not.
|
|
96
96
|
function versioned_names(releases: ReadonlyArray<Release>): string {
|
|
97
97
|
const named = releases.map((release) => ({
|
|
98
98
|
...release,
|
|
@@ -181,9 +181,8 @@ function spawn_step(
|
|
|
181
181
|
}
|
|
182
182
|
|
|
183
183
|
// The same, keeping what the command printed. Only the pull-request step uses it: a consumer's
|
|
184
|
-
// pre-push hook names the check that stopped it in its own last lines, and
|
|
185
|
-
//
|
|
186
|
-
// three sub-steps with, and attributed it to the wrong one.
|
|
184
|
+
// pre-push hook names the check that stopped it in its own last lines, and without them
|
|
185
|
+
// the report has one exit code to attribute three sub-steps with, and can blame the wrong one.
|
|
187
186
|
//
|
|
188
187
|
// **This step's output is replayed when it finishes rather than printed as it runs**, and that is
|
|
189
188
|
// the price of keeping it. A synchronous spawn gives one target per file descriptor, so `['inherit',
|
|
@@ -233,10 +232,10 @@ function precheck_step(target: PropagateTarget, step: string): StepResult {
|
|
|
233
232
|
// rather than a branchless pull request that cannot be opened at all.
|
|
234
233
|
//
|
|
235
234
|
// It posts to REST instead of running `gh issue create`: that command goes through GraphQL, which a
|
|
236
|
-
// cloud session is answered 403 for, while the REST endpoint is served normally
|
|
237
|
-
//
|
|
235
|
+
// cloud session is answered 403 for, while the REST endpoint is served normally.
|
|
236
|
+
// This was the last `gh <noun> <verb>` spawn in kit's own code, and it was
|
|
238
237
|
// missed by that epic's survey because the survey counted `exec_gh_command` call sites and this one
|
|
239
|
-
// spawned gh directly
|
|
238
|
+
// spawned gh directly.
|
|
240
239
|
//
|
|
241
240
|
// The request is the one every issue creation builds, and the spawn is the synchronous twin of the
|
|
242
241
|
// one the asynchronous writers use — so no second write layer exists to disagree with the first.
|
|
@@ -246,7 +245,7 @@ function precheck_step(target: PropagateTarget, step: string): StepResult {
|
|
|
246
245
|
// gh's own output is the only thing that distinguishes a missing scope from disabled issues from a
|
|
247
246
|
// repository that does not exist. Reporting `could not open an issue` alone hides all three, so the
|
|
248
247
|
// whole message is kept — `to_gh_error` puts the stderr summary and the JSON body REST writes to
|
|
249
|
-
// stdout on separate lines
|
|
248
|
+
// stdout on separate lines, and both carry the reason.
|
|
250
249
|
//
|
|
251
250
|
// **It is folded back onto one line here.** The run's report is one line per consumer, and
|
|
252
251
|
// `failure_reason` appends the "changes left uncommitted" warning to the end of this text — so a
|
|
@@ -319,7 +318,7 @@ function issue_step(
|
|
|
319
318
|
|
|
320
319
|
// Put the consumer back on its default branch. `josh git` leaves it on the feature branch, and the
|
|
321
320
|
// next run's pre-check would refuse it for that — the consumer would silently stop receiving
|
|
322
|
-
// releases
|
|
321
|
+
// releases.
|
|
323
322
|
function return_step(target: PropagateTarget, step: string): StepResult {
|
|
324
323
|
if (propagate_git.return_to_default_branch(target.path)) return { step, is_ok: true }
|
|
325
324
|
|
|
@@ -335,7 +334,7 @@ function pull_request_step(
|
|
|
335
334
|
): StepResult {
|
|
336
335
|
const number = issue_numbers.get(target.repo)
|
|
337
336
|
if (number === undefined) return { step, is_ok: false, detail: 'no issue number' }
|
|
338
|
-
const argument = `${plan_title(plan.releases)}
|
|
337
|
+
const argument = `${plan_title(plan.releases)} ${issue_cite.plain(number)}`
|
|
339
338
|
const outcome = spawn_captured(target, step, ['pnpm', 'josh', 'git', '-y', argument])
|
|
340
339
|
if (outcome.result.is_ok) return outcome.result
|
|
341
340
|
|
|
@@ -352,7 +351,7 @@ interface Release {
|
|
|
352
351
|
|
|
353
352
|
// What one run carries: the releases, and the sentence naming the command that opened the issue.
|
|
354
353
|
// `josh propagate` always passes exactly one release; `josh adopt` passes every toolkit installed in
|
|
355
|
-
// the repository it runs in
|
|
354
|
+
// the repository it runs in. Only the upgrade and the sync repeat per
|
|
356
355
|
// release — the pre-check, the verification gate, the issue, the pull request and the return to the
|
|
357
356
|
// default branch happen once, which is why the step order itself is unchanged.
|
|
358
357
|
interface ReleasePlan {
|