@joshuafolkken/kit 1.1035.0 → 1.1094.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/settings.json +9 -8
- package/.claude/skills/epic-commands/SKILL.md +5 -7
- package/.claude/skills/verify-ui/SKILL.md +1 -1
- package/.claude/skills/workflow-commands/SKILL.md +21 -13
- package/.claude/skills/workflow-commands/background-commands.md +5 -4
- package/.claude/skills/workflow-commands/backlogrun-child.md +3 -3
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +9 -7
- package/.claude/skills/workflow-commands/backlogrun-park.md +6 -0
- package/.claude/skills/workflow-commands/backlogrun-progress.md +31 -37
- package/.claude/skills/workflow-commands/backlogrun-steps.md +25 -25
- package/.claude/skills/workflow-commands/backlogrun.md +2 -2
- package/.claude/skills/workflow-commands/chain-rule.md +6 -4
- package/.claude/skills/workflow-commands/delegation.md +3 -3
- package/.claude/skills/workflow-commands/followup-reference.md +3 -3
- package/.claude/skills/workflow-commands/followup.md +7 -3
- package/.claude/skills/workflow-commands/fullrun-steps.md +3 -2
- package/.claude/skills/workflow-commands/fullrun.md +3 -2
- package/.claude/skills/workflow-commands/halfrun.md +16 -19
- package/.claude/skills/workflow-commands/issue-comments.md +2 -2
- package/.claude/skills/workflow-commands/issue-fold-existing.md +10 -10
- package/.claude/skills/workflow-commands/issue-scout.md +1 -1
- package/.claude/skills/workflow-commands/kickoff.md +9 -4
- package/.claude/skills/workflow-commands/latest-gate.md +1 -1
- package/.claude/skills/workflow-commands/needs-human-review.md +1 -1
- package/.claude/skills/workflow-commands/observation-filing.md +44 -89
- package/.claude/skills/workflow-commands/pre-gate-cut.md +33 -36
- package/.claude/skills/workflow-commands/prerequisite.md +1 -1
- package/.claude/skills/workflow-commands/prrun.md +36 -0
- package/.claude/skills/workflow-commands/retrospective.md +1 -1
- package/.claude/skills/workflow-commands/working-tree-hold.md +24 -4
- package/.codex/hooks.json +16 -20
- package/.github/actions/setup-pnpm/action.yml +93 -0
- package/.github/dependabot.yml +5 -1
- package/.github/workflows/auto-tag.yml +21 -0
- package/.github/workflows/ci.yml +26 -128
- package/.github/workflows/pr-classification.yml +5 -41
- package/.github/workflows/publish.yml +42 -48
- package/.github/workflows/sonar-qube.yml +37 -4
- package/AGENTS.md +12 -2
- package/CLAUDE.md +15 -16
- package/GEMINI.md +14 -2
- package/README.md +59 -18
- package/SECURITY.md +36 -6
- package/cspell/index.yaml +2 -1
- package/dist/CLAUDE.md +15 -16
- package/dist/config-merge/index.js +15 -3
- package/dist/hooks/batch-guard.js +4 -4
- package/dist/hooks/{chunk-Y27M6A7X.js → chunk-3C4YCCEF.js} +5 -13
- package/dist/hooks/{chunk-D67KVGGY.js → chunk-7ZPFAVR7.js} +17 -88
- package/dist/hooks/{chunk-HOYJU5RM.js → chunk-E54KGFEQ.js} +11 -4
- package/dist/hooks/{chunk-KG6PZD72.js → chunk-IL27YTPH.js} +2 -2
- package/dist/hooks/{chunk-GJT4BNVE.js → chunk-KHWHKJOM.js} +3 -3
- package/dist/hooks/{chunk-HU66PWWL.js → chunk-M2XDCUKD.js} +1076 -509
- package/dist/hooks/{chunk-GLBDBJOK.js → chunk-NKOG3XAV.js} +199 -304
- package/dist/hooks/{chunk-ZXNE6NY3.js → chunk-O4LL4HTI.js} +2 -7
- package/dist/hooks/{chunk-XPLP27WA.js → chunk-OIZUHPJI.js} +5 -27
- package/dist/hooks/{chunk-EIFCAJRB.js → chunk-UD24EAIL.js} +2546 -1636
- package/dist/hooks/codex-hook-adapter.js +10 -11
- package/dist/hooks/duplicate-read-guard.js +5 -5
- package/dist/hooks/format-edited.js +15 -34
- package/dist/hooks/inputs.json +279 -0
- package/dist/hooks/investigation-guard.js +5 -5
- package/dist/hooks/pretool-guard.js +23 -16
- package/dist/hooks/session-lang.js +0 -1
- package/dist/hooks/stop-guard.js +188 -509
- package/dist/josh.js +166 -225
- package/dist/managed-marker/index.js +2 -1
- package/dist/version/index.js +412 -64
- package/eslint/rules/promise.js +5 -0
- package/package.json +13 -8
- package/prompts/collaboration-workflow/file-edits.md +6 -53
- package/prompts/collaboration-workflow/issue-citation.md +5 -5
- package/prompts/collaboration-workflow/operating-rules.md +4 -4
- package/prompts/collaboration-workflow/overview.md +13 -1
- package/prompts/collaboration-workflow/report-format.md +1 -1
- package/prompts/collaboration-workflow/residency.md +4 -4
- package/prompts/collaboration-workflow/rule-delivery.md +5 -36
- package/prompts/collaboration-workflow/shell-body.md +7 -9
- package/prompts/collaboration-workflow/turn-batching.md +21 -37
- package/prompts/collaboration-workflow/upstream-interrupt.md +1 -1
- package/prompts/collaboration-workflow/wip-cap.md +36 -36
- package/prompts/collaboration-workflow.md +5 -8
- package/prompts/review-rubric.md +1 -1
- package/prompts/review.md +3 -3
- package/prompts/sonar-hotspot-handling.md +12 -4
- package/prompts/testing-guide.md +3 -3
- package/scripts/adopt/adopt-toolkits.ts +2 -2
- package/scripts/adopt/adopt.ts +0 -2
- package/scripts/agent/agent-argv.ts +0 -2
- package/scripts/agent/agent-diagnostics.ts +1 -1
- package/scripts/agent/agent-role-profile.ts +0 -7
- package/scripts/agent/claude-agent-argv.ts +0 -2
- package/scripts/agent/codex-agent-argv.ts +1 -1
- package/scripts/agent/codex-hooks.ts +92 -0
- package/scripts/agent/interactive-ask.ts +1 -1
- package/scripts/auto-ok/auto-ok-cli.ts +15 -25
- package/scripts/backlog/backlog-budget.ts +0 -2
- package/scripts/backlog/backlog-defect-priority.ts +2 -2
- package/scripts/backlog/backlog-drive-cli.ts +10 -8
- package/scripts/backlog/backlog-drive-named-offer.ts +16 -3
- package/scripts/backlog/backlog-drive-named.ts +2 -1
- package/scripts/backlog/backlog-drive.ts +76 -16
- package/scripts/backlog/backlog-named.ts +0 -3
- package/scripts/backlog/backlog-next.ts +32 -22
- package/scripts/backlog/backlog-offer-cli.ts +0 -5
- package/scripts/backlog/backlog-plan-cli.ts +6 -8
- package/scripts/backlog/backlog-plan.ts +1 -1
- package/scripts/backlog/backlog-pool.ts +34 -17
- package/scripts/backlog/backlog-rank.ts +106 -0
- package/scripts/backlog/backlog-ready.ts +19 -3
- package/scripts/backlog/backlog-scope.ts +1 -3
- package/scripts/backlog/backlog-stalled-detect.ts +2 -2
- package/scripts/backlog/backlog-stalled.ts +0 -1
- package/scripts/backlog/backlog-waves.ts +47 -31
- package/scripts/behavior/behavior-cli.ts +1 -1
- package/scripts/build/build-codex-hooks.ts +26 -0
- package/scripts/build/build-hooks.ts +92 -11
- package/scripts/build/hook-bundle-stamp.ts +111 -0
- package/scripts/cases/cases-cli.ts +1 -1
- package/scripts/cases/cases-logic.ts +1 -1
- package/scripts/ci/composite-actions.ts +30 -0
- package/scripts/ci/pr-classification.ts +3 -3
- package/scripts/claude/workflow-destination.ts +10 -1
- package/scripts/clone/clone-fingerprint.ts +0 -1
- package/scripts/clone/clone-scan-cli.ts +1 -1
- package/scripts/clone/clone-scan.ts +1 -1
- package/scripts/config-merge/json-format.ts +0 -1
- package/scripts/config-merge/patch-yaml-list.ts +1 -1
- package/scripts/cost-runtime/codex-usage.ts +2 -9
- package/scripts/cost-runtime/cost-attribute.ts +0 -1
- package/scripts/cost-runtime/cost-cli.ts +0 -3
- package/scripts/cost-runtime/cost-corpus.ts +0 -2
- package/scripts/cost-runtime/cost-format.ts +0 -3
- package/scripts/cost-runtime/cost-pricing.ts +0 -1
- package/scripts/cost-runtime/cost-tokens.ts +0 -1
- package/scripts/delegation/delegation-cli.ts +1 -1
- package/scripts/delegation/delegation-policy.ts +11 -1
- package/scripts/delegation/duplicate-read-guard.ts +0 -8
- package/scripts/delegation/fanout-cli.ts +1 -1
- package/scripts/delegation/fanout.ts +0 -2
- package/scripts/delegation/investigation-reads.ts +1 -164
- package/scripts/discovery/repo-map-logic.ts +0 -1
- package/scripts/discovery/repo-party-cli.ts +1 -1
- package/scripts/doctor/doctor-consumer.ts +4 -6
- package/scripts/doctor/doctor-logic.ts +0 -4
- package/scripts/doctor/doctor.ts +14 -9
- package/scripts/document/document-byte-budget.ts +8 -9
- package/scripts/document/document-byte-check.ts +0 -1
- package/scripts/document/document-read-cli.ts +0 -2
- package/scripts/document/document-section-cli.ts +1 -1
- package/scripts/document/document-section.ts +0 -3
- package/scripts/document/edit-files-cli.ts +0 -1
- package/scripts/document/entry-read-budget.ts +13 -4
- package/scripts/document/lane-child-read-set.ts +1 -6
- package/scripts/document/read-files-cli.ts +0 -4
- package/scripts/document/read-set-cli.ts +0 -2
- package/scripts/document/read-set-point-of-use.ts +1 -0
- package/scripts/document/read-set-pricing.ts +0 -1
- package/scripts/document/read-set-trim.ts +1 -1
- package/scripts/epic/epic-add.ts +1 -1
- package/scripts/epic/epic-audit-cli.ts +1 -4
- package/scripts/epic/epic-audit-orphans.ts +1 -3
- package/scripts/epic/epic-audit-rationale.ts +0 -1
- package/scripts/epic/epic-audit-report.ts +0 -2
- package/scripts/epic/epic-audit.ts +5 -4
- package/scripts/epic/epic-bundle-cli.ts +1 -1
- package/scripts/epic/epic-bundle-evidence.ts +0 -1
- package/scripts/epic/epic-bundle-referenced.ts +1 -5
- package/scripts/epic/epic-bundle.ts +0 -4
- package/scripts/epic/epic-busy.ts +4 -5
- package/scripts/epic/epic-candidate-confirm.ts +0 -5
- package/scripts/epic/epic-classify.ts +2 -2
- package/scripts/epic/epic-cli-argv.ts +0 -1
- package/scripts/epic/epic-close-comment.ts +1 -1
- package/scripts/epic/epic-close.ts +5 -2
- package/scripts/epic/epic-cross-repo.ts +2 -4
- package/scripts/epic/epic-decision.ts +0 -1
- package/scripts/epic/epic-fetch.ts +2 -2
- package/scripts/epic/epic-index.ts +2 -3
- package/scripts/epic/epic-issue.ts +1 -15
- package/scripts/epic/epic-lane-offer.ts +20 -30
- package/scripts/epic/epic-nested.ts +1 -1
- package/scripts/epic/epic-next-read.ts +1 -3
- package/scripts/epic/epic-next-views.ts +0 -1
- package/scripts/epic/epic-next.ts +1 -10
- package/scripts/epic/epic-parse.ts +0 -1
- package/scripts/epic/epic-promote.ts +0 -9
- package/scripts/epic/epic-rank.ts +37 -0
- package/scripts/epic/epic-read.ts +1 -2
- package/scripts/epic/epic-reconcile.ts +1 -1
- package/scripts/epic/epic-reference.ts +1 -13
- package/scripts/epic/epic-relation-recheck.ts +1 -1
- package/scripts/epic/epic-relations.ts +1 -1
- package/scripts/epic/epic-remove.ts +1 -1
- package/scripts/epic/epic-report.ts +0 -1
- package/scripts/epic/epic-run.ts +2 -3
- package/scripts/epic/epic-shape.ts +1 -1
- package/scripts/epic/epic-solo-stale.ts +107 -0
- package/scripts/epic/epic-solo.ts +32 -30
- package/scripts/epic/epic-triage.ts +1 -1
- package/scripts/epic/epic-validate.ts +1 -1
- package/scripts/epic/epic.ts +1 -1
- package/scripts/exports/unused-members-cli.ts +53 -0
- package/scripts/{git → followup}/followup-issue-number.ts +1 -6
- package/scripts/{git → followup}/git-followup-cleanup.ts +2 -1
- package/scripts/{git → followup}/git-followup-finish.ts +1 -3
- package/scripts/{git → followup}/git-followup-flush.ts +2 -2
- package/scripts/{git → followup}/git-followup-issue-close.ts +2 -2
- package/scripts/{git → followup}/git-followup-label.ts +4 -4
- package/scripts/followup/git-followup-merged.ts +112 -0
- package/scripts/{git → followup}/git-followup-pending.ts +1 -1
- package/scripts/{git → followup}/git-followup-workflow.ts +19 -11
- package/scripts/{git → followup}/git-pr-followup-wrapup.ts +9 -3
- package/scripts/{git → followup}/git-pr-followup.ts +53 -16
- package/scripts/gate/core-budget.ts +3 -9
- package/scripts/gate/gate-plan.ts +7 -4
- package/scripts/gate/gate-report.ts +0 -6
- package/scripts/gate/gate-tree.ts +1 -1
- package/scripts/gate/pre-commit-type-check.ts +0 -6
- package/scripts/gate/project-checks.ts +7 -8
- package/scripts/gate/scoped-green.ts +0 -1
- package/scripts/gate/type-check-step.ts +1 -1
- package/scripts/gate/verification-gate.ts +0 -2
- package/scripts/gh/fix-gh-packages.ts +15 -12
- package/scripts/gh/gh-spawn.ts +2 -2
- package/scripts/{git → gh}/git-ai-review-scan.ts +1 -5
- package/scripts/{git → gh}/git-gh-check.ts +2 -1
- package/scripts/{git → gh}/git-gh-exec.ts +1 -1
- package/scripts/{git → gh}/git-gh-failure.ts +1 -1
- package/scripts/{git → gh}/git-gh-helpers.ts +0 -1
- package/scripts/{git → gh}/git-gh-issue-list.ts +2 -0
- package/scripts/{git → gh}/git-gh-issue-read.ts +1 -1
- package/scripts/{git → gh}/git-gh-issue-rest.ts +6 -3
- package/scripts/{git → gh}/git-gh-pr-read.ts +24 -0
- package/scripts/{git → gh}/git-gh-pr-rest.ts +5 -2
- package/scripts/{git → gh}/git-gh-pr-review.ts +2 -2
- package/scripts/{git → gh}/git-gh-pr-rollup.ts +1 -3
- package/scripts/{git → gh}/git-gh-pr.ts +3 -1
- package/scripts/{git → gh}/git-pr-ai-review.ts +2 -5
- package/scripts/{git → gh}/git-pr-checks-eval.ts +0 -10
- package/scripts/{git → gh}/git-pr-checks-parse.ts +4 -20
- package/scripts/{git → gh}/git-pr-checks.ts +2 -1
- package/scripts/{git → gh}/git-pr-coderabbit.ts +2 -5
- package/scripts/{git → gh}/git-pr-confirmation.ts +1 -3
- package/scripts/{git → gh}/git-pr-managed-config.ts +2 -3
- package/scripts/{git → gh}/git-pr.ts +3 -3
- package/scripts/git/changed-file-scope.ts +0 -1
- package/scripts/git/git-branch.ts +3 -6
- package/scripts/git/git-command.ts +1 -1
- package/scripts/git/git-commit.ts +1 -1
- package/scripts/git/git-common-directory.ts +80 -24
- package/scripts/git/git-error.ts +66 -9
- package/scripts/git/git-execa-error.ts +6 -1
- package/scripts/git/git-issue.ts +1 -1
- package/scripts/git/git-preflight.ts +24 -6
- package/scripts/git/git-prompt.ts +6 -31
- package/scripts/git/git-push-transport.ts +12 -69
- package/scripts/git/git-push.ts +1 -1
- package/scripts/git/git-spawn.ts +79 -3
- package/scripts/git/git-ssh-keepalive.ts +74 -0
- package/scripts/git/git-staging.ts +1 -0
- package/scripts/git/git-status.ts +1 -1
- package/scripts/git/git-workflow.ts +1 -1
- package/scripts/git/gone-branch.ts +4 -2
- package/scripts/git/listing-cutoff.ts +1 -1
- package/scripts/git/main-merge.ts +1 -1
- package/scripts/git/main-sync.ts +19 -1
- package/scripts/git/parse-json-array.ts +0 -3
- package/scripts/git/repository-lock.ts +16 -16
- package/scripts/git/{git-stash.ts → stash/git-stash.ts} +1 -1
- package/scripts/git/{stash-pop-args.ts → stash/stash-pop-args.ts} +1 -1
- package/scripts/git/{stash-pop-cli.ts → stash/stash-pop-cli.ts} +0 -1
- package/scripts/git/{stash-sweep-lock.ts → stash/stash-sweep-lock.ts} +3 -3
- package/scripts/hooks/codex-hook-adapter.ts +0 -1
- package/scripts/hooks/edited-cspell.ts +1 -1
- package/scripts/hooks/format-edited-cli.ts +15 -0
- package/scripts/hooks/format-edited-file.ts +4 -9
- package/scripts/hooks/pre-push-unit.ts +0 -4
- package/scripts/hooks/pretool-guard-cli.ts +21 -0
- package/scripts/hooks/pretool-guard.ts +36 -19
- package/scripts/hooks/reserved-run.ts +1 -1
- package/scripts/hooks/step-zero-notice.ts +76 -0
- package/scripts/hooks/stop-guard.ts +47 -21
- package/scripts/init/claude-plugin-config.ts +4 -5
- package/scripts/init/hook-command-rewrite.ts +16 -8
- package/scripts/init/hook-launch.ts +41 -15
- package/scripts/init/init-basic.ts +2 -5
- package/scripts/init/init-logic.ts +7 -0
- package/scripts/init/init.ts +0 -3
- package/scripts/init/project-profile.ts +6 -11
- package/scripts/init/start-exec.ts +8 -2
- package/scripts/init/start-plan.ts +18 -5
- package/scripts/init/start-setup-pr.ts +52 -25
- package/scripts/init/start-steps.ts +42 -9
- package/scripts/init/start.ts +40 -10
- package/scripts/issue/behavior-change-lint.ts +0 -1
- package/scripts/issue/defect-rate-cli.ts +3 -3
- package/scripts/issue/defect-rate.ts +1 -2
- package/scripts/{git → issue}/git-next-issues.ts +37 -8
- package/scripts/issue/issue-backlinks-cli.ts +1 -5
- package/scripts/issue/issue-cite-cli.ts +2 -6
- package/scripts/issue/issue-cite.ts +19 -3
- package/scripts/issue/issue-classification.ts +1 -9
- package/scripts/issue/issue-closing-pr.ts +4 -4
- package/scripts/issue/issue-comment-cli.ts +2 -2
- package/scripts/issue/issue-file-cli.ts +5 -5
- package/scripts/issue/issue-file.ts +2 -2
- package/scripts/issue/issue-fold-cli.ts +1 -1
- package/scripts/issue/issue-fold-existing-cli.ts +1 -1
- package/scripts/{git → issue}/issue-labels.ts +20 -0
- package/scripts/issue/issue-lint-cli.ts +1 -1
- package/scripts/issue/issue-merged.ts +2 -2
- package/scripts/issue/issue-rank.ts +89 -0
- package/scripts/issue/issue-read-cli.ts +8 -47
- package/scripts/issue/issue-read.ts +0 -2
- package/scripts/issue/issue-report-failures.ts +80 -0
- package/scripts/issue/issue-scout-cli.ts +1 -7
- package/scripts/issue/issue-scout-closed.ts +2 -2
- package/scripts/issue/issue-scout.ts +0 -2
- package/scripts/issue/issue-state-cli.ts +5 -46
- package/scripts/issue/issue-state.ts +1 -5
- package/scripts/issue/markdown-section.ts +1 -1
- package/scripts/issue/measure-rerun-cli.ts +1 -1
- package/scripts/issue/reproduction-measure.ts +1 -1
- package/scripts/josh/cli-body.ts +1 -1
- package/scripts/josh/file-map-stamp.ts +0 -3
- package/scripts/josh/josh-command-map.ts +2 -102
- package/scripts/josh/josh-commands-ai.ts +9 -102
- package/scripts/josh/josh-commands-backlog.ts +5 -1
- package/scripts/josh/josh-commands-development.ts +10 -3
- package/scripts/josh/josh-commands-issue.ts +2 -2
- package/scripts/josh/josh-commands-maintenance.ts +7 -0
- package/scripts/josh/josh-commands-project.ts +7 -1
- package/scripts/josh/josh-commands-run.ts +114 -0
- package/scripts/josh/josh-commands-versioning.ts +8 -0
- package/scripts/josh/josh-commands-workflow.ts +2 -2
- package/scripts/josh/path-decision.ts +0 -3
- package/scripts/josh/process-owner.ts +16 -0
- package/scripts/josh/session-language-cli.ts +0 -1
- package/scripts/lane/lane-await.ts +3 -6
- package/scripts/lane/lane-capacity.ts +6 -3
- package/scripts/lane/lane-child-invocation.ts +20 -7
- package/scripts/lane/lane-child-marker.ts +16 -2
- package/scripts/lane/lane-cli.ts +33 -18
- package/scripts/lane/lane-close.ts +1 -3
- package/scripts/lane/lane-dispatch.ts +3 -4
- package/scripts/lane/lane-environment.ts +0 -9
- package/scripts/lane/lane-handoff.ts +38 -0
- package/scripts/lane/lane-launch-cli.ts +21 -11
- package/scripts/lane/lane-open.ts +0 -3
- package/scripts/lane/lane-output.ts +0 -1
- package/scripts/lane/lane-registry.ts +9 -0
- package/scripts/lane/lane-report.ts +10 -4
- package/scripts/lane/openai-lane-ship.ts +2 -0
- package/scripts/lane/openai-lane-supervisor-decision.ts +2 -1
- package/scripts/lane/openai-lane-supervisor.ts +6 -4
- package/scripts/lane/openai-review-broker.ts +3 -0
- package/scripts/lib/bounded-pool.ts +1 -0
- package/scripts/lib/json-value.ts +5 -4
- package/scripts/lib/poll.ts +3 -1
- package/scripts/lib/timed-fetch.ts +15 -0
- package/scripts/lib/timeouts.ts +13 -0
- package/scripts/{yaml → lib}/yaml-document.ts +3 -1
- package/scripts/{bytes → lines}/bytes-command.ts +0 -2
- package/scripts/lines/lines-command.ts +0 -1
- package/scripts/lint/lint-related-scope.ts +0 -1
- package/scripts/lint/lint-related.ts +1 -1
- package/scripts/{git → notify}/telegram-notify.ts +2 -2
- package/scripts/{git → notify}/telegram-test.ts +4 -4
- package/scripts/observations/observation-ledger-home.ts +0 -1
- package/scripts/observations/observation-ledger-line.ts +0 -1
- package/scripts/observations/observation-ledger-migrate.ts +1 -1
- package/scripts/observations/observations-flush-landing.ts +3 -3
- package/scripts/observations/observations-flush.ts +2 -2
- package/scripts/overrides/lockfile-overrides.ts +1 -1
- package/scripts/overrides/overrides-logic.ts +1 -1
- package/scripts/package/package-scout-cli.ts +2 -7
- package/scripts/package/package-scout.ts +0 -2
- package/scripts/propagate/propagate-git-failure.ts +0 -1
- package/scripts/propagate/propagate-git.ts +0 -2
- package/scripts/propagate/propagate-plan.ts +185 -0
- package/scripts/propagate/propagate-publish.ts +2 -3
- package/scripts/propagate/propagate-run.ts +5 -3
- package/scripts/propagate/propagate-steps.ts +19 -6
- package/scripts/propagate/propagate-targets.ts +13 -6
- package/scripts/propagate/propagate.ts +60 -46
- package/scripts/refactor/import-graph.ts +0 -1
- package/scripts/refactor/refactor-lint.ts +0 -2
- package/scripts/refactor/refactor-scan.ts +0 -1
- package/scripts/refactor/refactor-targets.ts +0 -1
- package/scripts/registry-migration/migrate-logic.ts +1 -2
- package/scripts/registry-migration/migrate.ts +19 -9
- package/scripts/release/github-release-cli.ts +8 -6
- package/scripts/release/github-release-environment.ts +46 -0
- package/scripts/release/github-release.ts +151 -94
- package/scripts/release/release-history.ts +0 -1
- package/scripts/release/release-plan.ts +0 -1
- package/scripts/release/release-publish.ts +2 -3
- package/scripts/release/release-scope-cli.ts +1 -2
- package/scripts/release/release-tag.ts +2 -4
- package/scripts/repo/auto-merge-setting-logic.ts +1 -4
- package/scripts/repo/repo-setting.ts +1 -1
- package/scripts/repo/repository-labels.ts +3 -3
- package/scripts/repo/required-checks-logic.ts +206 -0
- package/scripts/repo/required-checks-report.ts +71 -0
- package/scripts/repo/ruleset-check-cli.ts +53 -0
- package/scripts/repo/ruleset-check.ts +147 -0
- package/scripts/report/report-lint-cli.ts +0 -4
- package/scripts/review/disposition-cli.ts +1 -1
- package/scripts/review/live-evidence.ts +1 -1
- package/scripts/review/review-attest-cli.ts +0 -6
- package/scripts/review/review-attest.ts +48 -16
- package/scripts/review/review-brief-cli.ts +72 -8
- package/scripts/review/review-brief.ts +67 -9
- package/scripts/review/review-diff-parts.ts +89 -0
- package/scripts/review/review-diff-write.ts +97 -0
- package/scripts/review/review-finding-ledger.ts +0 -1
- package/scripts/review/review-record-cli.ts +1 -1
- package/scripts/review/review-record.ts +0 -1
- package/scripts/review/review-round2-cli.ts +1 -1
- package/scripts/review/review-stamps.ts +6 -2
- package/scripts/review/review-tree.ts +14 -2
- package/scripts/rules/decision-oracle-stage.ts +18 -0
- package/scripts/rules/decision-oracle.ts +10 -7
- package/scripts/rules/delivered-rules.ts +9 -1
- package/scripts/rules/destructive-command.ts +119 -0
- package/scripts/rules/direct-filing.ts +1 -1
- package/scripts/rules/file-body.ts +0 -3
- package/scripts/rules/filing-cap.ts +0 -2
- package/scripts/rules/gh-api.ts +7 -2
- package/scripts/rules/git-argv.ts +18 -7
- package/scripts/rules/git-force.ts +0 -2
- package/scripts/rules/implementation-cut.ts +1 -2
- package/scripts/rules/index-guard.ts +71 -0
- package/scripts/rules/issue-citation.ts +50 -25
- package/scripts/rules/issue-fold.ts +1 -2
- package/scripts/rules/lane-background.ts +15 -7
- package/scripts/rules/lane-carry-conflict.ts +1 -2
- package/scripts/rules/lane-park.ts +14 -8
- package/scripts/rules/last-prompt.ts +1 -0
- package/scripts/rules/oracle-consulted.ts +1 -1
- package/scripts/rules/oracle-firing.ts +1 -0
- package/scripts/rules/oracle-list-cli.ts +0 -3
- package/scripts/rules/permission-guards.ts +14 -0
- package/scripts/rules/pre-gate-cut.ts +2 -2
- package/scripts/rules/protected-files.ts +74 -0
- package/scripts/rules/reply-language.ts +1 -1
- package/scripts/rules/rule-body-guard.ts +0 -3
- package/scripts/rules/rule-value-cli.ts +0 -1
- package/scripts/rules/shell-body-trigger.ts +0 -1
- package/scripts/rules/shell-segments.ts +0 -1
- package/scripts/rules/stop-rules.ts +13 -5
- package/scripts/rules/tail-commands.ts +1 -1
- package/scripts/rules/test-declared-commit.ts +1 -1
- package/scripts/rules/third-party-write.ts +0 -1
- package/scripts/rules/worktree-guard.ts +26 -9
- package/scripts/run/run-carry-cli.ts +0 -2
- package/scripts/run/run-carry-stash.ts +2 -2
- package/scripts/run/run-carry-streak.ts +1 -1
- package/scripts/run/run-cut-cli.ts +0 -7
- package/scripts/run/run-cut.ts +8 -54
- package/scripts/run/run-ending-cli.ts +1 -1
- package/scripts/run/run-ending.ts +1 -4
- package/scripts/run/run-entry-cli.ts +101 -24
- package/scripts/run/run-entry.ts +0 -1
- package/scripts/run/run-event-cli.ts +0 -2
- package/scripts/run/run-event-follow.ts +1 -0
- package/scripts/run/run-event-render.ts +1 -1
- package/scripts/run/run-event-scope.ts +53 -4
- package/scripts/run/run-event-stream.ts +0 -3
- package/scripts/run/run-event-watch.ts +1 -0
- package/scripts/run/run-halfrun-resume.ts +20 -7
- package/scripts/run/run-headless.ts +24 -8
- package/scripts/run/run-hold-cli.ts +33 -10
- package/scripts/run/run-hold.ts +25 -5
- package/scripts/run/run-issue-number.ts +1 -1
- package/scripts/run/run-liveness-cli.ts +1 -1
- package/scripts/run/run-liveness.ts +2 -3
- package/scripts/run/run-merge-cli.ts +5 -13
- package/scripts/run/run-merge-steps.ts +5 -5
- package/scripts/run/run-merge.ts +1 -1
- package/scripts/run/run-next-cli.ts +1 -1
- package/scripts/run/run-parent-cut-hook.ts +143 -0
- package/scripts/run/run-preflight.ts +2 -9
- package/scripts/run/run-prep-cli.ts +2 -2
- package/scripts/run/run-prep-locate.ts +1 -1
- package/scripts/run/run-progress-cli.ts +4 -7
- package/scripts/run/run-progress-clock.ts +6 -34
- package/scripts/run/run-progress-config.ts +0 -4
- package/scripts/run/run-progress-read.ts +3 -3
- package/scripts/run/run-progress.ts +22 -10
- package/scripts/run/run-prrun-resume.ts +117 -0
- package/scripts/run/run-report-cli.ts +1 -2
- package/scripts/run/run-report.ts +0 -1
- package/scripts/run/run-retrospective.ts +1 -1
- package/scripts/run/run-review-cli.ts +0 -3
- package/scripts/run/run-review-steps.ts +2 -0
- package/scripts/run/run-review.ts +0 -2
- package/scripts/run/run-ship-cli.ts +27 -77
- package/scripts/run/run-ship-detach.ts +1 -0
- package/scripts/run/run-ship-next.ts +106 -0
- package/scripts/run/run-ship-preflight.ts +87 -0
- package/scripts/run/run-ship-return.ts +8 -3
- package/scripts/run/run-ship-review-steps.ts +23 -30
- package/scripts/run/run-ship-review.ts +20 -0
- package/scripts/run/run-ship-scoped.ts +45 -0
- package/scripts/run/run-ship-stage.ts +5 -1
- package/scripts/run/run-ship-steps.ts +105 -0
- package/scripts/run/run-ship.ts +2 -1
- package/scripts/run/run-stage-read.ts +62 -0
- package/scripts/run/run-stage.ts +160 -0
- package/scripts/run/run-status-cli.ts +1 -1
- package/scripts/run/run-step-cli.ts +21 -14
- package/scripts/run/run-step.ts +1 -1
- package/scripts/run/run-stop-notify.ts +1 -3
- package/scripts/run/run-stranded-cli.ts +0 -4
- package/scripts/run/run-stranded-detect.ts +2 -2
- package/scripts/run/run-tail-cli.ts +17 -11
- package/scripts/run/run-tail.ts +2 -0
- package/scripts/run/run-tidy-lanes.ts +2 -1
- package/scripts/run/run-tidy-stashes.ts +12 -12
- package/scripts/run/run-wake-cli.ts +4 -5
- package/scripts/run/run-wake-describe.ts +19 -1
- package/scripts/run/run-wake-loop.ts +2 -2
- package/scripts/run/run-wake.ts +2 -4
- package/scripts/run/run-watcher-guard-cli.ts +0 -4
- package/scripts/run/run-watcher-guard.ts +9 -7
- package/scripts/run/run-watcher-hook.ts +1 -1
- package/scripts/safe-chain/ci-installer-pin.ts +11 -5
- package/scripts/safe-chain/project-config.ts +1 -1
- package/scripts/security/security-audit-provision-logic.ts +0 -1
- package/scripts/security/security-audit-provision.ts +3 -2
- package/scripts/security/security-audit.ts +0 -1
- package/scripts/security/security-updates-logic.ts +0 -1
- package/scripts/sonar/sonar-hotspots-cli.ts +10 -52
- package/scripts/sonar/sonar-hotspots.ts +0 -1
- package/scripts/sonar/sonar-new-code-cli.ts +150 -0
- package/scripts/sonar/sonar-new-code.ts +79 -0
- package/scripts/sonar/sonar-project.ts +97 -0
- package/scripts/split/split-assess-cli.ts +1 -1
- package/scripts/split/split-assess.ts +2 -5
- package/scripts/sync/managed-config-scope-cli.ts +1 -1
- package/scripts/sync/skill-migration.ts +0 -1
- package/scripts/sync/sync-hook-safety.ts +2 -3
- package/scripts/sync/sync.ts +1 -8
- package/scripts/sync/template-source-logic.ts +0 -1
- package/scripts/sync/workflow-pin-logic.ts +16 -28
- package/scripts/test/test-declared-logic.ts +0 -1
- package/scripts/test/test-declared.ts +0 -2
- package/scripts/test/test-red-commit.ts +2 -2
- package/scripts/test/test-red.ts +14 -7
- package/scripts/test/test-type-logic.ts +1 -1
- package/scripts/test/unit-worker-share.ts +7 -16
- package/scripts/time-runtime/time-batch-guard.ts +1 -2
- package/scripts/time-runtime/time-bundle-call.ts +2 -3
- package/scripts/time-runtime/time-bundles.ts +0 -4
- package/scripts/time-runtime/time-density-hook.ts +0 -2
- package/scripts/time-runtime/time-followup-stage.ts +1 -1
- package/scripts/time-runtime/time-format.ts +0 -73
- package/scripts/time-runtime/time-round-trips.ts +0 -4
- package/scripts/time-runtime/time-single-check.ts +1 -1
- package/scripts/time-runtime/time-spans.ts +1 -1
- package/scripts/time-runtime/time-transcript-line.ts +1 -2
- package/scripts/ui/ui-routes-cli.ts +0 -5
- package/scripts/ui/ui-routes.ts +0 -5
- package/scripts/version/effective-upstream.ts +2 -2
- package/scripts/version/latest-corepack.ts +7 -9
- package/scripts/version/latest-scope-cli.ts +0 -2
- package/scripts/version/latest-update.ts +0 -2
- package/scripts/version/npm-registry.ts +97 -0
- package/scripts/version/publishable-range-check.ts +1 -1
- package/scripts/version/release-hold.ts +0 -4
- package/scripts/version/running-binary.ts +2 -2
- package/scripts/version/version-check-logic.ts +0 -2
- package/scripts/version/version-commands.ts +5 -4
- package/scripts/version/version-remote.ts +28 -14
- package/scripts/version/version-targets.ts +4 -4
- package/templates/sonar-project.properties +28 -1
- package/templates/workflows/dependabot-auto-merge.yml +5 -3
- package/templates/workflows/github-release.yml +81 -0
- package/prompts/collaboration-workflow/cross-repo-epic.md +0 -5
- package/prompts/collaboration-workflow/epic-audit.md +0 -5
- package/prompts/collaboration-workflow/epic-bundle.md +0 -5
- package/scripts/init/plugin-install-hint.ts +0 -47
- package/scripts/version/parse-json.ts +0 -13
- /package/scripts/{git → followup}/git-followup-stages.ts +0 -0
- /package/scripts/{git → gh}/git-gh-api-path.ts +0 -0
- /package/scripts/{git → gh}/git-gh-command.ts +0 -0
- /package/scripts/{git → gh}/git-gh-issue-write.ts +0 -0
- /package/scripts/{git → gh}/git-gh-issue.ts +0 -0
- /package/scripts/{git → gh}/git-gh-pr-auto-merge.ts +0 -0
- /package/scripts/{git → gh}/git-gh-pr-snapshot.ts +0 -0
- /package/scripts/{git → gh}/git-gh-reachability.ts +0 -0
- /package/scripts/{git → gh}/git-gh-repo.ts +0 -0
- /package/scripts/{git → gh}/git-gh-rest-state.ts +0 -0
- /package/scripts/{git → gh}/git-pr-checks-watch.ts +0 -0
- /package/scripts/{git → gh}/git-pr-error.ts +0 -0
- /package/scripts/{git → gh}/git-pr-messages.ts +0 -0
- /package/scripts/{git → gh}/github-issue-url.ts +0 -0
- /package/scripts/git/{stash-orphans.ts → stash/stash-orphans.ts} +0 -0
- /package/scripts/{git → issue}/issue-reference.ts +0 -0
- /package/scripts/{git → lib}/animation-helpers.ts +0 -0
- /package/scripts/{git → lib}/git-animation.ts +0 -0
- /package/scripts/{git → notify}/git-notify.ts +0 -0
- /package/scripts/{git → notify}/telegram-test-logic.ts +0 -0
|
@@ -99,6 +99,6 @@ if (process.argv[1] === fileURLToPath(import.meta.url)) {
|
|
|
99
99
|
process.exitCode = await run_related_lint(process.argv.slice(changed_file_scope.ARGV_START))
|
|
100
100
|
}
|
|
101
101
|
|
|
102
|
-
const lint_related = {
|
|
102
|
+
const lint_related = { run_related_lint }
|
|
103
103
|
|
|
104
104
|
export { lint_related }
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { gh_spawn } from '#scripts/gh/gh-spawn'
|
|
2
|
+
import { timed_fetch } from '#scripts/lib/timed-fetch'
|
|
2
3
|
import { z } from 'zod'
|
|
3
4
|
|
|
4
5
|
const TELEGRAM_API_BASE = 'https://api.telegram.org'
|
|
@@ -193,7 +194,7 @@ function build_text(input: TelegramSendInput): string {
|
|
|
193
194
|
|
|
194
195
|
async function post_message(config: TelegramConfig, text: string): Promise<void> {
|
|
195
196
|
const url = `${TELEGRAM_API_BASE}/bot${config.bot_token}/sendMessage`
|
|
196
|
-
const response = await
|
|
197
|
+
const response = await timed_fetch(url, {
|
|
197
198
|
method: 'POST',
|
|
198
199
|
headers: { 'Content-Type': 'application/json' },
|
|
199
200
|
body: JSON.stringify({ chat_id: config.chat_id, text }),
|
|
@@ -412,7 +413,6 @@ async function stranded(input: StrandedInput): Promise<boolean> {
|
|
|
412
413
|
}
|
|
413
414
|
|
|
414
415
|
const telegram_notify = {
|
|
415
|
-
REPO_LOOKUP_TIMEOUT_MS,
|
|
416
416
|
confirm,
|
|
417
417
|
send,
|
|
418
418
|
send_or_report,
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
#!/usr/bin/env tsx
|
|
2
2
|
import { fileURLToPath } from 'node:url'
|
|
3
3
|
import { parseArgs } from 'node:util'
|
|
4
|
+
import { git_gh_issue_read } from '#scripts/gh/git-gh-issue-read'
|
|
5
|
+
import { git_gh_repo } from '#scripts/gh/git-gh-repo'
|
|
6
|
+
import { github_issue_url, type IssueUrlTarget } from '#scripts/gh/github-issue-url'
|
|
7
|
+
import { git_error } from '#scripts/git/git-error'
|
|
4
8
|
import { josh_environment_file } from '#scripts/josh/josh-environment-file'
|
|
5
|
-
import { git_error } from './git-error'
|
|
6
|
-
import { git_gh_issue_read } from './git-gh-issue-read'
|
|
7
|
-
import { git_gh_repo } from './git-gh-repo'
|
|
8
|
-
import { github_issue_url, type IssueUrlTarget } from './github-issue-url'
|
|
9
9
|
import { telegram_notify } from './telegram-notify'
|
|
10
10
|
import { telegram_test_logic, type CliValues, type ResolvedContext } from './telegram-test-logic'
|
|
11
11
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { git_gh_command } from '#scripts/
|
|
2
|
-
import type { OpenPull } from '#scripts/
|
|
3
|
-
import { git_pr_checks } from '#scripts/
|
|
1
|
+
import { git_gh_command } from '#scripts/gh/git-gh-command'
|
|
2
|
+
import type { OpenPull } from '#scripts/gh/git-gh-pr-auto-merge'
|
|
3
|
+
import { git_pr_checks } from '#scripts/gh/git-pr-checks'
|
|
4
4
|
import { error_text } from '#scripts/lib/error-message'
|
|
5
5
|
|
|
6
6
|
// **A flush pull request lands whether or not the flush that opened it is still alive**
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
+
import { git_gh_command } from '#scripts/gh/git-gh-command'
|
|
1
2
|
import { git_command } from '#scripts/git/git-command'
|
|
2
|
-
import { git_gh_command } from '#scripts/git/git-gh-command'
|
|
3
3
|
import { main_sync } from '#scripts/git/main-sync'
|
|
4
4
|
import { error_text } from '#scripts/lib/error-message'
|
|
5
5
|
import { observation_ledger, OBSERVATION_LEDGER_DIRECTORY } from './observation-ledger'
|
|
@@ -308,6 +308,7 @@ async function stage_ledger(): Promise<void> {
|
|
|
308
308
|
const ledger_paths = observation_ledger.ledger_paths(await git_command.status())
|
|
309
309
|
|
|
310
310
|
for (const file_path of ledger_paths) {
|
|
311
|
+
// eslint-disable-next-line no-await-in-loop -- git add holds the index lock, so two at once fail
|
|
311
312
|
await git_command.add_path(file_path)
|
|
312
313
|
}
|
|
313
314
|
}
|
|
@@ -423,7 +424,6 @@ const observations_flush = {
|
|
|
423
424
|
broken_lines_message,
|
|
424
425
|
CLEAN_MESSAGE,
|
|
425
426
|
COMMIT_MESSAGE,
|
|
426
|
-
empty_flush_message,
|
|
427
427
|
flush,
|
|
428
428
|
flush_branch_message,
|
|
429
429
|
has_ledger_change,
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env tsx
|
|
2
2
|
import { fileURLToPath } from 'node:url'
|
|
3
3
|
import { cli_flags } from '#scripts/lib/cli-flags'
|
|
4
|
+
import { timed_fetch } from '#scripts/lib/timed-fetch'
|
|
4
5
|
import { z } from 'zod'
|
|
5
6
|
import {
|
|
6
7
|
package_scout,
|
|
@@ -23,7 +24,6 @@ const SUCCESS_EXIT_CODE = 0
|
|
|
23
24
|
const FAILURE_EXIT_CODE = 1
|
|
24
25
|
const ARGV_OFFSET = 2
|
|
25
26
|
const DEFAULT_SIZE = 10
|
|
26
|
-
const FETCH_TIMEOUT_MS = 10_000
|
|
27
27
|
const REGISTRY = 'https://registry.npmjs.org'
|
|
28
28
|
const DOWNLOADS_API = 'https://api.npmjs.org/downloads/point/last-week'
|
|
29
29
|
const USAGE = 'Usage: josh pkg:scout <keywords> [--size <n>]'
|
|
@@ -51,7 +51,7 @@ type Latest = z.infer<typeof latest_schema>
|
|
|
51
51
|
|
|
52
52
|
async function fetch_json<T>(url: string, schema: z.ZodType<T>): Promise<T | undefined> {
|
|
53
53
|
try {
|
|
54
|
-
const response = await
|
|
54
|
+
const response = await timed_fetch(url)
|
|
55
55
|
if (!response.ok) return undefined
|
|
56
56
|
|
|
57
57
|
return schema.parse(await response.json())
|
|
@@ -172,14 +172,9 @@ async function main(argv: ReadonlyArray<string>): Promise<void> {
|
|
|
172
172
|
|
|
173
173
|
const package_scout_cli = {
|
|
174
174
|
USAGE,
|
|
175
|
-
SEARCH_FAILED_MESSAGE,
|
|
176
175
|
DEFAULT_SIZE,
|
|
177
176
|
read_arguments,
|
|
178
|
-
facts_of,
|
|
179
|
-
license_of,
|
|
180
|
-
to_candidate,
|
|
181
177
|
run,
|
|
182
|
-
main,
|
|
183
178
|
}
|
|
184
179
|
|
|
185
180
|
if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
|
|
@@ -207,7 +207,6 @@ function return_to_default_branch(repository_path: string): boolean {
|
|
|
207
207
|
|
|
208
208
|
const propagate_git = {
|
|
209
209
|
default_branch,
|
|
210
|
-
fetch_branch,
|
|
211
210
|
return_to_default_branch,
|
|
212
211
|
current_branch,
|
|
213
212
|
commit_ahead,
|
|
@@ -215,7 +214,6 @@ const propagate_git = {
|
|
|
215
214
|
has_pre_push_hook,
|
|
216
215
|
can_push_without_hooks,
|
|
217
216
|
is_clean,
|
|
218
|
-
is_up_to_date,
|
|
219
217
|
decide_tree_state,
|
|
220
218
|
tree_state,
|
|
221
219
|
}
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
import { adopt_toolkits } from '#scripts/adopt/adopt-toolkits'
|
|
2
|
+
import { propagate_run, type RunStep, type StepResult } from './propagate-run'
|
|
3
|
+
import { propagate_steps, type Release, type ReleasePlan } from './propagate-steps'
|
|
4
|
+
import { propagate_targets, type Manifest, type PropagateTarget } from './propagate-targets'
|
|
5
|
+
|
|
6
|
+
// What one `josh propagate` run carries, decided from the repository it runs in (joshuafolkken/kit#2879).
|
|
7
|
+
//
|
|
8
|
+
// The supplier is kit or any toolkit built on it — app-kit, game-kit — and a toolkit's propagation
|
|
9
|
+
// carries the base packages under it too, at the versions that toolkit itself has installed and was
|
|
10
|
+
// verified with rather than at the base's newest. Each consumer is delivered by the topmost toolkit
|
|
11
|
+
// it installs: a lower supplier skips it, because syncing only the base would write the overlay's
|
|
12
|
+
// paths back to the base's originals (`docs/sync.md` → base first, overlay after), and would hand the
|
|
13
|
+
// consumer a base the toolkit above it never verified. Discovery, ordering and the CLI name are
|
|
14
|
+
// `josh adopt`'s own reads (`scripts/adopt/adopt-toolkits.ts`), not a second copy of them.
|
|
15
|
+
|
|
16
|
+
const REFUSAL_PREFIX = 'Refusing to propagate:'
|
|
17
|
+
const SUPPLIER_REFUSAL = [
|
|
18
|
+
`${REFUSAL_PREFIX} this is not a ${adopt_toolkits.TOOLKIT_SCOPE} toolkit's own repository.`,
|
|
19
|
+
'Propagation carries a published release outward, so it runs from the toolkit that published it',
|
|
20
|
+
'— kit, or a toolkit built on it that ships a CLI. Run it from that checkout instead.',
|
|
21
|
+
].join('\n')
|
|
22
|
+
const UNRESOLVED_CAUSE =
|
|
23
|
+
'declared here but not installed with a runnable CLI, so the consumers would receive this toolkit without it. Run `pnpm install`.'
|
|
24
|
+
const MISPLACED_CAUSE =
|
|
25
|
+
'declared under `dependencies`, which leaves it out of the plan. Move it to `devDependencies`.'
|
|
26
|
+
const ARROW = ' → '
|
|
27
|
+
const LIST_SEPARATOR = ', '
|
|
28
|
+
|
|
29
|
+
interface Supplier {
|
|
30
|
+
package_name: string
|
|
31
|
+
bin_name: string
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
interface SupplierResolution {
|
|
35
|
+
supplier?: Supplier
|
|
36
|
+
refusal?: string
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
interface BaseResolution {
|
|
40
|
+
bases?: Array<Release>
|
|
41
|
+
cause?: string
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
interface PlanResolution {
|
|
45
|
+
plan?: ReleasePlan
|
|
46
|
+
refusal?: string
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// A toolkit is a scoped package that ships a CLI — the same reading `josh adopt` applies to an
|
|
50
|
+
// installed one, applied here to the repository's own manifest.
|
|
51
|
+
function toolkit_name(manifest: Manifest): string | undefined {
|
|
52
|
+
const { name } = manifest
|
|
53
|
+
|
|
54
|
+
return name !== undefined && adopt_toolkits.is_toolkit_package(name) ? name : undefined
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
function supplier_of(manifest: Manifest | undefined): Supplier | undefined {
|
|
58
|
+
const package_name = manifest === undefined ? undefined : toolkit_name(manifest)
|
|
59
|
+
if (manifest === undefined || package_name === undefined) return undefined
|
|
60
|
+
const bin_name = adopt_toolkits.bin_name_of(package_name, manifest)
|
|
61
|
+
|
|
62
|
+
return bin_name === undefined ? undefined : { package_name, bin_name }
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
function resolve_supplier(project_root: string): SupplierResolution {
|
|
66
|
+
const supplier = supplier_of(propagate_targets.read_manifest(project_root))
|
|
67
|
+
|
|
68
|
+
return supplier === undefined ? { refusal: SUPPLIER_REFUSAL } : { supplier }
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// A base toolkit pinned to the version installed in the supplier's own checkout — the one the
|
|
72
|
+
// supplier's verification gate ran against.
|
|
73
|
+
function pin_installed(project_root: string, release: Release): Release | undefined {
|
|
74
|
+
const version = propagate_targets.installed_version(project_root, release.package_name)
|
|
75
|
+
|
|
76
|
+
return version === undefined ? undefined : { ...release, version }
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// Why a declared base toolkit would fall out of the plan, naming it — either way `josh adopt` refuses
|
|
80
|
+
// one for (joshuafolkken/kit#1540). A base left out is not merely left behind: every consumer that
|
|
81
|
+
// installs it would then read it as a toolkit above this one and be skipped.
|
|
82
|
+
function incomplete_cause(project_root: string): string | undefined {
|
|
83
|
+
const misplaced = adopt_toolkits.misplaced_toolkits(project_root)
|
|
84
|
+
if (misplaced.length > 0) return `${misplaced.join(LIST_SEPARATOR)} — ${MISPLACED_CAUSE}`
|
|
85
|
+
const unresolved = adopt_toolkits.unresolved_toolkits(project_root)
|
|
86
|
+
|
|
87
|
+
return unresolved.length === 0
|
|
88
|
+
? undefined
|
|
89
|
+
: `${unresolved.join(LIST_SEPARATOR)} — ${UNRESOLVED_CAUSE}`
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// The supplier's base toolkits, base first, or the names that cannot be carried.
|
|
93
|
+
function base_releases(project_root: string, supplier: Supplier): BaseResolution {
|
|
94
|
+
const cause = incomplete_cause(project_root)
|
|
95
|
+
if (cause !== undefined) return { cause }
|
|
96
|
+
|
|
97
|
+
const bases = adopt_toolkits
|
|
98
|
+
.discover_toolkits(project_root)
|
|
99
|
+
.filter((release) => release.package_name !== supplier.package_name)
|
|
100
|
+
.map((release) => pin_installed(project_root, release))
|
|
101
|
+
|
|
102
|
+
return bases.every((release) => release !== undefined) ? { bases } : { cause: UNRESOLVED_CAUSE }
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// The releases one run carries: the base toolkits first, then the supplier at its own version, so the
|
|
106
|
+
// sync runs base first and the supplier's overlay is written last.
|
|
107
|
+
function build_plan(project_root: string, version: string): PlanResolution {
|
|
108
|
+
const { supplier, refusal } = resolve_supplier(project_root)
|
|
109
|
+
if (supplier === undefined) return { refusal: refusal ?? SUPPLIER_REFUSAL }
|
|
110
|
+
const { bases, cause } = base_releases(project_root, supplier)
|
|
111
|
+
if (bases === undefined) return { refusal: `${REFUSAL_PREFIX} ${cause ?? UNRESOLVED_CAUSE}` }
|
|
112
|
+
const releases = [...bases, { ...supplier, version }]
|
|
113
|
+
|
|
114
|
+
return { plan: { releases, origin: propagate_steps.PROPAGATE_ORIGIN } }
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// The package the run publishes and waits for — by construction the plan's last release.
|
|
118
|
+
function supplier_name(plan: ReleasePlan): string {
|
|
119
|
+
return plan.releases.at(-1)?.package_name ?? ''
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
// A declared scoped package counts as a toolkit unless it is demonstrably a library: installed, and
|
|
123
|
+
// shipping no CLI. One that is not installed yet cannot be told apart, and treating it as a toolkit
|
|
124
|
+
// errs toward leaving the consumer to the propagation above rather than reverting its overlay.
|
|
125
|
+
function may_be_toolkit(repository_path: string, package_name: string): boolean {
|
|
126
|
+
if (adopt_toolkits.read_bin_name(repository_path, package_name) !== undefined) return true
|
|
127
|
+
|
|
128
|
+
return adopt_toolkits.is_unreachable_toolkit(repository_path, package_name)
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
function carriers_of(target: PropagateTarget, plan: ReleasePlan): Array<string> {
|
|
132
|
+
const carried = new Set(plan.releases.map((release) => release.package_name))
|
|
133
|
+
|
|
134
|
+
return adopt_toolkits
|
|
135
|
+
.all_declared_toolkits(target.path)
|
|
136
|
+
.filter((name) => !carried.has(name) && may_be_toolkit(target.path, name))
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
// A consumer that installs a toolkit this run does not carry is left to that toolkit's propagation.
|
|
140
|
+
// Only a candidate that would otherwise be processed or reported current is re-classified.
|
|
141
|
+
function mark_carried(target: PropagateTarget, plan: ReleasePlan): PropagateTarget {
|
|
142
|
+
if (target.state !== 'ready' && target.state !== 'up_to_date') return target
|
|
143
|
+
const carriers = carriers_of(target, plan)
|
|
144
|
+
|
|
145
|
+
return carriers.length === 0 ? target : { ...target, state: 'carried_above', carriers }
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
// What the dry run prints for the two steps that repeat per release: the versions each package is
|
|
149
|
+
// pinned to, and the sync order.
|
|
150
|
+
function plan_details(plan: ReleasePlan): Readonly<Record<string, string>> {
|
|
151
|
+
return {
|
|
152
|
+
[propagate_run.STEP_UPGRADE]: plan.releases
|
|
153
|
+
.map((release) => `${release.package_name}@${release.version}`)
|
|
154
|
+
.join(LIST_SEPARATOR),
|
|
155
|
+
[propagate_run.STEP_SYNC]: propagate_steps
|
|
156
|
+
.sync_commands(plan)
|
|
157
|
+
.map(({ command }) => command.join(' '))
|
|
158
|
+
.join(ARROW),
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
// The dry-run runner: it reports what each step would do and touches nothing.
|
|
163
|
+
function create_step_describer(plan: ReleasePlan): RunStep {
|
|
164
|
+
const details = plan_details(plan)
|
|
165
|
+
|
|
166
|
+
return (target: PropagateTarget, step: string): StepResult => {
|
|
167
|
+
const detail = details[step]
|
|
168
|
+
const suffix = detail === undefined ? '' : `: ${detail}`
|
|
169
|
+
|
|
170
|
+
console.info(` ${target.repo}: would run ${step}${suffix}`)
|
|
171
|
+
|
|
172
|
+
return { step, is_ok: true }
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
const propagate_plan = {
|
|
177
|
+
resolve_supplier,
|
|
178
|
+
build_plan,
|
|
179
|
+
supplier_name,
|
|
180
|
+
mark_carried,
|
|
181
|
+
create_step_describer,
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
export type { Supplier }
|
|
185
|
+
export { propagate_plan }
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { git_gh_exec } from '#scripts/
|
|
1
|
+
import { git_gh_exec } from '#scripts/gh/git-gh-exec'
|
|
2
2
|
import { poll } from '#scripts/lib/poll'
|
|
3
3
|
import { with_page_size } from '#scripts/version/version-remote'
|
|
4
4
|
|
|
@@ -161,6 +161,7 @@ async function wait_for_publish(
|
|
|
161
161
|
const { state } = probe_once(resolved, versions_endpoint, target_version, progress)
|
|
162
162
|
|
|
163
163
|
if (state !== undefined) return finish(state, target_version, progress.attempts)
|
|
164
|
+
// eslint-disable-next-line no-await-in-loop -- polling: each read waits on the state the previous one saw
|
|
164
165
|
await resolved.sleep(resolved.interval_ms)
|
|
165
166
|
}
|
|
166
167
|
|
|
@@ -168,8 +169,6 @@ async function wait_for_publish(
|
|
|
168
169
|
}
|
|
169
170
|
|
|
170
171
|
const propagate_publish = {
|
|
171
|
-
DEFAULT_TIMEOUT_MS,
|
|
172
|
-
DEFAULT_INTERVAL_MS,
|
|
173
172
|
UNREADABLE_THRESHOLD,
|
|
174
173
|
is_version_published,
|
|
175
174
|
should_keep_waiting,
|
|
@@ -65,13 +65,17 @@ const SKIP_REASONS: Readonly<Record<string, string>> = {
|
|
|
65
65
|
missing_checkout: 'no local checkout at the mapped path — reported, not cloned',
|
|
66
66
|
unreadable: 'package.json could not be read',
|
|
67
67
|
not_selected: 'not the repository --target named',
|
|
68
|
+
carried_above: 'delivered by the propagation of a toolkit above this one',
|
|
68
69
|
}
|
|
69
70
|
|
|
70
71
|
// The reason text for a candidate that is not going to be processed. A missing local checkout is
|
|
71
72
|
// reported rather than cloned: propagation writes to a working tree, and creating one nobody asked
|
|
72
73
|
// for is not a step this command may take on its own.
|
|
73
74
|
function skip_reason(target: PropagateTarget): string {
|
|
74
|
-
|
|
75
|
+
const reason = SKIP_REASONS[target.state] ?? 'not eligible'
|
|
76
|
+
if (target.carriers === undefined) return reason
|
|
77
|
+
|
|
78
|
+
return `${reason}: ${target.carriers.join(', ')}`
|
|
75
79
|
}
|
|
76
80
|
|
|
77
81
|
const LEFTOVER_NOTE = 'upgrade/sync changes left uncommitted'
|
|
@@ -185,8 +189,6 @@ function format_report(results: ReadonlyArray<TargetResult>): string {
|
|
|
185
189
|
const propagate_run = {
|
|
186
190
|
PROPAGATED_REASON,
|
|
187
191
|
LEFTOVER_NOTE,
|
|
188
|
-
has_leftover_changes,
|
|
189
|
-
leftover_of,
|
|
190
192
|
STEP_RETURN,
|
|
191
193
|
STEP_PRECHECK,
|
|
192
194
|
STEP_ISSUE,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { pr_classification } from '#scripts/ci/pr-classification'
|
|
2
|
-
import { git_gh_exec } from '#scripts/
|
|
3
|
-
import { git_gh_issue_write } from '#scripts/
|
|
4
|
-
import { OTHER_CHANGE_LABEL } from '#scripts/
|
|
2
|
+
import { git_gh_exec } from '#scripts/gh/git-gh-exec'
|
|
3
|
+
import { git_gh_issue_write } from '#scripts/gh/git-gh-issue-write'
|
|
4
|
+
import { OTHER_CHANGE_LABEL } from '#scripts/issue/issue-labels'
|
|
5
5
|
import { GATE_COMMAND } from '#scripts/josh/josh-command-types'
|
|
6
6
|
import { error_text } from '#scripts/lib/error-message'
|
|
7
7
|
import { build_upgrade_shell_command } from '#scripts/version/upgrade-shell-command'
|
|
@@ -88,13 +88,28 @@ function release_names(releases: ReadonlyArray<Release>): string {
|
|
|
88
88
|
return `${names.slice(0, -1).join(NAME_SEPARATOR)}${LAST_SEPARATOR}${last}`
|
|
89
89
|
}
|
|
90
90
|
|
|
91
|
+
// Each release with its own version, for a plan whose releases disagree on one — a toolkit's
|
|
92
|
+
// propagation carries the base packages at the versions that toolkit was verified with
|
|
93
|
+
// (joshuafolkken/kit#2879), so one shared "to <version>" would name a version most of them are not.
|
|
94
|
+
function versioned_names(releases: ReadonlyArray<Release>): string {
|
|
95
|
+
const named = releases.map((release) => ({
|
|
96
|
+
...release,
|
|
97
|
+
package_name: `${release.package_name} to ${release.version}`,
|
|
98
|
+
}))
|
|
99
|
+
|
|
100
|
+
return `Upgrade ${release_names(named)}`
|
|
101
|
+
}
|
|
102
|
+
|
|
91
103
|
// One release reproduces `issue_title` exactly, which is what keeps a `propagate` run's issue title
|
|
92
104
|
// unchanged by the generalization.
|
|
93
105
|
function plan_title(releases: ReadonlyArray<Release>): string {
|
|
94
106
|
const [first] = releases
|
|
95
107
|
if (first === undefined) return EMPTY_PLAN_TITLE
|
|
108
|
+
const is_one_version = releases.every((release) => release.version === first.version)
|
|
96
109
|
|
|
97
|
-
return
|
|
110
|
+
return is_one_version
|
|
111
|
+
? issue_title(release_names(releases), first.version)
|
|
112
|
+
: versioned_names(releases)
|
|
98
113
|
}
|
|
99
114
|
|
|
100
115
|
function plan_body(plan: ReleasePlan): string {
|
|
@@ -413,14 +428,12 @@ function describe_step(target: PropagateTarget, step: string): StepResult {
|
|
|
413
428
|
}
|
|
414
429
|
|
|
415
430
|
const propagate_steps = {
|
|
416
|
-
STEP_COMMANDS,
|
|
417
431
|
JOSH_BIN,
|
|
418
432
|
PROPAGATE_ORIGIN,
|
|
419
433
|
sync_command,
|
|
420
434
|
upgrade_command,
|
|
421
435
|
upgrade_commands,
|
|
422
436
|
sync_commands,
|
|
423
|
-
return_step,
|
|
424
437
|
VERIFY_SCRIPT,
|
|
425
438
|
issue_title,
|
|
426
439
|
issue_body,
|
|
@@ -20,9 +20,17 @@ 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 (joshuafolkken/kit#2755).
|
|
23
|
+
// after classification: a candidate `--target` left out (joshuafolkken/kit#2755). `carried_above` is
|
|
24
|
+
// the other: a consumer that installs a toolkit above the supplier, which that toolkit's own
|
|
25
|
+
// propagation delivers instead (joshuafolkken/kit#2879).
|
|
24
26
|
type TargetState =
|
|
25
|
-
|
|
27
|
+
| 'ready'
|
|
28
|
+
| 'up_to_date'
|
|
29
|
+
| 'not_downstream'
|
|
30
|
+
| 'missing_checkout'
|
|
31
|
+
| 'unreadable'
|
|
32
|
+
| 'not_selected'
|
|
33
|
+
| 'carried_above'
|
|
26
34
|
|
|
27
35
|
interface PropagateTarget {
|
|
28
36
|
repo: string
|
|
@@ -31,6 +39,9 @@ interface PropagateTarget {
|
|
|
31
39
|
// The range the consumer currently declares, when it declares one at all. Reported so a skip can
|
|
32
40
|
// say what it skipped rather than only that it did.
|
|
33
41
|
declared_range?: string
|
|
42
|
+
// The toolkits above the supplier this consumer installs, when it is `carried_above` — named in
|
|
43
|
+
// the skip so the report says which propagation will deliver it.
|
|
44
|
+
carriers?: ReadonlyArray<string>
|
|
34
45
|
}
|
|
35
46
|
|
|
36
47
|
// Only the fields propagation reads. `passthrough` is deliberate — a consumer manifest carries far
|
|
@@ -148,11 +159,7 @@ function resolve_targets(
|
|
|
148
159
|
}
|
|
149
160
|
|
|
150
161
|
const propagate_targets = {
|
|
151
|
-
has_checkout,
|
|
152
162
|
read_manifest,
|
|
153
|
-
classify_manifest_absence,
|
|
154
|
-
classify_before_dependency,
|
|
155
|
-
declared_range,
|
|
156
163
|
installed_version,
|
|
157
164
|
classify_target,
|
|
158
165
|
resolve_targets,
|