feat: prepare Server 0.2.0 release - #2
Merged
Merged
Conversation
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>
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>
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>
There was a problem hiding this comment.
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
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 on lines
+23
to
+27
| const workspaces = run('yarn', ['workspaces', 'list', '--json']) | ||
| .trim() | ||
| .split('\n') | ||
| .filter(Boolean) | ||
| .map(line => JSON.parse(line)); |
Comment on lines
+21
to
+22
| export * from '@bedrock-core/observable'; | ||
| export * from '@bedrock-core/observable/minecraft'; |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.

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.0from npm, excludes i18n tests and internal root docs from tarballs, restricts manual publishing tomain, 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:
workspace:rangesAfter the Version PR is merged,
@bedrock-core/observable@0.1.0and@bedrock-core/db@0.1.0need 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.