bloom_cli 0.7.6
bloom_cli: ^0.7.6 copied to clipboard
The official command-line interface for the Bloom application framework and developer platform.
Changelog #
0.7.6 - 2026-09-25 #
Added #
- JS dev terminal dashboard (#3):
bloom js devnow renders a Next.js-style startup panel (project, local URL, DDC vs dart2js mode, assets, watch roots, proxies, routes, shortcuts) and prints live build-status lines as the watcher recompiles — tracking elapsed time, a running compile count and an error count at a glance. Replaces the flat ad-hoc startup prints. - Incremental DDC worker:
bloom js devnow reuses a persistent DDC worker and compiler state, passing digests for staged Dart sources and the SDK outline so changed source dependencies compile incrementally. Unsupported worker configurations fall back to one-shot DDC. - Top-level effect cleanup on DDC remount: the injected dev bootstrap calls Bloom's hot-effect cleanup hook before evicting and re-executing the app entry module.
- Stateful object signal scopes: DDC now gives constructor expressions assigned to variables isolated hot-reload scopes at stable call sites in
main, top-level initializers, and supported UI callbacks, including imported stores, so separate instances retain their own field-signal values. bloom.yamleditor schema: Flutter and JS Native scaffolds now link to the repository JSON Schema through the YAML language server modeline, enabling completion and diagnostics for known manifest fields.- Executable
bloom js createtests: component and page scaffolds now include tests that import and render the generated source; route guards also receive a test for the safe default.
Fixed #
bloom doctorwithout Flutter: toolchain probes (dart,flutter,java,xcode-select) now report a missing executable as a failed check instead of crashing withProcessException, so JS Native-only machines and CI images can run doctor.- DDC worker fallback on early worker exit: a persistent worker that dies before accepting a request no longer surfaces an uncaught broken-pipe error;
bloom js devfalls back to one-shot DDC as intended. - DDC error reporting: failed app startup and RequireJS module loads now show the dev overlay; fallback error details use
textContentso source text cannot be interpreted as HTML. bloom doctormanifest diagnostics: interactive and CI doctor runs now parsebloom.yamland validate its required name, schema version, mode, and build/deployment targets instead of treating any existing file as valid.- Windows Tailwind builds:
NODE_PATHnow uses the platform's path-list separator so the static CSS toolchain can resolve its packages on Windows. - DDC source staging: unchanged Dart files reuse their signal-key-transformed staging copies, deleted Dart files are removed before recompilation, staging failures reach the dev error overlay, and reported compile duration includes staging time.
- DDC package imports: the dev compiler now redirects the current package's
package:imports through the staged source tree, so transformed files are used consistently for both relative and package imports. - DDC process recovery: compiler launch failures and successful runs that produce no JavaScript now surface as structured dev errors; failed compiles preserve the last good output file.
- DDC runtime setup fallback: failed
dart_sdk.jsgeneration now preserves the existing SDK cache and switchesbloom js devto the workingdart2js -O0path instead of serving an incomplete DDC page. - JS dev loop watches all project roots (#2):
bloom js devnow watches bothlib/andweb/; static HTML/CSS/JS/assets reload directly, and newly-created source directories are subscribed without restarting the dev server. - Builder signal key safety (#2): the DDC signal-key injector skips anonymous builders, where one source key could be reused by multiple list items and restore state to the wrong item. An explicit instance-specific
key:remains available. - Signal key injection import safety: stable hot-reload keys are injected only for
signal()calls resolved through a direct Bloom JS Native import (including prefixed imports); unrelated functions and names hidden or shadowed in the source are left untouched. - Route guard scaffolding fails closed:
bloom js create --guardnow denies access until authorization is implemented, rather than generating a guard that grants access by default. - JS dev server binds to loopback by default:
bloom js devandBloomLiveReloadServernow listen on127.0.0.1unless a developer explicitly selects another host such as0.0.0.0for LAN testing. - Structured dev errors (#4): live-reload error SSE events now carry
kind, optionalfile/line/column,stack, andcodeFramefields while retaining the raw-message fallback. - JS Native scaffold branding (#1):
bloom create --js-nativenow emits the canonical Bloom logo asweb/favicon.svg, links it from the generated HTML, and displays it on the starter page.
0.7.5 - 2026-09-01 #
Added #
- Next-style
bloom js devDevTools: an isolated, draggable indicator with a compact menu and resizable diagnostics panel for route details, build/runtime errors, captured console output, and reload history. - Build and runtime failures now open an accessible diagnostic dialog with source hints, stack details, copy, clear, and dismissal controls. The DDC hot-remount and CSS hot-swap loops remain in place.
0.7.4 - 2026-08-31 #
Added #
bloom deploy init|dockertarget-aware Docker lifecycle with Flutter, JS Native, server, and hybrid detection, plusbloom doctordeployment checks.bloom deploy docker --production-onlyand--dry-runartifact preview.
0.7.3 - 2026-08-31 #
Added #
bloom migrate make|apply|status|rollbackdelegates migration lifecycle operations to the target project'sbloom_migrateexecutable.bloom fonts optimize --face "Family:weights:styles" --require-all-facessupports strict per-family font manifests, including italic faces.
0.7.2 - 2026-08-26 #
Added #
bloom js devnow uses the DDC (Dart Dev Compiler) fast dev-loop by default — no flag required.--legacy-dart2jsopts out to the whole-programdart2js -O0dev path;--experimental-ddcremains as a backward-compatible alias.untracked_signal_readlint rule:bloom lintnow flags a.valueread on a signal directly inside UI-building code, outsideLive/Show/ForEach/effect/computed— the #1 documented reactivity footgun inbloom_js_native's COOKBOOK.md.bloom generate controllernow also scaffolds a companiontest/features/<feature>/<feature>_controller_test.dartexercising the generated controller's signal API.
0.7.1 - 2026-08-26 #
Added #
bloom build web_dom: pure-Dart web apps now build into a dedicatedbuild/web/output directory (matching Flutter web's convention) instead of in place inside the sourceweb/directory.TailwindStaticBuildwraps the real@tailwindcss/cliv4 viabunxto emit a minified, staticbuild/web/dist/app.cssfor production, swapping the dev-mode@tailwindcss/browser<script>tag for a production<link rel="stylesheet">in the built copy ofindex.htmlonly.bloom deployforweb_domprojects now targetsbuild/web, matching every other web target — abloom build web_domrun is required before deploying (previously deploy could point straight at source).bloom js dev --experimental-ddc: on a Dart source edit, the dev server now performs an in-page fast remount (dispose the active mount, evict the cached RequireJS module, re-invokemain()) instead of a fullwindow.location.reload()— no browser navigation. Thedart2jsdev path's reload behavior is unchanged.
Fixed #
- CSS hot-swap (
css_hot_swap.dart) no longer misidentifies certain brace boundaries during its skeleton diff.
0.7.0 - 2026-08-25 #
Added #
bloom format: AST-aware formatter forbloom_js_nativeprojects. Runs the officialdart_style(tall-style) formatter, then apackage:analyzer-based pre-pass that wraps long named-argument string literals (e.g.className: '...') into adjacent string literals split at word boundaries — the one thingdart_stylestructurally cannot do for any Dart code, since splitting a literal could change its meaning. Also normalizes embedded raw CSS strings (const fooCss = r'''...''';andStyle(r'''...''')blocks) — reindents selectors/declarations/at-rules without ever rewriting property or value tokens.--checkmode matchesdart format --set-exit-if-changedsemantics for CI. Automatically skips generatedlib/src/plugins/bindings frombloom add npm:<pkg>.bloom lint: AST-based static analysis for Bloom-specific footguns, grounded in COOKBOOK.md's "Best Practices & Common Pitfalls" section: force-unwrapping nullableBloomEvent.value/.checked,ForEach<T>(...)missing akey:extractor, importingbrowser.dartin test files,Live(...)builders that never read a signal (so can never react to anything), in-place mutation of a signal's List/Map (signal.value.add(...)instead of reassigning.value), and hand-authored<style>/<link rel="stylesheet">tags inweb/index.htmlfortarget: web_domprojects.
0.6.2 - 2026-08-24 #
Added #
bloom add npm:@tailwindcss/browsernow works correctly: writes a dedicated self-executing<script type="module">(Tailwind's browser build has no JS API to bind, so no Dart interop binding is generated for it), fixed a regex collision that could delete this script when a second package was later added..d.ts-driven@JS()binding generator (bloom add npm:<package>) now parses a package's real exported member names instead of emitting a single guessed member.bloom create --js-native's generatedbloom.yamlnow setstarget: web_dom, which several CLI subsystems (bloom add,bloom build,bloom dev) key off of — without it,bloom add npm:<package>misrouted js-native projects through native mobile plugin handling instead of npm.bloom create --js-native's generatedAGENTS.mdand COOKBOOK.md now document the realbloom add/Tailwind/design-token/font workflows in full.
0.6.1 - 2026-08-24 #
Added #
bloom create --js-native's generatedAGENTS.mdnow includes a full best-practices checklist (reactivity, nullable event fields, the two-entry-point rule, SSR gotchas, disposal, styling, testing) mirroring COOKBOOK.md's new Section 20.
0.6.0 - 2026-08-24 #
Added #
bloom create <name> --js-native: scaffolds a Flutter-free Bloom JS Native project (pubspec.yaml with noflutterdependency,bloom.yaml,web/index.html,lib/main.dartcorrectly importingbrowser.dartformount(), a smoke test, and a generatedAGENTS.md) instead of shelling out toflutter create.
Fixed #
bloom --version/bloom -vprinted a stale hardcoded0.1.0regardless of the installed release; now kept in sync withpubspec.yaml.
0.5.0 - 2026-08-24 #
Added #
bloom typegen: compile-checked, typed route builder generation from route annotations.bloom insights: live dev-server request log (GET /__insightson the dev server;--url/--json/--limitflags, with port auto-discovery when--urlis omitted).bloom doctor: new System Information section (OS/CPU/CLI process memory) and a best-effort Version Check against pub.dev.- Open in editor: dev error overlay entries now have an "Open
file:line" button that launches$VISUAL/$EDITOR(orcode --goto) at the exact error location, with path-containment and shell-injection guards. bloom fonts optimize: self-hosts Google Fonts.woff2files at build time and generatesfonts.g.csswith a CLS-mitigation fallback face.bloom og generate: build-time Open Graph social card PNG generator (1200x630).- Server-side image optimizer for responsive variants.
- Production deployment for web targets.
0.4.0 - 2026-08-23 #
- Bun vendoring, SSR router endpoint, and SSG prerendering delivered end to end.
- Module authoring/scaffolding improvements.
- Scaffolded projects now resolve
bloom_js_nativeandbloom_seofrom pub.dev rather than from sibling paths.
0.3.1 #
Added #
- Live SSE Hot Reload Dev Server: Introduced
BloomLiveReloadServerwith automatic script injection and Server-Sent Events on/_bloom_hr. - Debounced Recursive Source Watcher: Added
BloomSourceWatcherwith 150ms debouncing and multi-directory inotify tracking for.dart,.html,.css, and.yamlfiles. - Server Hot Restart: Integrated sub-80ms isolate hot restart in
bloom server run --watch. - Fast JS Dev Compiler: Upgraded
bloom js devwith-O0fast development compiler and live browser reload.
0.3.0 #
Breaking #
bloom addandbloom removenow validate plugin names: an unrecognized name prints the supported plugin ids and exits with code1, writing nothing tobloom.yamland skipping prebuild. Previously any string was accepted and written straight tobloom.yaml, so a typo such asbloom add camreareported success while silently configuring nothing.- Plugin names are canonicalized (trimmed, lowercased,
-converted to_), sosecure-storage,secure_storageandSecure-Storageall resolve to the single canonical idsecure_storage, and that canonical id is what gets written tobloom.yaml.
Added #
- Incremental Static Regeneration (ISR) for SSR: Wires up the
revalidate: Duration(...)parameter in@BloomLoaderannotations to enable stale-while-revalidate full-page HTML caching inbloom build web --server. Routes withrevalidateserve cached HTML within the duration, serve stale HTML immediately while regenerating in the background once stale, and populate cache on demand on first hit. - Real headless-browser prerendering for SSG/SSR:
bloom build web --static/--servernow compile the real Flutter web app (flutter build web --release) and drive a real headless Chromium instance (viapuppeteer) to capture the genuine rendered DOM for each route, replacing the previous static placeholder-shell HTML. Falls back gracefully to the old shell template whenever Chromium is unavailable or a route fails to render, so a build never fails or hangs because of prerendering.bloom_framework'sBloomAppnow signals readiness (and force-enables the Flutter semantics/accessibility tree, which is what produces real descriptive DOM content) after its first frame, on web only. - Real Bloom-branded PWA icons:
bloom build web --static/--servernow generate genuineIcon-192.png/Icon-512.png/maskable/apple-touch-icon/favicon assets from the real Bloom five-petal gradient mark (rasterized via the same headless Chromium pipeline), instead of amanifest.jsonthat pointed at files which never actually existed. Falls back to leaving any pre-existing icons untouched when Chromium is unavailable.
Fixed #
- Documented plugins received no prebuild transformations: the prebuild engines only recognized
camera,notificationsandlocation, sobackground_tasksnever hadWAKE_LOCKinjected and the hyphenated spellings shown in the docs matched nothing at all. Plugin metadata now lives in a single sharedBloomPluginCatalogread by both the Android and iOS prebuild engines and bybloom add/bloom remove, so the CLI and the platform manifests can no longer drift apart.
0.1.0 #
- Project Creation & Templates:
bloom create <app>with official and community starter templates (--template). - Interactive Dev Server:
bloom devwith wireless LAN pairing and TUI shortcuts. - Diagnostics & Continuous CI Health:
bloom doctorand strictbloom doctor --ci. - Zero-Config Native Autolinking:
bloom add,bloom deps,bloom why, andbloom workspace. - Native Module Authoring & Sandbox:
bloom create module,bloom module dev, andbloom module test. - Asset Optimization Pipeline:
bloom assets optimize,bloom assets analyze,bloom assets generate. - Security & Vulnerability Auditing:
bloom auditandbloom security scan. - Architectural Explanation:
bloom explain route <path>andbloom graph. - Ecosystem Package Registry:
bloom registry searchandbloom registry info. - Automated Upgrades & Migrations:
bloom upgradeandbloom doctor --upgrade.