The docs read as OpenAI's Codex CLI: a getting-started page titled for it, `codex --enable skills` and `code sandbox macos` for commands that do not exist, defaults given as gpt-5.1-codex-max/openai when they are zen5-coder/hanzo, a Homebrew page describing a formula we do not publish. Removed three tui-stream-chunking notes and the execpolicy page: they document modules and a subcommand that live only in the vendored upstream copy. There is no execpolicy subcommand and no .codexpolicy loader in code-rs; the page told users to run something the binary does not have. Rewrote tui-alternate-screen against the source. It described an auto/always/never enum and a --no-alt-screen flag; the shipped behavior is a tui.alternate_screen bool with Ctrl+T, which replays the transcript into scrollback on the way out — a better answer to Zellij than the one written down. Genuine openai-provider documentation stays.
3.7 KiB
Advanced
Non-interactive / CI mode
Run Hanzo Dev headless in pipelines. Example GitHub Action step:
- name: Update changelog via Dev
run: |
npm install -g @hanzo/dev
export HANZO_API_KEY="${{ secrets.HANZO_API_KEY }}"
dev exec --full-auto "update CHANGELOG for next release"
Resuming non-interactive sessions
You can resume a previous headless run to continue the same conversation context and append to the same rollout file.
Interactive TUI equivalent:
dev resume # picker
dev resume --last # most recent
dev resume <SESSION_ID>
# Resume the most recent recorded session and run with a new prompt
dev exec "ship a release draft changelog" resume --last
# Alternatively, pass the prompt via stdin
# Note: omit the trailing '-' to avoid it being parsed as a SESSION_ID
echo "ship a release draft changelog" | dev exec resume --last
# Or resume a specific session by id (UUID)
dev exec resume 7f9f9a2e-1b3c-4c7a-9b0e-123456789abc "continue the task"
Notes:
- When using
--last, Dev picks the newest recorded session; if none exist, it behaves like starting fresh. - Resuming appends new events to the existing session file and maintains the same conversation id.
Tracing / verbose logging
Because Dev is written in Rust, it honors the RUST_LOG environment variable to configure its logging behavior.
When you run the TUI with --debug, log messages are written to ~/.code/debug_logs/codex-tui.log, so you can leave the following running in a separate terminal to monitor log messages as they are written:
tail -F ~/.code/debug_logs/codex-tui.log
When you enable the CLI --debug flag, request/response JSON is partitioned
into helper-specific folders under ~/.code/debug_logs/. Expect
subdirectories such as:
auto/coordinatorauto/observer/bootstrapauto/observer/cadenceauto/observer/cross_checkguided_terminal/agent_install_flowguided_terminal/upgrade_terminal_flowtui/rate_limit_refreshui/theme_spinnerui/theme_buildercli/manual_prompt
Tags become nested path components, so custom helpers appear alongside the existing timestamped filenames.
Without --debug, Dev only writes critical crash/error logs to
~/.code/debug_logs/critical.log.*; routine log output is suppressed.
By comparison, the non-interactive mode (dev exec) defaults to RUST_LOG=error, but messages are printed inline, so there is no need to monitor a separate file.
See the Rust documentation on RUST_LOG for more information on the configuration options.
Model Context Protocol (MCP)
Dev can be configured to leverage MCP servers by defining an mcp_servers section in ~/.code/config.toml (Dev will also read a legacy ~/.codex/config.toml). It is intended to mirror how tools such as Claude and Cursor define mcpServers in their respective JSON config files, though Dev's format is slightly different since it uses TOML rather than JSON, e.g.:
# IMPORTANT: the top-level key is `mcp_servers` rather than `mcpServers`.
[mcp_servers.server-name]
command = "npx"
args = ["-y", "mcp-server"]
env = { "API_KEY" = "value" }
Using Dev as an MCP Server
Tip
It is somewhat experimental, but Dev can also be run as an MCP server via
dev mcp. If you launch it with an MCP client such asnpx @modelcontextprotocol/inspector dev mcpand send it atools/listrequest, you will see that there is only one tool,dev, that accepts a grab-bag of inputs, including a catch-allconfigmap for anything you might want to override. Feel free to play around with it and provide feedback via GitHub issues.