MCPcopy Create free account
hub / github.com/atomicdotdev/atomic / AgentHook

Interface AgentHook

atomic-agent/src/hooks/mod.rs:100–204  ·  view source on GitHub ↗

Trait for agent hook adapters. Each AI coding agent (Claude Code, Gemini CLI, Codex, OpenCode) implements this trait to: 1. **Parse** agent-specific JSON from stdin into a common [`TurnEvent`] 2. **Install** hooks into the agent's configuration file 3. **Uninstall** hooks from the agent's configuration file 4. **Detect** whether hooks are currently installed Implementations must be `Send + Sync

Source from the content-addressed store, hash-verified

98/// can return `Ok(0)` / `Ok(())` for agents that don't support hook
99/// installation (e.g., agents detected via file watching instead).
100pub trait AgentHook: Send + Sync + fmt::Debug {
101 /// Returns the registry key for this agent.
102 ///
103 /// This is the string used in CLI commands:
104 /// `atomic agent enable --agent <name>`
105 /// `atomic agent hooks <name> <verb>`
106 ///
107 /// Convention: lowercase with hyphens (e.g., "claude-code", "gemini-cli").
108 fn name(&self) -> &str;
109
110 /// Returns a human-readable display name.
111 ///
112 /// Used in UI output and log messages (e.g., "Claude Code", "Gemini CLI").
113 fn display_name(&self) -> &str;
114
115 /// Parse hook input from an agent callback into a normalized [`TurnEvent`].
116 ///
117 /// The `input` parameter is the raw bytes read from stdin when the agent
118 /// invokes the hook. Each agent sends a different JSON format.
119 ///
120 /// # Arguments
121 ///
122 /// * `hook_type` - The type of lifecycle event (from the CLI verb)
123 /// * `input` - Raw bytes from stdin (typically JSON)
124 ///
125 /// # Errors
126 ///
127 /// Returns [`AgentError::HookParseFailed`] if the input cannot be parsed,
128 /// or [`AgentError::HookInputEmpty`] if `input` is empty.
129 fn parse_event(&self, hook_type: HookType, input: &[u8]) -> AgentResult<TurnEvent>;
130
131 /// Install hooks into the agent's configuration file.
132 ///
133 /// This writes entries into the agent's settings file (e.g.,
134 /// `.claude/settings.json`) that call back to `atomic agent hooks`.
135 ///
136 /// # Arguments
137 ///
138 /// * `repo_root` - The repository root directory (where `.atomic/` lives)
139 ///
140 /// # Returns
141 ///
142 /// The number of hooks that were installed. Returns 0 if all hooks
143 /// were already present.
144 ///
145 /// # Errors
146 ///
147 /// Returns [`AgentError::ConfigError`] if the config file cannot be
148 /// read or written.
149 fn install(&self, repo_root: &Path) -> AgentResult<usize>;
150
151 /// Remove hooks from the agent's configuration file.
152 ///
153 /// Removes only hooks with the `atomic agent hooks` prefix — other
154 /// hooks in the agent's config are preserved.
155 ///
156 /// # Arguments
157 ///

Callers

nothing calls this directly

Implementers 13

gemini_cli.rsatomic-agent/src/hooks/gemini_cli.rs
mod.rsatomic-agent/src/hooks/mod.rs
copilot.rsatomic-agent/src/hooks/copilot.rs
cline.rsatomic-agent/src/hooks/cline.rs
hermes.rsatomic-agent/src/hooks/hermes.rs
codex.rsatomic-agent/src/hooks/codex.rs
pi.rsatomic-agent/src/hooks/pi.rs
kiro.rsatomic-agent/src/hooks/kiro.rs
opencode.rsatomic-agent/src/hooks/opencode.rs
sherpa.rsatomic-agent/src/hooks/sherpa.rs
devin.rsatomic-agent/src/hooks/devin.rs
cursor.rsatomic-agent/src/hooks/cursor.rs

Calls

no outgoing calls

Tested by

no test coverage detected