[package]
name = "assay-cli"
version.workspace = true
edition.workspace = true
rust-version.workspace = true
license.workspace = true
repository.workspace = true
readme.workspace = true
description = "Policy-as-code gate for MCP agent tool calls, with verifiable evidence and Linux kernel enforcement."
keywords = ["mcp", "ai-agents", "agent-security", "policy-as-code", "evidence"]
categories = ["command-line-utilities", "development-tools::testing"]
exclude = [
"tests/e2e_mcp_wrap_assert_cmd.rs",
"tests/agent_golden_path_contract.rs",
"tests/agent_plugin_package_contract.rs",
"tests/policy_validate_machine_contract.rs",
"tests/config_recovery_argv_contract.rs",
"tests/explicit_config_class_contract.rs",
"tests/doctor_config_check_contract.rs",
"tests/init_stdout_contract.rs",
"tests/doctor_exit_class_contract.rs",
"tests/doctor_argument_contract.rs",
"tests/doctor_text_render_contract.rs",
"tests/stdout_json_write_contract.rs",
"tests/mcp_preflight_contract.rs",
"tests/recovery_argv_publisher_parity.rs",
]
[lints]
workspace = true
[[bin]]
name = "assay"
path = "src/main.rs"
[features]
default = ["tui", "sim", "runner"]
experimental = ["assay-core/experimental"]
profile-test-hook = []
tui = ["dep:ratatui", "dep:crossterm"]
sim = ["dep:assay-sim"]
runner = [
"dep:assay-runner-core",
"dep:assay-runner-schema",
"dep:assay-runner-linux",
]
[dependencies]
anyhow.workspace = true
async-trait.workspace = true
serde = { workspace = true, features = ["std"] }
serde_json = { workspace = true, features = ["std"] }
jsonschema = { workspace = true }
clap.workspace = true
tracing.workspace = true
env_logger = "0.11"
tokio.workspace = true
assay-canonical = { workspace = true }
assay-core.workspace = true
assay-monitor.workspace = true
assay-common = { workspace = true, features = ["std"] }
assay-policy = { workspace = true }
assay-metrics = { workspace = true }
assay-evidence = { workspace = true }
assay-registry = { workspace = true }
assay-mcp-server = { workspace = true }
assay-runner-core = { workspace = true, optional = true }
assay-runner-schema = { workspace = true, optional = true }
assay-runner-linux = { workspace = true, optional = true }
assay-sim = { workspace = true, optional = true }
dialoguer = "0.12"
similar = "3"
serde_yaml.workspace = true
chrono = { workspace = true, features = ["std", "clock"] }
sha2 = { workspace = true }
hex = { workspace = true }
dirs = "6.0"
ed25519-dalek = { version = "3.0", features = ["pkcs8", "pem", "rand_core"] }
getrandom = { version = "0.4", features = ["sys_rng"] }
rand = "0.8"
pkcs8 = { version = "0.11", features = ["pem"] }
base64 = "0.22"
sysinfo = "0.30"
humantime = "2"
tokio-stream = "0.1"
futures = "0.3"
globset = "0.4"
libc = "0.2"
semver = "1"
once_cell = "1.21"
nix = { version = "0.27", features = ["signal", "process", "fs", "ioctl"] }
ratatui = { workspace = true, optional = true }
crossterm = { workspace = true, optional = true }
[target.'cfg(target_os = "linux")'.dependencies]
landlock = "=0.4.7"
[[bench]]
name = "suite_run_worstcase"
path = "benches/suite_run_worstcase.rs"
harness = false
[[bench]]
name = "profile_store_harness"
path = "benches/profile_store_harness.rs"
harness = false
[dev-dependencies]
tempfile = "3"
regex = "1"
assert_cmd = "2.2.2"
predicates = "3.1.4"
proptest = "1.10"
serial_test = "3.5.0"
criterion = "0.8"
[target.'cfg(unix)'.dev-dependencies]
process-wrap = { workspace = true, features = ["process-group", "std"] }
[target.'cfg(windows)'.dev-dependencies]
process-wrap = { workspace = true, features = ["job-object", "std"] }