Repository navigation
fix(ci): run extension typecheck/lint inside the lint gate (#1182) - #1226
Merged
Merged
Conversation
Each extensions/* package declares its own typecheck (all six) and lint
(two) scripts, but the root tsconfig and biome.jsonc exclude extensions/
and CI only ran ext:install. campaign-controller sat at 15 tsc errors and
8 biome errors on main while every gate stayed green.
Repair campaign-controller first:
- ActionErrorClass gains "dispatch_rejected", which two call sites
already persisted.
- FollowUpStoreDeps types errorClass as ActionErrorClass and declares
requireProgress on the followUps seam.
- branch-freshness narrows the nullable branchUpdater once and adapts
the transport's { message } result to MutationIoResult.
- FollowUpStore.#update binds SQLQueryBindings instead of unknown.
- Test-side drift: TickCommandDeps in tick-command.test.ts, the dispatch
recorder shape and outcome narrowing in branch-freshness.test.ts,
unused imports in the e2e test, plus biome import ordering.
Then add the gate. scripts/check-extensions.ts runs every extension's
declared typecheck and lint, repairs a missing node_modules with a
frozen install first, and rides inside `bun run lint` so a local
`bun run verify` goes red the same way CI does. ci.yml moves ext:install
ahead of lint. AGENTS.md and the ci-parity config document the guard.
Closes #1182. Closes warren-c26c.
luantaraschi
added a commit
to luantaraschi/warren
that referenced
this pull request
Sep 4, 2026
…(warren-fe72, jayminwest#1236) Root `bun test` sweeps extensions/**, and those imports resolve only against each package's own node_modules, so a checkout with nothing but a root install failed the gate on a module error and skipped 32 tests. The frozen install that check:extensions gained in jayminwest#1226 is extracted as ensureInstalled and called from check-coverage before the sweep, so both guards repair a checkout the same way.
jayminwest
pushed a commit
that referenced
this pull request
Sep 4, 2026
…(warren-fe72, #1236) (#1244) Root `bun test` sweeps extensions/**, and those imports resolve only against each package's own node_modules, so a checkout with nothing but a root install failed the gate on a module error and skipped 32 tests. The frozen install that check:extensions gained in #1226 is extracted as ensureInstalled and called from check-coverage before the sweep, so both guards repair a checkout the same way.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Closes #1182.
Each
extensions/*package declares its owntypecheck(all six) andlint(two) scripts, but the roottsconfig.jsonandbiome.jsoncexcludeextensions/and CI only ranext:install.extensions/campaign-controllersat at 15 tsc errors and 8 biome errors onmainwhile every gate stayed green.This PR follows the sequence the issue suggests: repair campaign-controller first, then add the gate so it lands green.
Campaign-controller repair
ActionErrorClassgains"dispatch_rejected". Two call sites already persisted that value.FollowUpStoreDepstypeserrorClassasActionErrorClassand declaresrequireProgresson thefollowUpsseam, matching the realFollowUpStore.branch-freshness.tsnarrows the nullablebranchUpdateronce before the closure, and adapts the transport's{ message }result to theMutationIoResultthe journal expects.FollowUpStore.#updatebindsSQLQueryBindingsinstead ofunknown.TickCommandDepsintick-command.test.ts(replacing an unusedGRAMMARconstant), the dispatch recorder shape and outcome narrowing inbranch-freshness.test.ts, unused imports in the e2e test, plus biome import ordering and formatting in three files.Extension tests: 487 pass, unchanged.
The gate
scripts/check-extensions.tsdiscovers everyextensions/*package, runs thetypecheckandlintscripts it declares (skipping any it does not), and fails with acd extensions/<x> && bun run <gate>hint on the first red one. A missingnode_modulesgetsbun install --frozen-lockfilefirst, so a fresh clone'sbun run verifydoes not fail on a resolution error.It rides inside
bun run lintbecause the 12-gate manifest is frozen, and a CI-only step would leave localbun run verifygreen while an extension is broken. Also runnable standalone asbun run check:extensions.ci.ymlmovesext:installahead oflint.scripts/ci-parity-config.jsonupdates theext:installjustification.AGENTS.mdlists the guard as the tenth lint-riding guard.scripts/check-extensions.test.tscovers discovery and the runner through a spawn seam.Verification
bun run check:all: 12/12 gates pass.bun run check:extensionsfails with bothtypecheckandlintnamed, so the guard catches the exact statemainwas in.