Skip to content

feat: prepare Server 0.2.0 release - #2

Merged
drav0011 merged 72 commits into
mainfrom
release/0.2.0
Sep 20, 2026
Merged

drav0011 merged 72 commits into
mainfrom
release/0.2.0

Conversation

@drav0011

Copy link
Copy Markdown
Contributor

Server 0.2.0 brings the declaration-based runtime, owner-only sync, db and observable packages, current i18n, and the published BDS runner into one releasable Server line.

The release candidate now resolves @bedrock-core/bds-runner@^0.1.0 from npm, excludes i18n tests and internal root docs from tarballs, restricts manual publishing to main, and reports every package tag through the Changesets action. The release flow remains retryable: versions already present on npm are skipped while missing tags are still created.

Validation:

  • Yarn 4.9.3 immutable install
  • full lint and library build
  • 251 unit tests
  • db type tests and sync bench typecheck
  • 18/18 stable BDS GameTests through the published runner
  • simulated Version PR produced Server/runtime/sync/i18n 0.2.0 and db/observable 0.1.0
  • all six Yarn tarballs contain no tests, fixtures, or workspace: ranges
  • clean npm consumer install and Bundler-mode TypeScript import check
  • release and GameTest workflow YAML parsing

After the Version PR is merged, @bedrock-core/observable@0.1.0 and @bedrock-core/db@0.1.0 need their one-time authenticated npm publications before their trusted publishers can be configured. The normal Server Release workflow can then publish the remaining packages and create all six package tags/releases.

drav0011 and others added 30 commits August 16, 2026 04:25
TS-first localization runtime for the i18n Regolith filter's bundles: typed
verbs (t/key/raw) with selector and dot-path autocompletion, interpolation-
variable inference, CLDR plurals without Intl, the locale chain (persisted
override → client language → sibling region → default), lazy real-key
resolve() for measurement, createResourceBundle for libraries and filterless
addons, and the RawMessage-native raw() with nested rawtext parameters.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…t union

createI18n(bundle): t()/key()/raw() verbs over the generated bundle, lazy
resolve() (no materialized tables), CLDR plurals without Intl, the locale
chain (override -> client -> sibling region -> default), and display() bound
on every verb set - any DisplayText (string | RawMessage) to a plain string
for breadcrumbs, native modal text and chat. DisplayText is the one union
every text channel shares; resolveDisplay stays as the resolver-level
primitive. Creating the addon's instance registers it as the default
translation source the UI runtime injects at every root.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
raw() and resolve() read bundle.args[variant]; a CLDR category the default
locale never declares (Czech few) had no entry, so the count argument was
dropped and players saw a literal %1$s. Variants now borrow their group's
_other argument order when unrecorded, and the fixture records stock_few the
way the fixed filter now emits it.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The portal: resolutions make each repo type-check the other's sources, so
building ui while server-public was still uninstalled failed on missing
@minecraft/server types. Split install/version/build into three passes across
both clones.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The ui-runtime protocol section was three revisions behind: it documented
bcuiv0005, a 501-byte reserved block and no region field, and its own byte
arithmetic summed to 1107 rather than 1024 — anyone writing a decoder from it
landed on wrong offsets. Rewritten from control.ts/serializer.ts, including the
common fontType field and why it exists, and the title-metadata section now
describes the scroll/modal layout instead of a serializeTitleMetadata() that no
longer exists.

Removed APIs that never existed or no longer do: ore-styled advertised a whole
Tabs family, navigation exported a Screen. Fixed examples that could not
compile — navigation's <Text>Profile: {userId}</Text> builds an array child,
which Text rejects, and bare-string Button children are dropped at serialize
time.

The resource-pack README now documents the pack as what it actually is: the
only artifact published from that package is packs/RP, zipped into the .mcpack
by the release workflow. The behavior pack and packs/data are the local test
harness and never ship, so they no longer read as things a user receives.

i18n is the release headline and was reachable from nothing — it now has a real
install path (standalone and via the @bedrock-core/ui/i18n facade) and is linked
from the root README.

copilot-instructions carried the same stale protocol in five places, including
a documented test regex that would now fail.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…eeds

The docs site now carries every API in depth, so READMEs duplicating it were a
second copy waiting to drift — server-runtime sat at 473 lines, ui-runtime at
388. Each README now answers what the package is, how to install it, the
smallest real usage, and where the documentation lives. ui-runtime keeps a
condensed decoder contract (field widths, marker alphabet, the three-binding
decode template, title metadata) because that half exists nowhere else.

Every README gains the logo, the root README gains the install section it never
had, and flexbox — the one package going 1.0.0 — loses the beta banner that
contradicted its own stability commitment. Its "CSS-compatible" claim is now
honest: the CSS flexbox model, over the subset that makes sense here.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ublic

`changeset publish` shells out to `npm publish`, which does not rewrite the
workspace protocol — every published tarball carried `"@bedrock-core/i18n":
"workspace:*"` and would have been uninstallable. Proven by packing both ways:
npm leaves `workspace:*`, yarn writes the concrete version.

`release` now runs `yarn workspaces foreach npm publish --tolerate-republish`
and keeps `changeset tag` for the tags `changeset publish` used to create. The
meta package stays excluded — the workflow publishes it separately.

Every publishable package also gains `publishConfig.access: "public"`. A scoped
package defaults to restricted, so the first publish would have failed asking
for a paid plan.

And the workflow sets `NODE_AUTH_TOKEN`: `setup-node` writes an `.npmrc` keyed
on that, not on `NPM_TOKEN`, so npm would have 401'd. Yarn reads one, npm the
other; both are set now.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Ports the runner from the private server repo and teaches it the one thing the
public suite needs that the private one never did: more than one addon in a
single world.

- `--packs` is repeatable, and each pack deploys under a slug named for the
  addon it came from. Every Regolith export is called `BP/`, so deploying by
  basename copied the second addon over the first and `cross_pack_shop_present`
  could never have passed.
- Both test addons gain the ship-vs-test build split the `manifest` filter
  exists for: `manifest.test.json` extends `manifest.json` and adds
  @minecraft/server-gametest, `gametest.ts` is the only entry that imports
  `./tests`, and `tsconfig.test.json` names it. `main.ts` must never import the
  tests — that one rule is what keeps a beta module out of a release.
- bundler 1.1.2, which reads the tsconfig the settings actually name, and the
  gametest types now match the pinned server, 1.26.43.1.
- mc-tests.yml checks out server-public, ui and regolith-filters side by side —
  the arrangement rehearsal.yml already uses — so the sibling `portal:`
  resolutions and the local filter paths both resolve.

`no-unsafe-type-assertion` is scoped off for this package alone: it lives on
three untyped boundaries (manifests off disk, the BDS-Versions index off the
network, level.dat through prismarine-nbt) where an assertion states the shape
the parser was written against, and a guard would restate the same unverified
claim with more ceremony.

The in-flight `scripts/sync-meta-version.mjs` was already staged and rides
along here rather than being dropped.

    yarn test:mc → 6 passed, 0 failed (core, BDS 1.26.43.1, 5.3s)

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Script-event messages now open with a tag naming their shape: one envelope, a
batch of envelopes, or one frame of a chunked envelope. An envelope that fits in
a message is sent whole rather than nested inside a frame's `p` field, which
removes the JSON escaping nesting forced — a 5-byte message drops from 165 to
104 characters and its round trip costs about half the CPU.

The outbound queue packs consecutive envelopes into one message up to the size
cap. The engine bounds script events per tick by count, so a node that bursts in
a single tick now spends a few of its slots instead of one per envelope. Framing
charges each character what JSON actually spends escaping it instead of
reserving two for every one, so a 16KB envelope splits into 10 frames where it
took 18.

Adds the benchmarks behind those numbers: `packages/sync/bench` off the engine,
a `bench` gametest tag on a real server, and `scripts/bench-report.mjs` to read
the results out of the transcript.

Also declares the `@bedrock-core/ui-compile` portal resolution.

BREAKING CHANGE: PROTOCOL_VERSION is 2. A node on either version ignores the
other's traffic rather than misreading it.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
PROTOCOL_VERSION is replaced by PROTOCOL_MIN and PROTOCOL_MAX. A node
advertises the range it speaks in every announce and talks to each peer at
the newest version both know, so one world may hold addons built against
different releases instead of splitting into two meshes on a single channel,
each listing only its own half and each electing its own UI host.

A protocol-1 message is a bare frame with no tag and is read as one: the
frame shape never changed, only what wraps it. Announces and whois are
pinned to PROTOCOL_MIN, since the message that establishes a version cannot
assume one. Broadcasts go out at the lowest version any live peer reads, and
packing stops while a peer predating the batch tag is present; both recover
once that peer expires.

PeerInfo gains protocol and caps. Capabilities are advertised per node and
narrowed by the negotiated version, so a later addition can appear or
degrade on its own without a version bump.

A node whose range does not overlap this build's is reported through
Discovery.onIncompatible and Registry.onIncompatible, listed by
Registry.incompatible() and logged with both ranges, rather than being
silently absent from the addon list.

negotiateProtocol and capsFor are exported, and live in a module with no
engine import so the rule can be tested off a running server.

BREAKING CHANGE: PROTOCOL_VERSION is replaced by PROTOCOL_MIN and
PROTOCOL_MAX. The support window is two versions wide; raising PROTOCOL_MIN
drops support for everything below it.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
A compiled screen served over drav0011_shop:crafting_table, spawned when a crafting table is placed, so two addons' screens share one world alongside the ui demo's furnace. The ui-compile filter joins the profiles.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
An addon whose guide compiles into screens declares guideReference in
core.register(): per screen the compiled title, the baked entry values
and where each press leads — nothing of what the guide says, which every
client already holds in the pack. GuidesRegistry.provideReference()
publishes it under core-guide/reference, referenceOf() reads a peer's,
and has() counts a reference as a guide. A host that finds one presents
from it with native forms and renders nothing of the owner's; a manifest
keeps working for hosts that only render manifests.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…he ui i18n

Economy runs the ui-compile filter over the guide pages the guides filter
writes, imports the generated registrations and publishes
guideReference('drav0011_economy') beside its manifest; both addons point
their filter definitions at the TypeScript filters. @bedrock-core/i18n is
a portal to the ui checkout like every other ui package — a second,
published copy meant the build registered the addon's bundle in one
registry while Text measured against another, laying every localization
key out as literal text.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Both addons list @bedrock-core/config/compiled under ui-compile's screens
setting, so the generic config editor is baked into their packs.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…d query

Working plan for splitting persistence and reactivity into four concerns on
one transport: an observable primitive with a DDUI bridge, the replicated
mirror renamed shared with owner-only writes, a document db on a
capability-probing host resolver, and a query cache for peer data. Config is
re-based on db; patching, trust model, data-flow diagrams and the measured
spike findings are included.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The shared declaration in register() materializes a tree with get, set,
patch and subscribe on every node, mirroring config; a peer's tree comes
from its announced shape and is read-only. open() and persisted() mark
leaves or whole branches.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
One direct ABI across world, entity, player and container slot; Dimension
holds nothing; ItemStack is refused (stackable throws, non-stackable writes
land on a copy); slot writes cost 30x a world write. Folded into the db
resolver's refusal list and capability budgets.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…n 1.26.50

subscribe() returns the callback and unsubscribe(cb) is the release; equal
values do not notify; notification is synchronous at 1 us. The toNative
bridge disposes through unsubscribe(cb). An unregistered custom component
in block JSON removes the block from the world.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…items

A mined block-entity item carries no document by default and a stackable
item refuses dynamic properties on the live slot too, so ContainerSlot
becomes a runtime-decided host in the capability record.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…ns ship theirs

`core.register({ page })` publishes `addonPageReference(Page)` under the
`core-addon/page` state key and `core.pages.of()` reads a peer's, so the
elected host draws any addon's page into the shared list from the
reference alone. Both test addons declare their manifest in one module,
compile a list page from it, publish the reference, and bundle with the
local bundler so their screens' conditionals desugar the way the compile
does; Shop publishes its guide reference too.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
observable with get, set and subscribe; computed, effect and batch on top.
Delivery is synchronous, listeners are isolated and stored copy-on-write,
and a batch collapses a burst into one notification per observable. The
/minecraft entry bridges an observable to a data-driven UI observable with
toNative, writing back only when the control is client-writable.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
One adapter over both dynamic-property ABIs and a proxied world host,
each with a capability record and the measured budgets. The resolver
refuses an ItemStack and a stackable or empty slot by name, probes for
the block-entity component without caching a throw, caches the decision
per type, and owns the key scheme: core-db:<ns>:<kind>:<identity>:<collection>:<key>,
with the block type folded into the identity so a replacement block
never inherits a document.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Typed documents keyed by target on whatever host the resolver finds: a JSON envelope carrying the
document version, lazy per-document migrations with defaults applied on read, quarantine under
`<key>#bad`, a budget check before the engine with chunking on the direct ABI, `accept` acceptors
composable with `anyOf`/`allOf`/`except` and a compile-time `require` check against the target
type, and a validity gate that re-resolves the target on every operation.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
A chunked index of document identities on the world with a resumable `all()` that heals a block
replaced by another type, the `blockCleanup` custom component for `onBreak`, and `coalesce`
write-behind with parking on `entityLoad` and a flush on `playerLeave`, wired to the engine only
when a coalescing collection exists.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…fig comment

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Hosts, resolutions, document stores and handles are classes with prototype methods; a handle
resolves its target once per tick; the resolver trusts a cached type decision; index chunks are
written behind; a single value skips the batch write. Spike S8 records the numbers.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…st and returns one key per declaration

A `shared` shape declared in `register()` comes back as a typed tree whose nodes carry
`get` / `set` / `patch` / `subscribe`, with `open()`, `persisted()` and `leaf()` markers carried in
the type; peers read it through `core.shared.of<Def>(ns)` from the announced shape and write only
opened leaves; persisted leaves live on the world and are restored a tick after registration.
Sync mirrors apply a namespace's entries only from its owner unless the key is open.

`core.db` is this addon's `@bedrock-core/db`, keyed under its namespace, with the declaration API
re-exported. `register()` takes the identity as `manifest` and returns `{ config, shared }`.
`core.state` is deprecated. The reference addon and its GameTests follow.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
drav0011 and others added 25 commits September 11, 2026 08:38
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
… addons

The two addons were both the cross-addon demo and this repository's in-game test
suite. The demos move to the examples repository; what stays is
packages/test-fixtures, one package holding two packs — `main` carries the
GameTests, and `peer` exists so cross-pack discovery has a second real pack to
find.

The fixtures need the server runtime alone, so the suite no longer pulls in any
UI package: display fields are plain text, which Bedrock falls back to when no
translation key matches. They target engine 1.26.50 with @minecraft/server 2.9.0,
and the BDS pin follows at 1.26.50.25 preview.

Also adds a clean script that clears regenerated output, keeping .bds/cache so a
clean costs an unzip rather than a fresh server download.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The workspace builds against 2.9.0 — what the example addons already used — in every
package.json and in the manifests that declare the script module.

`@minecraft/vanilla-data` comes with it, in every repo that installs `@minecraft/server`:
`Block.permutation.getState` is parameterised by `BlockStateSuperset`, so a repo without
it gets a structurally different `Block` and every `Player` reaching that type stops being
assignable across a repo boundary.

`@bedrock-core/server-runtime`, `sync`, `observable` and `db` resolve to the sibling
repository rather than to npm, as `examples/` already did. The published copy left an
addon's bundle carrying two runtimes — one with `core.guides`, one with `core.screens` —
and two singletons of something that must be one.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
An addon announces every static screen it compiled — per screen the compiled title, the
value each entry is shown with, and the key each press leads to — under `core-ui/reference`:

    core.register({ ..., screens: uiReference() });

`core.screens.of(ns)` reads one addon's table and `find(key)` resolves a single key from
whichever addon published it, so a screen key navigates in a realm running none of that
addon's script.

A guide was the first thing this shape existed for, and it has no feed of its own any
more: its pages are screens like any other. `core.guides`, its manifest announcement, the
`guide` and `guideReference` options of `register()`, and their types are gone.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The workspace builds against 2.9.0. `@minecraft/vanilla-data` is installed with it so
`Block.permutation.getState` resolves the same `BlockStateSuperset` here as in every other
repository — without it the two copies of `Block` are structurally different types.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…c6134'

git-subtree-dir: packages/i18n
git-subtree-mainline: 6fb64c3
git-subtree-split: 7459044
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
`@bedrock-core/i18n` ships from this repository. `server-runtime` takes it as a
workspace dependency, and the publish workflow no longer checks out `ui` — that
checkout existed only to resolve the portal.

The runtime holds nothing about UI. The screens and pages feeds live with the
code that reads them, in `@bedrock-core/navigation`.

`register()` takes DECLARATIONS: objects that install themselves against the
runtime and hand back their own typed accessor. `config`, `shared` and `events`
are three uses of one mechanism rather than three branches, the return type is
inferred from what was declared, and `stop()` stops what it installed in reverse
order. A package outside this repository can declare its own without the floor
knowing its types.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…stalls

The config system ships from `@bedrock-core/config/server`. What the runtime
keeps is a slot table: `slot(key)` reads what a declaration installed, `fill`
puts it there, and the key is namespaced the way feeds and rpc methods are, so
two packages can never claim the same one. The floor knows no subsystem above
it by name.

`host.ts` stays, exported and with no user. It is the election a capability
will need — one owner per capability, decided by a pure function of the
registry — and nothing about screens needs it: a screen is drawn by the addon
whose pack holds it.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
discovery.peers and discovery.incompatiblePeers are ReadonlyObservable lists.
registry.addons is computed over them and holds no directory of its own, so
all(), get() and has() read one source; the host election is computed over
registry.addons, which retires its start().

A list republishes only when the world changes: a heartbeat repeating what a
peer already said refreshes liveness and notifies nobody. lastSeen therefore
leaves PeerInfo and IncompatiblePeer for discovery.lastSeen(id), since a tick
that moves every five seconds cannot live inside an observable value.

core.host.hostId becomes the observable core.host.id. onPeerUp, onPeerDown,
onRegister and onUnregister stay: an arrival is a delta, not a value.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The build profile targets local, so building the fixtures no longer deploys
into the Minecraft development pack folders. The default profile keeps the
development target, since regolith watch runs it unprofiled.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
db's unit tests run against stubs shaped like the engine's classes and sync's
against a fake script-event channel, so the engine facts they encode were
assumptions. They are GameTests now: both dynamic-property ABIs and their
budgets, an ItemStack write landing on a copy, a stackable slot refused, a
removed block taking its document and index entry, a coalesced write reaching
its target only on the flush; a payload split across messages and reassembled,
the same in non-ASCII, a burst packed once packing is negotiated, a mirror built
from a snapshot, and a chunked round trip to the peer pack.

The fixture ships a minecraft:block_entity block with the cleanup component the
block index needs, and no longer depends on @bedrock-core/config.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…r 2.10

Every @minecraft/* and toolchain range in the workspaces is `*`; the concrete
version lives in the root `resolutions` block alone. @minecraft/server moves to
2.10.0-rc.1.26.50-preview.25 with gametest and vanilla-data beside it, the
fixture manifests ask the engine for 2.10.0, and every @minecraft/server peer
range is `>=2.9.0 || >=2.10.0-0` so an RC satisfies it. The ui and apps portal
resolutions are gone; bds-runner is the one sibling that still resolves through
a portal.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The Release workflow splits in two: a push to main only opens or refreshes the
Version PR, and publishing is a workflow_dispatch that refuses to run while
changesets are still pending. Both jobs and the GameTest run use Node 24, whose
bundled npm carries the OIDC exchange trusted publishing needs. No sibling
repository is checked out anywhere: bds-runner installs from the registry and
the Regolith filters come from their published tags through setup-regolith. The
release rehearsal workflow, which existed to exercise the sibling arrangement,
is removed.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Both fixture addons resolve `core` from github.com/bedrock-core/regolith-filters
at 1.0.0 instead of a sibling checkout. The dev and build profiles spell out
their own filter settings, and `pretty` is set per profile: tab-indented output
for the local profiles, minified for the exported builds.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The declaration factories an addon passes to `register()` are named after what
they do, so the destructured result can take the plain names: `const { shared,
events } = core.register({ shared: registerShared(keys), events:
registerEvents(tree) })`. The config declaration follows the same pattern as
`registerConfig` in @bedrock-core/config.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…loor

`overlay(bound, published, bundle)` lays every bundle announced in the realm
over a library's own: `t()` prefers a published value wherever one carries the
key, so a world can rename what a library calls something or supply a locale the
library never shipped, and `resolve()` and `display()` become the world's so a
key from any addon's bundle resolves. A realm with nothing published gets the
bound instance back untouched.

The runtime announces the bundle the addon's default i18n instance was created
with on the tick after `register()`. An addon that draws nothing still has the
translation keys in its manifest resolved by whatever realm lists it.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…blishes the root

`sync-meta-version.mjs` sets @bedrock-core/server's version to
@bedrock-core/server-runtime's, character for character, prerelease tag
included; a release the runtime does not move leaves the meta where it is. The
meta's changelog entry lists db, observable, server-runtime and sync.

`publish-tarballs.mjs` includes the root workspace in its default sweep when
the root is a package, sorted after everything it depends on, so the release
script no longer needs a second `--only` pass. A package still at the `0.0.0`
placeholder is skipped: a first release is made by setting its version by hand.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…modules

The index files only re-export; the package READMEs and the per-module
comments carry the explanations. Exports are sorted alphabetically.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…d output

The test-fixture manifests are format version 3 with SemVer strings,
min_engine_version 1.26.50 and metadata.authors. Resolutions pin
@minecraft/server 2.10.0, server-ui 2.2.0, vanilla-data 1.26.50 and
server-gametest 1.0.0-beta.1.26.50-stable. ESLint ignores Regolith's temp
workspace and the fixtures' build output, and the main fixture's tsconfig
parses as strict JSON.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The server package re-exports @bedrock-core/i18n at ./i18n and depends on
it, so an addon imports createI18n from the package it already installs.
Each package README is what the package is, how to install it and one
example.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
- A node writes the one namespace its id names; ownedNamespaces, strictOwnership and
  StateOptions are removed.
- The changesets describe the publishable packages and the release as they are.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…hat exist

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Copilot AI lite review requested due to automatic review settings September 20, 2026 14:45
@drav0011
drav0011 merged commit d75b88e into main Sep 20, 2026
1 check passed

Copilot AI 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.

Copilot review overview

🟡 Changes recommended

One or more issues must be addressed before approval.

Get a fresh assessment by requesting another Copilot review.

Review effort: Lite
Findings: 2 High severity

Open (2)
What changed in this PR

Prepares Server 0.2.0 by introducing the observable, DB, i18n, sync, runtime, release tooling, and GameTest fixture updates needed for a coordinated package release.

Changes:

  • Adds new public package subpaths and runtime primitives.
  • Updates sync protocol, ownership, events, and observability.
  • Adds release automation, benchmarks, fixtures, and validation configuration.
File Description
tsconfig.eslint.json Updated as part of this pull request.
src/​sync.ts Updated as part of this pull request.
src/​observable.ts Updated as part of this pull request.
src/​index.ts Updated as part of this pull request.
src/​i18n.ts Updated as part of this pull request.
src/​db.ts Updated as part of this pull request.
scripts/​tag-packages.mjs Updated as part of this pull request.
scripts/​sync-meta-version.mjs Updated as part of this pull request.
scripts/​publish-tarballs.mjs Updated as part of this pull request.
scripts/​clean.mjs Updated as part of this pull request.
scripts/​bench-report.mjs Updated as part of this pull request.
packages/​test-fixtures/​peer/​tsconfig.json Updated as part of this pull request.
packages/​test-fixtures/​peer/​packs/​RP/​texts/​languages.json Updated as part of this pull request.
packages/​test-fixtures/​peer/​packs/​RP/​texts/​en_US.lang Updated as part of this pull request.
packages/​test-fixtures/​peer/​packs/​RP/​manifest.json Updated as part of this pull request.
packages/​test-fixtures/​peer/​packs/​data/​ui/​ui.generated.ts Updated as part of this pull request.
packages/​test-fixtures/​peer/​packs/​data/​i18n/​i18n.generated.d.ts Updated as part of this pull request.
packages/​test-fixtures/​peer/​packs/​data/​i18n/​en_US.ts Updated as part of this pull request.
packages/​test-fixtures/​peer/​packs/​data/​guides/​guides.generated.d.ts Updated as part of this pull request.
packages/​test-fixtures/​peer/​packs/​BP/​scripts/​main.ts Updated as part of this pull request.
packages/​test-fixtures/​peer/​packs/​BP/​scripts/​addon.ts Updated as part of this pull request.
packages/​test-fixtures/​peer/​packs/​BP/​manifest.json Updated as part of this pull request.
packages/​test-fixtures/​package.json Updated as part of this pull request.
packages/​test-fixtures/​main/​tsconfig.test.json Updated as part of this pull request.
packages/​test-fixtures/​main/​tsconfig.json Updated as part of this pull request.
packages/​test-fixtures/​main/​packs/​RP/​texts/​languages.json Updated as part of this pull request.
packages/​test-fixtures/​main/​packs/​RP/​texts/​en_US.lang Updated as part of this pull request.
packages/​test-fixtures/​main/​packs/​RP/​manifest.json Updated as part of this pull request.
packages/​test-fixtures/​main/​packs/​data/​ui/​ui.generated.ts Updated as part of this pull request.
packages/​test-fixtures/​main/​packs/​data/​i18n/​i18n.generated.d.ts Updated as part of this pull request.
packages/​test-fixtures/​main/​packs/​data/​i18n/​en_US.ts Updated as part of this pull request.
packages/​test-fixtures/​main/​packs/​data/​guides/​guides.generated.d.ts Updated as part of this pull request.
packages/​test-fixtures/​main/​packs/​BP/​structures/​core/​empty.mcstructure Updated as part of this pull request.
packages/​test-fixtures/​main/​packs/​BP/​scripts/​main.ts Updated as part of this pull request.
packages/​test-fixtures/​main/​packs/​BP/​scripts/​gametest.ts Updated as part of this pull request.
packages/​test-fixtures/​main/​packs/​BP/​scripts/​addon.ts Updated as part of this pull request.
packages/​test-fixtures/​main/​packs/​BP/​manifest.test.json Updated as part of this pull request.
packages/​test-fixtures/​main/​packs/​BP/​manifest.json Updated as part of this pull request.
packages/​test-fixtures/​main/​packs/​BP/​blocks/​db_probe.json Updated as part of this pull request.
packages/​test-fixtures/​eslint.config.mjs Updated as part of this pull request.
packages/​test-fixtures/​.yarnrc.yml Updated as part of this pull request.
packages/​test-fixtures/​.mcignore Updated as part of this pull request.
packages/​test-fixtures/​.gitignore Updated as part of this pull request.
packages/​test-addon/​packs/​RP/​manifest.json Updated as part of this pull request.
packages/​test-addon/​packs/​data/​guides/​en_US/​intro.mdx Updated as part of this pull request.
packages/​test-addon/​packs/​data/​guides/​en_US/​getting-started/​first-steps.mdx Updated as part of this pull request.
packages/​test-addon/​packs/​data/​guides/​en_US/​getting-started/​_category_.json Updated as part of this pull request.
packages/​test-addon/​packs/​BP/​scripts/​main.ts Updated as part of this pull request.
packages/​test-addon/​packs/​BP/​manifest.json Updated as part of this pull request.
packages/​test-addon/​package.json Updated as part of this pull request.
packages/​test-addon/​eslint.config.mjs Updated as part of this pull request.
packages/​test-addon/​config.json Updated as part of this pull request.
packages/​test-addon/​CHANGELOG.md Updated as part of this pull request.
packages/​test-addon/​.yarnrc.yml Updated as part of this pull request.
packages/​test-addon/​.vscode/​settings.json Updated as part of this pull request.
packages/​test-addon/​.vscode/​launch.json Updated as part of this pull request.
packages/​test-addon/​.vscode/​extensions.json Updated as part of this pull request.
packages/​test-addon/​.mcignore Updated as part of this pull request.
packages/​test-addon/​.gitignore Updated as part of this pull request.
packages/​test-addon-2/​packs/​RP/​manifest.json Updated as part of this pull request.
packages/​test-addon-2/​packs/​data/​guides/​en_US/​markdown-showcase.mdx Updated as part of this pull request.
packages/​test-addon-2/​packs/​data/​guides/​en_US/​intro.mdx Updated as part of this pull request.
packages/​test-addon-2/​packs/​data/​guides/​en_US/​getting-started/​buying.mdx Updated as part of this pull request.
packages/​test-addon-2/​packs/​data/​guides/​en_US/​getting-started/​_category_.json Updated as part of this pull request.
packages/​test-addon-2/​packs/​BP/​scripts/​main.ts Updated as part of this pull request.
packages/​test-addon-2/​packs/​BP/​scripts/​example.ts Updated as part of this pull request.
packages/​test-addon-2/​packs/​BP/​manifest.json Updated as part of this pull request.
packages/​test-addon-2/​package.json Updated as part of this pull request.
packages/​test-addon-2/​config.json Updated as part of this pull request.
packages/​test-addon-2/​CHANGELOG.md Updated as part of this pull request.
packages/​sync/​vitest.config.ts Updated as part of this pull request.
packages/​sync/​tsconfig.bench.json Updated as part of this pull request.
packages/​sync/​test/​negotiate.spec.ts Updated as part of this pull request.
packages/​sync/​src/​rpc.ts Updated as part of this pull request.
packages/​sync/​src/​node.ts Updated as part of this pull request.
packages/​sync/​src/​negotiate.ts Updated as part of this pull request.
packages/​sync/​src/​index.ts Updated as part of this pull request.
packages/​sync/​src/​envelope.ts Updated as part of this pull request.
packages/​sync/​src/​constants.ts Updated as part of this pull request.
packages/​sync/​README.md Updated as part of this pull request.
packages/​sync/​package.json Updated as part of this pull request.
packages/​sync/​bench/​wire.bench.ts Updated as part of this pull request.
packages/​sync/​bench/​payloads.ts Updated as part of this pull request.
packages/​server/​src/​index.ts Updated as part of this pull request.
packages/​server/​README.md Updated as part of this pull request.
packages/​server/​package.json Updated as part of this pull request.
packages/​server/​LICENSE Updated as part of this pull request.
packages/​server-runtime/​vitest.config.ts Updated as part of this pull request.
packages/​server-runtime/​test/​authorization.spec.ts Updated as part of this pull request.
packages/​server-runtime/​src/​shared/​index.ts Updated as part of this pull request.
packages/​server-runtime/​src/​shared/​declaration.ts Updated as part of this pull request.
packages/​server-runtime/​src/​shared/​__type-tests__/​shared-tree.ts Updated as part of this pull request.
packages/​server-runtime/​src/​scoped-state.ts Updated as part of this pull request.
packages/​server-runtime/​src/​runtime-version.ts Updated as part of this pull request.
packages/​server-runtime/​src/​manifest.ts Updated as part of this pull request.
packages/​server-runtime/​src/​handle.ts Updated as part of this pull request.
packages/​server-runtime/​src/​guides/​types.ts Updated as part of this pull request.
packages/​server-runtime/​src/​guides/​guides-registry.ts Updated as part of this pull request.
packages/​server-runtime/​src/​events/​index.ts Updated as part of this pull request.
packages/​server-runtime/​src/​events/​events-registry.ts Updated as part of this pull request.
packages/​server-runtime/​src/​events/​declaration.ts Updated as part of this pull request.
packages/​server-runtime/​src/​declaration.ts Updated as part of this pull request.
packages/​server-runtime/​src/​config/​scopes/​index.ts Updated as part of this pull request.
packages/​server-runtime/​src/​config/​scopes/​change-emitter.ts Updated as part of this pull request.
packages/​server-runtime/​src/​config/​broadcast.ts Updated as part of this pull request.
packages/​server-runtime/​src/​config/​authorization.ts Updated as part of this pull request.
packages/​server-runtime/​src/​config/​__type-tests__/​accessor-tree.ts Updated as part of this pull request.
packages/​server-runtime/​src/​authorization.ts Updated as part of this pull request.
packages/​server-runtime/​src/​announcement.ts Updated as part of this pull request.
packages/​server-runtime/​package.json Updated as part of this pull request.
packages/​observable/​vitest.config.ts Updated as part of this pull request.
packages/​observable/​tsconfig.json Updated as part of this pull request.
packages/​observable/​src/​native.ts Updated as part of this pull request.
packages/​observable/​src/​minecraft.ts Updated as part of this pull request.
packages/​observable/​src/​last.ts Updated as part of this pull request.
packages/​observable/​src/​index.ts Updated as part of this pull request.
packages/​observable/​src/​computed.ts Updated as part of this pull request.
packages/​observable/​src/​batch.ts Updated as part of this pull request.
packages/​observable/​README.md Updated as part of this pull request.
packages/​observable/​package.json Updated as part of this pull request.
packages/​i18n/​vitest.config.ts Updated as part of this pull request.
packages/​i18n/​tsconfig.json Updated as part of this pull request.
packages/​i18n/​src/​resources.ts Updated as part of this pull request.
packages/​i18n/​src/​plural.ts Updated as part of this pull request.
packages/​i18n/​src/​overlay.ts Updated as part of this pull request.
packages/​i18n/​src/​locale.ts Updated as part of this pull request.
packages/​i18n/​src/​interpolate.ts Updated as part of this pull request.
packages/​i18n/​src/​index.ts Updated as part of this pull request.
packages/​i18n/​src/​display.ts Updated as part of this pull request.
packages/​i18n/​src/​bundle.ts Updated as part of this pull request.
packages/​i18n/​src/​__tests__/​types.test.ts Updated as part of this pull request.
packages/​i18n/​src/​__tests__/​plural.test.ts Updated as part of this pull request.
packages/​i18n/​src/​__tests__/​locale.test.ts Updated as part of this pull request.
packages/​i18n/​src/​__tests__/​interpolate.test.ts Updated as part of this pull request.
packages/​i18n/​src/​__tests__/​fixture.ts Updated as part of this pull request.
packages/​i18n/​src/​__tests__/​contract.test.ts Updated as part of this pull request.
packages/​i18n/​README.md Updated as part of this pull request.
packages/​i18n/​package.json Updated as part of this pull request.
packages/​i18n/​eslint.config.mjs Updated as part of this pull request.
packages/​i18n/​CHANGELOG.md Updated as part of this pull request.
packages/​db/​vitest.config.ts Updated as part of this pull request.
packages/​db/​tsconfig.typecheck.json Updated as part of this pull request.
packages/​db/​tsconfig.json Updated as part of this pull request.
packages/​db/​src/​merge.ts Updated as part of this pull request.
packages/​db/​src/​index.ts Updated as part of this pull request.
packages/​db/​src/​errors.ts Updated as part of this pull request.
packages/​db/​README.md Updated as part of this pull request.
packages/​db/​package.json Updated as part of this pull request.
nodemon.json Updated as part of this pull request.
eslint.config.mjs Updated as part of this pull request.
docs/​spikes/​S7-observable-bench.md Updated as part of this pull request.
docs/​spikes/​S6-shared-bus-cost.md Updated as part of this pull request.
docs/​spikes/​S2-dynamic-property-costs.md Updated as part of this pull request.
docs/​spikes/​S-function-from-string.md Updated as part of this pull request.
docs/​README.md Updated as part of this pull request.
CHANGELOG.md Updated as part of this pull request.
bds-runner.json Updated as part of this pull request.
.gitignore Updated as part of this pull request.
.github/​workflows/​rehearsal.yml Updated as part of this pull request.
.github/​workflows/​mc-tests.yml Updated as part of this pull request.
.copilot/​config.json Updated as part of this pull request.
.changeset/​tagged-wire-and-batching.md Updated as part of this pull request.
.changeset/​sync.md Updated as part of this pull request.
.changeset/​sync-one-writer-per-namespace.md Updated as part of this pull request.
.changeset/​server-runtime.md Updated as part of this pull request.
.changeset/​screens-feed.md Updated as part of this pull request.
.changeset/​presence-as-a-value.md Updated as part of this pull request.
.changeset/​observable.md Updated as part of this pull request.
.changeset/​i18n-overlay.md Updated as part of this pull request.
.changeset/​db.md Updated as part of this pull request.

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment thread scripts/tag-packages.mjs
Comment on lines +23 to +27
const workspaces = run('yarn', ['workspaces', 'list', '--json'])
.trim()
.split('\n')
.filter(Boolean)
.map(line => JSON.parse(line));
Comment thread src/observable.ts
Comment on lines +21 to +22
export * from '@bedrock-core/observable';
export * from '@bedrock-core/observable/minecraft';
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