1use anyhow::Result;
5use std::path::Path;
6
7pub fn cmd_projects_list() -> Result<()> {
8 let paths = crate::core::machine_registry::list_paths()?;
9 if paths.is_empty() {
10 println!("no registered projects (run kaizen init inside a workspace first)");
11 return Ok(());
12 }
13 print_table(&paths);
14 Ok(())
15}
16
17fn print_table(paths: &[std::path::PathBuf]) {
18 let header = format!("{:<24} {:<40} {}", "NAME", "SLUG", "PATH");
19 println!("{header}");
20 println!("{}", "-".repeat(header.len()));
21 for path in paths {
22 let name = segment(path);
23 let slug = crate::core::paths::workspace_slug(path);
24 println!("{name:<24} {slug:<40} {}", path.display());
25 }
26}
27
28fn segment(path: &Path) -> &str {
29 path.file_name().and_then(|n| n.to_str()).unwrap_or("?")
30}