codex-ide 
- Description
- Run Codex CLI in a terminal
- Latest
- codex-ide-0.2.1.0.20261011.0.tar (.sig), 2026-Oct-11, 920 KiB
- Maintainer
- Thanos Apollo <public@thanosapollo.org>
- Other versions:
- release version
- Website
- https://git.thanosapollo.org/emacs-codex-ide
- ELPA's Repository
- CGit or Gitweb
- All Dependencies
- compat (.tar)
- keymap-popup (.tar)
- eat (.tar)
To install this package from Emacs, use package-install or list-packages.
Full description
1. Codex IDE integration for Emacs and Neomacs
1.1. About
- codex native integration for Emacs via Eat by default
- Run Codex in a project-scoped terminal buffer.
- Optionally use vterm when it is installed separately.
- Resume, switch, cycle, and stop multiple live Codex sessions.
- Optional IDE context provider and local Emacs MCP tools bridge.
- Requires GNU Emacs 29.1 or newer, or Neomacs with the native APIs below.
1.2. Commands
| Command | Purpose |
|---|---|
M-x codex-ide |
Start or toggle the active project session (C-u starts another) |
M-x codex-ide-new-session |
Start another live session for the project |
M-x codex-ide-resume-last |
codex resume --last |
M-x codex-ide-resume |
Pick a saved session id, then codex resume <id> |
M-x codex-ide-rename-session |
Label a live session; empty input restores automatic naming |
M-x codex-ide-stop |
Stop only the active project session |
M-x codex-ide-cycle-session |
Cycle live project sessions |
M-x codex-ide-toggle-panel |
Hide or restore project session windows in this tab |
M-x codex-ide-show-project-sessions |
Show all project sessions in separate side windows |
M-x codex-ide-switch-project-session |
Switch among project sessions |
M-x codex-ide-switch-session |
Switch among any live sessions |
M-x codex-ide-list-sessions |
Browse live sessions in *Codex Sessions* |
M-x codex-ide-attach-source |
Attach region or current line to one session draft without submitting |
M-x codex-ide-send-prompt |
Send a minibuffer prompt into the active session |
M-x codex-ide-menu |
Popup menu (sessions, config, MCP, debug) |
The session list shows project, label or buffer, backend, status, and directory.
Use n=/=p to move, RET to switch using the configured display policy,
k to kill the selected session after confirmation, r to set or clear its
label, g to refresh while keeping the selected row, and ? for popup help.
The old codex-ide-toggle and codex-ide-list-project-sessions names remain
obsolete aliases for codex-ide-cycle-session and
codex-ide-switch-project-session.
The popup groups Session, Switch, Send, Context, and Config in two columns.
Use l for project session completion, L for all-session completion, and
B for the session list. q closes the popup or returns from a submenu;
k kills a session and K stops MCP in its submenu. Unavailable actions
are dimmed. Configuration shows current backend, approval, and sandbox
overrides for new sessions; CLI default means the CLI chooses that value.
Save configuration persists options that differ from their defaults,
and removes saved overrides for options restored to their defaults.
Explicit terminal backend choices are also saved, including Eat, so they
retain their meaning after restarting Neomacs.
1.3. Saved sessions
codex-ide-resume-session-scan-limitlimits matching unique sessions offered by the picker (default 200), after filtering by project.- Resume always creates another live session, preserving existing sessions.
- Saved sessions are shown newest first, with dates and abbreviated paths. Metadata is cached until a rollout's modification time or size changes.
- If the project has no saved sessions, the prompt says "all projects"; selecting one starts it in its recorded working directory.
- Metadata lines larger than one MiB produce an explicit error.
Saved sessions launch in their recorded directory and belong to that directory's project root, so project commands include resumed sessions from subdirectories.
1.4. Session display and exit
codex-ide-display-buffer-functionanddisplay-buffer-alistcontrol placement. Switching selects the session; source attachment displays it without selecting. Existing-window lookup and hiding use the selected frame. Hiding restores the window layout where possible.codex-ide-kill-buffer-on-exitdefaults tosuccess: clean exits with status 0 close the terminal buffer. Failed exits retain readable output and an exit notice. Exiting sessions revoke their MCP credentials even when output is retained. Set it tonilto retain every exit, ortto close on every exit.- Interactive
codex-ide-stopasks for confirmation. Calls from Lisp do not. - The mode line shows the live session label or number and terminal backend.
S-<return>sends Ctrl+J to insert a literal newline in the Codex prompt. Minibuffer prompts usecodex-ide-prompt-history.
1.5. Terminal scrolling
- With Eat,
C-c C-eenters its read-only Emacs mode for ordinary scrolling, movement, search, and selection. - With vterm, use
M-x vterm-copy-modefor transcript navigation. C-c C-jrestores terminal input and jumps to the live Codex frame with any backend.
1.6. Context provider
- With
codex-ide-context-auto-startnon-nil (default), new GNU Emacs sessions enable the IDE context IPC automatically. Neomacs skips this legacy/ideserver autostart; explicit context commands remain available. Optional context startup failures are logged and do not prevent Codex startup. - Disable with
(setq codex-ide-context-auto-start nil).
1.7. MCP tools
- Supports stateless MCP
2026-07-28requests and the2025-06-18initialization flow for existing clients, on the same endpoint. - Modern clients can discover capabilities with
server/discoveror call tools directly, with protocol metadata and matching routing headers. - When
codex-ide-mcp-enabledis non-nil (default), session start registers a transient local MCP URL via Codex-coverrides. GNU sessions authenticate with a private per-session bearer token passed only throughCODEX_IDE_MCP_TOKENin the terminal environment. Requests without the exact token are refused; session exit or killing the terminal buffer revokes it. - The bridge can evaluate Elisp, edit buffers, and run shell commands. It
exposes those control tools by default and only accepts loopback bind
addresses. Set
codex-ide-mcp-disabled-toolsto a list of tool names to hide and refuse them. Tool execution can be interrupted withC-g. - Commands:
codex-ide-mcp-start,codex-ide-mcp-stop,codex-ide-mcp-status,codex-ide-mcp-install-codex-config. - Structured edits require an explicit
buffername or open filepath. Supplied tool arguments must match their advertised types; for example, positions are integers andindentis a JSON boolean. - Default port is ephemeral (
codex-ide-mcp-port0). GNU persistent HTTP installation is refused because it cannot supply session credentials; start the session withM-x codex-ide. Native Neomacs installation is unchanged. emacs_contextaccepts only already-open file paths.emacs_review_startcan omitbufferfor an authenticated GNU session.emacs_review_resultreturns its complete result, including accepted text, instructuredContent; its text content is a short status message. ReadstructuredContent.contentwhen applying the accepted edit.- Disable auto registration with
(setq codex-ide-mcp-enabled nil).
1.7.1. Custom tools
Register tools before starting Codex, and restart sessions after catalog changes
because clients may cache discovery. Built-in tools cannot be replaced or removed.
Handlers receive positional arguments in schema order and return a JSON-encodable
value as MCP text content. Omitted optional arguments become nil; JSON booleans
are t and :json-false. Supported types: string, integer, number, boolean.
Handlers run synchronously and must return promptly.
(require 'codex-ide-mcp-tools) (codex-ide-mcp-register-tool "greet" "Return a greeting." '((:name "name" :type string :description "Name to greet.")) (lambda (name) (concat "Hello, " name))) ;; Remove with (codex-ide-mcp-unregister-tool "greet").
1.8. Ediff review
codex-ide-diff-review takes old text, proposed text, a path label, and a
callback. It returns immediately with an owner for codex-ide-diff-cancel.
Edit the proposed buffer, then use C-c C-a in the Ediff control buffer to
accept, or q to reject. The callback receives (accepted final-text),
(rejected nil), or (cancelled nil). Only one review can be active.
Review never changes the target file or its visiting buffer. The caller
owns applying accepted text. codex-ide-diff-preview remains a synchronous
programmatic boolean preview with both buffers read-only. Proposal buffers
use the target file's major mode with core syntax and fontification setup,
without user mode hooks or file-local settings. A header shows the project-relative target and current accept, reject, and
help keys.
Codex can call emacs_review_start with buffer (the live terminal name),
token (a unique retry token), path, old, and new. It receives a
review_id promptly. The proposal always waits for
M-x codex-ide-diff-show, even when the owning session is selected.
A message and a warning-faced mode-line indicator announce the pending
review; notification timers never change the selected frame, tab, or
window. The command opens the review in the frame and tab where it is
invoked, after minibuffer input has finished.
emacs_review_result retrieves the decision on a
new connection, optionally with cancel=true. Disconnecting HTTP does
not cancel a review. Identical owner/token retries return the same ID;
changed input with that token is rejected. These arguments route the
proposal to a session; they are not an authentication boundary.
Apply only the accepted content, after checking that the original base
has not changed. Changed bases require another review. The tools do not
intercept or enforce approval of other file writes. One review may be
queued or open, with at most 16 retained receipts and one MiB of combined
UTF-8 input text. Pending reviews expire after 30 minutes; final results
remain available for another 30 minutes. Session or server shutdown
cancels pending UI while retaining results until that retention expires.
1.9. Context and debug output
The /ide context provider remembers source buffers across both window
and same-window buffer changes. It collects at most 100 open tabs by
default and bounds selection text before copying it. Native JSON is used
when available, with the same wire format as the json.el fallback.
codex-ide-send-selection broadcasts context for the project root.
A broadcast does not mean the Codex TUI consumed the selection; invoke
/ide there to request context. With no connected client, the command
keeps its selection-copy fallback.
Debug output uses a read-only special-mode buffer.
codex-ide-debug-max-size limits retained text to 262144 characters by
default. codex-ide-clear-debug clears it.
1.10. Useful knobs
| Variable | Default intent |
|---|---|
codex-ide-cli-path |
Codex executable |
codex-ide-terminal-backend |
GNU Emacs: eat; Neomacs: native unless explicitly customized |
codex-ide-ask-for-approval |
Optional --ask-for-approval policy |
codex-ide-cli-extra-args |
Extra CLI args |
codex-ide-no-alt-screen |
Inline TUI mode |
codex-ide-yolo |
Full control without approvals or sandbox |
codex-ide-mcp-enabled |
Auto-register local MCP bridge |
codex-ide-mcp-port |
GNU MCP: 0 = ephemeral port |
codex-ide-neomacs-mcp-command |
Native neomacs-mcp stdio relay executable |
codex-ide-context-auto-start |
Auto-start context IPC |
codex-ide-debug |
Debug logging |
Menu Save configuration persists the documented symbol set only (CLI/terminal/display/approval/YOLO/no-alt-screen/extra-args/config-overrides/ debug/MCP host-port-enable/context-auto-start).
1.11. Optional vterm backend
Install vterm separately, then select it for new sessions:
(use-package vterm :ensure t) (setq codex-ide-terminal-backend 'vterm)
Eat is the GNU Emacs default and a package dependency, so installing codex-ide also installs Eat 0.9.4 or newer from NonGNU ELPA. It is loaded only when an Eat session starts. Changing the option does not alter already running sessions.
1.12. Native Neomacs support
When (featurep 'neomacs) is non-nil, an uncustomized eat default selects
neo-term for new sessions. This also works when upgrading an already-loaded
copy: the option itself is not overwritten, and existing sessions keep their
backend. setq to the historical eat default is treated as automatic in
Neomacs. Use Customize or (customize-set-variable
'codex-ide-terminal-backend 'eat) to explicitly retain Eat there. Explicit
vterm and neo-term selections are respected.
The native backend requires neo-term-exec, neomacs-terminal-spawn,
neo-term-settled-functions and neo-term-create-failed-functions. Older
Neomacs builds without the exact-command API are not supported. It launches
Codex with exact argv, cwd and environment, without a shell script. Input,
resizing and teardown use the native terminal API, not an Emacs pipe process.
Prompts and source attachments remain literal UTF-8 bracketed pastes; Return
and Escape are separate key bytes. Native terminal exits, creation failures,
buffer kills and mode changes remove only the owning session.
With MCP enabled, start Neomacs' owner-controlled endpoint using
M-x neomacs-mcp-start and an explicit private socket location. Codex IDE
reads that active listener's actual socket and registers the native
neomacs-mcp stdio relay transiently under mcp_servers.neomacs. The native
editor and companion libraries supply the native catalog, including unrestricted
owner evaluation; Codex IDE does not substitute GNU emacs_tools, hide native
tools or add an evaluation restriction. Native tools are exposed in Codex's
mcp__neomacs namespace, for example mcp__neomacs__neomacs_identity.
Before native session launch, Codex IDE asks codex mcp list --json to inspect
effective configuration in the session's working directory, including
codex-ide-config-overrides. An inherited emacs_tools entry is disabled
for that session only, unless codex-ide-config-overrides explicitly sets
mcp_servers.emacs_tools.enabled to true or false. An explicit true
deliberately retains the GNU bridge alongside native MCP. Other server entries
are left alone. Native stdio
enabled, enabled_tools and disabled_tools policy remains inherited;
registration does not enable a disabled native server or widen its tool policy.
Codex 0.155.1 recursively merges even whole-table -c overrides, so an existing
HTTP transport under mcp_servers.neomacs cannot be safely replaced that way.
Launch refuses that conflict before opening a terminal, with instructions to
rename the conflicting entry, explicitly replace it with stdio, or disable
automatic MCP registration. Inspection failures also refuse launch rather
than guessing the effective configuration. No persistent entry is rewritten.
Native automatic MCP registration refuses -p=/–profile=, -c=/–config=,
-C=/–cd= and remote-route options (--remote, --remote-auth-token-env)
in codex-ide-cli-extra-args, including joined short and --option=value
forms, before creating a terminal. Those options can select uninspected config
layers, override the inspected settings later, or bypass the local server.
Put equivalent session settings in codex-ide-config-overrides and select the
project directory in Emacs. To use these CLI options directly, disable
codex-ide-mcp-enabled and manage MCP yourself. GNU sessions and native sessions
without automatic MCP retain the verbatim extra-argument escape hatch.
The relay must be available on Emacs' exec-path. If necessary, customize
codex-ide-neomacs-mcp-command to its absolute executable filename. Missing
native libraries, listener or relay fail explicitly rather than silently
starting GNU MCP. codex-ide-mcp-start verifies the native endpoint and
codex-ide-mcp-status reports its socket and catalog. codex-ide-mcp-stop
refuses to stop the shared native listener; use neomacs-mcp-stop explicitly
if that is intended. Disable session registration with
(setq codex-ide-mcp-enabled nil). No Codex configuration file is written
except by the existing confirmed codex-ide-mcp-install-codex-config command.
Persistent native setup targets that exact socket and must be updated if it
moves. Its confirmation warns that codex mcp add neomacs can replace an
existing entry and discard enabled, enabled_tools and disabled_tools
policy. Inspect and restore those restrictions after deliberate installation.
GNU HTTP host/port and custom tool registration apply only to GNU MCP.
1.13. Development checks
make dev runs warning-fatal source compilation, checkdoc, package-lint and
all ERT suites through the Nix development shell. Eat/vterm PTY tests run
locally; sandbox checks may skip PTY tests. make load is live activation,
not a read-only check.
The opt-in config-merge suite exercises the installed Codex CLI against
disposable configuration, checks that the fixture bytes remain unchanged,
and never contacts an editor endpoint. To include it in GNU and native checks,
set CODEX_IDE_TEST_CODEX to the absolute installed Codex executable (not a
shim whose resolution depends on HOME). Without that variable those four
tests are explicitly skipped. For example:
CODEX_IDE_TEST_CODEX="$CODEX" make dev CODEX_IDE_TEST_CODEX="$CODEX" make neomacs-check NEOMACS="$NEOMACS" \ COMPAT="$COMPAT" KEYMAP_POPUP="$KEYMAP_POPUP"
make neomacs-check exercises an installed Neomacs without its init, in a
disposable HOME, through source and byte-compiled package loads. Supply
NEOMACS as the installed executable, COMPAT and KEYMAP_POPUP as explicit
dependency directories, and optionally NEOMACS_LISP for native libraries:
make neomacs-check NEOMACS="$NEOMACS" COMPAT="$COMPAT" \ KEYMAP_POPUP="$KEYMAP_POPUP" NEOMACS_LISP="$NEOMACS_LISP"
This inexpensive lane compiles every shipped Lisp source without Eat or vterm
on its load path, including their optional adapters. It needs no Rust rebuild
or GPU launch. Its deterministic
native host fixtures verify session and input routing, not a real PTY or a real
Codex tool call. Verify those journeys in an interactive native runtime too.
The optional installed GNU runtime lane can use make ENV=host EMACS_CMD…=
with dependency load paths; Thanos uses his own Emacs fork (Thanos Emacs fork),
which is distinct from Neomacs and from the pinned Nix GNU runtime.
1.14. Changelog
See NEWS.org for release notes.
1.15. Installation
For GNU Emacs' default backend, install Eat separately:
(use-package eat :ensure t)
Neomacs native sessions need neither Eat nor vterm at runtime. Every package source can also be byte-compiled without Eat. Selecting Eat without installing it produces an actionable error before buffer creation; errors from loading an installed backend are preserved for diagnosis.
- Emacs 29.1 using
package-vc-install
(unless (package-installed-p 'codex-ide)
(package-vc-install
'(codex-ide :url "https://git.thanosapollo.org/emacs-codex-ide"
:lisp-dir "lisp")))
- Emacs 30 or newer using
use-package :vc
(use-package codex-ide
:vc (:url "https://git.thanosapollo.org/emacs-codex-ide"
:lisp-dir "lisp"
:rev :newest))
- Using
straight.el
(straight-use-package
'(codex-ide :type git
:host nil
:repo "https://git.thanosapollo.org/emacs-codex-ide"
:files ("lisp/*.el" "LICENSE")))
1.16. Source attachments
codex-ide-attach-source snapshots the region (or current line), source
project-relative path or buffer name, and line range before choosing a project session.
It displays the target session without moving focus from the source buffer.
It inserts one literal bracketed paste on Eat, vterm or neo-term without pressing
Return. Review the draft in the Codex terminal before submitting it.
Unicode, TAB and LF are supported; other control characters and drafts
larger than 1 MiB of UTF-8 text are rejected without changing the draft
or kill ring. This command targets the Codex TUI, not a shell prompt.
Old versions
| codex-ide-0.1.4.0.20260919.1.tar.lz | 2026-Sep-19 | 108 KiB |
| codex-ide-0.1.3.0.20260904.7.tar.lz | 2026-Sep-05 | 105 KiB |
| codex-ide-0.1.2.0.20260904.1.tar.lz | 2026-Sep-04 | 89.2 KiB |
| codex-ide-0.1.2.0.20260902.0.tar.lz | 2026-Sep-02 | 85.1 KiB |
| codex-ide-0.1.1.0.20260829.3.tar.lz | 2026-Aug-29 | 84.1 KiB |
| codex-ide-0.1.1.0.20260813.0.tar.lz | 2026-Aug-13 | 80.9 KiB |
| codex-ide-0.1.0.0.20260806.58.tar.lz | 2026-Aug-13 | 77.5 KiB |
News
1. Version 0.2.1 (2026-10-11)
- Require Eat again. It is the GNU Emacs default backend, so a fresh
install no longer fails on the first
codex-ideuntil Eat is added by hand. Eat is still loaded only when an Eat session starts, so Neomacs sessions onneo-termnever load it.
2. Version 0.2.0 (2026-10-11)
- Incompatible changes:
codex-ide-list-sessionsopens a session list buffer; completion moved tocodex-ide-switch-session.- Menu
qonly closes the menu; kill a session withk. - Failed sessions keep their buffer by default
(
codex-ide-kill-buffer-on-exit). - GNU HTTP MCP requires a per-session token, so persistent GNU
installation is refused. Remove an old persistent
emacs_toolsentry from the Codex configuration.
- Give native Neomacs sessions
TERM=xterm-256colorandCOLORTERM=truecolorinstead of the frame'sTERM=dumb, so Codex keeps its full colour styling. - Resume saved conversations in new live sessions, preserving existing sessions. Keep the picker newest first, annotate IDs with date and directory, cache rollout metadata, and resume global fallback choices in their recorded cwd while routing project commands through the normalized ownership root.
- Keep failed terminal output with an exit notice. Customize
codex-ide-kill-buffer-on-exitto retain all buffers or close all exits. - Confirm interactive session stops and continue after optional context startup failures. Show the session label and backend in the mode line.
- Use the configured display policy for session switching and panels, scope window lookup to the selected frame, and restore splits when hiding.
- Send literal Ctrl+J for newlines, retain minibuffer prompt history, and display source attachments without selecting the session, using project-relative paths.
- Cache CLI availability, failures and version output by executable path.
- Make
codex-ide-list-sessionsa native tabulated session list with switching, confirmed kill, labels, refresh, and popup help. Its former completion behavior is nowcodex-ide-switch-session. - Rename project completion to
codex-ide-switch-project-sessionand cycling tocodex-ide-cycle-session. Keep the formercodex-ide-list-project-sessionsandcodex-ide-toggleas obsolete aliases. - Keep popup
qfor exit/back; move session kill tokand MCP stop toK. Organize the menu by goal in two columns, add Context actions, usel=/=Lfor project/all session completion, and dim unavailable actions. - Show current backend, approval, and sandbox overrides in configuration. Retain explicit terminal backend choices across restarts. Save other nondefault options, remove saved overrides restored to defaults, and allow a bare CLI executable name.
- Authenticate GNU HTTP MCP with per-session environment bearer tokens and infer review owners from authenticated sessions. Refuse persistent GNU HTTP installation; native Neomacs stdio registration is unchanged. Revoke session tokens at process exit even when terminal output is retained.
- Add
codex-ide-mcp-disabled-toolsand allowC-gto interrupt tool calls. - Bound job output in hidden buffers. Read effective native MCP configuration once on each start so inherited configuration changes are respected.
- Accelerate MCP JSON with native functions where available. Review results
now carry their complete data in
structuredContentand a short text status, avoiding a second encoding of large accepted edits. - Capture execution backtraces at the error site when supported, require open buffers for context paths, and close excess HTTP clients cleanly.
- Queue MCP diff proposals until
codex-ide-diff-showis invoked, with a pending mode-line indicator and notification that never changes windows. - Show project-relative review targets and current accept, reject, and help keys. Select proposal major modes with core syntax and fontification setup, without user mode hooks or file-local settings.
… …