#!/bin/bash # Continuous Learning - Session Evaluator # Runs on sessionEnd to extract reusable patterns from Cursor sessions # # Configured in .cursor/hooks.json: # sessionEnd -> node .cursor/scripts/hooks/evaluate-session.js # This shell version is a fallback. # # Extracted skills saved to: .agents/skills/learned/ set -e SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" ROOT="$(git rev-parse --show-toplevel 2>/dev/null || pwd)" CONFIG_FILE="$SCRIPT_DIR/config.json" LEARNED_SKILLS_PATH="${ROOT}/.agents/skills/learned" MIN_SESSION_LENGTH=10 # Load config if exists if [ -f "$CONFIG_FILE" ]; then MIN_SESSION_LENGTH=$(jq -r '.min_session_length // 10' "$CONFIG_FILE") configured_path=$(jq -r '.learned_skills_path // empty' "$CONFIG_FILE") if [ -n "$configured_path" ]; then LEARNED_SKILLS_PATH=$(echo "$configured_path" | sed "s|~|$HOME|") case "$LEARNED_SKILLS_PATH" in /*) ;; *) LEARNED_SKILLS_PATH="${ROOT}/${LEARNED_SKILLS_PATH}" ;; esac fi fi # Ensure learned skills directory exists mkdir -p "$LEARNED_SKILLS_PATH" # Get transcript path from environment (set by Claude Code) transcript_path="${CLAUDE_TRANSCRIPT_PATH:-}" if [ -z "$transcript_path" ] || [ ! -f "$transcript_path" ]; then exit 0 fi # Count messages in session message_count=$(grep -c '"type":"user"' "$transcript_path" 2>/dev/null || echo "0") # Skip short sessions if [ "$message_count" -lt "$MIN_SESSION_LENGTH" ]; then echo "[ContinuousLearning] Session too short ($message_count messages), skipping" >&2 exit 0 fi # Signal to Claude that session should be evaluated for extractable patterns echo "[ContinuousLearning] Session has $message_count messages - evaluate for extractable patterns" >&2 echo "[ContinuousLearning] Save learned skills to: $LEARNED_SKILLS_PATH" >&2