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

Interface AgentHook

atomic-agent/src/hooks/mod.rs:130–234  ·  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

128/// can return `Ok(0)` / `Ok(())` for agents that don't support hook
129/// installation (e.g., agents detected via file watching instead).
130pub trait AgentHook: Send + Sync + fmt::Debug {
131 /// Returns the registry key for this agent.
132 ///
133 /// This is the string used in CLI commands:
134 /// `atomic agent enable --agent <name>`
135 /// `atomic agent hooks <name> <verb>`
136 ///
137 /// Convention: lowercase with hyphens (e.g., "claude-code", "gemini-cli").
138 fn name(&self) -> &str;
139
140 /// Returns a human-readable display name.
141 ///
142 /// Used in UI output and log messages (e.g., "Claude Code", "Gemini CLI").
143 fn display_name(&self) -> &str;
144
145 /// Parse hook input from an agent callback into a normalized [`TurnEvent`].
146 ///
147 /// The `input` parameter is the raw bytes read from stdin when the agent
148 /// invokes the hook. Each agent sends a different JSON format.
149 ///
150 /// # Arguments
151 ///
152 /// * `hook_type` - The type of lifecycle event (from the CLI verb)
153 /// * `input` - Raw bytes from stdin (typically JSON)
154 ///
155 /// # Errors
156 ///
157 /// Returns [`AgentError::HookParseFailed`] if the input cannot be parsed,
158 /// or [`AgentError::HookInputEmpty`] if `input` is empty.
159 fn parse_event(&self, hook_type: HookType, input: &[u8]) -> AgentResult<TurnEvent>;
160
161 /// Install hooks into the agent's configuration file.
162 ///
163 /// This writes entries into the agent's settings file (e.g.,
164 /// `.claude/settings.json`) that call back to `atomic agent hooks`.
165 ///
166 /// # Arguments
167 ///
168 /// * `repo_root` - The repository root directory (where `.atomic/` lives)
169 ///
170 /// # Returns
171 ///
172 /// The number of hooks that were installed. Returns 0 if all hooks
173 /// were already present.
174 ///
175 /// # Errors
176 ///
177 /// Returns [`AgentError::ConfigError`] if the config file cannot be
178 /// read or written.
179 fn install(&self, repo_root: &Path) -> AgentResult<usize>;
180
181 /// Remove hooks from the agent's configuration file.
182 ///
183 /// Removes only hooks with the `atomic agent hooks` prefix — other
184 /// hooks in the agent's config are preserved.
185 ///
186 /// # Arguments
187 ///

Callers

nothing calls this directly

Implementers 14

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
kilo.rsatomic-agent/src/hooks/kilo.rs
opencode.rsatomic-agent/src/hooks/opencode.rs
sherpa.rsatomic-agent/src/hooks/sherpa.rs
devin.rsatomic-agent/src/hooks/devin.rs

Calls

no outgoing calls

Tested by

no test coverage detected