Repository navigation
chore: simplify tooling to oxlint + tsc - #378
Conversation
Lint and type check - `check`/`fix` run oxlint with type-aware rules and type checking enabled in oxlint.config.ts (via oxlint-tsgolint); `format` runs oxfmt and is no longer checked in CI - remove uncheck, sherif, the pre-commit hook and the uncheck Stop hook in .claude/settings.json; inline the oxlint/oxfmt presets - `correctness` and `suspicious` categories as errors, plus a short list of hand-picked rules; fix the new findings - drop dependabot groups TypeScript - inline the tsconfig presets into tsconfig.json + tsconfig.lib.json - `module: nodenext`, `verbatimModuleSyntax`; relative imports use explicit `.ts` extensions, rewritten to `.js` on build - no project references; package tsconfigs share include (src + package.json) and exclude from tsconfig.lib.json Build - replace unbuild with plain `tsc` (per-file .js + .d.ts in dist) Editors and agents - VS Code recommends the oxc extension - Zed formats and fixes on save through the Oxc extension's oxfmt and oxlint language servers - replace the empty .claude/CLAUDE.md with AGENTS.md; ignore .claude/worktrees (also excluded from vitest) Misc - oxlint 1.91, oxfmt 0.76 - pin pnpm via `packageManager` instead of `devEngines` Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VVaw7QpWMUaPoB4z52Dy9p
Codecov Report✅ All modified and coverable lines are covered by tests. 📢 Thoughts on this report? Let us know! |
Merging this PR will not alter performance
Comparing Footnotes
|
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VVaw7QpWMUaPoB4z52Dy9p
There was a problem hiding this comment.
ℹ️ No critical issues — minor suggestions inline, plus one CI coverage gap.
Reviewed changes
- Tooling replacement:
uncheck,unbuild,sherifand the pre-commit/Stop hooks are gone;check/fixnow runoxlintwithtypeAware+typeCheck, and a separateformatrunsoxfmt. - TypeScript config: root
tsconfig.jsonmoves tomodule: nodenextwithallowImportingTsExtensions/rewriteRelativeImportExtensions/verbatimModuleSyntax, and the newtsconfig.lib.jsoncentralizes per-package build settings (declaration,rootDir/outDir,types: [],lib: ES2022). Project references are removed. - Build: every package's
prepackis plaintsc,publishConfig.exportspoints atdist/*.js/dist/*.d.ts, and the per-packageunbuildblocks are removed. - Explicit import extensions: every relative import in source, tests, benches and fixtures gained a
.tssuffix. - Lint fixes: two shadowed identifiers renamed in
packages/downgrader/src/v3.1-to-v3.0.ts, redundantas OpenAPIV3_1.SchemaObjectassertions dropped fromv3.1-to-v3.0.test.ts, and.sort()→.toSorted()innamespace.test.ts. - Editor/agent setup:
.vscoderecommends the Oxc extension and formats/fixes on save, Zed now uses the Oxc language servers,AGENTS.mdreplaces.claude/CLAUDE.md, and.claude/worktrees/is ignored by git and vitest.
ℹ️ Declaration emit is never exercised in CI
pnpm check type-checks through oxlint against noEmit programs, so errors that only surface while emitting .d.ts files are now first seen by the release workflow. The removed uncheck pipeline ran tsc -b with emitDeclarationOnly, so this PR reduces CI coverage rather than filling a pre-existing gap — and this repo has had a built-only types regression before. Adding pnpm -r run prepack to the check job would close it; it succeeds locally in a few seconds.
Technical details
# Declaration emit runs only at release
## Affected sites
- `.github/workflows/ci.yaml` — the `check` job runs `pnpm run check` (oxlint) only, with no build leg.
- `tsconfig.lib.json:8-9` — `declaration: true` / `noEmit: false` is the only config that exercises `.d.ts` emit.
- `packages/*/package.json` — `prepack: tsc` is the only build path.
## Required outcome
- CI should fail on a broken declaration build before a release.
## Suggested approach
- Add `pnpm -r run prepack` after `pnpm run check` in the `check` job. Verified locally: all three packages build and emit only `dist/*.js` + `dist/*.d.ts`.
## Notes
- `packages/types/src/namespace.test.ts` already covers the source-level namespace contract, but not declaration emit.deepseek-v4.1-flash-1017 (free via Pullfrog for OSS) | 𝕏
rewriteRelativeImportExtensions already allows .ts imports, and no file
imports JSON (TypeScript 7 handles `with { type: 'json' }` under nodenext
without it). Build output is unchanged.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VVaw7QpWMUaPoB4z52Dy9p
There was a problem hiding this comment.
ℹ️ No new issues in this delta. The prior
oxlint.config.tsrule-parity thread remains open, so this is not an approval.
Reviewed changes
- Zed settings parity (
13cd04c):.zed/settings.jsonnow matches the siblingstandard-server#184change. The formatter chain (source.fixAll.oxc+ theoxfmtlanguage server) andformat_on_saveare unchanged; only thelsp.typescript-language-serverblock —typescript.preferences.includePackageJsonAutoImports: "on"— was removed and the array collapsed to one line. - Dropping that
lspblock is the only behavior change in the delta, and it is limited to Zed's auto-import preference; the current formatter configuration is identical to standard-server's.
One note for the description: the "Editors and agents" section still says "The existing lsp preference is kept", which 13cd04c no longer does. The code is consistent with the sibling PR, so only that sentence needs updating.
deepseek-v4.1-flash-1017 (free via Pullfrog for OSS) | 𝕏
There was a problem hiding this comment.
No issues found in commit 865f91b.
Reviewed changes
- tsconfig cleanup (
865f91b): roottsconfig.jsondropsallowImportingTsExtensionsandresolveJsonModule.rewriteRelativeImportExtensionsstill covers the.tsspecifiers this PR uses on TS 5.7+, and the repo has no JSON imports, so neither removal leaves anything unresolvable. - Verified at this HEAD:
pnpm checkgreen on 122 files,pnpm test372 passing,oxfmt --checkclean, andpnpm -r run prepackemits onlydist/*.js+dist/*.d.tsfor all three packages.
Not an approval: the oxlint.config.ts rule-parity thread from the first review is still open, and the PR description still says the Zed lsp preference is kept even though 13cd04c removed it.
… is off - the check job now runs `pnpm -r run prepack`, so declaration-emit errors fail CI instead of first showing at release - oxc/no-accumulating-spread is no longer enabled, so its disable/enable directives in packages/router/src/index.ts guarded nothing Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VVaw7QpWMUaPoB4z52Dy9p
There was a problem hiding this comment.
✅ No new issues found.
Reviewed changes
- CI build leg (
a404ac3): thecheckjob now runspnpm -r run prepackafterpnpm run check, so declaration-emit errors fail on the PR instead of surfacing at release. Verified locally:pnpm checkis clean andpnpm -r run prepackbuilds all three packages in topological order. - Dead lint directives removed (
a404ac3): dropped theoxc/no-accumulating-spreaddisable/enable pair and its lead-in comment frompackages/router/src/index.ts. That rule is not enabled, so the directives were inert; the__proto__-specific comment at the spread itself remains.
The earlier rule-parity thread is resolved by these changes and the author's rationale.
deepseek-v4.1-flash-1017 (free via Pullfrog for OSS) | 𝕏
An imported package.json is part of the program anyway; the include entry only mattered with composite projects. Build output is unchanged. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VVaw7QpWMUaPoB4z52Dy9p
… the check job Packing every package on each PR still runs prepack, so declaration-emit errors fail CI, and each PR gets installable previews, as in standard-server. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VVaw7QpWMUaPoB4z52Dy9p
commit: |
There was a problem hiding this comment.
✅ No new issues found.
Reviewed changes
- Replaced the CI build leg with preview publishing (
db13d10): droppedpnpm -r run prepackfrom thecheckjob and added apublish_previewjob that runspkg-pr-new publish './packages/*' --pnpm --compact. Sincepnpm packruns each package'sprepack(tsc), declaration-emit errors still fail CI before release — the coverage gap from the first review stays closed. - Added
pkg-pr-new(db13d10) as a root devDependency and updated the lockfile accordingly.
deepseek-v4.1-flash-1017 (free via Pullfrog for OSS) | 𝕏
Skills under .agents/skills and .claude/skills are usually installed from elsewhere, so oxlint and oxfmt leave them as they are. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VVaw7QpWMUaPoB4z52Dy9p
There was a problem hiding this comment.
✅ No new issues found.
Reviewed changes
- Agent skills excluded from tooling (
a908fbd):oxlint.config.tsandoxfmt.config.tsboth gainedignorePatterns: ['.agents/skills/**', '.claude/skills/**'], so locally installed agent-skill files are no longer linted, type-checked, or formatted. Verified the patterns are additive to the tools' built-in ignores (node_modules,diststill skipped), that probe files in those directories are skipped while a root control file is still reported, and thatpnpm check(122 files),pnpm test(372), andoxfmt --checkall pass at this HEAD.
deepseek-v4.1-flash-1017 (free via Pullfrog for OSS) | 𝕏
sherif --fix fixes monorepo issues (unordered or mismatched dependencies and similar); AGENTS.md says to run it after changing a package.json. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VVaw7QpWMUaPoB4z52Dy9p
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VVaw7QpWMUaPoB4z52Dy9p
There was a problem hiding this comment.
✅ No new issues found.
Reviewed changes
- Restored
sherifaspnpm repo:fix(bb3dac1): re-addedsherif@^1.13.0— the initial commit had dropped a dependencymainalready carried — plus the rootrepo:fixscript,AGENTS.mdguidance for running it afterpackage.jsonchanges, and a regenerated lockfile. Verified at this HEAD:pnpm install --frozen-lockfilereports the lockfile up to date,sherif --fixfinds no issues and leaves the tree clean,pnpm checkis green (122 files, 169 rules), and all 372 tests pass.
deepseek-v4.1-flash-1017 (free via Pullfrog for OSS) | 𝕏
There was a problem hiding this comment.
✅ No new issues found.
Reviewed changes
- Dependabot grouping simplified (
b45e791):.github/dependabot.ymldrops theuncheckgroup and itsexclude-patterns, leavingdev-dependencies-minor-patchto group minor and patch dev-dependency updates — oxlint and oxfmt included, matching the PR description. Major updates stay ungrouped. Config-only; no code path is affected.
deepseek-v4.1-flash-1017 (free via Pullfrog for OSS) | 𝕏
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VVaw7QpWMUaPoB4z52Dy9p
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VVaw7QpWMUaPoB4z52Dy9p

Applies the same tooling setup as middleapi/standard-server#184: oxlint for lint and type checks, oxfmt for formatting, and plain
tscfor builds, replacinguncheckandunbuild.Lint and type check
pnpm check/pnpm fixrunoxlint, with type-aware rules and type checking enabled inoxlint.config.ts(viaoxlint-tsgolint). One pass covers lint, type-aware rules and TypeScript errors, including*.test-d.ts.pnpm formatrunsoxfmt. Formatting is no longer checked in CI.pnpm repo:fixrunssherif --fix, which fixes monorepo issues such as unordered or mismatched dependencies. It runs by hand, not in CI.uncheck, the pre-commit hook, and the Stop hook in.claude/settings.jsonthat ranuncheckafter every Claude Code turn. The former presets are written out inoxlint.config.ts,oxfmt.config.tsand the tsconfigs.correctnessandsuspiciouscategories are errors, plus a short list of hand-picked rules, withunicorn/no-thenablestill off. Rules that the old preset had and these don't cover are dropped on purpose, matching standard-server. The 49 new findings are handled:downgrader/src/v3.1-to-v3.0.ts. A callback'svaluebecameitem, and theinlineparameter, which shadowed theinline()function, becameisInline..sort()calls changed to.toSorted().no-shadow,consistent-function-scoping, andno-generated-empty-object-type. Thenamespace.test-d.tschecks build a{}type on purpose.oxc/no-accumulating-spreaddisable/enable comments inrouter/src/index.ts. That rule is no longer on, so the comments did nothing.uncheckgroup. Minor and patch dev-dependency updates, oxlint and oxfmt included, still come grouped in one PR (dev-dependencies-minor-patch).TypeScript
module: nodenextandverbatimModuleSyntax. Relative imports now use explicit.tsextensions, whichrewriteRelativeImportExtensionsturns into.json build.allowImportingTsExtensionsis implied byrewriteRelativeImportExtensions, andresolveJsonModulebynodenext, so JSON imports writtenwith { type: 'json' }are still typed.tsconfig.lib.json, includinginclude(src) andexclude. Each package tsconfig is now a singleextends, with no project references.exactOptionalPropertyTypes,lib: ES2024for tests and scripts, andES2022with no DOM types for package source.@typescript/typescript6stays becausenamespace.test.tsuses TypeScript's JS API.Build and CI
prepackruns plaintsc, which emits one.jsand one.d.tsper source file intodist.publishConfig.exportsnow points at.js/.d.tsinstead of.mjs/.d.mts. Removed the leftoverunbuildconfig from each package'spackage.json.publish_previewCI job, the same as standard-server's:pkg-pr-newpacks every package on each PR and publishes installable previews. Packing runsprepack, so errors that only come from generating.d.tsfiles fail on the PR instead of first showing at release. The olduncheckcaught them throughtsc -b.nodenextandbundler, withexactOptionalPropertyTypesandskipLibCheck: false.Editors and agents
.zed/settings.jsonis now identical to standard-server's, so the oldtypescript-language-serverauto-import preference is gone..claude/CLAUDE.mdwithAGENTS.md..claude/worktrees/, which vitest also skips now..agents/skills/**,.claude/skills/**).Misc
packageManagerinstead ofdevEngines.Verification
pnpm check: no warnings or errors. It still catches type errors in package source and in*.test-d.ts.oxfmt --check: clean.dist,LICENSE,README.mdandpackage.json. A test export that only fails during.d.tsgeneration (TS4094) fails the build, whilepnpm checkalone passes.Notes
🤖 Generated with Claude Code
https://claude.ai/code/session_01VVaw7QpWMUaPoB4z52Dy9p