Initial commit
This commit is contained in:
84
hooks/handlers/session_start_handler.rb
Executable file
84
hooks/handlers/session_start_handler.rb
Executable file
@@ -0,0 +1,84 @@
|
||||
#!/usr/bin/env ruby
|
||||
# frozen_string_literal: true
|
||||
|
||||
require 'date'
|
||||
require 'claude_hooks'
|
||||
|
||||
# SessionStart Handler
|
||||
#
|
||||
# PURPOSE: Initialize session state, setup logging, prepare environment
|
||||
# TRIGGERS: When a new Claude Code session begins
|
||||
#
|
||||
# SETTINGS.JSON CONFIGURATION:
|
||||
# {
|
||||
# "hooks": {
|
||||
# "SessionStart": [{
|
||||
# "matcher": "",
|
||||
# "hooks": [{
|
||||
# "type": "command",
|
||||
# "command": "$CLAUDE_PROJECT_DIR/.claude/hooks/entrypoints/session_start.rb"
|
||||
# }]
|
||||
# }]
|
||||
# }
|
||||
# }
|
||||
|
||||
class SessionStartHandler < ClaudeHooks::SessionStart
|
||||
def call
|
||||
log "Session starting for project: #{project_name}"
|
||||
|
||||
backup_projects_directory
|
||||
acknowledge_current_date
|
||||
|
||||
allow_continue!
|
||||
suppress_output!
|
||||
|
||||
output_data
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def project_name
|
||||
File.basename(cwd || Dir.pwd)
|
||||
end
|
||||
|
||||
def backup_projects_directory
|
||||
source_dir = File.expand_path('~/.claude/projects')
|
||||
backup_dir = File.expand_path('~/backups/claude/projects')
|
||||
|
||||
if Dir.exist?(source_dir)
|
||||
log 'Backing up projects directory to ~/backups/claude/projects'
|
||||
|
||||
# Create backup directory if it doesn't exist
|
||||
system('mkdir', '-p', backup_dir)
|
||||
|
||||
# Remove existing backup and copy fresh
|
||||
system('rm', '-rf', backup_dir) if Dir.exist?(backup_dir)
|
||||
|
||||
# Copy the projects directory
|
||||
if system('cp', '-r', source_dir, backup_dir)
|
||||
log 'Projects directory backup completed successfully'
|
||||
else
|
||||
log 'Warning: Projects directory backup failed'
|
||||
end
|
||||
else
|
||||
log 'No projects directory found to backup'
|
||||
end
|
||||
end
|
||||
|
||||
def acknowledge_current_date
|
||||
# Add timestamp to backend context only
|
||||
current_time = Time.now.strftime('%B %d, %Y at %I:%M %p %Z')
|
||||
day_of_week = Date.today.strftime('%A')
|
||||
|
||||
# Use additionalContext for Claude instructions (will be minimally visible)
|
||||
context_message = "Current local date and time: #{day_of_week}, #{current_time}"
|
||||
add_additional_context!("#{context_message}. Acknowledge the current date and time in your first response.")
|
||||
end
|
||||
end
|
||||
|
||||
# Testing support - run this file directly to test with sample data
|
||||
if __FILE__ == $PROGRAM_NAME
|
||||
ClaudeHooks::CLI.test_runner(SessionStartHandler) do |input_data|
|
||||
input_data['session_id'] = 'test-session-01'
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user