docs(blueprint/agent-client-parity): H2/H4 零凭据实测成立,三端可共用 shim
All checks were successful
Push & PR Check / check (push) Successful in 1m33s
All checks were successful
Push & PR Check / check (push) Successful in 1m33s
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
parent
bbdc98b93f
commit
8babc545c3
@ -35,7 +35,7 @@ progress: 0
|
||||
- **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` 展开(源码推断,未实测)。
|
||||
- **H4 Codex**:`http_headers_helper` 中 `%LOCALAPPDATA%` 能被 `cmd /C` 展开。
|
||||
|
||||
任一假设不成立:回到设计,不退回写静态 token 或本机绝对路径。
|
||||
|
||||
@ -43,15 +43,18 @@ progress: 0
|
||||
|
||||
- **H1 ✅ 成立(复核未推翻)**:DSH `--patch` 叠加层即可,不改 `~/.dsh`。`!!js` 在主进程加载时求值,`require` 不可用但 `process.getBuiltinModule('fs'|'path'|'crypto'|'child_process')` 可用;`process.cwd()` = 启动目录,向上查找 `.lian-jing/context.json` 算项目路由(子目录启动亦可);`execFileSync` 直接执行 helper(不经 shell)生成 Authorization;`disabled: !!js` 在项目外不挂载且不求值 config。helper 失败时安全降级(只写一行 stderr、读取 403、会话不崩)。**限制**:桌面 GUI 模式下 cwd 不随工作区切换,本方案目前只证实适用于在项目目录启动的 headless/CLI。
|
||||
- **H3 ✅ 成立(复核未推翻)**:Claude 发现 `<项目>/.claude/skills/<name>/SKILL.md`(向上查找到 git 根为止,git 根以上不加载);**不读 `.agents/skills`**,所以必须投影一份到 `.claude/skills`。`-p` 模式下目录 trust 不影响 skill 加载。
|
||||
- **H4 ⚠️ 未证实(复核判定证据不足)**:只在 cmd 层模拟证实 `%VAR%` 会展开,但模拟用了 `windowsVerbatimArguments:true`,恰好预设了"Codex 原样传参"这一待证前提;Codex 端到端未跑成。
|
||||
- **H2 ❌ 无结果**:实验 agent 连续 6 次卡死。H3 实验发现在 Claude 会话里嵌套 `claude -p` 须先去掉父会话注入的 `CLAUDECODE`、`CLAUDE_CODE_*` 环境变量,疑为卡死原因。
|
||||
- **H4 ✅ 成立(第二轮零凭据实测)**:首轮仅 cmd 层模拟、被复核判证据不足;第二轮用哑 helper + 本地请求记录器直接观测 Codex 0.155 自身行为:`"%LOCALAPPDATA%\...\hdr.cmd"` 被执行且输出成为请求头(记录器收到 `codex-mcp-client` 携带的标记头);`%NOT_A_REAL_VAR%` 不执行;父进程导出的自定义变量 `%LJPROBE_BASE%` 不执行(证实 env_clear 白名单);把 `LOCALAPPDATA` 指向替身目录后执行的是替身目录里的脚本(因果对照);cmd 独有的 `%LOCALAPPDATA:~0%` 子串语法也生效(展开由 cmd.exe 完成);helper 非零退出时连接不建立。
|
||||
- **H2 ✅ 成立(第二轮零凭据实测)**:Claude Code 2.1.173 在 Windows 经 **cmd.exe** 执行 headersHelper——带引号反斜杠路径、正斜杠路径、`%TEMP%`、显式 `bash x.sh` 均执行且输出成为请求头;`$TEMP/...` 不执行,`%USERNAME%` 展开而 `$USERNAME` 保持字面。**local scope 覆盖 user scope**:init 事件中 `lian-jing` 工具数 35(全局)→ 加 local 条目后 32(项目路由)→ 删除后回到 35。经 `--mcp-config` 传入的 helper 在未信任目录也执行(文档所述 trust 限制针对项目 `.mcp.json` 来源)。`-p` 需设 `MCP_CONNECTION_NONBLOCKING=false` 才会等 MCP 连上再发 init。
|
||||
- 第二轮两项的对抗复核 agent 未能运行(见下条),结论由主会话直接核对原始日志(记录器日志由独立进程写入)得出,未经第二个 agent 复现。
|
||||
- **结论:Codex 与 Claude 都经 cmd.exe 执行 helper,可共用同一个 `%LOCALAPPDATA%\lian-jing\bin\` shim 写法**;DSH 经 `!!js` + `execFileSync` 直接调用同一 shim(在 JS 里用 `process.env.LOCALAPPDATA` 拼路径)。
|
||||
|
||||
### 实验附带发现
|
||||
|
||||
- **服务端缺陷**:`/mcp/projects/<任意字符串>` 都返回完整 32 个项目工具,不校验项目是否存在;应对未知 project_id 明确拒绝。
|
||||
- **零凭据验证法**(后续实验与 P4 探针采用):认证链路用 `read_project_test_account(name="LJ_PROBE_NONEXISTENT")` 判定——认证通过返回"开发需求未登记",失败返回 403,凭据不进任何会话;客户端 helper 机制用"哑 helper(写运行标记 + 输出假请求头)+ 本地 HTTP 记录器"判定,全程不碰真 token。
|
||||
- 模型自报的工具数量不可靠(同一路由报出 27~38 个),计数以 `curl tools/list` 真值为准(项目路由 32、全局 35)。
|
||||
- 在 Claude 会话中嵌套无头 Claude、在 Git Bash 中传 `/斜杠命令` 需设 `MSYS_NO_PATHCONV=1`,否则提示词被改写成 Windows 路径导致误判。
|
||||
- 在 Claude 会话中嵌套无头 Claude 须先去掉父会话注入的 `CLAUDECODE`、`CLAUDE_CODE_*` 环境变量并 `< /dev/null`;在 Git Bash 中传 `/斜杠命令` 需设 `MSYS_NO_PATHCONV=1`,否则提示词被改写成 Windows 路径导致误判。
|
||||
- **实验编排教训**:Workflow 子 agent 超过 180 秒无进展即判卡死并从头重试,而单次真实客户端无头会话常需 1~3 分钟,导致 H2/H4 共 4 次整轮重跑、无一产出结论(实验本身已完成并落盘日志)。需要启动真实客户端会话的实验应由主会话直接执行,或把长调用拆到后台任务、agent 只读结果。
|
||||
|
||||
## 任务拆解
|
||||
|
||||
@ -63,8 +66,8 @@ progress: 0
|
||||
- acceptance: "agent_verify: [三端无头探针] 在 enterprise 目录 Claude 与 DSH 的 C 项均看到开发变量工具(项目工具集),E 项成功;项目目录外的会话不获得他项目工具。"
|
||||
- 注:吸收原 project-dev-variables V17(Claude 以 local scope + headersHelper 取值)。
|
||||
|
||||
### 📋 P2 — Claude skill 投影
|
||||
- status: todo
|
||||
### 🔵 P2 — Claude skill 投影
|
||||
- status: in_progress
|
||||
- complexity: S
|
||||
- files: src-tauri/src/commands/onboarding.rs, src-tauri/resources/onboarding/
|
||||
- depends: H3
|
||||
|
||||
Loading…
Reference in New Issue
Block a user