v0.2.0
The data model moves
from "ship every snapshot in the tarball" to
"cache on first use, fetch from the hosted Worker, fall back to a
bundled subset." The npm version stops tracking spec data and starts
meaning code again.
Added
- ECMA-402 reaches edition parity with ECMA-262. 402 publishes
each annual edition as anesYYYYbranch (not a tag); the catalog
now exposes the fulles2016–es2025range plusmain, where it
previously had onlyes2025-candidate+main.spec.diff,
spec.history, and edition-pinnedclause.getnow work across the
402 annual line. - ECMA-402 proposals are indexed.
proposal.list/proposal.get
now cover theecma402/proposal set (~32 proposals that were
entirely missing), andproposal.listgains aspecfilter
({ spec: "402" }). Every proposal row carries aspectag.
Removed
- Dropped the transient
es2025-candidate402 pin. It predated the
finales2025branch, which now supersedes it.clause.get,
spec.diff, and the other edition-aware tools no longer accept
edition: "es2025-candidate"— usees2025.
Changed
- Snapshots are sourced through a cache → hosted Worker → bundled
fallback chain (loadSnapshot). The stdio server caches each
snapshot under~/.cache/tc39-mcp/on first network fetch and serves
it from disk thereafter, revalidating against the Worker only after a
~4-hour freshness window (conditionalIf-None-Match). lateston ECMA-402 now resolves toes2025(the newest annual
edition), matching 262's "latest = newest stable" semantics. Use
main/draft/nextfor the working draft.- The npm tarball shrinks ~70%. It now bundles only the offline
fallback —spec-262-es2025,spec-262-main,spec-402-es2025,
spec-402-main, and the proposals + test262 indexes — instead of
every parsed edition. All other editions are fetched from the Worker
on demand. cheerioand@tc39/ecma262-bibliomove todevDependencies.
They're only used by the parser at build time (npm run parse); the
running server reads pre-parsed JSON and never imports them. A
consumer install no longer pulls cheerio's ~20-package HTML-parsing
tree (~2.4 MB). The published tarball also dropsdist/docsand
dist/refresh(build/CI-only code that runs fromsrc/via tsx,
never at runtime).- Refresh decouples from the npm version.
refresh.ymlupdates R2
every ~4 hours (live freshness for networked users) and re-bakes the
npm bundle at most monthly, ending the ~2000-PATCH-bumps-per-year
flood. A new annual edition still publishes immediately via the
normal code-release path. @tc39/ecma262-bibliois pinned to an exact version (per its
README's "pin a precise version" guidance), so the parse metadata
layer is reproducible alongside the SHA-pinned spec HTML.- The 262 parser gained an HTML-discovery fallback: since the
pinned biblio is a snapshot ofmain, it can lag the HTML being
parsed (a newermain, or an older edition carrying clauses since
dropped). Any<emu-clause>the biblio doesn't list is now still
captured, with metadata synthesized from the element — so a stale or
mismatched biblio can no longer silently drop a clause.
Fixed
- Conditional revalidation returns
304from the hosted Worker. The
stdio loader sendsIf-None-Matchwhen re-checking a live snapshot
past its ~4-hour freshness window; the/r2/proxy previously ignored
it and re-sent the full body. It now returns a bodyless304on an
etag match, so a revalidation costs a header round-trip instead of a
tens-of-MB re-download.
Notes
- stdio now makes HTTPS requests to source non-cached snapshots
(by default the hosted Worker; override withTC39_MCP_BASE_URLto
self-host or air-gap). Tool arguments and clause ids never leave the
process — seedocs/privacy.md. - v0.1.x installs are unaffected; this is a backward-compatible minor
at the tool/protocol level.