[Config] Add coding guidelines and code-fixer agent
Major additions: - Add CODING_GUIDELINES.md with "NO EMOJIS" rule - Create code-fixer agent for automated violation fixes - Add offline mode v2 hooks with local caching/queue - Add periodic context save with invisible Task Scheduler setup - Add agent coordination rules and database connection docs Infrastructure: - Update hooks: task-complete-v2, user-prompt-submit-v2 - Add periodic_save_check.py for auto-save every 5min - Add PowerShell scripts: setup_periodic_save.ps1, update_to_invisible.ps1 - Add sync-contexts script for queue synchronization Documentation: - OFFLINE_MODE.md, PERIODIC_SAVE_INVISIBLE_SETUP.md - Migration procedures and verification docs - Fix flashing window guide Updates: - Update agent configs (backup, code-review, coding, database, gitea, testing) - Update claude.md with coding guidelines reference - Update .gitignore for new cache/queue directories Status: Pre-automated-fixer baseline commit Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -1,13 +1,14 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# Claude Code Hook: user-prompt-submit
|
||||
# Claude Code Hook: user-prompt-submit (v2 - with offline support)
|
||||
# Runs BEFORE each user message is processed
|
||||
# Injects relevant context from the database into the conversation
|
||||
# FALLBACK: Uses local cache when API is unavailable
|
||||
#
|
||||
# Expected environment variables:
|
||||
# CLAUDE_PROJECT_ID - UUID of the current project
|
||||
# JWT_TOKEN - Authentication token for API
|
||||
# CLAUDE_API_URL - API base URL (default: http://localhost:8000)
|
||||
# CLAUDE_API_URL - API base URL (default: http://172.16.3.30:8001)
|
||||
# CONTEXT_RECALL_ENABLED - Set to "false" to disable (default: true)
|
||||
# MIN_RELEVANCE_SCORE - Minimum score for context (default: 5.0)
|
||||
# MAX_CONTEXTS - Maximum number of contexts to retrieve (default: 10)
|
||||
@@ -20,11 +21,16 @@ if [ -f "$CONFIG_FILE" ]; then
|
||||
fi
|
||||
|
||||
# Default values
|
||||
API_URL="${CLAUDE_API_URL:-http://localhost:8000}"
|
||||
API_URL="${CLAUDE_API_URL:-http://172.16.3.30:8001}"
|
||||
ENABLED="${CONTEXT_RECALL_ENABLED:-true}"
|
||||
MIN_SCORE="${MIN_RELEVANCE_SCORE:-5.0}"
|
||||
MAX_ITEMS="${MAX_CONTEXTS:-10}"
|
||||
|
||||
# Local storage paths
|
||||
CLAUDE_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
||||
CACHE_DIR="$CLAUDE_DIR/context-cache"
|
||||
QUEUE_DIR="$CLAUDE_DIR/context-queue"
|
||||
|
||||
# Exit early if disabled
|
||||
if [ "$ENABLED" != "true" ]; then
|
||||
exit 0
|
||||
@@ -53,41 +59,74 @@ if [ -z "$PROJECT_ID" ]; then
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# Exit if no JWT token
|
||||
if [ -z "$JWT_TOKEN" ]; then
|
||||
exit 0
|
||||
# Create cache directory if it doesn't exist
|
||||
PROJECT_CACHE_DIR="$CACHE_DIR/$PROJECT_ID"
|
||||
mkdir -p "$PROJECT_CACHE_DIR" 2>/dev/null
|
||||
|
||||
# Try to sync any queued contexts first (opportunistic)
|
||||
if [ -d "$QUEUE_DIR/pending" ] && [ -n "$JWT_TOKEN" ]; then
|
||||
bash "$(dirname "${BASH_SOURCE[0]}")/sync-contexts" >/dev/null 2>&1 &
|
||||
fi
|
||||
|
||||
# Build API request URL
|
||||
RECALL_URL="${API_URL}/api/conversation-contexts/recall"
|
||||
QUERY_PARAMS="project_id=${PROJECT_ID}&limit=${MAX_ITEMS}&min_relevance_score=${MIN_SCORE}"
|
||||
|
||||
# Fetch context from API (with timeout and error handling)
|
||||
CONTEXT_RESPONSE=$(curl -s --max-time 3 \
|
||||
"${RECALL_URL}?${QUERY_PARAMS}" \
|
||||
-H "Authorization: Bearer ${JWT_TOKEN}" \
|
||||
-H "Accept: application/json" 2>/dev/null)
|
||||
# Try to fetch context from API (with timeout and error handling)
|
||||
API_AVAILABLE=false
|
||||
if [ -n "$JWT_TOKEN" ]; then
|
||||
CONTEXT_RESPONSE=$(curl -s --max-time 3 \
|
||||
"${RECALL_URL}?${QUERY_PARAMS}" \
|
||||
-H "Authorization: Bearer ${JWT_TOKEN}" \
|
||||
-H "Accept: application/json" 2>/dev/null)
|
||||
|
||||
# Check if request was successful
|
||||
if [ $? -ne 0 ] || [ -z "$CONTEXT_RESPONSE" ]; then
|
||||
# Silent failure - API unavailable
|
||||
exit 0
|
||||
if [ $? -eq 0 ] && [ -n "$CONTEXT_RESPONSE" ]; then
|
||||
# Check if response is valid JSON (not an error)
|
||||
echo "$CONTEXT_RESPONSE" | python3 -c "import sys, json; json.load(sys.stdin)" 2>/dev/null
|
||||
if [ $? -eq 0 ]; then
|
||||
API_AVAILABLE=true
|
||||
# Save to cache for offline use
|
||||
echo "$CONTEXT_RESPONSE" > "$PROJECT_CACHE_DIR/latest.json"
|
||||
echo "$(date -u +"%Y-%m-%dT%H:%M:%SZ")" > "$PROJECT_CACHE_DIR/last_updated"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
# Parse and format context (expects JSON array of context objects)
|
||||
# Example response: [{"title": "...", "dense_summary": "...", "relevance_score": 8.5}, ...]
|
||||
# Fallback to local cache if API unavailable
|
||||
if [ "$API_AVAILABLE" = "false" ]; then
|
||||
if [ -f "$PROJECT_CACHE_DIR/latest.json" ]; then
|
||||
CONTEXT_RESPONSE=$(cat "$PROJECT_CACHE_DIR/latest.json")
|
||||
CACHE_AGE="unknown"
|
||||
if [ -f "$PROJECT_CACHE_DIR/last_updated" ]; then
|
||||
CACHE_AGE=$(cat "$PROJECT_CACHE_DIR/last_updated")
|
||||
fi
|
||||
echo "<!-- Using cached context (API unavailable) - Last updated: $CACHE_AGE -->" >&2
|
||||
else
|
||||
# No cache available, exit silently
|
||||
exit 0
|
||||
fi
|
||||
fi
|
||||
|
||||
# Parse and format context
|
||||
CONTEXT_COUNT=$(echo "$CONTEXT_RESPONSE" | grep -o '"id"' | wc -l)
|
||||
|
||||
if [ "$CONTEXT_COUNT" -gt 0 ]; then
|
||||
echo "<!-- Context Recall: Retrieved $CONTEXT_COUNT relevant context(s) -->"
|
||||
if [ "$API_AVAILABLE" = "true" ]; then
|
||||
echo "<!-- Context Recall: Retrieved $CONTEXT_COUNT relevant context(s) from API -->"
|
||||
else
|
||||
echo "<!-- Context Recall: Retrieved $CONTEXT_COUNT relevant context(s) from LOCAL CACHE (offline mode) -->"
|
||||
fi
|
||||
echo ""
|
||||
echo "## 📚 Previous Context"
|
||||
echo ""
|
||||
echo "The following context has been automatically recalled from previous sessions:"
|
||||
if [ "$API_AVAILABLE" = "false" ]; then
|
||||
echo "⚠️ **Offline Mode** - Using cached context (API unavailable)"
|
||||
echo ""
|
||||
fi
|
||||
echo "The following context has been automatically recalled:"
|
||||
echo ""
|
||||
|
||||
# Extract and format each context entry
|
||||
# Note: This uses simple text parsing. For production, consider using jq if available.
|
||||
echo "$CONTEXT_RESPONSE" | python3 -c "
|
||||
import sys, json
|
||||
try:
|
||||
@@ -111,7 +150,11 @@ except:
|
||||
" 2>/dev/null
|
||||
|
||||
echo ""
|
||||
echo "*This context was automatically injected to help maintain continuity across sessions.*"
|
||||
if [ "$API_AVAILABLE" = "true" ]; then
|
||||
echo "*Context automatically injected to maintain continuity across sessions.*"
|
||||
else
|
||||
echo "*Context from local cache - new context will sync when API is available.*"
|
||||
fi
|
||||
echo ""
|
||||
fi
|
||||
|
||||
|
||||
Reference in New Issue
Block a user