codex_exec / README.md
yitongl's picture
Document project-aware autorun aliases
20666a8
|
Raw
History Blame Contribute Delete
6.64 kB
---
tags:
- codex
- tmux
- automation
- developer-tools
---
# codex_exec
`codex_exec` is an **unofficial** launcher for the interactive OpenAI Codex TUI. It starts a real interactive `codex` session inside `tmux` and runs a small watcher that can confirm recognized approval dialogs automatically.
Despite the repository name, this is **not** `codex exec` and it does not turn Codex into a non-interactive subprocess. You can attach to the TUI, type follow-up messages, detach, reattach, and resume persisted Codex conversations normally.
The runtime is one self-contained Python script with no third-party Python dependencies.
## Requirements
- Linux. The watcher uses `fcntl` and `/proc` for locking and process identity checks.
- Python 3.10 or newer.
- `tmux` available on `PATH`.
- The Codex CLI installed, authenticated, and available as `codex` on `PATH` (or supplied with `--codex-binary`).
The current implementation and tests were validated with Codex CLI 0.142.3. The watcher recognizes text rendered by the Codex TUI, so a future Codex release that changes approval wording or layout may require detector updates.
## Important safety warning
By default, Codex still starts with `on-request` approvals and the `workspace-write` sandbox. However, the watcher automatically confirms recognized one-shot approval choices for:
- shell commands;
- file edits;
- permission requests; and
- network access requests.
This removes the human review normally provided by an approval prompt. A mistaken or prompt-injected Codex action may delete files, run untrusted commands, disclose accessible data over the network, or request broader permissions. The watcher is a convenience mechanism, **not a security boundary**. Use it only in a workspace whose contents and consequences you understand, keep important work under version control, and prefer a disposable or externally isolated environment for risky tasks.
The watcher does not automatically answer ordinary questions, enable a full-access screen, trust hooks, install plugins, approve MCP/app calls, or trust a directory unless the relevant explicit option is enabled.
`--approve-mcp` can approve app or MCP calls with external side effects. `--auto-trust-directory` bypasses Codex's initial directory-trust confirmation. `--bypass` is substantially more dangerous: it passes Codex's `--dangerously-bypass-approvals-and-sandbox` option and should only be used inside an environment that is already isolated outside Codex.
## Installation
```bash
git clone https://huggingface.co/yitongl/codex_exec
cd codex_exec
chmod +x codex_auto_run.py
```
## Start a new session
```bash
./codex_auto_run.py \
-C ~/code/my_project \
-p "Implement the requested change, run the tests, and summarize the result."
```
The launcher creates a uniquely named `tmux` session and normally attaches to it immediately. The printed startup information includes the exact command needed to reattach.
Use a UTF-8 prompt file when the task is long:
```bash
./codex_auto_run.py -C ~/code/my_project --prompt-file task.md
```
## Detach and reattach
Start without attaching:
```bash
./codex_auto_run.py \
--detach \
-C ~/code/my_project \
-p "Run the full task and verify the result."
```
Then attach with the session name printed by the launcher:
```bash
tmux attach -t codex-auto-YYYYMMDD-HHMMSS-PID-RANDOM
```
Inside `tmux`, press `Ctrl-b d` to detach without stopping Codex. Exiting Codex normally ends the `tmux` session unless `--keep-dead-session` was used. When no managed panes remain, the watcher exits after its idle timeout (120 seconds by default).
## Resume a Codex conversation
Resume the most recent interactive conversation for a working directory:
```bash
./codex_auto_run.py \
--resume-last \
-C ~/code/my_project \
-p "Continue the task and rerun the verification."
```
Resume a specific Codex session ID or name:
```bash
./codex_auto_run.py \
--resume SESSION_ID \
-C ~/code/my_project \
-p "Continue from the previous result."
```
Open Codex's interactive session picker:
```bash
./codex_auto_run.py --resume -C ~/code/my_project
```
The picker form cannot be combined with `-p` or `--prompt-file`; select the conversation first and then type in Codex. Resuming starts a new `tmux` wrapper around a persisted Codex conversation. If the original `tmux` session is still running, simply reattach to that session instead.
## Pass options to Codex
Place Codex-specific global options after `--`:
```bash
./codex_auto_run.py \
-C ~/code/my_project \
-p "Research and implement the task." \
-- \
--search \
--model MODEL_NAME
```
The wrapper reserves `-p` for the initial or resumed-session follow-up prompt. Use `--codex-profile PROFILE_NAME` for a Codex profile.
No model is hardcoded by this repository. Without `--model`, Codex inherits the model selected by the user's Codex configuration and CLI defaults.
Some Codex options that conflict with wrapper-managed behavior, including Codex's own approval, sandbox, working-directory, full-auto, and bypass flags, are rejected. Use the wrapper's `--sandbox`, `-C`, and `--bypass` options instead.
## Watcher controls
Show the watcher and managed-session status:
```bash
./codex_auto_run.py --status
```
Stop the watcher:
```bash
./codex_auto_run.py --stop-daemon
```
Start only the watcher:
```bash
./codex_auto_run.py --start-daemon
```
By default, private watcher state and logs are stored under `~/.runtime/codex-auto/`. Only sessions created and registered by this wrapper are watched.
Run `./codex_auto_run.py --help` for all tuning and safety options.
## Optional shell aliases
[`LOCAL_SETUP.txt`](LOCAL_SETUP.txt) contains the current `runx`/`rund` Bash
functions, project-relative tmux naming rules, usage examples, and the local
`codex-autorun` skill location. The `rund` function expects a separate
`~/claude_auto_run.py`, which is not included in this repository.
## Tests
The unit tests exercise approval-screen detection, argument validation, resume command construction, binary probing, `tmux` command construction, and daemon lifecycle safeguards without starting a real Codex session:
```bash
PYTHONDONTWRITEBYTECODE=1 python3 -m unittest -v test_codex_auto_run.py
```
A passing unit-test suite cannot guarantee compatibility with a future Codex TUI. Before relying on unattended operation after a Codex upgrade, observe a real low-risk session and verify that approvals are detected as intended.
## Project status
This project is independent and unofficial. It is not an OpenAI product and is not endorsed or supported by OpenAI.