Skip to content

Conversation

@taltas
Copy link
Contributor

@taltas taltas commented Jan 16, 2026

Summary

This PR implements a Claude Code-compatible hooks system for Roo Code, enabling users to run custom shell commands at key lifecycle events during AI assistant interactions.

Features

Core Hooks System

  • 8+ Lifecycle Events: PreToolUse, PostToolUse, ToolError, UserPromptSubmit, PermissionRequest, NotificationReceived, Stop, SubAgentStop
  • Blocking Capabilities: PreToolUse, PermissionRequest, and UserPromptSubmit hooks can block/modify execution
  • Claude Code Compatibility: Compatible JSON stdin format, environment variables, and exit codes

Configuration

  • Project-level hooks via .roo/hooks.json
  • Global hooks via extension settings
  • Mode-specific hook configurations
  • Pattern matching for tool/path filtering

Components

  • HookConfigLoader: Loads and merges hooks from project/global/mode configs
  • HookExecutor: Executes hooks as subprocesses with JSON input/output
  • HookMatcher: Matches events against hook matchers (tool names, patterns)
  • HookManager: Orchestrates hook discovery and execution
  • ToolExecutionHooks: Integration with tool execution lifecycle

Security

  • Hooks run with 60-second default timeout
  • Cannot bypass tool approval flow
  • User-controlled configuration only

Documentation

See hooks-prd.md for full PRD including:

  • Detailed requirements and user stories
  • Configuration schema
  • Execution semantics
  • Security model
  • Test plan

Testing

All components include comprehensive unit tests:

  • HookConfigLoader.spec.ts
  • HookExecutor.spec.ts
  • HookManager.spec.ts
  • HookMatcher.spec.ts
  • webviewMessageHandler.hooks.spec.ts

Related

Addresses community request for event-driven automation (Discussion #6147)


Important

Implements a Claude Code-compatible hooks system in Roo Code, enabling custom shell command execution at lifecycle events, with configuration, management, and UI integration.

  • Behavior:
    • Implements a hooks system compatible with Claude Code, handling events like PreToolUse, PostToolUse, ToolError, etc.
    • Supports blocking/modifying execution for certain events.
    • Configurable via .roo/hooks.json and global settings.
  • Components:
    • HookManager, HookExecutor, HookMatcher, ToolExecutionHooks classes for managing and executing hooks.
    • HookConfigLoader for loading and merging hook configurations.
  • UI:
    • Adds HooksSettings component to manage hooks in the settings UI.
    • Displays hook execution history and allows enabling/disabling hooks.
  • Testing:
    • Comprehensive tests for hook configuration, execution, and UI components.
    • Tests for HookManager, HookExecutor, HookMatcher, and HookConfigLoader.

This description was created by Ellipsis for 22eda99. You can customize this summary. It will automatically update as commits are pushed.

Add lifecycle hooks for tool execution with 12 event types:
- PreToolUse, PostToolUse, PostToolUseFailure, PermissionRequest
- SessionStart, SessionEnd, Stop, SubagentStart, SubagentStop
- UserPromptSubmit, Notification, PreCompact

Core implementation:
- HookManager service with config loading, validation, and execution
- HookExecutor for shell command execution with timeout, stdin JSON, env vars
- HookConfigLoader with project/global/mode-specific precedence
- HookMatcher for pattern matching (exact, regex, glob)
- ToolExecutionHooks adapter for pipeline interception

Tool pipeline integration:
- PreToolUse hooks can block or modify tool input
- PostToolUse/PostToolUseFailure for non-blocking notifications
- PermissionRequest hooks before approval prompts

Webview UI:
- Hooks tab in Settings with enable/disable toggles
- Hook Activity log with real-time status updates
- Reload config and open folder actions

Includes comprehensive tests for all components.

Relates to: Claude Code hooks feature parity
@taltas taltas requested review from cte, jr and mrubens as code owners January 16, 2026 19:57
@dosubot dosubot bot added size:XXL This PR changes 1000+ lines, ignoring generated files. Enhancement New feature or request labels Jan 16, 2026
@roomote
Copy link
Contributor

roomote bot commented Jan 16, 2026

Rooviewer Clock   See task on Roo Cloud

Review complete. This commit adds hook execution display in the chat by introducing a new "hook_triggered" say message type, a SayCallback in ToolExecutionHooks, and corresponding UI in ChatRow. No new issues found. The previously flagged issue remains unresolved.

  • Dead code in ClineProvider.getHooksStateForWebview(): meaningless ternary expression on line 2271
Previous reviews

Mention @roomote in a comment to request specific changes to this pull request or fix all unresolved issues.

timestamp: exec.timestamp.toISOString(),
hookId: exec.hook.id,
event: exec.event,
toolName: exec.result.hook.matcher ? undefined : undefined, // Tool name is in context, not easily accessible here
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This ternary expression always evaluates to undefined regardless of the condition (exec.result.hook.matcher ? undefined : undefined). The comment suggests this was intentional because extracting the tool name is difficult, but the condition serves no purpose and makes the code misleading. Consider simplifying to just toolName: undefined to make the intent clear, or actually extracting the tool name if it's available in the execution context.

Suggested change
toolName: exec.result.hook.matcher ? undefined : undefined, // Tool name is in context, not easily accessible here
toolName: undefined, // Tool name is in context, not easily accessible here

Fix it with Roo Code or mention @roomote and request a fix.

Update Hooks UI to explicitly document that matchers use Roo Code internal tool IDs (e.g. write_to_file, execute_command) rather than display labels.
Add regression test ensuring display labels do not unintentionally match internal IDs.
Add open project/global folder buttons at bottom
Move reload to bottom
Add enable-all toggle (with new message type)
Convert hooks list to accordion + per-hook logs
- Add switch, status dot, and delete button to HooksSettings UI
- Implement backend support for hook deletion
- Add safeWriteText utility
- Update translation strings
- Add UI and backend tests for new functionality
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Enhancement New feature or request size:XXL This PR changes 1000+ lines, ignoring generated files.

Projects

Status: Triage

Development

Successfully merging this pull request may close these issues.

1 participant