@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
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import { existsSync, readFileSync } from 'node:fs'
|
|
2
2
|
import path from 'node:path'
|
|
3
3
|
import type { RepoMap } from '#scripts/discovery/repo-map-logic'
|
|
4
|
+
import { json_value } from '#scripts/lib/json-value'
|
|
4
5
|
import { z } from 'zod'
|
|
5
6
|
|
|
6
7
|
// Deciding which repositories a published release should be carried into.
|
|
7
8
|
//
|
|
8
|
-
// The candidate set is
|
|
9
|
+
// The candidate set is the repository discovery map, so the owner restriction is inherited
|
|
9
10
|
// rather than restated: propagation writes — `josh vu`, `josh sync`, a commit, a pull request — and
|
|
10
11
|
// a write aimed at somebody else's repository is worse than a read aimed at one. Nothing here
|
|
11
12
|
// re-implements discovery.
|
|
@@ -13,16 +14,15 @@ import { z } from 'zod'
|
|
|
13
14
|
// Which candidates are targets is read from the candidate itself: a repository is downstream when
|
|
14
15
|
// its manifest declares a dependency on this package. That is a fact about the checkout in front of
|
|
15
16
|
// us rather than a roster, so a new consumer needs no edit here — and it covers a consumer that is
|
|
16
|
-
// not a published package at all, which a list of downstream package names cannot
|
|
17
|
-
// (joshuafolkken/kit#863).
|
|
17
|
+
// not a published package at all, which a list of downstream package names cannot.
|
|
18
18
|
|
|
19
19
|
const MANIFEST_NAME = 'package.json'
|
|
20
20
|
const NODE_MODULES = 'node_modules'
|
|
21
21
|
|
|
22
22
|
// Why a candidate is not going to be processed, or that it is. `not_selected` is the one state set
|
|
23
|
-
// after classification: a candidate `--target` left out
|
|
23
|
+
// after classification: a candidate `--target` left out. `carried_above` is
|
|
24
24
|
// the other: a consumer that installs a toolkit above the supplier, which that toolkit's own
|
|
25
|
-
// propagation delivers instead
|
|
25
|
+
// propagation delivers instead.
|
|
26
26
|
type TargetState =
|
|
27
27
|
| 'ready'
|
|
28
28
|
| 'up_to_date'
|
|
@@ -68,11 +68,7 @@ function read_manifest(repository_path: string): Manifest | undefined {
|
|
|
68
68
|
if (!existsSync(manifest_path)) return undefined
|
|
69
69
|
|
|
70
70
|
try {
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
const result = manifest_schema.safeParse(parsed)
|
|
74
|
-
|
|
75
|
-
return result.success ? result.data : undefined
|
|
71
|
+
return json_value.parse_with(readFileSync(manifest_path, 'utf8'), manifest_schema)
|
|
76
72
|
} catch {
|
|
77
73
|
return undefined
|
|
78
74
|
}
|
|
@@ -15,7 +15,7 @@ import { propagate_steps, type ReleasePlan } from './propagate-steps'
|
|
|
15
15
|
import { propagate_targets, type PropagateTarget } from './propagate-targets'
|
|
16
16
|
|
|
17
17
|
// `josh propagate` — carry the release this repository just published into every consumer checked
|
|
18
|
-
// out next to it
|
|
18
|
+
// out next to it.
|
|
19
19
|
|
|
20
20
|
const SUCCESS_EXIT_CODE = 0
|
|
21
21
|
const FAILURE_EXIT_CODE = 1
|
|
@@ -32,7 +32,7 @@ const UNTOUCHED_NOTE = 'No consumer was touched.'
|
|
|
32
32
|
interface RunOptions {
|
|
33
33
|
is_dry_run: boolean
|
|
34
34
|
is_publish_wait_skipped: boolean
|
|
35
|
-
// The one consumer to propagate to, when `--target` narrowed the run
|
|
35
|
+
// The one consumer to propagate to, when `--target` narrowed the run.
|
|
36
36
|
target?: string
|
|
37
37
|
// The usage message, when the arguments were not accepted. Carried alongside rather than returned
|
|
38
38
|
// instead, so the caller has one shape to branch on.
|
|
@@ -87,11 +87,11 @@ function parse_options(argv: ReadonlyArray<string>): RunOptions {
|
|
|
87
87
|
}
|
|
88
88
|
|
|
89
89
|
// Propagation runs from the supplier's own repository, and only there — kit's, or a toolkit's built
|
|
90
|
-
// on it
|
|
90
|
+
// on it.
|
|
91
91
|
//
|
|
92
92
|
// This is also what decides who propagates when several sessions are running: in the
|
|
93
93
|
// per-repository concurrency model there is one session per checkout, so the session standing in
|
|
94
|
-
// the supplier repository is the one that can run this command
|
|
94
|
+
// the supplier repository is the one that can run this command. It is a
|
|
95
95
|
// convention enforced at the boundary, not a lock — two checkouts of the supplier would both pass,
|
|
96
96
|
// which is why each consumer is additionally refused unless its working tree is clean.
|
|
97
97
|
function refuse_outside_source_repository(project_root: string): string | undefined {
|
|
@@ -192,7 +192,7 @@ interface RunPlan {
|
|
|
192
192
|
|
|
193
193
|
// The consumers this run will consider, narrowed by `--target`. Resolved before the publish wait so
|
|
194
194
|
// a mistyped name fails at once instead of after minutes of polling the registry. A consumer that
|
|
195
|
-
// installs a toolkit above the supplier is left to that toolkit's propagation
|
|
195
|
+
// installs a toolkit above the supplier is left to that toolkit's propagation.
|
|
196
196
|
function resolve_run_targets(
|
|
197
197
|
releases: ReleasePlan,
|
|
198
198
|
version: string,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import path from 'node:path'
|
|
2
2
|
import { file_reader } from '#scripts/lib/read-file'
|
|
3
3
|
|
|
4
|
-
// The scope expansion `prompts/refactoring.md` §4.3 used to describe in prose
|
|
4
|
+
// The scope expansion `prompts/refactoring.md` §4.3 used to describe in prose:
|
|
5
5
|
// from the seed files, follow imports both ways — the files a seed imports and the files that import a
|
|
6
6
|
// seed — for up to three stages, stopping as soon as a stage finds nothing new. Walking the import
|
|
7
7
|
// graph is exactly computable, so it is computed here rather than read and traced by hand.
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import path from 'node:path'
|
|
2
2
|
import { find_local_bin_upwards } from '#scripts/build/local-bin'
|
|
3
|
+
import { json_value } from '#scripts/lib/json-value'
|
|
3
4
|
import { LINT_TIMEOUT_MS } from '#scripts/lib/timeouts'
|
|
4
5
|
import { execa } from 'execa'
|
|
5
6
|
import { z } from 'zod'
|
|
6
7
|
|
|
7
|
-
// The mechanical half of `prompts/refactoring.md
|
|
8
|
+
// The mechanical half of `prompts/refactoring.md`: the refactoring
|
|
8
9
|
// priorities ESLint already decides. Rather than read the checklist and grep by hand, the project's
|
|
9
10
|
// own eslint is asked in JSON and its findings are bucketed into the checklist's items.
|
|
10
11
|
//
|
|
@@ -186,16 +187,9 @@ function eslint_command(root: string, files: ReadonlyArray<string>): ReadonlyArr
|
|
|
186
187
|
}
|
|
187
188
|
|
|
188
189
|
// `undefined` means the run did not produce parseable eslint JSON — a failure, kept distinct from a
|
|
189
|
-
// valid empty array (a clean scope), so a scan that could not run is never reported as `clear
|
|
190
|
-
// (joshuafolkken/kit#2180).
|
|
190
|
+
// valid empty array (a clean scope), so a scan that could not run is never reported as `clear`.
|
|
191
191
|
function parse_results(raw: string | undefined = 'null'): Array<LintResult> | undefined {
|
|
192
|
-
|
|
193
|
-
const parsed = results_schema.safeParse(JSON.parse(raw))
|
|
194
|
-
|
|
195
|
-
return parsed.success ? parsed.data : undefined
|
|
196
|
-
} catch {
|
|
197
|
-
return undefined
|
|
198
|
-
}
|
|
192
|
+
return json_value.parse_with(raw, results_schema)
|
|
199
193
|
}
|
|
200
194
|
|
|
201
195
|
// The project's own eslint over the scope, in JSON. `reject: false` because eslint exits non-zero when
|
|
@@ -3,7 +3,7 @@ import { fileURLToPath } from 'node:url'
|
|
|
3
3
|
import { refactor_scan } from './refactor-scan'
|
|
4
4
|
|
|
5
5
|
// The `josh refactor:scan` entry point. It takes no arguments: the scope is the changed files, or
|
|
6
|
-
// `scripts/` when nothing changed, decided the same way for every run
|
|
6
|
+
// `scripts/` when nothing changed, decided the same way for every run.
|
|
7
7
|
|
|
8
8
|
if (process.argv[1] === fileURLToPath(import.meta.url)) {
|
|
9
9
|
process.exitCode = await refactor_scan.run_scan()
|
|
@@ -5,7 +5,7 @@ import { refactor_lint, type CategoryResult } from './refactor-lint'
|
|
|
5
5
|
import { refactor_targets } from './refactor-targets'
|
|
6
6
|
|
|
7
7
|
// `josh refactor:scan` — the command `prompts/refactoring.md` §4.1–§4.3 now point to instead of
|
|
8
|
-
// describing the search by hand
|
|
8
|
+
// describing the search by hand. It selects the target files, expands the
|
|
9
9
|
// scope along the import graph, asks the project's own eslint which refactoring candidates the scope
|
|
10
10
|
// holds, and answers whether any high- or medium-priority candidate remains.
|
|
11
11
|
//
|
|
@@ -16,7 +16,7 @@ import { refactor_targets } from './refactor-targets'
|
|
|
16
16
|
|
|
17
17
|
// The convergence vocabulary. `clear` is what §4.3's self-reported "no high- or medium-priority
|
|
18
18
|
// candidate left" loop exit becomes once a command answers it: a token a caller can read, not a claim.
|
|
19
|
-
// `error` is the third answer
|
|
19
|
+
// `error` is the third answer: the eslint run itself did not complete, so the
|
|
20
20
|
// scope's state is unknown — kept distinct from `clear` so a failed scan is never read as converged.
|
|
21
21
|
const CLEAR = 'clear'
|
|
22
22
|
const CANDIDATES = 'candidates'
|
|
@@ -4,7 +4,7 @@ import { changed_paths } from '#scripts/git/changed-paths'
|
|
|
4
4
|
import { line_targets } from '#scripts/lines/line-targets'
|
|
5
5
|
|
|
6
6
|
// The target-file selection of `josh refactor:scan` — the priority `prompts/refactoring.md` §4.1
|
|
7
|
-
// used to spell out in prose
|
|
7
|
+
// used to spell out in prose. The scope is the same reading every scoped
|
|
8
8
|
// command decides from — the branch diff plus the untracked files (`changed-paths.ts`) — and only
|
|
9
9
|
// when that is empty does it fall back to `scripts/`, so a run on a clean `main` still has something
|
|
10
10
|
// to scan rather than reporting nothing.
|
|
@@ -1,8 +1,14 @@
|
|
|
1
1
|
import { fileURLToPath } from 'node:url'
|
|
2
2
|
import { git_spawn_sync } from '#scripts/git/git-spawn-sync'
|
|
3
|
+
import { cli_flags } from '#scripts/lib/cli-flags'
|
|
3
4
|
import { github_release } from './github-release'
|
|
4
5
|
import { github_release_environment } from './github-release-environment'
|
|
5
6
|
|
|
7
|
+
const KNOWN_FLAGS: ReadonlyArray<string> = []
|
|
8
|
+
const COMMAND_NAME = 'release:github'
|
|
9
|
+
const ARGUMENT_START = 2
|
|
10
|
+
const SUCCESS_EXIT_CODE = 0
|
|
11
|
+
|
|
6
12
|
// A release published without the tag list would pick its previous tag from nothing, so a failed
|
|
7
13
|
// `git tag` stops the run rather than reading as "no tags".
|
|
8
14
|
function local_tags(): Array<string> {
|
|
@@ -12,13 +18,29 @@ function local_tags(): Array<string> {
|
|
|
12
18
|
return output.split('\n')
|
|
13
19
|
}
|
|
14
20
|
|
|
15
|
-
|
|
21
|
+
// **No argument reaches the publish**. The command reads only the
|
|
22
|
+
// environment, so a `--help` it ignored would create a real GitHub Release; a help request prints
|
|
23
|
+
// the usage and any other argument is refused, both before the environment is read.
|
|
24
|
+
async function run_argv(argv: ReadonlyArray<string>): Promise<number> {
|
|
25
|
+
const answer = cli_flags.answer_help_or_unknown(
|
|
26
|
+
argv.slice(ARGUMENT_START),
|
|
27
|
+
KNOWN_FLAGS,
|
|
28
|
+
COMMAND_NAME,
|
|
29
|
+
)
|
|
30
|
+
if (answer !== undefined) return answer
|
|
31
|
+
|
|
16
32
|
const { token, tag, settings } = github_release_environment.read_release_input(process.env)
|
|
17
33
|
|
|
18
34
|
console.info(await github_release.publish(fetch, token, tag, { ...settings, tags: local_tags() }))
|
|
35
|
+
|
|
36
|
+
return SUCCESS_EXIT_CODE
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
async function main(argv: ReadonlyArray<string>): Promise<void> {
|
|
40
|
+
process.exitCode = await run_argv(argv)
|
|
19
41
|
}
|
|
20
42
|
|
|
21
|
-
if (process.argv[1] === fileURLToPath(import.meta.url)) await main()
|
|
43
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv)
|
|
22
44
|
|
|
23
|
-
const github_release_cli = { local_tags }
|
|
45
|
+
const github_release_cli = { local_tags, run_argv }
|
|
24
46
|
export { github_release_cli }
|
|
@@ -38,6 +38,7 @@ function read_release_input(environment: Environment): ReleaseInput {
|
|
|
38
38
|
workflow: optional(environment['RELEASE_WORKFLOW']),
|
|
39
39
|
jobs: job_names(environment['RELEASE_JOBS']),
|
|
40
40
|
await_publish: environment['RELEASE_AWAIT_PUBLISH'] === 'true',
|
|
41
|
+
release_run_workflow: optional(environment['RELEASE_RUN_WORKFLOW']),
|
|
41
42
|
},
|
|
42
43
|
}
|
|
43
44
|
}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { z } from 'zod'
|
|
2
|
+
|
|
3
|
+
// A job skipped by its `if:` (or neutral) belongs to a run that succeeded; counting it would skip a
|
|
4
|
+
// lower tag whose release is still on its way.
|
|
5
|
+
const FAILED_CONCLUSIONS = new Set(['failure', 'cancelled', 'timed_out', 'startup_failure'])
|
|
6
|
+
const RELEASE_RUN_TITLE = 'GitHub Release '
|
|
7
|
+
const RUN_SCHEMA = z.object({
|
|
8
|
+
id: z.number(),
|
|
9
|
+
display_title: z.string(),
|
|
10
|
+
status: z.string().optional(),
|
|
11
|
+
conclusion: z.string().nullable().optional(),
|
|
12
|
+
})
|
|
13
|
+
const JOB_SCHEMA = z.object({
|
|
14
|
+
name: z.string(),
|
|
15
|
+
status: z.string(),
|
|
16
|
+
conclusion: z.string().nullable(),
|
|
17
|
+
})
|
|
18
|
+
const RUNS_SCHEMA = z.object({ workflow_runs: z.array(RUN_SCHEMA) })
|
|
19
|
+
const JOBS_SCHEMA = z.object({ jobs: z.array(JOB_SCHEMA) })
|
|
20
|
+
|
|
21
|
+
type Run = z.infer<typeof RUN_SCHEMA>
|
|
22
|
+
type PollState = 'ready' | 'failed' | 'pending'
|
|
23
|
+
|
|
24
|
+
// `read` answers a GET on a repository API path. `workflow` is the publish workflow and `jobs` the
|
|
25
|
+
// jobs in it whose failure counts (empty: every job). `release_run_workflow` is the workflow that
|
|
26
|
+
// creates a tag's release — the publish workflow itself when its run creates the release.
|
|
27
|
+
interface RunSource {
|
|
28
|
+
read: (path: string) => Promise<unknown>
|
|
29
|
+
workflow: string | undefined
|
|
30
|
+
jobs: ReadonlyArray<string>
|
|
31
|
+
release_run_workflow: string | undefined
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
function is_failed_job(job: z.infer<typeof JOB_SCHEMA>, names: ReadonlyArray<string>): boolean {
|
|
35
|
+
if (job.status !== 'completed' || !FAILED_CONCLUSIONS.has(job.conclusion ?? '')) return false
|
|
36
|
+
if (names.length === 0) return true
|
|
37
|
+
|
|
38
|
+
return names.some((name) => job.name === name || job.name.startsWith(`${name} /`))
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
async function list_runs(source: RunSource, workflow_name: string): Promise<ReadonlyArray<Run>> {
|
|
42
|
+
const workflow = encodeURIComponent(workflow_name)
|
|
43
|
+
|
|
44
|
+
return RUNS_SCHEMA.parse(await source.read(`/actions/workflows/${workflow}/runs?per_page=100`))
|
|
45
|
+
.workflow_runs
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
async function find_run(
|
|
49
|
+
source: RunSource,
|
|
50
|
+
workflow_name: string,
|
|
51
|
+
title: string,
|
|
52
|
+
): Promise<Run | undefined> {
|
|
53
|
+
const runs = await list_runs(source, workflow_name)
|
|
54
|
+
|
|
55
|
+
return runs.find((item) => item.display_title === title)
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
async function has_failed_job(source: RunSource, run_id: number): Promise<boolean> {
|
|
59
|
+
const { jobs } = JOBS_SCHEMA.parse(
|
|
60
|
+
await source.read(`/actions/runs/${String(run_id)}/jobs?per_page=100`),
|
|
61
|
+
)
|
|
62
|
+
|
|
63
|
+
return jobs.some((job) => is_failed_job(job, source.jobs))
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// A run started before its title named the tag may be at work on any tag.
|
|
67
|
+
function may_release(run: Run, tag: string): boolean {
|
|
68
|
+
if (run.status === 'completed') return false
|
|
69
|
+
|
|
70
|
+
return (
|
|
71
|
+
run.display_title === `${RELEASE_RUN_TITLE}${tag}` ||
|
|
72
|
+
!run.display_title.startsWith(RELEASE_RUN_TITLE)
|
|
73
|
+
)
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// Unset, nothing tells that a release is over, so the lower tag is waited for.
|
|
77
|
+
async function is_release_over(source: RunSource, tag: string): Promise<boolean> {
|
|
78
|
+
const workflow = source.release_run_workflow
|
|
79
|
+
if (workflow === undefined) return false
|
|
80
|
+
if (workflow === source.workflow) return true
|
|
81
|
+
|
|
82
|
+
const runs = await list_runs(source, workflow)
|
|
83
|
+
|
|
84
|
+
return runs.every((run) => !may_release(run, tag))
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// A lower tag whose publication failed, or finished while no release run is left at work on it,
|
|
88
|
+
// never gains a release, so waiting on it would hold every later one.
|
|
89
|
+
async function is_release_lost(source: RunSource, tag: string): Promise<boolean> {
|
|
90
|
+
if (source.workflow === undefined) return false
|
|
91
|
+
|
|
92
|
+
const run = await find_run(source, source.workflow, `Publish ${tag}`)
|
|
93
|
+
if (!run) return false
|
|
94
|
+
if (await has_failed_job(source, run.id)) return true
|
|
95
|
+
|
|
96
|
+
return run.status === 'completed' && (await is_release_over(source, tag))
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// A run not listed yet is pending too: the announcement that starts this release also starts the
|
|
100
|
+
// publication, so the release can ask before GitHub has queued that run.
|
|
101
|
+
async function publication_state(
|
|
102
|
+
source: RunSource,
|
|
103
|
+
workflow: string,
|
|
104
|
+
tag: string,
|
|
105
|
+
): Promise<PollState> {
|
|
106
|
+
const run = await find_run(source, workflow, `Publish ${tag}`)
|
|
107
|
+
if (run?.status !== 'completed') return 'pending'
|
|
108
|
+
|
|
109
|
+
return run.conclusion === 'success' ? 'ready' : 'failed'
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
const github_release_runs = { is_release_lost, publication_state }
|
|
113
|
+
|
|
114
|
+
export type { PollState, RunSource }
|
|
115
|
+
export { github_release_runs }
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { setTimeout } from 'node:timers/promises'
|
|
2
2
|
import semver from 'semver'
|
|
3
3
|
import { z } from 'zod'
|
|
4
|
+
import { github_release_runs, type PollState, type RunSource } from './github-release-runs'
|
|
4
5
|
|
|
5
6
|
const API_ROOT = 'https://api.github.com/repos'
|
|
6
7
|
const LATEST_PATH = '/releases/latest'
|
|
@@ -8,42 +9,26 @@ const REPOSITORY_PATTERN = /^[\w.-]+\/[\w.-]+$/u
|
|
|
8
9
|
const TAG_PATTERN = /^v\d+\.\d+\.\d+(?:[.-][0-9A-Za-z.-]+)?$/u
|
|
9
10
|
const REQUEST_TIMEOUT_MS = 30_000
|
|
10
11
|
const NOT_FOUND_STATUS = 404
|
|
11
|
-
// A job skipped by its `if:` (or neutral) belongs to a run that succeeded; counting it would skip a
|
|
12
|
-
// lower tag whose release is still on its way.
|
|
13
|
-
const FAILED_CONCLUSIONS = new Set(['failure', 'cancelled', 'timed_out', 'startup_failure'])
|
|
14
12
|
const POLL_INTERVAL_MS = 30_000
|
|
15
13
|
const MAX_WAIT_ATTEMPTS = 120
|
|
16
14
|
const RELEASE_SCHEMA = z.object({ tag_name: z.string().min(1) })
|
|
17
15
|
const NOTES_SCHEMA = z.object({ name: z.string().min(1), body: z.string().min(1) })
|
|
18
|
-
const RUN_SCHEMA = z.object({
|
|
19
|
-
id: z.number(),
|
|
20
|
-
display_title: z.string(),
|
|
21
|
-
status: z.string().optional(),
|
|
22
|
-
conclusion: z.string().nullable().optional(),
|
|
23
|
-
})
|
|
24
|
-
const JOB_SCHEMA = z.object({
|
|
25
|
-
name: z.string(),
|
|
26
|
-
status: z.string(),
|
|
27
|
-
conclusion: z.string().nullable(),
|
|
28
|
-
})
|
|
29
|
-
const RUNS_SCHEMA = z.object({ workflow_runs: z.array(RUN_SCHEMA) })
|
|
30
|
-
const JOBS_SCHEMA = z.object({ jobs: z.array(JOB_SCHEMA) })
|
|
31
|
-
|
|
32
16
|
type ReleaseRequest = (url: string, init: RequestInit) => Promise<Response>
|
|
33
17
|
type Wait = () => Promise<void>
|
|
34
|
-
type PollState = 'ready' | 'failed' | 'pending'
|
|
35
18
|
|
|
36
19
|
// What differs between repositories. `start_tag` is the last tag that predates automatic releases;
|
|
37
20
|
// without it the latest existing release is the floor. `workflow` names the publish workflow whose
|
|
38
21
|
// failed run lets a lower tag be skipped, and `jobs` the jobs in it that count (empty: every job).
|
|
39
22
|
// `await_publish` holds the tag's own release until its run in that workflow has succeeded, for a
|
|
40
|
-
// release started beside the publication rather than from inside it.
|
|
23
|
+
// release started beside the publication rather than from inside it. `release_run_workflow` names
|
|
24
|
+
// the workflow whose run creates a tag's release, so a lower tag left without one can be told lost.
|
|
41
25
|
interface ReleaseSettings {
|
|
42
26
|
repository: string
|
|
43
27
|
start_tag?: string | undefined
|
|
44
28
|
workflow?: string | undefined
|
|
45
29
|
jobs?: ReadonlyArray<string> | undefined
|
|
46
30
|
await_publish?: boolean | undefined
|
|
31
|
+
release_run_workflow?: string | undefined
|
|
47
32
|
}
|
|
48
33
|
|
|
49
34
|
interface PublishOptions extends ReleaseSettings {
|
|
@@ -51,12 +36,10 @@ interface PublishOptions extends ReleaseSettings {
|
|
|
51
36
|
wait?: Wait
|
|
52
37
|
}
|
|
53
38
|
|
|
54
|
-
interface Client {
|
|
39
|
+
interface Client extends Omit<RunSource, 'read'> {
|
|
55
40
|
request: ReleaseRequest
|
|
56
41
|
token: string
|
|
57
42
|
url: string
|
|
58
|
-
workflow: string | undefined
|
|
59
|
-
jobs: ReadonlyArray<string>
|
|
60
43
|
}
|
|
61
44
|
|
|
62
45
|
// `fallback` answers when no tag sits between the floor and the target; without one the floor itself
|
|
@@ -139,59 +122,21 @@ function predecessor(
|
|
|
139
122
|
.toSorted((left, right) => semver.compare(right, left))[0]
|
|
140
123
|
}
|
|
141
124
|
|
|
142
|
-
function
|
|
143
|
-
|
|
144
|
-
if (names.length === 0) return true
|
|
145
|
-
|
|
146
|
-
return names.some((name) => job.name === name || job.name.startsWith(`${name} /`))
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
async function publish_run(
|
|
150
|
-
client: Client,
|
|
151
|
-
workflow_name: string,
|
|
152
|
-
tag: string,
|
|
153
|
-
): Promise<z.infer<typeof RUN_SCHEMA> | undefined> {
|
|
154
|
-
const workflow = encodeURIComponent(workflow_name)
|
|
155
|
-
const runs_response = await api_get(client, `/actions/workflows/${workflow}/runs?per_page=100`)
|
|
156
|
-
const runs = RUNS_SCHEMA.parse(await read_response(runs_response)).workflow_runs
|
|
157
|
-
|
|
158
|
-
return runs.find((item) => item.display_title === `Publish ${tag}`)
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
async function failed_publication(client: Client, tag: string): Promise<boolean> {
|
|
162
|
-
if (client.workflow === undefined) return false
|
|
163
|
-
|
|
164
|
-
const run = await publish_run(client, client.workflow, tag)
|
|
165
|
-
if (!run) return false
|
|
166
|
-
|
|
167
|
-
const jobs_response = await api_get(client, `/actions/runs/${String(run.id)}/jobs?per_page=100`)
|
|
168
|
-
const { jobs } = JOBS_SCHEMA.parse(await read_response(jobs_response))
|
|
169
|
-
|
|
170
|
-
return jobs.some((job) => is_failed_job(job, client.jobs))
|
|
125
|
+
function run_source(client: Client): RunSource {
|
|
126
|
+
return { ...client, read: async (path) => await read_response(await api_get(client, path)) }
|
|
171
127
|
}
|
|
172
128
|
|
|
173
129
|
async function default_wait(): Promise<void> {
|
|
174
130
|
await setTimeout(POLL_INTERVAL_MS)
|
|
175
131
|
}
|
|
176
132
|
|
|
133
|
+
// The lost state is read before the release: a run completes only after creating the release, so a
|
|
134
|
+
// run that completes between the two reads still shows its release to the second one.
|
|
177
135
|
async function release_state(client: Client, tag: string): Promise<PollState> {
|
|
136
|
+
const is_lost = await github_release_runs.is_release_lost(run_source(client), tag)
|
|
178
137
|
if (await existing_release(client, tag)) return 'ready'
|
|
179
|
-
if (await failed_publication(client, tag)) return 'failed'
|
|
180
|
-
|
|
181
|
-
return 'pending'
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
// A run not listed yet is pending too: the announcement that starts this release also starts the
|
|
185
|
-
// publication, so the release can ask before GitHub has queued that run.
|
|
186
|
-
async function publication_state(
|
|
187
|
-
client: Client,
|
|
188
|
-
workflow: string,
|
|
189
|
-
tag: string,
|
|
190
|
-
): Promise<PollState> {
|
|
191
|
-
const run = await publish_run(client, workflow, tag)
|
|
192
|
-
if (run?.status !== 'completed') return 'pending'
|
|
193
138
|
|
|
194
|
-
return
|
|
139
|
+
return is_lost ? 'failed' : 'pending'
|
|
195
140
|
}
|
|
196
141
|
|
|
197
142
|
async function poll(
|
|
@@ -225,7 +170,7 @@ async function wait_for_publication(client: Client, tag: string, budget: Budget)
|
|
|
225
170
|
if (workflow === undefined) throw new Error('Waiting for the publication needs RELEASE_WORKFLOW')
|
|
226
171
|
|
|
227
172
|
return await poll(
|
|
228
|
-
async () => await publication_state(client, workflow, tag),
|
|
173
|
+
async () => await github_release_runs.publication_state(run_source(client), workflow, tag),
|
|
229
174
|
budget,
|
|
230
175
|
`Publish ${tag}`,
|
|
231
176
|
)
|
|
@@ -325,6 +270,7 @@ function create_client(request: ReleaseRequest, token: string, settings: Release
|
|
|
325
270
|
url: `${API_ROOT}/${settings.repository}`,
|
|
326
271
|
workflow: settings.workflow,
|
|
327
272
|
jobs: settings.jobs ?? [],
|
|
273
|
+
release_run_workflow: settings.release_run_workflow,
|
|
328
274
|
}
|
|
329
275
|
}
|
|
330
276
|
|
|
@@ -1,23 +1,26 @@
|
|
|
1
1
|
#!/usr/bin/env tsx
|
|
2
2
|
import { fileURLToPath } from 'node:url'
|
|
3
3
|
import { git_command } from '#scripts/git/git-command'
|
|
4
|
+
import { cli_flags } from '#scripts/lib/cli-flags'
|
|
4
5
|
import { error_text } from '#scripts/lib/error-message'
|
|
5
6
|
import { release_history } from './release-history'
|
|
6
7
|
import { release_plan, type ReleasePlan } from './release-plan'
|
|
7
8
|
import { release_publish } from './release-publish'
|
|
8
9
|
|
|
9
|
-
// `pnpm josh release` — the one place that decides a version
|
|
10
|
+
// `pnpm josh release` — the one place that decides a version.
|
|
10
11
|
//
|
|
11
12
|
// It does three things and no more: count the merges main has taken since the version last changed,
|
|
12
13
|
// report and stop when that count is zero, and otherwise raise the version by that many minors, open
|
|
13
14
|
// a pull request, merge it and watch for the tag.
|
|
14
15
|
//
|
|
15
|
-
// **It never touches the root checkout
|
|
16
|
+
// **It never touches the root checkout**. The count is read from
|
|
16
17
|
// `origin/<default>`, and the version bump / commit / push happen in a dedicated work tree
|
|
17
18
|
// `release_publish` cuts for the release — so a release can run beside a `backlogrun` (which keeps the
|
|
18
19
|
// root on the default branch) and can start even when the root is dirty or on another branch.
|
|
19
20
|
|
|
20
21
|
const DRY_RUN_FLAG = '--dry-run'
|
|
22
|
+
const KNOWN_FLAGS: ReadonlyArray<string> = [DRY_RUN_FLAG]
|
|
23
|
+
const COMMAND_NAME = 'release'
|
|
21
24
|
const ARGUMENT_START = 2
|
|
22
25
|
const SUCCESS_EXIT_CODE = 0
|
|
23
26
|
const FAILURE_EXIT_CODE = 1
|
|
@@ -73,9 +76,23 @@ function is_dry_run_requested(argv: ReadonlyArray<string>): boolean {
|
|
|
73
76
|
return argv.slice(ARGUMENT_START).includes(DRY_RUN_FLAG)
|
|
74
77
|
}
|
|
75
78
|
|
|
79
|
+
// **Only a known argument reaches the release**. The command publishes,
|
|
80
|
+
// so a `--help` it did not read once started a real release; a help request now prints the usage, and
|
|
81
|
+
// anything else unknown is refused, both before the first fetch.
|
|
82
|
+
async function run_argv(argv: ReadonlyArray<string>): Promise<number> {
|
|
83
|
+
const answer = cli_flags.answer_help_or_unknown(
|
|
84
|
+
argv.slice(ARGUMENT_START),
|
|
85
|
+
KNOWN_FLAGS,
|
|
86
|
+
COMMAND_NAME,
|
|
87
|
+
)
|
|
88
|
+
if (answer !== undefined) return answer
|
|
89
|
+
|
|
90
|
+
return await run(is_dry_run_requested(argv))
|
|
91
|
+
}
|
|
92
|
+
|
|
76
93
|
async function main(): Promise<void> {
|
|
77
94
|
try {
|
|
78
|
-
process.exit(await
|
|
95
|
+
process.exit(await run_argv(process.argv))
|
|
79
96
|
} catch (error) {
|
|
80
97
|
console.error(error_text.message_of(error))
|
|
81
98
|
process.exit(FAILURE_EXIT_CODE)
|
|
@@ -84,6 +101,6 @@ async function main(): Promise<void> {
|
|
|
84
101
|
|
|
85
102
|
if (process.argv[1] === fileURLToPath(import.meta.url)) void main()
|
|
86
103
|
|
|
87
|
-
const release_cli = { is_dry_run_requested, run, DRY_RUN_FLAG }
|
|
104
|
+
const release_cli = { is_dry_run_requested, run, run_argv, DRY_RUN_FLAG }
|
|
88
105
|
|
|
89
106
|
export { release_cli }
|
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
import { git_command } from '#scripts/git/git-command'
|
|
2
|
+
import { json_value } from '#scripts/lib/json-value'
|
|
2
3
|
import { package_with_version_schema } from '#scripts/lib/schemas'
|
|
3
4
|
import { version_targets } from '#scripts/version/version-targets'
|
|
4
5
|
import { release_plan, type ReleasePlan, type VersionedCommit } from './release-plan'
|
|
5
6
|
|
|
6
7
|
// Reading main's history for the two numbers a release is made of: where the version last changed,
|
|
7
|
-
// and how many merges have landed since
|
|
8
|
+
// and how many merges have landed since.
|
|
8
9
|
|
|
9
10
|
const { PACKAGE_JSON } = version_targets
|
|
10
11
|
|
|
11
12
|
// How far back the search for "the commit that last changed the version" goes, counted in commits
|
|
12
|
-
// that touched `package.json`. Once children stop bumping
|
|
13
|
+
// that touched `package.json`. Once children stop bumping that file still
|
|
13
14
|
// changes for every dependency update, so the base can sit several entries down — but a repository
|
|
14
15
|
// that has taken thirty `package.json` commits without a single release has a different problem, and
|
|
15
16
|
// guessing past that point would be worse than saying so.
|
|
@@ -18,8 +19,7 @@ const BASE_SEARCH_LIMIT = 30
|
|
|
18
19
|
// **Which ref the history is read from.** `josh release` runs on a pulled default branch, so `HEAD`
|
|
19
20
|
// is main there and the default is right. A caller on a feature branch names the ref it means —
|
|
20
21
|
// `origin/main` — because `--first-parent` from a branch tip walks that branch rather than main, and
|
|
21
|
-
// the count would silently omit every merge main took after the branch was cut
|
|
22
|
-
// (joshuafolkken/kit#1486).
|
|
22
|
+
// the count would silently omit every merge main took after the branch was cut.
|
|
23
23
|
const DEFAULT_TIP = 'HEAD'
|
|
24
24
|
|
|
25
25
|
// The reads this module makes, named so a test can answer them without a git repository. Production
|
|
@@ -42,11 +42,7 @@ const git_reader: HistoryReader = {
|
|
|
42
42
|
function parse_version(content: string | undefined): string | undefined {
|
|
43
43
|
if (content === undefined) return undefined
|
|
44
44
|
|
|
45
|
-
|
|
46
|
-
return package_with_version_schema.parse(JSON.parse(content)).version
|
|
47
|
-
} catch {
|
|
48
|
-
return undefined
|
|
49
|
-
}
|
|
45
|
+
return json_value.parse_with(content, package_with_version_schema)?.version
|
|
50
46
|
}
|
|
51
47
|
|
|
52
48
|
async function read_version_at(
|
|
@@ -90,7 +86,7 @@ async function read_base(
|
|
|
90
86
|
|
|
91
87
|
// The version `package.json` carries at a git revision. `josh release` reads it from
|
|
92
88
|
// `origin/<default>` rather than from the checkout's own `package.json`, so the number it raises is
|
|
93
|
-
// main's latest even when the run happens in a work tree cut for the release
|
|
89
|
+
// main's latest even when the run happens in a work tree cut for the release.
|
|
94
90
|
async function read_current_version(
|
|
95
91
|
tip: string = DEFAULT_TIP,
|
|
96
92
|
reader: HistoryReader = git_reader,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import semver from 'semver'
|
|
2
2
|
|
|
3
|
-
// What a release is, decided from main's history alone
|
|
3
|
+
// What a release is, decided from main's history alone.
|
|
4
4
|
//
|
|
5
5
|
// **A version is a property of main's history, not of a branch.** `bump-version.ts` reads the local
|
|
6
6
|
// `package.json` and increments it, so two branches cut from the same version both claim the same
|
|
@@ -51,7 +51,7 @@ function previous_version_of(
|
|
|
51
51
|
// **The newest commit whose `package.json` version differs from the version immediately before it.**
|
|
52
52
|
//
|
|
53
53
|
// **A commit that touched `package.json` without moving the version is skipped**, which is what makes
|
|
54
|
-
// this right once children stop bumping
|
|
54
|
+
// this right once children stop bumping: a dependency update rewrites the
|
|
55
55
|
// file every time and must not be mistaken for a release.
|
|
56
56
|
//
|
|
57
57
|
// **Both sides have to be readable for this to be a version change.** An unreadable neighbor makes
|
|
@@ -96,7 +96,7 @@ function short_sha(sha: string): string {
|
|
|
96
96
|
|
|
97
97
|
// **The count is the line a person reads**, which is why it is built here rather than at each caller:
|
|
98
98
|
// the release command prints it, and so does anything else that wants to say how much is waiting to
|
|
99
|
-
// ship
|
|
99
|
+
// ship.
|
|
100
100
|
function format_pending_line(pending: number): string {
|
|
101
101
|
return `${PENDING_ICON} unreleased merges on main: ${String(pending)}`
|
|
102
102
|
}
|
|
@@ -9,13 +9,12 @@ import { version_targets } from '#scripts/version/version-targets'
|
|
|
9
9
|
import { z } from 'zod'
|
|
10
10
|
import { release_tag } from './release-tag'
|
|
11
11
|
|
|
12
|
-
// The stage lines `pnpm josh release` prints, and the two stages it waits for after the tag
|
|
13
|
-
// (joshuafolkken/kit#3193).
|
|
12
|
+
// The stage lines `pnpm josh release` prints, and the two stages it waits for after the tag.
|
|
14
13
|
//
|
|
15
14
|
// **The tag starts the distribution, it does not finish it.** `publish.yml` runs off the tag:
|
|
16
15
|
// `publish-npm` puts the version on npm and `create-release` opens the GitHub Release once the
|
|
17
|
-
// publishing jobs pass.
|
|
18
|
-
//
|
|
16
|
+
// publishing jobs pass. Stopping at the tag would call the release published ahead of both, so the
|
|
17
|
+
// command waits for each, prints one line per stage reached, and prints the completion line only
|
|
19
18
|
// when every stage has — a stage that times out is named with ❌ and the run exits non-zero.
|
|
20
19
|
|
|
21
20
|
const { PACKAGE_JSON } = version_targets
|