- Replaced emojis with ASCII text markers ([OK], [ERROR], [WARNING], etc.) - Fixed 38+ violations across 20 files (7 Python, 6 shell scripts, 6 hooks, 1 API) - All modified files pass syntax verification - Conforms to CODING_GUIDELINES.md NO EMOJIS rule Details: - Python test files: check_record_counts.py, test_*.py (31 fixes) - API utils: context_compression.py regex pattern updated - Shell scripts: setup/test/install/upgrade scripts (64+ fixes) - Hook scripts: task-complete, user-prompt-submit, sync-contexts (10 fixes) Verification: All files pass syntax checks (python -m py_compile, bash -n) Report: FIXES_APPLIED.md contains complete change log Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
111 lines
3.0 KiB
Bash
111 lines
3.0 KiB
Bash
#!/bin/bash
|
|
#
|
|
# Sync Queued Contexts to Database
|
|
# Uploads any locally queued contexts to the central API
|
|
# Can be run manually or called automatically by hooks
|
|
#
|
|
# Usage: bash .claude/hooks/sync-contexts
|
|
#
|
|
|
|
# Load configuration
|
|
CLAUDE_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
|
CONFIG_FILE="$CLAUDE_DIR/context-recall-config.env"
|
|
|
|
if [ -f "$CONFIG_FILE" ]; then
|
|
source "$CONFIG_FILE"
|
|
fi
|
|
|
|
# Default values
|
|
API_URL="${CLAUDE_API_URL:-http://172.16.3.30:8001}"
|
|
QUEUE_DIR="$CLAUDE_DIR/context-queue"
|
|
PENDING_DIR="$QUEUE_DIR/pending"
|
|
UPLOADED_DIR="$QUEUE_DIR/uploaded"
|
|
FAILED_DIR="$QUEUE_DIR/failed"
|
|
|
|
# Exit if no JWT token
|
|
if [ -z "$JWT_TOKEN" ]; then
|
|
echo "ERROR: No JWT token available" >&2
|
|
exit 1
|
|
fi
|
|
|
|
# Create directories if they don't exist
|
|
mkdir -p "$PENDING_DIR" "$UPLOADED_DIR" "$FAILED_DIR" 2>/dev/null
|
|
|
|
# Check if there are any pending files
|
|
PENDING_COUNT=$(find "$PENDING_DIR" -type f -name "*.json" 2>/dev/null | wc -l)
|
|
|
|
if [ "$PENDING_COUNT" -eq 0 ]; then
|
|
# No pending contexts to sync
|
|
exit 0
|
|
fi
|
|
|
|
echo "==================================="
|
|
echo "Syncing Queued Contexts"
|
|
echo "==================================="
|
|
echo "Found $PENDING_COUNT pending context(s)"
|
|
echo ""
|
|
|
|
# Process each pending file
|
|
SUCCESS_COUNT=0
|
|
FAIL_COUNT=0
|
|
|
|
for QUEUE_FILE in "$PENDING_DIR"/*.json; do
|
|
# Skip if no files match
|
|
[ -e "$QUEUE_FILE" ] || continue
|
|
|
|
FILENAME=$(basename "$QUEUE_FILE")
|
|
echo "Processing: $FILENAME"
|
|
|
|
# Read the payload
|
|
PAYLOAD=$(cat "$QUEUE_FILE")
|
|
|
|
# Determine endpoint based on filename
|
|
if [[ "$FILENAME" == *"_state.json" ]]; then
|
|
ENDPOINT="${API_URL}/api/project-states"
|
|
else
|
|
ENDPOINT="${API_URL}/api/conversation-contexts"
|
|
fi
|
|
|
|
# Try to POST to API
|
|
RESPONSE=$(curl -s --max-time 10 -w "\n%{http_code}" \
|
|
-X POST "$ENDPOINT" \
|
|
-H "Authorization: Bearer ${JWT_TOKEN}" \
|
|
-H "Content-Type: application/json" \
|
|
-d "$PAYLOAD" 2>/dev/null)
|
|
|
|
HTTP_CODE=$(echo "$RESPONSE" | tail -n1)
|
|
|
|
if [ "$HTTP_CODE" = "200" ] || [ "$HTTP_CODE" = "201" ]; then
|
|
# Success - move to uploaded directory
|
|
mv "$QUEUE_FILE" "$UPLOADED_DIR/"
|
|
echo " [OK] Uploaded successfully"
|
|
((SUCCESS_COUNT++))
|
|
else
|
|
# Failed - move to failed directory for manual review
|
|
mv "$QUEUE_FILE" "$FAILED_DIR/"
|
|
echo " [ERROR] Upload failed (HTTP $HTTP_CODE) - moved to failed/"
|
|
((FAIL_COUNT++))
|
|
fi
|
|
done
|
|
|
|
echo ""
|
|
echo "==================================="
|
|
echo "Sync Complete"
|
|
echo "==================================="
|
|
echo "Successful: $SUCCESS_COUNT"
|
|
echo "Failed: $FAIL_COUNT"
|
|
echo ""
|
|
|
|
# Clean up old uploaded files (keep last 100)
|
|
UPLOADED_COUNT=$(find "$UPLOADED_DIR" -type f -name "*.json" 2>/dev/null | wc -l)
|
|
if [ "$UPLOADED_COUNT" -gt 100 ]; then
|
|
echo "Cleaning up old uploaded contexts (keeping last 100)..."
|
|
find "$UPLOADED_DIR" -type f -name "*.json" -printf '%T@ %p\n' | \
|
|
sort -n | \
|
|
head -n -100 | \
|
|
cut -d' ' -f2- | \
|
|
xargs rm -f
|
|
fi
|
|
|
|
exit 0
|