//! 一键接入(agent-client-parity P8)的本体模块。 //! //! 约束(architecture-evolution A1a,由下方 `onboard_module_is_projection_free` 机器校验): //! 本模块源码不依赖 Tauri、不直接取全局连接池、不声明 Tauri command;连接、凭据存储、 //! 进程执行由调用方注入,结果一律是 serde 结构体。Tauri command 与 MCP 工具只做薄投影。 //! 存量入口(mcp_inject 等)按绞杀者模式逐步改成薄包装,不往这里扩散旧写法。 pub mod clients; pub mod plan; #[cfg(test)] mod fitness_tests { /// 架构适应度测试:onboard/ 下任何源码出现投影层依赖即失败(模式拼接书写,避免本测试自身命中)。 #[test] fn onboard_module_is_projection_free() { let forbidden = [ ["tauri", "::"].concat(), ["db::", "pool("].concat(), ["#[tauri", "::command"].concat(), ]; let root = std::path::Path::new(env!("CARGO_MANIFEST_DIR")).join("src/onboard"); // 递归:P4c/P4d 计划的 onboard/probe/*.rs 同受约束 let mut pending = vec![root]; let mut files = Vec::new(); while let Some(dir) = pending.pop() { for entry in std::fs::read_dir(&dir).expect("读取 src/onboard") { let path = entry.expect("目录项").path(); if path.is_dir() { pending.push(path); } else if path.extension().and_then(|ext| ext.to_str()) == Some("rs") { files.push(path); } } } let mut checked = 0; for path in files { let source = std::fs::read_to_string(&path).expect("读取源码"); for pattern in &forbidden { assert!( !source.contains(pattern.as_str()), "{} 含投影层依赖 {pattern}:onboard 本体须由调用方注入连接与执行器", path.display() ); } checked += 1; } assert!( checked >= 2, "至少应检查 mod.rs 与 clients.rs,实际 {checked}" ); } }