Single-commit clean baseline after security scrub of niche-tells, project codenames, internal jargon, and contributor-email leaks. Contents: - 100 Rust crates (_primitives/_rust/) - 37 agent manifests (_manifests/) + generated specs (_generated/) - 67 user-invocable skills (skills/) - 33 hooks (hooks/) - Composition blocks (_blocks/) - Documentation (docs/, README.md) - TS adapter packages (_ts_packages/) - Assembler (_assembler/) - Roles (_roles/) - Templates (_templates/) - Forgejo CI (.forgejo/) Author: Denis Parfionovich <info@greendragon.info> License: see LICENSE.
120 lines
3 KiB
Rust
120 lines
3 KiB
Rust
//! clap parses each of the 5 subcommands with required + optional flags.
|
|
//! Exercises both required-arg presence and flag default values.
|
|
|
|
use clap::Parser;
|
|
use kei_llm_llamacpp::cli::{Cli, Cmd};
|
|
|
|
#[test]
|
|
fn probe_subcommand_parses() {
|
|
let cli = Cli::try_parse_from(["kei-llm-llamacpp", "probe"]).unwrap();
|
|
assert!(matches!(cli.cmd, Cmd::Probe));
|
|
}
|
|
|
|
#[test]
|
|
fn models_subcommand_with_dir() {
|
|
let cli = Cli::try_parse_from([
|
|
"kei-llm-llamacpp",
|
|
"models",
|
|
"--dir",
|
|
"/tmp/llama-models",
|
|
])
|
|
.unwrap();
|
|
match cli.cmd {
|
|
Cmd::Models { dir } => assert_eq!(dir.unwrap().to_str().unwrap(), "/tmp/llama-models"),
|
|
other => panic!("expected Models, got {other:?}"),
|
|
}
|
|
}
|
|
|
|
#[test]
|
|
fn models_subcommand_without_dir() {
|
|
let cli = Cli::try_parse_from(["kei-llm-llamacpp", "models"]).unwrap();
|
|
match cli.cmd {
|
|
Cmd::Models { dir } => assert!(dir.is_none()),
|
|
other => panic!("expected Models, got {other:?}"),
|
|
}
|
|
}
|
|
|
|
#[test]
|
|
fn generate_subcommand_with_all_flags() {
|
|
let cli = Cli::try_parse_from([
|
|
"kei-llm-llamacpp",
|
|
"generate",
|
|
"--model",
|
|
"/tmp/m.gguf",
|
|
"--prompt",
|
|
"hello",
|
|
"--max-tokens",
|
|
"256",
|
|
"--temperature",
|
|
"0.4",
|
|
"--stream",
|
|
])
|
|
.unwrap();
|
|
match cli.cmd {
|
|
Cmd::Generate { model, prompt, max_tokens, temperature, stream } => {
|
|
assert_eq!(model.to_str().unwrap(), "/tmp/m.gguf");
|
|
assert_eq!(prompt, "hello");
|
|
assert_eq!(max_tokens, 256);
|
|
assert_eq!(temperature, Some(0.4));
|
|
assert!(stream);
|
|
}
|
|
other => panic!("expected Generate, got {other:?}"),
|
|
}
|
|
}
|
|
|
|
#[test]
|
|
fn generate_subcommand_default_max_tokens() {
|
|
let cli = Cli::try_parse_from([
|
|
"kei-llm-llamacpp",
|
|
"generate",
|
|
"--model",
|
|
"/tmp/m.gguf",
|
|
"--prompt",
|
|
"hi",
|
|
])
|
|
.unwrap();
|
|
match cli.cmd {
|
|
Cmd::Generate { max_tokens, temperature, stream, .. } => {
|
|
assert_eq!(max_tokens, 128);
|
|
assert!(temperature.is_none());
|
|
assert!(!stream);
|
|
}
|
|
other => panic!("expected Generate, got {other:?}"),
|
|
}
|
|
}
|
|
|
|
#[test]
|
|
fn server_subcommand_default_host_and_port() {
|
|
let cli = Cli::try_parse_from([
|
|
"kei-llm-llamacpp",
|
|
"server",
|
|
"--model",
|
|
"/tmp/m.gguf",
|
|
])
|
|
.unwrap();
|
|
match cli.cmd {
|
|
Cmd::Server { host, port, .. } => {
|
|
assert_eq!(host, "127.0.0.1");
|
|
assert_eq!(port, 8080);
|
|
}
|
|
other => panic!("expected Server, got {other:?}"),
|
|
}
|
|
}
|
|
|
|
#[test]
|
|
fn version_subcommand_parses() {
|
|
let cli = Cli::try_parse_from(["kei-llm-llamacpp", "version"]).unwrap();
|
|
assert!(matches!(cli.cmd, Cmd::Version));
|
|
}
|
|
|
|
#[test]
|
|
fn missing_required_flag_errors() {
|
|
// generate without --model must fail.
|
|
let res = Cli::try_parse_from([
|
|
"kei-llm-llamacpp",
|
|
"generate",
|
|
"--prompt",
|
|
"hi",
|
|
]);
|
|
assert!(res.is_err(), "generate without --model must error");
|
|
}
|