v4.0.0
BloxForge 4.0.0 makes Rojo, Rokit and Wally first-class: the MCP server drives the real CLIs through explicit read/plan/apply tools instead of imitating their semantics.
Breaking
- Node.js 20+ is required. The published 3.0.0 supported Node.js 18.
sync_pull,sync_statusandsync_pushare deprecated in favour ofrojo_syncback_plan/rojo_syncback_apply.rojo_syncback_applynow requires theplanHashreturned by the preview. A stale plan is refused rather than applied.
Added
rokit_*andwally_*tools backed by a real TOML reader: toolchain detection, manifest reads, shim-vs-manifest-vs-running version status, confirmed install/add/update, plus Wally manifest, lockfile, dependency graph, lock validation, search, locked install, update, and a check that installed package directories are actually mounted by the Rojo project.- Rojo 7.7 file coverage:
.luau,.server.luau,.client.luau,.plugin.lua,.plugin.luau,.project.jsonc,.meta.jsonc,.model.jsonc,.jsonc,.yml,.yaml— matching Rojo's own sync rules, which also fixes what the syncback rollback snapshot covers. includeNonScriptsonrojo_generate_sourcemap. Rojo emits only Script/LocalScript/ModuleScript by default, so folders and models could not be resolved through a generated sourcemap.instancePathSegmentson instance/source resolution, so an Instance whose name contains a dot is no longer ambiguous.resetBaseline, which quarantines an unusable.bloxforge/rojo-state.jsonand rebuilds the sync baseline explicitly.- A Rokit + Wally CI job that installs a checksum-pinned Rokit and asserts the installed Wally's actual
--lockedbehaviour.
Fixed — data integrity
- A Rokit- or Aftman-pinned project no longer silently runs an unrelated global Rojo. Resolution probed
PATHbefore honouring the manifest, so a project pinned to 7.7.0 with no installed shim ran whatever version happened to be installed. - Sourcemap resolution no longer prefixes every path with the project name. Rojo names the sourcemap root after the project, not
game, sogame.ReplicatedStorage.Sharednever matched. - Only a leading
gamesegment is treated as the DataModel. An Instance legitimately namedgamewas dropped from the middle of a path. sync_pullre-reads a rename source before moving it, andsync_pushre-reads each file before sending it. Both previously wrote a baseline describing content that was never reviewed, so the next plan reported nothing to reconcile and the edit was lost.- The sync state file fails closed and is written inside the same transaction as the files it describes. A corrupt or foreign state file used to read as "never synced".
- Studio content identity moved from a single 31-bit rolling hash to two independent accumulators plus byte length, so a collision no longer makes a changed script look unchanged.
- Native syncback rollback covers every regular file, not only files the classifier recognised, and a syncback whose dry run failed is refused.
- Studio Instance names that no portable file name can represent are reported as conflicts instead of encoded into a name Rojo would decode differently.
set_script_sourceaccepts an empty string, and its destroy-and-recreate fallback — which preserved onlyNameandEnabled— is gone.
Fixed — toolchain and process
rojo servereadiness is a TCP connect to its port rather than a match against its stdout banner, which is not API and has changed between releases.- Removed the
rokit run rojo --fallback. Neither Rokit nor Aftman has arunsubcommand; both work through installed shims. wally install --lockedis probed rather than assumed. The flag is absent from the released 0.3.2, and silently dropping it would rewrite the lockfile it exists to protect.- The toolchain-manifest search is bounded by
BLOXFORGE_PROJECT_ROOT, and the resolution cache keys on the shim so an externalrokit installtakes effect without a restart. - Rokit version pins compare component-wise; Wally path comparison is case-sensitive on Linux.
Security
- Unauthenticated non-loopback bridge bindings are refused; internal control requests are authenticated.
- Every QualityTools and Rojo path is confined to the canonical project root, including symlink and traversal escapes.
- Studio plugin installation is atomic and validates release type, variant and checksum.
- Inspector read-only and builder no-arbitrary-Luau profile policies are enforced at the registry.
The full list, including everything inherited from the 3.x line, is in CHANGELOG.md.