idle_cli 0.1.1
idle_cli: ^0.1.1 copied to clipboard
Deterministic, JSON-only CLI for idle_core simulations.
idle_cli #
Deterministic, JSON-only CLI for running idle_core simulations and persisting
portable snapshots via idle_save.
Why this exists #
idle_cli is designed as an automation-friendly “execution surface” for idle
game simulations:
- Deterministic laboratory tool: advance time only when you call
tick. - Composable: stdin/stdout JSON lets you pipe commands and build scripts.
- MCP/agent-friendly: a Codex agent can
create → tick → analyze → saveas a reproducible workflow. - Flutter compatibility goal: intended to interoperate with Flutter apps
that use
idle_core+idle_save(and optionallyidle_flutter) by sharing the same state schema and migration chain. For true “save file compatibility”, put your game’sIdleState/reducer/codec/migrations in a shared Dart package and use it from both the app and this CLI.
Commands #
idle createidle tickidle analyzeidle saveidle load
All stdout is valid JSON. Errors are JSON written to stderr with a non-zero exit code.
tick, analyze, and save accept either:
- a raw snapshot JSON (
format: "idle_cli.snapshot") - or a previous command output JSON that contains
{ "snapshot": ... }
Quickstart (Recommended) #
dart run may print Dart tool build logs to stdout before your program runs.
For predictable JSON-only streams (automation, piping), compile once and run the
binary:
dart compile exe bin/idle.dart -o idle
./idle help
If you prefer dart run, it still works; the CLI tolerates leading non-JSON
lines when reading from stdin.
I/O Rules #
- Commands that consume state read from stdin (pipe) or
--in <path>. - Commands that produce state return it as JSON on stdout.
- Errors are JSON on stderr; pass
--debugto include a stack trace.
Exit codes:
0: success1: CLI usage / validation / runtime error2: save/load failure (e.g. corrupt file, checksum mismatch)
Common Workflows #
1) Fast simulation via piping #
Create → tick → analyze:
./idle create | ./idle tick --count 10 | ./idle analyze
2) File-based progression (no long pipes) #
Important: > redirects output; it does not provide input. To read from a
file, use --in.
./idle create > s.json
./idle tick --count 10 --in s.json > s2.json
./idle analyze --in s2.json
3) Save / load snapshots #
Save current snapshot to save.json:
./idle create | ./idle save --path save.json
Load then analyze:
./idle load --path save.json | ./idle analyze
4) Branch experiments (A/B) #
./idle create > base.json
./idle tick --count 10 --in base.json > a.json
./idle tick --count 100 --in base.json > b.json
./idle analyze --in a.json
./idle analyze --in b.json
Command Reference #
idle create #
Creates a new snapshot (fresh state).
- Options:
--dtMs,--miners,--gold - Output:
{ ok, command: "create", snapshot: IdleCliSnapshot }
Example:
./idle create --miners 3 --gold 10 > s.json
idle tick #
Advances time by applying --count ticks to the input snapshot.
- Input: snapshot JSON via stdin or
--in <path> - Options:
--count(default1),--in - Output:
{ ok, command: "tick", ticksApplied, resourcesDelta, snapshot }
Examples:
./idle create | ./idle tick --count 10 > s.json
./idle tick --count 10 --in s.json > s2.json
idle analyze #
Computes derived metrics from a snapshot.
- Input: snapshot JSON via stdin or
--in <path> - Output:
{ ok, command: "analyze", analysis: {...} }
Example:
./idle analyze --in s.json
idle save #
Persists a snapshot using idle_save envelope + canonical JSON encoding.
- Input: snapshot JSON via stdin or
--in <path> - Options:
--path <file>, optional--backup <file> - Output:
{ ok, command: "save", result: {...} }
Example:
./idle create | ./idle save --path save.json
idle load #
Loads a snapshot from a save envelope file.
- Options:
--path <file> - Output:
{ ok, command: "load", snapshot: IdleCliSnapshot, ... }
Example:
./idle load --path save.json > s.json
Troubleshooting #
ticksays “Missing input snapshot”: you must pipe a snapshot or pass--in. Example:./idle create | ./idle tick --count 10 > s.json- Want stack traces in errors: add
--debug(e.g../idle tick --debug ...).
Related packages #
idle_core: deterministic engine primitives (state, reducer, tick/offline)idle_save: versioned envelope, migration chain, canonical JSON helpersidle_flutter: Flutter binding layer (lifecycle, stores, widgets)