All checks were successful
Push & PR Check / check (push) Successful in 1m2s
一键接入改写子项目受版本管理的文件,人在确认前必须看得到改什么;计划与 apply 走同一段 分发代码、只换写入汇,所以「看到的」就是「将写的」。 - lib.rs:WriteSink trait(read/write,内容忽略行尾未变不写)与 DiskSink - 接入包模板分发、蓝图规则同步、项目身份与 MCP 投影(context、settings 兼容条目、 liangjing、Codex 托管块)全部改经写入汇;原入口改为 DiskSink 薄包装,行为不变 - onboard/plan.rs:PlanSink 只记录不落盘、后续步骤读到前面步骤的待写内容; write_project_files 为 plan 与 apply 共用的写入序列;plan_onboarding 给出逐文件 create/update/noop、有上限的 diff、混合文件预警(P10 前移到写入前)、身份冲突、 手写条目与共享项目键阻断项,并对计划算 digest - mcp_inject:plan_onboarding 生产入口与本机侧预计动作(token、稳定入口、三端只读 状态、Codex 信任),只读、不起子进程 - 新增测试:空仓库全 create 且目录快照字节不变、apply 后两次计划全 noop 且 digest 相同、CRLF 判 noop、内容/本机状态变化 digest 变化、混合文件与身份冲突阻断、 手写 Codex 条目与共享键阻断、记录汇覆盖与撤销、diff 截断、Codex 信任解析; cargo test 307 passed Feature-Confirmed: true Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
53 lines
2.2 KiB
Rust
53 lines
2.2 KiB
Rust
//! 一键接入(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}"
|
||
);
|
||
}
|
||
}
|