runner-manager 0.4.8

Local-first autoscaling manager for ephemeral GitHub Actions self-hosted runners, with a CLI and a Ratatui TUI.
# Owned by task a1. Dependencies are added in the root [workspace.dependencies]
# table, never here. See the header of the root Cargo.toml.
#
# The package, the binary, and the published crate are all named
# `runner-manager` (`02-target-architecture.md`, RESOLVED 2026-08-21). The
# directory is `crates/app`; the name is what ships.

[package]
name = "runner-manager"
description = "Local-first autoscaling manager for ephemeral GitHub Actions self-hosted runners, with a CLI and a Ratatui TUI."
version.workspace = true
edition.workspace = true
rust-version.workspace = true
license.workspace = true
authors.workspace = true
repository.workspace = true
homepage.workspace = true
# No `readme` key: the repository README belongs to a3, and a path pointing
# outside `crates/app/` is not packageable anyway.
keywords = ["github-actions", "self-hosted-runner", "autoscaling", "tui", "cli"]
categories = ["command-line-utilities", "development-tools"]

[[bin]]
name = "runner-manager"
path = "src/main.rs"

[dependencies]
# Needed by `StoringRenewal`, which implements `c2`'s `CredentialRenewal`.
async-trait = { workspace = true }
anyhow = { workspace = true }
chrono = { workspace = true }
clap = { workspace = true }
crossterm = { workspace = true }
futures = { workspace = true }
ratatui = { workspace = true }
# ---------------------------------------------------------------------------
# `update` REPLACES AN EXECUTABLE, AND EVERY CRATE BELOW IS PART OF PROVING IT
# IS THE RIGHT ONE.
# ---------------------------------------------------------------------------
# `reqwest` fetches the release's `SHA256SUMS` and streams the archive;
# `sha2` + `hex` produce the digest that decides whether the archive is used at
# all; `flate2` + `tar` and `zip` unpack the two archive formats this project
# publishes; `tempfile` holds the download until it has been verified.
#
# None of them is new to this workspace -- every one is already a dependency of
# `crates/agent`, which downloads and verifies GitHub's runner package the same
# way -- so this adds dependency edges and no packages to `Cargo.lock`.
flate2 = { workspace = true }
hex = { workspace = true }
reqwest = { workspace = true }
sha2 = { workspace = true }
tar = { workspace = true }
tempfile = { workspace = true }
zip = { workspace = true }
runner-manager-agent = { workspace = true }
runner-manager-domain = { workspace = true }
runner-manager-github = { workspace = true }
runner-manager-platform = { workspace = true }
# `f1` hands the user access token to the `d2` secret store, and it must carry
# it in the redacting wrapper the whole way (`07-security.md`).
secrecy = { workspace = true }
serde = { workspace = true }
serde_json = { workspace = true }
thiserror = { workspace = true }
tokio = { workspace = true }
tracing = { workspace = true }
tracing-subscriber = { workspace = true }
unicode-truncate = { workspace = true }
unicode-width = { workspace = true }
uuid = { workspace = true }

[dev-dependencies]
assert_cmd = { workspace = true }
insta = { workspace = true }
predicates = { workspace = true }
runner-manager-testkit = { workspace = true }
serial_test = { workspace = true }
# Also a normal dependency above. Listed here as well because `tests/` links
# against dev-dependencies only: this crate has no library target, so a
# `[dependencies]` entry is invisible to every file under `tests/`.
tempfile = { workspace = true }
# `f3`'s daemon shutdown and backoff tests drive `tokio::time::pause()`.
tokio = { workspace = true, features = ["test-util"] }