claude-code/plugins/plugin-dev/skills/plugin-settings/scripts/validate-settings.sh
Daisy S. Hollman 387dc35db7
feat: Add plugin-dev toolkit for comprehensive plugin development
Adds the plugin-dev plugin to public marketplace. A comprehensive toolkit for
developing Claude Code plugins with 7 expert skills, 3 AI-assisted agents, and
extensive documentation covering the complete plugin development lifecycle.

Key features:
- 7 skills: hook-development, mcp-integration, plugin-structure, plugin-settings,
  command-development, agent-development, skill-development
- 3 agents: agent-creator (AI-assisted generation), plugin-validator (structure
  validation), skill-reviewer (quality review)
- 1 command: /plugin-dev:create-plugin (guided 8-phase workflow)
- 10 utility scripts for validation and testing
- 21 reference docs with deep-dive guidance (~11k words)
- 9 working examples demonstrating best practices

Changes for public release:
- Replaced all references to internal repositories with "Claude Code"
- Updated MCP examples: internal.company.com → api.example.com
- Updated token variables: ${INTERNAL_TOKEN} → ${API_TOKEN}
- Reframed agent-creation-system-prompt as "proven in production"
- Preserved all ${CLAUDE_PLUGIN_ROOT} references (186 total)
- Preserved valuable test blocks in core modules

Validation:
- All 3 agents validated successfully with validate-agent.sh
- All JSON files validated with jq
- Zero internal references remaining
- 59 files migrated, 21,971 lines added

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-17 04:09:00 -08:00

101 lines
2.6 KiB
Bash
Executable file

#!/bin/bash
# Settings File Validator
# Validates .claude/plugin-name.local.md structure
set -euo pipefail
# Usage
if [ $# -eq 0 ]; then
echo "Usage: $0 <path/to/settings.local.md>"
echo ""
echo "Validates plugin settings file for:"
echo " - File existence and readability"
echo " - YAML frontmatter structure"
echo " - Required --- markers"
echo " - Field format"
echo ""
echo "Example: $0 .claude/my-plugin.local.md"
exit 1
fi
SETTINGS_FILE="$1"
echo "🔍 Validating settings file: $SETTINGS_FILE"
echo ""
# Check 1: File exists
if [ ! -f "$SETTINGS_FILE" ]; then
echo "❌ File not found: $SETTINGS_FILE"
exit 1
fi
echo "✅ File exists"
# Check 2: File is readable
if [ ! -r "$SETTINGS_FILE" ]; then
echo "❌ File is not readable"
exit 1
fi
echo "✅ File is readable"
# Check 3: Has frontmatter markers
MARKER_COUNT=$(grep -c '^---$' "$SETTINGS_FILE" 2>/dev/null || echo "0")
if [ "$MARKER_COUNT" -lt 2 ]; then
echo "❌ Invalid frontmatter: found $MARKER_COUNT '---' markers (need at least 2)"
echo " Expected format:"
echo " ---"
echo " field: value"
echo " ---"
echo " Content..."
exit 1
fi
echo "✅ Frontmatter markers present"
# Check 4: Extract and validate frontmatter
FRONTMATTER=$(sed -n '/^---$/,/^---$/{ /^---$/d; p; }' "$SETTINGS_FILE")
if [ -z "$FRONTMATTER" ]; then
echo "❌ Empty frontmatter (nothing between --- markers)"
exit 1
fi
echo "✅ Frontmatter not empty"
# Check 5: Frontmatter has valid YAML-like structure
if ! echo "$FRONTMATTER" | grep -q ':'; then
echo "⚠️ Warning: Frontmatter has no key:value pairs"
fi
# Check 6: Look for common fields
echo ""
echo "Detected fields:"
echo "$FRONTMATTER" | grep '^[a-z_][a-z0-9_]*:' | while IFS=':' read -r key value; do
echo " - $key: ${value:0:50}"
done
# Check 7: Validate common boolean fields
for field in enabled strict_mode; do
VALUE=$(echo "$FRONTMATTER" | grep "^${field}:" | sed "s/${field}: *//" || true)
if [ -n "$VALUE" ]; then
if [ "$VALUE" != "true" ] && [ "$VALUE" != "false" ]; then
echo "⚠️ Field '$field' should be boolean (true/false), got: $VALUE"
fi
fi
done
# Check 8: Check body exists
BODY=$(awk '/^---$/{i++; next} i>=2' "$SETTINGS_FILE")
echo ""
if [ -n "$BODY" ]; then
BODY_LINES=$(echo "$BODY" | wc -l | tr -d ' ')
echo "✅ Markdown body present ($BODY_LINES lines)"
else
echo "⚠️ No markdown body (frontmatter only)"
fi
echo ""
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "✅ Settings file structure is valid"
echo ""
echo "Reminder: Changes to this file require restarting Claude Code"
exit 0