Skip documentation navigation
Documentation menu

Host features

Created: 2026-10-05 Last updated: 2026-10-21

The Claude Code and Codex features the concise manifests use, as the host docs described them on 2026-10-05 (2026-10-08 for the NotebookEdit, PowerShell, MCP, task, question, and PostToolUse rows), and the omp features the omp extension uses, as of 2026-10-07. Read the sources again before you change a manifest or omp/extension.mjs.

Used by the manifests

FeatureClaude CodeCodexWhere
statusMessage on a command handleryesyesEvery handler in hooks/hooks.json and hooks/codex.json
SessionStart matcher forkyesno: startup, resume, clear, compacthooks/hooks.json
if on a handleryesnohooks/hooks.json shell hooks only
if with a permission rule per handler, such as Bash(cat *), matched against each subcommandyesnohooks/hooks.json: the heredoc-write handlers of check-edit, the jj handlers of check-bash, and the PowerShell handlers
NotebookEdit input: notebook_path, cell_id, new_source, cell_type, edit_modeyesnohooks/hooks.json PreToolUse, read by check-edit.mjs
PowerShell tool with tool_input.commandyesnohooks/hooks.json PreToolUse, read by check-bash.mjs
A matcher with characters outside letters, digits, _, -, |, and , is a regex, so mcp__.* matches every mcp__<server>__<tool> callyesyes: every matcher is a regex, and PreToolUse fires for MCP toolsPreToolUse in both manifests, read by check-tool-text.mjs
PreToolUse on ExitPlanMode (plan, which Claude Code fills from the plan file), on TaskCreate and TaskUpdate (subject, description, activeForm) and on AskUserQuestion (questions[].question, options[].label, options[].description)yesnohooks/hooks.json, read by check-tool-text.mjs
PostToolUse input with duration_ms, and decision: "block", which adds the reason next to the tool resultyesnot usedhooks/hooks.json PostToolUse on Bash|PowerShell, read by check-shell-writes.mjs
PostToolUse updatedToolOutput replaces the Bash output (stdout, stderr, interrupted, isImage, noOutputExpected) that Claude sees; a passing run fires PostToolUse and a failed run fires PostToolUseFailure (checked live with Claude Code 2.1.304 on 2026-10-21)yesnot usedhooks/hooks.json PostToolUse on Bash, read by post-test-filter.mjs
SubagentHandback tool carries the subagent report in tool_input.message (auto mode, v2.1.271 or later)yesnohooks/hooks.json PreToolUse
SubagentStop fires for internal agents, with an empty agent_type when the session has no --agentyesnocheck-reply.mjs skips them
Plugin MCP server file with ${CLAUDE_PLUGIN_ROOT} in argsyesno: see below.mcp.json (Claude Code), .codex-mcp.json (Codex)
${CLAUDE_PLUGIN_ROOT} in plugin skill textyesnot documentedskills/*/SKILL.md, with a relative path for Codex
interface.composerIcon and interface.logon/ayes.codex-plugin/plugin.json
displayName, homepage, repository, and keywordsyesn/a.claude-plugin/plugin.json
Directory listing fields icon, documentationUrl, supportUrl, and privacyPolicyUrl, which Anthropic’s directory reads and Claude Code ignores (checked 2026-10-21)yesn/a.claude-plugin/plugin.json
Marketplace descriptionyesn/a.claude-plugin/marketplace.json

The hooks docs say a handler defined in more than one settings file runs once. They do not say whether two handlers in one plugin with the same command and different if rules both run for one call. When their rules can overlap, check-edit and check-bash claim the call’s tool_use_id, so a second run exits without output.

Codex MCP server

The Codex plugin docs describe bundled MCP servers and plugin-scoped policy under plugins.<plugin>.mcp_servers.<server>, with a remote HTTP server as the example. They do not cover local stdio paths. A live run with codex-cli 0.159.0 on 2026-10-05, with the plugin installed from this repository into a temporary CODEX_HOME, showed:

  • ${CLAUDE_PLUGIN_ROOT} and ${PLUGIN_ROOT} stay literal in MCP args, so the server does not start.
  • "cwd": "." resolves to the plugin root. With "args": ["./tools/mcp-server.mjs"], all 8 tools load.
  • The server gets no project directory: no environment variable, no MCP roots, and no cwd in the call _meta. Its working directory is the plugin root.

So the Codex manifest points mcpServers at .codex-mcp.json, which uses the relative path and cwd. In Codex, each project tool needs the cwd argument. Without it, the server refuses the call, since a project edit would land in the plugin cache.

The concise-config and concise-tune skills call the CLI, so they work without the server. To register the server by hand instead:

codex mcp add concise -- node /path/to/plugins/concise/tools/mcp-server.mjs

omp

omp (oh-my-pi) installs the plugin from the Claude Code marketplace catalog, .claude-plugin/marketplace.json. It does not run hooks/hooks.json. It loads JavaScript extensions instead, so package.json in the plugin root lists omp/extension.mjs under omp.extensions. A marketplace install links the cached plugin into omp’s plugins/node_modules and loads that entry. The extension builds the hook input that Claude Code would send and runs the same hook scripts with node.

omp featureUsed for
tool_call with { block, reason }Denials from check-edit, check-bash, and the ask mode
tool_call returning inputThe test-output filter’s command rewrite
tool_call returning additionalContextFlags and notices for the model
before_agent_start returning messageThe rules from session-context, as SessionStart, SubagentStart, or UserPromptSubmit
session_stop with { decision: "block", reason }Reply checks. The event carries last_assistant_message, session_id, and stop_hook_active
session_shutdownsession-end, with a 1.5 s limit inside omp’s 2 s budget
ctx.ui.confirm and ctx.ui.notifyask prompts and terminal notices when a UI is attached

Tool names and inputs differ from Claude Code. write sends { path, content }. edit input depends on the edit mode: hashline (the default) sends [path#TAG] sections with + body rows, apply_patch sends a Codex patch, replace sends old_string and new_string, patch sends edits[].diff, and sloppy sends *** Edit File: sections. omp/translate.mjs turns each mode into the added lines that check-edit reads.

A live run with omp 18.7.0 on 2026-10-07 confirmed these shapes. In that run, a hashline edit and a write were denied, the test filter’s rewritten command ran in omp’s shell, the rules reached the model, and a reply with an em dash was held and rewritten.

omp’s Claude marketplace loader, src/discovery/claude-plugins.ts, substitutes ${CLAUDE_PLUGIN_ROOT} in MCP args and loads skills/. The omp docs do not mention CLAUDE_PROJECT_DIR, so pass cwd to the project tools as in Codex.

Gaps: omp has no subagent stop event, so subagent replies are not checked. The extension does not check MCP tool calls, and it does not scan files that a shell command changes. omp blocks a tool call whose handler throws or runs past 30 s, so the extension catches every hook failure and allows the call. omp loads extensions at session start: start a new session after an install or update.

Left out

  • Plugin bin/ on PATH (Claude Code): claude.ai and Cowork refuse a plugin with a bin/ directory.
  • userConfig prompts at install time (Claude Code): deferred.
  • PostToolBatch, additionalContext on Stop, and exec-form args (Claude Code): no current use.
  • MessageDisplay (Claude Code): it only changes what the terminal shows. It cannot block a message or send text to Claude, so text between tool calls stays unchecked.
  • TaskCreated (Claude Code): the PreToolUse hook on TaskCreate reads the same subject and description.

Sources