ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

不敢让 Codex 直接改代码?我先让它只读分析一个 Node.js 项目

不敢让 Codex 直接改代码?我先让它只读分析一个 Node.js 项目 1. 为什么我让 Codex 先只读而不是直接改代码Codex 这类 CLI 编码代理最让人心里没底的地方不是它不会写代码而是它太会写代码了。你一句「帮我优化下这个接口」它可能顺手把package.json的依赖升了、把测试文件重写了、把没让你碰的配置文件也改了。等你git diff一看几十个文件变动根本分不清哪些是它该动的、哪些是它自作主张的。所以我给自己定了个规矩新项目第一次交给 Codex一律先跑 read-only 模式。让它只读目录、读源码、读 npm 脚本把「它看到了什么、理解成什么」先讲清楚。这一步不产生任何写操作风险为零但能提前暴露两个关键问题——它有没有看错目录结构它有没有把依赖关系理解反。这篇就以一个真实的 Node.js 小项目为例走一遍完整流程npm init锁依赖 → 配置统一 Key/API 通道 → 用codex exec --sandbox read-only做只读分析 → 用 SHA-256 哈希验证「它真的没动文件」。全程可复制Windows / macOS / Linux 都能跟。适合谁看手里有 Node.js 项目、想用 Codex 做代码审查或架构梳理、但又不放心直接给写权限的开发者。读完你能拿到一份可复制的config.toml骨架以及一套「只读权限没被绕过」的检查动作。2. 前置准备TaoToken 统一 Key 与 API 通道Codex CLI 本身只是个客户端它要调模型就得有一个能用的 API 入口和 Key。我这边统一走 TaoToken 的通道好处是模型对话、Coding Plan、API Keys 都在一个后台管不用在多个服务商之间来回切配置。你需要先拿到两样东西一个 API Key在控制台里创建形如sk-xxxxxxxx一个 Base URL统一入口后面写进config.toml创建 Key 的入口在这里API Keys 管理https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite如果你还没决定用哪个模型跑 Codex可以先在模型对话页面试一下确认模型对 Node.js 代码的理解符合预期再写进 CLI 配置模型对话体验https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel_chatutm_campaignrewrite长期用 Codex 做编码和 Agent 任务的话Coding Plan 比按次调用更划算额度也更稳定Coding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewrite接入文档里有完整的 Base URL、模型名和参数说明配置前建议扫一眼避免模型名写错导致 404接入文档https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewriteAPI 统一入口是https://taotoken.net/api这个地址不加任何查询参数直接写进配置即可。3. 可复制配置npm 初始化 config.toml 骨架3.1 先建一个能跑的小项目不要一上来就拿生产仓库试。我习惯先建一个 5 个文件以内的小项目依赖为零测试能跑通这样 Codex 分析出错时你能一眼看出来是它的问题还是项目本身的问题。mkdir tiny-books-api cd tiny-books-api npm init -ynpm init -y会生成一个默认的package.json。接着手动补上启动和测试脚本并锁定依赖——这一步很关键只读分析时如果依赖是浮动的Codex 可能会把「依赖版本不确定」当成风险点报出来干扰判断。{ name: tiny-books-api, version: 1.0.0, type: module, scripts: { start: node src/server.js, test: node --test test/ }, dependencies: {}, devDependencies: {} }目录结构保持这样一共 5 个文件tiny-books-api/ ├── README.md ├── package.json ├── src/ │ ├── books.js │ └── server.js └── test/ └── server.test.jssrc/books.js只放内存数据export const books [ { id: 1, title: Node.js 实战 }, { id: 2, title: CLI 工具设计 } ];src/server.js提供两个 GET 接口import http from node:http; import { books } from ./books.js; const server http.createServer((req, res) { if (req.url /health) { res.writeHead(200, { Content-Type: application/json }); res.end(JSON.stringify({ status: ok })); return; } if (req.url /api/books) { res.writeHead(200, { Content-Type: application/json }); res.end(JSON.stringify(books)); return; } res.writeHead(404, { Content-Type: application/json }); res.end(JSON.stringify({ error: not found })); }); server.listen(3000, () console.log(listening on 3000));先跑一遍测试确认项目本身没问题npm test看到pass 2之类的输出就说明项目是健康的。这一步的意义是后面 Codex 报出来的任何问题都只可能是它理解层面的问题而不是项目跑不起来。3.2 config.toml 骨架Codex CLI 的配置放在用户目录下的~/.codex/config.tomlWindows 是%USERPROFILE%\.codex\config.toml。下面是我用的骨架把 Key 和 Base URL 都指向 TaoToken 通道# ~/.codex/config.toml model gpt-5-codex model_provider taotoken [model_providers.taotoken] name TaoToken base_url https://taotoken.net/api env_key TAOTOKEN_API_KEY wire_api responses [sandbox] # 默认只读需要写操作时再显式覆盖 mode read-onlyKey 不要写进config.toml用环境变量传避免配置文件被同步或截图泄露# macOS / Linux export TAOTOKEN_API_KEYsk-你的Key # Windows PowerShell $env:TAOTOKEN_API_KEY sk-你的Key注意base_url用https://taotoken.net/api不要在后面拼/v1之类的路径具体路径由wire_api决定。模型名以接入文档当前页面为准写错会直接 404。4. 只读分析实战codex exec --sandbox read-only4.1 确认 CLI 支持哪些只读参数先看帮助确认当前版本支持哪些沙箱参数codex exec --help我这边确认可用的三个关键参数参数作用--sandbox read-only限制项目写入只读文件系统--skip-git-repo-check允许在非 git 目录运行--ephemeral不保留本次会话文件4.2 把项目文件打包成标准输入我试过让 Codex 自己跑rg --files去列文件但在 Windows 沙箱里启动子进程时返回了 1312 错误。后来改成把文件内容通过标准输入喂给它并明确要求它不要调用任何工具反而更稳。PowerShell 下打包文件内容$root (Get-Location).Path $files Get-ChildItem -Recurse -File | Sort-Object FullName $bundle ($files | ForEach-Object { $relative [System.IO.Path]::GetRelativePath($root, $_.FullName) n FILE: $relative n Get-Content -Raw -LiteralPath $_.FullName }) -join nmacOS / Linux 下等价写法bundle$(find . -type f | sort | while read -r f; do echo echo FILE: $f echo cat $f done)4.3 执行只读分析把 prompt 和文件内容一起交给 Codex$prompt 下面的标准输入包含当前 Node.js 项目的全部文件。 不要调用任何工具不要创建、修改或删除文件只根据标准输入分析。 请说明文件职责、npm 脚本、第三方依赖、GET /api/books 的调用路径 并列出 3 个有文件依据的缺口。不要补全文件里没有的信息。 $bundle | codex exec --sandbox read-only --skip-git-repo-check --ephemeral $prompt三个参数缺一不可--sandbox read-only保证不写文件--skip-git-repo-check让它在独立目录能跑--ephemeral保证不留会话残留。5. 验证结果分析输出 只读权限检查5.1 Codex 实际分析出了什么运行结束后Codex 正确识别了 5 个文件的职责package.json项目元数据、启动和测试脚本README.md接口、命令和端口说明src/books.js内存图书数据src/server.jsHTTP 服务和路由test/server.test.js两个 GET 接口测试它确认了启动命令是npm start、测试命令是npm test并且项目没有第三方依赖。GET /api/books的调用路径也说对了http.createServer → 匹配 GET /api/books → 读取 books → JSON.stringify → response.end更关键的是它列出了三个有源码依据的缺口request.url用的是精确匹配/api/books?limit1会返回 404非 GET 的/api/books仍返回 404没有区分 405测试只检查状态码和数组长度没检查响应内容、Content-Type和未知路由这三条都能在源码里找到对应行不是它编的。这正是只读分析的价值——它先证明自己读懂了再谈改不改。5.2 用 SHA-256 确认它没动文件光信--sandbox read-only参数不够我习惯用哈希做物理验证。运行前后各算一次Get-ChildItem -Recurse -File | ForEach-Object { $hash (Get-FileHash -Algorithm SHA256 -LiteralPath $_.FullName).Hash $hash $($_.FullName) } | Sort-ObjectmacOS / Linuxfind . -type f -exec sha256sum {} \; | sort对比两次输出5 个文件的哈希完全一致退出码为 0CODEX_EXIT0 FILES_UNCHANGEDTrue参数声明和实际文件结果对上了这才叫「验证过」而不是「相信它」。6. 本篇常见错排查6.1 报错 1312沙箱启动子进程失败现象让 Codex 自己跑rg --files或ls时Windows 沙箱返回 1312。原因沙箱限制了下级进程的创建权限。解决不要让它调工具改成把文件内容通过标准输入喂进去prompt 里明确写「不要调用任何工具」。这也是我上面用$bundle | codex exec的原因。6.2 模型返回 404 或认证失败现象codex exec直接报模型不存在或 401。排查顺序检查TAOTOKEN_API_KEY环境变量是否真的导出成功echo $env:TAOTOKEN_API_KEY检查config.toml里base_url是否写成了https://taotoken.net/api不要多拼路径检查model字段的模型名是否和接入文档一致接入文档https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite6.3 分析结果里出现项目里没有的文件现象Codex 提到了你没写的文件或依赖。原因prompt 里没限制「只根据标准输入分析」模型开始脑补。解决prompt 里加一句「不要补全文件里没有的信息」并且把--ephemeral打开避免上一次会话的上下文串进来。6.4 哈希对不上现象运行前后哈希不一致。排查先确认是不是npm test自己生成了缓存文件比如node_modules/.cache。把哈希计算范围限定在源码目录排除node_modules和临时文件。如果源码哈希真的变了说明--sandbox read-only没生效检查是不是被其他配置覆盖了。7. 下一步从只读分析到受控写入只读分析跑通、哈希验证通过之后我才愿意进入下一步让 Codex 改一个小问题再用git diff检查它到底动了什么。顺序不能反——先证明它读得对再让它写得少。如果你也想把这套流程固定下来建议把 Key 和通道统一到 TaoToken 后台管理模型对话、Coding Plan、API Keys 一个入口搞定省得每次换项目都要重新配一遍API Keyshttps://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite Coding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewrite第一次让 Codex 读项目时你更担心它看错目录、理解错依赖还是权限没收住我现在的答案是先用哈希把权限这件事变成可验证的事实剩下的担心就少了一大半。
返回列表