Startup hooks in data-platform and pr-review were checking for venvs at the marketplace path (~/.claude/plugins/marketplaces/.../mcp-servers/) which gets wiped on updates. The actual venvs live in the cache directory (~/.cache/claude-mcp-venvs/) which survives updates. This caused false "MCP venv missing" errors even when venvs existed, wasting hours of debugging time. Fixed hooks now check cache path first, matching the pattern used by run.sh scripts. Also updated docs/CANONICAL-PATHS.md with the correct venv path pattern to prevent future occurrences. Lesson learned: lessons/patterns/startup-hooks-must-check-venv-cache-path-first Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
62 lines
1.9 KiB
Bash
Executable File
62 lines
1.9 KiB
Bash
Executable File
#!/bin/bash
|
|
# data-platform startup check hook
|
|
# Checks for common issues at session start
|
|
# All output MUST have [data-platform] prefix
|
|
|
|
PREFIX="[data-platform]"
|
|
|
|
# Check if MCP venv exists - check cache first, then local
|
|
CACHE_VENV="$HOME/.cache/claude-mcp-venvs/leo-claude-mktplace/data-platform/.venv/bin/python"
|
|
PLUGIN_ROOT="${CLAUDE_PLUGIN_ROOT:-$(dirname "$(dirname "$(realpath "$0")")")}"
|
|
MARKETPLACE_ROOT="$(dirname "$(dirname "$PLUGIN_ROOT")")"
|
|
LOCAL_VENV="$MARKETPLACE_ROOT/mcp-servers/data-platform/.venv/bin/python"
|
|
|
|
# Check cache first (preferred), then local
|
|
if [[ -f "$CACHE_VENV" ]]; then
|
|
VENV_PATH="$CACHE_VENV"
|
|
elif [[ -f "$LOCAL_VENV" ]]; then
|
|
VENV_PATH="$LOCAL_VENV"
|
|
else
|
|
echo "$PREFIX MCP venv missing - run /initial-setup or setup.sh"
|
|
exit 0
|
|
fi
|
|
|
|
# Check PostgreSQL configuration (optional - just warn if configured but failing)
|
|
POSTGRES_CONFIG="$HOME/.config/claude/postgres.env"
|
|
if [[ -f "$POSTGRES_CONFIG" ]]; then
|
|
source "$POSTGRES_CONFIG"
|
|
if [[ -n "${POSTGRES_URL:-}" ]]; then
|
|
# Quick connection test (5 second timeout)
|
|
RESULT=$("$VENV_PATH" -c "
|
|
import asyncio
|
|
import sys
|
|
async def test():
|
|
try:
|
|
import asyncpg
|
|
conn = await asyncpg.connect('$POSTGRES_URL', timeout=5)
|
|
await conn.close()
|
|
return 'OK'
|
|
except Exception as e:
|
|
return f'FAIL: {e}'
|
|
print(asyncio.run(test()))
|
|
" 2>/dev/null || echo "FAIL: asyncpg not installed")
|
|
|
|
if [[ "$RESULT" == "OK" ]]; then
|
|
# PostgreSQL OK - say nothing
|
|
:
|
|
elif [[ "$RESULT" == *"FAIL"* ]]; then
|
|
echo "$PREFIX PostgreSQL connection failed - check POSTGRES_URL"
|
|
fi
|
|
fi
|
|
fi
|
|
|
|
# Check dbt project (if in a project with dbt_project.yml)
|
|
if [[ -f "dbt_project.yml" ]] || [[ -f "transform/dbt_project.yml" ]]; then
|
|
if ! command -v dbt &> /dev/null; then
|
|
echo "$PREFIX dbt CLI not found - dbt tools unavailable"
|
|
fi
|
|
fi
|
|
|
|
# All checks passed - say nothing
|
|
exit 0
|