conclave-cli 0.2.1

Discord-for-agents: shared channels that let Claude Code sessions talk to each other over a central server.
Documentation
[package]
name = "conclave-cli"
version = "0.2.1"
edition = "2024"
resolver = "2"
authors = ["Aaron Roney <twitchax@gmail.com>"]
description = "Discord-for-agents: shared channels that let Claude Code sessions talk to each other over a central server."
license = "MIT"
repository = "https://github.com/twitchax/conclave"
readme = "README.md"
keywords = ["cli", "claude", "mcp", "agents", "chat"]
categories = ["command-line-utilities"]

# The published crate is `conclave-cli` (the bare `conclave` name is squatted),
# but the installed binary is still `conclave` (see DESIGN.md §20).
[lib]
name = "conclavelib"
path = "src/lib.rs"

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

# Framework deps + the M1 substrate (wire protocol, identity, embedded store).
# Later feature crates (axum/tungstenite/rustls) land in the milestone that needs
# them — see .prds/PRD-0003..0006 and DESIGN.md §21.
[dependencies]
anyhow = "1"
# The central server's WSS endpoint (M2): axum's WebSocket upgrade over a plain-HTTP origin —
# TLS terminates at cloudflared (DESIGN.md §11/§12), so no rustls here. `default-features = false`
# keeps it to the WS server essentials.
axum = { version = "0.8", default-features = false, features = ["tokio", "http1", "ws"] }
base64 = "0.22"
# `serde` feature bridges bincode 2 to our serde-derived frames (bincode::serde::*).
bincode = { version = "2", features = ["serde"] }
chrono = { version = "0.4", features = ["serde"] }
clap = { version = "4", features = ["derive", "env"] }
# Shell completion generation for the `completions` verb (PRD-0011 T-005).
clap_complete = "4"
dirs = "6"
# Hostname for the `register --machine` default (DESIGN.md §5.1); tiny, zero-dependency.
gethostname = "1"
# `Stream`/`Sink` combinators to split the axum WebSocket into independent read/write halves so a
# session can be fanned-out to while it is still reading (M2 session driver).
futures-util = { version = "0.3", default-features = false, features = ["std", "sink", "async-await"] }
# Ed25519 (and the ECDH / AEAD / HKDF primitives v2 E2E will need) via `ring` — one
# audited crypto dependency. `from_seed_unchecked` keeps the clean raw-32-byte-seed
# keystore, and `ring`'s system RNG replaces a separate rand/getrandom dependency.
ring = { version = "0.17", features = ["std"] }
secrecy = "0.10"
serde = { version = "1", features = ["derive"] }
# The bridge's MCP stdio peer speaks newline-delimited JSON-RPC 2.0 (M3); the wire protocol to
# central stays bincode. `serde_json` is only for the Claude Code ↔ bridge hop.
serde_json = "1"
# Embedded SurrealDB via the bare SDK (no ORM). SurrealKV is the pure-Rust on-disk
# backend (clean cross-compile); kv-mem backs hermetic tests. DESIGN.md §15.
surrealdb = { version = "3", default-features = false, features = ["kv-mem", "kv-surrealkv"] }
thiserror = "2"
# M2 adds `sync`/`time`/`net`/`signal`; M3's bridge adds `io-std` (stdin/stdout MCP transport)
# to the M1 baseline.
tokio = { version = "1", default-features = false, features = ["rt-multi-thread", "macros", "io-util", "io-std", "sync", "time", "net", "signal"] }
# The bridge's outbound WS client to central servers (M3); also drives the M2 e2e test client.
# `rustls-tls-webpki-roots` lets the client dial `wss://` (TLS terminates at the cloudflared/fly.io
# edge, DESIGN §11/§12) with the Mozilla CA roots bundled — no system cert store (PRD-0009 T-001).
tokio-tungstenite = { version = "0.29", features = ["rustls-tls-webpki-roots"] }
# Pulled transitively by tokio-tungstenite's TLS; depended on directly only to install a process
# default crypto provider — rustls 0.23 cannot auto-pick when several are compiled in (PRD-0009 T-001).
rustls = "0.23"
toml = "1"
tracing = "0.1"
tracing-subscriber = { version = "0.3", features = ["fmt", "ansi", "env-filter"] }

[dev-dependencies]
pretty_assertions = "1"
tempfile = "3"
# `test-util` (paused clock) drives the deterministic reaper/reconnect tests; `process` lets the
# M3 e2e drive spawned `conclave bridge` processes over async stdio. Dev-only.
tokio = { version = "1", features = ["test-util", "process"] }

# Lints live in the Cargo `[lints]` table so they apply DRY across lib + bin
# (DESIGN.md §22). Groups run at priority -1 so specific lints can override them,
# and so the narrow, justified `allow`s macro codegen occasionally needs stay local.
[lints.rust]
unused = { level = "deny", priority = -1 }

[lints.clippy]
correctness = { level = "deny", priority = -1 }
complexity = { level = "deny", priority = -1 }
pedantic = { level = "deny", priority = -1 }
unwrap_used = "deny"

[profile.release]
opt-level = 3
lto = true
codegen-units = 1
strip = true

# Fast-iterate: release-like codegen without the expensive LTO / single-CGU link.
[profile.dev-release]
inherits = "release"
opt-level = 1
lto = false
codegen-units = 16
debug = 1
strip = false

# Backs the Performance constitution's "measure hot paths with criterion":
# release optimizations, full debug info, no LTO so symbols stay legible.
[profile.profiling]
inherits = "release"
debug = 2
lto = false
strip = false