@joshuafolkken/kit 1.1784.0 → 1.2116.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/reviewer-verification.md +19 -0
- package/.claude/agents/reviewer.md +19 -0
- package/.claude/settings.json +5 -6
- package/.claude/skills/dependency-update/SKILL.md +9 -10
- package/.claude/skills/workflow-commands/SKILL.md +6 -6
- package/.claude/skills/workflow-commands/background-commands.md +8 -5
- package/.claude/skills/workflow-commands/backlogrun-child.md +3 -1
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +1 -1
- package/.claude/skills/workflow-commands/backlogrun-park.md +5 -2
- package/.claude/skills/workflow-commands/backlogrun-progress.md +2 -3
- package/.claude/skills/workflow-commands/backlogrun-recovery.md +1 -1
- package/.claude/skills/workflow-commands/backlogrun-steps.md +3 -2
- package/.claude/skills/workflow-commands/backlogrun.md +1 -1
- package/.claude/skills/workflow-commands/chain-rule.md +41 -32
- package/.claude/skills/workflow-commands/delegation.md +6 -6
- package/.claude/skills/workflow-commands/entry-sequence.md +2 -2
- package/.claude/skills/workflow-commands/followup.md +7 -5
- package/.claude/skills/workflow-commands/fullrun-steps.md +6 -6
- package/.claude/skills/workflow-commands/fullrun.md +1 -1
- package/.claude/skills/workflow-commands/issue-comments.md +9 -4
- package/.claude/skills/workflow-commands/issue-fold-existing.md +2 -1
- package/.claude/skills/workflow-commands/kickoff.md +2 -2
- package/.claude/skills/workflow-commands/observation-filing.md +1 -1
- package/.claude/skills/workflow-commands/observation-ledger.md +6 -4
- package/.claude/skills/workflow-commands/pre-gate-cut.md +9 -7
- package/.claude/skills/workflow-commands/prerequisite.md +3 -2
- package/.claude/skills/workflow-commands/retrospective.md +2 -2
- package/.claude/skills/workflow-commands/split-assessment.md +7 -5
- package/.codex/hooks.json +5 -5
- package/.github/actions/setup-pnpm/action.yml +9 -16
- package/.github/dependabot.yml +16 -0
- package/.github/workflows/auto-tag.yml +45 -0
- package/.github/workflows/ci.yml +155 -15
- package/.github/workflows/dependabot-auto-merge.yml +63 -4
- package/.github/workflows/production.yml +8 -0
- package/.github/workflows/publish.yml +60 -45
- package/.vscode/settings.json +19 -0
- package/CLAUDE.md +5 -12
- package/SECURITY.md +2 -2
- package/dist/CLAUDE.md +5 -12
- package/dist/commands/document-read-cli.js +2 -1
- package/dist/commands/document-section-main.js +2 -1
- package/dist/commands/read-set-cli.js +194 -134
- package/dist/commands/run-prep-main.js +9694 -10173
- package/dist/commands/run-step-cli.js +22138 -18285
- package/dist/hooks/audit-provision.js +23 -5
- package/dist/hooks/chunk-3GKE653K.js +6204 -0
- package/dist/hooks/chunk-45CJJOO7.js +1243 -0
- package/dist/hooks/{chunk-CWMBGKYW.js → chunk-5PM2JRGV.js} +2153 -856
- package/dist/hooks/{chunk-WR2KQAYZ.js → chunk-7SIUNQXK.js} +1207 -1470
- package/dist/hooks/{chunk-O2YBIDSI.js → chunk-CQD4LJE6.js} +1682 -1130
- package/dist/hooks/{chunk-VWWCFGWK.js → chunk-OPSRGWFU.js} +1 -1
- package/dist/hooks/{chunk-XGBNSWEI.js → chunk-UJ3FPMMM.js} +132 -49
- package/dist/hooks/chunk-VVNYJWEI.js +30 -0
- package/dist/hooks/chunk-Z6DQJKH3.js +2806 -0
- package/dist/hooks/codex-hook-adapter.js +8 -8
- package/dist/hooks/format-edited.js +4 -5
- package/dist/hooks/inputs.json +386 -360
- package/dist/hooks/pretool-guard.js +7 -6
- package/dist/hooks/session-lang.js +101 -258
- package/dist/hooks/stop-guard.js +1744 -2576
- package/dist/josh.js +7133 -6368
- package/dist/version/index.js +161 -1
- package/eslint/rules/comment-why-only.js +108 -0
- package/package.json +16 -9
- package/prompts/coding-standards.md +1 -1
- package/prompts/collaboration-workflow/file-edits.md +14 -11
- package/prompts/collaboration-workflow/issue-citation.md +0 -4
- package/prompts/collaboration-workflow/issue-template.md +40 -21
- package/prompts/collaboration-workflow/lane-instructions.md +3 -1
- package/prompts/collaboration-workflow/measurement.md +8 -1
- package/prompts/collaboration-workflow/operating-rules.md +11 -2
- package/prompts/collaboration-workflow/output-bounds.md +6 -2
- package/prompts/collaboration-workflow/plan-comment.md +1 -1
- package/prompts/collaboration-workflow/principles.md +9 -0
- package/prompts/collaboration-workflow/residency.md +3 -2
- package/prompts/collaboration-workflow/rule-delivery.md +13 -1
- package/prompts/collaboration-workflow/upstream-interrupt.md +2 -2
- package/prompts/collaboration-workflow/wip-cap.md +3 -1
- package/prompts/review-rubric.md +8 -0
- package/prompts/review.md +31 -22
- package/prompts/testing-guide.md +1 -0
- package/scripts/agent/agent-argv.ts +14 -16
- package/scripts/agent/agent-provider.ts +138 -0
- package/scripts/agent/agent-role-profile.ts +108 -156
- package/scripts/agent/agent-safe-text.ts +20 -5
- package/scripts/agent/api-usage-limit.ts +65 -0
- package/scripts/agent/claude-agent-argv.ts +19 -9
- package/scripts/agent/codex-agent-argv.ts +118 -22
- package/scripts/agent/usage-limit-reset.ts +179 -0
- package/scripts/auth/claude-token-output.ts +2 -2
- package/scripts/auto-ok/auto-ok-author.ts +53 -0
- package/scripts/auto-ok/auto-ok-cli.ts +20 -9
- package/scripts/backlog/backlog-defect-priority.ts +1 -1
- package/scripts/backlog/backlog-drive-cli.ts +6 -1
- package/scripts/backlog/backlog-drive-hold.ts +3 -3
- package/scripts/backlog/backlog-drive-idle.ts +10 -0
- package/scripts/backlog/backlog-drive-launch-pass.ts +90 -0
- package/scripts/backlog/backlog-drive-launch.ts +8 -2
- package/scripts/backlog/backlog-drive-named-offer.ts +73 -30
- package/scripts/backlog/backlog-drive-named.ts +28 -7
- package/scripts/backlog/backlog-drive-paused.ts +5 -4
- package/scripts/backlog/backlog-drive-restore.ts +11 -3
- package/scripts/backlog/backlog-drive.ts +21 -60
- package/scripts/backlog/backlog-gate-scope.ts +61 -0
- package/scripts/backlog/backlog-measure-close.ts +112 -0
- package/scripts/backlog/backlog-next.ts +39 -49
- package/scripts/backlog/backlog-occupied.ts +2 -2
- package/scripts/backlog/backlog-overlap.ts +42 -8
- package/scripts/backlog/backlog-plan-cli.ts +4 -1
- package/scripts/backlog/backlog-plan-comment.ts +81 -0
- package/scripts/backlog/backlog-plan-read.ts +19 -6
- package/scripts/backlog/backlog-pool.ts +50 -12
- package/scripts/backlog/backlog-rank.ts +60 -13
- package/scripts/backlog/backlog-stalled-detect.ts +2 -1
- package/scripts/backlog/backlog-waves.ts +17 -2
- package/scripts/backlog/backlogrun-launch.ts +7 -4
- package/scripts/cost-runtime/context-cut-payback.ts +27 -25
- package/scripts/cost-runtime/cost-cli.ts +37 -16
- package/scripts/cost-runtime/cost-pricing.ts +9 -0
- package/scripts/cost-runtime/cost-verdict.ts +4 -1
- package/scripts/delegation/delegation-policy.ts +2 -2
- package/scripts/delegation/duplicate-read-guard.ts +1 -0
- package/scripts/delegation/investigation-guard.ts +14 -2
- package/scripts/delegation/investigation-reads.ts +45 -23
- package/scripts/dependabot/dependabot-cooldown.ts +3 -2
- package/scripts/discovery/repo-party.ts +80 -20
- package/scripts/discovery/session-owner-pin.ts +51 -0
- package/scripts/document/capped-print.ts +1 -1
- package/scripts/document/command-reference-line-budget.ts +42 -0
- package/scripts/document/document-byte-budget.ts +17 -7
- package/scripts/document/document-checks.ts +20 -0
- package/scripts/document/document-ratchet-check.ts +101 -0
- package/scripts/document/document-section.ts +1 -0
- package/scripts/document/entry-read-budget.ts +7 -3
- package/scripts/document/issue-citation-budget.ts +94 -0
- package/scripts/epic/epic-cli-argv.ts +2 -2
- package/scripts/epic/epic-fetch.ts +4 -2
- package/scripts/epic/epic-graph.ts +7 -2
- package/scripts/epic/epic-issue.ts +3 -1
- package/scripts/epic/epic-rank.ts +5 -0
- package/scripts/exports/unused-members-check.ts +62 -0
- package/scripts/exports/unused-members-cli.ts +6 -51
- package/scripts/followup/followup-ci-path.ts +67 -0
- package/scripts/followup/followup-coderabbit-retrigger.ts +261 -0
- package/scripts/followup/followup-coderabbit-wait.ts +13 -10
- package/scripts/followup/followup-failed-tests.ts +160 -0
- package/scripts/followup/followup-job-needs.ts +100 -0
- package/scripts/followup/followup-job-rerun.ts +303 -0
- package/scripts/followup/followup-main-move.ts +113 -0
- package/scripts/followup/git-followup-finish.ts +43 -11
- package/scripts/followup/git-followup-pending.ts +3 -3
- package/scripts/followup/git-followup-stages.ts +41 -11
- package/scripts/followup/git-pr-followup-checks.ts +55 -16
- package/scripts/followup/git-pr-followup-wrapup.ts +24 -5
- package/scripts/followup/git-pr-followup.ts +62 -27
- package/scripts/fresh-machine/fresh-machine-script.ts +5 -9
- package/scripts/fresh-machine/specs/kit-test-backlogrun-python.json +2 -2
- package/scripts/fresh-machine/specs/kit-test-backlogrun.json +2 -2
- package/scripts/gate/busy-average.ts +34 -2
- package/scripts/gate/check-related-pinned.ts +43 -0
- package/scripts/gate/check-related-reuse.ts +64 -0
- package/scripts/gate/check-related-section.ts +57 -0
- package/scripts/gate/check-related-unplanned.ts +34 -0
- package/scripts/gate/check-related.ts +265 -0
- package/scripts/gate/command-memory.ts +1 -1
- package/scripts/gate/core-admission.ts +24 -6
- package/scripts/gate/core-budget-timing.ts +20 -6
- package/scripts/gate/core-budget.ts +40 -11
- package/scripts/gate/core-wait-record.ts +3 -2
- package/scripts/gate/core-wait.ts +25 -2
- package/scripts/gate/core-weights.ts +15 -7
- package/scripts/gate/gate-labels.ts +46 -0
- package/scripts/gate/gate-ledger.ts +14 -6
- package/scripts/gate/gate-plan.ts +103 -58
- package/scripts/gate/gate-report.ts +9 -7
- package/scripts/gate/gate-run-steps.ts +26 -3
- package/scripts/gate/gate-skip.ts +45 -6
- package/scripts/gate/gate-static-group.ts +60 -0
- package/scripts/gate/gate-steps.ts +2 -1
- package/scripts/gate/gate-tree.ts +4 -2
- package/scripts/gate/hook-gate-reuse.ts +19 -2
- package/scripts/gate/metrics-totals.ts +59 -0
- package/scripts/gate/scoped-green.ts +68 -15
- package/scripts/gate/since-green.ts +14 -6
- package/scripts/gate/structural-checks.ts +96 -0
- package/scripts/gate/verification-gate.ts +51 -16
- package/scripts/gate/verification-inputs.ts +21 -6
- package/scripts/gate/verification-tail.ts +52 -0
- package/scripts/gh/gh-author-association.ts +23 -2
- package/scripts/gh/git-ai-review-scan.ts +1 -1
- package/scripts/gh/git-gh-api-path.ts +12 -3
- package/scripts/gh/git-gh-comments-unreadable.ts +36 -0
- package/scripts/gh/git-gh-exec.ts +32 -2
- package/scripts/gh/git-gh-issue-read.ts +4 -2
- package/scripts/gh/git-gh-issue-rest.ts +1 -0
- package/scripts/gh/git-gh-issue-write.ts +8 -2
- package/scripts/gh/git-gh-issue.ts +12 -5
- package/scripts/gh/git-gh-pr-auto-merge.ts +13 -6
- package/scripts/gh/git-gh-pr-graphql-state.ts +56 -0
- package/scripts/gh/git-gh-pr-read.ts +74 -13
- package/scripts/gh/git-gh-pr-rest.ts +3 -1
- package/scripts/gh/git-gh-pr-snapshot.ts +22 -7
- package/scripts/gh/git-gh-pr-too-large.ts +20 -0
- package/scripts/gh/git-gh-pr.ts +21 -7
- package/scripts/gh/git-gh-retry.ts +141 -0
- package/scripts/gh/git-pr-ai-review.ts +15 -6
- package/scripts/gh/git-pr-checks-eval.ts +3 -0
- package/scripts/gh/git-pr-checks.ts +5 -5
- package/scripts/git/base-tree.ts +30 -0
- package/scripts/git/change-base.ts +4 -10
- package/scripts/git/changed-paths-sync.ts +63 -0
- package/scripts/git/changed-paths.ts +16 -1
- package/scripts/git/git-common-directory.ts +11 -1
- package/scripts/git/git-diff-reads.ts +66 -20
- package/scripts/git/git-error.ts +9 -2
- package/scripts/git/git-schemas.ts +13 -0
- package/scripts/git/git-worktree.ts +13 -0
- package/scripts/git/gone-branch.ts +4 -1
- package/scripts/git/main-merge-budget-conflict.ts +89 -0
- package/scripts/git/main-merge-guard.ts +55 -18
- package/scripts/git/main-merge-regenerate.ts +59 -25
- package/scripts/git/main-merge.ts +53 -5
- package/scripts/git/no-base-checkout.ts +127 -0
- package/scripts/git/stash/git-stash.ts +11 -2
- package/scripts/git/stash/stash-push-cli.ts +10 -0
- package/scripts/hooks/batch-guard.ts +40 -21
- package/scripts/hooks/edited-cspell.ts +37 -11
- package/scripts/hooks/format-edited-file.ts +22 -2
- package/scripts/hooks/lane-plan-guard.ts +50 -0
- package/scripts/hooks/pre-commit-lint-switch.ts +9 -0
- package/scripts/hooks/pre-commit-lint.ts +14 -1
- package/scripts/hooks/pre-push-related-switch.ts +10 -0
- package/scripts/hooks/pre-push-unit.ts +76 -10
- package/scripts/hooks/pretool-guard.ts +2 -0
- package/scripts/hooks/reserved-run.ts +14 -1
- package/scripts/hooks/run-hook.sh +23 -8
- package/scripts/hooks/step-zero-notice.ts +6 -1
- package/scripts/hooks/stop-actions.ts +3 -15
- package/scripts/hooks/stop-guard.ts +7 -6
- package/scripts/init/distributed-paths.ts +1 -0
- package/scripts/init/hook-command-rewrite.ts +5 -1
- package/scripts/init/hook-launch.ts +4 -2
- package/scripts/issue/aggregation-split.ts +52 -0
- package/scripts/issue/defect-origin-line.ts +19 -1
- package/scripts/issue/defect-rate-cli.ts +5 -102
- package/scripts/issue/defect-report.ts +4 -4
- package/scripts/issue/effect-audit-cli.ts +178 -0
- package/scripts/issue/effect-audit.ts +185 -0
- package/scripts/issue/expected-effect-lint.ts +64 -9
- package/scripts/issue/git-next-issues.ts +5 -0
- package/scripts/issue/issue-body-or-comment.ts +38 -4
- package/scripts/issue/issue-cite-cli.ts +1 -3
- package/scripts/issue/issue-classification.ts +1 -0
- package/scripts/issue/issue-closing-pr.ts +8 -1
- package/scripts/issue/issue-evidence-exit.ts +4 -2
- package/scripts/issue/issue-file-cap.ts +58 -0
- package/scripts/issue/issue-file-cli.ts +111 -38
- package/scripts/issue/issue-file-deferral.ts +52 -0
- package/scripts/issue/issue-file-fold.ts +29 -10
- package/scripts/issue/issue-file-interrupt.ts +85 -0
- package/scripts/issue/issue-file-lane-hint.ts +30 -0
- package/scripts/issue/issue-file.ts +43 -6
- package/scripts/issue/issue-labels.ts +19 -2
- package/scripts/issue/issue-lint-cli.ts +27 -2
- package/scripts/issue/issue-measured-cli.ts +13 -35
- package/scripts/issue/issue-measured-close.ts +58 -0
- package/scripts/issue/issue-not-before-label.ts +2 -2
- package/scripts/issue/issue-not-before.ts +4 -1
- package/scripts/issue/issue-priority-cli.ts +60 -0
- package/scripts/issue/issue-priority-raise.ts +55 -0
- package/scripts/issue/issue-priority.ts +174 -43
- package/scripts/issue/issue-rank.ts +21 -4
- package/scripts/issue/issue-read-cli.ts +32 -6
- package/scripts/issue/issue-read.ts +37 -12
- package/scripts/issue/issue-sample-gate.ts +95 -74
- package/scripts/issue/issue-sample-prime.ts +127 -0
- package/scripts/issue/issue-sample-required.ts +57 -0
- package/scripts/issue/issue-sample-source.ts +12 -11
- package/scripts/issue/issue-search.ts +124 -0
- package/scripts/issue/issue-state.ts +13 -1
- package/scripts/issue/issue-template-section.ts +43 -0
- package/scripts/issue/issue-watch-diff.ts +31 -1
- package/scripts/issue/issue-watch-hook.ts +11 -2
- package/scripts/issue/issue-watch.ts +55 -12
- package/scripts/issue/markdown-section.ts +1 -0
- package/scripts/issue/measure-declaration.ts +121 -0
- package/scripts/issue/measure-rerun-cli.ts +7 -70
- package/scripts/issue/plan-consumers-section.ts +22 -1
- package/scripts/issue/reproduction-measure.ts +3 -1
- package/scripts/issue/size-estimate.ts +90 -0
- package/scripts/issue/trusted-measure.ts +84 -0
- package/scripts/josh/command-usage.ts +3 -2
- package/scripts/josh/durable-state-migrate.ts +105 -0
- package/scripts/josh/durable-state.ts +112 -0
- package/scripts/josh/josh-aliases.ts +95 -0
- package/scripts/josh/josh-command-map.ts +1 -82
- package/scripts/josh/josh-commands-agent-hooks.ts +6 -6
- package/scripts/josh/josh-commands-ai.ts +5 -5
- package/scripts/josh/josh-commands-development.ts +59 -58
- package/scripts/josh/josh-commands-issue-write.ts +23 -4
- package/scripts/josh/josh-commands-issue.ts +32 -0
- package/scripts/josh/josh-commands-lane.ts +87 -4
- package/scripts/josh/josh-commands-lint.ts +16 -3
- package/scripts/josh/josh-commands-maintenance.ts +15 -0
- package/scripts/josh/josh-commands-review.ts +41 -6
- package/scripts/josh/josh-commands-ship.ts +56 -8
- package/scripts/josh/josh-commands-test-check.ts +80 -0
- package/scripts/josh/josh-commands-workflow.ts +1 -1
- package/scripts/josh/josh-environment-file.ts +43 -3
- package/scripts/josh/josh-in-process.ts +2 -2
- package/scripts/josh/josh-logic.ts +5 -3
- package/scripts/josh/josh-run.ts +19 -1
- package/scripts/josh/run-record-path.ts +15 -0
- package/scripts/josh/stamp-file.ts +11 -2
- package/scripts/lane/lane-adopt-cli.ts +98 -0
- package/scripts/lane/lane-adopt.ts +208 -0
- package/scripts/lane/lane-await.ts +5 -8
- package/scripts/lane/lane-baseline.ts +123 -0
- package/scripts/lane/lane-breakdown-cli.ts +64 -0
- package/scripts/lane/lane-breakdown-implement.ts +170 -0
- package/scripts/lane/lane-breakdown-laps.ts +107 -0
- package/scripts/lane/lane-breakdown-pinned.ts +76 -0
- package/scripts/lane/lane-breakdown-text.ts +145 -0
- package/scripts/lane/lane-breakdown.ts +239 -0
- package/scripts/lane/lane-check-stats.ts +29 -8
- package/scripts/lane/lane-child-invocation.ts +9 -2
- package/scripts/lane/lane-child-mark-keys.ts +12 -0
- package/scripts/lane/lane-child-marker.ts +20 -1
- package/scripts/lane/lane-ci-path-stats.ts +73 -0
- package/scripts/lane/lane-claim-stats.ts +84 -0
- package/scripts/lane/lane-close.ts +8 -3
- package/scripts/lane/lane-dispatch-log.ts +3 -3
- package/scripts/lane/lane-dispatch.ts +2 -2
- package/scripts/lane/lane-gap-stats.ts +7 -6
- package/scripts/lane/lane-guard-policy.ts +7 -1
- package/scripts/lane/lane-implement-stats.ts +207 -0
- package/scripts/lane/lane-implement-subagents.ts +90 -0
- package/scripts/lane/lane-investigation-switch.ts +16 -0
- package/scripts/lane/lane-ledger-kind.ts +31 -0
- package/scripts/lane/lane-ledger-schema-ship.ts +49 -0
- package/scripts/lane/lane-ledger-schema.ts +119 -36
- package/scripts/lane/lane-ledger-write.ts +257 -0
- package/scripts/lane/lane-ledger.ts +31 -177
- package/scripts/lane/lane-load.ts +1 -1
- package/scripts/lane/lane-measure-cli.ts +176 -59
- package/scripts/lane/lane-net-read.ts +44 -0
- package/scripts/lane/lane-net-time.ts +212 -0
- package/scripts/lane/lane-open.ts +16 -7
- package/scripts/lane/lane-output.ts +2 -4
- package/scripts/lane/lane-overrun-prompt.ts +147 -0
- package/scripts/lane/lane-overrun.ts +274 -0
- package/scripts/lane/lane-paths.ts +24 -1
- package/scripts/lane/lane-pause-cli.ts +4 -1
- package/scripts/lane/lane-paused-spans.ts +97 -0
- package/scripts/lane/lane-plan-check.ts +207 -0
- package/scripts/lane/lane-plan-cli.ts +41 -0
- package/scripts/lane/lane-plan.ts +144 -0
- package/scripts/lane/lane-registry.ts +14 -1
- package/scripts/lane/lane-relaunch.ts +1 -1
- package/scripts/lane/lane-round-one-stats.ts +51 -0
- package/scripts/lane/lane-sampler.ts +23 -4
- package/scripts/lane/lane-session-action.ts +93 -18
- package/scripts/lane/lane-session-broker.ts +49 -21
- package/scripts/lane/lane-session-reread-main.ts +14 -0
- package/scripts/lane/lane-session-reread.ts +51 -0
- package/scripts/lane/lane-ship-lap-stats.ts +74 -0
- package/scripts/lane/lane-sleep.ts +58 -0
- package/scripts/lane/lane-spent.ts +1 -1
- package/scripts/lane/lane-split-stats.ts +28 -0
- package/scripts/lane/lane-stage-stats.ts +13 -1
- package/scripts/lane/lane-state.ts +41 -9
- package/scripts/lane/lane-stats-tables.ts +58 -0
- package/scripts/lane/lane-stats.ts +21 -5
- package/scripts/lane/lane-stop-stats.ts +51 -19
- package/scripts/lane/lane-tail-stats.ts +32 -0
- package/scripts/lane/lane-transcript-calls.ts +67 -10
- package/scripts/lane/lane-transcript-stats.ts +44 -12
- package/scripts/lane/lane-value-cell.ts +72 -0
- package/scripts/lane/lane-value.ts +118 -0
- package/scripts/lane/lane-withdraw-closed.ts +124 -0
- package/scripts/lane/lane-withdraw.ts +108 -31
- package/scripts/lane/lane-yield.ts +85 -0
- package/scripts/lane/openai-lane-ship.ts +12 -11
- package/scripts/lane/openai-lane-supervisor-decision.ts +6 -8
- package/scripts/lane/openai-lane-supervisor-owner.ts +5 -8
- package/scripts/lane/openai-lane-supervisor.ts +5 -4
- package/scripts/lib/poll.ts +38 -9
- package/scripts/lib/settled-together.ts +10 -0
- package/scripts/lib/shell-quote.ts +21 -0
- package/scripts/lib/token-shape.ts +111 -0
- package/scripts/lint/eslint-daemon-sources.ts +79 -0
- package/scripts/lint/eslint-daemon.ts +45 -6
- package/scripts/lint/eslint-warm-cli.ts +7 -0
- package/scripts/lint/eslint-warm.ts +66 -0
- package/scripts/lint/import-graph.ts +141 -11
- package/scripts/lint/lint-gate-scope.ts +2 -2
- package/scripts/lint/lint-parallel.ts +54 -6
- package/scripts/lint/lint-related.ts +154 -33
- package/scripts/lint/rename-cli.ts +179 -0
- package/scripts/lint/rename-identifier.ts +192 -0
- package/scripts/lint/type-only-imports.ts +58 -0
- package/scripts/notify/telegram-notify.ts +12 -3
- package/scripts/observations/observation-record.ts +42 -16
- package/scripts/observations/observations-flush.ts +32 -9
- package/scripts/overrides/overrides-check.ts +9 -1
- package/scripts/release/release-approval-prune.ts +7 -1
- package/scripts/repo/required-checks-logic.ts +4 -1
- package/scripts/repo/ruleset-check.ts +4 -3
- package/scripts/report/markdown-shape.ts +28 -0
- package/scripts/report/report-format-reference.ts +15 -1
- package/scripts/report/report-labels.ts +12 -1
- package/scripts/report/report-lint-child-summary.ts +94 -0
- package/scripts/report/report-lint-cli.ts +26 -7
- package/scripts/report/report-lint.ts +2 -20
- package/scripts/review/prose-stale-cli.ts +88 -0
- package/scripts/review/prose-stale-scan.ts +152 -0
- package/scripts/review/review-attest.ts +73 -23
- package/scripts/review/review-brief-cli.ts +68 -19
- package/scripts/review/review-brief-paths.ts +22 -0
- package/scripts/review/review-brief.ts +14 -7
- package/scripts/review/review-comment-carry.ts +47 -0
- package/scripts/review/review-comment-round.ts +85 -22
- package/scripts/review/review-finding-ledger.ts +109 -7
- package/scripts/review/review-finding-text.ts +43 -0
- package/scripts/review/review-interaction.ts +11 -0
- package/scripts/review/review-lane-handover.ts +68 -0
- package/scripts/review/review-lint-cli.ts +57 -0
- package/scripts/review/review-lint-findings.ts +92 -0
- package/scripts/review/review-lint-sections.ts +80 -0
- package/scripts/review/review-lint.ts +221 -0
- package/scripts/review/review-prior-findings.ts +102 -0
- package/scripts/review/review-readers-scan.ts +4 -2
- package/scripts/review/review-record-cli.ts +177 -54
- package/scripts/review/review-record-code-round.ts +55 -0
- package/scripts/review/review-record-comment.ts +60 -0
- package/scripts/review/review-record-interaction.ts +35 -0
- package/scripts/review/review-record-pinned.ts +108 -0
- package/scripts/review/review-record.ts +25 -1
- package/scripts/review/review-reviewed-tree.ts +307 -0
- package/scripts/review/review-round-one-closure.ts +62 -0
- package/scripts/review/review-round-reuse.ts +106 -0
- package/scripts/review/review-round2-cli.ts +91 -29
- package/scripts/review/review-round2-skip-comment.ts +55 -0
- package/scripts/review/review-round2.ts +24 -8
- package/scripts/review/review-stamps.ts +7 -3
- package/scripts/review/review-stop-log.ts +20 -6
- package/scripts/review/review-stops-cli.ts +2 -1
- package/scripts/review/review-submit-cli.ts +101 -0
- package/scripts/rules/agent-model.ts +1 -1
- package/scripts/rules/bash-triggers.ts +3 -3
- package/scripts/rules/concise-reply.ts +88 -0
- package/scripts/rules/credential-body.ts +77 -0
- package/scripts/rules/decision-oracle.ts +1 -1
- package/scripts/rules/delivered-rules.ts +36 -17
- package/scripts/rules/destructive-command.ts +3 -11
- package/scripts/rules/direct-issue-comment.ts +34 -12
- package/scripts/rules/direct-issue-read.ts +191 -0
- package/scripts/rules/direct-pr-create.ts +4 -24
- package/scripts/rules/early-heartbeat.ts +2 -0
- package/scripts/rules/edit-tool.ts +27 -0
- package/scripts/rules/file-edit-rows.ts +17 -0
- package/scripts/rules/file-rewrite.ts +146 -0
- package/scripts/rules/firing-point.ts +3 -2
- package/scripts/rules/gh-api.ts +128 -7
- package/scripts/rules/gh-repo-selector.ts +84 -0
- package/scripts/rules/git-force.ts +2 -2
- package/scripts/rules/guard-remedy.ts +14 -5
- package/scripts/rules/implementation-cut.ts +61 -28
- package/scripts/rules/investigator-foreground.ts +231 -0
- package/scripts/rules/issue-citation.ts +15 -60
- package/scripts/rules/issue-comments.ts +9 -4
- package/scripts/rules/josh-git-bare.ts +1 -1
- package/scripts/rules/lane-background.ts +41 -13
- package/scripts/rules/lane-direct-tool.ts +107 -9
- package/scripts/rules/lane-interactive-ask.ts +4 -1
- package/scripts/rules/lane-park.ts +4 -2
- package/scripts/rules/lane-spilled-read.ts +90 -0
- package/scripts/rules/lane-split-park.ts +1 -1
- package/scripts/rules/lane-switch-main.ts +4 -4
- package/scripts/rules/last-prompt.ts +20 -47
- package/scripts/rules/oracle-consulted.ts +1 -1
- package/scripts/rules/permission-guards.ts +5 -1
- package/scripts/rules/piped-verification-shapes.ts +110 -0
- package/scripts/rules/piped-verification.ts +67 -17
- package/scripts/rules/poll-loop.ts +72 -9
- package/scripts/rules/pr-merge.ts +5 -5
- package/scripts/rules/pre-gate-cut.ts +3 -3
- package/scripts/rules/protected-files.ts +88 -24
- package/scripts/rules/reply-language.ts +3 -17
- package/scripts/rules/reply-prose.ts +34 -0
- package/scripts/rules/repo-admin.ts +132 -0
- package/scripts/rules/reviewer-foreground.ts +88 -0
- package/scripts/rules/round-one-check-related.ts +120 -0
- package/scripts/rules/rule-body-guard.ts +5 -15
- package/scripts/rules/rule-value-cache.ts +53 -5
- package/scripts/rules/rule-value-candidates.ts +84 -0
- package/scripts/rules/rule-value-cli.ts +59 -11
- package/scripts/rules/rule-value.ts +17 -4
- package/scripts/rules/run-tail-rule.ts +1 -1
- package/scripts/rules/sed-in-place.ts +196 -0
- package/scripts/rules/shell-segments.ts +10 -2
- package/scripts/rules/stop-rule-rows.ts +1 -13
- package/scripts/rules/stop-rules.ts +33 -58
- package/scripts/rules/test-declared-commit.ts +1 -1
- package/scripts/rules/third-party-write.ts +110 -23
- package/scripts/rules/timed-rerun.ts +1 -1
- package/scripts/rules/turn-filings.ts +90 -0
- package/scripts/rules/worktree-guard.ts +22 -7
- package/scripts/run/board/run-board-ending-reason.ts +6 -2
- package/scripts/run/board/run-board-fit.ts +24 -1
- package/scripts/run/board/run-board-found.ts +134 -0
- package/scripts/run/board/run-board-header.ts +8 -0
- package/scripts/run/board/run-board-labels.ts +11 -1
- package/scripts/run/board/run-board-lane-time.ts +1 -0
- package/scripts/run/board/run-board-link.ts +15 -2
- package/scripts/run/board/run-board-notes.ts +7 -1
- package/scripts/run/board/run-board-operation.ts +4 -2
- package/scripts/run/board/run-board-phase.ts +2 -5
- package/scripts/run/board/run-board-plan.ts +1 -1
- package/scripts/run/board/run-board-read.ts +46 -1
- package/scripts/run/board/run-board-reason.ts +20 -8
- package/scripts/run/board/run-board-render-checks.ts +3 -2
- package/scripts/run/board/run-board-render-drawn.ts +11 -0
- package/scripts/run/board/run-board-render-found.ts +157 -0
- package/scripts/run/board/run-board-render-lead.ts +9 -0
- package/scripts/run/board/run-board-render-legend.ts +19 -0
- package/scripts/run/board/run-board-render-tail.ts +1 -1
- package/scripts/run/board/run-board-render.ts +82 -18
- package/scripts/run/board/run-board-spin.ts +1 -3
- package/scripts/run/board/run-board-status.ts +2 -0
- package/scripts/run/board/run-board-tick.ts +39 -10
- package/scripts/run/carry/run-carry-ended.ts +3 -2
- package/scripts/run/carry/run-carry.ts +3 -2
- package/scripts/run/cut/run-cut-cli.ts +33 -133
- package/scripts/run/cut/run-cut-digest.ts +152 -0
- package/scripts/run/cut/run-cut-handoff.ts +52 -8
- package/scripts/run/cut/run-cut-report.ts +24 -3
- package/scripts/run/cut/run-cut-resume.ts +129 -0
- package/scripts/run/cut/run-cut-review.ts +105 -0
- package/scripts/run/cut/run-cut.ts +18 -7
- package/scripts/run/detached-launch.ts +1 -1
- package/scripts/run/entry/run-entry-cli.ts +88 -19
- package/scripts/run/entry/run-entry-spill.ts +83 -0
- package/scripts/run/entry/run-entry-stop.ts +5 -1
- package/scripts/run/entry/run-entry-trust.ts +91 -0
- package/scripts/run/event/run-event-baseline.ts +56 -0
- package/scripts/run/event/run-event-filed.ts +9 -3
- package/scripts/run/event/run-event-overrun.ts +197 -0
- package/scripts/run/event/run-event-render.ts +4 -0
- package/scripts/run/event/run-event-stream.ts +25 -3
- package/scripts/run/hold/run-stop-notify.ts +3 -8
- package/scripts/run/merge/run-merge-cap.ts +57 -0
- package/scripts/run/merge/run-merge-cli.ts +66 -23
- package/scripts/run/merge/run-merge-outcome.ts +2 -0
- package/scripts/run/merge/run-merge-ship.ts +13 -3
- package/scripts/run/merge/run-merge-signals.ts +40 -23
- package/scripts/run/merge/run-merge-steps.ts +56 -36
- package/scripts/run/merge/run-merge-usage-limit.ts +53 -0
- package/scripts/run/merge/run-merge-withdrawn.ts +53 -0
- package/scripts/run/merge/run-merge.ts +41 -14
- package/scripts/run/review/run-review-cli.ts +306 -20
- package/scripts/run/review/run-review-early-push.ts +121 -0
- package/scripts/run/review/run-review-join-read.ts +94 -0
- package/scripts/run/review/run-review-pinned-accepted.ts +126 -0
- package/scripts/run/review/run-review-pinned-join.ts +216 -0
- package/scripts/run/review/run-review-pinned-steps.ts +383 -0
- package/scripts/run/review/run-review-pinned-tree.ts +37 -0
- package/scripts/run/review/run-review-pinned.ts +53 -0
- package/scripts/run/review/run-review-steps.ts +70 -34
- package/scripts/run/review/run-review.ts +26 -6
- package/scripts/run/run-parent-cut-hook.ts +3 -4
- package/scripts/run/run-prep.ts +1 -0
- package/scripts/run/run-stage-read.ts +2 -6
- package/scripts/run/run-step-cli.ts +17 -5
- package/scripts/run/run-step-lane-plan.ts +27 -0
- package/scripts/run/run-step-section.ts +26 -7
- package/scripts/run/run-step.ts +5 -2
- package/scripts/run/ship/run-ship-args.ts +19 -0
- package/scripts/run/ship/run-ship-brokered-review.ts +106 -0
- package/scripts/run/ship/run-ship-cli.ts +131 -39
- package/scripts/run/ship/run-ship-conflict-probe.ts +59 -0
- package/scripts/run/ship/run-ship-detach.ts +10 -4
- package/scripts/run/ship/run-ship-handover.ts +106 -0
- package/scripts/run/ship/run-ship-infra-retry.ts +16 -1
- package/scripts/run/ship/run-ship-lap.ts +63 -0
- package/scripts/run/ship/run-ship-next.ts +27 -26
- package/scripts/run/ship/run-ship-overlap.ts +8 -3
- package/scripts/run/ship/run-ship-place.ts +9 -2
- package/scripts/run/ship/run-ship-planned.ts +92 -0
- package/scripts/run/ship/run-ship-pre-detach-pinned.ts +197 -0
- package/scripts/run/ship/run-ship-pre-detach-timed.ts +7 -8
- package/scripts/run/ship/run-ship-pre-detach.ts +77 -23
- package/scripts/run/ship/run-ship-preflight.ts +16 -4
- package/scripts/run/ship/run-ship-probe.ts +23 -9
- package/scripts/run/ship/run-ship-relaunch-cap.ts +43 -7
- package/scripts/run/ship/run-ship-relaunch.ts +51 -0
- package/scripts/run/ship/run-ship-return.ts +103 -29
- package/scripts/run/ship/run-ship-review-reason.ts +24 -0
- package/scripts/run/ship/run-ship-review-steps.ts +230 -59
- package/scripts/run/ship/run-ship-review.ts +171 -51
- package/scripts/run/ship/run-ship-reviewer.ts +138 -42
- package/scripts/run/ship/run-ship-scoped.ts +39 -10
- package/scripts/run/ship/run-ship-stage.ts +49 -13
- package/scripts/run/ship/run-ship-steps.ts +24 -4
- package/scripts/run/ship/run-ship-stop-cause.ts +43 -2
- package/scripts/run/ship/run-ship-stop-context.ts +50 -13
- package/scripts/run/ship/run-ship-sync.ts +171 -30
- package/scripts/run/ship/run-ship-synced-scope.ts +178 -0
- package/scripts/run/ship/run-ship-wait-cli.ts +145 -0
- package/scripts/run/ship/run-ship-waiter.ts +114 -0
- package/scripts/run/ship/run-ship.ts +16 -2
- package/scripts/run/wake/run-wake-caffeinate.ts +48 -0
- package/scripts/run/wake/run-wake-cli.ts +6 -113
- package/scripts/run/wake/run-wake-code.ts +53 -11
- package/scripts/run/wake/run-wake-driver.ts +5 -3
- package/scripts/run/wake/run-wake-finish.ts +137 -0
- package/scripts/run/wake/run-wake-loop.ts +5 -3
- package/scripts/run/wake/run-wake-ports.ts +11 -3
- package/scripts/run/wake/run-wake-session.ts +2 -0
- package/scripts/run/wake/run-wake.ts +3 -2
- package/scripts/safe-chain/ci-installer-pin.ts +49 -8
- package/scripts/safe-chain/project-config.ts +3 -2
- package/scripts/security/secretlint-scan.ts +42 -9
- package/scripts/security/security-audit-provision-main.ts +9 -1
- package/scripts/security/security-audit-provision.ts +1 -1
- package/scripts/security/security-audit.ts +21 -1
- package/scripts/security/sonar-file.ts +10 -5
- package/scripts/split/split-assess.ts +12 -3
- package/scripts/split/split-early-notice.ts +116 -0
- package/scripts/split/split-measure.ts +20 -2
- package/scripts/split/split-resolution.ts +107 -0
- package/scripts/test/direct-importers.ts +185 -0
- package/scripts/test/pure-files-entries.ts +83 -0
- package/scripts/test/related-heavy-tests.ts +81 -0
- package/scripts/test/test-no-base.ts +88 -0
- package/scripts/test/test-pinned-cache-logic.ts +363 -0
- package/scripts/test/test-pinned-cache.ts +337 -0
- package/scripts/test/test-pinned-emit.ts +49 -0
- package/scripts/test/test-pinned-functions.ts +116 -0
- package/scripts/test/test-pinned-ledger.ts +80 -0
- package/scripts/test/test-pinned-logic.ts +208 -20
- package/scripts/test/test-pinned-main.ts +84 -18
- package/scripts/test/test-pinned-pool.ts +73 -0
- package/scripts/test/test-pinned-probe.ts +254 -0
- package/scripts/test/test-pinned-prune-logic.ts +118 -0
- package/scripts/test/test-pinned-reach.ts +194 -0
- package/scripts/test/test-pinned-record.ts +196 -0
- package/scripts/test/test-pinned-rewire.ts +148 -0
- package/scripts/test/test-pinned-spawn.ts +81 -0
- package/scripts/test/test-pinned-stage.ts +70 -0
- package/scripts/test/test-pinned.ts +258 -47
- package/scripts/test/test-reach-cli.ts +61 -0
- package/scripts/test/test-read-map.ts +35 -11
- package/scripts/test/test-read-recording.ts +17 -5
- package/scripts/test/test-read-trace.ts +26 -8
- package/scripts/test/test-red-logic.ts +46 -7
- package/scripts/test/test-red.ts +34 -14
- package/scripts/test/test-related-claim.ts +37 -0
- package/scripts/test/test-related-main.ts +4 -1
- package/scripts/test/test-related-moved.ts +91 -0
- package/scripts/test/test-related-record.ts +43 -23
- package/scripts/test/test-related-scope.ts +99 -34
- package/scripts/test/test-related-synced.ts +135 -0
- package/scripts/test/test-related-touched.ts +84 -0
- package/scripts/test/test-related.ts +167 -83
- package/scripts/test/test-unit-guard.ts +28 -5
- package/scripts/test/unit-durations.ts +41 -0
- package/scripts/test/unit-worker-share.ts +5 -4
- package/scripts/test/vitest-cache-directory.ts +19 -0
- package/scripts/test/vitest-cli-excludes.ts +14 -0
- package/scripts/test/vitest-failure-summary.ts +111 -0
- package/scripts/test/whole-suite-files.ts +12 -1
- package/scripts/time-runtime/time-batch-guard.ts +42 -4
- package/scripts/time-runtime/time-bundle-call.ts +1 -1
- package/scripts/time-runtime/time-bundles.ts +36 -5
- package/scripts/time-runtime/time-markers.ts +2 -2
- package/scripts/time-runtime/time-search-call.ts +38 -0
- package/scripts/time-runtime/time-shell.ts +1 -1
- package/scripts/time-runtime/time-transcript-line.ts +17 -5
- package/scripts/version/development-engines-verdict.ts +124 -0
- package/scripts/version/latest-corepack.ts +2 -0
- package/templates/gitignore +2 -0
- package/templates/workflows/ci.yml +41 -0
- package/dist/hooks/chunk-AZX4FGQ3.js +0 -207
- package/dist/hooks/chunk-PT5R6UJD.js +0 -7131
- package/dist/hooks/chunk-TUIFS5E7.js +0 -72
- package/dist/hooks/chunk-YCDOIR3I.js +0 -3456
- package/scripts/cost-runtime/context-cut-threshold.ts +0 -11
- package/scripts/rules/filing-cap.ts +0 -139
package/.github/workflows/ci.yml
CHANGED
|
@@ -156,6 +156,7 @@ jobs:
|
|
|
156
156
|
reuse: ${{ steps.prove.outputs.reuse }}
|
|
157
157
|
run-id: ${{ steps.prove.outputs.run-id }}
|
|
158
158
|
pull-number: ${{ steps.prove.outputs.pull-number }}
|
|
159
|
+
author-association: ${{ steps.prove.outputs.author-association }}
|
|
159
160
|
steps:
|
|
160
161
|
- name: Prove the pushed tree passed PR Checks
|
|
161
162
|
id: prove
|
|
@@ -171,7 +172,7 @@ jobs:
|
|
|
171
172
|
exit 0
|
|
172
173
|
fi
|
|
173
174
|
if ! pull=$(printf '%s' "${pulls}" | jq -r --arg sha "${CURRENT_SHA}" \
|
|
174
|
-
'[.[] | select(.merged_at != null and .merge_commit_sha == $sha and .base.ref == "main")] | if length == 1 then .[0] | [.number, .head.sha, .head.ref, .created_at, .merged_at] | @tsv else empty end'); then
|
|
175
|
+
'[.[] | select(.merged_at != null and .merge_commit_sha == $sha and .base.ref == "main")] | if length == 1 then .[0] | [.number, .head.sha, .head.ref, .created_at, .merged_at, .author_association] | @tsv else empty end'); then
|
|
175
176
|
echo '::notice::Could not parse the pull request; running the verification jobs.'
|
|
176
177
|
exit 0
|
|
177
178
|
fi
|
|
@@ -179,7 +180,7 @@ jobs:
|
|
|
179
180
|
echo 'No unique merged pull request matched this push; running the verification jobs.'
|
|
180
181
|
exit 0
|
|
181
182
|
fi
|
|
182
|
-
IFS=$'\t' read -r pull_number head_sha head_ref created_at merged_at <<< "${pull}"
|
|
183
|
+
IFS=$'\t' read -r pull_number head_sha head_ref created_at merged_at author_association <<< "${pull}"
|
|
183
184
|
|
|
184
185
|
if ! current_tree=$(gh api "repos/${REPOSITORY}/git/commits/${CURRENT_SHA}" --jq '.tree.sha') || \
|
|
185
186
|
! pr_tree=$(gh api "repos/${REPOSITORY}/git/commits/${head_sha}" --jq '.tree.sha'); then
|
|
@@ -225,6 +226,7 @@ jobs:
|
|
|
225
226
|
echo 'reuse=true' >> "$GITHUB_OUTPUT"
|
|
226
227
|
echo "run-id=${run_id}" >> "$GITHUB_OUTPUT"
|
|
227
228
|
echo "pull-number=${pull_number}" >> "$GITHUB_OUTPUT"
|
|
229
|
+
echo "author-association=${author_association}" >> "$GITHUB_OUTPUT"
|
|
228
230
|
echo "Reusing successful PR Checks for tree ${current_tree}."
|
|
229
231
|
|
|
230
232
|
# joshuafolkken/kit#1226 split the gate's four checks across two runners. The unit suite is the only
|
|
@@ -240,12 +242,23 @@ jobs:
|
|
|
240
242
|
# needed a ruleset edit to stay as strict as it was, and left every merge between the two
|
|
241
243
|
# unguarded. So the two halves run under new names and `Checks` stays exactly what the ruleset
|
|
242
244
|
# already requires: a job that is green only when both halves are.
|
|
245
|
+
#
|
|
246
|
+
# **The static half is a matrix of three legs** (joshuafolkken/kit#5215). On one runner its seven
|
|
247
|
+
# checks took 4.1 minutes while every unit shard was done in about two, so it was the critical path
|
|
248
|
+
# to `Checks`. Each leg is still `josh gate`, narrowed by `--static-group` to the partition
|
|
249
|
+
# `scripts/gate/gate-static-group.ts` defines, and restores only the caches its checks write — a leg
|
|
250
|
+
# that restored a cache it never writes would save it back unchanged under the same sha-keyed name,
|
|
251
|
+
# racing the leg that does write it. `needs.static-checks.result` is `success` only when every leg is.
|
|
243
252
|
static-checks:
|
|
244
|
-
name: Static Checks
|
|
253
|
+
name: Static Checks (${{ matrix.group }})
|
|
245
254
|
needs: reuse-pr-checks
|
|
246
255
|
if: ${{ !cancelled() && needs.reuse-pr-checks.outputs.reuse != 'true' }}
|
|
247
256
|
runs-on: ubuntu-latest
|
|
248
257
|
timeout-minutes: 8
|
|
258
|
+
strategy:
|
|
259
|
+
fail-fast: false
|
|
260
|
+
matrix:
|
|
261
|
+
group: [lint, types, rest]
|
|
249
262
|
permissions:
|
|
250
263
|
contents: read
|
|
251
264
|
packages: read
|
|
@@ -267,6 +280,7 @@ jobs:
|
|
|
267
280
|
registry-url: 'https://npm.pkg.github.com'
|
|
268
281
|
|
|
269
282
|
- name: Setup ESLint cache
|
|
283
|
+
if: matrix.group == 'lint'
|
|
270
284
|
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
|
|
271
285
|
id: eslint-cache
|
|
272
286
|
with:
|
|
@@ -307,6 +321,7 @@ jobs:
|
|
|
307
321
|
# `josh check` runs `tsc --noEmit --incremental --tsBuildInfoFile .tsbuildinfo` and `josh
|
|
308
322
|
# cspell:dot` runs `cspell . --dot --cache --cache-strategy content --cache-location .cspellcache`.
|
|
309
323
|
- name: Setup TypeScript build cache
|
|
324
|
+
if: matrix.group == 'types'
|
|
310
325
|
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
|
|
311
326
|
id: tsbuildinfo-cache
|
|
312
327
|
with:
|
|
@@ -318,6 +333,7 @@ jobs:
|
|
|
318
333
|
${{ runner.os }}-tsbuildinfo-
|
|
319
334
|
|
|
320
335
|
- name: Setup cspell cache
|
|
336
|
+
if: matrix.group == 'rest'
|
|
321
337
|
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
|
|
322
338
|
id: cspell-cache
|
|
323
339
|
with:
|
|
@@ -328,6 +344,25 @@ jobs:
|
|
|
328
344
|
${{ runner.os }}-cspell-cache-${{ hashFiles('pnpm-lock.yaml') }}-
|
|
329
345
|
${{ runner.os }}-cspell-cache-
|
|
330
346
|
|
|
347
|
+
# joshuafolkken/kit#5116: `josh lint --changed` runs `prettier --check . --cache --cache-strategy
|
|
348
|
+
# content --cache-location .prettiercache` beside eslint, and with no restored cache it walked
|
|
349
|
+
# the whole tree cold on every run. Prettier hashes each file's absolute path into its entry
|
|
350
|
+
# (`scripts/josh/josh-command-types.ts` → `GATE_CACHE_SPECS`), which is why no lane shares it,
|
|
351
|
+
# but the runner checks out to the same path on every run, so an earlier run's entries hit. The
|
|
352
|
+
# key is the eslint cache's shape: lockfile and prettier config hashes, then the sha.
|
|
353
|
+
- name: Setup prettier cache
|
|
354
|
+
if: matrix.group == 'lint'
|
|
355
|
+
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
|
|
356
|
+
id: prettier-cache
|
|
357
|
+
with:
|
|
358
|
+
path: |
|
|
359
|
+
.prettiercache
|
|
360
|
+
key: ${{ runner.os }}-prettier-cache-${{ hashFiles('pnpm-lock.yaml') }}-${{ hashFiles('prettier.config.js', 'prettier/**/*.js') }}-${{ github.sha }}
|
|
361
|
+
restore-keys: |
|
|
362
|
+
${{ runner.os }}-prettier-cache-${{ hashFiles('pnpm-lock.yaml') }}-${{ hashFiles('prettier.config.js', 'prettier/**/*.js') }}-
|
|
363
|
+
${{ runner.os }}-prettier-cache-${{ hashFiles('pnpm-lock.yaml') }}-
|
|
364
|
+
${{ runner.os }}-prettier-cache-
|
|
365
|
+
|
|
331
366
|
- name: Setup pnpm and install dependencies
|
|
332
367
|
uses: ./.github/actions/setup-pnpm
|
|
333
368
|
with:
|
|
@@ -374,9 +409,10 @@ jobs:
|
|
|
374
409
|
# default branch itself. A name that does not resolve fails the step rather than comparing
|
|
375
410
|
# with nothing.
|
|
376
411
|
- name: Run verification gate
|
|
377
|
-
run: pnpm josh gate --verbose --no-unit
|
|
412
|
+
run: pnpm josh gate --verbose --no-unit "--static-group=${STATIC_GROUP}"
|
|
378
413
|
env:
|
|
379
414
|
JOSH_METRICS_BASE: HEAD^1
|
|
415
|
+
STATIC_GROUP: ${{ matrix.group }}
|
|
380
416
|
|
|
381
417
|
# joshuafolkken/kit#4449: a main push that reuses this run skips the job above, so it saves no
|
|
382
418
|
# ESLint cache, and a later pull request restored an entry several merges old. Since
|
|
@@ -388,13 +424,13 @@ jobs:
|
|
|
388
424
|
# transient artifact-service error must not turn this required job red; it continues on error.
|
|
389
425
|
- name: Write ESLint cache prefix
|
|
390
426
|
id: eslint-cache-prefix
|
|
391
|
-
if: github.event_name == 'pull_request'
|
|
427
|
+
if: github.event_name == 'pull_request' && matrix.group == 'lint'
|
|
392
428
|
env:
|
|
393
429
|
ESLINT_CACHE_PREFIX: ${{ runner.os }}-eslint-cache-${{ steps.setup-node.outputs.node-version }}-${{ hashFiles('pnpm-lock.yaml') }}-${{ hashFiles('eslint.config.js', 'eslint/**/*.js') }}-
|
|
394
430
|
run: printf '%s\n' "${ESLINT_CACHE_PREFIX}" > eslint-cache-prefix
|
|
395
431
|
|
|
396
432
|
- name: Upload ESLint cache
|
|
397
|
-
if: github.event_name == 'pull_request'
|
|
433
|
+
if: github.event_name == 'pull_request' && matrix.group == 'lint'
|
|
398
434
|
continue-on-error: true
|
|
399
435
|
uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
|
|
400
436
|
with:
|
|
@@ -411,6 +447,9 @@ jobs:
|
|
|
411
447
|
# fresh key and saves the downloaded file in its post step; the prefix is checked before it becomes
|
|
412
448
|
# a key. A missing artifact — a run from before this — or a prefix that is not a key saves nothing
|
|
413
449
|
# and leaves the push green; the next pull request then restores an older entry, as it did before.
|
|
450
|
+
# Only a pull request whose author holds a trusted association (OWNER / MEMBER / COLLABORATOR) is promoted:
|
|
451
|
+
# an outside author's run can write any `.eslintcache` it likes, and main's scope would then let
|
|
452
|
+
# later pull requests skip lint on that forged record (joshuafolkken/kit#5050).
|
|
414
453
|
seed-eslint-cache:
|
|
415
454
|
name: Seed ESLint Cache
|
|
416
455
|
needs: reuse-pr-checks
|
|
@@ -427,7 +466,15 @@ jobs:
|
|
|
427
466
|
REPOSITORY: ${{ github.repository }}
|
|
428
467
|
RUN_ID: ${{ needs.reuse-pr-checks.outputs.run-id }}
|
|
429
468
|
PULL_NUMBER: ${{ needs.reuse-pr-checks.outputs.pull-number }}
|
|
469
|
+
AUTHOR_ASSOCIATION: ${{ needs.reuse-pr-checks.outputs.author-association }}
|
|
430
470
|
run: |
|
|
471
|
+
case "${AUTHOR_ASSOCIATION}" in
|
|
472
|
+
OWNER | MEMBER | COLLABORATOR) ;;
|
|
473
|
+
*)
|
|
474
|
+
echo "::notice::The pull request's author association (${AUTHOR_ASSOCIATION:-unknown}) is not trusted; saving nothing."
|
|
475
|
+
exit 0
|
|
476
|
+
;;
|
|
477
|
+
esac
|
|
431
478
|
if ! gh run download "${RUN_ID}" --repo "${REPOSITORY}" --name "eslint-cache-${PULL_NUMBER}"; then
|
|
432
479
|
echo '::notice::The reused run left no ESLint cache; saving nothing.'
|
|
433
480
|
exit 0
|
|
@@ -448,15 +495,68 @@ jobs:
|
|
|
448
495
|
.eslintcache
|
|
449
496
|
key: ${{ steps.download.outputs.prefix }}${{ github.sha }}
|
|
450
497
|
|
|
498
|
+
# joshuafolkken/kit#5189: the seed above saves the pull request's cache under the Node.js release
|
|
499
|
+
# *that* run resolved. When the runner images move to a new patch release, main holds no lineage
|
|
500
|
+
# for it, and the first pull request on the new release lints cold (Static Checks 3.7 → 6.6 min).
|
|
501
|
+
# This job restores with the static-checks key on its own runner, after the seed has saved: an
|
|
502
|
+
# exact hit means the seed already wrote this release's lineage for this push, and nothing runs.
|
|
503
|
+
# A miss — a new release, or a seed that saved nothing — lints here, and `actions/cache` saves the
|
|
504
|
+
# result in its post step, so the cold lint is paid on main instead of on a pull request. The lint
|
|
505
|
+
# only saves time, so its step continues on error: a red lint still saves, and leaves the job green.
|
|
506
|
+
warm-eslint-lineage:
|
|
507
|
+
name: Warm ESLint Lineage
|
|
508
|
+
needs: [reuse-pr-checks, seed-eslint-cache]
|
|
509
|
+
if: ${{ !cancelled() && needs.reuse-pr-checks.outputs.reuse == 'true' }}
|
|
510
|
+
runs-on: ubuntu-latest
|
|
511
|
+
timeout-minutes: 10
|
|
512
|
+
permissions:
|
|
513
|
+
contents: read
|
|
514
|
+
packages: read
|
|
515
|
+
steps:
|
|
516
|
+
- name: Checkout code
|
|
517
|
+
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
518
|
+
with:
|
|
519
|
+
persist-credentials: false
|
|
520
|
+
|
|
521
|
+
- name: Setup Node.js
|
|
522
|
+
id: setup-node
|
|
523
|
+
uses: ./.github/actions/setup-node
|
|
524
|
+
with:
|
|
525
|
+
registry-url: 'https://npm.pkg.github.com'
|
|
526
|
+
|
|
527
|
+
- name: Setup ESLint cache
|
|
528
|
+
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
|
|
529
|
+
id: eslint-cache
|
|
530
|
+
with:
|
|
531
|
+
path: |
|
|
532
|
+
.eslintcache
|
|
533
|
+
key: ${{ runner.os }}-eslint-cache-${{ steps.setup-node.outputs.node-version }}-${{ hashFiles('pnpm-lock.yaml') }}-${{ hashFiles('eslint.config.js', 'eslint/**/*.js') }}-${{ github.sha }}
|
|
534
|
+
restore-keys: |
|
|
535
|
+
${{ runner.os }}-eslint-cache-${{ steps.setup-node.outputs.node-version }}-${{ hashFiles('pnpm-lock.yaml') }}-${{ hashFiles('eslint.config.js', 'eslint/**/*.js') }}-
|
|
536
|
+
${{ runner.os }}-eslint-cache-${{ steps.setup-node.outputs.node-version }}-${{ hashFiles('pnpm-lock.yaml') }}-
|
|
537
|
+
${{ runner.os }}-eslint-cache-${{ steps.setup-node.outputs.node-version }}-
|
|
538
|
+
|
|
539
|
+
- name: Setup pnpm and install dependencies
|
|
540
|
+
if: steps.eslint-cache.outputs.cache-hit != 'true'
|
|
541
|
+
uses: ./.github/actions/setup-pnpm
|
|
542
|
+
with:
|
|
543
|
+
node-auth-token: ${{ secrets.GITHUB_TOKEN }}
|
|
544
|
+
|
|
545
|
+
- name: Lint to write this release's lineage
|
|
546
|
+
id: lint
|
|
547
|
+
if: steps.eslint-cache.outputs.cache-hit != 'true'
|
|
548
|
+
continue-on-error: true
|
|
549
|
+
run: pnpm josh lint
|
|
550
|
+
|
|
451
551
|
# The other half of the gate, on a runner of its own. A GitHub job is its own machine, so this job
|
|
452
552
|
# sets Node up again; the pnpm preamble is the shared `.github/actions/setup-pnpm` action
|
|
453
553
|
# (joshuafolkken/kit#2982), which `templates/workflows/ci.yml` calls the same way, so
|
|
454
554
|
# `scripts/ci/ci-yml-action-parity.test.ts` compares the two files without the action's own pins
|
|
455
555
|
# (joshuafolkken/kit#3095).
|
|
456
556
|
#
|
|
457
|
-
# No ESLint cache here — nothing in this job lints — and no `--maxWorkers`: `
|
|
458
|
-
#
|
|
459
|
-
#
|
|
557
|
+
# No ESLint cache here — nothing in this job lints — and no `--maxWorkers`: `josh test:unit` sizes a
|
|
558
|
+
# lone run's claim on a 4-core runner at vitest's own default, three workers plus vitest itself
|
|
559
|
+
# (`gate_plan.direct_unit_weight`, joshuafolkken/kit#4607).
|
|
460
560
|
# **Sharded across runners, because one runner is already saturated** (joshuafolkken/kit#3220).
|
|
461
561
|
# Alone on a 4-core runner vitest takes every core, so the suite can only get faster by spreading
|
|
462
562
|
# its files over more machines. `fail-fast: false` keeps a red shard from cancelling the others,
|
|
@@ -464,19 +564,19 @@ jobs:
|
|
|
464
564
|
# which for a matrix is `success` only when every shard succeeded — no change there is needed.
|
|
465
565
|
# The shards split by the recorded per-file durations in `tools/test/unit-durations.json`, not by
|
|
466
566
|
# file count, so they finish together (`tools/test/duration-shard.ts`, joshuafolkken/kit#4467).
|
|
467
|
-
#
|
|
468
|
-
#
|
|
469
|
-
#
|
|
567
|
+
# Six shards (joshuafolkken/kit#5090): at three (joshuafolkken/kit#4610) the slowest shard had
|
|
568
|
+
# become the last check `Checks` waited on, past Static Checks. Six bring a shard's recorded load
|
|
569
|
+
# to about two minutes; past that the longest single file, not the shard count, sets the floor.
|
|
470
570
|
# Only kit shards: the distributed template runs the unit suite inside its single `checks` job,
|
|
471
571
|
# where a small consumer suite would pay the duplicated setup and could leave a shard with no file.
|
|
472
572
|
unit:
|
|
473
|
-
name: Unit Tests (${{ matrix.shard }}/
|
|
573
|
+
name: Unit Tests (${{ matrix.shard }}/6)
|
|
474
574
|
needs: reuse-pr-checks
|
|
475
575
|
if: ${{ !cancelled() && needs.reuse-pr-checks.outputs.reuse != 'true' }}
|
|
476
576
|
strategy:
|
|
477
577
|
fail-fast: false
|
|
478
578
|
matrix:
|
|
479
|
-
shard: [1, 2, 3, 4]
|
|
579
|
+
shard: [1, 2, 3, 4, 5, 6]
|
|
480
580
|
runs-on: ubuntu-latest
|
|
481
581
|
timeout-minutes: 8
|
|
482
582
|
permissions:
|
|
@@ -508,7 +608,7 @@ jobs:
|
|
|
508
608
|
# `scripts/ci/ci-yml-unit-job.test.ts` pins the command; the guard itself is
|
|
509
609
|
# `scripts/test/test-unit-guard.ts`.
|
|
510
610
|
- name: Run unit tests
|
|
511
|
-
run: pnpm josh test:unit --shard=${{ matrix.shard }}/
|
|
611
|
+
run: pnpm josh test:unit --shard=${{ matrix.shard }}/6
|
|
512
612
|
|
|
513
613
|
# One shard is enough: the check does not depend on which test files ran beside it.
|
|
514
614
|
- name: Verify optional ESLint consumer install
|
|
@@ -586,6 +686,46 @@ jobs:
|
|
|
586
686
|
path: pr-checks-evidence
|
|
587
687
|
retention-days: 1
|
|
588
688
|
|
|
689
|
+
# The pre-commit secretlint scan skips when its binary is missing and never runs on a commit made
|
|
690
|
+
# with `--no-verify`, so this job scans the pull request's changes again where neither applies
|
|
691
|
+
# (joshuafolkken/kit#4657). It needs no other job and none needs it, so it stays off the critical
|
|
692
|
+
# path, and its own `Secret Scan` context is what makes a finding block the merge. Only the files
|
|
693
|
+
# the pull request adds or changes are read: the merge commit's first parent is the base, which is
|
|
694
|
+
# why the checkout fetches two commits. secretlint comes from the same store cache every other job
|
|
695
|
+
# installs from, and `JOSH_SECRETLINT_REQUIRE` turns the hook's missing-binary skip into a failure.
|
|
696
|
+
# `shell: bash` adds `pipefail`, so a diff that fails cannot hand `xargs` an empty list and pass.
|
|
697
|
+
secret-scan:
|
|
698
|
+
name: Secret Scan
|
|
699
|
+
if: github.event_name == 'pull_request'
|
|
700
|
+
runs-on: ubuntu-latest
|
|
701
|
+
timeout-minutes: 5
|
|
702
|
+
permissions:
|
|
703
|
+
contents: read
|
|
704
|
+
packages: read
|
|
705
|
+
steps:
|
|
706
|
+
- name: Checkout code
|
|
707
|
+
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
708
|
+
with:
|
|
709
|
+
persist-credentials: false
|
|
710
|
+
fetch-depth: 2
|
|
711
|
+
|
|
712
|
+
- name: Setup Node.js
|
|
713
|
+
uses: ./.github/actions/setup-node
|
|
714
|
+
with:
|
|
715
|
+
registry-url: 'https://npm.pkg.github.com'
|
|
716
|
+
|
|
717
|
+
- name: Setup pnpm and install dependencies
|
|
718
|
+
uses: ./.github/actions/setup-pnpm
|
|
719
|
+
with:
|
|
720
|
+
node-auth-token: ${{ secrets.GITHUB_TOKEN }}
|
|
721
|
+
|
|
722
|
+
- name: Scan the changed files for secrets
|
|
723
|
+
id: scan
|
|
724
|
+
shell: bash
|
|
725
|
+
env:
|
|
726
|
+
JOSH_SECRETLINT_REQUIRE: '1'
|
|
727
|
+
run: git diff -z --name-only --diff-filter=d HEAD^1 HEAD | xargs -0 -r pnpm josh secretlint-scan
|
|
728
|
+
|
|
589
729
|
security:
|
|
590
730
|
name: Security Audit
|
|
591
731
|
runs-on: ubuntu-latest
|
|
@@ -4,9 +4,10 @@ on: pull_request
|
|
|
4
4
|
|
|
5
5
|
# One run per pull request, superseded ones cancelled. `ci.yml` groups its pull-request runs the
|
|
6
6
|
# same way but no longer its pushes: since joshuafolkken/kit#1481 it appends the commit sha on a
|
|
7
|
-
# `push` event, which this workflow — triggered by `pull_request` alone — has no use for.
|
|
8
|
-
#
|
|
9
|
-
# distributed copy), so here the group only keeps a
|
|
7
|
+
# `push` event, which this workflow — triggered by `pull_request` alone — has no use for. A stale run
|
|
8
|
+
# cannot arm behind the withdrawal below: its `--match-head-commit` is refused once the branch moved
|
|
9
|
+
# (joshuafolkken/kit#842 is about the distributed copy), so here the group only keeps a
|
|
10
|
+
# force-pushed bump from paying for two runs.
|
|
10
11
|
concurrency:
|
|
11
12
|
group: ${{ github.workflow }}-${{ github.ref }}
|
|
12
13
|
cancel-in-progress: true
|
|
@@ -51,13 +52,71 @@ jobs:
|
|
|
51
52
|
# npm bumps never auto-merge, at any semver level: kit publishes lint plugins as runtime
|
|
52
53
|
# dependencies, so a patch release can change rule behavior for every consumer while kit's own
|
|
53
54
|
# CI only proves that kit still builds. Major bumps never auto-merge in either ecosystem.
|
|
55
|
+
#
|
|
56
|
+
# Only the `github-actions` group merges: `.github/dependabot.yml` puts the actions the publish
|
|
57
|
+
# jobs run with publish credentials, and those of the `pack` job that builds the tarball they
|
|
58
|
+
# publish, in a group of their own, because a hijacked release of one would publish with valid
|
|
59
|
+
# provenance, so a person reviews it (joshuafolkken/kit#4633, joshuafolkken/kit#4654). An
|
|
60
|
+
# ungrouped pull request does not merge either, so a bump that escapes both groups is reviewed.
|
|
61
|
+
#
|
|
62
|
+
# `--match-head-commit` refuses to arm when the branch moved after the event this run was
|
|
63
|
+
# triggered for, so a commit pushed before the arming does not merge on the bump's metadata. A
|
|
64
|
+
# push after the arming is the withdrawal step's (joshuafolkken/kit#4654).
|
|
54
65
|
- name: Enable auto-merge for github-actions patch and minor updates
|
|
55
66
|
if: >-
|
|
56
67
|
github.actor == 'dependabot[bot]'
|
|
57
68
|
&& steps.metadata.outputs.package-ecosystem == 'github_actions'
|
|
69
|
+
&& steps.metadata.outputs.dependency-group == 'github-actions'
|
|
58
70
|
&& (steps.metadata.outputs.update-type == 'version-update:semver-patch'
|
|
59
71
|
|| steps.metadata.outputs.update-type == 'version-update:semver-minor')
|
|
60
72
|
env:
|
|
61
73
|
PR_URL: ${{ github.event.pull_request.html_url }}
|
|
74
|
+
HEAD_SHA: ${{ github.event.pull_request.head.sha }}
|
|
62
75
|
GH_TOKEN: ${{ github.token }}
|
|
63
|
-
run: gh pr merge --auto --merge "$PR_URL"
|
|
76
|
+
run: gh pr merge --auto --merge --match-head-commit "$HEAD_SHA" "$PR_URL"
|
|
77
|
+
|
|
78
|
+
# The arming only binds the head it was made on: GitHub keeps auto-merge on through a later push,
|
|
79
|
+
# so a commit a collaborator pushes to the branch would merge on the bump's metadata. A push by
|
|
80
|
+
# anyone but Dependabot therefore withdraws the arming this workflow made (joshuafolkken/kit#4691).
|
|
81
|
+
# Only that one: an auto-merge a maintainer enabled by hand — before their push or after it — is
|
|
82
|
+
# their decision, and the step reads who enabled it to leave it alone.
|
|
83
|
+
#
|
|
84
|
+
# `--disable-auto` is an error on a pull request with nothing armed, so the state is read first;
|
|
85
|
+
# a read that fails falls through to the withdrawal rather than past it, and a withdrawal that
|
|
86
|
+
# still fails after its retries leaves the run red. GraphQL names the token's identity
|
|
87
|
+
# `github-actions`; the REST spelling is accepted too.
|
|
88
|
+
- name: Withdraw this workflow's auto-merge after a push by anyone but Dependabot
|
|
89
|
+
id: withdraw
|
|
90
|
+
if: github.actor != 'dependabot[bot]'
|
|
91
|
+
env:
|
|
92
|
+
PR_URL: ${{ github.event.pull_request.html_url }}
|
|
93
|
+
# A variable so the unit test that runs this script can set the delay to zero.
|
|
94
|
+
RETRY_ATTEMPTS: '3'
|
|
95
|
+
RETRY_BACKOFF_SECONDS: '5'
|
|
96
|
+
GH_TOKEN: ${{ github.token }}
|
|
97
|
+
run: |
|
|
98
|
+
enabler="$(gh pr view "$PR_URL" --json autoMergeRequest \
|
|
99
|
+
--jq '.autoMergeRequest.enabledBy.login // ""')" || enabler=unknown
|
|
100
|
+
|
|
101
|
+
case "$enabler" in
|
|
102
|
+
'')
|
|
103
|
+
echo 'Auto-merge is not enabled — nothing to withdraw.'
|
|
104
|
+
exit 0
|
|
105
|
+
;;
|
|
106
|
+
github-actions | 'github-actions[bot]' | unknown) ;;
|
|
107
|
+
*)
|
|
108
|
+
echo "Auto-merge was enabled by $enabler — leaving their decision as it is."
|
|
109
|
+
exit 0
|
|
110
|
+
;;
|
|
111
|
+
esac
|
|
112
|
+
|
|
113
|
+
attempt=1
|
|
114
|
+
|
|
115
|
+
until gh pr merge --disable-auto "$PR_URL"; do
|
|
116
|
+
if [ "$attempt" -ge "$RETRY_ATTEMPTS" ]; then
|
|
117
|
+
exit 1
|
|
118
|
+
fi
|
|
119
|
+
|
|
120
|
+
sleep "$((attempt * RETRY_BACKOFF_SECONDS))"
|
|
121
|
+
attempt=$((attempt + 1))
|
|
122
|
+
done
|
|
@@ -23,6 +23,7 @@ jobs:
|
|
|
23
23
|
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
24
24
|
with:
|
|
25
25
|
fetch-depth: 0
|
|
26
|
+
persist-credentials: false
|
|
26
27
|
|
|
27
28
|
- name: Configure Git
|
|
28
29
|
run: |
|
|
@@ -35,7 +36,14 @@ jobs:
|
|
|
35
36
|
# resolves to that branch, not the released tag. Use the tag carried in the
|
|
36
37
|
# dispatch payload (set by auto-tag.yml) as the merge source instead.
|
|
37
38
|
REF_NAME: ${{ inputs.tag || github.event.client_payload.tag }}
|
|
39
|
+
GH_TOKEN: ${{ github.token }}
|
|
38
40
|
run: |
|
|
41
|
+
# The checkout keeps no credentials, so the token reaches git for this step only, through
|
|
42
|
+
# the environment rather than .git/config (joshuafolkken/kit#4651).
|
|
43
|
+
BASIC=$(printf 'x-access-token:%s' "$GH_TOKEN" | base64 -w0)
|
|
44
|
+
echo "::add-mask::$BASIC"
|
|
45
|
+
export GIT_CONFIG_COUNT=1 GIT_CONFIG_KEY_0=http.https://github.com/.extraheader GIT_CONFIG_VALUE_0="AUTHORIZATION: basic $BASIC"
|
|
46
|
+
|
|
39
47
|
if [ -z "$REF_NAME" ]; then
|
|
40
48
|
echo "::error::new-tag-created dispatch carried no tag payload; aborting." >&2
|
|
41
49
|
exit 1
|
|
@@ -7,9 +7,11 @@ run-name: Publish ${{ github.ref_name }}
|
|
|
7
7
|
on:
|
|
8
8
|
workflow_dispatch:
|
|
9
9
|
|
|
10
|
-
#
|
|
11
|
-
#
|
|
12
|
-
#
|
|
10
|
+
# The jobs holding the publish rights install nothing and run no repository code: a compromised
|
|
11
|
+
# dependency would otherwise publish with valid provenance (joshuafolkken/kit#4633). Every install
|
|
12
|
+
# and every `tsx` run happens in `pack`, which holds no credentials, behind the same hash-verified
|
|
13
|
+
# safe-chain scan as CI (joshuafolkken/kit#2982). Its store cache is off: a cache entry another run
|
|
14
|
+
# saved never reaches the tarball the publish jobs receive.
|
|
13
15
|
|
|
14
16
|
jobs:
|
|
15
17
|
# The package is built once, here, and both registries receive this one tarball: a job that built
|
|
@@ -21,6 +23,12 @@ jobs:
|
|
|
21
23
|
timeout-minutes: 10
|
|
22
24
|
permissions:
|
|
23
25
|
contents: read
|
|
26
|
+
# One dist-tag for both registries, chosen against npmjs, whose `latest` needs no credentials to
|
|
27
|
+
# read: both receive the same tarball in the same run, so they move in step. `pack` runs outside
|
|
28
|
+
# the `package-publish` queue, so the publish jobs re-check `latest` against its choice (see there).
|
|
29
|
+
outputs:
|
|
30
|
+
tag: ${{ steps.publish-tag.outputs.tag }}
|
|
31
|
+
version: ${{ steps.publish-tag.outputs.version }}
|
|
24
32
|
steps:
|
|
25
33
|
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
26
34
|
with:
|
|
@@ -28,10 +36,28 @@ jobs:
|
|
|
28
36
|
|
|
29
37
|
- uses: ./.github/actions/setup-node
|
|
30
38
|
|
|
39
|
+
# Read before setup-pnpm puts the safe-chain shims on PATH: safe-chain hides recent versions from
|
|
40
|
+
# registry metadata and prints a notice to stdout, which corrupts the value (joshuafolkken/kit#3060).
|
|
41
|
+
- name: Read registry latest
|
|
42
|
+
id: registry-latest
|
|
43
|
+
run: |
|
|
44
|
+
latest=$(cd "$(mktemp -d)" && npm view @joshuafolkken/kit dist-tags.latest --registry https://registry.npmjs.org)
|
|
45
|
+
echo "latest=$latest" >> "$GITHUB_OUTPUT"
|
|
46
|
+
|
|
31
47
|
- uses: ./.github/actions/setup-pnpm
|
|
32
48
|
with:
|
|
33
49
|
cache: 'false'
|
|
34
50
|
|
|
51
|
+
- name: Select publish tag
|
|
52
|
+
id: publish-tag
|
|
53
|
+
run: |
|
|
54
|
+
version=$(node -p "require('./package.json').version")
|
|
55
|
+
tag=$(pnpm exec tsx scripts/release/publish-tag-cli.ts "$version" "$LATEST")
|
|
56
|
+
echo "tag=$tag" >> "$GITHUB_OUTPUT"
|
|
57
|
+
echo "version=$version" >> "$GITHUB_OUTPUT"
|
|
58
|
+
env:
|
|
59
|
+
LATEST: ${{ steps.registry-latest.outputs.latest }}
|
|
60
|
+
|
|
35
61
|
- run: pnpm pack --out "$RUNNER_TEMP/kit.tgz"
|
|
36
62
|
|
|
37
63
|
# Kept as long as GitHub lets a run be re-run, so re-running a failed publish job still finds
|
|
@@ -64,34 +90,31 @@ jobs:
|
|
|
64
90
|
registry-url: 'https://npm.pkg.github.com'
|
|
65
91
|
scope: '@joshuafolkken'
|
|
66
92
|
|
|
67
|
-
# Read before setup-pnpm puts the safe-chain shims on PATH: safe-chain hides recent versions from
|
|
68
|
-
# registry metadata and prints a notice to stdout, which corrupts the value (joshuafolkken/kit#3060).
|
|
69
|
-
- name: Read registry latest
|
|
70
|
-
id: registry-latest
|
|
71
|
-
run: |
|
|
72
|
-
latest=$(cd "$RUNNER_TEMP" && npm view @joshuafolkken/kit dist-tags.latest --registry https://npm.pkg.github.com)
|
|
73
|
-
echo "latest=$latest" >> "$GITHUB_OUTPUT"
|
|
74
|
-
env:
|
|
75
|
-
NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
76
|
-
|
|
77
|
-
- uses: ./.github/actions/setup-pnpm
|
|
78
|
-
with:
|
|
79
|
-
cache: 'false'
|
|
80
|
-
|
|
81
|
-
- name: Select GitHub Packages tag
|
|
82
|
-
id: publish-tag
|
|
83
|
-
run: |
|
|
84
|
-
version=$(node -p "require('./package.json').version")
|
|
85
|
-
tag=$(pnpm exec tsx scripts/release/publish-tag-cli.ts "$version" "$LATEST")
|
|
86
|
-
echo "tag=$tag" >> "$GITHUB_OUTPUT"
|
|
87
|
-
env:
|
|
88
|
-
LATEST: ${{ steps.registry-latest.outputs.latest }}
|
|
89
|
-
|
|
90
93
|
- uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
|
|
91
94
|
with:
|
|
92
95
|
name: kit-package
|
|
93
96
|
path: ${{ runner.temp }}
|
|
94
97
|
|
|
98
|
+
# `pack` chose `latest` outside this queue, so another tag's run may have moved npmjs' `latest`
|
|
99
|
+
# since: publishing then could move it back to an older version (joshuafolkken/kit#2660). The
|
|
100
|
+
# choice stays valid while npmjs' `latest` is not above this run's version, so an older tag's
|
|
101
|
+
# run publishing in between does not stop this one; a newer one stops the job before it
|
|
102
|
+
# publishes, and re-running all jobs chooses again. `sort -V` ranks a prerelease above its
|
|
103
|
+
# release, which can only stop a valid run, never let a stale one through. `backfill` needs no
|
|
104
|
+
# check: a later `latest` is never lower than the one `pack` read. The lookup runs in an empty
|
|
105
|
+
# directory with the user config skipped: setup-node writes its scoped GitHub Packages registry to
|
|
106
|
+
# `$RUNNER_TEMP/.npmrc`, which npm reads as the project config from there (joshuafolkken/kit#5376).
|
|
107
|
+
- name: Confirm npm latest is not newer
|
|
108
|
+
if: needs.pack.outputs.tag == 'latest'
|
|
109
|
+
run: |
|
|
110
|
+
latest=$(cd "$(mktemp -d)" && npm view @joshuafolkken/kit dist-tags.latest --registry https://registry.npmjs.org --userconfig /dev/null)
|
|
111
|
+
if ! printf '%s\n%s\n' "$latest" "$VERSION" | sort -V -C; then
|
|
112
|
+
echo "::error::npm latest moved to $latest, above $VERSION, after pack chose the tag; re-run all jobs"
|
|
113
|
+
exit 1
|
|
114
|
+
fi
|
|
115
|
+
env:
|
|
116
|
+
VERSION: ${{ needs.pack.outputs.version }}
|
|
117
|
+
|
|
95
118
|
# The tag reaches the command through the environment rather than expanded into it, so a step
|
|
96
119
|
# output is never parsed as shell (joshuafolkken/kit#3084). setup-node's user config carries
|
|
97
120
|
# the GitHub Packages token, so it is kept here.
|
|
@@ -99,7 +122,7 @@ jobs:
|
|
|
99
122
|
run: cd "$RUNNER_TEMP" && npm publish kit.tgz --tag "$PUBLISH_TAG" --registry https://npm.pkg.github.com
|
|
100
123
|
env:
|
|
101
124
|
NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
102
|
-
PUBLISH_TAG: ${{
|
|
125
|
+
PUBLISH_TAG: ${{ needs.pack.outputs.tag }}
|
|
103
126
|
|
|
104
127
|
publish-npm:
|
|
105
128
|
needs: pack
|
|
@@ -121,35 +144,27 @@ jobs:
|
|
|
121
144
|
with:
|
|
122
145
|
registry-url: 'https://registry.npmjs.org'
|
|
123
146
|
|
|
124
|
-
# Before setup-pnpm, for the same reason as publish-github's lookup (joshuafolkken/kit#3060).
|
|
125
|
-
- name: Read registry latest
|
|
126
|
-
id: registry-latest
|
|
127
|
-
run: |
|
|
128
|
-
latest=$(cd "$RUNNER_TEMP" && npm view @joshuafolkken/kit dist-tags.latest --registry https://registry.npmjs.org)
|
|
129
|
-
echo "latest=$latest" >> "$GITHUB_OUTPUT"
|
|
130
|
-
|
|
131
|
-
- uses: ./.github/actions/setup-pnpm
|
|
132
|
-
with:
|
|
133
|
-
cache: 'false'
|
|
134
|
-
|
|
135
147
|
- uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
|
|
136
148
|
with:
|
|
137
149
|
name: kit-package
|
|
138
150
|
path: ${{ runner.temp }}
|
|
139
151
|
|
|
140
|
-
-
|
|
141
|
-
|
|
152
|
+
# The same check as publish-github's, for the same reason.
|
|
153
|
+
- name: Confirm npm latest is not newer
|
|
154
|
+
if: needs.pack.outputs.tag == 'latest'
|
|
142
155
|
run: |
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
156
|
+
latest=$(cd "$(mktemp -d)" && npm view @joshuafolkken/kit dist-tags.latest --registry https://registry.npmjs.org --userconfig /dev/null)
|
|
157
|
+
if ! printf '%s\n%s\n' "$latest" "$VERSION" | sort -V -C; then
|
|
158
|
+
echo "::error::npm latest moved to $latest, above $VERSION, after pack chose the tag; re-run all jobs"
|
|
159
|
+
exit 1
|
|
160
|
+
fi
|
|
146
161
|
env:
|
|
147
|
-
|
|
162
|
+
VERSION: ${{ needs.pack.outputs.version }}
|
|
148
163
|
|
|
149
164
|
- name: Publish to npm
|
|
150
165
|
run: cd "$RUNNER_TEMP" && npm publish kit.tgz --access public --tag "$PUBLISH_TAG" --registry https://registry.npmjs.org --userconfig /dev/null
|
|
151
166
|
env:
|
|
152
|
-
PUBLISH_TAG: ${{
|
|
167
|
+
PUBLISH_TAG: ${{ needs.pack.outputs.tag }}
|
|
153
168
|
|
|
154
169
|
update-production:
|
|
155
170
|
needs: [publish-github, publish-npm]
|
package/.vscode/settings.json
CHANGED
|
@@ -16,6 +16,25 @@
|
|
|
16
16
|
"files.associations": {
|
|
17
17
|
"**/tsconfig/*.json": "jsonc"
|
|
18
18
|
},
|
|
19
|
+
"files.watcherExclude": {
|
|
20
|
+
"**/node_modules/**": true,
|
|
21
|
+
"**/.git/objects/**": true,
|
|
22
|
+
"**/.git/subtree-cache/**": true,
|
|
23
|
+
"**/.git/josh/**": true,
|
|
24
|
+
"**/.josh/observations/**": true,
|
|
25
|
+
"**/.svelte-kit/**": true,
|
|
26
|
+
"coverage/**": true,
|
|
27
|
+
"build/**": true,
|
|
28
|
+
"dist/**": true
|
|
29
|
+
},
|
|
30
|
+
"search.exclude": {
|
|
31
|
+
"**/node_modules": true,
|
|
32
|
+
"**/.git/josh": true,
|
|
33
|
+
"**/.svelte-kit": true,
|
|
34
|
+
"coverage": true,
|
|
35
|
+
"build": true,
|
|
36
|
+
"dist": true
|
|
37
|
+
},
|
|
19
38
|
"[markdown]": {
|
|
20
39
|
"editor.defaultFormatter": "esbenp.prettier-vscode"
|
|
21
40
|
},
|