From f08704af5e8504d48356f1251518e3f731e64f3f Mon Sep 17 00:00:00 2001 From: Claude Agent Date: Tue, 6 Jan 2026 23:58:42 +0000 Subject: [PATCH] feat: Add /learn:setup command for hook installation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add setup.md command to install SessionEnd and PreCompact hooks - Add install-hooks.sh script for automatic hook installation to ~/.claude/settings.json - Hooks remind user to run /learn:analyze before session end or auto-compact - Bump version to 2.1.2 ๐Ÿค– Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- .claude-plugin/marketplace.json | 2 +- plugins/learn/.claude-plugin/plugin.json | 2 +- plugins/learn/commands/setup.md | 58 ++++++++++++ plugins/learn/scripts/install-hooks.sh | 113 +++++++++++++++++++++++ 4 files changed, 173 insertions(+), 2 deletions(-) create mode 100644 plugins/learn/commands/setup.md create mode 100755 plugins/learn/scripts/install-hooks.sh diff --git a/.claude-plugin/marketplace.json b/.claude-plugin/marketplace.json index 528e2d6..c351e85 100644 --- a/.claude-plugin/marketplace.json +++ b/.claude-plugin/marketplace.json @@ -11,7 +11,7 @@ "name": "learn", "source": "./plugins/learn", "description": "Domain-based memory with selective saving, signal detection, and memory hygiene", - "version": "2.1.1", + "version": "2.1.2", "keywords": ["learn", "memory", "patterns", "gotchas", "domains", "cleanup", "hygiene"] } ] diff --git a/plugins/learn/.claude-plugin/plugin.json b/plugins/learn/.claude-plugin/plugin.json index 9440f6b..8088147 100644 --- a/plugins/learn/.claude-plugin/plugin.json +++ b/plugins/learn/.claude-plugin/plugin.json @@ -1,7 +1,7 @@ { "name": "learn", "description": "Claude Learn: Session analysis for patterns and gotchas with domain-based memory, selective saving, and memory hygiene", - "version": "2.1.1", + "version": "2.1.2", "author": { "name": "Romfast Team" } diff --git a/plugins/learn/commands/setup.md b/plugins/learn/commands/setup.md new file mode 100644 index 0000000..78b7c3e --- /dev/null +++ b/plugins/learn/commands/setup.md @@ -0,0 +1,58 @@ +# /learn:setup - Install Learn Plugin Hooks + +Instaleazฤƒ hooks-urile plugin-ului Learn รฎn configuraศ›ia Claude Code. + +## Task + +Verificฤƒ ศ™i instaleazฤƒ hooks-urile necesare pentru plugin-ul Learn รฎn `~/.claude/settings.json`. + +### Hooks de instalat: + +1. **SessionEnd** - Reminder la sfรขrศ™itul sesiunii sฤƒ rulezi `/learn:analyze` +2. **PreCompact** (auto) - Reminder รฎnainte de auto-compact sฤƒ salvezi lecศ›iile + +### Paศ™i: + +1. Citeศ™te `~/.claude/settings.json` +2. Verificฤƒ dacฤƒ existฤƒ deja secศ›iunea `hooks` +3. Adaugฤƒ sau actualizeazฤƒ hooks-urile pentru Learn plugin: + +```json +{ + "hooks": { + "SessionEnd": [ + { + "type": "command", + "command": "echo '\nโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”\n๐Ÿ’ก Tip: Ruleazฤƒ /learn:analyze pentru a captura lecศ›iile din sesiune\nโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”'", + "timeout": 5 + } + ], + "PreCompact": [ + { + "matcher": "auto", + "hooks": [ + { + "type": "command", + "command": "echo '\nโš ๏ธ Context plin! Ruleazฤƒ /learn:analyze ACUM pentru a salva lecศ›iile รฎnainte de compact!\n'", + "timeout": 5 + } + ] + } + ] + } +} +``` + +4. Salveazฤƒ fiศ™ierul actualizat +5. Confirmฤƒ instalarea cu succes + +### Output: + +Afiศ™eazฤƒ: +- Ce hooks au fost instalate +- Dacฤƒ erau deja instalate (skip) +- Instrucศ›iuni pentru a verifica cu `/hooks` + +### Notฤƒ: + +Aceastฤƒ comandฤƒ modificฤƒ `~/.claude/settings.json`. Hooks-urile vor fi active din urmฤƒtoarea sesiune Claude Code. diff --git a/plugins/learn/scripts/install-hooks.sh b/plugins/learn/scripts/install-hooks.sh new file mode 100755 index 0000000..2940a02 --- /dev/null +++ b/plugins/learn/scripts/install-hooks.sh @@ -0,0 +1,113 @@ +#!/bin/bash +# Claude Learn - Install Hooks +# Adaugฤƒ hooks-urile Learn รฎn ~/.claude/settings.json + +SETTINGS_FILE="$HOME/.claude/settings.json" + +# Colors +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +CYAN='\033[0;36m' +RED='\033[0;31m' +NC='\033[0m' + +echo -e "${CYAN}โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”${NC}" +echo -e "${CYAN} Claude Learn - Hook Installation${NC}" +echo -e "${CYAN}โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”${NC}" + +# Check if settings file exists +if [ ! -f "$SETTINGS_FILE" ]; then + echo -e "${RED}Error: $SETTINGS_FILE not found${NC}" + exit 1 +fi + +# Backup +cp "$SETTINGS_FILE" "$SETTINGS_FILE.backup" +echo -e "${GREEN}โœ“${NC} Backup created: settings.json.backup" + +# Check if hooks already exist +if python3 -c "import json; d=json.load(open('$SETTINGS_FILE')); exit(0 if 'hooks' in d else 1)" 2>/dev/null; then + echo -e "${YELLOW}โš ${NC} Hooks section already exists in settings.json" + echo -e " Checking for Learn hooks..." + + # Check if SessionEnd already has our hook + HAS_LEARN=$(python3 -c " +import json +d = json.load(open('$SETTINGS_FILE')) +hooks = d.get('hooks', {}) +session_end = hooks.get('SessionEnd', []) +for h in session_end: + cmd = h.get('command', '') + if 'learn:analyze' in cmd: + print('yes') + exit(0) +print('no') +" 2>/dev/null) + + if [ "$HAS_LEARN" = "yes" ]; then + echo -e "${GREEN}โœ“${NC} Learn hooks already installed!" + exit 0 + fi +fi + +# Add hooks using Python +python3 << 'PYTHON_SCRIPT' +import json +import os + +settings_file = os.path.expanduser("~/.claude/settings.json") + +with open(settings_file, 'r') as f: + settings = json.load(f) + +# Define Learn hooks +learn_session_end = { + "type": "command", + "command": "echo '\nโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”\n๐Ÿ’ก Tip: Ruleazฤƒ /learn:analyze pentru a captura lecศ›iile din sesiune\nโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”'", + "timeout": 5 +} + +learn_pre_compact = { + "matcher": "auto", + "hooks": [ + { + "type": "command", + "command": "echo '\nโš ๏ธ Context plin! Ruleazฤƒ /learn:analyze ACUM pentru a salva lecศ›iile รฎnainte de compact!\n'", + "timeout": 5 + } + ] +} + +# Initialize hooks if not exists +if 'hooks' not in settings: + settings['hooks'] = {} + +# Add SessionEnd hook +if 'SessionEnd' not in settings['hooks']: + settings['hooks']['SessionEnd'] = [] +settings['hooks']['SessionEnd'].append(learn_session_end) + +# Add PreCompact hook +if 'PreCompact' not in settings['hooks']: + settings['hooks']['PreCompact'] = [] +settings['hooks']['PreCompact'].append(learn_pre_compact) + +# Write back +with open(settings_file, 'w') as f: + json.dump(settings, f, indent=2) + +print("Hooks added successfully!") +PYTHON_SCRIPT + +if [ $? -eq 0 ]; then + echo -e "${GREEN}โœ“${NC} SessionEnd hook installed" + echo -e "${GREEN}โœ“${NC} PreCompact hook installed" + echo "" + echo -e "${CYAN}Hooks-urile vor fi active din urmฤƒtoarea sesiune Claude Code.${NC}" + echo -e "Verificฤƒ cu: ${YELLOW}/hooks${NC}" +else + echo -e "${RED}Error installing hooks${NC}" + # Restore backup + mv "$SETTINGS_FILE.backup" "$SETTINGS_FILE" + exit 1 +fi