From ea7bb89295ff111c40edd1a31aadc9920bbcd613 Mon Sep 17 00:00:00 2001 From: sandcage-export Date: Fri, 22 May 2026 15:30:15 +0200 Subject: [PATCH] =?UTF-8?q?=F0=9F=A5=87=20export=20from=20upstream=20(cdd2?= =?UTF-8?q?f6d)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cargo.lock | 155 ++++++++++++++++++++++ Cargo.toml | 23 +--- README.md | 2 +- crates/sandcage/Cargo.toml | 20 +++ {src => crates/sandcage/src}/config.rs | 0 {src => crates/sandcage/src}/docker.rs | 8 +- {src => crates/sandcage/src}/init.rs | 2 +- crates/sandcage/src/lib.rs | 4 + {src => crates/sandcage/src}/main.rs | 8 +- {src => crates/sandcage/src}/workspace.rs | 0 justfile | 12 +- 11 files changed, 202 insertions(+), 32 deletions(-) create mode 100644 crates/sandcage/Cargo.toml rename {src => crates/sandcage/src}/config.rs (100%) rename {src => crates/sandcage/src}/docker.rs (98%) rename {src => crates/sandcage/src}/init.rs (99%) create mode 100644 crates/sandcage/src/lib.rs rename {src => crates/sandcage/src}/main.rs (97%) rename {src => crates/sandcage/src}/workspace.rs (100%) diff --git a/Cargo.lock b/Cargo.lock index bf4bc5e..89bed47 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -17,6 +17,15 @@ version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" +[[package]] +name = "aho-corasick" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" +dependencies = [ + "memchr", +] + [[package]] name = "anstream" version = "1.0.0" @@ -73,6 +82,21 @@ version = "1.0.102" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c" +[[package]] +name = "assert_cmd" +version = "2.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2aa3a22042e45de04255c7bf3626e239f450200fd0493c1e382263544b20aea6" +dependencies = [ + "anstyle", + "bstr", + "libc", + "predicates", + "predicates-core", + "predicates-tree", + "wait-timeout", +] + [[package]] name = "atomic" version = "0.6.1" @@ -82,6 +106,12 @@ dependencies = [ "bytemuck", ] +[[package]] +name = "autocfg" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" + [[package]] name = "backtrace" version = "0.3.76" @@ -121,6 +151,17 @@ dependencies = [ "generic-array", ] +[[package]] +name = "bstr" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63044e1ae8e69f3b5a92c736ca6269b8d12fa7efe39bf34ddb06d102cf0e2cab" +dependencies = [ + "memchr", + "regex-automata", + "serde", +] + [[package]] name = "bytemuck" version = "1.25.0" @@ -198,6 +239,12 @@ dependencies = [ "typenum", ] +[[package]] +name = "difflib" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6184e33543162437515c2e2b48714794e37845ec9851711914eec9d308f6ebe8" + [[package]] name = "digest" version = "0.10.7" @@ -277,6 +324,15 @@ dependencies = [ "version_check", ] +[[package]] +name = "float-cmp" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b09cf3155332e944990140d967ff5eceb70df778b34f77d8075db46e4704e6d8" +dependencies = [ + "num-traits", +] + [[package]] name = "foldhash" version = "0.1.5" @@ -470,6 +526,21 @@ dependencies = [ "adler2", ] +[[package]] +name = "normalize-line-endings" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61807f77802ff30975e01f4f071c8ba10c022052f98b3294119f3e615d13e5be" + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + [[package]] name = "object" version = "0.37.3" @@ -526,6 +597,36 @@ dependencies = [ "syn", ] +[[package]] +name = "predicates" +version = "3.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ada8f2932f28a27ee7b70dd6c1c39ea0675c55a36879ab92f3a715eaa1e63cfe" +dependencies = [ + "anstyle", + "difflib", + "float-cmp", + "normalize-line-endings", + "predicates-core", + "regex", +] + +[[package]] +name = "predicates-core" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cad38746f3166b4031b1a0d39ad9f954dd291e7854fcc0eed52ee41a0b50d144" + +[[package]] +name = "predicates-tree" +version = "1.0.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0de1b847b39c8131db0467e9df1ff60e6d0562ab8e9a16e568ad0fdb372e2f2" +dependencies = [ + "predicates-core", + "termtree", +] + [[package]] name = "prettyplease" version = "0.2.37" @@ -584,6 +685,35 @@ dependencies = [ "thiserror", ] +[[package]] +name = "regex" +version = "1.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a" + [[package]] name = "rustc-demangle" version = "0.1.27" @@ -626,6 +756,16 @@ dependencies = [ "which", ] +[[package]] +name = "sandcage-test" +version = "0.0.0" +dependencies = [ + "assert_cmd", + "predicates", + "sandcage", + "tempfile", +] + [[package]] name = "semver" version = "1.0.28" @@ -769,6 +909,12 @@ dependencies = [ "windows-sys", ] +[[package]] +name = "termtree" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f50febec83f5ee1df3015341d8bd429f2d1cc62bcba7ea2076759d315084683" + [[package]] name = "textwrap" version = "0.16.2" @@ -903,6 +1049,15 @@ version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" +[[package]] +name = "wait-timeout" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ac3b126d3914f9849036f826e054cbabdc8519970b8998ddaf3b5bd3c65f11" +dependencies = [ + "libc", +] + [[package]] name = "wasi" version = "0.11.1+wasi-snapshot-preview1" diff --git a/Cargo.toml b/Cargo.toml index 2633233..ab1e57d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,20 +1,3 @@ -[package] -name = "sandcage" -version = "0.1.0" -edition = "2024" -description = "Sandboxed containers for AI coding agents" -license = "MIT" -keywords = ["docker", "sandbox", "ai", "agent"] - -[dependencies] -clap = { version = "4", features = ["derive"] } -serde = { version = "1", features = ["derive"] } -serde_yaml = "0.9" -figment = { version = "0.10", features = ["toml", "env"] } -miette = { version = "7", features = ["fancy"] } -thiserror = "2" -which = "7" -dirs = "6" -sha2 = "0.10" -hex = "0.4" -tempfile = "3" +[workspace] +members = ["crates/sandcage"] +resolver = "3" diff --git a/README.md b/README.md index 35c8873..777b80e 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,7 @@ cargo install --git https://github.com/dirigence/sandcage Or from a local checkout: ```bash -cargo install --path . +cargo install --path crates/sandcage ``` ### Build the images diff --git a/crates/sandcage/Cargo.toml b/crates/sandcage/Cargo.toml new file mode 100644 index 0000000..2633233 --- /dev/null +++ b/crates/sandcage/Cargo.toml @@ -0,0 +1,20 @@ +[package] +name = "sandcage" +version = "0.1.0" +edition = "2024" +description = "Sandboxed containers for AI coding agents" +license = "MIT" +keywords = ["docker", "sandbox", "ai", "agent"] + +[dependencies] +clap = { version = "4", features = ["derive"] } +serde = { version = "1", features = ["derive"] } +serde_yaml = "0.9" +figment = { version = "0.10", features = ["toml", "env"] } +miette = { version = "7", features = ["fancy"] } +thiserror = "2" +which = "7" +dirs = "6" +sha2 = "0.10" +hex = "0.4" +tempfile = "3" diff --git a/src/config.rs b/crates/sandcage/src/config.rs similarity index 100% rename from src/config.rs rename to crates/sandcage/src/config.rs diff --git a/src/docker.rs b/crates/sandcage/src/docker.rs similarity index 98% rename from src/docker.rs rename to crates/sandcage/src/docker.rs index 335e752..9ca6e5e 100644 --- a/src/docker.rs +++ b/crates/sandcage/src/docker.rs @@ -14,11 +14,11 @@ use crate::config::SandcageConfig; // Bundled Dockerfiles // --------------------------------------------------------------------------- -const DOCKERFILE_BASE: &str = include_str!("../images/base/Dockerfile"); -const DOCKERFILE_CLAUDE: &str = include_str!("../images/claude/Dockerfile"); -const DOCKERFILE_CODEX: &str = include_str!("../images/codex/Dockerfile"); +pub const DOCKERFILE_BASE: &str = include_str!("../../../images/base/Dockerfile"); +pub const DOCKERFILE_CLAUDE: &str = include_str!("../../../images/claude/Dockerfile"); +pub const DOCKERFILE_CODEX: &str = include_str!("../../../images/codex/Dockerfile"); -const COMPOSE_YAML: &str = include_str!("../compose/docker-compose.yml"); +pub const COMPOSE_YAML: &str = include_str!("../../../compose/docker-compose.yml"); #[derive(Debug, Error, Diagnostic)] pub enum DockerError { diff --git a/src/init.rs b/crates/sandcage/src/init.rs similarity index 99% rename from src/init.rs rename to crates/sandcage/src/init.rs index 3e542b9..ba3e9f3 100644 --- a/src/init.rs +++ b/crates/sandcage/src/init.rs @@ -4,7 +4,7 @@ use miette::Diagnostic; use thiserror::Error; const CLAUDE_SETTINGS_TEMPLATE: &str = - include_str!("../templates/claude/settings.json"); + include_str!("../../../templates/claude/settings.json"); #[derive(Debug, Error, Diagnostic)] pub enum InitError { diff --git a/crates/sandcage/src/lib.rs b/crates/sandcage/src/lib.rs new file mode 100644 index 0000000..83efa18 --- /dev/null +++ b/crates/sandcage/src/lib.rs @@ -0,0 +1,4 @@ +pub mod config; +pub mod docker; +pub mod init; +pub mod workspace; diff --git a/src/main.rs b/crates/sandcage/src/main.rs similarity index 97% rename from src/main.rs rename to crates/sandcage/src/main.rs index 5ecbd32..b3cc728 100644 --- a/src/main.rs +++ b/crates/sandcage/src/main.rs @@ -3,10 +3,10 @@ use miette::Diagnostic; use std::path::PathBuf; use thiserror::Error; -mod config; -mod docker; -mod init; -mod workspace; +use sandcage::config; +use sandcage::docker; +use sandcage::init; +use sandcage::workspace; /// Sandboxed containers for AI coding agents #[derive(Parser, Debug)] diff --git a/src/workspace.rs b/crates/sandcage/src/workspace.rs similarity index 100% rename from src/workspace.rs rename to crates/sandcage/src/workspace.rs diff --git a/justfile b/justfile index 6cadef7..69cc2f0 100644 --- a/justfile +++ b/justfile @@ -19,9 +19,17 @@ check: build: cargo build -# Run tests. +# Run unit tests (fast, no Docker required). test: - cargo test + cargo test --workspace --exclude sandcage-test + +# Run functional tests (requires Docker). +test-functional: + cargo test -p sandcage-test -- --test-threads=1 + +# Run all tests. +test-all: + cargo test --workspace # Run Claude Code. claude: