// Execute Codex CLI for code analysis, refactoring, and automated code changes. Use when you need to delegate complex code tasks to Codex AI with file references (@syntax) and structured output.
| name | codex |
| description | Execute Codex CLI for code analysis, refactoring, and automated code changes. Use when you need to delegate complex code tasks to Codex AI with file references (@syntax) and structured output. |
Execute Codex CLI commands and parse structured JSON responses. Supports file references via @ syntax, multiple models, and sandbox controls.
Codex is the primary execution method for all code edits and tests. Direct execution is only permitted when:
When falling back to direct execution:
CODEX_FALLBACK with the reasonMandatory: Run every automated invocation through the Bash tool in the foreground with HEREDOC syntax to avoid shell quoting issues, keeping the timeout parameter fixed at 7200000 milliseconds (do not change it or use any other entry point).
codex-wrapper - [working_dir] <<'EOF'
<task content here>
EOF
Why HEREDOC? Tasks often contain code blocks, nested quotes, shell metacharacters ($, `, \), and multiline text. HEREDOC (Here Document) syntax passes these safely without shell interpretation, eliminating quote-escaping nightmares.
Foreground only (no background/BashOutput): Never set background: true, never accept Claude's "Running in the background" mode, and avoid BashOutput streaming loops. Keep a single foreground Bash call per Codex task; if work might be long, split it into smaller foreground runs instead of offloading to background execution.
Simple tasks (backward compatibility): For simple single-line tasks without special characters, you can still use direct quoting:
codex-wrapper "simple task here" [working_dir]
Resume a session with HEREDOC:
codex-wrapper resume <session_id> - [working_dir] <<'EOF'
<task content>
EOF
Cross-platform notes:
<<'EOF' (single quotes prevent variable expansion)@' and '@ (here-string syntax)
codex-wrapper - @'
task content
'@
export CODEX_TIMEOUT=3600000 for 1 hourCODEX_TIMEOUT environment variable (in milliseconds, e.g., CODEX_TIMEOUT=3600000 for 1 hour)timeout: 7200000 parameter for double protectiontask (required): Task description, supports @file referencesworking_dir (optional): Working directory (default: current)Extracts agent_message from Codex JSON stream and appends session ID:
Agent response text here...
---
SESSION_ID: 019a7247-ac9d-71f3-89e2-a823dbd8fd14
Error format (stderr):
ERROR: Error message
Return only the final agent message and session ID—do not paste raw BashOutput logs or background-task chatter into the conversation.
All automated executions must use HEREDOC syntax through the Bash tool in the foreground, with timeout fixed at 7200000 (non-negotiable):
Bash tool parameters:
- command: codex-wrapper - [working_dir] <<'EOF'
<task content>
EOF
- timeout: 7200000
- description: <brief description of the task>
Run every call in the foreground—never append & to background it—so logs and errors stay visible for timely interruption or diagnosis.
Important: Use HEREDOC (<<'EOF') for all but the simplest tasks. This prevents shell interpretation of quotes, variables, and special characters.
Basic code analysis:
# Recommended: with HEREDOC (handles any special characters)
codex-wrapper - <<'EOF'
explain @src/main.ts
EOF
# timeout: 7200000
# Alternative: simple direct quoting (if task is simple)
codex-wrapper "explain @src/main.ts"
Refactoring with multiline instructions:
codex-wrapper - <<'EOF'
refactor @src/utils for performance:
- Extract duplicate code into helpers
- Use memoization for expensive calculations
- Add inline comments for non-obvious logic
EOF
# timeout: 7200000
Multi-file analysis:
codex-wrapper - "/path/to/project" <<'EOF'
analyze @. and find security issues:
1. Check for SQL injection vulnerabilities
2. Identify XSS risks in templates
3. Review authentication/authorization logic
4. Flag hardcoded credentials or secrets
EOF
# timeout: 7200000
Resume previous session:
# First session
codex-wrapper - <<'EOF'
add comments to @utils.js explaining the caching logic
EOF
# Output includes: SESSION_ID: 019a7247-ac9d-71f3-89e2-a823dbd8fd14
# Continue the conversation with more context
codex-wrapper resume 019a7247-ac9d-71f3-89e2-a823dbd8fd14 - <<'EOF'
now add TypeScript type hints and handle edge cases where cache is null
EOF
# timeout: 7200000
Task with code snippets and special characters:
codex-wrapper - <<'EOF'
Fix the bug in @app.js where the regex /\d+/ doesn't match "123"
The current code is:
const re = /\d+/;
if (re.test(input)) { ... }
Add proper escaping and handle $variables correctly.
EOF
Important:
--parallelonly reads task definitions from stdin.- It does not accept extra command-line arguments (no inline
workdir,task, or other params).- Put all task metadata and content in stdin; nothing belongs after
--parallelon the command line.
Correct vs Incorrect Usage
Correct:
# Option 1: file redirection
codex-wrapper --parallel < tasks.txt
# Option 2: heredoc (recommended for multiple tasks)
codex-wrapper --parallel <<'EOF'
---TASK---
id: task1
workdir: /path/to/dir
---CONTENT---
task content
EOF
# Option 3: pipe
echo "---TASK---..." | codex-wrapper --parallel
Incorrect (will trigger shell parsing errors):
# Bad: no extra args allowed after --parallel
codex-wrapper --parallel - /path/to/dir <<'EOF'
...
EOF
# Bad: --parallel does not take a task argument
codex-wrapper --parallel "task description"
# Bad: workdir must live inside the task config
codex-wrapper --parallel /path/to/dir < tasks.txt
For multiple independent or dependent tasks, use --parallel mode with delimiter format:
Typical Workflow (analyze → implement → test, chained in a single parallel call):
codex-wrapper --parallel <<'EOF'
---TASK---
id: analyze_1732876800
workdir: /home/user/project
---CONTENT---
analyze @spec.md and summarize API and UI requirements
---TASK---
id: implement_1732876801
workdir: /home/user/project
dependencies: analyze_1732876800
---CONTENT---
implement features from analyze_1732876800 summary in backend @services and frontend @ui
---TASK---
id: test_1732876802
workdir: /home/user/project
dependencies: implement_1732876801
---CONTENT---
add and run regression tests covering the new endpoints and UI flows
EOF
A single codex-wrapper --parallel call schedules all three stages concurrently, using dependencies to enforce sequential ordering without multiple invocations.
codex-wrapper --parallel <<'EOF'
---TASK---
id: backend_1732876800
workdir: /home/user/project/backend
---CONTENT---
implement /api/orders endpoints with validation and pagination
---TASK---
id: frontend_1732876801
workdir: /home/user/project/frontend
---CONTENT---
build Orders page consuming /api/orders with loading/error states
---TASK---
id: tests_1732876802
workdir: /home/user/project/tests
dependencies: backend_1732876800, frontend_1732876801
---CONTENT---
run API contract tests and UI smoke tests (waits for backend+frontend)
EOF
Delimiter Format:
---TASK---: Starts a new task blockid: <task-id>: Required, unique task identifier
<feature>_<timestamp> format (e.g., auth_1732876800, api_test_1732876801)workdir: <path>: Optional, working directory (default: .)
/home/user/project/backend)workdir as a CLI argument to --parallelworkdir when different directories are neededdependencies: <id1>, <id2>: Optional, comma-separated task IDssession_id: <uuid>: Optional, resume a previous session---CONTENT---: Separates metadata from task contentDependencies Best Practices
codex-wrapper --parallel call, chaining them via dependencies, rather than running analysis first and then launching implementation separately.<action>_<timestamp> format (e.g., analyze_1732876800, implement_1732876801), where action names map to features/stages and timestamps ensure uniqueness and sortability.Resume Failed Tasks:
# Use session_id from previous output to resume
codex-wrapper --parallel <<'EOF'
---TASK---
id: T2
session_id: 019xxx-previous-session-id
---CONTENT---
fix the previous error and retry
EOF
Output: Human-readable text format
=== Parallel Execution Summary ===
Total: 3 | Success: 2 | Failed: 1
--- Task: T1 ---
Status: SUCCESS
Session: 019xxx
Task output message...
--- Task: T2 ---
Status: FAILED (exit code 1)
Error: some error message
Features:
--skip-git-repo-check to work in any directory