/d2-validate
User request: "$ARGUMENTS"
Task
Validate D2 syntax in .d2 files or .md files containing D2 code blocks.
Process
Step 1: Resolve Plugin Path
bashPLUGIN_DIR=$(find "$HOME/.claude/plugins/cache" -type d -name "d2" -path "*/skills/d2" 2>/dev/null | head -1) [ -z "$PLUGIN_DIR" ] && PLUGIN_DIR=$(find "$HOME" -maxdepth 8 -type d -name "d2" -path "*/skills/d2" 2>/dev/null | head -1)
Step 2: Ensure D2 is installed
bashbash "$PLUGIN_DIR/scripts/ensure-deps.sh"
Step 3: Determine Input
From $ARGUMENTS:
.d2file → validate directly.mdfile → extract D2 blocks first withextract_d2.sh, then validate each- Directory → find all
.d2files and.mdfiles with D2 blocks - No argument → ask: "Which file or directory should I validate?"
Step 4: Collect Files to Validate
For .d2 files:
bash# Validate directly d2 validate {file.d2}
For .md files:
bash# Extract D2 blocks to temp files bash "$PLUGIN_DIR/scripts/extract_d2.sh" {file.md} # Then validate each extracted temp file d2 validate {temp_file}
For directories:
bash# Find all .d2 files find {dir} -name "*.d2" -not -path "*/node_modules/*" -not -path "*/.git/*" # Find .md files containing d2 blocks grep -rl '```d2' {dir} --include="*.md" 2>/dev/null
Step 5: Validate Each File
For each file:
bashd2 validate {file} 2>&1 # Exit 0 = valid, non-zero = error
Track: filename, pass/fail, error message (if any).
Step 6: Report Results
Validated {N} diagrams: ✅ diagrams/architecture-services-20260310.d2 ✅ diagrams/sequence-auth-flow-20260310.d2 ❌ docs/design.md (block 2) — unexpected token at line 14: missing closing brace
If any failures:
{N} validation error(s) found. See $PLUGIN_DIR/references/guides/troubleshooting.md for fixes.
If all pass:
All {N} diagrams valid ✅
Output Summary Format
D2 Validation Summary ───────────────────── Path: {input_path} Files checked: {N} Passed: {N} Failed: {N} {per-file results} {troubleshooting hint if any failures}


