koda-cli 0.2.26

A high-performance AI coding agent for macOS and Linux
Documentation
[package]
name = "koda-cli"
version = "0.2.26"
edition.workspace = true
rust-version.workspace = true
description = "A high-performance AI coding agent for macOS and Linux"
license.workspace = true
repository.workspace = true
homepage.workspace = true
readme = "README.md"
keywords = ["ai", "coding-agent", "llm", "cli", "unix"]
categories = ["command-line-utilities", "development-tools"]
authors.workspace = true

[[bin]]
name = "koda"
path = "src/main.rs"

[dependencies]
# Core engine
koda-core = { path = "../koda-core", version = "0.2.26" }

# CLI
clap = { version = "4", features = ["derive", "env"] }

# Async runtime
tokio = { workspace = true, features = ["full"] }
tokio-util = { workspace = true }

# Serialization (serde_json brings serde transitively; we never use serde directly here)
serde_json = { workspace = true }

# TUI / Terminal
crossterm = { version = "0.29", features = ["event-stream"] }

# Syntax highlighting
syntect = { version = "5", default-features = false, features = ["default-syntaxes", "default-themes", "parsing", "html", "regex-fancy"] }
two-face = { version = "0.5", default-features = false, features = ["syntect-fancy"] }

# TUI (inline viewport: input + status bar)
ratatui = { version = "0.30", default-features = false, features = ["crossterm", "scrolling-regions"] }
ratatui-textarea = "0.9"
unicode-width = "0.2"

# Clipboard (for Ctrl+Y copy)
arboard = "3"

# Debug bundle: zip packaging for /debug-bundle slash command (RFC #1167).
# Chosen over tar.gz for random-access reads (LLM debugging workflows poke
# at one file at a time; zip's central directory makes that O(file) instead
# of O(bundle)) and broader cross-platform UX (Windows Explorer browses zips
# natively). `default-features = false` + `deflate` keeps the dep minimal
# (no aes-crypto, bzip2, zstd, lzma).
zip = { version = "2", default-features = false, features = ["deflate"] }

# ANSI escape code parsing for tool output
ansi-to-tui = "8"

# Regex — used to highlight Grep match substrings (mirrors koda-core's
# Grep tool, so the same pattern compiles in both places).
regex = "1"

# Logging (subscriber for CLI configuration)
tracing = { workspace = true }
tracing-subscriber = { workspace = true }
tracing-appender = "0.2"

# Error handling
anyhow = { workspace = true }

# Date/time — already a transitive dep via ratatui; declared directly so
# callers aren't silently depending on an undeclared transitive.
time = "0.3"

# Base64 encoding (for image input)
base64 = "0.22"
agent-client-protocol-schema = { version = "0.11", features = ["unstable_session_model", "unstable_session_list", "unstable"] }
futures-util = "0.3"

[[bench]]
name = "render_bench"
harness = false

[dev-dependencies]
tempfile = { workspace = true }
koda-core = { path = "../koda-core", version = "0.2.26", features = ["test-support"] }
serde_json = { workspace = true }
# tokio's `test-util` feature enables `#[tokio::test(start_paused = true)]` so
# frame_requester tests can manipulate the clock deterministically without
# relying on real wall-clock sleeps. Not in `full`, so we opt in here.
tokio = { workspace = true, features = ["full", "test-util"] }
# serial_test: forces tests that mutate global state (e.g. the panic hook in
# the regression test for #1124) to run sequentially. Cargo runs tests in
# parallel by default; without this, two tests calling `panic::set_hook`
# would race and produce flaky results.
serial_test = "3"