commit 5438ebbb4eac2598b50ffc94eb36b99dc5596819 Author: retoor Date: Wed Sep 16 08:27:56 2026 +0000 WOrks perfect diff --git a/install.py b/install.py new file mode 100755 index 0000000..611d656 --- /dev/null +++ b/install.py @@ -0,0 +1,139 @@ +#!/usr/bin/env python3 +import os +import re + +def setup_claude_whoops_config(): + """Create ~/.claude_whoops directory and default system message""" + config_dir = os.path.expanduser("~/.claude_whoops") + os.makedirs(config_dir, exist_ok=True) + + system_msg_path = os.path.join(config_dir, "system_message") + + # Only create if doesn't exist + if not os.path.exists(system_msg_path): + default_message = """Please read ~/.tmux_context to see the user context at the moment. It is his terminal output. Maybe he has an issue that you can solve.""" + with open(system_msg_path, 'w') as f: + f.write(default_message) + print(f"✓ Created {system_msg_path}") + else: + print(f"✓ {system_msg_path} already exists (not overwriting)") + +def install_command_handler(): + """Install or update command not found handler in .bashrc""" + bashrc_path = os.path.expanduser("~/.bashrc") + + # Read existing content + if os.path.exists(bashrc_path): + with open(bashrc_path, 'r') as f: + content = f.read() + else: + content = "" + + # Remove DPE command-not-found handler source line + content = re.sub(r'\[ -f /etc/dpe-command-not-found\.sh \].*\n', '', content) + + # Remove ALL existing command_not_found handlers/handles + content = re.sub( + r'# Claude command not found handlers?\n' + r'command_not_found_hand(?:ler|le)\(\) \{[^}]*\}\n+', + '', + content, + flags=re.MULTILINE | re.DOTALL + ) + # Remove any other command_not_found_handler or handle definitions + content = re.sub( + r'command_not_found_hand(?:ler|le)\(\) \{[^}]*\}\n*', + '', + content, + flags=re.DOTALL + ) + + # Add new handlers at the end (both bash standard and DPE variant) + handler = '''# Claude command not found handlers +command_not_found_handler() { + local cmd="$1" + shift + + # Capture tmux pane if available + if command -v tmux >/dev/null 2>&1 && [ -n "$TMUX" ]; then + tmux capture-pane -p > "$HOME/.tmux_context" 2>/dev/null || true + fi + + # Build prompt with system message if configured + local prompt="$cmd $*" + if [ -f "$HOME/.claude_whoops/system_message" ]; then + local sys_msg=$(cat "$HOME/.claude_whoops/system_message") + prompt="$sys_msg + +$prompt" + fi + + # Execute claude with prompt (bypass permissions for smooth UX) + claude --permission-mode bypassPermissions -p "$prompt" + return 127 +} + +# DPE variant +command_not_found_handle() { + local cmd="$1" + shift + + # Capture tmux pane if available + if command -v tmux >/dev/null 2>&1 && [ -n "$TMUX" ]; then + tmux capture-pane -p > "$HOME/.tmux_context" 2>/dev/null || true + fi + + # Build prompt with system message if configured + local prompt="$cmd $*" + if [ -f "$HOME/.claude_whoops/system_message" ]; then + local sys_msg=$(cat "$HOME/.claude_whoops/system_message") + prompt="$sys_msg + +$prompt" + fi + + # Execute claude with prompt (bypass permissions for smooth UX) + claude --permission-mode bypassPermissions -p "$prompt" + return 127 +} +''' + + content = content.rstrip() + '\n\n' + handler + + # Write back + with open(bashrc_path, 'w') as f: + f.write(content) + + print("✓ Installed Claude command not found handlers in ~/.bashrc") + +def print_documentation(): + """Print concise professional documentation""" + msg_file = os.path.expanduser("~/.claude_whoops/system_message") + current_msg = "" + if os.path.exists(msg_file): + with open(msg_file, 'r') as f: + current_msg = f.read().strip() + + docs = f"""CLAUDE COMMAND NOT FOUND INTEGRATION + +Overview: + Intercepts unknown commands, captures tmux context, sends to Claude for analysis. + +Configuration: + ~/.bashrc Handler functions (command_not_found_handler/handle) + ~/.claude_whoops/system_message System prompt (customize here) + ~/.tmux_context Terminal context (generated on-demand) + +Current system message: + {current_msg} + +Customize: + Edit ~/.claude_whoops/system_message to change Claude's behavior. + Run python3 install.py to refresh handlers (preserves custom config). +""" + print(docs) + +if __name__ == "__main__": + setup_claude_whoops_config() + install_command_handler() + print_documentation()