dev-manager-tauri/src-tauri/src/onboard/mod.rs
lanrtop ef2c7fd593
All checks were successful
Push & PR Check / check (push) Successful in 1m2s
feat(onboard/parity): 写入汇 WriteSink 与写入前计划 plan_onboarding(P8c,待独立审查)
一键接入改写子项目受版本管理的文件,人在确认前必须看得到改什么;计划与 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>
2026-10-03 09:35:24 +09:00

53 lines
2.2 KiB
Rust
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//! 一键接入(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}"
);
}
}