Initial commit
This commit is contained in:
103
hooks/handlers/user_prompt_submit_handler.rb
Executable file
103
hooks/handlers/user_prompt_submit_handler.rb
Executable file
@@ -0,0 +1,103 @@
|
||||
#!/usr/bin/env ruby
|
||||
# frozen_string_literal: true
|
||||
|
||||
require 'claude_hooks'
|
||||
|
||||
# UserPromptSubmit Handler
|
||||
#
|
||||
# PURPOSE: Modify, validate, or enhance user prompts before processing
|
||||
# TRIGGERS: When user submits a prompt to Claude Code
|
||||
#
|
||||
# COMMON USE CASES:
|
||||
# - Add context rules or project-specific instructions
|
||||
# - Validate prompt content (block inappropriate requests)
|
||||
# - Append relevant documentation or code examples
|
||||
# - Transform or rewrite prompts for better results
|
||||
# - Log user interactions for analytics
|
||||
# - Apply prompt templates or formatting
|
||||
#
|
||||
# SETTINGS.JSON CONFIGURATION:
|
||||
# {
|
||||
# "hooks": {
|
||||
# "UserPromptSubmit": [{
|
||||
# "matcher": "",
|
||||
# "hooks": [{
|
||||
# "type": "command",
|
||||
# "command": "$CLAUDE_PROJECT_DIR/.claude/hooks/entrypoints/user_prompt_submit.rb"
|
||||
# }]
|
||||
# }]
|
||||
# }
|
||||
# }
|
||||
|
||||
class UserPromptSubmitHandler < ClaudeHooks::UserPromptSubmit
|
||||
def call
|
||||
log "Processing user prompt: #{prompt[0..100]}..."
|
||||
|
||||
# Example: Add project context
|
||||
# add_project_context
|
||||
|
||||
# Example: Validate prompt content
|
||||
# validate_prompt_content
|
||||
|
||||
# Example: Apply prompt transformations
|
||||
# transform_prompt
|
||||
|
||||
# Example: Log the interaction
|
||||
# log_user_interaction
|
||||
|
||||
output_data
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def add_project_context
|
||||
# Example: Add project-specific rules or context
|
||||
context_file = project_path_for('rules/project-context.md')
|
||||
|
||||
return unless File.exist?(context_file)
|
||||
|
||||
context = File.read(context_file)
|
||||
add_additional_context!(context)
|
||||
log "Added project context (#{context.length} characters)"
|
||||
end
|
||||
|
||||
def validate_prompt_content
|
||||
# Example: Block prompts that contain sensitive patterns
|
||||
sensitive_patterns = [
|
||||
/api[_\s]?key/i,
|
||||
/password/i,
|
||||
/secret/i
|
||||
]
|
||||
|
||||
sensitive_patterns.each do |pattern|
|
||||
next unless prompt.match?(pattern)
|
||||
|
||||
block_prompt!('Prompt may contain sensitive information')
|
||||
log "Blocked prompt containing sensitive pattern: #{pattern}", level: :warn
|
||||
return
|
||||
end
|
||||
end
|
||||
|
||||
def transform_prompt
|
||||
# Example: Add helpful formatting or structure
|
||||
return unless prompt.downcase.include?('help me implement')
|
||||
|
||||
add_additional_context!(
|
||||
'Please provide step-by-step implementation guidance and consider edge cases.'
|
||||
)
|
||||
end
|
||||
|
||||
def log_user_interaction
|
||||
# Example: Log prompt for analytics (be careful with privacy)
|
||||
log "User prompt length: #{prompt.length} characters"
|
||||
log "Session: #{session_id}"
|
||||
end
|
||||
end
|
||||
|
||||
# Testing support - run this file directly to test with sample data
|
||||
if __FILE__ == $PROGRAM_NAME
|
||||
ClaudeHooks::CLI.test_runner(UserPromptSubmitHandler) do |input_data|
|
||||
input_data['prompt'] = 'Help me implement a new feature'
|
||||
input_data['session_id'] = 'test-session-01'
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user