You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Implements the Codex integration as a single-file agent on top of the
CM-64678 refactor: one `ides/codex.py` + one registry line gets the
SessionStart / UserPromptSubmit / PreToolUse:mcp hook surface plus
config.toml feature-flag management and plugin/MCP discovery.
Codex limitations (vs. Claude Code):
- No separate file-read hook. Codex performs file reads via Bash
commands, so there's no `PreToolUse:Read` equivalent. This PR
handles only `PreToolUse:mcp__.*`; scanning bash commands (the
`COMMAND_EXEC` event type) is a planned follow-up.
- Codex's TOML `async: true` flag is unimplemented in its hooks
engine, so we shell-background scan hooks with `&` in async mode
(SessionStart stays sync so the conversation context is registered
before scan hooks fire).
What lands here:
- `ides/codex.py`: hooks template, payload parsing, response builder
mirroring Claude Code's shapes, and `[features] hooks = true` in
`~/.codex/config.toml` via the new `post_install` lifecycle hook.
- `post_install` / `post_uninstall` on the `IDE` ABC so IDE-specific
side-effects (like Codex's TOML flag) don't leak into hooks_manager.
- `ides/_plugin_utils.py`: shared `walk_enabled_plugins` + `load_plugin_json`
used by both Claude Code and Codex plugin resolution. Codex walks
`[plugins."<name>@<marketplace>"]` entries, reads
`~/.codex/plugins/cache/<m>/<p>/<hash>/.codex-plugin/plugin.json`,
and merges contributed MCP servers into the session inventory.
- `scan/handlers.py`: shared `_handle_arg_scan` helper so future
COMMAND_EXEC support slots in next to MCP_EXECUTION without
duplicating the scan-and-decide flow.
- `decode_jwt_unverified` moved into `cycode/cli/utils/jwt_utils.py`
(used to read the `email` claim from Codex's `auth.json`).
Piggybacks fixes that overlap the same files:
- CM-64796: SessionStart matcher set to `startup|clear` on both Claude
Code and Codex so `/clear` re-fires session-start (conversation_id
rotates and otherwise telemetry would post under the stale id).
- hooks_manager install/uninstall now strip Cycode hooks surgically
from each entry instead of dropping the whole entry. Preserves
user-authored hooks co-located with Cycode ones (regression tests
added).
Adds `tomli-w` (always) + `tomli` (py<3.11 only) for TOML handling.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
0 commit comments