From 80af6eb4967f21d3bd9708a74a4ee52f8b24fe4f Mon Sep 17 00:00:00 2001 From: Mike Swanson Date: Sun, 31 May 2026 08:54:53 -0700 Subject: [PATCH] fix: improve git hook JSON escaping Fixed post-commit hook to properly escape JSON payloads using python. Previous implementation was vulnerable to breaking on commit messages with special characters (quotes, newlines, etc.). CHANGES: - Use python json.dumps() for proper JSON escaping - Prevents 422 validation errors from coordination API - Handles multi-line commit messages correctly Co-Authored-By: Claude Sonnet 4.5 --- .claude/hooks/post-commit.template | 56 ++++++++++++++++++++++-------- 1 file changed, 42 insertions(+), 14 deletions(-) diff --git a/.claude/hooks/post-commit.template b/.claude/hooks/post-commit.template index 9e53202..15fd4a9 100755 --- a/.claude/hooks/post-commit.template +++ b/.claude/hooks/post-commit.template @@ -38,15 +38,29 @@ if [[ -n "$SPEC_FILES" ]]; then # Send dev-alerts message SESSION_ID=$(hostname)/claude-main + # Build JSON payload with proper escaping + JSON_PAYLOAD=$(python3 -c "import json; print(json.dumps({ + 'from_session': '$SESSION_ID', + 'to_session': 'dev-alerts', + 'project_key': '$PROJECT', + 'subject': '$PROJECT_NAME Feature Spec: $SPEC_NUM $SPEC_NAME', + 'body': '''New $PROJECT_NAME feature specification created. + +$SPEC_NUM: $SPEC_NAME +Priority: $PRIORITY | Effort: $EFFORT + +OVERVIEW: +$OVERVIEW + +Commit: $COMMIT_HASH on $BRANCH +Author: $AUTHOR + +🤖 Auto-generated via post-commit hook''' + }))") + curl -s -X POST http://172.16.3.30:8001/api/coord/messages \ -H "Content-Type: application/json" \ - -d "{ - \"from_session\": \"$SESSION_ID\", - \"to_session\": \"dev-alerts\", - \"project_key\": \"$PROJECT\", - \"subject\": \"$PROJECT_NAME Feature Spec: $SPEC_NUM $SPEC_NAME\", - \"body\": \"New $PROJECT_NAME feature specification created.\\n\\n$SPEC_NUM: $SPEC_NAME\\nPriority: $PRIORITY | Effort: $EFFORT\\n\\nOVERVIEW:\\n$OVERVIEW\\n\\nCommit: $COMMIT_HASH on $BRANCH\\nAuthor: $AUTHOR\\n\\n🤖 Auto-generated via post-commit hook\" - }" > /dev/null 2>&1 + -d "$JSON_PAYLOAD" > /dev/null 2>&1 fi # Detect build/push events (commit message contains 'spec:', 'feat:', 'fix:', etc.) @@ -59,15 +73,29 @@ if echo "$COMMIT_MSG" | grep -qE '^(spec|feat|fix|chore|docs|build):'; then SESSION_ID=$(hostname)/claude-main + # Build JSON payload with proper escaping + JSON_PAYLOAD=$(python3 -c "import json; print(json.dumps({ + 'from_session': '$SESSION_ID', + 'to_session': 'dev-alerts', + 'project_key': '$PROJECT', + 'subject': '$PROJECT_NAME Build: $COMMIT_TYPE on main', + 'body': '''$PROJECT_NAME main branch updated. + +COMMIT: $COMMIT_HASH +TYPE: $COMMIT_TYPE +FILES CHANGED: $FILES_CHANGED +BRANCH: $BRANCH +AUTHOR: $AUTHOR + +MESSAGE: +$COMMIT_MSG + +🔨 Auto-generated via post-commit hook''' + }))") + curl -s -X POST http://172.16.3.30:8001/api/coord/messages \ -H "Content-Type: application/json" \ - -d "{ - \"from_session\": \"$SESSION_ID\", - \"to_session\": \"dev-alerts\", - \"project_key\": \"$PROJECT\", - \"subject\": \"$PROJECT_NAME Build: $COMMIT_TYPE on main\", - \"body\": \"$PROJECT_NAME main branch updated.\\n\\nCOMMIT: $COMMIT_HASH\\nTYPE: $COMMIT_TYPE\\nFILES CHANGED: $FILES_CHANGED\\nBRANCH: $BRANCH\\nAUTHOR: $AUTHOR\\n\\nMESSAGE:\\n$COMMIT_MSG\\n\\n🔨 Auto-generated via post-commit hook\" - }" > /dev/null 2>&1 + -d "$JSON_PAYLOAD" > /dev/null 2>&1 fi fi