Interactive installer: - Fix agents source path (was claude-complete-package/agents, now agents/) - Add mkdir -p for each agent category - Install sync-agents.sh script to ~/.claude/ - Remove duplicate bonus section Verify script: - Add checks for new critical agents: - experiment-tracker - studio-coach - agent-updater - Add sync-agents.sh existence and executable check
238 lines
10 KiB
Bash
Executable File
238 lines
10 KiB
Bash
Executable File
#!/usr/bin/env bash
|
||
################################################################################
|
||
# Claude Code Setup Verification Script
|
||
# Checks if all customizations are properly installed
|
||
################################################################################
|
||
|
||
set -e
|
||
|
||
# Colors
|
||
RED='\033[0;31m'
|
||
GREEN='\033[0;32m'
|
||
YELLOW='\033[1;33m'
|
||
BLUE='\033[0;34m'
|
||
NC='\033[0m'
|
||
|
||
CLAUDE_DIR="$HOME/.claude"
|
||
AGENTS_DIR="$CLAUDE_DIR/agents"
|
||
PLUGINS_DIR="$CLAUDE_DIR/plugins"
|
||
|
||
PASSED=0
|
||
FAILED=0
|
||
WARNINGS=0
|
||
|
||
check_pass() {
|
||
echo -e "${GREEN}✓${NC} $1"
|
||
PASSED=$((PASSED+1))
|
||
}
|
||
|
||
check_fail() {
|
||
echo -e "${RED}✗${NC} $1"
|
||
FAILED=$((FAILED+1))
|
||
}
|
||
|
||
check_warn() {
|
||
echo -e "${YELLOW}⚠${NC} $1"
|
||
WARNINGS=$((WARNINGS+1))
|
||
}
|
||
|
||
check_info() {
|
||
echo -e "${BLUE}ℹ${NC} $1"
|
||
}
|
||
|
||
echo -e "${BLUE}╔════════════════════════════════════════════════════════════╗${NC}"
|
||
echo -e "${BLUE}║ Claude Code Customizations - Verification ║${NC}"
|
||
echo -e "${BLUE}╚════════════════════════════════════════════════════════════╝${NC}"
|
||
echo ""
|
||
|
||
# 1. Check directory structure
|
||
echo "═══════════════════════════════════════════════════════════"
|
||
echo "Directory Structure"
|
||
echo "═══════════════════════════════════════════════════════════"
|
||
|
||
[ -d "$CLAUDE_DIR" ] && check_pass "Claude directory exists" || check_fail "Claude directory missing"
|
||
[ -d "$AGENTS_DIR" ] && check_pass "Agents directory exists" || check_fail "Agents directory missing"
|
||
[ -d "$PLUGINS_DIR" ] && check_pass "Plugins directory exists" || check_fail "Plugins directory missing"
|
||
|
||
echo ""
|
||
echo "═══════════════════════════════════════════════════════════"
|
||
echo "Agent Categories"
|
||
echo "═══════════════════════════════════════════════════════════"
|
||
|
||
CATEGORIES=("engineering" "marketing" "product" "studio-operations" "project-management" "testing" "design" "bonus")
|
||
AGENT_COUNT=0
|
||
|
||
for category in "${CATEGORIES[@]}"; do
|
||
if [ -d "$AGENTS_DIR/$category" ]; then
|
||
count=$(ls -1 "$AGENTS_DIR/$category"/*.md 2>/dev/null | wc -l)
|
||
if [ $count -gt 0 ]; then
|
||
echo -e "${GREEN}✓${NC} $category: $count agents"
|
||
AGENT_COUNT=$((AGENT_COUNT + count))
|
||
else
|
||
check_warn "$category: directory exists but no agents"
|
||
fi
|
||
else
|
||
check_fail "$category: directory missing"
|
||
fi
|
||
done
|
||
|
||
echo ""
|
||
check_info "Total agents: $AGENT_COUNT"
|
||
|
||
# 2. Check configuration files
|
||
echo ""
|
||
echo "═══════════════════════════════════════════════════════════"
|
||
echo "Configuration Files"
|
||
echo "═══════════════════════════════════════════════════════════"
|
||
|
||
[ -f "$CLAUDE_DIR/settings.json" ] && check_pass "settings.json exists" || check_fail "settings.json missing"
|
||
[ -f "$CLAUDE_DIR/settings.local.json" ] && check_pass "settings.local.json exists" || check_fail "settings.local.json missing"
|
||
[ -f "$PLUGINS_DIR/installed_plugins.json" ] && check_pass "installed_plugins.json exists" || check_fail "installed_plugins.json missing"
|
||
[ -f "$PLUGINS_DIR/known_marketplaces.json" ] && check_pass "known_marketplaces.json exists" || check_fail "known_marketplaces.json missing"
|
||
|
||
# 3. Check MCP tools
|
||
echo ""
|
||
echo "═══════════════════════════════════════════════════════════"
|
||
echo "MCP Tools"
|
||
echo "═══════════════════════════════════════════════════════════"
|
||
|
||
if command -v npx &> /dev/null; then
|
||
check_pass "npx available"
|
||
|
||
# Check if @z_ai/mcp-server can be accessed
|
||
if npx -y @z_ai/mcp-server --help &> /dev/null; then
|
||
check_pass "@z_ai/mcp-server accessible"
|
||
else
|
||
check_warn "@z_ai/mcp-server not directly accessible (may download on first use)"
|
||
fi
|
||
|
||
# Check if @z_ai/coding-helper can be accessed
|
||
if npx -y @z_ai/coding-helper --help &> /dev/null; then
|
||
check_pass "@z_ai/coding-helper accessible"
|
||
else
|
||
check_warn "@z_ai/coding-helper not directly accessible (may download on first use)"
|
||
fi
|
||
else
|
||
check_fail "npx not available - MCP tools may not work"
|
||
fi
|
||
|
||
# 4. Check plugins
|
||
echo ""
|
||
echo "═══════════════════════════════════════════════════════════"
|
||
echo "Plugins"
|
||
echo "═══════════════════════════════════════════════════════════"
|
||
|
||
if [ -f "$PLUGINS_DIR/installed_plugins.json" ]; then
|
||
# Check if GLM plugins are registered
|
||
if grep -q "glm-plan-bug" "$PLUGINS_DIR/installed_plugins.json" 2>/dev/null; then
|
||
check_pass "glm-plan-bug plugin registered"
|
||
else
|
||
check_warn "glm-plan-bug plugin not registered"
|
||
fi
|
||
|
||
if grep -q "glm-plan-usage" "$PLUGINS_DIR/installed_plugins.json" 2>/dev/null; then
|
||
check_pass "glm-plan-usage plugin registered"
|
||
else
|
||
check_warn "glm-plan-usage plugin not registered"
|
||
fi
|
||
fi
|
||
|
||
# 5. Sample agent check
|
||
echo ""
|
||
echo "═══════════════════════════════════════════════════════════"
|
||
echo "Agent Content Verification"
|
||
echo "═══════════════════════════════════════════════════════════"
|
||
|
||
CRITICAL_AGENTS=(
|
||
"engineering/test-writer-fixer.md"
|
||
"engineering/frontend-developer.md"
|
||
"marketing/tiktok-strategist.md"
|
||
"product/sprint-prioritizer.md"
|
||
"project-management/studio-producer.md"
|
||
"project-management/project-shipper.md"
|
||
"project-management/experiment-tracker.md"
|
||
"design/whimsy-injector.md"
|
||
"bonus/studio-coach.md"
|
||
"bonus/agent-updater.md"
|
||
)
|
||
|
||
for agent in "${CRITICAL_AGENTS[@]}"; do
|
||
if [ -f "$AGENTS_DIR/$agent" ]; then
|
||
# Check file has content
|
||
if [ -s "$AGENTS_DIR/$agent" ]; then
|
||
check_pass "$agent exists and has content"
|
||
else
|
||
check_warn "$agent exists but is empty"
|
||
fi
|
||
else
|
||
check_warn "$agent missing"
|
||
fi
|
||
done
|
||
|
||
# 6. Settings validation
|
||
echo ""
|
||
echo "═══════════════════════════════════════════════════════════"
|
||
echo "Settings Validation"
|
||
echo "═══════════════════════════════════════════════════════════"
|
||
|
||
if [ -f "$CLAUDE_DIR/settings.json" ]; then
|
||
# Check if JSON is valid
|
||
if python3 -m json.tool "$CLAUDE_DIR/settings.json" &> /dev/null; then
|
||
check_pass "settings.json is valid JSON"
|
||
|
||
# Check for API token placeholder
|
||
if grep -q "YOUR_API_TOKEN_HERE\|YOUR_TOKEN_HERE" "$CLAUDE_DIR/settings.json" 2>/dev/null; then
|
||
check_warn "API token not configured (still placeholder)"
|
||
else
|
||
if grep -q "ANTHROPIC_AUTH_TOKEN" "$CLAUDE_DIR/settings.json" 2>/dev/null; then
|
||
check_pass "ANTHROPIC_AUTH_TOKEN is set"
|
||
fi
|
||
fi
|
||
else
|
||
check_fail "settings.json is not valid JSON"
|
||
fi
|
||
fi
|
||
|
||
# 7. Sync Script Check
|
||
echo ""
|
||
echo "═══════════════════════════════════════════════════════════"
|
||
echo "Sync Script Check"
|
||
echo "═══════════════════════════════════════════════════════════"
|
||
|
||
if [ -f "$CLAUDE_DIR/sync-agents.sh" ]; then
|
||
check_pass "sync-agents.sh script exists"
|
||
if [ -x "$CLAUDE_DIR/sync-agents.sh" ]; then
|
||
check_pass "sync-agents.sh is executable"
|
||
else
|
||
check_warn "sync-agents.sh exists but is not executable"
|
||
fi
|
||
else
|
||
check_warn "sync-agents.sh not found (optional, for updating agents)"
|
||
fi
|
||
|
||
# 8. Summary
|
||
echo ""
|
||
echo "═══════════════════════════════════════════════════════════"
|
||
echo "Summary"
|
||
echo "═══════════════════════════════════════════════════════════"
|
||
|
||
if [ $FAILED -eq 0 ]; then
|
||
echo -e "${GREEN}✓ All critical checks passed!${NC}"
|
||
echo ""
|
||
echo "Passed: $PASSED"
|
||
echo "Warnings: $WARNINGS"
|
||
echo "Failed: $FAILED"
|
||
echo ""
|
||
echo -e "${GREEN}Your Claude Code setup is ready to use!${NC}"
|
||
exit 0
|
||
else
|
||
echo -e "${RED}✗ Some checks failed${NC}"
|
||
echo ""
|
||
echo "Passed: $PASSED"
|
||
echo "Warnings: $WARNINGS"
|
||
echo "Failed: $FAILED"
|
||
echo ""
|
||
echo "Please fix the failed checks above."
|
||
exit 1
|
||
fi
|