feat(onboard/parity): 客户端适配器注册表与三端结构化注入结果,onboard 模块投影无关适应度测试(P8b、A1a) #33

Merged
lanrtop merged 2 commits from feat/agent-client-parity-p8 into master 2026-10-03 07:56:11 +08:00
Owner

做了什么(agent-client-parity P8b + architecture-evolution A1a)

一键接入(P8)编排的前置卡:Claude local 与 DSH 托管块的成败原来只写日志,inject_mcp 笼统回「已配置 Codex 与 Claude」,失败会被报成成功(设计风险 R4)。

  • 新增 src-tauri/src/onboard/:ClientId、ClientOutcome、ClientReport、ClientAdapter(detect / static_status / apply)与 registry();适应度测试 onboard_module_is_projection_free 机器校验本体不依赖 Tauri、不直接取连接池(A1a)。
  • 三端适配器实现在 mcp_inject(需要其私有辅助函数),注册表反向接入;注入经 registry() 逐端 apply,新增 inject_project_mcp_report;inject_project_mcp 签名与「Codex 托管块失败即整体失败」语义不变。
  • sync_claude_local、ensure_dsh_patch 抽出依赖注入版,每条分支返回结构化结果,日志类别与文案不变;upsert_codex_mcp_config 返回 converged / applied / manual_kept。
  • verify_onboarding(MCP)附加 clients 只读三端状态,不计入 checks、不影响 pass;inject_mcp 回执逐端列出实际结果。
  • 契约同步 docs/ai-context/project-context.yaml,AGENTS.md 架构速查补 src-tauri/src/onboard/。

设计文档:docs/tasks/2026-10-03-p8-onboarding-oneclick-design.md。用户以 /goal 授权按推荐方向代为推进,本卡按设计推荐项实现。

行为变化(有意为之,设计 R5)

  1. 项目 .codex/config.toml 已手写 [mcp_servers.lian-jing] 时,由整体报错改为 Codex 记 manual_kept,Claude 与 DSH 照常接入。
  2. Codex 托管块写入失败时 Claude 与 DSH 仍会完成(旧代码先写 Codex、失败即中止),inject_project_mcp 仍返回 Err。
  3. WSL 路径项目不再对 Claude local 起 CLI,记 skipped{wsl}(2026-07-04 放弃 WSL 路径项目裁决;DSH 白名单本就排除 WSL)。
  4. Codex 托管块的写入顺序移到 Claude 兼容投影之后。

自验

  • cargo test:295 passed / 0 failed / 5 ignored(新增 9 条)。
    • onboard::clients 4 条:注册表恰好三端且顺序固定、settled 判定、扁平序列化、WSL 根识别;onboard 适应度测试 1 条。
    • claude_sync_maps_every_branch_to_an_outcome:假 CLI 覆盖 converged×2 / unavailable×3 / applied / failed×3(含回滚调用序列 get→remove→add-json→add-json)/ refreshed / removed / other_project / manual_kept / needs_human。
    • static_outcomes_are_read_only_judgments、dsh_patch_reports_not_installed_applied_converged_and_manual_kept(临时 DSH 目录,手写条目不被覆盖)、adapters_skip_control_plane_and_wsl_without_touching_disk。
    • 原 Codex 手写冲突测试改断言 manual_kept(行为变化 1,改断言已在此报备)。
  • 独立审查 agent 只读审查本 diff(结果见下方评论或后续提交)。

没验什么

  • 卡片 acceptance 的 [MCP] 一项——对 enterprise 连续两次 inject_mcp,第二次三端都是 converged、耗时 <1 秒、四个项目文件 mtime 不变——须在合并后、运行中的炼境(tauri dev)重编译生效时实测,所以 P8b 卡暂为 🔵,实测通过后再标 ✅。
  • 未在真实 Claude CLI 上跑新代码的写入分支(假 CLI 覆盖逻辑;真实 CLI 路径与旧代码同一个 run_claude_cli)。
  • 前端未改(verify 的 clients 只出现在 MCP 投影;src/lib/commands.ts 无对应 command),pnpm typecheck 未跑。
  • 静态判定只看配置文本,不代表客户端实际已加载(例如 Codex 需目录受信任)——那是 P4a L1 自省的职责。

🤖 Generated with Claude Code

## 做了什么(agent-client-parity P8b + architecture-evolution A1a) 一键接入(P8)编排的前置卡:Claude local 与 DSH 托管块的成败原来只写日志,`inject_mcp` 笼统回「已配置 Codex 与 Claude」,失败会被报成成功(设计风险 R4)。 - 新增 `src-tauri/src/onboard/`:`ClientId`、`ClientOutcome`、`ClientReport`、`ClientAdapter`(detect / static_status / apply)与 `registry()`;适应度测试 `onboard_module_is_projection_free` 机器校验本体不依赖 Tauri、不直接取连接池(A1a)。 - 三端适配器实现在 `mcp_inject`(需要其私有辅助函数),注册表反向接入;注入经 `registry()` 逐端 apply,新增 `inject_project_mcp_report`;`inject_project_mcp` 签名与「Codex 托管块失败即整体失败」语义不变。 - `sync_claude_local`、`ensure_dsh_patch` 抽出依赖注入版,每条分支返回结构化结果,日志类别与文案不变;`upsert_codex_mcp_config` 返回 converged / applied / manual_kept。 - `verify_onboarding`(MCP)附加 `clients` 只读三端状态,不计入 checks、不影响 pass;`inject_mcp` 回执逐端列出实际结果。 - 契约同步 `docs/ai-context/project-context.yaml`,AGENTS.md 架构速查补 `src-tauri/src/onboard/`。 设计文档:`docs/tasks/2026-10-03-p8-onboarding-oneclick-design.md`。用户以 /goal 授权按推荐方向代为推进,本卡按设计推荐项实现。 ## 行为变化(有意为之,设计 R5) 1. 项目 `.codex/config.toml` 已手写 `[mcp_servers.lian-jing]` 时,由整体报错改为 Codex 记 manual_kept,Claude 与 DSH 照常接入。 2. Codex 托管块写入失败时 Claude 与 DSH 仍会完成(旧代码先写 Codex、失败即中止),`inject_project_mcp` 仍返回 Err。 3. WSL 路径项目不再对 Claude local 起 CLI,记 skipped{wsl}(2026-07-04 放弃 WSL 路径项目裁决;DSH 白名单本就排除 WSL)。 4. Codex 托管块的写入顺序移到 Claude 兼容投影之后。 ## 自验 - `cargo test`:295 passed / 0 failed / 5 ignored(新增 9 条)。 - onboard::clients 4 条:注册表恰好三端且顺序固定、settled 判定、扁平序列化、WSL 根识别;onboard 适应度测试 1 条。 - `claude_sync_maps_every_branch_to_an_outcome`:假 CLI 覆盖 converged×2 / unavailable×3 / applied / failed×3(含回滚调用序列 get→remove→add-json→add-json)/ refreshed / removed / other_project / manual_kept / needs_human。 - `static_outcomes_are_read_only_judgments`、`dsh_patch_reports_not_installed_applied_converged_and_manual_kept`(临时 DSH 目录,手写条目不被覆盖)、`adapters_skip_control_plane_and_wsl_without_touching_disk`。 - 原 Codex 手写冲突测试改断言 manual_kept(行为变化 1,改断言已在此报备)。 - 独立审查 agent 只读审查本 diff(结果见下方评论或后续提交)。 ## 没验什么 - 卡片 acceptance 的 [MCP] 一项——对 enterprise 连续两次 `inject_mcp`,第二次三端都是 converged、耗时 <1 秒、四个项目文件 mtime 不变——须在合并后、运行中的炼境(tauri dev)重编译生效时实测,所以 P8b 卡暂为 🔵,实测通过后再标 ✅。 - 未在真实 Claude CLI 上跑新代码的写入分支(假 CLI 覆盖逻辑;真实 CLI 路径与旧代码同一个 `run_claude_cli`)。 - 前端未改(verify 的 clients 只出现在 MCP 投影;`src/lib/commands.ts` 无对应 command),`pnpm typecheck` 未跑。 - 静态判定只看配置文本,不代表客户端实际已加载(例如 Codex 需目录受信任)——那是 P4a L1 自省的职责。 🤖 Generated with [Claude Code](https://claude.com/claude-code)
lanrtop added 1 commit 2026-10-03 07:26:09 +08:00
feat(onboard/parity): 客户端适配器注册表与三端结构化注入结果,onboard 模块投影无关适应度测试(P8b、A1a)
All checks were successful
Push & PR Check / check (push) Successful in 1m2s
Push & PR Check / check (pull_request) Successful in 59s
d1b9b0564e
一键接入(P8)编排前置:Claude local 与 DSH 托管块的成败原来只写日志,inject_mcp
笼统回「已配置 Codex 与 Claude」,失败会被报成成功(R4)。

- 新增 src-tauri/src/onboard/:ClientId、ClientOutcome(converged/applied/refreshed/
  removed/manual_kept/other_project/not_installed/skipped/missing/unavailable/
  needs_human/failed)、ClientAdapter(detect/static_status/apply)与 registry();
  适应度测试 onboard_module_is_projection_free 机器校验本体不依赖投影层
- 三端适配器实现在 mcp_inject,注册表反向接入;注入经 registry() 逐端 apply,
  新增 inject_project_mcp_report,inject_project_mcp 签名与「Codex 失败即整体失败」
  语义不变
- sync_claude_local / ensure_dsh_patch 抽出依赖注入版,每条分支返回结构化结果,
  日志类别与文案不变;upsert_codex_mcp_config 返回 converged/applied/manual_kept
- verify_onboarding(MCP)附加 clients 只读三端状态,不计入 checks、不影响 pass;
  inject_mcp 回执逐端列出实际结果
- 行为变化(有意):Codex 手写同名 server 改记 manual_kept 不再阻断 Claude/DSH;
  WSL 项目 Claude local 记 skipped 不再起 CLI
- 新增 9 条测试(假 CLI 覆盖 Claude 全部分支、临时 DSH 目录四态);cargo test
  295 passed;契约同步 project-context.yaml,AGENTS.md 架构速查补 onboard/

Feature-Confirmed: true
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
lanrtop added 1 commit 2026-10-03 07:52:40 +08:00
fix(onboard/parity): P8b 审查修复——未装记 not_installed、手写保留留痕、成功日志后移、只读判定误判(P8b 审查)
All checks were successful
Push & PR Check / check (push) Successful in 1m0s
Push & PR Check / check (pull_request) Successful in 1m3s
59f2c9d5fb
独立审查 agent 只读审查 d1b9b05(未发现死锁、重入或崩溃),十条发现处置:

- Claude apply:无全局配置且找不到 CLI 记 not_installed,与 DSH、static 同口径
- 手写条目保留(manual_kept)时补日志:DSH 照原文案,Codex 带 project_id
- 「MCP 配置注入成功」移到三端收敛之后,Codex 失败时改记 warn「注入失败」,
  诊断不再把失败显示成成功
- 控制面 Claude 静态判定:遮蔽全局注册的残留 local 条目报 missing
- 嵌套项目:根目录是 git 根时只认等于根目录的键,否则取最具体的键
- 适应度测试改为递归;registry() 注明适配器暂寄 mcp_inject 的传递依赖
- 状态名对齐设计:skipped 改为 not_applicable{control_plane|wsl} 与 deferred
- 只读判定:读失败与 YAML 解析失败报 unavailable,Codex 块与手写同名表并存、
  标记错序报 needs_human,DSH 块外手写报 manual_kept;client_static_status 改用
  与注入同源的 project_root
- 修正「目录不存在」假阳性用例,补 hard_failure、inject 回执、apply 映射、
  clients 不影响 pass 的测试;cargo test 300 passed,两处变异验证失败如期

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
lanrtop merged commit ddd729c2c7 into master 2026-10-03 07:56:11 +08:00
Sign in to join this conversation.
No reviewers
No Label
No Milestone
No project
No Assignees
1 Participants
Notifications
Due Date
The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'.

No due date set.

Dependencies

No dependencies set.

Reference: lanrtop/dev-manager-tauri#33
No description provided.