- Remove dead code (meaningless ternary) in ClineProvider.getHooksStateForWebview()
- Remove console spam in HookMatcher.expandGroupPatterns for non-group patterns
- Update test to match new behavior (no warning for unknown patterns)
Implement LifecycleHooks and ToolExecutionHooks with full test coverage. Refactor ClineProvider and webviewMessageHandler for new hook lifecycle. Update Task logic for hook integration. All tests pass.
Introduce hook event categories and event-specific matcher semantics.
- Add helper APIs to validate matchers per event
- Warn/clear invalid matchers when loading or updating config
- Update Hooks settings UI with searchable event selector and
matcher controls that adapt to the selected event
- Add tests for matcher validation and parsing
Stream hook stdout/stderr into chat with terminal-style HookExecution blocks.\n\nAdds hookExecutionOutputStatus protocol and persisted hook_execution rows with truncated summaries.
Send hook-centric enabledHooks state to webview (one entry per id) and expose aggregated events[] for UI rendering. Adds regression test for ClineProvider hooks state shaping.
- Keep multiple events for same hook id when definitions match\n- Expand matcher groups when combined with | (e.g. read|edit)\n- Add regression tests for both cases
- Refactor YAML structure to be hook-centric (array-based) instead of event-keyed
- Remove version key from schema and code
- Add "Copy Hook" functionality to duplicate hooks
- Enhance Settings UI:
- Add event tooltips with descriptions
- Add editable hook ID field with validation
- Add multi-line command editing
- Add "Copy" button
- Update config loader to support both new and legacy formats (read-only compatibility)
- Update config writer to always emit new format
- Add comprehensive tests for migration, copy logic, and new UI components
- Update hooksSetAllEnabled tests to match global hooksEnabled toggle behavior\n- Add IHookManager.updateHook to test mocks after interface change\n- Narrow hooksUpdateHook events to HookEventType via schema validation
- Add getToolsForGroup() helper to expand group names to tool lists
- Update HookMatcher to support group names like "edit", "read", "browser"
- Group names are case-insensitive and expand to all tools in the group
- Unknown group names log a warning but don't break the hook
- Add comprehensive tests for group expansion functionality
Supported groups: read, edit, browser, command, mcp, modes
Remove hooks from experimental flags and make it a core feature:
- Remove HOOKS from ExperimentId enum and experimentsSchema
- Initialize HookManager unconditionally in ClineProvider
- Remove experiment checks from webviewMessageHandler
- Always show Hooks tab in SettingsView
- Add dynamic initialization with file watchers (no restart required)
- Update translations to remove restart requirement text
- Add comprehensive tests for dynamic hook initialization
The master 'Enable Hooks' toggle in HooksSettings controls execution.
- Add hooksEnabled check to all ToolExecutionHooks methods
- Hooks do not execute when master toggle is off
- Update Task.ts to inject hooksEnabled getter
- Add hooksEnabled to GlobalSettings schema and ExtensionState
- UI hides hook list when master toggle is disabled
- Add comprehensive tests for toggle enforcement (15 tests)
- Add 'Create New Hook' button above 'Open Global Folder' button
- Remove borders from hook items to match flat MCP styling
- Implement hooksCreateNew message handler to create example.yaml
- Fix YAML template indentation to use standard 2-space format
- Add translation strings for new UI elements
Move the periodic hooks configuration reload from the HooksSettings component to the main App component. This ensures that hooks are reloaded every 5 seconds whenever the feature is enabled, regardless of which settings tab is currently active.
Implement hooks experimental flag with conditional UI rendering and backend functionality gating.
Fix missing experimental settings translations for hooks feature.
Fix hook discovery issue by initializing HookManager when experiment is toggled on.
- 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
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
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 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