Skip to content

feat!: migrate the monorepo to Bun and Biome - #327

Open
alexander-sei wants to merge 4 commits into
mainfrom
alexanderh/plt-859-migrate-the-monorepo-to-bun-revive-split-and-rebase-pr-306
Open

feat!: migrate the monorepo to Bun and Biome#327
alexander-sei wants to merge 4 commits into
mainfrom
alexanderh/plt-859-migrate-the-monorepo-to-bun-revive-split-and-rebase-pr-306

Conversation

@alexander-sei

@alexander-sei alexander-sei commented Aug 13, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Replaces pnpm/Jest with Bun 1.3.14 for installs, workspace scripts, tests, and CI; Biome 2.5.8 handles lint/format. Node 24 remains pinned for npm packing and OIDC publishing.
  • Publishes ESM-only majors for all five packages through the existing Changesets + npm OIDC flow. @sei-js/precompiles exposes ., ./ethers, ./viem, and ./precompiles; @sei-js/sei-global-wallet/solana remains available.
  • Ports the complete MCP test suite without rebasing stale PR Migrate to Bun #306 and preserves the fix(mcp-server): enforce session binding and response isolation in HTTP SSE transport #312 SSE session-binding/security assertions. Checks now run on pull requests (PLT-846); Mintlify is not reintroduced.

Review follow-ups

  • Fixed flattened MCP package metadata and added enforced built-CLI checks; both launch paths report 0.3.3.
  • Added Bun-aware TypeScript checking for every test, explicit mock/cache resets, import-safe MCP startup, and injected config parsing. The suite is hermetic and passes randomized/repeated execution.
  • Preserved decimal and canonical hex EVM chain/block identifiers while rejecting blanks, exponent notation, fractions, negatives, and unsafe integers.
  • Enforced NodeNext resolution for tsc-emitted packages and local lockfile-installed publish tooling.
  • Removed the broken nested create-sei Biome config, stale tracked coverage JSON, dangling declaration/source maps, and duplicated precompile bundles. Split ESM chunks preserve object identity across subpaths.
  • Restored per-package Codecov flags with exact LCOV paths and excluded test helpers. Generated create-sei projects target the precompiles v3 release.

Coverage reconciliation

The Jest and Bun percentages are not directly comparable because Jest instrumented every configured source file while Bun instruments loaded files and counts lines differently. These are the actual source totals, not a claimed coverage improvement:

Package Base Jest / Codecov Bun LCOV
create-sei no source report no source report (target removed)
precompiles 123/123 lines (100%) 555/555 (100%)
registry 12/12 (100%) 12/12 (100%)
sei-global-wallet 10/10 (100%) 45/45 (100%)
mcp-server 900/1132 (79.50%) 2453/3163 (77.55%, informational only)

Test plan

  • bun install --frozen-lockfile
  • bun run check (Biome + TypeScript for all migrated tests)
  • bun run build
  • bun run test — 485 tests across 39 files; 0 failures
  • bun test --isolate --randomize --rerun-each=3 packages — 1,455 passes; 0 failures
  • bun run lint:pack:all — publint, ATTW ESM profile, precompile export/identity checks, and built MCP CLI versions
  • npm dry-run tarballs for all five packages — zero test files and zero dangling maps
  • Node smoke tests for both MCP launch paths, create-sei CLI, registry, and precompile subpaths

Replace pnpm/Jest with Bun for install, test, and CI, keep Biome as
the linter/formatter, and publish ESM-only packages to npm via Changesets.

Co-authored-by: Cursor <cursoragent@cursor.com>
@codecov-commenter

codecov-commenter commented Aug 13, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 95.78947% with 4 lines in your changes missing coverage. Please review.
✅ Project coverage is 81.19%. Comparing base (c928ae9) to head (640cfee).

Files with missing lines Patch % Lines
packages/mcp-server/src/core/resources.ts 81.81% 2 Missing ⚠️
packages/mcp-server/src/core/chains.ts 80.00% 1 Missing ⚠️
packages/mcp-server/src/index.ts 91.66% 1 Missing ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##             main     #327      +/-   ##
==========================================
- Coverage   81.83%   81.19%   -0.65%     
==========================================
  Files          70       71       +1     
  Lines        1277     3775    +2498     
  Branches      162        0     -162     
==========================================
+ Hits         1045     3065    +2020     
- Misses        232      710     +478     
Flag Coverage Δ
mcp-server 77.55% <95.69%> (?)
precompiles 100.00% <100.00%> (?)
registry 100.00% <ø> (?)
sei-global-wallet 100.00% <100.00%> (?)

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

Comment thread packages/create-sei/biome.json Outdated
seidroid[bot]
seidroid Bot previously requested changes Aug 13, 2026

@seidroid seidroid Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The Bun/Biome migration is largely a faithful port — the #312 SSE session-binding tests and validateSecurityConfig survive intact, and the ESM-only break carries a major changeset for all five packages — but flattening dist/ broke package-info.ts's relative path, so the published sei-mcp-server will report version 0.0.0. The PR also edits the in-tree AI-reviewer guideline file to pre-emptively discount Codecov regressions caused by this same PR, which needs to be substantiated rather than asserted.

Findings: 2 blocking | 16 non-blocking | 7 posted inline

Blockers

  • None at the file/PR level.
  • 2 blocking issue(s) flagged inline on specific lines.

Non-blocking

  • Second-opinion coverage was partial: cursor-review.md is empty, so only the Codex pass and this pass produced findings. Codex's single finding (the package-info.ts path) is confirmed and included below.
  • Codecov is not reconciled with the new instrumentation. codecov.yml (unchanged) defines path-based flags with 80% project targets for create-sei, precompiles, registry and sei-global-wallet, but coverage.yml now uploads a single root coverage/lcov.info with no flags: input, and bun test --coverage only instruments files the tests import (vs. Jest's collectCoverageFrom: src/**/*.ts). Please attach the actual per-package before/after numbers to the PR so the swing can be judged, and update codecov.yml/the upload step if flag attribution no longer works.
  • Test isolation weakened within files. packages/mcp-server/jest.config.js set clearMocks: true and resetMocks: true; there is no Bun equivalent and bunfig.toml does not replicate it, and jest.resetModules() was dropped from server.test.ts's beforeEach with no replacement. bun test --isolate isolates per file, not per test, so mock implementations and module state now persist across tests inside a file. Worth confirming each ported suite clears explicitly.
  • Test files are no longer type-checked anywhere. tsconfig.base.json now excludes **/*.test.ts, **/*.spec.ts and **/tests/**; every package tsconfig uses include: ["src"] (so the new root bun-test.d.ts is referenced by no tsconfig and is effectively dead); and no package defines a typecheck script — bun run check is Biome only. The deleted tsconfig.test.json was the only thing covering src/tests/**. Consider restoring a test tsconfig plus a tsc --noEmit step in checks.yml.
  • Node version pinning was dropped. .nvmrc is deleted and neither checks.yml nor coverage.yml pins Node, yet lint:pack:publint shells out to publint --pack npm (which invokes npm pack) and all five packages are consumed on Node. Only release.yml still pins Node 24. Consider keeping a Node pin in CI and/or adding engines.node to the packages.
  • config.test.ts works around the missing jest.resetModules() by cache-busting the specifier: import(../../core/config.js?reload=${Date.now()}-${Math.random()}). It works, but it leaks a module instance per call and depends on Bun honouring query strings on relative specifiers. A mock.module-based reset (or an explicit reset export on the config module) would be more durable.
  • Per-package test scripts (bun test --isolate src) are no longer exercised by CI — checks.yml runs the root bun test --isolate packages instead — so they can silently drift. Same for build:all/test:all, which are now thin aliases.
  • viem moved from ^2.30.5 to an exact 2.37.2 in mcp-server's runtime dependencies (and precompiles devDependencies) with no mention in the changeset. An exact pin in a published package's runtime deps means upstream security fixes require a manual bump; if the pin is deliberate, a note in the changeset would help.
  • declarationMap is now enabled for precompiles, registry, mcp-server, and sourceMap too for sei-global-wallet, while every package still ships files: ["dist"]. The published .d.ts.map/.js.map files therefore point at src/** that is not in the tarball. Either add src to files or drop the map flags (flagged inline on packages/precompiles/tsconfig.json).
  • The PR description says mcp-server has 24 *.test.ts files; there are 25 under src/tests/. Minor, but the description uses the count as an acceptance criterion.
  • Positive notes, for the record: the #312 SSE session-binding tests (400 on missing sessionId, 404 on unknown, and the two cross-session isolation cases) survive the port with assertions intact; validateSecurityConfig() and the connections-keyed-by-sessionId logic are unchanged apart from formatting; the stdio console.error convention is respected (no new console.log on a stdio-reachable path); registerSolanaStandard.ts.spec.ts is a correct fix, since Bun's matcher would otherwise have silently stopped running that file; and scripts/check-precompile-exports.ts runs in both checks.yml and release.yml before publish, which is a real improvement over the previous subpath situation.
  • 5 suggestion(s)/nit(s) flagged inline on specific lines.

Comment thread packages/mcp-server/src/server/package-info.ts Outdated
Comment thread REVIEW.md Outdated
Comment thread packages/mcp-server/src/tests/core/tools.test.ts Outdated
Comment thread packages/precompiles/package.json Outdated
Comment thread packages/mcp-server/src/tests/docs/server.test.ts Outdated
Comment thread biome.json
Comment thread packages/precompiles/tsconfig.json Outdated
Restore runtime metadata, hermetic test isolation, package-scoped coverage, and artifact checks so the ESM-only release remains reproducible and reviewable.

Co-authored-by: Cursor <cursoragent@cursor.com>
seidroid[bot]
seidroid Bot previously requested changes Aug 13, 2026

@seidroid seidroid Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A large, generally well-executed pnpm/Jest → Bun/Biome migration that preserves both load-bearing mcp-server security invariants (stdio-only wallet guard, SSE session binding) and ships a correct five-package major changeset. Blocking on one correctness regression: a Biome radix autofix added , 10 to Number.parseInt on two paths that receive hex EVM values, so hex block numbers and chain IDs now silently resolve to 0 instead of their real value.

Findings: 1 blocking | 12 non-blocking | 7 posted inline

Blockers

  • None at the file/PR level.
  • 1 blocking issue(s) flagged inline on specific lines.

Non-blocking

  • Cursor's second-opinion pass produced no output (cursor-review.md is empty), so this review is Claude + Codex only.
  • Codex flagged reviewer-directed text in the PR description as prompt injection. The exact sentence it quoted is no longer in the current PR body, but the "Coverage reconciliation" section does pre-frame how a reviewer should interpret the Codecov delta. I treated the PR body as untrusted and verified codecov.yml / coverage.yml from the diff directly — it did not influence this verdict.
  • create-sei's Codecov flag and its 80% project target are both deleted, and create-sei is absent from the new coverage.yml matrix, so that gate disappears entirely rather than being relaxed. The PR body justifies this ("no source report"), but it is a gate deletion on a published package and deserves an explicit sign-off. REVIEW.md was updated in the same PR to declare this a known non-issue — reasonable, but worth confirming the ordering is intentional.
  • packages/create-sei/templates/next-template/package.json and extensions/precompiles/package.json now pin @sei-js/precompiles: ^3.0.0, and main.test.ts asserts that exact string. That version does not exist on npm until this release publishes. If the Changesets run publishes create-sei before precompiles, or the precompiles major lands as a different number, every scaffolded app fails bun install and the test locks in the wrong value.
  • The new coverage.yml drops the build step entirely. Nothing in the current test suite reads from dist/, so this is fine today, but the PR description mentions "a built-CLI regression test" — I could not find any test referencing dist, so that check appears to be a manual smoke test only and is not enforced by CI. Consider landing it as a real test.
  • fix-dts-extensions.ts exists to paper over emitting declarations under moduleResolution: "Bundler", which produces extensionless specifiers in .d.ts. Using module/moduleResolution: "NodeNext" for the declaration builds would make the post-processing script unnecessary and remove a class of silent breakage (e.g. it does not rewrite /// <reference path=...>).
  • 6 suggestion(s)/nit(s) flagged inline on specific lines.

Comment thread packages/mcp-server/src/core/resources.ts Outdated
Comment thread packages/mcp-server/src/core/chains.ts Outdated
Comment thread package.json Outdated
Comment thread packages/mcp-server/src/index.ts Outdated
Comment thread biome.json
Comment thread packages/mcp-server/package.json
Comment thread scripts/fix-dts-extensions.ts Outdated
Accept canonical hexadecimal chain and block values, make mock resets order-independent, and enforce packed CLI checks without network-resolved tooling.

Co-authored-by: Cursor <cursoragent@cursor.com>
@cursor

cursor Bot commented Aug 13, 2026

Copy link
Copy Markdown

PR Summary

High Risk
Major releases drop CommonJS and change package entry layouts across all five libraries, so every downstream upgrade must move to ESM imports. The pnpm→Bun test runner swap and broad CI changes add release risk if any package behavior regressed outside the migrated suites.

Overview
Breaking toolchain and publish shape: the repo moves from pnpm/Jest to Bun 1.3.14 for installs, builds, and tests, with Biome 2.5.8 enforced via bun run check in CI. Published @sei-js/* packages ship as ESM-only majors (no CommonJS); the changeset calls out flattened dist/, working @sei-js/precompiles subpath exports, and Viem pinned to 2.37.2 where seiDevnet is required. Node is bumped to 24 in .nvmrc for pack validation and npm OIDC publishing.

CI and quality gates: GitHub Actions swap pnpm for Bun, add PR triggers and concurrency on checks, run Biome/typecheck before build/test, and shard coverage into a per-package matrix uploading explicit lcov.info paths. Root lint:pack:all expands to publint, ATTW esm-only, plus new precompile export and MCP CLI runtime checks. Codecov gains an mcp-server flag while create-sei drops from the 80% project gate.

Scaffolding and docs: README/REVIEW.md describe Bun workflows; create-sei drops Jest, runs bun test, uses NodeNext TS, and points generated apps at @sei-js/precompiles ^3.0.0 with bun install / bun run dev in the CLI message.

Reviewed by Cursor Bugbot for commit 640cfee. Bugbot is set up for automated code reviews on this repo. Configure here.

@alexander-sei

Copy link
Copy Markdown
Contributor Author

Follow-up on the refreshed review's non-inline points:

  • Removing the create-sei Codecov target is intentional: the base commit has no source coverage report for that package, and Bun likewise produces no LCOV because its current test only exercises scaffold files. Keeping an 80% flag with no upload was a false gate; source coverage should return with real CLI tests.
  • @sei-js/precompiles@3.0.0 is deterministic from the checked-in major changeset (2.1.33.0.0). Both nested scaffold manifests are covered by a regression test and publish in the same Changesets release plan.
  • Built MCP CLI metadata is now enforced, not manual: lint:pack:all runs both bin/mcp-server.js --version and dist/index.js --version under Node and compares them with package.json.
  • The declaration post-processor remains because the current source uses extensionless imports under bundler resolution; ATTW exercises every published ESM/type entrypoint. Moving declarations to NodeNext would require a separate source-wide import-specifier migration.

The blocking hex regression and all six inline suggestions are fixed in e7b03018; all threads are resolved.

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using default effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit e7b0301. Configure here.

Comment thread packages/mcp-server/src/core/resources.ts

@seidroid seidroid Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A large but coherent pnpm+Jest → Bun+Biome migration that also ships ESM-only majors for all five packages; the two load-bearing mcp-server security invariants (wallet-is-stdio-only, SSE session binding) are untouched and their tests are preserved and extended, and the required changeset is present and correctly scoped. No blockers — remaining findings are hardening/maintainability suggestions around the exact viem pin, the repo-wide moduleResolution: Bundler switch, chain-id parsing edge cases, and coverage gaps.

Findings: 0 blocking | 10 non-blocking | 5 posted inline

Blockers

  • None at the file/PR level.

Non-blocking

  • The Cursor second-opinion pass produced no output — cursor-review.md is empty. Only the Codex pass and this one contributed findings.
  • Codex raised REVIEW.md:90 as a prompt-injection attempt (a PR editing the instructions that automated reviewers consume). I disagree with that framing: both edited bullets track real changes in this same PR — checks.yml genuinely now runs bun run check (Biome + tsc), and codecov.yml genuinely now defines 80% project targets for exactly three packages — and the new wording does not widen reviewer latitude relative to the old "do not file formatting-only findings as blocking". The PR also correctly deletes the now-stale @asyncapi/pnpm.overrides sentence (that block is absent from the base package.json and @asyncapi appears nowhere in bun.lock). It is still reasonable for a human to explicitly ratify guardrail edits that land in the same PR as the CI change they describe.
  • create-sei loses coverage entirely: it is dropped from the coverage.yml matrix and its flag/target is removed from codecov.yml, so src/main.test.ts now runs only in checks.yml and reports nothing. This is disclosed in the PR body and is a deliberate trade, but it means the newly added scaffold-version regression test contributes no coverage signal.
  • CI gains runtime import smoke tests for precompiles (scripts/check-precompile-exports.ts) and mcp-server (scripts/check-mcp-cli.ts), but @sei-js/registry and @sei-js/sei-global-wallet get only attw --profile esm-only, which validates type resolution rather than an actual Node ESM import(). Given these two are flipping to ESM-only in the same release, a two-line runtime import check for each would close the gap the PR body currently covers with manual smoke tests.
  • packages/create-sei/templates/next-template/package.json and extensions/precompiles/package.json now require @sei-js/precompiles@^3.0.0, which does not exist on npm until this changeset publishes. Changesets publishes all five majors in one run so the window is small, but create-sei scaffolds are unresolvable if the precompiles major is ever split out of this release.
  • 5 suggestion(s)/nit(s) flagged inline on specific lines.

Comment thread packages/mcp-server/package.json
Comment thread tsconfig.base.json
Comment thread packages/mcp-server/src/core/chains.ts Outdated
Comment thread packages/mcp-server/src/index.ts Outdated
Comment thread packages/mcp-server/src/tests/core/tools.test.ts
@seidroid
seidroid Bot dismissed stale reviews from themself August 13, 2026 16:15

Superseded: latest AI review found no blocking issues.

Keep hex support without treating blanks or exponent notation as chain data, and harden direct execution and ESM build checks against future regressions.

Co-authored-by: Cursor <cursoragent@cursor.com>

@seidroid seidroid Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A large but disciplined pnpm/Jest → Bun/Biome migration that publishes ESM-only majors for all five packages. I found no blockers: the two load-bearing mcp-server security invariants (stdio-only wallet mode via validateSecurityConfig, SSE messages keyed by transport.sessionId with 400/404 handling) and their tests are intact, no precompile address or ABI under src/precompiles/** was touched, and a correct major changeset covers all five packages. The notes below are non-blocking: a narrowed chain-identifier parse that now falls back to mainnet, two tsconfigs that still inherit moduleResolution: "Bundler" (contradicting the PR's NodeNext claim and forcing the hand-rolled fix-dts-extensions.ts), a likely-wrong Biome key, and missing consumer-facing docs for the CJS drop.

Findings: 0 blocking | 12 non-blocking | 6 posted inline

Blockers

  • None at the file/PR level.

Non-blocking

  • Second-opinion passes: Codex reported "No material issues found in the reviewed diff." The Cursor file (cursor-review.md) is empty even though the PR shows a cursor (Commented) review, so that pass contributed nothing to this synthesis — worth re-running if you want its input before merge.
  • No prompt-injection or instruction-bearing content was found in the diff, commit messages, or PR body.
  • create-sei loses its Codecov flag and 80% project target, and src/main.ts — the actual CLI logic (runWizard, template/extension copying, listExtensions) — still has no test that exercises it. src/main.test.ts only asserts that the extensions/precompiles directory exists and that two package.json files pin ^3.0.0. The PR's rationale ("no source report") is accurate for the old Jest setup, but it means a published CLI now ships with zero enforced coverage. Consider one test that imports main.ts and scaffolds into a temp dir.
  • The PR edits REVIEW.md, this repo's own AI-review guideline file, and relaxes two "known non-issues" entries (Biome now enforced; create-sei added to the no-Codecov-target list). Both edits are factually consistent with the migration, but changes that narrow what future automated reviews flag deserve explicit human sign-off rather than riding along inside a ~24k-line migration.
  • All four new exports maps omit "./package.json": "./package.json". Some bundler plugins and framework resolvers read it directly and now get an ERR_PACKAGE_PATH_NOT_EXPORTED. Cheap to add.
  • resetPublicClientCache() is a test-only seam added to packages/mcp-server/src/core/services/clients.ts, which is re-exported by services/index.ts. Harmless (it isn't reachable from the package's . export), but flagging it so it doesn't get mistaken for a supported API later.
  • 6 suggestion(s)/nit(s) flagged inline on specific lines.

const parsedId = Number.parseInt(networkName);
if (!Number.isNaN(parsedId)) {
return parsedId;
if (/^(?:\d+|0x[0-9a-f]+)$/i.test(networkName)) {

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[suggestion] Tightening the parse is right, but it widens what reaches the silent mainnet fallback below. Previously Number.parseInt('1328abc') returned 1328, so getRpcUrl('1328abc') gave the testnet RPC; now the regex rejects it and the function returns DEFAULT_CHAIN_ID (1329), so the same input yields the mainnet RPC. Impact is narrow — resolveChainId only feeds getRpcUrl, and getChain() throws for unrecognised strings, so most call paths fail loudly first — but silently substituting mainnet for a malformed identifier is the wrong direction for a package that hands capabilities to an LLM. Consider throwing Unsupported network: ${chainIdentifier} here (matching getChain) instead of falling through to the default.

"outDir": "./dist/types"
"outDir": "./dist",
"rootDir": "./src",
"declaration": true,

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[suggestion] The PR description says "Enforced NodeNext resolution for tsc-emitted packages," but this config (and packages/registry/tsconfig.json) still inherits moduleResolution: "Bundler" from tsconfig.base.json — only sei-global-wallet and create-sei got explicit NodeNext. Under Bundler resolution tsc emits relative specifiers verbatim (export * from './bankPrecompile'), which is exactly why scripts/fix-dts-extensions.ts has to exist. Adding "module": "NodeNext", "moduleResolution": "NodeNext" to these two configs makes tsc emit ./bankPrecompile.js directly and lets the post-processing script be deleted, removing a whole class of "attw passes today, breaks on the next import form" risk.

}
return files;
};

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[nit] This regex only matches from '...' and import('...'). It silently no-ops on import './x'; (side-effect form) and declare module './x', and it has no way to signal that it rewrote nothing. Neither form appears in today's emit, so this is correct as written — but a silent no-op is the failure mode you'd least want here, since the result is a published package whose .d.ts files don't resolve under node16/nodenext. If the NodeNext suggestion on packages/precompiles/tsconfig.json isn't taken, consider having the script assert it rewrote at least one specifier per package, so a regression fails the build rather than shipping.

"main": "./dist/cjs/index.js",
"module": "./dist/esm/index.mjs",
"types": "./dist/types/index.d.ts",
"type": "module",

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[suggestion] Adding "type": "module" and dropping dist/cjs makes require('@sei-js/precompiles') throw ERR_REQUIRE_ESM on Node 20 (same for @sei-js/registry). The changeset documents this, but two consumer-facing signals are missing: (1) neither package declares engines.node, so npm gives no warning on a Node version where require(esm) is unavailable — mcp-server correctly bumped to >=20.0.0, these didn't; (2) neither README has a migration note. For a deliberate breaking major on packages that ship to every downstream dApp, both are worth adding so the failure surfaces at install time rather than at first require.

Comment thread biome.json
"enabled": true,
"rules": {
"recommended": true,
"preset": "recommended",

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[nit] I believe the Biome key here is "recommended": true, not "preset": "recommended" — I couldn't verify locally (no node_modules in this checkout). If preset is an unrecognised key, the effect is invisible rather than fatal: Biome's default is recommended: true when the linter is enabled, so the ruleset is unchanged either way and CI stays green. Worth confirming biome check emits no unknown-key diagnostic, since this is now the config that gates every PR.

uses: actions/setup-node@v4
with:
node-version: '24'
node-version-file: '.nvmrc'

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[nit] The step name still says "for npm OIDC publishing" but the version is now indirect via .nvmrc. npm OIDC trusted publishing needs npm >= 11.5.1, which is why this was hard-pinned to '24'. It resolves to 24 today, but a future .nvmrc change for the Bun/dev toolchain would silently break publishing here. Either keep node-version: '24' on this step or add a comment on .nvmrc noting that release.yml depends on it.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants