mirror of
https://github.com/wasrusgen/zov-tech.git
synced 2026-06-03 16:44:48 +00:00
chore: add Claude Code PostToolUse syntax-check hook
.claude/settings.json — hook fires after every Edit/Write: - .js files → node --check - .py files → py_compile.compile (doraise=True) - exit 2 on failure → Claude sees the error immediately and fixes it Scripts: - .claude/hooks/syntax_check.ps1 (Windows, primary) - .claude/hooks/syntax_check.sh (bash fallback) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
f64a64e834
commit
2479ac05cf
41
.claude/hooks/syntax_check.ps1
Normal file
41
.claude/hooks/syntax_check.ps1
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
# ================================================================
|
||||||
|
# Claude Code — PostToolUse hook (Windows PowerShell fallback)
|
||||||
|
# Syntax check after every Edit / Write tool call.
|
||||||
|
# Exit code 2 = Claude sees the error and can fix immediately.
|
||||||
|
# ================================================================
|
||||||
|
|
||||||
|
param()
|
||||||
|
|
||||||
|
# Read file_path from CLAUDE_TOOL_INPUT env var (JSON)
|
||||||
|
$filePath = ""
|
||||||
|
try {
|
||||||
|
$input_json = $env:CLAUDE_TOOL_INPUT | ConvertFrom-Json -ErrorAction Stop
|
||||||
|
$filePath = $input_json.file_path
|
||||||
|
} catch {}
|
||||||
|
|
||||||
|
if (-not $filePath -or -not (Test-Path $filePath)) { exit 0 }
|
||||||
|
|
||||||
|
$ext = [System.IO.Path]::GetExtension($filePath).TrimStart('.')
|
||||||
|
|
||||||
|
switch ($ext) {
|
||||||
|
"js" {
|
||||||
|
$result = & node --check $filePath 2>&1
|
||||||
|
if ($LASTEXITCODE -ne 0) {
|
||||||
|
Write-Output "❌ JS SYNTAX ERROR: $filePath"
|
||||||
|
Write-Output $result
|
||||||
|
exit 2
|
||||||
|
}
|
||||||
|
}
|
||||||
|
"py" {
|
||||||
|
$escaped = $filePath -replace "'", "''"
|
||||||
|
$result = & python -c "import py_compile,sys; py_compile.compile('$escaped', doraise=True)" 2>&1
|
||||||
|
if ($LASTEXITCODE -ne 0) {
|
||||||
|
Write-Output "❌ PY SYNTAX ERROR: $filePath"
|
||||||
|
Write-Output $result
|
||||||
|
exit 2
|
||||||
|
}
|
||||||
|
}
|
||||||
|
default { exit 0 }
|
||||||
|
}
|
||||||
|
|
||||||
|
exit 0
|
||||||
62
.claude/hooks/syntax_check.sh
Normal file
62
.claude/hooks/syntax_check.sh
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# =============================================================
|
||||||
|
# Claude Code — PostToolUse hook: syntax check after Edit/Write
|
||||||
|
# Reads tool input JSON from stdin, extracts file_path,
|
||||||
|
# runs language-appropriate syntax check.
|
||||||
|
# Exit 2 → Claude sees the error and can fix it immediately.
|
||||||
|
# =============================================================
|
||||||
|
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
# Parse file_path from JSON stdin (jq if available, else python fallback)
|
||||||
|
if command -v jq &>/dev/null; then
|
||||||
|
FILE_PATH=$(echo "$CLAUDE_TOOL_INPUT" | jq -r '.file_path // empty' 2>/dev/null || true)
|
||||||
|
else
|
||||||
|
FILE_PATH=$(python3 -c "
|
||||||
|
import sys, json
|
||||||
|
try:
|
||||||
|
d = json.loads(sys.stdin.read())
|
||||||
|
print(d.get('file_path', ''))
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
" <<< "$CLAUDE_TOOL_INPUT" 2>/dev/null || true)
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Also try env var set by Claude Code
|
||||||
|
FILE_PATH="${FILE_PATH:-${CLAUDE_TOOL_INPUT_FILE_PATH:-}}"
|
||||||
|
|
||||||
|
if [[ -z "$FILE_PATH" || ! -f "$FILE_PATH" ]]; then
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
EXT="${FILE_PATH##*.}"
|
||||||
|
|
||||||
|
case "$EXT" in
|
||||||
|
js)
|
||||||
|
if ! OUTPUT=$(node --check "$FILE_PATH" 2>&1); then
|
||||||
|
echo "❌ JS SYNTAX ERROR: $FILE_PATH"
|
||||||
|
echo "$OUTPUT"
|
||||||
|
exit 2
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
py)
|
||||||
|
if ! OUTPUT=$(python3 -c "
|
||||||
|
import py_compile, sys
|
||||||
|
try:
|
||||||
|
py_compile.compile('$FILE_PATH', doraise=True)
|
||||||
|
except py_compile.PyCompileError as e:
|
||||||
|
print(e)
|
||||||
|
sys.exit(1)
|
||||||
|
" 2>&1); then
|
||||||
|
echo "❌ PY SYNTAX ERROR: $FILE_PATH"
|
||||||
|
echo "$OUTPUT"
|
||||||
|
exit 2
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
# Остальные типы файлов — пропускаем
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
exit 0
|
||||||
15
.claude/settings.json
Normal file
15
.claude/settings.json
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
{
|
||||||
|
"hooks": {
|
||||||
|
"PostToolUse": [
|
||||||
|
{
|
||||||
|
"matcher": "Edit|Write",
|
||||||
|
"hooks": [
|
||||||
|
{
|
||||||
|
"type": "command",
|
||||||
|
"command": "powershell -NonInteractive -File \".claude\\hooks\\syntax_check.ps1\""
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue
Block a user