Skip to content

v4.0.0

Choose a tag to compare

@BATEMAN4 BATEMAN4 released this 31 Jul 17:27
· 155 commits to main since this release
ab44c73

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_status and sync_push are deprecated in favour of rojo_syncback_plan / rojo_syncback_apply.
  • rojo_syncback_apply now requires the planHash returned by the preview. A stale plan is refused rather than applied.

Added

  • rokit_* and wally_* 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.
  • includeNonScripts on rojo_generate_sourcemap. Rojo emits only Script/LocalScript/ModuleScript by default, so folders and models could not be resolved through a generated sourcemap.
  • instancePathSegments on instance/source resolution, so an Instance whose name contains a dot is no longer ambiguous.
  • resetBaseline, which quarantines an unusable .bloxforge/rojo-state.json and rebuilds the sync baseline explicitly.
  • A Rokit + Wally CI job that installs a checksum-pinned Rokit and asserts the installed Wally's actual --locked behaviour.

Fixed — data integrity

  • A Rokit- or Aftman-pinned project no longer silently runs an unrelated global Rojo. Resolution probed PATH before 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, so game.ReplicatedStorage.Shared never matched.
  • Only a leading game segment is treated as the DataModel. An Instance legitimately named game was dropped from the middle of a path.
  • sync_pull re-reads a rename source before moving it, and sync_push re-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_source accepts an empty string, and its destroy-and-recreate fallback — which preserved only Name and Enabled — is gone.

Fixed — toolchain and process

  • rojo serve readiness 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 a run subcommand; both work through installed shims.
  • wally install --locked is 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 external rokit install takes 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.