diff --git a/Cargo.lock b/Cargo.lock index 99f5f48d2..5294e442f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -310,17 +310,6 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" -[[package]] -name = "automod" -version = "1.0.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8b5778837666541195063243828c5b6139221b47dc4ec3ba81738e532469ab1" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - [[package]] name = "aws-lc-rs" version = "1.16.1" @@ -729,15 +718,6 @@ version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" -[[package]] -name = "content_inspector" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7bda66e858c683005a53a9a60c69a4aca7eeaa45d124526e389f7aec8e62f38" -dependencies = [ - "memchr", -] - [[package]] name = "convert_case" version = "0.10.0" @@ -1493,6 +1473,7 @@ dependencies = [ "fabro-server", "fabro-store", "fabro-telemetry", + "fabro-test", "fabro-types", "fabro-util", "fabro-validate", @@ -1526,7 +1507,6 @@ dependencies = [ "tracing", "tracing-appender", "tracing-subscriber", - "trycmd", "ulid", "walkdir", "x509-parser", @@ -1926,6 +1906,16 @@ dependencies = [ "uuid", ] +[[package]] +name = "fabro-test" +version = "0.176.2" +dependencies = [ + "assert_cmd", + "insta", + "regex", + "tempfile", +] + [[package]] name = "fabro-tracker" version = "0.176.2" @@ -2776,16 +2766,6 @@ version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "135b12329e5e3ce057a9f972339ea52bc954fe1e9358ef27f95e89716fbc5424" -[[package]] -name = "humantime-serde" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57a3db5ea5923d99402c94e9feb261dc5ee9b4efa158b0315f788cf549cc200c" -dependencies = [ - "humantime", - "serde", -] - [[package]] name = "hyper" version = "1.8.1" @@ -3086,6 +3066,7 @@ checksum = "e82db8c87c7f1ccecb34ce0c24399b8a73081427f3c7c50a5d597925356115e4" dependencies = [ "console 0.15.11", "once_cell", + "regex", "similar", "tempfile", ] @@ -4134,16 +4115,6 @@ dependencies = [ "windows-sys 0.61.2", ] -[[package]] -name = "os_pipe" -version = "1.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d8fae84b431384b68627d0f9b3b1245fcf9f46f6c0e3dc902e9dce64edd1967" -dependencies = [ - "libc", - "windows-sys 0.61.2", -] - [[package]] name = "ouroboros" version = "0.18.5" @@ -4693,26 +4664,6 @@ dependencies = [ "rand_core 0.9.5", ] -[[package]] -name = "rayon" -version = "1.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "368f01d005bf8fd9b1206fb6fa653e6c4a81ceb1466406b81792d87c5677a58f" -dependencies = [ - "either", - "rayon-core", -] - -[[package]] -name = "rayon-core" -version = "1.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" -dependencies = [ - "crossbeam-deque", - "crossbeam-utils", -] - [[package]] name = "redox_syscall" version = "0.5.18" @@ -5641,37 +5592,6 @@ dependencies = [ "serde", ] -[[package]] -name = "snapbox" -version = "0.6.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c1abc378119f77310836665f8523018532cf7e3faeb3b10b01da5a7321bf8e1" -dependencies = [ - "anstream", - "anstyle", - "content_inspector", - "dunce", - "filetime", - "libc", - "normalize-line-endings", - "os_pipe", - "similar", - "snapbox-macros", - "tempfile", - "wait-timeout", - "walkdir", - "windows-sys 0.60.2", -] - -[[package]] -name = "snapbox-macros" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b750c344002d7cc69afb9da00ebd9b5c0f8ac2eb7d115d9d45d5b5f47718d74" -dependencies = [ - "anstream", -] - [[package]] name = "socket2" version = "0.6.2" @@ -6341,7 +6261,7 @@ dependencies = [ "serde", "serde_spanned 0.6.9", "toml_datetime 0.6.11", - "toml_edit 0.22.27", + "toml_edit", ] [[package]] @@ -6391,21 +6311,6 @@ dependencies = [ "winnow 0.7.14", ] -[[package]] -name = "toml_edit" -version = "0.23.10+spec-1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84c8b9f757e028cee9fa244aea147aab2a9ec09d5325a9b01e0a49730c2b5269" -dependencies = [ - "indexmap 2.13.0", - "serde_core", - "serde_spanned 1.0.4", - "toml_datetime 0.7.5+spec-1.1.0", - "toml_parser", - "toml_writer", - "winnow 0.7.14", -] - [[package]] name = "toml_parser" version = "1.0.9+spec-1.1.0" @@ -6553,24 +6458,6 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" -[[package]] -name = "trycmd" -version = "0.15.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a81ea3136ddc88e19c2cc2eb3176b72abee4e831367cd8949f2a88ac5497e64e" -dependencies = [ - "anstream", - "automod", - "glob", - "humantime", - "humantime-serde", - "rayon", - "serde", - "shlex", - "snapbox", - "toml_edit 0.23.10+spec-1.0.0", -] - [[package]] name = "tungstenite" version = "0.26.2" diff --git a/Cargo.toml b/Cargo.toml index 582bb8e29..ed19abfab 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -55,6 +55,7 @@ hmac = "0.12" sha2 = "0.10" hex = "0.4" insta = "1" +fabro-test = { path = "lib/crates/fabro-test" } tokio-tungstenite = { version = "0.26", features = ["rustls-tls-webpki-roots"] } futures-util = "0.3" openssh = "0.11" diff --git a/lib/crates/fabro-cli/Cargo.toml b/lib/crates/fabro-cli/Cargo.toml index 82c1f652a..6b1521592 100644 --- a/lib/crates/fabro-cli/Cargo.toml +++ b/lib/crates/fabro-cli/Cargo.toml @@ -99,4 +99,4 @@ predicates = "3" serde_json.workspace = true tempfile = "3" httpmock = "0.8" -trycmd = "0.15" +fabro-test = { workspace = true } diff --git a/lib/crates/fabro-cli/tests/cmd/config/help.trycmd b/lib/crates/fabro-cli/tests/cmd/config/help.trycmd deleted file mode 100644 index b9f098c65..000000000 --- a/lib/crates/fabro-cli/tests/cmd/config/help.trycmd +++ /dev/null @@ -1,9 +0,0 @@ -```console -$ fabro config --help -[..] -... - -$ fabro config show --help -[..] -... -``` diff --git a/lib/crates/fabro-cli/tests/cmd/cp/help.trycmd b/lib/crates/fabro-cli/tests/cmd/cp/help.trycmd deleted file mode 100644 index 192511a98..000000000 --- a/lib/crates/fabro-cli/tests/cmd/cp/help.trycmd +++ /dev/null @@ -1,6 +0,0 @@ -```console -$ fabro cp --help -[..] -... - -``` diff --git a/lib/crates/fabro-cli/tests/cmd/doctor/dry-run-flag.stdout b/lib/crates/fabro-cli/tests/cmd/doctor/dry-run-flag.stdout deleted file mode 100644 index 50fe30806..000000000 --- a/lib/crates/fabro-cli/tests/cmd/doctor/dry-run-flag.stdout +++ /dev/null @@ -1,3 +0,0 @@ -... -[..]Fabro Doctor[..] -... diff --git a/lib/crates/fabro-cli/tests/cmd/doctor/dry-run-flag.toml b/lib/crates/fabro-cli/tests/cmd/doctor/dry-run-flag.toml deleted file mode 100644 index 1cdddd1d8..000000000 --- a/lib/crates/fabro-cli/tests/cmd/doctor/dry-run-flag.toml +++ /dev/null @@ -1,10 +0,0 @@ -bin.name = "fabro" -args = ["doctor", "--dry-run"] - -[env] -inherit = false - -[env.add] -PATH = "/usr/local/bin:/opt/homebrew/bin:/usr/bin:/bin:/usr/sbin:/sbin" -HOME = "/tmp/fabro-trycmd-nonexistent" -ANTHROPIC_API_KEY = "sk-test-dummy" diff --git a/lib/crates/fabro-cli/tests/cmd/doctor/help.trycmd b/lib/crates/fabro-cli/tests/cmd/doctor/help.trycmd deleted file mode 100644 index c6f233dac..000000000 --- a/lib/crates/fabro-cli/tests/cmd/doctor/help.trycmd +++ /dev/null @@ -1,6 +0,0 @@ -```console -$ fabro doctor --help -[..] -... - -``` diff --git a/lib/crates/fabro-cli/tests/cmd/exec/invalid-permissions.stdout b/lib/crates/fabro-cli/tests/cmd/exec/invalid-permissions.stdout deleted file mode 100644 index 3e840343f..000000000 --- a/lib/crates/fabro-cli/tests/cmd/exec/invalid-permissions.stdout +++ /dev/null @@ -1,3 +0,0 @@ -... -[..]invalid value[..] -... diff --git a/lib/crates/fabro-cli/tests/cmd/exec/invalid-permissions.toml b/lib/crates/fabro-cli/tests/cmd/exec/invalid-permissions.toml deleted file mode 100644 index b5624bffc..000000000 --- a/lib/crates/fabro-cli/tests/cmd/exec/invalid-permissions.toml +++ /dev/null @@ -1,7 +0,0 @@ -bin.name = "fabro" -args = ["exec", "--permissions", "bogus", "test prompt"] -status = "failed" -stderr-to-stdout = true - -[env] -inherit = false diff --git a/lib/crates/fabro-cli/tests/cmd/exec/no-prompt.stdout b/lib/crates/fabro-cli/tests/cmd/exec/no-prompt.stdout deleted file mode 100644 index 3a0e30ac7..000000000 --- a/lib/crates/fabro-cli/tests/cmd/exec/no-prompt.stdout +++ /dev/null @@ -1,3 +0,0 @@ -... -[..]Usage:[..] -... diff --git a/lib/crates/fabro-cli/tests/cmd/exec/no-prompt.toml b/lib/crates/fabro-cli/tests/cmd/exec/no-prompt.toml deleted file mode 100644 index 025a7d013..000000000 --- a/lib/crates/fabro-cli/tests/cmd/exec/no-prompt.toml +++ /dev/null @@ -1,7 +0,0 @@ -bin.name = "fabro" -args = ["exec"] -status = "failed" -stderr-to-stdout = true - -[env] -inherit = false diff --git a/lib/crates/fabro-cli/tests/cmd/init/help.trycmd b/lib/crates/fabro-cli/tests/cmd/init/help.trycmd deleted file mode 100644 index b33b5f0c2..000000000 --- a/lib/crates/fabro-cli/tests/cmd/init/help.trycmd +++ /dev/null @@ -1,6 +0,0 @@ -```console -$ fabro init --help -[..] -... - -``` diff --git a/lib/crates/fabro-cli/tests/cmd/install/help.trycmd b/lib/crates/fabro-cli/tests/cmd/install/help.trycmd deleted file mode 100644 index 343b5089a..000000000 --- a/lib/crates/fabro-cli/tests/cmd/install/help.trycmd +++ /dev/null @@ -1,6 +0,0 @@ -```console -$ fabro install --help -[..] -... - -``` diff --git a/lib/crates/fabro-cli/tests/cmd/llm/prompt-bad-option.stdout b/lib/crates/fabro-cli/tests/cmd/llm/prompt-bad-option.stdout deleted file mode 100644 index 2332705a9..000000000 --- a/lib/crates/fabro-cli/tests/cmd/llm/prompt-bad-option.stdout +++ /dev/null @@ -1,3 +0,0 @@ -... -[..]expected key=value[..] -... diff --git a/lib/crates/fabro-cli/tests/cmd/llm/prompt-bad-option.toml b/lib/crates/fabro-cli/tests/cmd/llm/prompt-bad-option.toml deleted file mode 100644 index a2b0468bc..000000000 --- a/lib/crates/fabro-cli/tests/cmd/llm/prompt-bad-option.toml +++ /dev/null @@ -1,7 +0,0 @@ -bin.name = "fabro" -args = ["llm", "prompt", "-o", "bad_option", "hello"] -status = "failed" -stderr-to-stdout = true - -[env] -inherit = false diff --git a/lib/crates/fabro-cli/tests/cmd/llm/prompt-no-text.stdout b/lib/crates/fabro-cli/tests/cmd/llm/prompt-no-text.stdout deleted file mode 100644 index 1d47217d0..000000000 --- a/lib/crates/fabro-cli/tests/cmd/llm/prompt-no-text.stdout +++ /dev/null @@ -1,3 +0,0 @@ -... -[..]no prompt provided[..] -... diff --git a/lib/crates/fabro-cli/tests/cmd/llm/prompt-no-text.toml b/lib/crates/fabro-cli/tests/cmd/llm/prompt-no-text.toml deleted file mode 100644 index 615ad67fc..000000000 --- a/lib/crates/fabro-cli/tests/cmd/llm/prompt-no-text.toml +++ /dev/null @@ -1,7 +0,0 @@ -bin.name = "fabro" -args = ["llm", "prompt"] -status = "failed" -stderr-to-stdout = true - -[env] -inherit = false diff --git a/lib/crates/fabro-cli/tests/cmd/llm/prompt-schema-invalid.stdout b/lib/crates/fabro-cli/tests/cmd/llm/prompt-schema-invalid.stdout deleted file mode 100644 index 3aaa85b0d..000000000 --- a/lib/crates/fabro-cli/tests/cmd/llm/prompt-schema-invalid.stdout +++ /dev/null @@ -1,3 +0,0 @@ -... -[..]--schema must be valid JSON[..] -... diff --git a/lib/crates/fabro-cli/tests/cmd/llm/prompt-schema-invalid.toml b/lib/crates/fabro-cli/tests/cmd/llm/prompt-schema-invalid.toml deleted file mode 100644 index 5c3807e20..000000000 --- a/lib/crates/fabro-cli/tests/cmd/llm/prompt-schema-invalid.toml +++ /dev/null @@ -1,7 +0,0 @@ -bin.name = "fabro" -args = ["llm", "prompt", "--no-stream", "-m", "test-model", "--schema", "not json", "hello"] -status = "failed" -stderr-to-stdout = true - -[env] -inherit = false diff --git a/lib/crates/fabro-cli/tests/cmd/model/bare.trycmd b/lib/crates/fabro-cli/tests/cmd/model/bare.trycmd deleted file mode 100644 index 9498915fb..000000000 --- a/lib/crates/fabro-cli/tests/cmd/model/bare.trycmd +++ /dev/null @@ -1,25 +0,0 @@ -```console -$ fabro model - MODEL   PROVIDER   ALIASES   CONTEXT   COST   SPEED  - claude-opus-4-6   anthropic  opus, claude-opus    1m   $15.0 / $75.0   25 tok/s  - claude-sonnet-4-5   anthropic      200k   $3.0 / $15.0   50 tok/s  - claude-sonnet-4-6   anthropic  sonnet, claude-sonnet    200k   $3.0 / $15.0   50 tok/s  - claude-haiku-4-5   anthropic  haiku, claude-haiku    200k   $0.8 / $4.0   100 tok/s  - gpt-5.2   openai   gpt5    1m   $1.8 / $14.0   65 tok/s  - gpt-5-mini   openai   gpt5-mini    1m   $0.2 / $2.0   70 tok/s  - gpt-5.2-codex   openai       1m   $1.8 / $14.0   100 tok/s  - gpt-5.3-codex   openai   codex    1m   $1.8 / $14.0   100 tok/s  - gpt-5.3-codex-spark   openai   codex-spark    131k   - / -  1000 tok/s  - gpt-5.4   openai   gpt54, gpt-54    1m   $2.5 / $15.0   70 tok/s  - gpt-5.4-pro   openai   gpt54-pro, gpt-54-pro    1m  $30.0 / $180.0   20 tok/s  - gpt-5.4-mini   openai   gpt54-mini, gpt-54-mini   400k   $0.8 / $4.5   140 tok/s  - gemini-3.1-pro-preview   gemini   gemini-pro    1m   $2.0 / $12.0   85 tok/s  - gemini-3.1-pro-preview-customtools  gemini   gemini-customtools    1m   $2.0 / $12.0   85 tok/s  - gemini-3-flash-preview   gemini   gemini-flash    1m   $0.5 / $3.0   150 tok/s  - gemini-3.1-flash-lite-preview   gemini   gemini-flash-lite    1m   $0.2 / $1.5   200 tok/s  - kimi-k2.5   kimi   kimi    262k   $0.6 / $3.0   50 tok/s  - glm-4.7   zai   glm, glm4    203k   $0.6 / $2.2   100 tok/s  - minimax-m2.5   minimax   minimax    197k   $0.3 / $1.2   45 tok/s  - mercury-2   inception  mercury    131k   $0.2 / $0.8  1000 tok/s  - -``` diff --git a/lib/crates/fabro-cli/tests/cmd/model/help.trycmd b/lib/crates/fabro-cli/tests/cmd/model/help.trycmd deleted file mode 100644 index b376d6c1c..000000000 --- a/lib/crates/fabro-cli/tests/cmd/model/help.trycmd +++ /dev/null @@ -1,6 +0,0 @@ -```console -$ fabro model --help -[..] -... - -``` diff --git a/lib/crates/fabro-cli/tests/cmd/model/list-provider.trycmd b/lib/crates/fabro-cli/tests/cmd/model/list-provider.trycmd deleted file mode 100644 index 83d18371b..000000000 --- a/lib/crates/fabro-cli/tests/cmd/model/list-provider.trycmd +++ /dev/null @@ -1,9 +0,0 @@ -```console -$ fabro model list --provider anthropic - MODEL   PROVIDER   ALIASES   CONTEXT   COST   SPEED  - claude-opus-4-6   anthropic  opus, claude-opus    1m  $15.0 / $75.0   25 tok/s  - claude-sonnet-4-5  anthropic      200k   $3.0 / $15.0   50 tok/s  - claude-sonnet-4-6  anthropic  sonnet, claude-sonnet   200k   $3.0 / $15.0   50 tok/s  - claude-haiku-4-5   anthropic  haiku, claude-haiku    200k   $0.8 / $4.0  100 tok/s  - -``` diff --git a/lib/crates/fabro-cli/tests/cmd/model/list-query-aliases.trycmd b/lib/crates/fabro-cli/tests/cmd/model/list-query-aliases.trycmd deleted file mode 100644 index 6a6ca5c05..000000000 --- a/lib/crates/fabro-cli/tests/cmd/model/list-query-aliases.trycmd +++ /dev/null @@ -1,8 +0,0 @@ -```console -$ fabro model list --query codex - MODEL   PROVIDER  ALIASES   CONTEXT   COST   SPEED  - gpt-5.2-codex   openai       1m  $1.8 / $14.0   100 tok/s  - gpt-5.3-codex   openai   codex    1m  $1.8 / $14.0   100 tok/s  - gpt-5.3-codex-spark  openai   codex-spark   131k   - / -  1000 tok/s  - -``` diff --git a/lib/crates/fabro-cli/tests/cmd/model/list-query-case-insensitive.trycmd b/lib/crates/fabro-cli/tests/cmd/model/list-query-case-insensitive.trycmd deleted file mode 100644 index b7b4381ee..000000000 --- a/lib/crates/fabro-cli/tests/cmd/model/list-query-case-insensitive.trycmd +++ /dev/null @@ -1,6 +0,0 @@ -```console -$ fabro model list --query OPUS - MODEL   PROVIDER   ALIASES   CONTEXT   COST   SPEED  - claude-opus-4-6  anthropic  opus, claude-opus   1m  $15.0 / $75.0  25 tok/s  - -``` diff --git a/lib/crates/fabro-cli/tests/cmd/model/list-query.trycmd b/lib/crates/fabro-cli/tests/cmd/model/list-query.trycmd deleted file mode 100644 index e3ae96a60..000000000 --- a/lib/crates/fabro-cli/tests/cmd/model/list-query.trycmd +++ /dev/null @@ -1,6 +0,0 @@ -```console -$ fabro model list --query opus - MODEL   PROVIDER   ALIASES   CONTEXT   COST   SPEED  - claude-opus-4-6  anthropic  opus, claude-opus   1m  $15.0 / $75.0  25 tok/s  - -``` diff --git a/lib/crates/fabro-cli/tests/cmd/model/list.trycmd b/lib/crates/fabro-cli/tests/cmd/model/list.trycmd deleted file mode 100644 index cd4c85681..000000000 --- a/lib/crates/fabro-cli/tests/cmd/model/list.trycmd +++ /dev/null @@ -1,25 +0,0 @@ -```console -$ fabro model list - MODEL   PROVIDER   ALIASES   CONTEXT   COST   SPEED  - claude-opus-4-6   anthropic  opus, claude-opus    1m   $15.0 / $75.0   25 tok/s  - claude-sonnet-4-5   anthropic      200k   $3.0 / $15.0   50 tok/s  - claude-sonnet-4-6   anthropic  sonnet, claude-sonnet    200k   $3.0 / $15.0   50 tok/s  - claude-haiku-4-5   anthropic  haiku, claude-haiku    200k   $0.8 / $4.0   100 tok/s  - gpt-5.2   openai   gpt5    1m   $1.8 / $14.0   65 tok/s  - gpt-5-mini   openai   gpt5-mini    1m   $0.2 / $2.0   70 tok/s  - gpt-5.2-codex   openai       1m   $1.8 / $14.0   100 tok/s  - gpt-5.3-codex   openai   codex    1m   $1.8 / $14.0   100 tok/s  - gpt-5.3-codex-spark   openai   codex-spark    131k   - / -  1000 tok/s  - gpt-5.4   openai   gpt54, gpt-54    1m   $2.5 / $15.0   70 tok/s  - gpt-5.4-pro   openai   gpt54-pro, gpt-54-pro    1m  $30.0 / $180.0   20 tok/s  - gpt-5.4-mini   openai   gpt54-mini, gpt-54-mini   400k   $0.8 / $4.5   140 tok/s  - gemini-3.1-pro-preview   gemini   gemini-pro    1m   $2.0 / $12.0   85 tok/s  - gemini-3.1-pro-preview-customtools  gemini   gemini-customtools    1m   $2.0 / $12.0   85 tok/s  - gemini-3-flash-preview   gemini   gemini-flash    1m   $0.5 / $3.0   150 tok/s  - gemini-3.1-flash-lite-preview   gemini   gemini-flash-lite    1m   $0.2 / $1.5   200 tok/s  - kimi-k2.5   kimi   kimi    262k   $0.6 / $3.0   50 tok/s  - glm-4.7   zai   glm, glm4    203k   $0.6 / $2.2   100 tok/s  - minimax-m2.5   minimax   minimax    197k   $0.3 / $1.2   45 tok/s  - mercury-2   inception  mercury    131k   $0.2 / $0.8  1000 tok/s  - -``` diff --git a/lib/crates/fabro-cli/tests/cmd/pr/help.trycmd b/lib/crates/fabro-cli/tests/cmd/pr/help.trycmd deleted file mode 100644 index 3afd70ab3..000000000 --- a/lib/crates/fabro-cli/tests/cmd/pr/help.trycmd +++ /dev/null @@ -1,6 +0,0 @@ -```console -$ fabro pr --help -[..] -... - -``` diff --git a/lib/crates/fabro-cli/tests/cmd/preview/help.trycmd b/lib/crates/fabro-cli/tests/cmd/preview/help.trycmd deleted file mode 100644 index 6ff861312..000000000 --- a/lib/crates/fabro-cli/tests/cmd/preview/help.trycmd +++ /dev/null @@ -1,6 +0,0 @@ -```console -$ fabro preview --help -[..] -... - -``` diff --git a/lib/crates/fabro-cli/tests/cmd/repo/help.trycmd b/lib/crates/fabro-cli/tests/cmd/repo/help.trycmd deleted file mode 100644 index 5fe17b3da..000000000 --- a/lib/crates/fabro-cli/tests/cmd/repo/help.trycmd +++ /dev/null @@ -1,6 +0,0 @@ -```console -$ fabro repo --help -[..] -... - -``` diff --git a/lib/crates/fabro-cli/tests/cmd/run/dry-run-branching.toml b/lib/crates/fabro-cli/tests/cmd/run/dry-run-branching.toml deleted file mode 100644 index dc18a4f72..000000000 --- a/lib/crates/fabro-cli/tests/cmd/run/dry-run-branching.toml +++ /dev/null @@ -1,9 +0,0 @@ -bin.name = "fabro" -args = ["run", "--dry-run", "--auto-approve", "../../../test/branching.fabro"] - -[env] -inherit = false - -[fs] -sandbox = false -cwd = "../../.." diff --git a/lib/crates/fabro-cli/tests/cmd/run/dry-run-conditions.toml b/lib/crates/fabro-cli/tests/cmd/run/dry-run-conditions.toml deleted file mode 100644 index be6796457..000000000 --- a/lib/crates/fabro-cli/tests/cmd/run/dry-run-conditions.toml +++ /dev/null @@ -1,9 +0,0 @@ -bin.name = "fabro" -args = ["run", "--dry-run", "--auto-approve", "../../../test/conditions.fabro"] - -[env] -inherit = false - -[fs] -sandbox = false -cwd = "../../.." diff --git a/lib/crates/fabro-cli/tests/cmd/run/dry-run-legacy-tool.toml b/lib/crates/fabro-cli/tests/cmd/run/dry-run-legacy-tool.toml deleted file mode 100644 index d8f0822ec..000000000 --- a/lib/crates/fabro-cli/tests/cmd/run/dry-run-legacy-tool.toml +++ /dev/null @@ -1,9 +0,0 @@ -bin.name = "fabro" -args = ["run", "--dry-run", "--auto-approve", "../../../test/legacy_tool.fabro"] - -[env] -inherit = false - -[fs] -sandbox = false -cwd = "../../.." diff --git a/lib/crates/fabro-cli/tests/cmd/run/dry-run-parallel.toml b/lib/crates/fabro-cli/tests/cmd/run/dry-run-parallel.toml deleted file mode 100644 index bb98ed609..000000000 --- a/lib/crates/fabro-cli/tests/cmd/run/dry-run-parallel.toml +++ /dev/null @@ -1,9 +0,0 @@ -bin.name = "fabro" -args = ["run", "--dry-run", "--auto-approve", "../../../test/parallel.fabro"] - -[env] -inherit = false - -[fs] -sandbox = false -cwd = "../../.." diff --git a/lib/crates/fabro-cli/tests/cmd/run/dry-run-simple.toml b/lib/crates/fabro-cli/tests/cmd/run/dry-run-simple.toml deleted file mode 100644 index d304c33da..000000000 --- a/lib/crates/fabro-cli/tests/cmd/run/dry-run-simple.toml +++ /dev/null @@ -1,9 +0,0 @@ -bin.name = "fabro" -args = ["run", "--dry-run", "--auto-approve", "../../../test/simple.fabro"] - -[env] -inherit = false - -[fs] -sandbox = false -cwd = "../../.." diff --git a/lib/crates/fabro-cli/tests/cmd/run/dry-run-styled.toml b/lib/crates/fabro-cli/tests/cmd/run/dry-run-styled.toml deleted file mode 100644 index c40ec2860..000000000 --- a/lib/crates/fabro-cli/tests/cmd/run/dry-run-styled.toml +++ /dev/null @@ -1,9 +0,0 @@ -bin.name = "fabro" -args = ["run", "--dry-run", "--auto-approve", "../../../test/styled.fabro"] - -[env] -inherit = false - -[fs] -sandbox = false -cwd = "../../.." diff --git a/lib/crates/fabro-cli/tests/cmd/run/help.trycmd b/lib/crates/fabro-cli/tests/cmd/run/help.trycmd deleted file mode 100644 index 5f48728ef..000000000 --- a/lib/crates/fabro-cli/tests/cmd/run/help.trycmd +++ /dev/null @@ -1,6 +0,0 @@ -```console -$ fabro run --help -[..] -... - -``` diff --git a/lib/crates/fabro-cli/tests/cmd/ssh/help.trycmd b/lib/crates/fabro-cli/tests/cmd/ssh/help.trycmd deleted file mode 100644 index 2a7ad36c0..000000000 --- a/lib/crates/fabro-cli/tests/cmd/ssh/help.trycmd +++ /dev/null @@ -1,6 +0,0 @@ -```console -$ fabro ssh --help -[..] -... - -``` diff --git a/lib/crates/fabro-cli/tests/cmd/system/help.trycmd b/lib/crates/fabro-cli/tests/cmd/system/help.trycmd deleted file mode 100644 index 7415294d4..000000000 --- a/lib/crates/fabro-cli/tests/cmd/system/help.trycmd +++ /dev/null @@ -1,6 +0,0 @@ -```console -$ fabro system --help -[..] -... - -``` diff --git a/lib/crates/fabro-cli/tests/cmd/top-level/no-dotenv-flag.stdout b/lib/crates/fabro-cli/tests/cmd/top-level/no-dotenv-flag.stdout deleted file mode 100644 index 42412c762..000000000 --- a/lib/crates/fabro-cli/tests/cmd/top-level/no-dotenv-flag.stdout +++ /dev/null @@ -1,3 +0,0 @@ -... -[..]unexpected argument[..] -... diff --git a/lib/crates/fabro-cli/tests/cmd/top-level/no-dotenv-flag.toml b/lib/crates/fabro-cli/tests/cmd/top-level/no-dotenv-flag.toml deleted file mode 100644 index b852d9b3f..000000000 --- a/lib/crates/fabro-cli/tests/cmd/top-level/no-dotenv-flag.toml +++ /dev/null @@ -1,7 +0,0 @@ -bin.name = "fabro" -args = ["--no-dotenv", "doctor"] -status = "failed" -stderr-to-stdout = true - -[env] -inherit = false diff --git a/lib/crates/fabro-cli/tests/cmd/top-level/version.trycmd b/lib/crates/fabro-cli/tests/cmd/top-level/version.trycmd deleted file mode 100644 index 3de33a6f6..000000000 --- a/lib/crates/fabro-cli/tests/cmd/top-level/version.trycmd +++ /dev/null @@ -1,5 +0,0 @@ -```console -$ fabro --version -fabro [..] - -``` diff --git a/lib/crates/fabro-cli/tests/cmd/validate/branching.toml b/lib/crates/fabro-cli/tests/cmd/validate/branching.toml deleted file mode 100644 index 90ed3679c..000000000 --- a/lib/crates/fabro-cli/tests/cmd/validate/branching.toml +++ /dev/null @@ -1,9 +0,0 @@ -bin.name = "fabro" -args = ["validate", "../../../test/branching.fabro"] - -[env] -inherit = false - -[fs] -sandbox = false -cwd = "../../.." diff --git a/lib/crates/fabro-cli/tests/cmd/validate/conditions.toml b/lib/crates/fabro-cli/tests/cmd/validate/conditions.toml deleted file mode 100644 index ca87ea280..000000000 --- a/lib/crates/fabro-cli/tests/cmd/validate/conditions.toml +++ /dev/null @@ -1,9 +0,0 @@ -bin.name = "fabro" -args = ["validate", "../../../test/conditions.fabro"] - -[env] -inherit = false - -[fs] -sandbox = false -cwd = "../../.." diff --git a/lib/crates/fabro-cli/tests/cmd/validate/help.trycmd b/lib/crates/fabro-cli/tests/cmd/validate/help.trycmd deleted file mode 100644 index ca53c3141..000000000 --- a/lib/crates/fabro-cli/tests/cmd/validate/help.trycmd +++ /dev/null @@ -1,6 +0,0 @@ -```console -$ fabro validate --help -[..] -... - -``` diff --git a/lib/crates/fabro-cli/tests/cmd/validate/invalid.toml b/lib/crates/fabro-cli/tests/cmd/validate/invalid.toml deleted file mode 100644 index f2f9bce1f..000000000 --- a/lib/crates/fabro-cli/tests/cmd/validate/invalid.toml +++ /dev/null @@ -1,10 +0,0 @@ -bin.name = "fabro" -args = ["validate", "../../../test/invalid.fabro"] -status = "failed" - -[env] -inherit = false - -[fs] -sandbox = false -cwd = "../../.." diff --git a/lib/crates/fabro-cli/tests/cmd/validate/legacy-tool.toml b/lib/crates/fabro-cli/tests/cmd/validate/legacy-tool.toml deleted file mode 100644 index 9b63836f2..000000000 --- a/lib/crates/fabro-cli/tests/cmd/validate/legacy-tool.toml +++ /dev/null @@ -1,9 +0,0 @@ -bin.name = "fabro" -args = ["validate", "../../../test/legacy_tool.fabro"] - -[env] -inherit = false - -[fs] -sandbox = false -cwd = "../../.." diff --git a/lib/crates/fabro-cli/tests/cmd/validate/parallel.toml b/lib/crates/fabro-cli/tests/cmd/validate/parallel.toml deleted file mode 100644 index e27985d3e..000000000 --- a/lib/crates/fabro-cli/tests/cmd/validate/parallel.toml +++ /dev/null @@ -1,9 +0,0 @@ -bin.name = "fabro" -args = ["validate", "../../../test/parallel.fabro"] - -[env] -inherit = false - -[fs] -sandbox = false -cwd = "../../.." diff --git a/lib/crates/fabro-cli/tests/cmd/validate/simple.toml b/lib/crates/fabro-cli/tests/cmd/validate/simple.toml deleted file mode 100644 index de446a3b7..000000000 --- a/lib/crates/fabro-cli/tests/cmd/validate/simple.toml +++ /dev/null @@ -1,9 +0,0 @@ -bin.name = "fabro" -args = ["validate", "../../../test/simple.fabro"] - -[env] -inherit = false - -[fs] -sandbox = false -cwd = "../../.." diff --git a/lib/crates/fabro-cli/tests/cmd/validate/styled.toml b/lib/crates/fabro-cli/tests/cmd/validate/styled.toml deleted file mode 100644 index 745bf7d6f..000000000 --- a/lib/crates/fabro-cli/tests/cmd/validate/styled.toml +++ /dev/null @@ -1,9 +0,0 @@ -bin.name = "fabro" -args = ["validate", "../../../test/styled.fabro"] - -[env] -inherit = false - -[fs] -sandbox = false -cwd = "../../.." diff --git a/lib/crates/fabro-cli/tests/it/cmd/config.rs b/lib/crates/fabro-cli/tests/it/cmd/config.rs new file mode 100644 index 000000000..fa16d1c3a --- /dev/null +++ b/lib/crates/fabro-cli/tests/it/cmd/config.rs @@ -0,0 +1,56 @@ +use fabro_test::{fabro_snapshot, test_context}; + +#[test] +fn help() { + let context = test_context!(); + let mut cmd = context.config(); + cmd.arg("--help"); + fabro_snapshot!(context.filters(), cmd, @" + success: true + exit_code: 0 + ----- stdout ----- + Inspect merged configuration + + Usage: fabro config [OPTIONS] + + Commands: + show Print the merged FabroSettings as YAML + help Print this message or the help of the given subcommand(s) + + Options: + --debug Enable DEBUG-level logging (default is INFO) [env: FABRO_DEBUG=] + --no-upgrade-check Disable automatic upgrade check [env: FABRO_NO_UPGRADE_CHECK=true] + --quiet Suppress non-essential output [env: FABRO_QUIET=] + --verbose Enable verbose output [env: FABRO_VERBOSE=] + --storage-dir Storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] + -h, --help Print help + ----- stderr ----- + "); +} + +#[test] +fn show_help() { + let context = test_context!(); + let mut cmd = context.config(); + cmd.args(["show", "--help"]); + fabro_snapshot!(context.filters(), cmd, @" + success: true + exit_code: 0 + ----- stdout ----- + Print the merged FabroSettings as YAML + + Usage: fabro config show [OPTIONS] [WORKFLOW] + + Arguments: + [WORKFLOW] Optional workflow name, .fabro path, or .toml run config to overlay + + Options: + --debug Enable DEBUG-level logging (default is INFO) [env: FABRO_DEBUG=] + --no-upgrade-check Disable automatic upgrade check [env: FABRO_NO_UPGRADE_CHECK=true] + --quiet Suppress non-essential output [env: FABRO_QUIET=] + --verbose Enable verbose output [env: FABRO_VERBOSE=] + --storage-dir Storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] + -h, --help Print help + ----- stderr ----- + "); +} diff --git a/lib/crates/fabro-cli/tests/it/cmd/cp.rs b/lib/crates/fabro-cli/tests/it/cmd/cp.rs new file mode 100644 index 000000000..7f2a1f2b6 --- /dev/null +++ b/lib/crates/fabro-cli/tests/it/cmd/cp.rs @@ -0,0 +1,30 @@ +use fabro_test::{fabro_snapshot, test_context}; + +#[test] +fn help() { + let context = test_context!(); + let mut cmd = context.cp(); + cmd.arg("--help"); + fabro_snapshot!(context.filters(), cmd, @" + success: true + exit_code: 0 + ----- stdout ----- + Copy files to/from a run's sandbox + + Usage: fabro cp [OPTIONS] + + Arguments: + Source: : or local path + Destination: : or local path + + Options: + --debug Enable DEBUG-level logging (default is INFO) [env: FABRO_DEBUG=] + -r, --recursive Recurse into directories + --no-upgrade-check Disable automatic upgrade check [env: FABRO_NO_UPGRADE_CHECK=true] + --quiet Suppress non-essential output [env: FABRO_QUIET=] + --verbose Enable verbose output [env: FABRO_VERBOSE=] + --storage-dir Storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] + -h, --help Print help + ----- stderr ----- + "); +} diff --git a/lib/crates/fabro-cli/tests/it/cmd/doctor.rs b/lib/crates/fabro-cli/tests/it/cmd/doctor.rs new file mode 100644 index 000000000..aa843e0b7 --- /dev/null +++ b/lib/crates/fabro-cli/tests/it/cmd/doctor.rs @@ -0,0 +1,62 @@ +use fabro_test::{fabro_snapshot, test_context}; + +#[test] +fn help() { + let context = test_context!(); + let mut cmd = context.doctor(); + cmd.arg("--help"); + fabro_snapshot!(context.filters(), cmd, @" + success: true + exit_code: 0 + ----- stdout ----- + Check environment and integration health + + Usage: fabro doctor [OPTIONS] + + Options: + --debug Enable DEBUG-level logging (default is INFO) [env: FABRO_DEBUG=] + -v, --verbose Show detailed information for each check + --dry-run Skip live service probes (LLM, sandbox, API, web, Brave Search) + --no-upgrade-check Disable automatic upgrade check [env: FABRO_NO_UPGRADE_CHECK=true] + --quiet Suppress non-essential output [env: FABRO_QUIET=] + --storage-dir Storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] + -h, --help Print help + ----- stderr ----- + "); +} + +#[test] +fn dry_run_flag() { + let context = test_context!(); + let mut cmd = context.doctor(); + cmd.arg("--dry-run"); + cmd.env( + "PATH", + "/usr/local/bin:/opt/homebrew/bin:/usr/bin:/bin:/usr/sbin:/sbin", + ); + cmd.env("ANTHROPIC_API_KEY", "sk-test-dummy"); + fabro_snapshot!(context.filters(), cmd, @" + success: true + exit_code: 0 + ----- stdout ----- + Fabro Doctor + + Required + [!] Configuration (no user config file found) + [✓] LLM providers (1 configured) + [!] GitHub App (not configured) + + Optional + [!] Cloud sandbox (no sandbox configured) + [!] Brave Search (not configured) + + Found issues in 4 categories. + + Warnings: + • Configuration — Create ~/.fabro/user.toml + • GitHub App — Configure GitHub App in server.toml and set env vars to enable GitHub integration + • Cloud sandbox — Set DAYTONA_API_KEY to enable cloud sandbox execution + • Brave Search — Set BRAVE_SEARCH_API_KEY to enable web search + ----- stderr ----- + "); +} diff --git a/lib/crates/fabro-cli/tests/it/cmd/exec.rs b/lib/crates/fabro-cli/tests/it/cmd/exec.rs new file mode 100644 index 000000000..d9dcb9243 --- /dev/null +++ b/lib/crates/fabro-cli/tests/it/cmd/exec.rs @@ -0,0 +1,35 @@ +use fabro_test::{fabro_snapshot, test_context}; + +#[test] +fn invalid_permissions() { + let context = test_context!(); + let mut cmd = context.exec_cmd(); + cmd.args(["--permissions", "bogus", "test prompt"]); + fabro_snapshot!(context.filters(), cmd, @" + success: false + exit_code: 2 + ----- stdout ----- + ----- stderr ----- + error: invalid value 'bogus' for '--permissions ' + [possible values: read-only, read-write, full] + + For more information, try '--help'. + "); +} + +#[test] +fn no_prompt() { + let context = test_context!(); + fabro_snapshot!(context.filters(), context.exec_cmd(), @" + success: false + exit_code: 2 + ----- stdout ----- + ----- stderr ----- + error: the following required arguments were not provided: + + + Usage: fabro exec --no-upgrade-check --storage-dir + + For more information, try '--help'. + "); +} diff --git a/lib/crates/fabro-cli/tests/it/cmd/init.rs b/lib/crates/fabro-cli/tests/it/cmd/init.rs new file mode 100644 index 000000000..560047540 --- /dev/null +++ b/lib/crates/fabro-cli/tests/it/cmd/init.rs @@ -0,0 +1,25 @@ +use fabro_test::{fabro_snapshot, test_context}; + +#[test] +fn help() { + let context = test_context!(); + let mut cmd = context.init_cmd(); + cmd.arg("--help"); + fabro_snapshot!(context.filters(), cmd, @" + success: true + exit_code: 0 + ----- stdout ----- + Initialize a new project (deprecated: use `repo init`) + + Usage: fabro init [OPTIONS] + + Options: + --debug Enable DEBUG-level logging (default is INFO) [env: FABRO_DEBUG=] + --no-upgrade-check Disable automatic upgrade check [env: FABRO_NO_UPGRADE_CHECK=true] + --quiet Suppress non-essential output [env: FABRO_QUIET=] + --verbose Enable verbose output [env: FABRO_VERBOSE=] + --storage-dir Storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] + -h, --help Print help + ----- stderr ----- + "); +} diff --git a/lib/crates/fabro-cli/tests/it/cmd/install.rs b/lib/crates/fabro-cli/tests/it/cmd/install.rs new file mode 100644 index 000000000..04988166a --- /dev/null +++ b/lib/crates/fabro-cli/tests/it/cmd/install.rs @@ -0,0 +1,26 @@ +use fabro_test::{fabro_snapshot, test_context}; + +#[test] +fn help() { + let context = test_context!(); + let mut cmd = context.install(); + cmd.arg("--help"); + fabro_snapshot!(context.filters(), cmd, @" + success: true + exit_code: 0 + ----- stdout ----- + Set up the Fabro environment (LLMs, certs, GitHub) + + Usage: fabro install [OPTIONS] + + Options: + --debug Enable DEBUG-level logging (default is INFO) [env: FABRO_DEBUG=] + --web-url Base URL for the web UI (used for OAuth callback URLs) [default: http://localhost:5173] + --no-upgrade-check Disable automatic upgrade check [env: FABRO_NO_UPGRADE_CHECK=true] + --quiet Suppress non-essential output [env: FABRO_QUIET=] + --verbose Enable verbose output [env: FABRO_VERBOSE=] + --storage-dir Storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] + -h, --help Print help + ----- stderr ----- + "); +} diff --git a/lib/crates/fabro-cli/tests/it/cmd/llm.rs b/lib/crates/fabro-cli/tests/it/cmd/llm.rs new file mode 100644 index 000000000..cb2d3ccf2 --- /dev/null +++ b/lib/crates/fabro-cli/tests/it/cmd/llm.rs @@ -0,0 +1,55 @@ +use fabro_test::{fabro_snapshot, test_context}; + +#[test] +fn prompt_bad_option() { + let context = test_context!(); + let mut cmd = context.llm(); + cmd.args(["prompt", "-o", "bad_option", "hello"]); + fabro_snapshot!(context.filters(), cmd, @" + success: false + exit_code: 2 + ----- stdout ----- + ----- stderr ----- + error: invalid value 'bad_option' for '--option