// cli/graph.rs — graph subcommand handlers // // Extracted from main.rs. All graph-related CLI commands: // link, link-add, link-impact, link-audit, cap-degree, // normalize-strengths, trace, spectral-*, organize, communities. use crate::store; pub fn cmd_cap_degree(max_deg: usize) -> Result<(), String> { let mut store = store::Store::load()?; let (hubs, pruned) = store.cap_degree(max_deg)?; store.save()?; println!("Capped {} hubs, pruned {} weak Auto edges (max_degree={})", hubs, pruned, max_deg); Ok(()) } pub fn cmd_normalize_strengths(apply: bool) -> Result<(), String> { if apply { super::check_dry_run(); } let result = crate::mcp_server::memory_rpc( "graph_normalize_strengths", serde_json::json!({"apply": apply}), ).map_err(|e| e.to_string())?; print!("{}", result); Ok(()) } pub fn cmd_link(key: &[String]) -> Result<(), String> { if key.is_empty() { return Err("link requires a key".into()); } let key = key.join(" "); let result = crate::mcp_server::memory_rpc( "memory_links", serde_json::json!({"key": key}), ).map_err(|e| e.to_string())?; print!("{}", result); Ok(()) } pub fn cmd_link_add(source: &str, target: &str, _reason: &[String]) -> Result<(), String> { super::check_dry_run(); let result = crate::mcp_server::memory_rpc( "memory_link_add", serde_json::json!({"source": source, "target": target}), ).map_err(|e| e.to_string())?; println!("{}", result); Ok(()) } pub fn cmd_link_set(source: &str, target: &str, strength: f32) -> Result<(), String> { super::check_dry_run(); let result = crate::mcp_server::memory_rpc( "memory_link_set", serde_json::json!({"source": source, "target": target, "strength": strength}), ).map_err(|e| e.to_string())?; println!("{}", result); Ok(()) } pub fn cmd_link_impact(source: &str, target: &str) -> Result<(), String> { let result = crate::mcp_server::memory_rpc( "graph_link_impact", serde_json::json!({"source": source, "target": target}), ).map_err(|e| e.to_string())?; print!("{}", result); Ok(()) } pub fn cmd_trace(key: &[String]) -> Result<(), String> { if key.is_empty() { return Err("trace requires a key".into()); } let key = key.join(" "); let result = crate::mcp_server::memory_rpc( "graph_trace", serde_json::json!({"key": key}), ).map_err(|e| e.to_string())?; print!("{}", result); Ok(()) } /// Show communities sorted by isolation (most isolated first). /// Useful for finding poorly-integrated knowledge clusters that need /// organize agents aimed at them. pub fn cmd_communities(top_n: usize, min_size: usize) -> Result<(), String> { let result = crate::mcp_server::memory_rpc( "graph_communities", serde_json::json!({"top_n": top_n, "min_size": min_size}), ).map_err(|e| e.to_string())?; print!("{}", result); Ok(()) }