All checks were successful
Push & PR Check / check (push) Successful in 1m26s
- 三端(Claude Code / Codex / DSH 桌面版)同一只读任务的 A–F 矩阵作为基线证据 - 立 P1–P5:统一项目专用地址、Claude skill 投影、稳定 helper 入口、 探针固化、落地兜底;原 V17/V18 迁入 P1/P3 - manifest 项目描述同步为「管家」定位 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
78 lines
5.0 KiB
Markdown
78 lines
5.0 KiB
Markdown
---
|
||
id: agent-client-parity
|
||
name: 三端客户端对等
|
||
status: in_progress
|
||
progress: 0
|
||
---
|
||
|
||
## 概述
|
||
|
||
子项目在 Claude Code、Codex、DSH(DeepSeek Harness 桌面版)三端都能继续开发:项目状态只存在于 Git 与炼境,客户端是可替换的投影。炼境适配的是**客户端层**(规则文件、skill 位置、MCP 连接、认证、无头模式),不是模型层——在某客户端内切换 DeepSeek 等模型属 `codex-model-switch`,与本模块正交。
|
||
|
||
## 设计原则
|
||
|
||
- **五个接入面**逐一对齐:① 项目规则(AGENTS.md)② 工作流 skill ③ MCP 连接炼境 ④ 敏感取值 ⑤ 交付信号(Git + lefthook + Gitea,已与客户端无关)。
|
||
- **先路由、后认证**:客户端必须连项目专用地址 `/mcp/projects/<project_id>`;全局 `/mcp` 只作兼容,且暴露跨项目管理工具,不应作为子项目日常入口(最小权限)。
|
||
- **无头模式 = 各客户端的 agent 按钮**:`claude -p`、`codex exec`、`dsh headless`。对等性用同一任务、同一断言在三端无头实测,不靠文档推断。
|
||
- 不写静态 token 进任何配置文件;认证靠各客户端的动态机制或不需认证的落地路径。
|
||
|
||
## 基线证据(2026-09-30,enterprise-system,三端无头同一只读任务)
|
||
|
||
| 检查项 | Codex 0.155 | Claude Code 2.1.173 | DSH 桌面版 0.2.0-rc.2 |
|
||
| --- | --- | --- | --- |
|
||
| A 加载项目规则 | ✅ 摘录 AGENTS.md | ✅ CLAUDE.md 经 `@AGENTS.md` 引用 | ✅ 原生读取 AGENTS.md |
|
||
| B lian-jing skill | ✅ | ❌ 看不到(未投影到 `.claude/skills/`) | ✅ 读取 `.agents/skills`,与 Codex 共用 |
|
||
| C MCP 工具 | ✅ 32 个,含敏感读取 | ⚠️ 35 个全局工具,无开发变量工具 | ⚠️ 35 个全局工具,无开发变量工具 |
|
||
| D get_diagnostics | ✅ | ✅ | ✅ |
|
||
| E 列出开发变量 | ✅ | ❌ 工具不存在 | ❌ 工具不存在 |
|
||
| F 敏感读取 | ✅ | ❌ 工具不存在 | ❌ 工具不存在 |
|
||
| 耗时 | 56 s | 138 s | 25 s |
|
||
|
||
三端均未泄露凭据。连接现状:Codex 用项目 `.codex/config.toml`(项目地址 + helper);Claude 仅在 `~/.claude.json` user scope 注册全局 `/mcp`(SSE);DSH 在机器级 `~/.dsh/cordis.patch.yml` 注册全局 `/mcp`,配置无法按项目拆分,但支持 `!!js` 求值与每次调用的 `--patch` 叠加层。
|
||
|
||
## 实施前待验证假设(闸门)
|
||
|
||
- **H1 DSH**:`!!js` 能否在加载时读取当前目录的 `.lian-jing/context.json` 算出项目地址,并执行 helper 生成认证头。
|
||
- **H2 Claude**:Windows 上 `headersHelper` 的执行方式与调用写法;local scope 条目覆盖 user scope 全局注册。
|
||
- **H3 Claude skill**:项目 `.claude/skills/<name>/SKILL.md` 能被无头会话发现。
|
||
- **H4 Codex**:`http_headers_helper` 中 `%LOCALAPPDATA%` 能被 `cmd /C` 展开(源码推断,未实测)。
|
||
|
||
任一假设不成立:回到设计,不退回写静态 token 或本机绝对路径。
|
||
|
||
## 任务拆解
|
||
|
||
### 📋 P1 — 统一连接项目专用地址(Claude + DSH)
|
||
- status: todo
|
||
- complexity: M
|
||
- files: src-tauri/src/mcp_inject.rs, docs/ai-context/agent-button-system.md
|
||
- depends: H1, H2
|
||
- acceptance: "agent_verify: [三端无头探针] 在 enterprise 目录 Claude 与 DSH 的 C 项均看到开发变量工具(项目工具集),E 项成功;项目目录外的会话不获得他项目工具。"
|
||
- 注:吸收原 project-dev-variables V17(Claude 以 local scope + headersHelper 取值)。
|
||
|
||
### 📋 P2 — Claude skill 投影
|
||
- status: todo
|
||
- complexity: S
|
||
- files: src-tauri/src/commands/onboarding.rs, src-tauri/resources/onboarding/
|
||
- depends: H3
|
||
- acceptance: "agent_verify: [cargo test onboarding] 接入包同时写 .claude/skills/lian-jing/SKILL.md,内容与 .agents/skills 单一来源一致;[Claude 无头探针] B 项看到 lian-jing。"
|
||
|
||
### 📋 P3 — 稳定 helper 入口,项目配置去本机路径
|
||
- status: todo
|
||
- complexity: M
|
||
- files: src-tauri/src/mcp_inject.rs, src-tauri/src/lib.rs, src-tauri/src/commands/onboarding.rs
|
||
- depends: H4
|
||
- acceptance: "agent_verify: [cargo test] 炼境启动写/更新 %LOCALAPPDATA% 下 shim 指向当前 exe;inject 后受跟踪文件不含本机绝对路径或用户名;[Codex 无头探针] F 项经 shim 成功;换构建目录启动后无需重注入仍成功。"
|
||
- 注:即原 project-dev-variables V18;Claude headersHelper 与 DSH 共用同一 shim。
|
||
|
||
### 📋 P4 — 三端对等探针固化为炼境能力
|
||
- status: todo
|
||
- complexity: M
|
||
- files: scripts/ 或 src-tauri/src/commands/(实现时定), docs/ai-context/agent-button-system.md
|
||
- depends: P1, P2, P3
|
||
- acceptance: "agent_verify: [CLI] 一条命令对指定项目依次跑三端无头探针,输出 A–F × 三端矩阵与耗时,断言无凭据泄露;接入包升级后重跑结果可比对。"
|
||
|
||
### 📋 P5 — 测试账户落地到被 Git 忽略文件
|
||
- status: todo
|
||
- complexity: M×3
|
||
- 见 project-dev-variables V14–V16 与 `docs/tasks/2026-09-30-dev-variables-materialize.md`;落地不返回值、无需认证,是三端都可用的兜底路径。
|