whisker-cli 0.2.0

Whisker CLI: `whisker` and `cargo-whisker` (hybrid) — scaffold, doctor, and dev-loop Whisker apps.
Documentation
[package]
name = "whisker-cli"
version.workspace = true
edition.workspace = true
rust-version.workspace = true
license.workspace = true
repository.workspace = true
authors.workspace = true
homepage.workspace = true
keywords.workspace = true
categories = ["development-tools", "command-line-utilities"]
description = "Whisker CLI: `whisker` and `cargo-whisker` (hybrid) — scaffold, doctor, and dev-loop Whisker apps."

[[bin]]
name = "whisker"
path = "src/bin/whisker.rs"

[[bin]]
name = "cargo-whisker"
path = "src/bin/cargo_whisker.rs"

# `RUSTC_WORKSPACE_WRAPPER` target. Cargo invokes us as
#   whisker-rustc-shim <rustc-path> <rustc-args...>
# and we forward the call after dumping the args to
# `$WHISKER_RUSTC_CACHE_DIR/<crate>-<timestamp>.json` for later thin
# rebuilds. Same workspace pattern clippy-driver / sccache use.
[[bin]]
name = "whisker-rustc-shim"
path = "src/bin/whisker_rustc_shim.rs"

# `-C linker=<shim>` target. rustc invokes us with the linker driver's
# argv directly (no real-linker-path prefix; we read WHISKER_REAL_LINKER
# from env to know what to forward to). Captures argv to
# `$WHISKER_LINKER_CACHE_DIR/<output>-<timestamp>.json`.
[[bin]]
name = "whisker-linker-shim"
path = "src/bin/whisker_linker_shim.rs"

[dependencies]
anyhow = { workspace = true }
clap = { version = "4", features = ["derive"] }
serde = { workspace = true }
serde_json = { workspace = true }
# Section spinners while probing each toolchain. We deliberately avoid
# a full-screen TUI (ratatui etc.) so the doctor output remains plain
# scrollback text that AI agents and clipboard paste can read.
indicatif = "0.17"
# `whisker run` is a thin wrapper that builds a Config and calls
# DevServer::run(); the heavy deps (tokio / axum / notify / object)
# all live in whisker-dev-server.
whisker-dev-server = { workspace = true }
tokio = { workspace = true, features = ["rt-multi-thread", "macros"] }
# `whisker run` reads the user's `whisker.rs` via a tiny probe build
# and parses the resulting Config JSON. The dev-server does NOT
# depend on whisker-config — the cli translates the Config
# into a flat `dev_server::Config` before handing it off.
whisker-config = { workspace = true }
# Continuous Native Generation — renders gen/{android,ios}/ from the
# resolved Config before each run / build.
whisker-cng = { workspace = true }
# Cargo + gradle / xcodebuild orchestration. Shared with whisker-dev-server.
whisker-build = { workspace = true }
# TOML parser for reading `[package].name` from the user crate's
# Cargo.toml. Lightweight, no async runtime.
toml = "0.8"
# Inline TUI for `whisker run` — anchored status bar at the bottom of
# the terminal, scrollback above for sections/steps/device logs.
ratatui = { workspace = true }
crossterm = { workspace = true }
# Ctrl-C handler so the TUI can restore cursor visibility before the
# process exits — without it, the shell ends up with a hidden cursor
# after `^C`. Tiny crate, no async runtime.
ctrlc = "3"
# POSIX `pipe(2)` / `dup` / `dup2` / `read` for the TUI's stderr
# capture (`dup2` STDERR_FILENO over a pipe so every `eprintln!` from
# `whisker_build::ui` and child subprocesses flows into the Logs
# pane instead of corrupting the alternate-screen viewport).
libc = { workspace = true }