@joshuafolkken/kit 1.1050.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/workflow-commands/SKILL.md +19 -11
- package/.claude/skills/workflow-commands/background-commands.md +4 -3
- package/.claude/skills/workflow-commands/backlogrun-child.md +1 -1
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +8 -6
- package/.claude/skills/workflow-commands/backlogrun-progress.md +1 -1
- package/.claude/skills/workflow-commands/backlogrun-steps.md +10 -10
- package/.claude/skills/workflow-commands/backlogrun.md +2 -2
- package/.claude/skills/workflow-commands/chain-rule.md +4 -2
- package/.claude/skills/workflow-commands/delegation.md +3 -3
- package/.claude/skills/workflow-commands/followup-reference.md +1 -1
- 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 +1 -1
- 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 +3 -3
- 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 +22 -2
- package/.codex/hooks.json +16 -20
- package/.github/actions/setup-pnpm/action.yml +93 -0
- package/.github/dependabot.yml +5 -1
- package/.github/workflows/ci.yml +26 -128
- package/.github/workflows/pr-classification.yml +5 -41
- package/.github/workflows/publish.yml +33 -38
- 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-HJIISEAC.js → chunk-3C4YCCEF.js} +5 -13
- package/dist/hooks/{chunk-EJDX2TOB.js → chunk-7ZPFAVR7.js} +7 -88
- package/dist/hooks/{chunk-WQ4OSBSS.js → chunk-E54KGFEQ.js} +2 -2
- package/dist/hooks/{chunk-GQ7KP45M.js → chunk-IL27YTPH.js} +2 -2
- package/dist/hooks/{chunk-DMQN45FN.js → chunk-KHWHKJOM.js} +3 -3
- package/dist/hooks/{chunk-5BK3K7V4.js → chunk-M2XDCUKD.js} +997 -478
- package/dist/hooks/{chunk-7VPDUBRN.js → chunk-NKOG3XAV.js} +150 -153
- package/dist/hooks/{chunk-NJQOBE6L.js → chunk-O4LL4HTI.js} +2 -7
- package/dist/hooks/{chunk-NAS4C7GP.js → chunk-OIZUHPJI.js} +2 -2
- package/dist/hooks/{chunk-RLDX5SOC.js → chunk-UD24EAIL.js} +2084 -1412
- package/dist/hooks/codex-hook-adapter.js +10 -11
- package/dist/hooks/duplicate-read-guard.js +5 -5
- package/dist/hooks/format-edited.js +2 -2
- package/dist/hooks/inputs.json +279 -0
- package/dist/hooks/investigation-guard.js +5 -5
- package/dist/hooks/pretool-guard.js +9 -9
- package/dist/hooks/session-lang.js +0 -1
- package/dist/hooks/stop-guard.js +178 -324
- package/dist/josh.js +162 -119
- package/dist/managed-marker/index.js +2 -1
- package/dist/version/index.js +34 -58
- package/eslint/rules/promise.js +5 -0
- package/package.json +9 -4
- 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 +3 -3
- package/prompts/collaboration-workflow/rule-delivery.md +1 -1
- package/prompts/collaboration-workflow/turn-batching.md +3 -3
- package/prompts/collaboration-workflow/upstream-interrupt.md +1 -1
- package/prompts/collaboration-workflow/wip-cap.md +25 -22
- 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 +11 -3
- package/prompts/testing-guide.md +3 -3
- package/scripts/adopt/adopt-toolkits.ts +0 -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 +6 -16
- 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 +9 -15
- package/scripts/backlog/backlog-offer-cli.ts +0 -5
- package/scripts/backlog/backlog-plan-cli.ts +1 -7
- package/scripts/backlog/backlog-plan.ts +1 -1
- package/scripts/backlog/backlog-pool.ts +3 -6
- package/scripts/backlog/backlog-rank.ts +2 -2
- 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 +5 -2
- package/scripts/behavior/behavior-cli.ts +1 -1
- package/scripts/build/build-codex-hooks.ts +26 -0
- package/scripts/build/build-hooks.ts +85 -9
- 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 +0 -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 +4 -5
- 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 +10 -2
- 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 +9 -8
- 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 +2 -2
- 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 +3 -2
- 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-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-issue.ts +1 -1
- package/scripts/git/git-preflight.ts +2 -2
- package/scripts/git/git-prompt.ts +6 -31
- package/scripts/git/git-push.ts +1 -1
- 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 +1 -0
- 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-file.ts +2 -0
- package/scripts/hooks/pre-push-unit.ts +0 -4
- package/scripts/hooks/pretool-guard.ts +22 -4
- 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 +1 -1
- package/scripts/init/start-setup-pr.ts +6 -6
- package/scripts/init/start-steps.ts +1 -0
- 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 +3 -3
- package/scripts/issue/issue-backlinks-cli.ts +1 -5
- package/scripts/issue/issue-cite-cli.ts +2 -6
- package/scripts/issue/issue-cite.ts +0 -2
- 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 +8 -0
- package/scripts/issue/issue-lint-cli.ts +1 -1
- package/scripts/issue/issue-merged.ts +2 -2
- package/scripts/{git → issue}/issue-rank.ts +1 -1
- 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 -0
- 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 +8 -1
- 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 +6 -0
- 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-cli.ts +1 -4
- 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/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-publish.ts +2 -3
- package/scripts/propagate/propagate-run.ts +0 -2
- package/scripts/propagate/propagate-steps.ts +3 -5
- package/scripts/propagate/propagate-targets.ts +0 -4
- package/scripts/propagate/propagate.ts +0 -4
- 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 +0 -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 +4 -16
- package/scripts/review/review-brief-cli.ts +23 -6
- package/scripts/review/review-brief.ts +21 -8
- 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 +0 -3
- 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 +0 -1
- package/scripts/rules/index-guard.ts +71 -0
- package/scripts/rules/issue-citation.ts +50 -25
- package/scripts/rules/lane-background.ts +15 -7
- package/scripts/rules/lane-park.ts +13 -6
- 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/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 +2 -2
- 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 +0 -1
- 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 +1 -2
- package/scripts/run/run-progress.ts +1 -2
- 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 +21 -3
- 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 +1 -1
- package/scripts/run/run-ship-return.ts +8 -3
- package/scripts/run/run-ship-review-steps.ts +18 -4
- package/scripts/run/run-ship-review.ts +11 -0
- package/scripts/run/run-ship-scoped.ts +1 -0
- package/scripts/run/run-ship-steps.ts +1 -1
- package/scripts/run/run-ship.ts +0 -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 +2 -3
- 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 +0 -1
- 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 +2 -2
- 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-remote.ts +3 -3
- 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
package/scripts/epic/epic.ts
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
* [--decision-file <path|->]
|
|
10
10
|
* tsx scripts/epic/epic.ts --remove <E> <M> <N> ... [--decision-file <path|->]
|
|
11
11
|
*/
|
|
12
|
-
import { git_gh_command } from '#scripts/
|
|
12
|
+
import { git_gh_command } from '#scripts/gh/git-gh-command'
|
|
13
13
|
import { error_text } from '#scripts/lib/error-message'
|
|
14
14
|
import { epic_add, type AddChildrenInput } from './epic-add'
|
|
15
15
|
import { epic_cli, type AddArguments, type CrossRepoAddTarget } from './epic-cli'
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
import path from 'node:path'
|
|
3
|
+
import { fileURLToPath } from 'node:url'
|
|
4
|
+
import { doctor_consumer } from '#scripts/doctor/doctor-consumer'
|
|
5
|
+
import { project_checks } from '#scripts/gate/project-checks'
|
|
6
|
+
import type { NamespaceMember } from './namespace-members'
|
|
7
|
+
|
|
8
|
+
const CHECK = 'exports'
|
|
9
|
+
const FAIL_EXIT_CODE = 1
|
|
10
|
+
// A consumer's namespaces are read from `.svelte` files and routes a TypeScript program over its
|
|
11
|
+
// `tsconfig.json` does not see, so every member they use would read as unused. The check is kit's own.
|
|
12
|
+
const CONSUMER_SKIP_REASON = 'checks only the kit repository itself, not a consumer project'
|
|
13
|
+
|
|
14
|
+
function format_member(root: string, member: NamespaceMember): string {
|
|
15
|
+
return `${path.relative(root, member.file)}:${String(member.line)} ${member.namespace}.${member.member}`
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
function report(root: string, members: ReadonlyArray<NamespaceMember>): string {
|
|
19
|
+
if (members.length === 0) return `josh ${CHECK}: no unused namespace member`
|
|
20
|
+
|
|
21
|
+
return [
|
|
22
|
+
`josh ${CHECK}: ${String(members.length)} namespace member(s) nothing reads — remove each from its namespace object (and the declaration, if nothing in its file uses it either):`,
|
|
23
|
+
...members.map((member) => ` ${format_member(root, member)}`),
|
|
24
|
+
].join('\n')
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
async function run_unused_members(root: string): Promise<number> {
|
|
28
|
+
if (doctor_consumer.is_kit_consumer(root)) {
|
|
29
|
+
console.info(project_checks.skip_notice(CHECK, CONSUMER_SKIP_REASON))
|
|
30
|
+
|
|
31
|
+
return 0
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// Loaded only past the skip: the scanner pulls in `typescript`, an optional peer a basic-profile
|
|
35
|
+
// consumer may not have, and this check runs in every consumer's gate. For the same reason the
|
|
36
|
+
// scanner is left out of the published package (`package.json` `files`); only this entry ships.
|
|
37
|
+
const { unused_members } = await import('./unused-members')
|
|
38
|
+
const members = unused_members.find_unused_members(root)
|
|
39
|
+
const output = report(root, members)
|
|
40
|
+
|
|
41
|
+
if (members.length === 0) console.info(output)
|
|
42
|
+
else console.error(output)
|
|
43
|
+
|
|
44
|
+
return members.length === 0 ? 0 : FAIL_EXIT_CODE
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) {
|
|
48
|
+
process.exitCode = await run_unused_members(project_checks.project_root(process.cwd()))
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
const unused_members_cli = { run_unused_members }
|
|
52
|
+
|
|
53
|
+
export { unused_members_cli }
|
|
@@ -23,9 +23,4 @@ function parse_completed_issue_number(raw: string | undefined): number | undefin
|
|
|
23
23
|
return digits === undefined ? undefined : Number(digits)
|
|
24
24
|
}
|
|
25
25
|
|
|
26
|
-
|
|
27
|
-
parse_issue_number_from_text,
|
|
28
|
-
parse_completed_issue_number,
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
export { followup_issue_number, parse_issue_number_from_text, parse_completed_issue_number }
|
|
26
|
+
export { parse_issue_number_from_text, parse_completed_issue_number }
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { git_gh_helpers } from '
|
|
1
|
+
import { git_gh_helpers } from '#scripts/gh/git-gh-helpers'
|
|
2
2
|
|
|
3
3
|
// joshuafolkken/kit#1539: everything a run does after its merge is cleanup, and a merge cannot be
|
|
4
4
|
// taken back. Those steps used to be plain sequential statements, so whichever of them threw first
|
|
@@ -70,6 +70,7 @@ async function run_guarded_steps(
|
|
|
70
70
|
let is_complete = true
|
|
71
71
|
|
|
72
72
|
for (const step of steps) {
|
|
73
|
+
// eslint-disable-next-line no-await-in-loop -- cleanup steps run in their declared order
|
|
73
74
|
const is_done = await run_guarded_step(is_guarded, step)
|
|
74
75
|
|
|
75
76
|
if (!is_done) is_complete = false
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { git_next_issues } from '#scripts/issue/git-next-issues'
|
|
1
2
|
import { review_attest } from '#scripts/review/review-attest'
|
|
2
3
|
import { review_stamps } from '#scripts/review/review-stamps'
|
|
3
4
|
import { run_hold } from '#scripts/run/run-hold'
|
|
@@ -5,7 +6,6 @@ import { run_progress_clock } from '#scripts/run/run-progress-clock'
|
|
|
5
6
|
import { parse_completed_issue_number } from './followup-issue-number'
|
|
6
7
|
import { git_followup_cleanup, type CleanupStep } from './git-followup-cleanup'
|
|
7
8
|
import { git_followup_pending } from './git-followup-pending'
|
|
8
|
-
import { git_next_issues } from './git-next-issues'
|
|
9
9
|
|
|
10
10
|
// **The count of unreleased merges, not the project version** (joshuafolkken/kit#1486). This line
|
|
11
11
|
// used to read the local `package.json` and was read as "the version this run just shipped"; children
|
|
@@ -208,8 +208,6 @@ const git_followup_finish = {
|
|
|
208
208
|
print_next_issues,
|
|
209
209
|
print_pending_release,
|
|
210
210
|
clear_review_records,
|
|
211
|
-
clear_round_one_snapshot,
|
|
212
|
-
clear_review_target,
|
|
213
211
|
release_worktree_hold,
|
|
214
212
|
end_progress_watcher,
|
|
215
213
|
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
+
import { git_command } from '#scripts/git/git-command'
|
|
2
|
+
import { git_spawn } from '#scripts/git/git-spawn'
|
|
1
3
|
import { observation_ledger } from '#scripts/observations/observation-ledger'
|
|
2
4
|
import { observation_ledger_prepare } from '#scripts/observations/observation-ledger-prepare'
|
|
3
5
|
import { observations_flush } from '#scripts/observations/observations-flush'
|
|
4
|
-
import { git_command } from './git-command'
|
|
5
|
-
import { git_spawn } from './git-spawn'
|
|
6
6
|
|
|
7
7
|
// The residual commit path for the observation ledger (joshuafolkken/kit#1810). A run's appended lines
|
|
8
8
|
// ride its own commit (joshuafolkken/kit#2763), so the ledger is usually clean by now and this
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { epic_parse } from '#scripts/epic/epic-parse'
|
|
2
|
+
import { git_gh_command } from '#scripts/gh/git-gh-command'
|
|
3
|
+
import { parse_json_object_safe } from '#scripts/git/parse-json-array'
|
|
2
4
|
import { poll, type PollOptions } from '#scripts/lib/poll'
|
|
3
5
|
import { z } from 'zod'
|
|
4
|
-
import { git_gh_command } from './git-gh-command'
|
|
5
|
-
import { parse_json_object_safe } from './parse-json-array'
|
|
6
6
|
|
|
7
7
|
// **A merged pull request whose `closes #N` GitHub did not apply** (joshuafolkken/kit#2770). From
|
|
8
8
|
// 2026-09-30 06:34Z every merge `followup` made left its issue open — seven in a row, where every
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
+
import { git_gh_command } from '#scripts/gh/git-gh-command'
|
|
2
|
+
import { parse_json_object_safe } from '#scripts/git/parse-json-array'
|
|
3
|
+
import { issue_label_schema } from '#scripts/git/schemas'
|
|
4
|
+
import { IN_PROGRESS_LABEL, label_name_of } from '#scripts/issue/issue-labels'
|
|
1
5
|
import { z } from 'zod'
|
|
2
|
-
import { git_gh_command } from './git-gh-command'
|
|
3
|
-
import { IN_PROGRESS_LABEL, label_name_of } from './issue-labels'
|
|
4
|
-
import { parse_json_object_safe } from './parse-json-array'
|
|
5
|
-
import { issue_label_schema } from './schemas'
|
|
6
6
|
|
|
7
7
|
// **`in-progress` means "a run is holding this issue right now", and a merged run is not holding
|
|
8
8
|
// anything** (joshuafolkken/kit#1794). `pnpm josh followup` merged the pull request and closed the
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { git_gh_command } from '#scripts/gh/git-gh-command'
|
|
2
|
+
import type { PullMergeState } from '#scripts/gh/git-gh-pr-read'
|
|
3
|
+
import { json_value } from '#scripts/lib/json-value'
|
|
4
|
+
import { z } from 'zod'
|
|
5
|
+
|
|
6
|
+
// joshuafolkken/kit#3023: `prrun` stops at a green, mergeable pull request and a person merges it by
|
|
7
|
+
// hand. Re-running `pnpm josh followup` then has to finish what a merged `fullrun` finishes — the
|
|
8
|
+
// completion report, the epic close, the merged issue's close, the `in-progress` removal, the hold
|
|
9
|
+
// release and the completion Telegram — **from the one tail `followup` already runs**, not a copy of
|
|
10
|
+
// it elsewhere: the hold release and `josh ms` act on the local work tree, which CI never sees.
|
|
11
|
+
//
|
|
12
|
+
// **A merged pull request is read, not declared.** No flag says "a person merged this"; `followup`
|
|
13
|
+
// asks the pull request, so the same command works whichever of the two merged it. The merge plan
|
|
14
|
+
// below is what the rest of the run branches on: merged skips every pre-merge step — the review and
|
|
15
|
+
// live-evidence gates, the CI wait, the AI-review scans and the merge call — and runs the tail as a
|
|
16
|
+
// merged run's, even under `--no-merge`, because there is nothing left for that flag to hold back.
|
|
17
|
+
//
|
|
18
|
+
// **A second run must not repeat the report.** Every other tail step is idempotent by nature (a
|
|
19
|
+
// closed epic is not closed twice, a released hold releases nothing), but the completion comment and
|
|
20
|
+
// the completion Telegram are writes that would land again. The comment is the record that the tail
|
|
21
|
+
// already ran: a `✅` report naming this pull request, **posted on the issue at or after the merge**.
|
|
22
|
+
// The time is what tells it apart from the report the `prrun` stop itself posted — a `--no-merge`
|
|
23
|
+
// run's tail posts the same `✅` report naming the same pull request before anything merged, and
|
|
24
|
+
// reading that one as the merged run's would skip the only report that says it merged. A report the
|
|
25
|
+
// tail wrote into a blank issue body carries no time, so it is not counted: a re-run then posts it
|
|
26
|
+
// once more as a comment, the cheaper failure than a merged run that reported nothing.
|
|
27
|
+
|
|
28
|
+
interface MergePlan {
|
|
29
|
+
is_merged: boolean
|
|
30
|
+
should_merge: boolean
|
|
31
|
+
merged_at: string | undefined
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
const COMPLETION_MARK = '✅ '
|
|
35
|
+
const PR_LINE_PREFIX = 'PR: '
|
|
36
|
+
const LINE_SEPARATOR = '\n'
|
|
37
|
+
|
|
38
|
+
const COMMENTS_SCHEMA = z.array(
|
|
39
|
+
z.object({ body: z.string().nullish(), created_at: z.string().nullish() }),
|
|
40
|
+
)
|
|
41
|
+
|
|
42
|
+
type IssueComment = z.infer<typeof COMMENTS_SCHEMA>[number]
|
|
43
|
+
|
|
44
|
+
function to_merge_plan(state: PullMergeState | undefined, is_merge_requested: boolean): MergePlan {
|
|
45
|
+
const is_merged = state?.is_merged === true
|
|
46
|
+
|
|
47
|
+
return { is_merged, should_merge: is_merged || is_merge_requested, merged_at: state?.merged_at }
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
async function read_merge_plan(
|
|
51
|
+
branch_name: string,
|
|
52
|
+
is_merge_requested: boolean,
|
|
53
|
+
): Promise<MergePlan> {
|
|
54
|
+
return to_merge_plan(await git_gh_command.pr_get_merge_state(branch_name), is_merge_requested)
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
function is_completion_text(text: string | null | undefined, pr_url: string): boolean {
|
|
58
|
+
if (typeof text !== 'string' || !text.startsWith(COMPLETION_MARK)) return false
|
|
59
|
+
|
|
60
|
+
return text.split(LINE_SEPARATOR).includes(`${PR_LINE_PREFIX}${pr_url}`)
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
function is_posted_since(comment: IssueComment, merged_at: string): boolean {
|
|
64
|
+
if (typeof comment.created_at !== 'string') return false
|
|
65
|
+
|
|
66
|
+
return Date.parse(comment.created_at) >= Date.parse(merged_at)
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
function parse_comments(comments_json: string | undefined): Array<IssueComment> {
|
|
70
|
+
const parsed = COMMENTS_SCHEMA.safeParse(json_value.parse_or_undefined(comments_json ?? ''))
|
|
71
|
+
|
|
72
|
+
return parsed.success ? parsed.data : []
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// The pure half: whether one of the issue's comments is this pull request's report, posted since it merged.
|
|
76
|
+
function has_completion_record(input: {
|
|
77
|
+
comments_json: string | undefined
|
|
78
|
+
pr_url: string
|
|
79
|
+
merged_at: string
|
|
80
|
+
}): boolean {
|
|
81
|
+
return parse_comments(input.comments_json).some(
|
|
82
|
+
(comment) =>
|
|
83
|
+
is_completion_text(comment.body, input.pr_url) && is_posted_since(comment, input.merged_at),
|
|
84
|
+
)
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// Asked only on a merged pull request: an unmerged run has never reached the tail, so its report
|
|
88
|
+
// cannot be there yet. **An unreadable issue reads as "not recorded"** — the tail then posts, and a
|
|
89
|
+
// duplicate report is the cheaper failure than a merged run that reported nothing.
|
|
90
|
+
async function is_completion_recorded(input: {
|
|
91
|
+
merged_at: string | undefined
|
|
92
|
+
issue_number: string | undefined
|
|
93
|
+
pr_url: string | undefined
|
|
94
|
+
}): Promise<boolean> {
|
|
95
|
+
const { merged_at, issue_number, pr_url } = input
|
|
96
|
+
|
|
97
|
+
if (issue_number === undefined || pr_url === undefined || merged_at === undefined) return false
|
|
98
|
+
|
|
99
|
+
const comments_json = await git_gh_command.issue_list_comments(issue_number)
|
|
100
|
+
|
|
101
|
+
return has_completion_record({ comments_json, pr_url, merged_at })
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
const git_followup_merged = {
|
|
105
|
+
has_completion_record,
|
|
106
|
+
is_completion_recorded,
|
|
107
|
+
read_merge_plan,
|
|
108
|
+
to_merge_plan,
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
export type { MergePlan }
|
|
112
|
+
export { git_followup_merged }
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
+
import { git_command } from '#scripts/git/git-command'
|
|
1
2
|
import { release_history, type HistoryReader } from '#scripts/release/release-history'
|
|
2
3
|
import { release_plan } from '#scripts/release/release-plan'
|
|
3
4
|
import { version_targets } from '#scripts/version/version-targets'
|
|
4
|
-
import { git_command } from './git-command'
|
|
5
5
|
|
|
6
6
|
// What the completion notification says about versions, now that children do not set one
|
|
7
7
|
// (joshuafolkken/kit#1486).
|
|
@@ -1,16 +1,17 @@
|
|
|
1
1
|
#!/usr/bin/env tsx
|
|
2
2
|
import { parseArgs } from 'node:util'
|
|
3
|
+
import { git_branch } from '#scripts/git/git-branch'
|
|
4
|
+
import { git_error } from '#scripts/git/git-error'
|
|
3
5
|
import { cli_body } from '#scripts/josh/cli-body'
|
|
4
6
|
import { josh_environment_file } from '#scripts/josh/josh-environment-file'
|
|
7
|
+
import { git_notify, type GitNotifyConfig } from '#scripts/notify/git-notify'
|
|
5
8
|
import { live_evidence } from '#scripts/review/live-evidence'
|
|
6
9
|
import { review_attest } from '#scripts/review/review-attest'
|
|
7
10
|
import { review_record } from '#scripts/review/review-record'
|
|
8
11
|
import { parse_issue_number_from_text } from './followup-issue-number'
|
|
9
|
-
import { git_branch } from './git-branch'
|
|
10
|
-
import { git_error } from './git-error'
|
|
11
12
|
import { git_followup_finish } from './git-followup-finish'
|
|
12
13
|
import { git_followup_flush } from './git-followup-flush'
|
|
13
|
-
import {
|
|
14
|
+
import { git_followup_merged, type MergePlan } from './git-followup-merged'
|
|
14
15
|
import { git_pr_followup } from './git-pr-followup'
|
|
15
16
|
|
|
16
17
|
josh_environment_file.load_environment_file()
|
|
@@ -204,14 +205,18 @@ async function assert_merge_gates(
|
|
|
204
205
|
}
|
|
205
206
|
|
|
206
207
|
// After the gates, before the CI wait: a line appended since the run's commit rides the pull request
|
|
207
|
-
// itself, so it merges with it — a lane's included (joshuafolkken/kit#2919).
|
|
208
|
+
// itself, so it merges with it — a lane's included (joshuafolkken/kit#2919). **A pull request that has
|
|
209
|
+
// already merged skips both** (joshuafolkken/kit#3023): the gates guard a merge this run no longer
|
|
210
|
+
// makes, and a ledger commit would land on a branch that has already gone in.
|
|
208
211
|
async function prepare_merge(
|
|
209
|
-
|
|
212
|
+
plan: MergePlan,
|
|
210
213
|
issue_number: string | undefined,
|
|
211
214
|
branch_name: string,
|
|
212
215
|
): Promise<void> {
|
|
213
|
-
|
|
214
|
-
|
|
216
|
+
if (plan.is_merged) return
|
|
217
|
+
|
|
218
|
+
await assert_merge_gates(plan.should_merge, issue_number, branch_name)
|
|
219
|
+
await git_followup_flush.commit_ledger_step(plan.should_merge, issue_number)
|
|
215
220
|
}
|
|
216
221
|
|
|
217
222
|
async function main(): Promise<void> {
|
|
@@ -225,10 +230,10 @@ async function main(): Promise<void> {
|
|
|
225
230
|
|
|
226
231
|
const issue_number =
|
|
227
232
|
cli.values['issue-number'] ?? parse_issue_number_from_text(cli.positionals[0] ?? undefined)
|
|
228
|
-
const should_merge = is_merge_resolved(cli.values)
|
|
229
233
|
const branch_name = await resolve_branch_name(cli.values.branch)
|
|
234
|
+
const plan = await git_followup_merged.read_merge_plan(branch_name, is_merge_resolved(cli.values))
|
|
230
235
|
|
|
231
|
-
await prepare_merge(
|
|
236
|
+
await prepare_merge(plan, issue_number, branch_name)
|
|
232
237
|
// **The number the run reports on is the one it used**, which is the number the pull request
|
|
233
238
|
// closes where the invocation named none (joshuafolkken/kit#1539). Recovered inside `run`, so the
|
|
234
239
|
// tail records a run the command line could not identify rather than silently skipping it.
|
|
@@ -239,10 +244,12 @@ async function main(): Promise<void> {
|
|
|
239
244
|
coderabbit_ignore_reason: cli.values['coderabbit-ignore-reason'],
|
|
240
245
|
ai_review_ignore_reason: cli.values['ai-review-ignore-reason'],
|
|
241
246
|
is_skip_watch: cli.values['skip-watch'] === true,
|
|
242
|
-
should_merge,
|
|
247
|
+
should_merge: plan.should_merge,
|
|
248
|
+
is_merged: plan.is_merged,
|
|
249
|
+
merged_at: plan.merged_at,
|
|
243
250
|
})
|
|
244
251
|
|
|
245
|
-
await git_followup_finish.finish(used_issue_number ?? issue_number, should_merge)
|
|
252
|
+
await git_followup_finish.finish(used_issue_number ?? issue_number, plan.should_merge)
|
|
246
253
|
}
|
|
247
254
|
|
|
248
255
|
try {
|
|
@@ -257,6 +264,7 @@ const git_followup_workflow = {
|
|
|
257
264
|
assert_review_attested,
|
|
258
265
|
assert_review_recorded,
|
|
259
266
|
parse_issue_number_from_text,
|
|
267
|
+
prepare_merge,
|
|
260
268
|
resolve_branch_name,
|
|
261
269
|
is_merge_resolved,
|
|
262
270
|
}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { epic_close } from '#scripts/epic/epic-close'
|
|
2
|
+
import { git_gh_command } from '#scripts/gh/git-gh-command'
|
|
3
|
+
import { git_notify, type GitNotifyConfig } from '#scripts/notify/git-notify'
|
|
2
4
|
import { git_followup_cleanup } from './git-followup-cleanup'
|
|
3
5
|
import { git_followup_issue_close } from './git-followup-issue-close'
|
|
4
6
|
import { git_followup_label } from './git-followup-label'
|
|
5
7
|
import { git_followup_stages, type StageLog } from './git-followup-stages'
|
|
6
|
-
import { git_gh_command } from './git-gh-command'
|
|
7
|
-
import { git_notify, type GitNotifyConfig } from './git-notify'
|
|
8
8
|
|
|
9
9
|
const { STAGE, lap } = git_followup_stages
|
|
10
10
|
|
|
@@ -35,6 +35,10 @@ interface WrapupInput {
|
|
|
35
35
|
// completion notification (joshuafolkken/kit#1592). Empty on a run that changed nothing `josh sync`
|
|
36
36
|
// distributes, and an empty one adds no line.
|
|
37
37
|
managed_notes: ReadonlyArray<string>
|
|
38
|
+
// A pull request merged before this run is not merged again, and a tail whose completion report is
|
|
39
|
+
// already on the issue does not post it twice (joshuafolkken/kit#3023, `git-followup-merged.ts`).
|
|
40
|
+
is_merged?: boolean | undefined
|
|
41
|
+
is_completion_recorded?: boolean | undefined
|
|
38
42
|
}
|
|
39
43
|
|
|
40
44
|
function build_notify_body(input: {
|
|
@@ -113,6 +117,8 @@ async function post_completion_notification(input: {
|
|
|
113
117
|
// merge, a step that throws is reported and the ones after it still run, rather than taking the epic
|
|
114
118
|
// close and the working-tree hold release down with it.
|
|
115
119
|
async function notify_step(input: WrapupInput): Promise<void> {
|
|
120
|
+
if (input.is_completion_recorded === true) return
|
|
121
|
+
|
|
116
122
|
await git_followup_cleanup.run_guarded_step(input.should_merge, {
|
|
117
123
|
label: 'The completion comment',
|
|
118
124
|
recovery: COMPLETION_COMMENT_RECOVERY,
|
|
@@ -227,7 +233,7 @@ async function run_tail_steps(input: WrapupInput): Promise<void> {
|
|
|
227
233
|
}
|
|
228
234
|
|
|
229
235
|
async function run_wrapup(input: WrapupInput, log: StageLog): Promise<void> {
|
|
230
|
-
if (input.should_merge) {
|
|
236
|
+
if (input.should_merge && input.is_merged !== true) {
|
|
231
237
|
await git_gh_command.pr_merge(input.branch_name)
|
|
232
238
|
lap(log, STAGE.merge)
|
|
233
239
|
}
|
|
@@ -1,18 +1,28 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { git_gh_command } from '#scripts/gh/git-gh-command'
|
|
2
|
+
import { git_gh_helpers } from '#scripts/gh/git-gh-helpers'
|
|
3
|
+
import { git_pr_ai_review, type TelegramContext } from '#scripts/gh/git-pr-ai-review'
|
|
4
|
+
import {
|
|
5
|
+
DEFAULT_STABLE_READS,
|
|
6
|
+
git_pr_checks,
|
|
7
|
+
WATCH_CONFIRMED_STABLE_READS,
|
|
8
|
+
} from '#scripts/gh/git-pr-checks'
|
|
9
|
+
import { is_coderabbit_check } from '#scripts/gh/git-pr-checks-eval'
|
|
10
|
+
import { CHECK_STATUS_PASS, type PrStateSnapshot } from '#scripts/gh/git-pr-checks-parse'
|
|
11
|
+
import { git_pr_coderabbit } from '#scripts/gh/git-pr-coderabbit'
|
|
12
|
+
import { git_pr_managed_config } from '#scripts/gh/git-pr-managed-config'
|
|
13
|
+
import { github_issue_url } from '#scripts/gh/github-issue-url'
|
|
14
|
+
import { git_closes_keyword } from '#scripts/git/git-closes-keyword'
|
|
15
|
+
import { json_value } from '#scripts/lib/json-value'
|
|
16
|
+
import type { GitNotifyConfig } from '#scripts/notify/git-notify'
|
|
17
|
+
import {
|
|
18
|
+
telegram_notify,
|
|
19
|
+
type TelegramSendInput,
|
|
20
|
+
type TelegramTaskType,
|
|
21
|
+
} from '#scripts/notify/telegram-notify'
|
|
22
|
+
import { git_followup_merged } from './git-followup-merged'
|
|
2
23
|
import { git_followup_pending } from './git-followup-pending'
|
|
3
24
|
import { git_followup_stages, type StageLog } from './git-followup-stages'
|
|
4
|
-
import { git_gh_command } from './git-gh-command'
|
|
5
|
-
import { git_gh_helpers } from './git-gh-helpers'
|
|
6
|
-
import type { GitNotifyConfig } from './git-notify'
|
|
7
|
-
import { git_pr_ai_review, type TelegramContext } from './git-pr-ai-review'
|
|
8
|
-
import { DEFAULT_STABLE_READS, git_pr_checks, WATCH_CONFIRMED_STABLE_READS } from './git-pr-checks'
|
|
9
|
-
import { is_coderabbit_check } from './git-pr-checks-eval'
|
|
10
|
-
import { CHECK_STATUS_PASS, git_pr_checks_parse, type PrStateSnapshot } from './git-pr-checks-parse'
|
|
11
|
-
import { git_pr_coderabbit } from './git-pr-coderabbit'
|
|
12
25
|
import { git_pr_followup_wrapup } from './git-pr-followup-wrapup'
|
|
13
|
-
import { git_pr_managed_config } from './git-pr-managed-config'
|
|
14
|
-
import { github_issue_url } from './github-issue-url'
|
|
15
|
-
import { telegram_notify, type TelegramSendInput, type TelegramTaskType } from './telegram-notify'
|
|
16
26
|
|
|
17
27
|
const { STAGE, lap } = git_followup_stages
|
|
18
28
|
|
|
@@ -64,6 +74,10 @@ interface FollowupInput {
|
|
|
64
74
|
ai_review_ignore_reason: string | undefined
|
|
65
75
|
is_skip_watch: boolean
|
|
66
76
|
should_merge: boolean
|
|
77
|
+
// The pull request merged before this run (joshuafolkken/kit#3023): only the tail is left to run.
|
|
78
|
+
is_merged?: boolean | undefined
|
|
79
|
+
// When it merged — a completion report posted before it is the `prrun` stop's, not this tail's.
|
|
80
|
+
merged_at?: string | undefined
|
|
67
81
|
}
|
|
68
82
|
|
|
69
83
|
const { parse_closes_issue_number } = git_closes_keyword
|
|
@@ -116,7 +130,7 @@ async function warn_if_missing_closes(branch_name: string): Promise<string | und
|
|
|
116
130
|
// on the path this whole change exists to remove. So the question asked here is the narrow one —
|
|
117
131
|
// *is this definitely an empty rollup* — and every other outcome falls through.
|
|
118
132
|
function reads_as_empty_rollup(raw_json: string): boolean {
|
|
119
|
-
const parsed =
|
|
133
|
+
const parsed = json_value.parse_or_undefined(raw_json)
|
|
120
134
|
|
|
121
135
|
if (typeof parsed !== 'object' || parsed === null || !('statusCheckRollup' in parsed)) {
|
|
122
136
|
return false
|
|
@@ -342,6 +356,8 @@ async function run_review_checks(
|
|
|
342
356
|
context: TelegramContext,
|
|
343
357
|
log: StageLog,
|
|
344
358
|
): Promise<{ notes: Array<string>; managed: Array<string> }> {
|
|
359
|
+
if (input.is_merged === true) return { notes: [], managed: [] }
|
|
360
|
+
|
|
345
361
|
const managed = await git_pr_managed_config.handle_managed_config_changes({
|
|
346
362
|
should_merge: input.should_merge,
|
|
347
363
|
})
|
|
@@ -359,6 +375,26 @@ async function run_review_checks(
|
|
|
359
375
|
return { notes: [...managed, ...check_notes, ...scan_notes], managed }
|
|
360
376
|
}
|
|
361
377
|
|
|
378
|
+
// **A tail re-run after a merge does not report twice** (joshuafolkken/kit#3023): where the issue
|
|
379
|
+
// already carries this pull request's completion report, the Telegram is skipped here and the comment
|
|
380
|
+
// in the wrapup. Answers whether it was recorded, so the wrapup skips on the same read.
|
|
381
|
+
async function notify_unless_recorded(
|
|
382
|
+
input: FollowupInput,
|
|
383
|
+
issue_number: string | undefined,
|
|
384
|
+
context: TelegramContext,
|
|
385
|
+
checks: { notes: Array<string> },
|
|
386
|
+
): Promise<boolean> {
|
|
387
|
+
const is_recorded = await git_followup_merged.is_completion_recorded({
|
|
388
|
+
merged_at: input.is_merged === true ? input.merged_at : undefined,
|
|
389
|
+
issue_number,
|
|
390
|
+
pr_url: context.pr_url,
|
|
391
|
+
})
|
|
392
|
+
|
|
393
|
+
if (!is_recorded) await notify_completion(context, checks.notes, input.should_merge)
|
|
394
|
+
|
|
395
|
+
return is_recorded
|
|
396
|
+
}
|
|
397
|
+
|
|
362
398
|
// **Answers with the issue number the run actually used** (joshuafolkken/kit#1539), which is the one
|
|
363
399
|
// the invocation named or, failing that, the one the pull request body closes. Everything downstream
|
|
364
400
|
// takes it from here rather than from the input, so the Telegram context, the completion comment and
|
|
@@ -369,8 +405,7 @@ async function run_stages(input: FollowupInput, log: StageLog): Promise<string |
|
|
|
369
405
|
|
|
370
406
|
lap(log, STAGE.closes_and_context)
|
|
371
407
|
const checks = await run_review_checks(input, context, log)
|
|
372
|
-
|
|
373
|
-
await notify_completion(context, checks.notes, input.should_merge)
|
|
408
|
+
const is_completion_recorded = await notify_unless_recorded(input, issue_number, context, checks)
|
|
374
409
|
|
|
375
410
|
lap(log, STAGE.telegram)
|
|
376
411
|
await git_pr_followup_wrapup.run_wrapup(
|
|
@@ -382,6 +417,8 @@ async function run_stages(input: FollowupInput, log: StageLog): Promise<string |
|
|
|
382
417
|
pr_url: context.pr_url,
|
|
383
418
|
should_merge: input.should_merge,
|
|
384
419
|
managed_notes: checks.managed,
|
|
420
|
+
is_merged: input.is_merged,
|
|
421
|
+
is_completion_recorded,
|
|
385
422
|
},
|
|
386
423
|
log,
|
|
387
424
|
)
|
|
@@ -426,4 +463,4 @@ export {
|
|
|
426
463
|
log_skip_notes,
|
|
427
464
|
}
|
|
428
465
|
export type { FollowupInput }
|
|
429
|
-
export type { TelegramContext } from '
|
|
466
|
+
export type { TelegramContext } from '#scripts/gh/git-pr-ai-review'
|
|
@@ -4,6 +4,7 @@ import { availableParallelism } from 'node:os'
|
|
|
4
4
|
import path from 'node:path'
|
|
5
5
|
import { PLATFORM_TEMP_ROOT } from '#scripts/josh/platform-temporary'
|
|
6
6
|
import { process_identity } from '#scripts/josh/process-identity'
|
|
7
|
+
import { process_owner_schema } from '#scripts/josh/process-owner'
|
|
7
8
|
import { stamp_file } from '#scripts/josh/stamp-file'
|
|
8
9
|
import { z } from 'zod'
|
|
9
10
|
|
|
@@ -45,9 +46,7 @@ const WAIT_CAP_MS = 120_000
|
|
|
45
46
|
// The head of the ledger is always admitted, so the smallest budget worth planning against is one core.
|
|
46
47
|
const MIN_BUDGET = 1
|
|
47
48
|
|
|
48
|
-
const reservation_schema =
|
|
49
|
-
pid: z.number(),
|
|
50
|
-
process_start: z.string().optional(),
|
|
49
|
+
const reservation_schema = process_owner_schema.extend({
|
|
51
50
|
weight: z.number(),
|
|
52
51
|
claimed_at: z.number(),
|
|
53
52
|
})
|
|
@@ -228,6 +227,7 @@ async function await_admission(context: WaitContext): Promise<void> {
|
|
|
228
227
|
while (!is_admitted(context.key, live_reservations(context.directory), context.budget)) {
|
|
229
228
|
if (context.now() >= context.deadline) return
|
|
230
229
|
|
|
230
|
+
// eslint-disable-next-line no-await-in-loop -- polling: each read waits on the state the previous one saw
|
|
231
231
|
await context.sleep(context.poll_interval_ms)
|
|
232
232
|
}
|
|
233
233
|
}
|
|
@@ -273,16 +273,10 @@ async function with_core_reservation<T>(
|
|
|
273
273
|
}
|
|
274
274
|
|
|
275
275
|
const core_budget = {
|
|
276
|
-
MIN_BUDGET,
|
|
277
|
-
POLL_INTERVAL_MS,
|
|
278
276
|
RESERVED_PREFIX,
|
|
279
|
-
WAIT_CAP_MS,
|
|
280
277
|
admitted_keys,
|
|
281
278
|
admitted_load,
|
|
282
|
-
is_admitted,
|
|
283
|
-
is_running,
|
|
284
279
|
live_reservations,
|
|
285
|
-
read_reservation,
|
|
286
280
|
release,
|
|
287
281
|
reserve,
|
|
288
282
|
with_core_reservation,
|
|
@@ -66,6 +66,11 @@ const STATIC_CHECKS: ReadonlyArray<GateCheck> = [
|
|
|
66
66
|
{ label: TYPE_CHECK_LABEL, target: 'check', reserved_cores: 1 },
|
|
67
67
|
{ label: 'cspell', target: 'cspell:dot', reserved_cores: 1 },
|
|
68
68
|
{ label: BEHAVIOR_LABEL, target: BEHAVIOR_LABEL, reserved_cores: 0 },
|
|
69
|
+
// **The unused-member check reserves no core** (joshuafolkken/kit#2987): it builds one TypeScript
|
|
70
|
+
// program and walks it single-threaded for about 5s — over well before lint and the type check, so
|
|
71
|
+
// a reservation would only take a place from the four-core CI runner's fan-out and a worker from
|
|
72
|
+
// the unit suite for the whole gate.
|
|
73
|
+
{ label: 'exports', target: 'exports:unused', reserved_cores: 0 },
|
|
69
74
|
]
|
|
70
75
|
|
|
71
76
|
// The checks, in the order their output is printed — the static set, then the unit suite last (the
|
|
@@ -91,8 +96,8 @@ function has_unit_check(checks: ReadonlyArray<GateCheck>): boolean {
|
|
|
91
96
|
return checks.some((check) => check.label === UNIT_LABEL)
|
|
92
97
|
}
|
|
93
98
|
|
|
94
|
-
// What the
|
|
95
|
-
// rather than over
|
|
99
|
+
// What the non-elastic checks hold between them: 2 + 1 + 1. Reduced over `STATIC_CHECKS`
|
|
100
|
+
// rather than over every check, because that is the set the sentence above names: `resolve_unit_worker_cap`
|
|
96
101
|
// spends this as the cores the unit suite must leave to its siblings, so summing the unit check into
|
|
97
102
|
// it would have the suite subtract its own reservation from its own budget the day that reservation
|
|
98
103
|
// stops being zero. The two sets give the same number today, which is exactly why the narrower one
|
|
@@ -331,7 +336,6 @@ function format_gate_plan(
|
|
|
331
336
|
}
|
|
332
337
|
|
|
333
338
|
const gate_plan = {
|
|
334
|
-
BEHAVIOR_LABEL,
|
|
335
339
|
GATE_CHECKS,
|
|
336
340
|
LINT_LABEL,
|
|
337
341
|
MEASURED_CORES,
|
|
@@ -343,7 +347,6 @@ const gate_plan = {
|
|
|
343
347
|
check_weight,
|
|
344
348
|
format_gate_plan,
|
|
345
349
|
format_machine,
|
|
346
|
-
format_unit_cap,
|
|
347
350
|
has_unit_check,
|
|
348
351
|
plan_of,
|
|
349
352
|
resolve_concurrency,
|
|
@@ -193,16 +193,10 @@ function report_gate_steps(
|
|
|
193
193
|
|
|
194
194
|
const gate_report = {
|
|
195
195
|
format_failure_actions,
|
|
196
|
-
format_seconds,
|
|
197
|
-
gate_step_header,
|
|
198
196
|
has_checker_warning,
|
|
199
|
-
has_warnings,
|
|
200
197
|
is_gate_step_failed,
|
|
201
198
|
is_skip_notice,
|
|
202
|
-
print_gate_step,
|
|
203
|
-
print_gate_summary,
|
|
204
199
|
report_gate_steps,
|
|
205
|
-
should_print_body,
|
|
206
200
|
}
|
|
207
201
|
|
|
208
202
|
export type { GateReport, GateStep, GateStepResult }
|
|
@@ -174,13 +174,7 @@ if (process.argv[1] === fileURLToPath(import.meta.url)) {
|
|
|
174
174
|
const pre_commit_type_check = {
|
|
175
175
|
FORCE_ENV,
|
|
176
176
|
TYPE_CHECK_ARGUMENTS,
|
|
177
|
-
format_refusal,
|
|
178
|
-
format_skip,
|
|
179
|
-
is_recorded_check_this_check,
|
|
180
|
-
read_commit_tree,
|
|
181
|
-
reusable_green_commit,
|
|
182
177
|
run_pre_commit_type_check,
|
|
183
|
-
unexpected_arguments,
|
|
184
178
|
}
|
|
185
179
|
|
|
186
180
|
export type { CommitTree }
|