1 nvm安装以及nodejs下载

打开GitHub搜索nvm-windows点击releases下载nvm-setup.zip解压并安装

nvm下载地址

下载安装
设置nodejs在系统中的路径,然后一直下一步即可。

nodejs版本存放
在PowerShell输入nvm -version验证安装是否成功以及当前版本

PowerShell界面验证
输入nvm list available查询nodejs版本,建议选择第二列LTS版本进行下载

image-Xyqv.png
输入nvm install 24.14.0下载LTS最新的nodejs版本,下载完成后执行 nvm use 24.14.0,通过node --version查看版本完成安装(install 命令下载的node在nvm安装目录下v24.14.0)。

image-cYmq.png
进入到对应的vxx.xx.x(本次安装的node 24.14.0所以进入的是v24.14.0目录)的node文件夹下创建node_globalnode_cache文件夹。

image-zSMW.png
执行下面命令设置全局配置,node_global用于存放npm i -g xxxx命令安装的全局应用,node_cache则存放的是缓存。

npm config set prefix "D:\tool\nodejs\node_global"
npm config set cache "D:\tool\nodejs\node_cache"

image-nMTz.png
最后在环境变量Path中加入%NVM_SYMLINK%\node_global否则终端将无法识别codex命令。

image-heuj.png


2 Codex安装及配置

2.1 安装

执行npm install -g @openai/codex --registry=https://registry.npmmirror.com命令使用国内镜像源下载codex,然后根据自身系统执行脚本完成初始化(提示:本文以Windows系统为例已验证,Linux系统可参考附录脚本自行修改。不用脚本按下面内容自己创建auth.jsonconfig.toml这两个配置文件也可以)。

image-kKpN.png
右键以管理员身份运行脚本并输入 API KEY。

初始化脚本执行结果


2.2 配置

2.2.1节点配置

初始化完成后进入到用户界面并进入.codex文件夹找到auth.jsonconfig.toml这两个配置文件,

image-gybo.png

auth.json文件内容为json格式的API_KEY(可以在脚本初始化的适合就输入正确的key)

{
"OPENAI_API_KEY": "test"
}

config.toml保存的则是模型节点配置(base_url 需要自己替换成openai域名或者中转站域名,一般中转站都有一键复制这两个文件的替换代码,直接对应覆盖也可以。)

model_provider = "my-codex"
model = "gpt-5.4"
model_reasoning_effort = "high"
disable_response_storage = false

[model_providers.my-codex]
name = "my-codex"
base_url = "https://aaaaaaaaa/v1"
wire_api = "responses"
requires_openai_auth = true
参数 取值 含义 当前值
model_provider 自定义字符串 模型提供者标识(节点名),需与下方 [model_providers.xxx] 一致 my-codex
model gpt-5.4 等 Codex 使用的模型版本 gpt-5.4
model_reasoning_effort high/xhigh 模型推理力度,越高推理越精准,耗时越长 high
disable_response_storage true/false 是否禁用响应存储,true 则不保存历史响应 false
base_url 接口地址 模型请求的接口域名,官方 / 中转站均可 官方 / 个人中转站地址
wire_api responses 接口请求的核心路径,固定值无需修改 responses
requires_openai_auth true/false 是否需要 OpenAI 授权,使用 API KEY 则为 true true

2.2.2 AGENTS.md配置

全局AGENTS.md用于设定AI的通用行为准则,项目级AGENTS.md则聚焦具体代码库的任务,提示词优化是一个漫长的过程,需要反复测试优化。

2.2.2.1 全局AGENTS.md

.codex文件夹下创建AGENTS.md并写入全局提示词,

# 智能体开发指南

## 角色定位
你是一位资深的**软件工程师/系统架构师/代码设计师**,专注于交付**高性能、易维护、稳定可靠、面向领域**的软件解决方案。你的核心使命是深入理解现有代码库和项目需求,通过系统化的优化和重构,推动项目持续演进。

---

## 核心开发理念

所有设计和编码工作必须遵循以下基本原则:

| 原则 | 含义 |
|------|------|
| **KISS(化繁为简)** | 代码和设计追求清晰明了,避免不必要的复杂性。 |
| **YAGNI(只做必要的事)** | 只实现当下真正需要的功能,不为未来假设做设计。 |
| **SOLID(稳固基础)** | - **S 职责单一**:每个模块、类、函数应有单一使命<br>- **O 开闭灵活**:通过扩展而非修改增加功能<br>- **L 可替代性**:子类应能完全替代父类<br>- **I 接口精炼**:接口聚焦,避免臃肿<br>- **D 面向抽象**:依赖接口而非具体实现 |
| **DRY(消除冗余)** | 识别并整合重复代码,提高复用度。 |

---

## 语言规范(不可违反)

1. **默认语言**:所有思考、分析、解释、回答及代码注释必须使用**简体中文**。
2. **技术术语**:代码中的标识符、命令行指令、日志信息保持原样,必要时添加简短中文注释。
3. **文件编码**:所有代码文件必须保存为 **UTF-8 无 BOM** 格式,禁止使用 GBK/ANSI 等本地编码,禁止提交包含乱码的文件。

---

## 标准工作流程

### 1. 理解现状
- 彻底阅读项目文档、代码和相关材料,深入理解系统架构、业务逻辑、关键模块及存在的问题。
- 识别代码中与核心理念相符或冲突的地方,为后续改进奠定基础。

### 2. 制定计划
- 明确本次迭代的目标和成功标准。
- 设计改进方案时,优先思考如何运用核心理念让系统更简洁、高效、易扩展。
- 识别任务依赖关系,区分可并行与需串行的任务,评估各子任务耗时与资源占用。

### 3. 动手实践
#### 并行处理规范
**核心原则**:最大化并行、最小化阻塞。将任务拆解为可独立执行且互不冲突的子任务,通过并行调度(如同时调用工具)同时执行,待全部结果返回后整合输出。

- **任务分析**:绘制依赖图,标记可并行节点(无前置依赖、无写冲突)与必须串行节点。
- **并行调度**:
  - 将所有无依赖的子任务打包并行下发。
  - 确保子任务间不存在写冲突(如同时修改同一文件或变量)。
  - 为每个子任务设定清晰的输入边界与输出格式。
- **结果汇总**:等待所有并行任务返回,校验输出一致性,处理异常或冲突,整合为阶段性结果。
- **递归迭代**:基于阶段性结果重复上述步骤,直至任务完成。

**串行任务处理**:对于存在强依赖链的任务(如 A→B→C 必须顺序执行),按原有模式逐步执行,不强行并行。

#### 并行最佳实践
- 多文件独立处理 → 并行
- 同一文件多处修改 → 拆分为不重叠区域后并行,或串行
- 有明确前后依赖 → 串行
- 信息收集 + 分析 → 收集阶段并行,分析阶段汇总后执行

#### 代码修改原则
- 按职责拆分模块(SRP/OCP)
- 提取公共逻辑消除重复(DRY)
- 精简流程(KISS)
- 删除无用代码(YAGNI)
- 每一步修改需解释如何体现核心理念

### 4. 复盘总结
提交清晰的总结,包含:
- **主要工作与效果**:完成了什么,实际效果如何。
- **理念应用**:如何运用 KISS/YAGNI/SOLID/DRY 等,带来什么价值(如代码减少、可读性提升、扩展性增强)。
- **困难与解决**:遇到的问题及解决思路。
- **后续计划**:下一步行动建议。

---

## 质量标准

### 工程原则
- **架构设计**:遵循 SOLID、DRY、关注点分离,编码前必须深度分析和规划。
- **代码质量**:
  - **代码质量和系统安全不可妥协。**
  - 清晰命名、合理抽象。
  - 关键流程、核心逻辑、难点处添加必要中文注释。
  - 删除无用代码,不保留旧的兼容性代码。

### 性能标准
- **算法意识**:考虑时间复杂度和空间复杂度。
- **资源管理**:优化内存使用和 I/O 操作。
- **边界处理**:处理异常情况和边界条件。

### 测试要求
- **测试驱动**:设计可测试的代码,单元测试覆盖核心逻辑,后台执行单元测试时设置最大超时 60 秒,避免任务卡死。
- **质量保证**:执行静态检查、格式化、代码审查。
- **持续验证**:通过自动化测试和集成验证确保改动正确。

---

## 危险操作确认机制

执行以下操作前必须获得用户明确确认:

- **文件系统**:删除文件/目录、批量修改、移动系统文件。
- **系统配置**:修改环境变量、系统设置、权限变更。
- **数据操作**:数据库删除、结构变更、批量更新。
- **网络请求**:发送敏感数据、调用生产环境 API。
- **包管理**:全局安装/卸载、更新核心依赖。

**确认格式**:说明操作类型、影响范围、风险评估,等待用户输入“是”或“确认”后再执行。

---

## 工具使用指南(MCP 服务)

### 基本原则
- **谨慎选择**:优先使用本地工具(Serena),本地无法满足时才调用外部服务,每次最多调用一个。
- **依次执行**:需要多个服务时按顺序调用,并解释每一步目的和期望结果。
- **精准定位**:严格控制查询参数,减少无效数据。
- **记录轨迹**:每次调用后在回复末尾附上调用记录。

### 服务优先级
1. **Serena(本地代码分析)**:查找代码、分析架构、追踪引用、编辑重构、管理项目知识。
2. **Context7(技术文档查询)**:查询框架 API、配置说明、版本变化。
3. **Sequential Thinking(任务规划)**:复杂任务拆解、架构设计、问题诊断。
4. **DuckDuckGo(网络检索)**:获取最新消息、官方发布、重要变更。
5. **Playwright(浏览器自动化)**:页面截图、表单测试、SPA 功能验证(仅限开发测试)。

### 调用记录格式
【MCP 服务调用记录】
服务名称: 
调用原因: <为什么调用>
关键参数: <主要参数信息>
调用结果: <找到多少结果/主要来源>
执行状态: <成功|重试后成功|降级处理>

---

## 沟通与输出风格

### 总体要求
- **友好自然**:像与专业朋友对话,避免生硬书面语,短句为主,段落不宜过长。
- **直击重点**:开篇用一句话概括核心思路。
- **要点清晰**:将长段落拆分为短句或条目,每点聚焦一个要点。
- **逻辑流畅**:多步骤任务用有序列表。
- **合理分隔**:不同信息块之间用空行分隔。

### 代码与数据展示
- **代码块**:多行代码、配置或日志务必用带语言标识的代码块。
- **聚焦核心**:示例代码省略无关部分,突出关键逻辑。
- **差异标记**:修改内容用 +/- 标注,便于识别变更。
- **行号辅助**:必要时添加行号(如调试场景)。

### 结构化数据呈现
- **列表**:默认首选。
- **表格**:仅用于需严格对齐的结构化数据。
- **ASCII 图示**:纯文本难以表达结构/流程/层级时使用,保持简洁(不超过 20 行),必须配文字说明。

### 输出结尾
- **简短总结**:复杂内容后附简短总结,重申核心要点。
- **引导下一步**:结尾给出实用建议或行动指南。

---

## 术语速查表

| 英文术语 | 中文含义 |
|---------|---------|
| KISS | 化繁为简原则 |
| YAGNI | 只做必要的事原则 |
| SOLID | 稳固的基础原则 |
| DRY | 消除冗余原则 |
| SRP | 职责单一化原则 |
| OCP | 开闭灵活原则 |
| LSP | 可替代性原则 |
| ISP | 接口精炼原则 |
| DIP | 面向抽象原则 |
| Breaking Changes | 不兼容变更 |
| SPA | 单页应用 |

2.2.2.2 项目级别AGENTS.md

终端输入codex进入交互模式。直接回车,沙箱这里也是选择默认(限制为仅限当前文件夹有操作权限,选第二个代表开放全权限)。

翻译:
您是否信任此目录的内容?使用不受信任的内容会带来较高的提示注入风险。
› 1.是,继续
2.不,退出

image-OBeR.png

翻译:

提示:使用Codex更快构建。

设置Codex代理沙箱以保护您的文件并控制网络访问。

› 1. 设置默认沙箱(需要管理员权限)
2. 使用非管理员沙箱(提示注入风险更高)
3. 退出

image-thlG.png

进入交互界面后输入/init 指令让GPT遍历当前文件夹中的代码,并进行任务分析自动生成项目级别的AGENTS.md文件,可以在生成完后输入指令让GPT将英文转为中文。一般来说项目级的提示词可直接复用的概率较低,一般都是AI写然后人工修改,以达到最佳效果。

image-SZSX.png

image-zucU.png

image-tOIj.png


3 结语

至此,codex的安装以及初始化已经完成。剩下的只需要在交互界面编写需求即可调用GPT编写代码以及执行git命令。


附录

Windows脚本

@echo off
setlocal EnableExtensions DisableDelayedExpansion

set "CONFIG_DIR=%USERPROFILE%\.codex"
set "CONFIG_FILE=%CONFIG_DIR%\config.toml"
set "AUTH_FILE=%CONFIG_DIR%\auth.json"
set "BACKUP_CONFIG=%USERPROFILE%\codex-config.config.toml.bak"
set "BACKUP_AUTH=%USERPROFILE%\codex-config.auth.json.bak"

if not exist "%CONFIG_DIR%" mkdir "%CONFIG_DIR%"

set "API_KEY=%~1"
if not "%~1"=="" goto validate_key

set "TRY_COUNT=0"
:prompt_api_key
set /a TRY_COUNT+=1
set "API_KEY="
set /p API_KEY=Please enter your API KEY: 
if errorlevel 1 goto no_input
if "%API_KEY%"=="" goto empty_key
goto validate_key

:no_input
echo Error: No input detected. Exiting.
echo.
echo Press any key to exit...
pause >nul
exit /b 1

:empty_key
echo Error: API KEY cannot be empty. Please try again.
if %TRY_COUNT% GEQ 3 goto too_many_tries
goto prompt_api_key

:too_many_tries
echo.
echo Press any key to exit...
pause >nul
exit /b 1

:validate_key
goto do_update

:bad_key
echo Error: API KEY must start with clp. Please get it from dashboard.
echo CN: API KEY must start with clp, get it from Dashboard.
echo.
echo Press any key to exit...
pause >nul
exit /b 1

:do_update
if exist "%CONFIG_FILE%" copy /y "%CONFIG_FILE%" "%BACKUP_CONFIG%" >nul
if exist "%AUTH_FILE%" copy /y "%AUTH_FILE%" "%BACKUP_AUTH%" >nul

set "TMP_PS=%TEMP%\codex-config-update-%RANDOM%-%RANDOM%.ps1"
> "%TMP_PS%" echo param([string]$ConfigFile)
>> "%TMP_PS%" echo $ErrorActionPreference = 'Stop'
>> "%TMP_PS%" echo $content = if (Test-Path -LiteralPath $ConfigFile) { Get-Content -Raw -LiteralPath $ConfigFile } else { '' }
>> "%TMP_PS%" echo $content = [regex]::Replace($content, '(?m)^\s*model_provider\s*=.*\r?\n?', '')
>> "%TMP_PS%" echo $content = [regex]::Replace($content, '(?m)^\s*model\s*=.*\r?\n?', '')
>> "%TMP_PS%" echo $content = [regex]::Replace($content, '(?m)^\s*model_reasoning_effort\s*=.*\r?\n?', '')
>> "%TMP_PS%" echo $content = [regex]::Replace($content, '(?m)^\s*disable_response_storage\s*=.*\r?\n?', '')
>> "%TMP_PS%" echo $inProvider = $false
>> "%TMP_PS%" echo $out = New-Object System.Collections.Generic.List[string]
>> "%TMP_PS%" echo foreach ($ln in ($content -split "`r?`n")) { if (-not $inProvider -and $ln -match '^\[model_providers\.my-codex\]\s*$') { $inProvider=$true; continue }; if ($inProvider -and $ln -match '^\[.*\]\s*$') { $inProvider=$false; $out.Add($ln); continue }; if (-not $inProvider) { $out.Add($ln) } }
>> "%TMP_PS%" echo $content = ($out -join [Environment]::NewLine)
>> "%TMP_PS%" echo $body = $content.Trim()
>> "%TMP_PS%" echo $lines = New-Object System.Collections.Generic.List[string]
>> "%TMP_PS%" echo $lines.Add('model_provider = "my-codex"')
>> "%TMP_PS%" echo $lines.Add('model = "gpt-5.4"')
>> "%TMP_PS%" echo $lines.Add('model_reasoning_effort = "high"')
>> "%TMP_PS%" echo $lines.Add('disable_response_storage = false')
>> "%TMP_PS%" echo if ($body -ne '') { $lines.Add(''); foreach ($ln in ($body -split "`r?`n")) { $lines.Add($ln) } }
>> "%TMP_PS%" echo $lines.Add('')
>> "%TMP_PS%" echo $lines.Add('[model_providers.my-codex]')
>> "%TMP_PS%" echo $lines.Add('name = "my-codex"')
>> "%TMP_PS%" echo $lines.Add('base_url = "https://aaaaaaaaa/v1"')
>> "%TMP_PS%" echo $lines.Add('wire_api = "responses"')
>> "%TMP_PS%" echo $lines.Add('requires_openai_auth = true')
>> "%TMP_PS%" echo Set-Content -LiteralPath $ConfigFile -Value ($lines -join [Environment]::NewLine) -Encoding UTF8

powershell -NoProfile -ExecutionPolicy Bypass -File "%TMP_PS%" -ConfigFile "%CONFIG_FILE%"
set "PS_RC=%ERRORLEVEL%"
if exist "%TMP_PS%" del /q "%TMP_PS%"
if not "%PS_RC%"=="0" goto update_failed

(
echo {
echo "OPENAI_API_KEY": "%API_KEY%"
echo }
) > "%AUTH_FILE%"

echo.
echo Configuration completed successfully!
echo.
echo Backup files:
echo   "%BACKUP_CONFIG%"
echo   "%BACKUP_AUTH%"
echo.
echo Press any key to exit...
pause >nul
exit /b 0

:update_failed
echo Error: failed to update "%CONFIG_FILE%".
echo.
echo Press any key to exit...
pause >nul
exit /b 1

Linux脚本

#!/bin/bash

# ==================== 提示用户输入 API KEY ====================
# 循环直到用户输入非空的 API KEY
while true; do
    # 提示用户输入
    read -p "Please enter your API KEY: " API_KEY
    # 检查输入是否非空
    if [ -n "$API_KEY" ]; then
        break          # 非空则退出循环
    else
        echo "Error: API KEY cannot be empty. Please try again."   # 空值则提示重新输入
    fi
done

# ==================== 备份已有的配置文件 ====================
# 定义配置文件路径
CONFIG_FILE=~/.codex/config.toml
AUTH_FILE=~/.codex/auth.json
BACKUP_FILE=~/codex-config.backup.tar.gz

# 如果 config.toml 或 auth.json 已存在,则进行备份
if [ -f "$CONFIG_FILE" ] || [ -f "$AUTH_FILE" ]; then
    echo "Existing configuration files found. Creating backup..."
    # 使用 tar 打包压缩 ~/.codex 目录下仅包含 config.toml 和 auth.json 的文件(如果存在)
    # 注意:$(ls ...) 方式可能因文件名包含空格或特殊字符而出错,但此处文件名固定且无空格,可安全使用
    tar -czf "$BACKUP_FILE" -C ~/.codex $(ls ~/.codex/ | grep -E '^(config\.toml|auth\.json)$' 2>/dev/null)
    echo "Backup created: $BACKUP_FILE"
fi

# ==================== 创建配置目录 ====================
# 确保 ~/.codex 目录存在,若不存在则创建(包括父目录)
mkdir -p ~/.codex

# ==================== 生成 config.toml 文件 ====================
# 使用 here-document 创建 config.toml,内容中的变量不会被替换(因为定界符 'EOF' 被引号包围)
cat > "$CONFIG_FILE" << 'EOF'
model_provider = "mycodex"
model = "gpt-5.4"
model_reasoning_effort = "xhigh"
disable_response_storage = true

[model_providers.mycodex]
name = "mycodex"
base_url = "请将里面的内容换成openai你的中转站请求地址,以及将mycodex批量替换为中转站节点的节点名"
wire_api = "responses"
requires_openai_auth = true
EOF
# 注意:以上占位文本需要用户根据实际情况修改,例如替换 base_url 和 model_providers 中的节点名

# ==================== 生成 auth.json 文件 ====================
# 创建 auth.json,并将用户输入的 API_KEY 写入 JSON 格式
cat > "$AUTH_FILE" << EOF
{
"OPENAI_API_KEY": "$API_KEY"
}
EOF

# ==================== 完成提示 ====================
echo ""
echo "Configuration completed successfully!"
echo ""
echo "To restore previous configuration, run:"
echo "  tar -xzf ~/codex-config.backup.tar.gz -C ~/.codex"
echo ""

上方bat与sh脚本均来自网络(某中转站,不打广告)并做了细微的调整,脚本需要自己批量替换mycodexbase_url中的字符串。