Disclaimer: These documents reflect our current understanding of each agent’s hook system
and extensibility surface. They are maintained as working references for symposium development,
not as a substitute for each project’s official documentation. Details may be outdated or
incomplete — always consult the primary sources linked in each agent’s page.
For each agent it supports, symposium needs to know:
Hook registration — where and how to write config so the agent calls cargo-agents hook
Hook I/O protocol — event names, input/output field names, exit code semantics
Extension installation — where skill files go (project and global)
Custom instructions — where the agent reads project-level instructions
The tables below summarize the answers for each agent. Individual agent pages contain the full reference. A ? indicates information we have not yet documented.
Agent Project config path Global config path Format
Claude Code .claude/settings.json~/.claude/settings.jsonJSON, hooks key with matcher groups
GitHub Copilot .github/hooks/*.json~/.copilot/config.jsonJSON, version: 1 with hooks key
Gemini CLI .gemini/settings.json~/.gemini/settings.jsonJSON, hooks key with matcher groups
Codex CLI .codex/hooks.json~/.codex/hooks.jsonJSON, hooks key with matcher groups
Kiro .kiro/agents/*.json~/.kiro/agents/*.jsonJSON, hooks key in agent config
OpenCode .opencode/plugins/~/.config/opencode/plugins/JS/TS plugins (not shell hooks)
Goose (no hooks) (no hooks) N/A
Agent Command field Platform-specific?
Claude Code commandNo
GitHub Copilot bash / powershellYes
Gemini CLI commandNo
Codex CLI commandNo
Kiro commandNo
OpenCode N/A (JS function) N/A
Goose N/A N/A
Agent Default timeout Unit
Claude Code 600 seconds
GitHub Copilot 30 seconds (timeoutSec)
Gemini CLI 60,000 milliseconds (timeout)
Codex CLI 600 seconds (timeout or timeoutSec)
Kiro 30,000 milliseconds (timeout_ms)
OpenCode 60,000 milliseconds (community hooks plugin)
Goose N/A N/A
Symposium registers hooks for four events. Each agent uses different names and casing conventions.
Symposium event Claude Code Copilot Gemini CLI Codex CLI Kiro CLI OpenCode Goose
pre-tool-use PreToolUsepreToolUseBeforeToolPreToolUsepreToolUsetool.execute.beforeN/A
post-tool-use PostToolUsepostToolUseAfterToolPostToolUsepostToolUsetool.execute.afterN/A
user-prompt-submit UserPromptSubmituserPromptSubmittedBeforeAgentUserPromptSubmituserPromptSubmitmessage.updated (filter by role)N/A
session-start SessionStartsessionStartSessionStartSessionStartagentSpawnsession.createdN/A
Not all events can block the action in all agents.
Agent Pre-tool-use can block? Post-tool-use can block? User-prompt can block? Session-start can block?
Claude Code Yes No Yes (exit 2) No
GitHub Copilot Yes No No No
Gemini CLI Yes Yes (block result) Yes (deny discards message) No
Codex CLI Yes Yes (continue: false) Yes (continue: false) Yes (continue: false)
Kiro Yes (exit 2) No No No
OpenCode Yes (throw Error) No No (observe only) No (observe only)
Goose N/A N/A N/A N/A
Agent Tool name field Tool args field Session/context fields
Claude Code tool_nametool_input (object)session_id, cwd, hook_event_name
GitHub Copilot toolNametoolArgs (JSON string )timestamp, cwd
Gemini CLI tool_nametool_input (object)session_id, cwd, hook_event_name, timestamp
Codex CLI tool_nametool_input (object)session_id, cwd, hook_event_name, model
Kiro tool_nametool_input (object)hook_event_name, cwd
OpenCode toolargs (mutable output object)sessionID, callID
Goose N/A N/A N/A
Agent Permission decision field Decision values Modified input field Nesting
Claude Code permissionDecisionallow, deny, ask, defer updatedInputnested in hookSpecificOutput
GitHub Copilot permissionDecisionallow, deny, ask modifiedArgsflat
Gemini CLI decisionallow, deny tool_inputnested in hookSpecificOutput
Codex CLI decision or permissionDecisionblock/deny (not yet implemented) flat or nested hookSpecificOutput
Kiro (exit code only) exit 0 = allow, exit 2 = block (not supported) N/A
OpenCode (throw to block) allow (return) / deny (throw) mutate output.args JS mutation
Goose N/A N/A N/A N/A
All shell-based agents use the same convention (where applicable):
Code Meaning
0Success; stdout parsed as JSON
2Block/deny; stderr used as reason
Other Non-blocking warning, action proceeds
Exceptions : Copilot uses exit 0 = allow, non-zero = deny (no special meaning for exit 2). OpenCode uses JS exceptions, not exit codes.
Agent Project skills path Global skills path
Claude Code .claude/skills/<name>/SKILL.md~/.claude/skills/<name>/SKILL.md
GitHub Copilot .agents/skills/<name>/SKILL.md(none)
Gemini CLI .agents/skills/<name>/SKILL.md~/.gemini/skills/<name>/SKILL.md
Codex CLI .agents/skills/<name>/SKILL.md~/.agents/skills/<name>/SKILL.md
Kiro .kiro/skills/<name>/SKILL.md~/.kiro/skills/<name>/SKILL.md
OpenCode .agents/skills/<name>/SKILL.md~/.agents/skills/<name>/SKILL.md
Goose (N/A — uses MCP extensions) (N/A)
Symposium uses the vendor-neutral .agents/skills/ path whenever the agent supports it, falling back to agent-specific paths (e.g., .claude/skills/, .kiro/skills/) when required. Codex CLI and OpenCode also support .agents/skills/ natively.
Agent Project instructions Global instructions
Claude Code CLAUDE.md, .claude/CLAUDE.md~/.claude/CLAUDE.md
GitHub Copilot .github/copilot-instructions.md, AGENTS.md~/.copilot/copilot-instructions.md
Gemini CLI GEMINI.md (walks up to .git)~/.gemini/GEMINI.md
Codex CLI AGENTS.md (each dir level)~/.codex/AGENTS.md
Kiro .kiro/steering/*.md, AGENTS.md~/.kiro/steering/*.md
OpenCode AGENTS.md, CLAUDE.md~/.config/opencode/AGENTS.md
Goose .goosehints, AGENTS.md~/.config/goose/.goosehints
Relevant if symposium exposes functionality via MCP.
Agent MCP config location Format
Claude Code .claude/settings.json (mcpServers key)JSON
GitHub Copilot .vscode/mcp.json (VS Code), ~/.copilot/mcp-config.json (CLI)JSON
Gemini CLI .gemini/settings.json (mcpServers key)JSON
Codex CLI .codex/config.toml / ~/.codex/config.toml (mcp_servers key)TOML
Kiro .kiro/settings/mcp.json, ~/.kiro/settings/mcp.jsonJSON
OpenCode opencode.json (mcp key)JSON
Goose ~/.config/goose/config.yaml (extensions key)YAML