huskies: rename project from storkit to huskies

Rename all references from storkit to huskies across the codebase:
- .storkit/ directory → .huskies/
- Binary name, Cargo package name, Docker image references
- Server code, frontend code, config files, scripts
- Fix script/test to build frontend before cargo clippy/test
  so merge worktrees have frontend/dist available for RustEmbed

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Timmy
2026-04-03 16:12:52 +01:00
parent a7035b6ba7
commit 2d8ccb3eb6
572 changed files with 1340 additions and 1220 deletions
+20 -20
View File
@@ -57,7 +57,7 @@ fn parse_cli_args(args: &[String]) -> Result<CliArgs, String> {
std::process::exit(0);
}
"--version" | "-V" => {
println!("storkit {}", env!("CARGO_PKG_VERSION"));
println!("huskies {}", env!("CARGO_PKG_VERSION"));
std::process::exit(0);
}
"--port" => {
@@ -97,18 +97,18 @@ fn parse_cli_args(args: &[String]) -> Result<CliArgs, String> {
}
fn print_help() {
println!("storkit [OPTIONS] [PATH]");
println!("storkit init [OPTIONS] [PATH]");
println!("huskies [OPTIONS] [PATH]");
println!("huskies init [OPTIONS] [PATH]");
println!();
println!("Serve a storkit project.");
println!("Serve a huskies project.");
println!();
println!("COMMANDS:");
println!(" init Scaffold a new .storkit/ project and start the interactive setup wizard.");
println!(" init Scaffold a new .huskies/ project and start the interactive setup wizard.");
println!();
println!("ARGS:");
println!(
" PATH Path to an existing project directory. \
If omitted, storkit searches parent directories for a .storkit/ root."
If omitted, huskies searches parent directories for a .huskies/ root."
);
println!();
println!("OPTIONS:");
@@ -139,10 +139,10 @@ async fn main() -> Result<(), std::io::Error> {
let app_state = Arc::new(SessionState::default());
let cwd = std::env::current_dir().unwrap_or_else(|_| PathBuf::from("."));
// Migrate legacy root-level store.json into .storkit/ if the new path does
// Migrate legacy root-level store.json into .huskies/ if the new path does
// not yet exist. This keeps existing deployments working after upgrade.
let legacy_store_path = cwd.join("store.json");
let store_path = cwd.join(".storkit").join("store.json");
let store_path = cwd.join(".huskies").join("store.json");
if legacy_store_path.exists() && !store_path.exists() {
if let Some(parent) = store_path.parent() {
let _ = std::fs::create_dir_all(parent);
@@ -160,7 +160,7 @@ async fn main() -> Result<(), std::io::Error> {
Ok(args) => args,
Err(msg) => {
eprintln!("error: {msg}");
eprintln!("Run 'storkit --help' for usage.");
eprintln!("Run 'huskies --help' for usage.");
std::process::exit(1);
}
};
@@ -187,7 +187,7 @@ async fn main() -> Result<(), std::io::Error> {
}
if is_init {
// `storkit init [PATH]` — always scaffold, never search parents.
// `huskies init [PATH]` — always scaffold, never search parents.
let init_root = explicit_path.unwrap_or_else(|| cwd.clone());
if !init_root.exists() {
std::fs::create_dir_all(&init_root).unwrap_or_else(|e| {
@@ -218,7 +218,7 @@ async fn main() -> Result<(), std::io::Error> {
}
} else if let Some(explicit_root) = explicit_path {
// An explicit path was given on the command line.
// Open it directly — scaffold .storkit/ if it is missing — and
// Open it directly — scaffold .huskies/ if it is missing — and
// exit with a clear error message if the path is invalid.
match io::fs::open_project(
explicit_root.to_string_lossy().to_string(),
@@ -240,7 +240,7 @@ async fn main() -> Result<(), std::io::Error> {
}
}
} else {
// No path argument — auto-detect a .storkit/ project in cwd or
// No path argument — auto-detect a .huskies/ project in cwd or
// parent directories (preserves existing behaviour).
if let Some(project_root) = find_story_kit_root(&cwd) {
io::fs::open_project(
@@ -259,8 +259,8 @@ async fn main() -> Result<(), std::io::Error> {
config::ProjectConfig::load(&project_root)
.unwrap_or_else(|e| panic!("Invalid project.toml: {e}"));
} else {
// No .storkit/ found in cwd or parents — scaffold cwd as a new
// project, exactly like `storkit .` does.
// No .huskies/ found in cwd or parents — scaffold cwd as a new
// project, exactly like `huskies .` does.
io::fs::open_project(
cwd.to_string_lossy().to_string(),
&app_state,
@@ -277,7 +277,7 @@ async fn main() -> Result<(), std::io::Error> {
// Enable persistent server log file now that the project root is known.
if let Some(ref root) = *app_state.project_root.lock().unwrap() {
let log_dir = root.join(".storkit").join("logs");
let log_dir = root.join(".huskies").join("logs");
let _ = std::fs::create_dir_all(&log_dir);
log_buffer::global().set_log_file(log_dir.join("server.log"));
}
@@ -294,7 +294,7 @@ async fn main() -> Result<(), std::io::Error> {
let watchdog_root: Option<PathBuf> = app_state.project_root.lock().unwrap().clone();
AgentPool::spawn_watchdog(Arc::clone(&agents), watchdog_root);
if let Some(ref root) = *app_state.project_root.lock().unwrap() {
let work_dir = root.join(".storkit").join("work");
let work_dir = root.join(".huskies").join("work");
if work_dir.is_dir() {
let watcher_config = config::ProjectConfig::load(root)
.map(|c| c.watcher)
@@ -521,7 +521,7 @@ async fn main() -> Result<(), std::io::Error> {
let app = build_routes(ctx, whatsapp_ctx.clone(), slack_ctx.clone(), port);
// Optional Matrix bot: connect to the homeserver and start listening for
// messages if `.storkit/bot.toml` is present and enabled.
// messages if `.huskies/bot.toml` is present and enabled.
if let Some(ref root) = startup_root {
chat::transport::matrix::spawn_bot(
root,
@@ -574,13 +574,13 @@ async fn main() -> Result<(), std::io::Error> {
startup_agents.auto_assign_available_work(&root).await;
});
}
let host = std::env::var("STORKIT_HOST").unwrap_or_else(|_| "127.0.0.1".to_string());
let host = std::env::var("HUSKIES_HOST").unwrap_or_else(|_| "127.0.0.1".to_string());
let addr = format!("{host}:{port}");
println!(
"\x1b[95;1m ____ _ _ ___ _ \n / ___|| |_ ___ _ __| | _|_ _| |_ \n \\___ \\| __/ _ \\| '__| |/ /| || __|\n ___) | || (_) | | | < | || |_ \n |____/ \\__\\___/|_| |_|\\_\\___|\\__|\n\x1b[0m"
);
println!("STORKIT_PORT={port}");
println!("HUSKIES_PORT={port}");
println!("\x1b[96;1mFrontend:\x1b[0m \x1b[94mhttp://{addr}\x1b[0m");
println!("\x1b[92;1mOpenAPI Docs:\x1b[0m \x1b[94mhttp://{addr}/docs\x1b[0m");
@@ -637,7 +637,7 @@ mod tests {
#[should_panic(expected = "Invalid project.toml: Duplicate agent name")]
fn panics_on_duplicate_agent_names() {
let tmp = tempfile::tempdir().unwrap();
let sk = tmp.path().join(".storkit");
let sk = tmp.path().join(".huskies");
std::fs::create_dir_all(&sk).unwrap();
std::fs::write(
sk.join("project.toml"),