85 lines
2.2 KiB
Ruby
Executable File
85 lines
2.2 KiB
Ruby
Executable File
#!/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
|