Releases: labelle-toolkit/labelle-cli
v1.46.2
v1.44.0 — labelle migrate unified + flat-form audit (v2.0 prep)
v2.0 foundation prep (RFC labelle-engine#594). New audit-and-migrate flow lets any project move from root-wrapped to flat-form mechanically.
Highlights
-
#237 — `labelle audit unification` adds `legacy_root_wrapper` as a 5th legacy pattern. On flying-platform-labelle (already on the root-wrapped unified format): 90 wrappers across 90 files. On bouncing-ball: 1.
-
#238 — `labelle migrate unified [dir]` — auto-fixes 4 legacy patterns:
- Lift `root:` wrapper to top-level (with indentation dedent)
- `entities` → `children`
- `components` on prefab refs → `overrides`
- Delete legacy top-level `assets` array
All via comment-preserving positional byte-edits (JSONC-aware). Idempotent — running twice is a no-op the second time. End-to-end smoke: FP audit drops from 94 findings to 0.
How to use
```bash
labelle audit unification . # see what's still on the legacy shape
labelle migrate unified . # auto-fix everything
labelle audit unification . # confirm 0 findings
labelle build # confirm it still builds (needs engine ≥ v1.47.0 + assembler ≥ v0.35.0)
```
Compatibility
Both unified-format shapes accepted in v1.x. Migrator is opt-in. v2.0 (engine#592) will remove the legacy paths.
Pairs with
- labelle-engine v1.47.0 — loader dual-accepts flat-form
- labelle-assembler v0.35.0 — pre-build scan dual-accepts + scaffolder emits flat
v1.43.0 — --screenshot flag
What changed
- #233 — `labelle run --screenshot= [--after=]`. The CLI surfaces the destination path + delay to the running game via `LABELLE_SCREENSHOT_PATH` and `LABELLE_SCREENSHOT_AFTER_SEC` env vars. The engine + assembler take care of the actual frame capture (raylib backend fully wired; sokol stub for now).
- `--after` accepts `500ms`, `30s`, `2m`, or bare seconds.
- Shares the `buildEnvironWithExtra` helper introduced by v1.42.0's `--scene` runtime override — both flags can be combined in one invocation.
Pairs with
- labelle-engine v1.46.0 — `engine.ScreenshotRequest` + `engine.nowNs()`
- labelle-assembler v0.33.0 — backend template wiring
v1.42.0 — labelle audit unification + --scene runtime override
Highlights
- #232 — `labelle audit unification` subcommand. Scans `scenes/` + `prefabs/` for unification-format collisions (effective-name clashes) and §B2 violations (prefab references with both `overrides` and `children`). Exit 0 clean, 1 findings, 2 IO error.
- #234 — `labelle --scene=` now also surfaces the requested scene via the `LABELLE_SCENE` env var, consumed by `engine.requestedScene()`. Loading-controller scripts can read it after `assets.allReady` succeeds, sidestepping the asset-streaming race that bit large scenes (e.g. flying-platform-labelle's `colony`).
- Legacy `.initial_prefab` rewrite preserved as a deprecation bridge for projects without a loading-scene gate.
Pairs with
- labelle-engine v1.46.0 — `engine.runtime_env` + `engine.requestedScene()`
- labelle-assembler v0.33.0 — generates assets/manifests that feed the audit
labelle-cli v1.41.0 — .initial_prefab from --scene plumbing
labelle-cli v1.41.0 — .initial_prefab from --scene plumbing
labelle <cmd> --scene=<name> now writes .initial_prefab (was .initial_scene) into the in-memory project config, matching the assembler-side rename in labelle-assembler v0.32.0.
Changes
src/cli/project_config.zig— addsinitial_prefabfield; keepsinitial_sceneas a deprecated alias; new helpersresolvedInitialPrefab()andnormalizeInitialPrefab()(migrates legacy alias with a stderr deprecation notice;initial_prefabwins when both are set)src/cli.zig— callsnormalizeInitialPrefab()after parsing;--sceneoverride writesinitial_prefab
Compatibility
Legacy .initial_scene in project.labelle continues to work via the deprecation alias. No project migration required immediately.
Pairs with:
- labelle-engine v1.44.0 (unification)
- labelle-assembler v0.32.0 (rename + unified-format scan)
v1.38.1 — init scaffolds scenes/main.jsonc (fixes #204)
Patch release shipping the init-scaffold fix from PR #205 (fixes #204).
Fix
labelle init was scaffolding scenes/main.zon, but labelle-assembler only scans for .jsonc scenes. Fresh projects therefore built with an empty scene (no addEmbeddedSceneSource call in generated main.zig) and rendered nothing.
cmdInit now writes scenes/main.jsonc with a JSONC body. New inline test in src/cli/init.zig asserts the .jsonc is created and .zon is absent.
Known limitation (not blocking this release)
The Docker WASM Build Test CI job is failing for an unrelated, pre-existing reason — the wasm target's scenes/ symlink doesn't resolve inside the docker container's mount. Tracked as a follow-up issue. The init-scaffold fix itself is correct and covered by the inline zig build test regression test (56/56 pass).
v1.32.1
Patch release on top of v1.32.0
Two follow-ups from the v1.32.0 review (#168 → #169).
DEFAULT_ASSEMBLER_VERSIONwas stale. The constant insrc/cli/assembler.zigstill said"0.6.0"even though v1.32.0 bumped the bundledlabelle_assemblerZig dep to v0.7.0. The CLI's auto-download fallback (used whenassembler_versionis unset andLABELLE_ASSEMBLERis not exported) would have downloaded the v0.6.0 binary — ABI-mismatched against the v0.7.0 generator the CLI was compiled against. Now"0.7.0".- Abbreviated commit SHA in
build.zig.zon. The pin useda5486b7(7 chars) instead of the full 40-char SHA. Abbreviated SHAs in GitHub archive URLs can become ambiguous as upstream gains commits and resolve to 404. Replaced witha5486b767aa51b4de880b8820c395b6e3038fab5, matching the convention of the previous v0.6.0 pin.
If you already pulled v1.32.0, run labelle update to grab v1.32.1 — both fixes only matter for the auto-download fallback path, but it's the recommended baseline.
v1.32.0
Highlights
- #167
assembler_version = "local:<path>"resolves by building the sibling labelle-assembler checkout on demand. No more env vars for monorepo-style sibling layouts. - #168 Bumps the bundled labelle-assembler dep to v0.7.0, picking up all of today's sokol fixes — see https://github.com/labelle-toolkit/labelle-assembler/releases/tag/v0.7.0.
What v0.7.0 brings (via the assembler bump)
- sokol RunDesc compile fix (every sokol project was broken before)
- sokol
drawRectangleLinesExso outlined rects in declarativegizmos/*.zonactually render as outlines - sokol clear color
(30, 30, 35)matches raylib so projects ported between backends look identical - sokol input lifecycle —
game.quit()is now honored on sokol, andisKeyPressedactually fires for events delivered between frame callbacks - sokol forwards sapp events to the GUI bridge so ImGui IO works (clicks, slider drags, window dragging)
- New
examples/sokol_imgui/end-to-end smoke test - Android-ready sokol example with WASD and animation (#32)
What 1.32.0 brings on top of v1.31.0
- #167 — local: assembler_version resolver. The form already worked for
core_version/engine_version/gfx_version/labelle_version; this bringsassembler_versionto parity. A monorepo-style project withassembler_version = "local:../labelle-assembler"now works with plainlabelle run— noLABELLE_ASSEMBLERenv override needed.
Verified end-to-end
examples/sokol_imgui/builds and runs with click/slider widgets responsive- Raylib + imgui still works (regression-tested via a temporary copy of the sokol_imgui example with backend flipped to raylib)
v1.31.0 — assembler v0.6.0 + labelle-cli thinning
Structural cleanup release. Same CLI binary feature-wise as v1.30.0, but with a much thinner repo underneath and a new default assembler version carrying today's backend fix cluster.
Highlights
- Default assembler bumped to v0.6.0 (#166). Newly scaffolded projects auto-download v0.6.0 on first generate, picking up the full #8–#13 bug fix cluster (SDL portable paths, bgfx native window handle, sokol audio leak, raylib slot recycling, wgpu WAV parser overflow, zig-ecs view perf) plus sokol HiDPI + Android + iOS compat fixes and the dep-pinning that closes the #146 fragility class.
- Repo is now thin tooling only. All runtime content (backends, ecs adapters, GUI plugins, debug plugin, imgui/nuklear plugins, game-state examples) now lives in labelle-assembler. The generator types module is pulled as a proper Zig package instead of a hand-synced mirror.
Closed issues
- #151 generator mirror removed
- #152 / #153 imgui, nuklear, debug plugins extracted
- #154 examples extracted
- #155 vestigial Mach-O binary removed
Changes since v1.30.0
- chore: remove vestigial labelle-docker-build Mach-O binary (#162)
- feat: eject debug/imgui/nuklear plugins to labelle-assembler (#163)
- refactor: eject examples to labelle-assembler (#164)
- refactor: consume generator module from labelle-assembler package (#165)
- chore: bump assembler to v0.6.0 (#166)
Diff stat since v1.30.0: roughly −9,500 lines of source + 1.2 MB binary.
Upgrade notes
- The CLI surface is unchanged.
labelle init,generate,run,build,cleanall take the same flags. - Existing projects continue to work — their
project.labelleis not touched. Upgrading to the new default assembler is as simple as bumpingassembler_version(or runninglabelle upgrade).
v1.30.0 — Android fixes + assembler v0.5.1
Android
- Fix APK packaging: correct abi directory on Apple Silicon emulator (arm64-v8a instead of x86_64), fix aapt duplicate AndroidManifest.xml error, conditional assets dir
- Fix memory leak in package_name when using default package name
- Bump default assembler to v0.5.1
Assembler v0.5.1 (bundled)
- sokol backend: high-DPI rendering with
high_dpi=true, design canvas NDC mapping viasetDesignSize(), camera zoom init on first frame, real frame dt,sokol_mainentry point for Android/iOS - Android
zig build packagestep: dynamic ABI dir, correct staging path, lazyANDROID_HOMElookup setDesignSizeno-op added to all backends (raylib, sdl, bgfx, wgpu) to satisfy labelle-gfx v1.6.0 contract
labelle-gfx v1.6.0 compatibility
Projects using labelle-gfx v1.6.0 now compile correctly — all assembler-generated backends implement the new setDesignSize contract.