mirror of
https://github.com/abhigyanpatwari/GitNexus.git
synced 2026-09-05 08:06:02 +00:00
- Export security primitives (CYPHER_WRITE_RE, isWriteQuery, isTestFilePath, VALID_NODE_LABELS, VALID_RELATION_TYPES) from local-backend - Improve MCP kuzu-adapter with better query handling - Add PR review skill for Claude, Cursor, and npm package - Add CLI guide and CLI skills - Update hooks for Claude plugin and Cursor integration - Remove deprecated claude-hooks.ts CLI module - Update eval-server, setup, and analyze CLI commands - Improve CSV generator and ingestion processors - Update CLAUDE.md and AGENTS.md configs Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
79 lines
2.3 KiB
Bash
79 lines
2.3 KiB
Bash
#!/bin/bash
|
|
# GitNexus PreToolUse hook for Claude Code
|
|
# Intercepts Grep/Glob/Bash searches and augments with graph context.
|
|
# Receives JSON on stdin with { tool_name, tool_input, cwd, ... }
|
|
# Returns JSON with additionalContext for graph-enriched results.
|
|
|
|
INPUT=$(cat)
|
|
|
|
TOOL_NAME=$(echo "$INPUT" | jq -r '.tool_name // empty' 2>/dev/null)
|
|
CWD=$(echo "$INPUT" | jq -r '.cwd // empty' 2>/dev/null)
|
|
|
|
# Extract search pattern based on tool type
|
|
PATTERN=""
|
|
|
|
case "$TOOL_NAME" in
|
|
Grep)
|
|
PATTERN=$(echo "$INPUT" | jq -r '.tool_input.pattern // empty' 2>/dev/null)
|
|
;;
|
|
Glob)
|
|
# Glob patterns are file paths, not search terms — extract meaningful part
|
|
RAW=$(echo "$INPUT" | jq -r '.tool_input.pattern // empty' 2>/dev/null)
|
|
# Strip glob syntax to get the meaningful name (e.g., "**/*.ts" → skip, "auth*.ts" → "auth")
|
|
PATTERN=$(echo "$RAW" | sed -n 's/.*[*\/]\([a-zA-Z][a-zA-Z0-9_-]*\).*/\1/p')
|
|
;;
|
|
Bash)
|
|
CMD=$(echo "$INPUT" | jq -r '.tool_input.command // empty' 2>/dev/null)
|
|
# Only augment grep/rg commands
|
|
if echo "$CMD" | grep -qE '\brg\b|\bgrep\b'; then
|
|
# Extract pattern from rg/grep
|
|
if echo "$CMD" | grep -qE '\brg\b'; then
|
|
PATTERN=$(echo "$CMD" | sed -n "s/.*\brg\s\+\(--[^ ]*\s\+\)*['\"]\\?\([^'\";\| >]*\\).*/\2/p")
|
|
elif echo "$CMD" | grep -qE '\bgrep\b'; then
|
|
PATTERN=$(echo "$CMD" | sed -n "s/.*\bgrep\s\+\(-[^ ]*\s\+\)*['\"]\\?\([^'\";\| >]*\\).*/\2/p")
|
|
fi
|
|
fi
|
|
;;
|
|
*)
|
|
# Not a search tool — skip
|
|
exit 0
|
|
;;
|
|
esac
|
|
|
|
# Skip if pattern too short or empty
|
|
if [ -z "$PATTERN" ] || [ ${#PATTERN} -lt 3 ]; then
|
|
exit 0
|
|
fi
|
|
|
|
# Check if we're in a GitNexus-indexed repo
|
|
dir="${CWD:-$PWD}"
|
|
found=false
|
|
for i in 1 2 3 4 5; do
|
|
if [ -d "$dir/.gitnexus" ]; then
|
|
found=true
|
|
break
|
|
fi
|
|
parent="$(dirname "$dir")"
|
|
[ "$parent" = "$dir" ] && break
|
|
dir="$parent"
|
|
done
|
|
|
|
if [ "$found" = false ]; then
|
|
exit 0
|
|
fi
|
|
|
|
# Run gitnexus augment — must be fast (<500ms target)
|
|
# augment writes to stderr (KuzuDB captures stdout at OS level), so capture stderr and discard stdout
|
|
RESULT=$(cd "$CWD" && npx -y gitnexus augment "$PATTERN" 2>&1 1>/dev/null)
|
|
|
|
if [ -n "$RESULT" ]; then
|
|
ESCAPED=$(echo "$RESULT" | jq -Rs .)
|
|
jq -n --argjson ctx "$ESCAPED" '{
|
|
hookSpecificOutput: {
|
|
hookEventName: "PreToolUse",
|
|
additionalContext: $ctx
|
|
}
|
|
}'
|
|
else
|
|
exit 0
|
|
fi
|