diff --git a/.blueprint/manifest.yaml b/.blueprint/manifest.yaml index c60da2e..fb7db31 100644 --- a/.blueprint/manifest.yaml +++ b/.blueprint/manifest.yaml @@ -511,9 +511,9 @@ modules: name: 三端客户端对等 area: infra status: in_progress - progress: 57 + progress: 61 updated: 2026-10-03 - note: "P1/P2/P3/P3b/P7/P9/P10 完成:三端(Claude Code、Codex 含 Desktop、DSH 含桌面 GUI)在 Enterprise 经 %USERPROFILE%\\.lian-jing 稳定入口连项目专用地址,人终验通过。Claude 条目经 claude CLI 写入、以 claude mcp get 为准;DSH 由托管块全局行(headless)+ 会话级插件(GUI/web/acp 按会话工作目录)路由;接入写入幂等;接入包改写块外带未提交改动的托管块文件时给出混合文件预警;P7 实测 MCP 服务器说明仅 Claude/DSH 带入模型上下文、Codex 不带,引导提示保留在 skill。2026-10-03 P8 一键接入设计定稿(docs/tasks/2026-10-03-p8-onboarding-oneclick-design.md):A1 不前置;P4 分 L0 静态 / L1 零模型 / L3 无头会话,P8 只依赖 L1(P4a);拆为 P8-0、P8a–P8g 与 P4-0、P4a–P4e(P8-0、P8a、P4-0 已完成,P8b 适配器注册表与三端结构化注入结果(PR #33,enterprise 实测两次注入三端 converged、零写入)、P8c 写入汇与写入前计划(PR #36)、P4a L1 零模型三端检查(PR #38,enterprise 三端 18 格 ready)已完成,P8f 已合并待链路实测;P8a 把「已接入」统一为有项目 token;P4-0 实测六项假设,Codex 只在目录受信任时加载项目配置、Claude 用无效模型名可零额度取 init 并入 L1),P8 进行中;进度按拆分后卡数重算。待做 P5、P6(基于 P8c 的 WriteSink)。" + note: "P1/P2/P3/P3b/P7/P9/P10 完成:三端(Claude Code、Codex 含 Desktop、DSH 含桌面 GUI)在 Enterprise 经 %USERPROFILE%\\.lian-jing 稳定入口连项目专用地址,人终验通过。Claude 条目经 claude CLI 写入、以 claude mcp get 为准;DSH 由托管块全局行(headless)+ 会话级插件(GUI/web/acp 按会话工作目录)路由;接入写入幂等;接入包改写块外带未提交改动的托管块文件时给出混合文件预警;P7 实测 MCP 服务器说明仅 Claude/DSH 带入模型上下文、Codex 不带,引导提示保留在 skill。2026-10-03 P8 一键接入设计定稿(docs/tasks/2026-10-03-p8-onboarding-oneclick-design.md):A1 不前置;P4 分 L0 静态 / L1 零模型 / L3 无头会话,P8 只依赖 L1(P4a);拆为 P8-0、P8a–P8g 与 P4-0、P4a–P4e(P8-0、P8a、P4-0 已完成,P8b 适配器注册表与三端结构化注入结果(PR #33,enterprise 实测两次注入三端 converged、零写入)、P8c 写入汇与写入前计划(PR #36)、P4a L1 零模型三端检查(PR #38,enterprise 三端 18 格 ready)、P8d 编排本体(PR #39)已完成,P8f 已合并待链路实测;P8a 把「已接入」统一为有项目 token;P4-0 实测六项假设,Codex 只在目录受信任时加载项目配置、Claude 用无效模型名可零额度取 init 并入 L1),P8 进行中;进度按拆分后卡数重算。待做 P5、P6(基于 P8c 的 WriteSink)。" position: [3500, 950] - id: architecture-evolution diff --git a/.blueprint/modules/agent-client-parity.md b/.blueprint/modules/agent-client-parity.md index f396f90..7fc86f4 100644 --- a/.blueprint/modules/agent-client-parity.md +++ b/.blueprint/modules/agent-client-parity.md @@ -275,8 +275,8 @@ skill 只是五个接入面之一,兼容层覆盖全部五面。 - 待办:开 PR(M 级);合并后标 ✅。 - merge_verify: "2026-10-03 统筹会话:PR #36(head 7ef9241,CI passed,独立审查 9 条发现 7 修 2 转 P8d)与 PR #35 先后合并为 04db098;合并结果全量 cargo test 325 passed / 0 failed / 5 ignored。P8c 无 MCP/Tauri 投影(P8e 才加),acceptance 全为 cargo 层,据此标 ✅。" -### 🔵 P8d — onboard_project 编排本体 -- status: in_progress +### ✅ P8d — onboard_project 编排本体 +- status: done - complexity: M - files: src-tauri/src/onboard/apply.rs, src-tauri/src/onboard/report.rs, src-tauri/src/commands/onboarding.rs(实际另含 src-tauri/src/onboard/apply/tests.rs、onboard/plan.rs、onboard/clients.rs、onboard/probe_l1.rs、onboard/mod.rs、src-tauri/src/mcp_inject.rs、src-tauri/src/commands/groups.rs、src-tauri/src/commands/projects.rs(审查 ①:删除登记持接入写锁)、src/lib/commands.ts、docs/ai-context/project-context.yaml、AGENTS.md(T2 架构速查补 apply 与 report)) - depends: P8c, P4a @@ -294,6 +294,7 @@ skill 只是五个接入面之一,兼容层覆盖全部五面。 - 有意偏差:"① acceptance ④ 写 blocked(dep=claude_local),实现记 dep=claude:步骤名与计划 machine_changes 同名(⑨ 后定的 claude / codex / dsh),便于 P8g 对照「预计 → 实际」。② status 比任务列的四态多一个 busy(acceptance ⑧「返回 busy」)。③ repo_changes 的 porcelain 带 --untracked-files=all(逐个列出新文件,否则只列 .claude/ 这样的目录),测试同口径比对。④ 「完成」比卡片列举多要求「基础能力包描述符」ready(接入包托管的版本描述,与托管块版本同类);verify 以后新增的检查默认计入「完成」(保守,宁可 partial)。⑤ bypassPermissions 的「按项目取消」做成计划与应用共用的选项 OnboardOptions.bypass_permissions,取消即写显式 defaultMode=default(否则之后的重注入会补回);P8e 投影时加这个可选参数。⑥ 文件比卡片多,见 files。⑦ 审查 ② 按设计 §4 C1 实现「逐项跳过」:选项 OnboardOptions.skip_targets(进 digest),计划单列 skipped;P8e 投影给 plan_onboarding 与 onboard_project 都加这个可选参数,P8g 用它做逐项「跳过 / 中止」。⑧ git_hooks 在释放接入写锁后执行,报告 steps 中仍排第 3 位(顺序不变,便于 P8g 展示)。⑨ 删除登记持写锁(审查 ①)改在 commands/projects.rs 的 G8 本体 delete_project_registration(注入写锁与清理闭包),超出原 files,是关掉删除竞态的必要配套。" - review: "2026-10-03 独立只读审查 6c69aa2,结论 fix_then_merge,10 条发现处置:① [中] 锁外解析、digest 不绑根目录 → 已修:写锁内重新解析登记(登记消失 failed;根目录或 McpTarget(端口、地址、helper)与锁外不一致 refused 并附当前计划);OnboardingPlan 新增 root(将写入的目录)并进 digest;SystemOnboardHost 每次 target() 重读端口;delete_project 改为持 MCP_OP_LOCK 依次执行 remove_project_mcp_locked 与删登记的数据库部分(Gitea 网络清理在锁外),关掉「清理释放锁后、删登记前」的窗口;reinject_all_mcp 的目标快照改在写锁内取(正在进行的一键接入结束后才取,避免锁内用旧端口、快照时还没 token 的项目停在旧端口)。补 registration_changes_while_waiting_for_write_lock_are_caught_inside_the_lock(文件 DB 两条连接:apply 停在写锁前时删登记 / 迁根目录 / 改端口 → failed / refused / refused,两个目录零写入、无 token、无组)、digest_confirmed_for_one_root_is_refused_after_root_moves(同名目录迁到另一父目录、文件计划一致仍拒绝)、plan_shows_root_and_binds_it_into_digest;G8 用例 deleting_project_registration_removes_its_webhook_secret 加断言:清理闭包在写锁内、先于删登记执行,结束后释放锁。② [中] 阻断项无跳过入口 → 已修(按设计 §4 C1 实现,未登记为延后):OnboardOptions 新增 skip_targets,只有 manual_entry 与 shared_key 可跳过(BlockReason::skippable),移入计划新增的 skipped 并进 digest;apply 时被跳过的文件级问题不算 project_files 失败(detail 注明保留现状),对应一端记 skipped(manual_kept|other_project)、不调用适配器;identity_conflict、mixed_file、needs_human 列进来照旧阻断,refused 文案提示 skip_targets。OnboardOptions 因含 Vec 不再 Copy,plan_project / onboard_project 改收 &OnboardOptions。补 manual_codex_entry_can_be_skipped_but_identity_conflict_cannot(默认 refused;跳过后 codex skipped、适配器 0 次、手写文件字节不变、project_files applied;手写条目未指向本项目地址,「Codex MCP 已配置」如实未就绪 → partial;跳过与未跳过的 digest 互不通用;身份冲突列进 skip_targets 仍 refused)、identity_conflict_and_needs_human_cannot_be_skipped,并扩充 manual_codex_entry_and_machine_manual_states_block。P8g 接口形态:plan(skip_targets) 展示 blocked(可跳过的给「跳过」)与 skipped → apply 带同一 skip_targets 与 digest。③ [低] 提交建议混入用户改动 → 已修:报告新增 written_files;TrackingSink 另记写入序列管理的文件;repo_changes 用 pathspec「-- .」限定项目根,新增 onboard_files[{path(相对项目根), code}] 与 other_changes;建议提交信息只看 onboard_files,next_actions 新增 commit(项目根 git add -- ,有其他改动时提示勿 git add -A)。补 user_changes_are_kept_out_of_the_onboarding_commit(未跟踪 notes.md 与改了一半的 README.md 计入 other_changes=2、不进 commit 提示);子目录用例补外层仓库未提交文件不出现、onboard_files 相对项目根;report 单测补 porcelain -z 解析与「managed 但本次未写的已跟踪改动不算接入文件」。④ [低] 一键接入不写 mcp_inject 事件 → 已修:onboard::report::inject_event 纯函数(未写入不记;token、shim、三端步骤全部完成记 info,否则 warn 列出未完成步骤),mcp_inject::onboard_project 在 onboard 日志后补写 category=mcp_inject(context 带 project_id)。补 inject_event_follows_injection_steps_only;生产写日志一行未单测。⑤ [低] codex 步「预计 apply → 实际 converged」与 blocked 文案失实 → 已修:ClientAdapter 新增默认方法 project_config_file()(CodexAdapter 返回 .codex/config.toml);本次 project_files 写过该文件且适配器复核 converged 时记 applied(detail 注明由 project_files 写入、本步复核);token / shim 门控未过时 codex 的 blocked 说明如实写「文件已写入、helper 引用的稳定入口或 token 未就绪,修复后重跑生效」。测试的 Codex 替身改为读写真实 .codex/config.toml,① 断言计划 apply → 报告 applied 且 detail 提 project_files,shim 用例断言 codex 文案。⑥ [低] lefthook 启动错误被吞 → 已修:保留各候选启动错误;本地可执行文件存在却起不来记 failed 并附错误(不误报「未找到」、不回退 PATH);PATH 候选都起不来记 missing_binary 并附错误。lefthook_install 用例补两条断言。⑦ [低] lefthook 与建组 / buff 占写锁 → 部分修:git_hooks 移到释放写锁后执行,① 用例经执行器替身断言 install 时写锁空闲;product_group_buff 有意留在锁内(只写 DB、毫秒级,与删除登记串行,避免给已删项目建组或登记 buff)。⑧ [信息] report.rs 的 git 观测绕过 ProcessRunner → 未改代码:计划的混合文件检查、Codex 信任预判同样直接起 git,只改 report.rs 会成半迁移;登记 known_limits ①,apply.rs 模块文档如实改写边界。⑨ [信息] P8e 投影的 async 写法 → 采纳为 P8e 指引(P8e 卡说明已补);project-context.yaml 把 apply_onboarding_pack「在线程池执行」的不实表述改为「在异步运行时任务里执行、占一个 worker」,代码未改(审查认可与 buff.rs、groups.rs 一致)。⑩ [信息] 非 git、仓库子目录、worktree、Codex 未信任到不了 done → 未改,转统筹决定(codex_project_untrusted 是否视为 next_action 不计入 done;非 git / 子目录是否补 git_init / 由外层仓库接入的 next_action);known_limits ④⑤ 已登记。修复后全量 cargo test 402 passed / 0 failed / 6 ignored(较 394 新增 8 条),编译 0 warning;pnpm typecheck 通过。改断言报备:report 单测 head_check 中「只改 a.txt 即给收敛提交信息」改为「a.txt 不是接入文件 → 无接入提交信息、计入其他改动;列入本次写入才给收敛信息」——提交建议语义按审查 ③ 有意收窄;① 用例的建议提交信息断言由前缀 chore(lian-jing) 收紧为「一键接入」,lefthook 缺失断言加启动错误文本(均为加强);① 用例「九步全 applied」未改,codex 步在新语义下仍为 applied(原先靠替身不写文件成立,现由真实文件耦合成立)。变异验证(git add 暂存后用 Edit 注入、跑 cargo test onboard:: commands::projects、git checkout 从暂存区还原,未用 sed):第一轮 5 处——去掉锁内根目录 / 端口比对、git_hooks 移回锁内、digest 去掉 root、接入文件判定放宽、删登记的清理移到锁外——恰好 7 条预期用例失败、79 条通过;第二轮 5 处——codex 两处 project_files 耦合(blocked 文案、applied 映射)、被跳过的文件级问题算失败、本地 lefthook 起不来当缺失、partial 不补写注入事件——恰好 6 条失败、80 条通过;第三轮身份冲突与 needs_human 可跳过 → 2 条失败;第四轮被跳过的一端仍调用适配器 → 1 条失败。" - 待办:开 PR(M 级,分支 feat/agent-client-parity-p8d);P8e 合并、运行中的炼境重编译后由统筹做端到端实测,再标 ✅。 +- merge_verify: "2026-10-03 统筹会话:PR #39(2f2a9f1,CI passed;独立审查 10 条:6 修、1 部分修、2 登记/转指引、1 转统筹)合并为 d018d44,合并结果全量 cargo test 402 passed / 0 failed / 6 ignored。acceptance ①–⑨ 均为 cargo onboard::apply 层,据此标 ✅;端到端(新登记项目 plan → onboard_project)随 P8e 合并后由统筹实测。统筹决定(审查 ⑩):codex_project_untrusted 按设计 Q5 计为 next_action、不计入 done(只放宽这一种原因),非 git 目录维持不能 done(acceptance ⑥),子目录与 worktree 补 next_action 说明——由 P8e 实现。" ### 📋 P8e — 投影收口与契约同步 - status: todo diff --git a/docs/tasks/2026-10-03-coordination.md b/docs/tasks/2026-10-03-coordination.md index 9a542e7..bc33dc6 100644 --- a/docs/tasks/2026-10-03-coordination.md +++ b/docs/tasks/2026-10-03-coordination.md @@ -57,7 +57,7 @@ |---|---|---|---|---| | ~~1~~ | ~~P8c 收尾~~ ✅ | M | 分支 `feat/agent-client-parity-p8c` @ `ef2c7fd`(代码已完成,cargo test 307 passed) | 剩:独立审查与修复,卡片标 🔵 并记实现/验证,开 PR。PR #34 合并后先合并 master 再开 PR | | ~~2~~ | ~~P4a L1 零模型三端检查~~ ✅ | M | master(P4-0✅、P8b✅) | Claude 用不存在的模型名取 init(P4-0 H-P8-4,零额度);Codex 用 `codex mcp get --json`(H-P8-1,未信任目录看不到项目配置);DSH 解析白名单与插件哈希;认证链经稳定 shim 重放 | -| 3 | P8d onboard_project 编排本体 | M | P8c、P4a 合并后 | 复用 `onboard::plan::write_project_files` 与 `onboard::clients::registry()`;apply 前先重算计划并核对 digest | +| ~~3~~ | ~~P8d onboard_project 编排本体~~ ✅ | M | P8c、P4a 合并后 | 复用 `onboard::plan::write_project_files` 与 `onboard::clients::registry()`;apply 前先重算计划并核对 digest | | 4 | P8e 投影收口与契约同步 | S | P8d 后 | | | 5 | P8f register_project 控制面投影 | S | 已提前并行(只依赖 P8-0) | [MCP] 链路实测待 P8e 合并后做 | | 6 | P8g UI 一键接入 | M | P8e 后 | human_verify 交用户 | @@ -77,7 +77,8 @@ | 10-03 | P8c 收尾 | 工作流 wf_c121815d-6ea(实现→审查→修复→开 PR) | PR #36(7ef9241)→ 04db098 | ✅ 审查 9 条:7 修、2 转 P8d(已并入 P8d acceptance ⑨);合并后全量 cargo test 325 passed | | 10-03 | 删除登记时解绑 Gitea(G8) | 工作流 wf_c121815d-6ea | PR #35(fccb767) | ✅ 审查可合并、5 条已处置;真机删除实测为可选人工验证(涉及删除与写 DB) | | 10-03 | P4a L1 零模型三端检查 | 工作流 wf_b7092645-570(修复阶段被分类器拦截,统筹接手收尾) | PR #38(a79bcb7)→ cf2b5f0 | ✅ [MCP] 实测:enterprise 3.3 秒三端 18 格 ready;dev-manager-tauri 控制面 Claude/DSH not_applicable、Codex ready | -| 10-03 | P8d onboard_project 编排本体 | 工作流 wf_004ffc20-7cb | `feat/agent-client-parity-p8d` | 执行中 | +| 10-03 | P8d onboard_project 编排本体 | 工作流 wf_004ffc20-7cb | PR #39(2f2a9f1)→ d018d44 | ✅ 审查 10 条已处置;master 402 passed;⑩ 统筹决定:Codex 未信任计 next_action 不计入 done(P8e 实现) | +| 10-03 | P8e 投影收口与契约同步 | 工作流 wf_551dc525-270 | `feat/agent-client-parity-p8e` | 执行中 | | 10-03 | P8f register_project 控制面投影(含登记拒绝同路径,承接 PR #34 审查 L1/L2) | 工作流 wf_2462357e-604(与 P4a 并行,开 PR 前合并 master) | `feat/agent-client-parity-p8f` | PR #37(04470bd)→ 55dc637 已合并;审查 10 条:7 修、1 部分修、M2 恢复 UI 概念占位原行为(产品问题待用户澄清)、2 转后续;卡片 🔵,[MCP] 链路实测待 P8e 合并 | | 10-03 | 重复登记修复 U1/U2 | 会话 `local_d2e1c156…`(「排查炼境 dev-manager-tauri 疑似重复登记」) | PR #34 → fc280db | ✅ 独立审查可合并、已合并,炼境已重编译;审查遗留 L1/L2 归 P8f(登记拒绝同路径),L3/L4/I1/I2 列入后续小修 | | 10-03 | 重复登记数据合并 U3 | 同上(用户执行 DB 写入) | master 91017b6;主仓库 .codex/config.toml 升级为稳定 helper 格式 06f20db | ✅ 无 2c5b54ef 残留、同路径 1 条登记、Gitea 绑定 1 行;备份 dev-manager.backup-20261003-before-dedupe.db |