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

Interface AgentHook

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

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

Callers

nothing calls this directly

Implementers 15

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
agy.rsatomic-agent/src/hooks/agy.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

Calls

no outgoing calls

Tested by

no test coverage detected