[{"content":"\n从「第二意见」到「上下文桥接」 之前写过 codex skill 和 codex-plan，核心都是在 Claude Code 里调用另一个模型获取外部视角。但用了一段时间后，我发现有个场景更常见：\n两个 Claude Code 会话各自积累了大量上下文，你想让它们协调。\n比如我最近同时推进两个项目：Session A 在做多仓库工作区管理工具（aw），Session B 在做 Claude Code 的 session 编辑功能。两个 session 各自聊了很久，各自有完整的项目理解和方案演进。\n某天我发现 —— aw 在检出新工作区时，其实可以顺便把相关的 Claude Code session 迁移过去，这样新工作区一创建就能 claude --resume 继续之前的对话。而这恰好是 B 那边 session-edit 在做的事。\n传统做法：翻 A 的聊天记录，提炼要点，粘贴到 B 的对话里。\n上下文搬运是最累的活。 而且你搬的是降级版本 —— 你能复制的只是文字片段，不是那个会话完整的理解。\n解决方案：当前会话充当桥接器 /claude skill 的机制是：当前会话通过 claude -p --resume \u0026lt;session_id\u0026gt; 接入另一个已有会话，把问题发过去，再把结果带回来。你复用的是对方已经积累好的上下文，不需要重新搬运。\n❯ /claude 问 e2ec1031-204f-4ce3-b1df-572e2e9a91d5 ~/Desktop/ai-space/claude-session-editor 把 session 迁移到新工作区需要改哪些路径？ → 不需要改任何路径。把 .jsonl 文件复制到 ~/.claude/projects/{新目录编码名}/ 下即可， 文件名保持不变。Claude Code 在新目录 --resume 时会自动用当前 cwd 作为工作目录， session 里的旧路径不影响恢复。 ❯ /claude 问 afd31f27-3f71-4ca0-b220-3f0b15ade5b1 ~/Desktop/ai-space/claude-code-skills 检出新工作区时顺便迁移 session 过去，技术方案是什么？ → Claude Code 的会话数据存在 ~/.claude/projects/\u0026lt;项目路径编码\u0026gt;/ 下（路径中 / 替换为 -）， 核心是 .jsonl 对话记录文件。迁移方案：新 worktree 创建后，将旧路径对应的目录 symlink 或 copy 到新路径对应的目录名下即可。最轻量的做法是直接 ln -s 软链接， 这样两个 worktree 共享同一份会话状态。 你只搬运结论，而不是搬运原始上下文。每个 session 保持完整的项目理解，当前会话只是在它们之间架桥。\n/claude 的两种模式 恢复模式：接入一个已有 session，复用它积累的项目上下文。这是本文重点。 新建模式：起一个干净的 Claude 实例，拿到不受当前讨论影响的独立分析。 两种模式用法一样，区别只在于是否指定了 session ID。\n一条命令安装 方式一：复制给你的 AI 请阅读 https://github.com/lldxflwb/claude-code-skills 帮我安装里面的 claude skill 方式二：手动安装 git clone https://github.com/lldxflwb/claude-code-skills.git /tmp/claude-code-skills cp -r /tmp/claude-code-skills/skills/claude ~/.claude/skills/claude rm -rf /tmp/claude-code-skills 对已在使用 Claude Code 的用户，无需再装第二个 CLI。\n使用场景 跨项目协调（恢复模式） 两个项目各自推进了一段时间，突然发现有交集：\n❯ /claude 问 e2ec1031 把 session 迁移到新工作区需要改哪些路径？ ⏺ 查找 session e2ec1031... → 项目目录: ~/Desktop/ai-space/claude-session-editor → 不需要改任何路径。把 .jsonl 文件复制到新目录编码名下即可... ❯ /claude 问 afd31f27 检出新工作区时顺便迁移 session，技术方案是什么？ ⏺ 查找 session afd31f27... → 项目目录: ~/Desktop/ai-space/claude-code-skills → 新 worktree 创建后，将旧路径目录 symlink 到新路径目录名下... 不需要复制粘贴任何上下文。A 和 B 各自知道自己项目的全部细节。\n干净上下文的独立分析（新建模式） 有时不需要接入已有 session，而是需要一个没有思维惯性的新视角：\n❯ /claude 从零分析这个模块的设计问题 @src/auth/ → [新实例没有之前讨论的包袱，直接指出结构性问题] 指定模型 默认在 Claude 模型家族内，可选 sonnet/opus：\n/claude 用 sonnet 快速扫一下有没有明显问题 @src/parser.py /claude 用 opus 从安全角度分析这段逻辑 @src/auth.ts 多轮对话 和 codex skill 的 session 恢复一样，首次调用后 session ID 保留在上下文中，后续自动 resume：\n❯ /claude 分析一下 skills/ 目录的整体架构 → [给出架构评价] ❯ /claude 那 codex 和 codex-plan 之间的抽象层次合理吗？ → [基于上一轮继续深入] 和 /codex 的关系 /claude 并不是唯一支持 session resume 的 skill。/codex 也支持 codex exec resume，\u0026ldquo;跨 session 复用已有上下文\u0026quot;不是 /claude 的独有能力。两者真正的差异不在于能不能 resume，而在于你要不要引入另一家模型。\n维度 /codex /claude 底层 Codex CLI (codex exec / resume) Claude Code CLI (claude -p / --resume) 新建干净上下文 支持 支持 恢复已有 session 支持 支持 主要价值 引入 GPT/Codex 的外部视角 留在 Claude 生态内复用已有会话 依赖 需要额外安装 Codex CLI + OpenAI 账号 对 Claude Code 用户无需额外安装 执行限制 --sandbox read-only --allowedTools 白名单 /codex 解决\u0026quot;换个模型看问题\u0026rdquo;，/codex-plan 解决\u0026quot;自动化多轮对抗审查\u0026quot;，/claude 解决\u0026quot;在 Claude 生态内复用已有 session 做上下文桥接\u0026quot;。三者按需组合。\n如果当前会话同时掌握 Claude 和 Codex 两边的 session ID，还可以做跨 CLI 的 relay —— 把 Claude session 的结论转发给 Codex session，反之亦然。\n实现原理 核心命令 # 新建会话 claude -p \\ --output-format json \\ --dangerously-skip-permissions \\ --allowedTools \u0026#34;Read,Glob,Grep\u0026#34; \\ -- \u0026#34;你的指令...\u0026#34; \u0026lt; /dev/null # 接入已有会话 claude -p \\ --output-format json \\ --dangerously-skip-permissions \\ --allowedTools \u0026#34;Read,Glob,Grep\u0026#34; \\ --resume \u0026lt;SESSION_ID\u0026gt; \\ -- \u0026#34;继续对话...\u0026#34; \u0026lt; /dev/null 关键是 --resume \u0026lt;SESSION_ID\u0026gt;。Claude Code 的每个 session 都有一个 UUID，通过这个 ID 就能接入已有会话的完整上下文。\n如果目标 session 来自不同项目（不同工作目录），skill 会从 ~/.claude/sessions/ 中查找该 session 的原始工作目录，并 cd 过去再执行。\n--output-format json 返回结构化数据，从中提取 session_id 保存在当前对话上下文里：\n{ \u0026#34;session_id\u0026#34;: \u0026#34;c3e6ccf8-9cce-49c7-b07e-1d420fb73bc0\u0026#34;, \u0026#34;result\u0026#34;: \u0026#34;回复内容...\u0026#34;, \u0026#34;total_cost_usd\u0026#34;: 0.058 } 踩过的坑 白名单而非黑名单。 一开始用 --disallowedTools \u0026quot;Edit,Write,NotebookEdit\u0026quot; 禁写入工具，后来发现 Bash 还是可用的 —— 子进程能执行 rm 或 echo \u0026gt;。改成 --allowedTools \u0026quot;Read,Glob,Grep\u0026quot; 白名单模式后，Bash、Edit、Write 全部不可用，才是真正的只读。\n-- 分隔符不能省。 --allowedTools 是变参选项，会吞掉后面所有参数。不加 -- 的话，你的 prompt 会被当成工具名，然后报\u0026quot;找不到输入\u0026quot;。\n\u0026lt; /dev/null 关掉 stdin。 在我的测试里，不显式关闭 stdin 时 claude -p 会短暂等待输入，加上 \u0026lt; /dev/null 可以避免这段等待。\n不要默认使用 --bare。 如果你依赖 OAuth/keychain 登录，--bare 会跳过这些认证来源，子进程会表现为未登录。只有改用环境变量（ANTHROPIC_API_KEY）等 bare-compatible 认证方式时才适合用它。\n限制 只读：白名单模式下子进程不能修改文件，只能分析和建议 Session ID 需要你自己找：跨项目 resume 时，你需要知道目标 session 的 UUID（可以通过 claude --resume 交互式选择器查找） 开源 和 codex、codex-plan 一起开源在 claude-code-skills。\n","permalink":"https://lldxflwb.github.io/blog/posts/claude-subprocess-second-opinion/","summary":"每个 Claude Code 会话都有自己的上下文。通过 /claude skill + session resume，你可以从当前会话接入另一个已有会话，向它追问并带回结论；需要时也可以新开一个干净的 Claude 实例做独立分析。核心价值是复用已有 session 的上下文，而不是手动搬运聊天记录。","title":"Skills /claude：让你的 Claude Code 会话们互相聊天"},{"content":"问题：开个分支要敲七遍命令 我桌面上有七八个仓库：blog、claude-code-skills、opencode……它们不在同一个 monorepo 里，而是各自独立的 git 仓库，散落在同一个目录下。\n大多数人的项目不是\u0026quot;选择\u0026quot;了 polyrepo，而是自然就长成了 polyrepo。\n想开一个 feature 分支做点事情，传统流程是这样的：\ncd blog \u0026amp;\u0026amp; git worktree add /tmp/feature/blog -b feature/login cd ../opencode \u0026amp;\u0026amp; git worktree add /tmp/feature/opencode -b feature/login cd ../skills \u0026amp;\u0026amp; git worktree add /tmp/feature/skills -b feature/login # ... 还有四五个仓库 做完了还要一个一个删回去。七八个仓库，每次都是纯体力劳动。\n如果你用 AI 编程工具，还有额外的问题：工作目录根目录下的 CLAUDE.md、.claude/ 这些上下文文件，到了新的 worktree 目录里就不存在了 —— Agent 丢失了所有指令和记忆。\naw 的解法 一条命令，批量检出整个工作区的新分支。\ncd ~/projects aw new --dir /tmp/my-feature -b feature/login aw 扫描当前目录下的所有 git 仓库，对每个仓库执行 git worktree add，统一使用同一个分支名。完成后你得到一个完整的平行工作区：\n每个 worktree 都是一个真实的 git 工作目录，有自己的分支，互不干扰。AI 上下文文件通过软链接共享，改一处处处生效。\n做完了？\naw rm --force --branch 一条命令，所有 worktree 删除，分支清理，目录回收。\n安装 # macOS (Apple Silicon) curl -L https://github.com/lldxflwb/aw/releases/download/v0.1.0/aw-darwin-arm64 -o aw chmod +x aw \u0026amp;\u0026amp; sudo mv aw /usr/local/bin/ # 或者用 Go 安装 go install github.com/lldxflwb/aw@latest 单二进制，零依赖。macOS、Linux、Windows 都有预编译版本。\n使用 创建工作区 cd ~/projects aw new --dir /tmp/my-feature -b feature/login 实际输出：\nFound 7 repos: blog, claude-code-action, claude-code-skills, opencode, rtk, sing-box-subscribe, surfboard Target: /tmp/my-feature Branch: feature/login [blog] creating worktree → /tmp/my-feature/blog (branch: feature/login) [blog] OK [claude-code-action] creating worktree → /tmp/my-feature/claude-code-action (branch: feature/login) [claude-code-action] OK ... == workspace context == [link] CLAUDE.md [link] .claude == repo context == --- Done. 7/7 repos, 2 context links. 几秒钟，七个仓库全部检出到新分支，上下文文件自动链接。\n看状态 cd /tmp/my-feature aw status REPO BRANCH STATUS AHEAD BEHIND LAST COMMIT ------------------ ------------- ------ ----- ------ ------------------------------------------ blog feature/login 1M 0 0 a300ba9 Add codex-plan blog post claude-code-action feature/login clean 0 0 3428ca8 chore: bump Claude Code to 2.1.71 opencode feature/login clean 0 0 6f90c3d chore: update nix hashes ... 一眼看到所有仓库的分支、修改状态、ahead/behind。比挨个 cd 进去 git status 快多了。\n清理 aw rm --force --branch 一键删除所有 worktree 和分支，清理 .aw/ 目录。不加 --force 会检查是否有未提交的修改，防止误删。--dry-run 可以先预览会删什么。\nAI 上下文链接 批量 worktree 创建是 aw 的核心，上下文链接是锦上添花 —— 但确实很实用。\naw 会自动扫描并链接这些 AI 上下文文件：\nCLAUDE.md、AGENTS.md、codex.md .claude/、.codex/、.cursor/、.cursorrules aw.yml 两级链接：\n工作区级 —— 源目录根下的上下文文件（如 ~/projects/CLAUDE.md）链接到工作区根 仓库级 —— 各仓库内的上下文文件，只链接 git 未跟踪的。已跟踪的文件 worktree 里本来就有，不需要重复 这个设计意味着你可以在源目录随时修改 CLAUDE.md，工作区里的 Agent 立刻能看到最新内容。\nWindows 兼容 Windows 默认不支持创建软链接（需要开发者模式或管理员权限）。aw 的处理方式是：\n软链接失败时自动 fallback 到复制文件，并打印修复提示：\n[warn] symlink failed for CLAUDE.md: ..., falling back to copy [hint] to fix: enable Developer Mode (Windows Settings → System → For developers), then run \u0026#39;aw relink\u0026#39; 开启开发者模式后，运行 aw relink 就能把所有复制文件升级为软链接。如果 relink 仍然失败，会自动恢复复制并提示具体原因。\n设计决策 为什么用 git worktree 而不是 clone git worktree 和源仓库共享 .git 数据库，不需要重新下载代码。创建一个 worktree 比 clone 快几个数量级，而且磁盘占用几乎为零。更重要的是，worktree 的分支和源仓库的分支是同一个 —— 不需要 push/pull 来同步。\n为什么不用 monorepo monorepo 需要全部代码在一个仓库里。现实中大多数团队的仓库是各自独立的，把它们合并成 monorepo 的成本远高于收益。aw 不改变你的仓库结构，只在需要时创建临时工作区。\nworkspace.json 每次 aw new 都会在工作区的 .aw/workspace.json 里记录完整状态：源路径、目标路径、分支名、所有仓库和上下文链接。aw rm 和 aw status 都依赖这个文件，不需要重新扫描或猜测。\n\u0026ndash;json 输出 所有命令都支持 --json，输出统一的 JSON 信封：\n{\u0026#34;schema_version\u0026#34;: 1, \u0026#34;ok\u0026#34;: true, \u0026#34;data\u0026#34;: {...}, \u0026#34;error\u0026#34;: null, \u0026#34;warnings\u0026#34;: []} Exit code 也标准化：0 成功、1 部分失败、2 用法错误。这让 aw 天然适合被脚本、CI、MCP Server 等上层工具集成。\n并发锁 写操作（aw new、aw rm）会在 .aw/lock 上加文件锁。Unix 用 flock，Windows 用 exclusive file。防止两个进程同时操作同一个工作区。锁超过 30 秒自动视为 stale 并回收。\n限制 aw new 不完全幂等：重复创建同名分支会被 git 拒绝，因为分支已存在。后续版本会检测已有分支并跳过 不支持嵌套 git 仓库：只扫描一级子目录，不递归 软链接在 Windows 需要额外操作：不是 bug，是 Windows 的限制，但 fallback + relink 的方案已经尽量平滑了 后续计划 MCP Server —— 让 Agent 直接调用 aw 创建工作区 Skill 集成 —— /aw 一键创建工作区并切换 Agent 工作目录 aw.yml —— 配置文件，指定哪些仓库需要、哪些排除、上下文文件自定义 项目地址：aw\n","permalink":"https://lldxflwb.github.io/blog/posts/aw-polyrepo-worktree/","summary":"多仓库项目开新分支是个苦力活：七八个仓库，每个都要 git worktree add、每个都要敲一遍分支名。aw 把这件事缩成一条命令 —— 扫描目录下所有仓库，批量创建 worktree，统一分支名，顺带把 AI 上下文文件链接过去。做完了 aw rm 一键收尾。Go 单二进制，零依赖，macOS/Linux/Windows。","title":"aw：一条命令给多仓库工作区切出新分支"},{"content":"从「第二意见」到「对抗式审查」 之前写过一篇 让 Claude Code 调用 Codex CLI：获取 GPT 的第二意见，介绍了 codex skill —— 在 Claude Code 中一键调用 GPT 模型做代码审查。\n用了一段时间后发现一个问题：一次性的第二意见不够用。\n典型场景是写完一份实现计划，让 Codex 审查一下，它提了 5 条意见。然后呢？你手动改计划，再手动 /codex 让它看修改后的版本，它又提了 3 条……来回几轮你就烦了。\n更大的问题是：你在充当中间人。 Claude 写计划、GPT 提意见、你评估意见合不合理、你决定改不改、你把修改后的版本喂回去。整个流程的瓶颈是你。\ncodex-plan 解决的就是这个问题：把你从循环里移出去，让 Claude 和 GPT 自动对抗。\ncodex-plan 和 codex 的区别 先说清楚：codex-plan 是基于 codex skill 构建的，底层调用的是同一个 Codex CLI，同样以只读沙箱运行，同样支持 session 恢复。区别在于上层流程：\ncodex codex-plan 定位 通用工具 —— 问什么都行 专用工具 —— 只做计划审查 交互模式 单轮：你问，GPT 答 多轮自动循环：质疑 → 修改 → 再质疑 谁评估反馈 你自己 Claude 自动评估（采纳/驳回） 谁改计划 你自己 Claude 自动修改计划文件 终止条件 GPT 回答完就结束 GPT 说 LGTM 才结束 输出 GPT 的原始回复 每轮摘要 + 最终修改总结 简单说：codex 是一把瑞士军刀，codex-plan 是一台自动化的红蓝对抗机器。\n工作流程 输入 /codex-plan 后，完整流程是这样的：\n你的计划 ↓ Claude 收集项目上下文 ↓ ┌─────────────────────────────────────┐ │ Claude 把计划 + 上下文提交给 Codex │ │ ↓ │ │ Codex 扮演严格审查者，按优先级质疑 │ │ 🔴 高优先级 / 🟡 中 / 🔵 低 │ │ ↓ │ │ Claude 逐条评估： │ │ ✅ 采纳 → 直接修改计划文件 │ │ ❌ 驳回 → 附理由 │ │ ↓ │ │ Claude 把修改后的计划回传给 Codex │ │ ↓ │ │ Codex 继续审查修改后的版本 │ │ ↓ │ │ 循环，直到 Codex 说 \u0026#34;LGTM\u0026#34; │ └─────────────────────────────────────┘ ↓ 输出最终摘要：改了什么、保留了哪些分歧 整个过程你不需要介入。当然，你随时可以发消息打断，Claude 会立即停下来响应你。\n使用示例 审查已有计划 ❯ /codex-plan @docs/migration-plan.md ⏺ Skill(codex-plan) ⎿ Successfully loaded skill ⏺ 计划文件: docs/migration-plan.md (87行) 收集项目上下文... ⏺ Bash(codex exec --sandbox read-only ...) ⎿ Running in the background --- 第 1 轮 --- Codex 提出 6 条质疑 ✅ 采纳 4 条： - 🔴 缺少回滚策略 → 新增 \u0026#34;回滚方案\u0026#34; 章节 - 🔴 数据库迁移无锁表评估 → 补充锁表影响分析 - 🟡 缺少监控指标 → 新增关键指标清单 - 🔵 步骤 3 和 4 可以并行 → 调整依赖关系 ❌ 驳回 2 条： - 🟡 建议用蓝绿部署（理由：当前规模不需要，滚动更新足够） - 🔵 建议增加负载测试（理由：已在 CI 中覆盖） 📝 计划已更新 session id: a1b2c3d4-...【用于codex恢复记录，压缩时请保留】 ⏳ 继续下一轮... --- 第 2 轮 --- Codex 提出 2 条质疑 ✅ 采纳 1 条： - 🟡 回滚方案缺少数据一致性验证步骤 → 补充 ❌ 驳回 1 条： - 🔵 建议拆分为两个 PR（理由：变更耦合度高，拆分反而增加风险） 📝 计划已更新 ⏳ 继续下一轮... --- 第 3 轮 --- Codex: LGTM --- 讨论完成 --- 总轮次：3 计划文件：docs/migration-plan.md 主要修改： - 新增回滚方案章节（含数据一致性验证） - 补充数据库锁表影响分析 - 新增监控指标清单 - 调整步骤 3/4 为并行执行 保留分歧：无 最终状态：共识达成 ✅ 从零开始 没有现成的计划文件也行。告诉它你要做什么，它会先生成初始计划再开始对抗：\n❯ /codex-plan 重构用户认证模块，从 session 迁移到 JWT Claude 会分析项目现有代码，生成一份初始计划保存到 ~/.claude/plans/，然后自动进入对抗循环。\n继续上次的讨论 ❯ /codex-plan 不带参数时，自动找到 ~/.claude/plans/ 下最近修改的计划文件继续。\n关键设计 角色分工明确 Codex（GPT）只质疑，不修改。 它以只读沙箱运行，没有写入权限。所有文件修改都由 Claude 完成。这确保了计划文件始终在你的 Claude Code 工作区内，版本可控。\nClaude 评估并执行修改。 Claude 不是 Codex 的传声筒 —— 它会独立判断每条质疑是否合理。不合理的会驳回并附理由，驳回理由也会回传给 Codex，让它知道为什么被拒。\n终止条件 三种情况会终止循环：\nCodex 说 LGTM —— 最理想的结果，双方达成共识 Codex 没有新质疑 —— 全是之前提过的重复内容，说明已经充分审查 连续 2 轮全部驳回 —— 双方分歧无法调和，记录分歧点后停止 第三种情况很重要。不是所有分歧都需要解决 —— 有时候是合理的技术分歧，记录下来让人类决策就好。\n每轮摘要保持透明 每轮结束后 Claude 都会输出摘要：采纳了哪些、驳回了哪些、改了什么。你不需要看完整的 GPT 输出，但你始终知道发生了什么。如果某条驳回你不同意，随时打断告诉 Claude。\nSession 恢复 和 codex skill 一样，codex-plan 利用 Codex CLI 的 resume 机制维持多轮对话。每轮摘要都包含 session ID，即使 Claude Code 的上下文被压缩，也不会丢失对话状态。\n什么时候用 codex，什么时候用 codex-plan 用 codex 的场景：\n快速问一个问题：\u0026ldquo;这段代码有什么问题？\u0026rdquo; 让 GPT review 一下 diff 需要一个不同视角的分析 不涉及计划文档的任意任务 用 codex-plan 的场景：\n有一份实现计划，想在执行前充分验证 架构设计需要严格审查 重大重构或迁移的方案评审 希望自动化多轮质疑，不想手动当中间人 简单说：如果你只想听听意见，用 codex；如果你想让计划被锤到没有破绽，用 codex-plan。\n5 分钟安装 方式一：复制给你的 AI 请阅读 https://github.com/lldxflwb/claude-code-skills 帮我安装里面的 codex-plan skill 前提是你已经安装了 codex skill（codex-plan 依赖 Codex CLI）。\n方式二：手动安装 # 1. 确保 Codex CLI 已安装 which codex || npm install -g @openai/codex # 2. 安装 skill git clone https://github.com/lldxflwb/claude-code-skills.git /tmp/claude-code-skills cp -r /tmp/claude-code-skills/skills/codex-plan ~/.claude/skills/codex-plan rm -rf /tmp/claude-code-skills 限制 依赖 Codex CLI：需要 OpenAI 账号和额度 耗时较长：多轮对抗通常需要 5-15 分钟，取决于计划复杂度和轮次 只针对计划文档：不适合代码审查（代码审查用 codex 就够了） Claude 的判断不一定对：它可能错误地驳回合理意见，或采纳不合理的建议。所以每轮摘要是关键 —— 你随时可以介入纠正 开源 codex-plan 和 codex 一起开源在 claude-code-skills。\n","permalink":"https://lldxflwb.github.io/blog/posts/codex-plan-adversarial-review/","summary":"基于 codex skill 的进阶版本：codex-plan 自动驱动 Claude 与 GPT 的多轮对抗式计划审查。Claude 写计划，GPT 质疑，Claude 评估并修改，循环往复直到 GPT 说 LGTM。不再是一次性的第二意见，而是真正的红蓝对抗。开源免费，5 分钟安装。","title":"codex-plan：让 GPT 当你的计划审查官，多轮对抗式质疑直到无懈可击"},{"content":"起因 我日常用 Claude Code 做开发，经常需要两类输出的可视化：\nTikZ 图表 —— 架构图、流程图、状态机这些，Claude 写好 TikZ 代码后我需要看到渲染结果 Plan 文档 —— Claude Code 的 Plan Mode 会产出大量 markdown 计划文档，我想在墨水屏上舒服地阅读它们 以前的做法是手动编译 LaTeX、手动打开 markdown，非常割裂。于是我做了一个 Claude Code Skill，把这些整合成一个自动化的预览服务。\n5 分钟安装 方式一：复制给你的 AI 请阅读 https://github.com/lldxflwb/claude-code-skills 帮我安装里面的 tikz skill AI 会自动克隆仓库、安装依赖（tectonic + pdf2svg）、创建软链接。\n方式二：手动安装 # 1. 安装依赖 brew install tectonic pdf2svg # 2. 克隆仓库 git clone https://github.com/lldxflwb/claude-code-skills.git ~/claude-code-skills # 3. 软链接到 Claude Code skills 目录 ln -s ~/claude-code-skills/skills/tikz ~/.claude/skills/tikz 安装完成后输入 /tikz 画一个简单的流程图 验证。\n使用效果 TikZ 渲染 在 Claude Code 里直接说你想画什么：\n❯ /tikz 画一个 A → B → C 的流程图 Claude 会自动写 TikZ 代码、编译、返回一个可点击的 URL。整个过程你只需要等几秒：\n⏺ Write(flowchart.tex) ⎿ Wrote 25 lines to flowchart.tex ⏺ Bash(python3 ~/.claude/skills/tikz/scripts/render_tikz.py flowchart.tex) ⎿ http://127.0.0.1:8073/flowchart_20260316_111125_932281.svg /Users/karl/.cache/tikz-skill/renders/flowchart_20260316_111125_932281.png ⏺ 渲染完成：http://127.0.0.1:8073/flowchart_20260316_111125_932281.svg AI 自动校验图表质量 这是我觉得最实用的功能。Claude 渲染完图表后，会派一个子 agent 去读取 PNG 截图，检查文字有没有重叠、布局是不是太挤、箭头是不是清晰。发现问题就自动改 TikZ 代码重新渲染，直到效果满意才返回最终 URL。\n为什么需要这个？因为 TikZ 图表的一个常见问题是节点太多时文字会重叠 —— AI 写代码的时候不知道渲染出来长什么样。有了 PNG 校验，它能\u0026quot;看到\u0026quot;自己的产出，然后修正。\nPlan 文档阅读 打开预览服务首页（http://127.0.0.1:8073/），你会看到两个区域：\n计划 —— ~/.claude/plans/ 下的所有 plan 文档，按创建时间倒序 TikZ 渲染 —— 所有渲染过的 SVG 缩略图 点击任意 plan 进入阅读页面，有两种模式可切换：\n墨水屏模式 —— 专门为墨水屏优化的阅读体验：\nGeorgia 衬线字体，大字号加粗，高对比度配色 自动按视口高度分页，完全不需要滚动 点击屏幕左侧翻上一页，右侧翻下一页 代码块、表格超出一页时自动拆分到多页 顶部显示页码和阅读进度 普通模式 —— 标准 web 阅读：\n全宽布局，长页面滚动，可选择文字 右下角浮动按钮组：回到顶部、去到底部、打开目录侧边栏 目录侧边栏支持点击跳转，滚动时自动高亮当前章节 两种模式通过右上角按钮一键切换，选择会持久化到浏览器，下次打开还是上次的模式。\n在 Plan 中嵌入图表 写计划文档时如果需要配图，Claude 会先渲染 TikZ 图表，然后用相对 URI 嵌入到 markdown 里：\n![Pipeline Overview](/pipeline_20260316_120000_123456.svg) Plan viewer 会自动内联展示，图片居中、宽度自适应。\n架构设计 整个 skill 的核心思路是 \u0026ldquo;脚本负责生产，server 负责展示\u0026rdquo;：\nskills/tikz/ ├── SKILL.md # Claude 读取的技能指令 ├── config.json # host/port/默认模式配置 ├── setup.md # 依赖安装引导 └── scripts/ ├── render_tikz.py # TikZ → PDF → SVG/PNG ├── tikz_server.py # HTTP 预览服务 ├── ensure_server.py # 自动启停管理 └── config.py # 配置读取（env \u0026gt; config.json \u0026gt; defaults） 几个设计决策值得说一下：\n配置优先级链：环境变量 \u0026gt; config.json \u0026gt; 硬编码默认值。这样不同机器通过 config.json 配不同的 IP 和端口，不依赖 shell 环境变量。我之前踩过坑 —— Claude Code 的 Bash 工具不一定会 source .zshrc，导致环境变量读不到。config.json 跟着 skill 走，彻底解决了这个问题。\nServer 完全透明：render_tikz.py 内部自动调 ensure_server.py，AI 和用户都不需要手动管理 server。已有 server 就复用，没有就启动，僵尸进程就杀掉重来。\n静态目录安全：server 的静态根目录限定在 renders/，不会暴露 server.log、server.json 等内部文件。\n子 agent 校验：渲染时同时生成 PNG（200 DPI），Claude 派子 agent 读取 PNG 验证图表质量，在子 agent 里闭环修正，不污染主 agent 上下文。\n踩坑记录 墨水屏分页是这个项目里最折腾的部分。跟 Codex（GPT 模型）联合诊断了好几轮才搞定：\n离屏测量不准。 最初用一个隐藏的 div 测量元素高度，但字体大小、行高、padding 和真实渲染环境不一致，导致分页偏差。最终方案是直接把内容渲染到真实容器里，逐个添加元素，用 scrollHeight \u0026gt; clientHeight 判断是否溢出 —— 零误差，所见即所得。\n嵌套代码块不分页。 marked.js 把列表里的代码块生成为 \u0026lt;ol\u0026gt;\u0026lt;li\u0026gt;\u0026lt;pre\u0026gt;，分页逻辑只检查顶层 children 的 tagName === 'PRE'，永远匹配不到嵌套的代码块。修复方案是递归遍历容器（flattenOversized），找到任意层级的 pre/table 并拆分。这个 bug 是让 Codex 诊断出来的 —— 自己盯了半天没看出来，换个模型一下就定位了。\nbase64 中文乱码。 JavaScript 的 atob() 只能处理 Latin-1 编码，中文 UTF-8 字节会乱码。用 TextDecoder 解码修复。\nf-string 和 JS 冲突。 Python f-string 里的 \\n 会被解释为真换行，破坏 JS 字符串。markdown 内容中的反引号和 \u0026lt;/script\u0026gt; 也会破坏页面。最终用 base64 编码嵌入内容，彻底避免转义问题。\n配置参考 config.json 示例：\n{ \u0026#34;host\u0026#34;: \u0026#34;192.168.1.100\u0026#34;, \u0026#34;port\u0026#34;: 8073, \u0026#34;default_view_mode\u0026#34;: \u0026#34;normal\u0026#34; } 字段 默认值 说明 host 127.0.0.1 展示 URL 使用的地址（server 始终绑定 0.0.0.0） port 8073 服务端口 default_view_mode normal 新用户默认阅读模式（eink 或 normal） 环境变量 TIKZ_SERVER_HOST、TIKZ_SERVER_PORT、TIKZ_DEFAULT_VIEW_MODE 优先级高于 config.json。\n后续想法 目前 server 服务 TikZ 和 Plan 两种内容。后续如果有更多 skill 需要预览（HTML 报告、CSV 可视化），可以把 server 抽成独立的通用预览基础设施。和 Codex 讨论过这个方案 —— 用 manifest.json 驱动索引页、每个 artifact 独立目录。但现阶段，够用就好，不过早抽象。\n项目地址：claude-code-skills\n","permalink":"https://lldxflwb.github.io/blog/posts/preview-server-skill/","summary":"用 Claude Code Skill 搭建本地预览服务器：LaTeX TikZ 图表一键渲染为 SVG，Markdown 文档墨水屏友好阅读，AI 自动校验图表质量。支持架构图、流程图、状态机等可视化，内置分页翻页、目录导航、双模式切换。开源免费，5 分钟安装。","title":"用 Claude Code Skill 搭建个人预览服务：TikZ 渲染 + 墨水屏阅读器"},{"content":"为什么需要第二意见？ 用 Claude Code 做日常开发确实高效，但用久了会发现几个痛点：\n只修表面，不挖根因。 在多步骤修复和重构场景中，Claude Code 倾向于\u0026quot;让报错消失\u0026quot;，而不是深入分析为什么会出错。比如一个类型错误，它可能直接加个 as any 或者一个条件判断绕过去，而不是追溯到上游数据流的问题。表面上修好了，实际上埋了雷。\n计划执行力差。 即使你给了详细的实现计划，Claude Code 也经常在复杂任务中走偏 —— 跳过步骤、遗漏边界条件、或者擅自\u0026quot;优化\u0026quot;你的方案。你以为它在按计划推进，回头一看发现偏了。\nPrompt 遵从度不稳定。 明确写在指令里的要求，它有时会选择性忽略。尤其是多步骤复杂任务，越到后面遵从度越低。\n这些问题的根源在于：单一模型容易陷入自己的思维惯性。它不会质疑自己的修复是否真的到位。\n解决方案：让另一个模型来查漏补缺。\nGPT 系列模型有不同的训练数据和推理风格，对同一段代码变更往往能发现不同的问题。如果能在 Claude Code 的工作流中一键获取 GPT 的审查意见，就能有效弥补单一模型的盲区。\nCodex CLI 是 OpenAI 的命令行工具，支持非交互式执行（codex exec），天然适合被集成。\n5 分钟安装 方式一：复制给你的 AI 把下面这段话复制粘贴给 Claude Code（或任何 AI 编程助手），它会自动帮你完成安装：\n请阅读 https://github.com/lldxflwb/claude-code-skills 帮我安装里面的 codex skill 方式二：手动安装 # 1. 安装 Codex CLI npm install -g @openai/codex # 2. 登录 codex login # 3. 安装 skill git clone https://github.com/lldxflwb/claude-code-skills.git /tmp/claude-code-skills cp -r /tmp/claude-code-skills/skills/codex ~/.claude/skills/codex rm -rf /tmp/claude-code-skills 安装完成后，在 Claude Code 中输入 /codex 你好 验证是否正常工作。\n使用示例 在 Claude Code 中直接输入：\n/codex review 一下当前的代码变更 /codex 分析这个架构方案的优缺点 /codex 给这段代码写单元测试 @src/utils.ts /codex 这个 bug 可能的原因是什么 @error.log Claude Code 会自动收集相关上下文（git diff、文件内容等），发送给 Codex CLI，然后呈现 GPT 的审查意见。\n下面是一次真实的调用过程。我让 Codex 审查这篇博客文章本身：\n❯ /codex 审查一下我们这篇博客文章的质量 ⏺ Skill(codex) ⎿ Successfully loaded skill ⏺ 检测到已有 session ID: a1b2c3d4-...，需要收集博客文章内容作为上下文。 ⏺ Read 1 file ⏺ Codex 任务: - 指令: 审查博客文章，评估内容质量、结构、SEO/GEO 友好度 - 上下文: codex-with-claude-code.md (111行) - 模式: 恢复会话 a1b2c3d4 ⏺ Bash(codex exec resume a1b2c3d4-... --skip-git-repo-check --json ...) ⎿ Running in the background ⏺ Codex 后台执行中，等待结果... ⏺ session id: a1b2c3d4-... [Codex 结果] - 内容质量与深度：6.5/10 - 文章结构：6/10 - SEO 友好度：5.5/10 - GEO 友好度：6/10 - 对读者的实用价值：6/10 优先级最高的问题： 1. 痛点描述偏绝对，缺少案例支撑 2. \u0026#34;核心实现\u0026#34;还是概述，读者看完不知道怎么搭 3. 缺少 FAQ、限制说明、排错指南 ... Claude Code 自动完成了全部流程：加载 Skill → 检测到已有 session → 读取文章内容 → 后台调用 Codex → 呈现审查结果。整个过程无需手动干预。\n实现原理 Claude Code Skill 是什么 Claude Code Skill 是一个用 Markdown 定义的可调用能力，放在 ~/.claude/skills/\u0026lt;skill-name\u0026gt;/SKILL.md。它告诉 Claude 在特定场景下该怎么做。\n这个 codex skill 的结构：\n~/.claude/skills/codex/ ├── SKILL.md # 主文件：定义调用流程 └── setup.md # 环境检测与安装引导 SKILL.md 的 frontmatter 定义基本信息：\n--- name: codex description: \u0026#34;调用 Codex CLI 执行任务，获取来自 GPT 模型的独立意见。\u0026#34; user-invocable: true argument-hint: \u0026#34;\u0026lt;要让 Codex 做的事情\u0026gt;\u0026#34; --- 调用流程 当你输入 /codex review 代码 时，Skill 指导 Claude Code 按这个流程执行：\n环境检测 — 检查 codex CLI 是否可用，不可用则提示安装 理解意图 — 解析你的指令 收集上下文 — 根据任务自动收集 git diff、文件内容等 后台执行 — 调用 codex exec 将任务发送给 GPT 模型 呈现结果 — 解析 Codex 输出并展示 核心命令：\n# 新建会话 cat \u0026lt;\u0026lt;\u0026#39;EOF\u0026#39; | codex exec --sandbox read-only --skip-git-repo-check --json -o output.jsonl - 请审查以下代码变更... EOF # 恢复会话（多轮对话） codex exec resume \u0026lt;SESSION_ID\u0026gt; --skip-git-repo-check --json -o output.jsonl \u0026#34;继续追问...\u0026#34; Session 恢复 Codex CLI 支持 codex exec resume \u0026lt;SESSION_ID\u0026gt; 恢复之前的对话。Skill 利用了这个特性：\n首次调用时，从 Codex 的 JSONL 输出中提取 thread_id（session ID） 将 session ID 保留在 Claude Code 的对话上下文中 后续调用自动检测到已有 session，走 resume 路径 这意味着你可以和 Codex 进行多轮对话：\n\u0026gt; /codex 0.11 和 0.9 哪个大？ → Codex: 0.9 更大。 \u0026gt; /codex 你刚才说了啥？ → Codex: 你刚才问的是 0.11 和 0.9 哪个更大。 关键设计决策 后台执行：Codex CLI 任务可能耗时较长（5-30 分钟），Skill 使用后台模式避免阻塞 Claude Code 的主流程。\n敏感信息过滤：自动排除 .env、密钥文件，diff 中的 token 替换为 [REDACTED]。这不只是安全考虑 —— GPT 模型对敏感信息的审查策略比较严格，如果上下文中携带了 API key、密钥等内容，GPT 可能会直接拒绝执行整个任务。提前过滤掉这些信息，才能保证 Codex CLI 正常工作。\n只读沙箱：Codex CLI 以 read-only 沙箱运行，不会修改你的任何文件。它只负责审查和建议。\n限制与适用场景 适合：\n代码变更的二次审查 方案评估和第二意见 补充测试建议 多角度分析问题 不适合：\n高频低延迟的交互（Codex CLI 有启动开销） 超大上下文的任务（受 GPT 上下文窗口限制） 需要写入本地文件的操作（只读沙箱） FAQ Codex CLI 会不会修改我的文件？ 不会。Skill 强制使用 --sandbox read-only 模式，Codex CLI 无法写入任何文件。\n需要付费吗？ Codex CLI 使用 OpenAI 的订阅额度，免费用户也有一定额度可用，不需要额外购买 API credits。如果你有 ChatGPT Plus 等付费订阅，额度会更充裕。\nSession 丢了怎么办？ Claude Code 对话上下文被压缩时，session ID 可能丢失。丢失后下次 /codex 会自动创建新 session，不影响使用，只是失去之前的对话记忆。\n为什么要过滤敏感信息？ GPT 模型遵循严格的安全审查策略。如果发送的上下文中包含 API key、密钥等敏感信息，GPT 可能直接拒绝执行整个任务。\n开源 这个 skill 已开源在 claude-code-skills，欢迎贡献更多 skill。\n","permalink":"https://lldxflwb.github.io/blog/posts/codex-with-claude-code/","summary":"在 Claude Code 中集成 OpenAI Codex CLI，一键获取 GPT 模型的独立代码审查意见。支持多轮对话 session 恢复，自动收集 git diff 上下文，后台异步执行。让两个 AI 模型协作，弥补单一模型的盲区。开源免费，5 分钟安装。","title":"让 Claude Code 调用 Codex CLI：获取 GPT 的第二意见"}]