frame-cli 0.2.0

CLI for Frame — frame new scaffolds a complete Frame application: Rust composition host, Gleam component, and a connected browser page served by one binary
Documentation
# {{NAME}}

A generated Frame application: a Rust composition host, a Gleam component
compiled to BEAM bytecode, and a browser page — one binary, one config, one
command.

## Prerequisites

- Rust 1.89+
- Gleam 1.17.0+ and Erlang/OTP (the Gleam toolchain is checked before every
  component build; a missing toolchain fails loudly with an install link)
- Node 20+

## Run it

```sh
npm --prefix page install
npm --prefix page run build
cargo run -p app-host
```

Open the URL the host prints. The page fetches its runtime configuration,
joins the running messaging server directly as a participant, and shows:
your component's real lifecycle (registered, starting, running), the entity
your host just stored, and a receipt for any message you send from the page.

## Verify it

```sh
cargo test --workspace
npm --prefix page run e2e
```

`cargo test --workspace` needs the page built first (its full-stack boot test
serves the real `page/dist`). `npm --prefix page run e2e` builds the page,
boots the host, and drives a real, installed Chrome through the same proof.

## What's here

- `host/` — the Rust composition host. It declares the component's identity
  in code (no manifest file format is invented), reconciles durable state
  before starting anything, and hands its component and stated runtime
  policy to Frame's embedding seam, which boots the component, the embedded
  messaging server, and the page server together. Stopping the host
  preserves storage — nothing here deletes an entity.
- `component/` — the Gleam project, compiled to BEAM bytecode and embedded
  into the host binary at build time.
- `page/` — the browser page: fetches its config, joins the messaging server
  directly (no fallback feed — a bad config or a dead connection is a loud,
  typed, in-page error), and renders the host's real events as they happen.
- `frame.toml` — the one file describing the whole stack: the page server,
  the embedded messaging server, and its browser-facing endpoint. Every
  value is stated; none is defaulted.

## Learn more

- Building applications on Frame: https://github.com/ablative-io/frame/blob/main/docs/guides/BUILDING-APPS.md
- Frame vocabulary: https://github.com/ablative-io/frame/blob/main/docs/NOMENCLATURE.md