【Bug已解决】codex: --auto-approve modifies package.json / Unintended config changes — CodeX CLI 自动模式修改配置文件解决方案

1. 问题描述

在 CodeX CLI 的自动审批模式下,配置文件被意外修改:

# package.json 被修改
$ codex --auto-approve "安装依赖"
# CodeX 修改了 package.json
# 添加了不需要的依赖或修改了版本号

# 或 tsconfig.json 被修改
$ codex --auto-approve "修复 TypeScript 错误"
# CodeX 修改了 tsconfig.json 的编译选项

# 或 .env 被修改
$ codex --auto-approve "优化环境配置"
# CodeX 修改了 .env 中的变量

# 或 .gitignore 被修改
$ codex --auto-approve "清理项目"
# CodeX 从 .gitignore 中删除了重要条目

这个问题在以下场景中特别常见:

  • 自动审批模式没有保护配置文件
  • 沙箱未配置文件保护
  • 指令模糊导致过度修改
  • 没有创建 Git 备份
  • .codexignore 未配置
  • 保护文件列表缺失

2. 原因分析

核心原理拆解

--auto-approve → CodeX 自由修改文件
        ↓
配置文件未被保护 → 被修改
        ↓
package.json/tsconfig.json/.env 被意外更改

原因分类表

原因分类 具体表现 占比
无保护文件 配置文件未保护 约 40%
.codexignore 缺失 未排除配置 约 25%
指令模糊 "优化"过度解读 约 15%
无 Git 备份 无法恢复 约 10%
沙箱过宽 无目录限制 约 5%
生产环境 不该用自动模式 约 5%

3. 解决方案

方案一:创建 .codexignore(最推荐)

# 步骤 1:创建 .codexignore
cat > .codexignore << 'EOF'
package.json
package-lock.json
yarn.lock
tsconfig.json
.env
.env.*
.gitignore
.eslintrc*
.prettierrc*
*.config.js
*.config.ts
next.config.*
webpack.config.*
vite.config.*
EOF

# 步骤 2:CodeX 不会读取或修改这些文件
# 步骤 3:验证
codex --auto-approve "优化项目"
# package.json 不会被修改
git diff package.json  # 应为空

方案二:配置保护文件列表

# 步骤 1:在 config.json 中配置
cat > ~/.codex/config.json << 'EOF'
{
  "protectedFiles": [
    "package.json",
    "package-lock.json",
    "tsconfig.json",
    ".env",
    ".env.*",
    ".gitignore"
  ],
  "sandbox": {
    "allowedDirectories": ["./src", "./tests", "./docs"]
  }
}
EOF

# 步骤 2:验证
codex --auto-approve "task"
# 保护列表中的文件不会被修改

方案三:使用 Git 安全网

# 步骤 1:自动模式前先提交
git add -A
git commit -m "backup before auto-approve"

# 步骤 2:如果配置文件被修改
git checkout package.json
git checkout tsconfig.json
git checkout .env

# 步骤 3:或全部恢复
git checkout .

# 步骤 4:查看修改
git diff
git diff package.json

方案四:使用具体指令

# 步骤 1:避免模糊指令
# 错误: codex --auto-approve "优化项目"
# 正确: codex --auto-approve "只修改 src/index.js 中的 bug"

# 步骤 2:明确禁止修改配置
codex --auto-approve "修复 bug,不要修改 package.json 和 tsconfig.json"

# 步骤 3:分步骤执行
codex --auto-approve "第一步: 分析问题"
codex --auto-approve "第二步: 只修改 src/ 下的代码"

方案五:限制沙箱目录

# 步骤 1:只允许 src 和 tests 目录
cat > ~/.codex/config.json << 'EOF'
{
  "sandbox": {
    "allowedDirectories": ["./src", "./tests"]
  }
}
EOF

# 步骤 2:配置文件在根目录,不在允许范围内
# CodeX 无法修改根目录的 package.json

# 步骤 3:验证
codex --auto-approve "task"
git diff --name-only  # 只应显示 src/ 和 tests/ 下的文件

方案六:不使用自动模式

# 步骤 1:使用交互模式
codex  # 不加 --auto-approve

# 步骤 2:手动审批每个修改
# 当 CodeX 要修改 package.json 时,选择拒绝

# 步骤 3:使用 --print 模式
codex --print "分析问题" --max-turns 5
# --print 只分析不修改

# 步骤 4:修改手动执行
codex "告诉我需要修改什么"
# 然后手动修改文件

4. 各方案对比总结

方案 适用场景 推荐指数 难度
方案一:.codexignore 核心防护 ⭐⭐⭐⭐⭐
方案二:保护列表 文件防护 ⭐⭐⭐⭐⭐
方案三:Git 备份 可恢复 ⭐⭐⭐⭐⭐
方案四:具体指令 精确控制 ⭐⭐⭐⭐⭐
方案五:限制目录 目录隔离 ⭐⭐⭐⭐
方案六:不用自动 最安全 ⭐⭐⭐⭐⭐

5. 常见问题 FAQ

5.1 .codexignore 和沙箱的区别

  • .codexignore:CodeX 不读取/修改这些文件
  • 沙箱 allowedDirectories:限制可操作的目录范围

5.2 如何保护 package.json

.codexignore 中添加 package.json,或在 config.json 的 protectedFiles 中添加。

5.3 配置文件被修改了怎么恢复

git checkout package.json
# 或
git checkout .

5.4 --auto-approve 前应该做什么

git add -A && git commit -m "backup"

5.5 如何查看 CodeX 修改了什么

git diff
git diff --name-only

5.6 指令模糊会导致什么

CodeX 可能过度解读"优化"、"清理"等指令,修改不该修改的文件。

5.7 保护文件和 .codexignore 能同时用吗

可以。两者配合使用,双重保护。

5.8 Docker 中如何保护配置

在容器中挂载配置文件为只读:

docker run -v package.json:/app/package.json:ro codex-env

5.9 CI/CD 中的安全策略

CI/CD 中使用 --print 模式或限制 allowedDirectories

5.10 排查清单速查表

□ 1. 创建 .codexignore 排除配置文件
□ 2. config.json 配置 protectedFiles
□ 3. --auto-approve 前 git commit
□ 4. git diff 检查修改
□ 5. git checkout 恢复被改文件
□ 6. 使用具体指令而非"优化"
□ 7. 限制 allowedDirectories 到 src/tests
□ 8. 优先使用交互模式
□ 9. --print 模式只分析不修改
□ 10. Docker 挂载配置为只读

6. 总结

  1. 根本原因:配置文件被修改最常见原因是无保护文件(40%)和 .codexignore 缺失(25%)
  2. 最佳实践:创建 .codexignore 排除 package.jsontsconfig.json.env 等配置文件
  3. Git 安全网--auto-approve 前先 git commit,被修改后用 git checkout 恢复
  4. 指令精确:使用具体指令("只修改 src/index.js")而非模糊指令("优化项目")
  5. 最佳实践建议:配置 protectedFiles + .codexignore 双重保护,限制 allowedDirectories 到 src/tests,优先使用交互模式

故障排查流程图

flowchart TD
    A[配置文件被修改] --> B{已造成修改?}
    B -->|是| C[git checkout 恢复]
    B -->|否, 预防| D[创建 .codexignore]
    C --> E[git checkout package.json .env]
    E --> F[✅ 恢复完成]
    D --> G[排除 package.json/tsconfig/.env]
    G --> H[配置 protectedFiles]
    H --> I[限制 allowedDirectories]
    I --> j[只允许 src/tests]
    j --> K[--auto-approve 前 git commit]
    K --> L[使用具体指令]
    L --> M[优先交互模式]
    M --> N[✅ 安全配置]
    N --> O[Docker 配置文件只读挂载]
    O --> P[✅ 长期方案]
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐