feat: codex config installer with rollback

This commit is contained in:
tukuaiai
2026-05-12 20:09:01 +08:00
parent 51ab7a3e10
commit 32955fcea2
11 changed files with 407 additions and 233 deletions
+24
View File
@@ -0,0 +1,24 @@
# Codex 全局安全默认指令
你是用户本地 Codex Agent。默认以安全、可验证、可回滚的方式协助用户完成软件工程任务。
## 工作原则
- 先读当前目录与任务上下文,再修改文件。
- 优先复用成熟方案、官方能力、稳定工具和项目既有模式。
- 不硬编码密钥、Token、Cookie、私钥或个人敏感信息。
- 不执行不可逆或破坏性操作,除非用户明确要求并已经说明风险。
- 修改前尽量缩小影响范围,修改后给出验证命令和结果。
- 涉及 Git 时,先查看 `git status --short --branch`,避免混入无关改动。
## 质量门禁
- 能用测试、lint、类型、schema、脚本或 CI 验证的规则,不只写在提示词里。
- 不把“看起来对”当成完成;优先给出可复现命令、diff、测试输出和剩余风险。
- 遇到不确定事实时,明确说明不确定性和查证路径。
## 输出风格
- 默认使用中文。
- 简洁直接,先给结论,再给关键证据和下一步。
- 对人看的文档、注释和说明使用中文;代码符号保持英文且语义清楚。
+84 -27
View File
@@ -1,49 +1,106 @@
# `tools/config/.codex/` 用法说明
# Codex CLI 配置基线
本目录用于在仓库内版本化管理 Codex CLI 的“全局配置基线”,便于多人同步、审阅与回滚
本目录 Codex CLI 全局配置做成可审阅、可安装、可回滚的公开基线
你只需要把本目录里的两个文件复制到 **Codex Home**(默认 `~/.codex/`)即可生效:
## 字多不看
- `tools/config/.codex/config.toml``~/.codex/config.toml`
- `tools/config/.codex/AGENTS.md``~/.codex/AGENTS.md`
- 默认安装 `safe` 配置:不写入本机路径,不启用 `danger-full-access`,不设置 `approval_policy = "never"`
- 需要全自动高权限体验时,显式安装 `power` 配置。
- 安装前会备份用户现有 `~/.codex/config.toml``~/.codex/AGENTS.md`
- 每次安装都会生成恢复脚本,误覆盖后可以一键恢复。
- 支持通过 `CODEX_HOME` 指定 Codex Home。
## 1. 一键安装(推荐)
## 一键安装
在仓库根目录执行
安全默认版
```bash
mkdir -p ~/.codex
cp -f tools/config/.codex/config.toml ~/.codex/config.toml
cp -f tools/config/.codex/AGENTS.md ~/.codex/AGENTS.md
curl -fsSL https://raw.githubusercontent.com/tukuaiai/vibe-coding-cn/develop/tools/config/.codex/install.sh | bash
```
## 2. 路径示例
高权限版:
### Linux / WSL(实际生效位置)
```bash
curl -fsSL https://raw.githubusercontent.com/tukuaiai/vibe-coding-cn/develop/tools/config/.codex/install.sh | bash -s -- --profile power
```
- `\\wsl.localhost\\Ubuntu\\home\\<你的用户名>\\.codex\\config.toml`
- `\\wsl.localhost\\Ubuntu\\home\\<你的用户名>\\.codex\\AGENTS.md`
指定 Codex Home
(在 WSL 内对应:`~/.codex/config.toml``~/.codex/AGENTS.md`
```bash
curl -fsSL https://raw.githubusercontent.com/tukuaiai/vibe-coding-cn/develop/tools/config/.codex/install.sh | CODEX_HOME="$HOME/.codex" bash
```
### Windows(原生)
## 恢复
Codex Home 默认是 `~/.codex/`;在 Windows 上 `~` 通常展开为用户目录
恢复最近一次安装前的配置
- `C:\\Users\\<你的用户名>\\.codex\\config.toml`
- `C:\\Users\\<你的用户名>\\.codex\\AGENTS.md`
```bash
bash ~/.codex/backups/vibe-coding-cn/LATEST/restore.sh
```
如果你自己的 Codex Home 被改到了其它位置(例如 `C:\\Users\\<你的用户名>\\.config\\...`),请把两份文件复制到你实际的 Codex Home。
也可以恢复某一次具体备份:
## 3. 配置优先级(重要)
```bash
bash ~/.codex/backups/vibe-coding-cn/YYYYMMDD-HHMMSS/restore.sh
```
- **全局配置**`~/.codex/config.toml`
- **项目覆盖**:在项目根目录创建 `.codex/config.toml`(仅对当前项目生效)
备份目录包含:
如果你想把某些配置“只对本仓库生效”,建议使用项目覆盖(`.codex/config.toml`),全局配置只保留你长期通用的习惯与安全策略
- `config.toml`:安装前的用户原配置;如果原文件不存在,会写入 `.missing-config.toml` 标记
- `AGENTS.md`:安装前的用户原指令;如果原文件不存在,会写入 `.missing-AGENTS.md` 标记。
- `MANIFEST.txt`:安装来源、profile、目标路径和恢复脚本位置。
- `restore.sh`:恢复脚本。
## 4. 参考(官方文档)
## 文件说明
- Configuration / Config file:说明 `~/.codex/config.toml` 与项目级 `.codex/config.toml` 的优先级
- Custom instructions / Global instructions:说明 `~/.codex/AGENTS.md` 的全局指令加载方式
| 文件 | 用途 |
|:---|:---|
| `install.sh` | 一键安装、备份和恢复入口 |
| `config.toml` | 公开安全默认配置 |
| `config.power.toml` | 高权限配置,显式 `--profile power` 才安装 |
| `AGENTS.safe.md` | 公开安全默认全局指令 |
| `AGENTS.md` | 高强度个人工作流指令,配合 `power` profile 使用 |
## 安全边界
`safe` profile 适合新手和公共分发:
- 不自动信任任何本机项目路径。
- 不放开全盘读写和命令执行权限。
- 不关闭审批确认。
`power` profile 只适合完全可信的本地环境:
- 会写入 `sandbox_mode = "danger-full-access"`
- 会写入 `approval_policy = "never"`
- 会安装更强势的全局 `AGENTS.md`
如果你不确定该选哪个,使用默认 `safe`
## 本地仓库内安装
如果你已经 clone 本仓库,也可以在仓库根目录执行:
```bash
bash tools/config/.codex/install.sh
```
安装高权限版:
```bash
bash tools/config/.codex/install.sh --profile power
```
## 路径示例
Linux / WSL
- `~/.codex/config.toml`
- `~/.codex/AGENTS.md`
Windows 原生:
- `C:\Users\<你的用户名>\.codex\config.toml`
- `C:\Users\<你的用户名>\.codex\AGENTS.md`
如果你自己的 Codex Home 被改到了其它位置,请通过 `CODEX_HOME``--codex-home` 指定。
+47
View File
@@ -0,0 +1,47 @@
# ==================== Codex CLI 高权限基线 ====================
#
# 这个 profile 面向完全可信的本地机器和仓库:
# - sandbox_mode = "danger-full-access" 会放开文件系统和命令执行能力。
# - approval_policy = "never" 会减少确认弹窗,让 Agent 自动推进。
# - 不包含任何本机 projects 信任路径;请按需在本地 config.toml 中追加。
#
# 安装方式:
# bash install.sh --profile power
model = "gpt-5.5"
model_provider = "openai-http"
model_reasoning_effort = "xhigh"
sandbox_mode = "danger-full-access"
approval_policy = "never"
web_search = "live"
personality = "pragmatic"
startup_timeout_ms = 20000
[tui]
notifications = true
[tui.model_availability_nux]
"gpt-5.5" = 4
[features]
multi_agent = true
responses_websockets = false
responses_websockets_v2 = false
[model_providers.openai-http]
name = "OpenAI"
wire_api = "responses"
requires_openai_auth = true
supports_websockets = false
[notice]
hide_gpt5_1_migration_prompt = true
"hide_gpt-5.1-codex-max_migration_prompt" = true
hide_rate_limit_model_nudge = true
# 本地可信项目示例:
# [projects."/absolute/path/to/your/project"]
# trust_level = "trusted"
+11 -197
View File
@@ -1,223 +1,37 @@
# ==================== 基础配置 ====================
# ==================== Codex CLI 安全默认基线 ====================
#
# 这是公开分发默认配置:
# - 不包含本机 projects 信任路径。
# - 不设置 danger-full-access。
# - 不设置 approval_policy = "never"。
# - 适合新用户先跑通 Codex CLI,再按项目需要逐步放开权限。
#
# 需要更高权限时,请显式安装 config.power.toml
# bash install.sh --profile power
# 模型:
# - 这里填写 Codex CLI 支持的模型名(字符串)。
# - 建议写成你常用的默认模型,临时切换用命令行 `-m` 覆盖更合适。
# - 经验上:`*-codex` 更偏“写代码/改代码”,非 `*-codex` 更偏通用对话(以你实际使用体验为准)。
model = "gpt-5.5"
model_provider = "openai-http"
# 推理强度(思考深度):
# - low → 更快,适合“明确指令 + 小改动”
# - medium → 均衡,适合多数日常任务
# - high → 更深,适合复杂重构/疑难排障
# - xhigh → 最深,适合架构级设计/大范围推理(可能更慢)
# 注意:
# - 不同模型对选项支持范围可能不同;遇到报错优先降一档再试。
model_reasoning_effort = "xhigh"
# 运行策略
# sandbox_mode
# - 用来约束/放开文件系统、命令执行等能力(不同版本 Codex/运行器实现可能略有差异)。
# - `danger-full-access` 表示最大权限:可读写任意路径、可执行任意命令。
# - 仅在你明确知道自己在做什么、并且仓库/机器可信时使用。
sandbox_mode = "danger-full-access"
# approval_policy
# - 控制是否需要用户确认(例如写文件、跑命令等高影响操作)。
# - `never` 表示不再弹确认,自动执行。
# - 风险提示:如果你经常在不熟的目录/不可信脚本环境里使用,建议改成更保守的策略。
approval_policy = "never"
# web_search
# - 控制联网搜索能力策略(以你安装的 Codex CLI 版本为准)。
# - `live` 通常表示允许实时联网搜索(适用于需要最新信息的任务)。
model_reasoning_effort = "medium"
web_search = "live"
# 交互风格
# personality
# - 影响输出风格(例如更务实/更解释型等)。
personality = "pragmatic"
# 指令来源(可选,与 AGENTS.md 二选一)
# experimental_instructions_file
# - 指定一份“系统指令/长期提示词”文件路径。
# - 如果项目内已经用 `AGENTS.md` 管理行为准则,通常不需要再额外打开。
# experimental_instructions_file = "/home/lenovo/.codex/custom-instructions.md"
# ==================== MCP 默认配置 ====================
# startup_timeout_ms
# - MCPModel Context Protocol)服务器启动/握手的超时时间(毫秒)。
# - 如果你启用了某些 MCP(npx/node 启动慢),可以把这个值适当调大。
startup_timeout_ms = 20000
# ==================== UI 与提示 ====================
[tui]
# 是否在 TUI(终端 UI)里启用通知提示。
notifications = true
[tui.model_availability_nux]
"gpt-5.5" = 4
[features]
# Codex 里的 “subagent” 基本就是 Multi-agents(多代理/子线程)功能:主代理会按需 spawn 子代理并行干活,最后汇总结果。
multi_agent = true
# 禁用 Responses WebSocket 传输,只走 HTTPS/HTTP Responses。
responses_websockets = false
responses_websockets_v2 = false
[model_providers.openai-http]
# 自定义 provider 不能覆盖内置 openai,所以用新 ID 复制 OpenAI/Responses 语义并关闭 WebSocket 能力。
name = "OpenAI"
wire_api = "responses"
requires_openai_auth = true
supports_websockets = false
[notice]
# 这些开关用于隐藏某些“迁移/提示”类消息,减少噪音(仅影响 UI,不影响核心功能)。
hide_gpt5_1_migration_prompt = true
"hide_gpt-5.1-codex-max_migration_prompt" = true
hide_rate_limit_model_nudge = true
[notice.model_migrations]
# 模型迁移映射:
# - 当某些老模型名不可用/被迁移时,用这里的映射做自动替换。
# - 建议只保留你确实用得到的映射,避免未来产生“我没注意但被自动换了”的困惑。
"gpt-5.1-codex-max" = "gpt-5.2-codex"
"gpt-5.2" = "gpt-5.4"
# ==================== 本地模型 Profiles ====================
[profiles.ollama-gemma4]
# WSL 内部的 Codex CLI 通过 localhost 转发调用 Win11 Ollama。
# 该 provider 为 Codex CLI 0.125.0 内置本地 provider,默认访问 http://localhost:11434/v1。
model = "gemma4:31b"
model_provider = "ollama"
model_reasoning_effort = "medium"
[profiles.ollama-gemma4-262k]
# 基于 gemma4:31b 的派生模型,强制 Ollama 运行上下文为模型理论上限 262144。
# 注意:这是理论上限配置,显存/内存压力极高,Codex agent 实用性可能很差。
model = "gemma4-31b-262k"
model_provider = "ollama"
model_reasoning_effort = "medium"
[projects."/home/lenovo/.projects/cat/tradecat"]
trust_level = "trusted"
[projects."/home/lenovo/zip/vibe-coding-cn"]
trust_level = "trusted"
[projects."/mnt/c/Users/13208"]
trust_level = "trusted"
[projects."/home/lenovo"]
trust_level = "trusted"
[projects."/home/lenovo/.projects/cat/zip/tradecat-20260324"]
trust_level = "trusted"
[projects."/mnt/c/Users/13208/Downloads"]
trust_level = "trusted"
[projects."/home/lenovo/.projects/skill"]
trust_level = "trusted"
[projects."/mnt/d/.projects/研究/tasks+任务包"]
trust_level = "trusted"
[projects."/home/lenovo/.projects/cat/tradecat-public"]
trust_level = "trusted"
[projects."/mnt/d/.projects/研究/dataset-first"]
trust_level = "trusted"
[projects."/mnt/d/.projects/研究/女娲/raw/cz-skill"]
trust_level = "trusted"
[projects."/home/lenovo/.codex"]
trust_level = "trusted"
[projects."/mnt/d/.projects/研究/币安人生"]
trust_level = "trusted"
[projects."/mnt/d/.projects/XHS-Downloader"]
trust_level = "trusted"
[projects."/home/lenovo/.projects/cat/fatecat"]
trust_level = "trusted"
[projects."/home/lenovo/.projects/cat/predictcat"]
trust_level = "trusted"
[projects."/home/lenovo/.projects/cat"]
trust_level = "trusted"
[projects."/home/lenovo/.projects/cat/catkey"]
trust_level = "trusted"
[projects."/mnt/d/.projects/研究/raw/量化交易/交易猫开发实践"]
trust_level = "trusted"
[projects."/home/lenovo/.projects/vibe-coding-cn"]
trust_level = "trusted"
[projects."/mnt/c/Users/13208/Downloads/cdda-windows-with-graphics-and-sounds-x64-2026-05-02-1743"]
trust_level = "trusted"
# ==================== MCP Servers(示例,默认关闭) ====================
# 说明:
# - 下面这些块默认都注释掉,作为“可复制的模板”。
# - 启用方式:取消注释对应的 `[mcp_servers."name"]` 段,并按需修改 `command/args/cwd`。
# - 维护原则:宁可少开,按需启用;避免“全开导致启动慢/不稳定/难排障”。
# Context7 - 最新官方文档 MCP
# [mcp_servers."context7"]
# command = "npx"
# args = ["-y", "@upstash/context7-mcp@latest"]
# startup_timeout_ms = 20000
# # Completion Notifier - 完成声音提示
# [mcp_servers."completion-notifier"]
# command = "node"
# args = ["/home/lenovo/.codex/mcp-servers/completion-notifier/#index.js"]
# startup_timeout_ms = 20000
# chrome-devtools
# [mcp_servers."chrome-devtools"]
# command = "npx"
# args = ["-y", "chrome-devtools-mcp@latest"]
# startup_timeout_ms = 20000
# [mcp_servers."playwright"]
# command = "npx"
# args = ["-y", "@playwright/mcp@latest"]
# startup_timeout_ms = 20000
# [mcp_servers."puppeteer"]
# command = "npx"
# args = ["-y", "puppeteer-mcp-server"]
# startup_timeout_ms = 20000
# [mcp_servers."n8n"]
# command = "npx"
# args = ["-y", "n8n-mcp@latest"]
# startup_timeout_ms = 20000
# [mcp_servers."maverick"]
# command = "npx"
# args = ["-y", "mcp-remote", "http://localhost:8003/sse/"]
# cwd = "/home/lenovo/maverick-mcp"
# startup_timeout_ms = 20000
# [mcp_servers."happy"]
# command = "happy"
# args = ["codex"]
# startup_timeout_ms = 20000
# Augment - 代码库检索 MCP
# [mcp_servers."auggie-mcp"]
# command = "auggie"
# args = ["-w", "/mnt/c/Users/lenovo", "--mcp"]
# startup_timeout_ms = 200000
+206
View File
@@ -0,0 +1,206 @@
#!/usr/bin/env bash
set -euo pipefail
RAW_BASE_DEFAULT="https://raw.githubusercontent.com/tukuaiai/vibe-coding-cn/develop/tools/config/.codex"
RAW_BASE="${VIBE_CODING_CODEX_RAW_BASE:-$RAW_BASE_DEFAULT}"
CODEX_HOME="${CODEX_HOME:-$HOME/.codex}"
PROFILE="safe"
DRY_RUN="0"
RESTORE_LATEST="0"
usage() {
cat <<'USAGE'
Install vibe-coding-cn Codex CLI config with backup and rollback.
Usage:
install.sh [--profile safe|power] [--codex-home PATH] [--restore-latest] [--dry-run]
Profiles:
safe Public default. No danger-full-access, no approval_policy=never.
power High-permission local profile. Requires a fully trusted machine/repo.
Environment:
CODEX_HOME Target Codex home. Default: ~/.codex
VIBE_CODING_CODEX_RAW_BASE Source base URL or local directory for assets.
Examples:
curl -fsSL https://raw.githubusercontent.com/tukuaiai/vibe-coding-cn/develop/tools/config/.codex/install.sh | bash
curl -fsSL https://raw.githubusercontent.com/tukuaiai/vibe-coding-cn/develop/tools/config/.codex/install.sh | bash -s -- --profile power
bash ~/.codex/backups/vibe-coding-cn/LATEST/restore.sh
USAGE
}
log() {
printf '[vibe-coding-cn codex] %s\n' "$*"
}
die() {
printf '[vibe-coding-cn codex] ERROR: %s\n' "$*" >&2
exit 1
}
while [ "$#" -gt 0 ]; do
case "$1" in
--profile)
[ "$#" -ge 2 ] || die "--profile requires safe or power"
PROFILE="$2"
shift 2
;;
--codex-home)
[ "$#" -ge 2 ] || die "--codex-home requires a path"
CODEX_HOME="$2"
shift 2
;;
--restore-latest)
RESTORE_LATEST="1"
shift
;;
--dry-run)
DRY_RUN="1"
shift
;;
-h|--help)
usage
exit 0
;;
*)
die "unknown argument: $1"
;;
esac
done
case "$PROFILE" in
safe)
SOURCE_CONFIG="config.toml"
SOURCE_AGENTS="AGENTS.safe.md"
;;
power)
SOURCE_CONFIG="config.power.toml"
SOURCE_AGENTS="AGENTS.md"
;;
*)
die "unsupported profile: $PROFILE"
;;
esac
CODEX_HOME="${CODEX_HOME/#\~/$HOME}"
BACKUP_ROOT="$CODEX_HOME/backups/vibe-coding-cn"
LATEST_LINK="$BACKUP_ROOT/LATEST"
restore_latest() {
[ -e "$LATEST_LINK/restore.sh" ] || die "missing latest restore script: $LATEST_LINK/restore.sh"
log "restoring latest backup from $LATEST_LINK"
bash "$LATEST_LINK/restore.sh"
}
if [ "$RESTORE_LATEST" = "1" ]; then
restore_latest
exit 0
fi
fetch_asset() {
local name="$1"
local out="$2"
if [ -d "$RAW_BASE" ]; then
cp "$RAW_BASE/$name" "$out"
else
command -v curl >/dev/null 2>&1 || die "curl is required when RAW_BASE is remote"
curl -fsSL "$RAW_BASE/$name" -o "$out"
fi
}
backup_one() {
local name="$1"
local src="$CODEX_HOME/$name"
local dst="$BACKUP_DIR/$name"
if [ -f "$src" ]; then
cp "$src" "$dst"
else
: > "$BACKUP_DIR/.missing-$name"
fi
}
write_restore_script() {
local codex_home_q backup_dir_q
printf -v codex_home_q '%q' "$CODEX_HOME"
printf -v backup_dir_q '%q' "$BACKUP_DIR"
cat > "$BACKUP_DIR/restore.sh" <<RESTORE
#!/usr/bin/env bash
set -euo pipefail
CODEX_HOME=$codex_home_q
BACKUP_DIR=$backup_dir_q
restore_file() {
local name="\$1"
mkdir -p "\$CODEX_HOME"
if [ -f "\$BACKUP_DIR/\$name" ]; then
cp "\$BACKUP_DIR/\$name" "\$CODEX_HOME/\$name"
printf '[vibe-coding-cn codex] restored %s\n' "\$CODEX_HOME/\$name"
elif [ -f "\$BACKUP_DIR/.missing-\$name" ]; then
rm -f "\$CODEX_HOME/\$name"
printf '[vibe-coding-cn codex] removed %s because it did not exist before install\n' "\$CODEX_HOME/\$name"
else
printf '[vibe-coding-cn codex] skip %s: no backup marker\n' "\$name"
fi
}
restore_file config.toml
restore_file AGENTS.md
RESTORE
chmod +x "$BACKUP_DIR/restore.sh"
}
install_one() {
local src="$1"
local name="$2"
install -m 600 "$src" "$CODEX_HOME/$name"
log "installed $CODEX_HOME/$name"
}
TIMESTAMP="$(date +%Y%m%d-%H%M%S)"
BACKUP_DIR="$BACKUP_ROOT/$TIMESTAMP"
TMP_DIR="$(mktemp -d)"
trap 'rm -rf "$TMP_DIR"' EXIT
log "profile=$PROFILE"
log "source=$RAW_BASE"
log "codex_home=$CODEX_HOME"
if [ "$DRY_RUN" = "1" ]; then
log "dry run only; no files will be changed"
exit 0
fi
mkdir -p "$CODEX_HOME" "$BACKUP_DIR"
backup_one config.toml
backup_one AGENTS.md
write_restore_script
cat > "$BACKUP_DIR/MANIFEST.txt" <<MANIFEST
profile=$PROFILE
source=$RAW_BASE
codex_home=$CODEX_HOME
created_at=$TIMESTAMP
restore=$BACKUP_DIR/restore.sh
MANIFEST
rm -rf "$LATEST_LINK"
if ! ln -s "$BACKUP_DIR" "$LATEST_LINK" 2>/dev/null; then
mkdir -p "$LATEST_LINK"
cp "$BACKUP_DIR/restore.sh" "$LATEST_LINK/restore.sh"
printf '%s\n' "$BACKUP_DIR" > "$LATEST_LINK/BACKUP_DIR"
fi
fetch_asset "$SOURCE_CONFIG" "$TMP_DIR/config.toml"
fetch_asset "$SOURCE_AGENTS" "$TMP_DIR/AGENTS.md"
install_one "$TMP_DIR/config.toml" config.toml
install_one "$TMP_DIR/AGENTS.md" AGENTS.md
log "backup saved: $BACKUP_DIR"
log "restore command: bash $BACKUP_DIR/restore.sh"
log "latest restore command: bash $LATEST_LINK/restore.sh"
+2
View File
@@ -7,6 +7,8 @@
- 配置文件必须是可公开审查的模板或基线,不得包含真实密钥。
- 本机专用配置应放在用户本地目录,不直接提交到仓库。
- 修改 Codex 配置时,同步更新 `tools/config/.codex/README.md` 和相关 getting-started 文档。
- 公开默认配置不得包含本机 `projects` 信任路径;高权限配置必须显式标注风险并通过独立 profile 安装。
- 一键安装脚本必须先备份用户现有配置,并提供恢复脚本。
## 验证
+1 -1
View File
@@ -6,4 +6,4 @@
- 配置位置:`tools/config/.codex/`
- 使用说明:`tools/config/.codex/README.md`
- 一键安装:支持安全默认配置、高权限配置、安装前备份和恢复脚本。