gitmem-mcp 0.2.0 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +17 -1
- package/CLAUDE.md.template +63 -55
- package/README.md +149 -120
- package/bin/gitmem.js +377 -25
- package/bin/init-wizard.js +642 -0
- package/bin/uninstall.js +288 -0
- package/dist/commands/check.js +20 -20
- package/dist/commands/check.js.map +1 -1
- package/dist/constants/closing-questions.d.ts +6 -0
- package/dist/constants/closing-questions.d.ts.map +1 -1
- package/dist/constants/closing-questions.js +65 -0
- package/dist/constants/closing-questions.js.map +1 -1
- package/dist/hooks/format-utils.d.ts +52 -0
- package/dist/hooks/format-utils.d.ts.map +1 -0
- package/dist/hooks/format-utils.js +89 -0
- package/dist/hooks/format-utils.js.map +1 -0
- package/dist/hooks/quick-retrieve.d.ts +30 -0
- package/dist/hooks/quick-retrieve.d.ts.map +1 -0
- package/dist/hooks/quick-retrieve.js +149 -0
- package/dist/hooks/quick-retrieve.js.map +1 -0
- package/dist/index.js +0 -0
- package/dist/schemas/active-sessions.d.ts +8 -8
- package/dist/schemas/analyze.d.ts +3 -3
- package/dist/schemas/common.d.ts +2 -2
- package/dist/schemas/common.d.ts.map +1 -1
- package/dist/schemas/common.js +1 -1
- package/dist/schemas/common.js.map +1 -1
- package/dist/schemas/create-decision.d.ts +3 -3
- package/dist/schemas/create-learning.d.ts +13 -13
- package/dist/schemas/log.d.ts +3 -3
- package/dist/schemas/prepare-context.d.ts +3 -3
- package/dist/schemas/recall.d.ts +3 -3
- package/dist/schemas/record-scar-usage-batch.d.ts +8 -3
- package/dist/schemas/record-scar-usage-batch.d.ts.map +1 -1
- package/dist/schemas/record-scar-usage.d.ts +3 -0
- package/dist/schemas/record-scar-usage.d.ts.map +1 -1
- package/dist/schemas/record-scar-usage.js +1 -0
- package/dist/schemas/record-scar-usage.js.map +1 -1
- package/dist/schemas/registry.d.ts +18 -0
- package/dist/schemas/registry.d.ts.map +1 -0
- package/dist/schemas/registry.js +158 -0
- package/dist/schemas/registry.js.map +1 -0
- package/dist/schemas/save-transcript.d.ts +3 -3
- package/dist/schemas/search-transcripts.d.ts +33 -0
- package/dist/schemas/search-transcripts.d.ts.map +1 -0
- package/dist/schemas/search-transcripts.js +26 -0
- package/dist/schemas/search-transcripts.js.map +1 -0
- package/dist/schemas/search.d.ts +3 -3
- package/dist/schemas/session-close.d.ts +43 -15
- package/dist/schemas/session-close.d.ts.map +1 -1
- package/dist/schemas/session-close.js +7 -2
- package/dist/schemas/session-close.js.map +1 -1
- package/dist/schemas/session-start.d.ts +3 -3
- package/dist/schemas/thread.d.ts +3 -3
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +82 -28
- package/dist/server.js.map +1 -1
- package/dist/services/active-sessions.d.ts +2 -1
- package/dist/services/active-sessions.d.ts.map +1 -1
- package/dist/services/active-sessions.js +130 -84
- package/dist/services/active-sessions.js.map +1 -1
- package/dist/services/analytics.d.ts.map +1 -1
- package/dist/services/analytics.js +1 -0
- package/dist/services/analytics.js.map +1 -1
- package/dist/services/behavioral-decay.d.ts +40 -0
- package/dist/services/behavioral-decay.d.ts.map +1 -0
- package/dist/services/behavioral-decay.js +110 -0
- package/dist/services/behavioral-decay.js.map +1 -0
- package/dist/services/bm25.d.ts +39 -0
- package/dist/services/bm25.d.ts.map +1 -0
- package/dist/services/bm25.js +132 -0
- package/dist/services/bm25.js.map +1 -0
- package/dist/services/cache.d.ts.map +1 -1
- package/dist/services/cache.js +9 -8
- package/dist/services/cache.js.map +1 -1
- package/dist/services/cache.test.js +17 -17
- package/dist/services/cache.test.js.map +1 -1
- package/dist/services/compliance-validator.d.ts.map +1 -1
- package/dist/services/compliance-validator.js +12 -1
- package/dist/services/compliance-validator.js.map +1 -1
- package/dist/services/display-protocol.d.ts +31 -0
- package/dist/services/display-protocol.d.ts.map +1 -0
- package/dist/services/display-protocol.js +73 -0
- package/dist/services/display-protocol.js.map +1 -0
- package/dist/services/effect-tracker.d.ts +81 -0
- package/dist/services/effect-tracker.d.ts.map +1 -0
- package/dist/services/effect-tracker.js +181 -0
- package/dist/services/effect-tracker.js.map +1 -0
- package/dist/services/file-lock.d.ts +31 -0
- package/dist/services/file-lock.d.ts.map +1 -0
- package/dist/services/file-lock.js +124 -0
- package/dist/services/file-lock.js.map +1 -0
- package/dist/services/gitmem-dir.d.ts +7 -0
- package/dist/services/gitmem-dir.d.ts.map +1 -1
- package/dist/services/gitmem-dir.js +21 -0
- package/dist/services/gitmem-dir.js.map +1 -1
- package/dist/services/local-file-storage.d.ts +3 -2
- package/dist/services/local-file-storage.d.ts.map +1 -1
- package/dist/services/local-file-storage.js +30 -43
- package/dist/services/local-file-storage.js.map +1 -1
- package/dist/services/local-vector-search.d.ts +10 -9
- package/dist/services/local-vector-search.d.ts.map +1 -1
- package/dist/services/local-vector-search.js +28 -23
- package/dist/services/local-vector-search.js.map +1 -1
- package/dist/services/metrics.d.ts +7 -2
- package/dist/services/metrics.d.ts.map +1 -1
- package/dist/services/metrics.js +41 -33
- package/dist/services/metrics.js.map +1 -1
- package/dist/services/session-state.d.ts +8 -0
- package/dist/services/session-state.d.ts.map +1 -1
- package/dist/services/session-state.js +9 -2
- package/dist/services/session-state.js.map +1 -1
- package/dist/services/startup.d.ts +12 -13
- package/dist/services/startup.d.ts.map +1 -1
- package/dist/services/startup.js +104 -57
- package/dist/services/startup.js.map +1 -1
- package/dist/services/supabase-client.d.ts +2 -1
- package/dist/services/supabase-client.d.ts.map +1 -1
- package/dist/services/supabase-client.js +22 -16
- package/dist/services/supabase-client.js.map +1 -1
- package/dist/services/thread-dedup.d.ts +9 -0
- package/dist/services/thread-dedup.d.ts.map +1 -1
- package/dist/services/thread-dedup.js +27 -0
- package/dist/services/thread-dedup.js.map +1 -1
- package/dist/services/thread-manager.d.ts.map +1 -1
- package/dist/services/thread-manager.js +38 -16
- package/dist/services/thread-manager.js.map +1 -1
- package/dist/services/thread-suggestions.d.ts.map +1 -1
- package/dist/services/thread-suggestions.js +1 -1
- package/dist/services/thread-suggestions.js.map +1 -1
- package/dist/services/thread-supabase.d.ts +0 -1
- package/dist/services/thread-supabase.d.ts.map +1 -1
- package/dist/services/thread-supabase.js +83 -54
- package/dist/services/thread-supabase.js.map +1 -1
- package/dist/services/timezone.d.ts.map +1 -1
- package/dist/services/timezone.js +1 -0
- package/dist/services/timezone.js.map +1 -1
- package/dist/services/transcript-chunker.d.ts.map +1 -1
- package/dist/services/transcript-chunker.js +18 -4
- package/dist/services/transcript-chunker.js.map +1 -1
- package/dist/services/variant-generation.d.ts +41 -0
- package/dist/services/variant-generation.d.ts.map +1 -0
- package/dist/services/variant-generation.js +263 -0
- package/dist/services/variant-generation.js.map +1 -0
- package/dist/tools/absorb-observations.d.ts.map +1 -1
- package/dist/tools/absorb-observations.js +9 -0
- package/dist/tools/absorb-observations.js.map +1 -1
- package/dist/tools/analyze.d.ts.map +1 -1
- package/dist/tools/analyze.js +13 -2
- package/dist/tools/analyze.js.map +1 -1
- package/dist/tools/archive-learning.d.ts +28 -0
- package/dist/tools/archive-learning.d.ts.map +1 -0
- package/dist/tools/archive-learning.js +81 -0
- package/dist/tools/archive-learning.js.map +1 -0
- package/dist/tools/cleanup-threads.d.ts +1 -0
- package/dist/tools/cleanup-threads.d.ts.map +1 -1
- package/dist/tools/cleanup-threads.js +111 -18
- package/dist/tools/cleanup-threads.js.map +1 -1
- package/dist/tools/confirm-scars.d.ts.map +1 -1
- package/dist/tools/confirm-scars.js +8 -2
- package/dist/tools/confirm-scars.js.map +1 -1
- package/dist/tools/create-decision.d.ts.map +1 -1
- package/dist/tools/create-decision.js +11 -8
- package/dist/tools/create-decision.js.map +1 -1
- package/dist/tools/create-learning.d.ts.map +1 -1
- package/dist/tools/create-learning.js +35 -11
- package/dist/tools/create-learning.js.map +1 -1
- package/dist/tools/create-linear-issue.d.ts +18 -0
- package/dist/tools/create-linear-issue.d.ts.map +1 -0
- package/dist/tools/create-linear-issue.js +197 -0
- package/dist/tools/create-linear-issue.js.map +1 -0
- package/dist/tools/create-thread.d.ts +2 -1
- package/dist/tools/create-thread.d.ts.map +1 -1
- package/dist/tools/create-thread.js +9 -4
- package/dist/tools/create-thread.js.map +1 -1
- package/dist/tools/definitions.d.ts +785 -34
- package/dist/tools/definitions.d.ts.map +1 -1
- package/dist/tools/definitions.js +239 -95
- package/dist/tools/definitions.js.map +1 -1
- package/dist/tools/dismiss-suggestion.d.ts +1 -0
- package/dist/tools/dismiss-suggestion.d.ts.map +1 -1
- package/dist/tools/dismiss-suggestion.js +4 -0
- package/dist/tools/dismiss-suggestion.js.map +1 -1
- package/dist/tools/graph-traverse.d.ts +1 -0
- package/dist/tools/graph-traverse.d.ts.map +1 -1
- package/dist/tools/graph-traverse.js +24 -9
- package/dist/tools/graph-traverse.js.map +1 -1
- package/dist/tools/list-threads.d.ts.map +1 -1
- package/dist/tools/list-threads.js +49 -5
- package/dist/tools/list-threads.js.map +1 -1
- package/dist/tools/log.d.ts +1 -0
- package/dist/tools/log.d.ts.map +1 -1
- package/dist/tools/log.js +84 -17
- package/dist/tools/log.js.map +1 -1
- package/dist/tools/prepare-context.d.ts +1 -0
- package/dist/tools/prepare-context.d.ts.map +1 -1
- package/dist/tools/prepare-context.js +15 -85
- package/dist/tools/prepare-context.js.map +1 -1
- package/dist/tools/promote-suggestion.d.ts +1 -0
- package/dist/tools/promote-suggestion.d.ts.map +1 -1
- package/dist/tools/promote-suggestion.js +5 -0
- package/dist/tools/promote-suggestion.js.map +1 -1
- package/dist/tools/recall.d.ts +2 -0
- package/dist/tools/recall.d.ts.map +1 -1
- package/dist/tools/recall.js +43 -10
- package/dist/tools/recall.js.map +1 -1
- package/dist/tools/recall.test.js +6 -6
- package/dist/tools/recall.test.js.map +1 -1
- package/dist/tools/record-scar-usage-batch.d.ts.map +1 -1
- package/dist/tools/record-scar-usage-batch.js +13 -0
- package/dist/tools/record-scar-usage-batch.js.map +1 -1
- package/dist/tools/record-scar-usage.d.ts.map +1 -1
- package/dist/tools/record-scar-usage.js +6 -0
- package/dist/tools/record-scar-usage.js.map +1 -1
- package/dist/tools/resolve-thread.d.ts.map +1 -1
- package/dist/tools/resolve-thread.js +57 -6
- package/dist/tools/resolve-thread.js.map +1 -1
- package/dist/tools/save-transcript.d.ts +1 -0
- package/dist/tools/save-transcript.d.ts.map +1 -1
- package/dist/tools/save-transcript.js +3 -1
- package/dist/tools/save-transcript.js.map +1 -1
- package/dist/tools/search-transcripts.d.ts +44 -0
- package/dist/tools/search-transcripts.d.ts.map +1 -0
- package/dist/tools/search-transcripts.js +158 -0
- package/dist/tools/search-transcripts.js.map +1 -0
- package/dist/tools/search.d.ts +1 -0
- package/dist/tools/search.d.ts.map +1 -1
- package/dist/tools/search.js +74 -3
- package/dist/tools/search.js.map +1 -1
- package/dist/tools/session-close.d.ts.map +1 -1
- package/dist/tools/session-close.js +563 -326
- package/dist/tools/session-close.js.map +1 -1
- package/dist/tools/session-start.d.ts +10 -6
- package/dist/tools/session-start.d.ts.map +1 -1
- package/dist/tools/session-start.js +317 -426
- package/dist/tools/session-start.js.map +1 -1
- package/dist/types/index.d.ts +37 -4
- package/dist/types/index.d.ts.map +1 -1
- package/hooks/.claude-plugin/plugin.json +8 -0
- package/hooks/README.md +107 -0
- package/hooks/hooks/hooks.json +123 -0
- package/hooks/scripts/auto-retrieve-hook.sh +163 -0
- package/hooks/scripts/post-tool-use.sh +112 -0
- package/hooks/scripts/recall-check.sh +213 -0
- package/hooks/scripts/session-close-check.sh +116 -0
- package/hooks/scripts/session-start.sh +233 -0
- package/hooks/tests/test-hooks.sh +577 -0
- package/package.json +4 -2
- package/schema/setup.sql +1 -1
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# GitMem Hooks Plugin — SessionStart Hook
|
|
3
|
+
# Detects gitmem MCP server and instructs Claude to call session_start
|
|
4
|
+
#
|
|
5
|
+
# Input: JSON via stdin (hook event data)
|
|
6
|
+
# Output: Plain text instruction (visible in system-reminder)
|
|
7
|
+
|
|
8
|
+
set -e
|
|
9
|
+
|
|
10
|
+
# Debug logging — verify hook actually fires
|
|
11
|
+
PLUGIN_LOG="/tmp/gitmem-hooks-plugin-debug.log"
|
|
12
|
+
echo "[$(date)] PLUGIN SessionStart hook invoked" >> "$PLUGIN_LOG"
|
|
13
|
+
|
|
14
|
+
# Read hook input from stdin
|
|
15
|
+
HOOK_INPUT=$(cat -)
|
|
16
|
+
echo "[$(date)] Input: $HOOK_INPUT" >> "$PLUGIN_LOG"
|
|
17
|
+
|
|
18
|
+
# ============================================================================
|
|
19
|
+
# Detect gitmem MCP server
|
|
20
|
+
# ============================================================================
|
|
21
|
+
#
|
|
22
|
+
# Detection cascade — any match = detected. Errs on the side of "yes, try it"
|
|
23
|
+
# because a false positive (agent tries session_start, gets tool-not-found) is
|
|
24
|
+
# recoverable, but a false negative silently disables the entire lifecycle.
|
|
25
|
+
#
|
|
26
|
+
# Checks (in order):
|
|
27
|
+
# 1. GITMEM_ENABLED env var (explicit override)
|
|
28
|
+
# 2. Project .mcp.json files (project-scoped setups)
|
|
29
|
+
# 3. --mcp-config file (Docker setups via common paths or MCP_CONFIG_PATH)
|
|
30
|
+
# 4. User-level ~/.claude.json mcpServers
|
|
31
|
+
# 5. Gitmem server binary on disk (works regardless of config method)
|
|
32
|
+
|
|
33
|
+
GITMEM_DETECTED=false
|
|
34
|
+
DETECT_SOURCE=""
|
|
35
|
+
|
|
36
|
+
# Helper: check a JSON file for gitmem/gitmem-mcp in mcpServers
|
|
37
|
+
check_config_for_gitmem() {
|
|
38
|
+
local FILE="$1"
|
|
39
|
+
[ -f "$FILE" ] || return 1
|
|
40
|
+
if command -v jq &>/dev/null; then
|
|
41
|
+
jq -e '.mcpServers.gitmem // .mcpServers["gitmem-mcp"]' "$FILE" &>/dev/null && return 0
|
|
42
|
+
elif command -v node &>/dev/null; then
|
|
43
|
+
local RESULT
|
|
44
|
+
RESULT=$(node -e "
|
|
45
|
+
const fs = require('fs');
|
|
46
|
+
try {
|
|
47
|
+
const cfg = JSON.parse(fs.readFileSync('$FILE', 'utf8'));
|
|
48
|
+
const s = cfg.mcpServers || {};
|
|
49
|
+
process.stdout.write((s.gitmem || s['gitmem-mcp']) ? 'true' : 'false');
|
|
50
|
+
} catch(e) { process.stdout.write('false'); }
|
|
51
|
+
" 2>/dev/null)
|
|
52
|
+
[ "$RESULT" = "true" ] && return 0
|
|
53
|
+
fi
|
|
54
|
+
return 1
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
# --- 1. Explicit environment variable ---
|
|
58
|
+
if [ "${GITMEM_ENABLED}" = "true" ] || [ "${GITMEM_ENABLED}" = "1" ]; then
|
|
59
|
+
GITMEM_DETECTED=true
|
|
60
|
+
DETECT_SOURCE="GITMEM_ENABLED env var"
|
|
61
|
+
fi
|
|
62
|
+
|
|
63
|
+
# --- 2. Project-level .mcp.json ---
|
|
64
|
+
if [ "$GITMEM_DETECTED" = "false" ]; then
|
|
65
|
+
for MCP_FILE in ".mcp.json" ".claude/mcp.json"; do
|
|
66
|
+
if check_config_for_gitmem "$MCP_FILE"; then
|
|
67
|
+
GITMEM_DETECTED=true
|
|
68
|
+
DETECT_SOURCE="project $MCP_FILE"
|
|
69
|
+
break
|
|
70
|
+
fi
|
|
71
|
+
done
|
|
72
|
+
fi
|
|
73
|
+
|
|
74
|
+
# --- 3. --mcp-config file (Docker / CLI flag) ---
|
|
75
|
+
if [ "$GITMEM_DETECTED" = "false" ]; then
|
|
76
|
+
for CONFIG_FILE in \
|
|
77
|
+
"${MCP_CONFIG_PATH:-}" \
|
|
78
|
+
"/home/claude/mcp-config.json" \
|
|
79
|
+
"/home/node/mcp-config.json" \
|
|
80
|
+
"$HOME/mcp-config.json"; do
|
|
81
|
+
if [ -n "$CONFIG_FILE" ] && check_config_for_gitmem "$CONFIG_FILE"; then
|
|
82
|
+
GITMEM_DETECTED=true
|
|
83
|
+
DETECT_SOURCE="mcp-config $CONFIG_FILE"
|
|
84
|
+
break
|
|
85
|
+
fi
|
|
86
|
+
done
|
|
87
|
+
fi
|
|
88
|
+
|
|
89
|
+
# --- 4. User-level ~/.claude.json ---
|
|
90
|
+
if [ "$GITMEM_DETECTED" = "false" ]; then
|
|
91
|
+
if check_config_for_gitmem "$HOME/.claude.json"; then
|
|
92
|
+
GITMEM_DETECTED=true
|
|
93
|
+
DETECT_SOURCE="user ~/.claude.json"
|
|
94
|
+
fi
|
|
95
|
+
fi
|
|
96
|
+
|
|
97
|
+
# --- 5. Gitmem server binary exists on disk ---
|
|
98
|
+
if [ "$GITMEM_DETECTED" = "false" ]; then
|
|
99
|
+
for SERVER_PATH in \
|
|
100
|
+
"${GITMEM_SERVER_PATH:-}" \
|
|
101
|
+
"$(which gitmem-mcp 2>/dev/null || echo '')" \
|
|
102
|
+
"$(which gitmem 2>/dev/null || echo '')"; do
|
|
103
|
+
if [ -n "$SERVER_PATH" ] && [ -f "$SERVER_PATH" ]; then
|
|
104
|
+
GITMEM_DETECTED=true
|
|
105
|
+
DETECT_SOURCE="binary $SERVER_PATH"
|
|
106
|
+
break
|
|
107
|
+
fi
|
|
108
|
+
done
|
|
109
|
+
fi
|
|
110
|
+
|
|
111
|
+
# ============================================================================
|
|
112
|
+
# MCP Server Readiness Gate
|
|
113
|
+
# ============================================================================
|
|
114
|
+
#
|
|
115
|
+
# Problem: MCP servers start asynchronously when Claude Code launches.
|
|
116
|
+
# If the user types fast, their first message is processed before gitmem's
|
|
117
|
+
# MCP server finishes connecting. This hook acts as a gate — by waiting here,
|
|
118
|
+
# we force Claude Code to delay processing the first user message until
|
|
119
|
+
# the gitmem server is likely ready.
|
|
120
|
+
#
|
|
121
|
+
# Strategy: Poll for the gitmem node process, then wait a buffer for
|
|
122
|
+
# MCP handshake completion. Total budget: ~8s (within 10s hook timeout).
|
|
123
|
+
|
|
124
|
+
if [ "$GITMEM_DETECTED" = "true" ]; then
|
|
125
|
+
GATE_START=$(date +%s%N 2>/dev/null || date +%s)
|
|
126
|
+
MAX_WAIT_SECS=7
|
|
127
|
+
POLL_INTERVAL=0.3
|
|
128
|
+
HANDSHAKE_BUFFER=0.5
|
|
129
|
+
SERVER_FOUND=false
|
|
130
|
+
|
|
131
|
+
echo "[$(date)] MCP readiness gate: waiting up to ${MAX_WAIT_SECS}s for gitmem server process..." >> "$PLUGIN_LOG"
|
|
132
|
+
|
|
133
|
+
# Build list of patterns to match the gitmem server process
|
|
134
|
+
# Covers: direct node invocation, npx, and symlinked binaries
|
|
135
|
+
GITMEM_PATTERNS=(
|
|
136
|
+
"gitmem/dist/index.js"
|
|
137
|
+
"gitmem-mcp"
|
|
138
|
+
)
|
|
139
|
+
|
|
140
|
+
# Poll every 0.3s. Max iterations = MAX_WAIT_SECS / 0.3 ≈ 23
|
|
141
|
+
MAX_POLLS=$(( MAX_WAIT_SECS * 10 / 3 ))
|
|
142
|
+
POLL=0
|
|
143
|
+
while [ "$POLL" -lt "$MAX_POLLS" ]; do
|
|
144
|
+
for PATTERN in "${GITMEM_PATTERNS[@]}"; do
|
|
145
|
+
if pgrep -f "$PATTERN" > /dev/null 2>&1; then
|
|
146
|
+
SERVER_FOUND=true
|
|
147
|
+
WAIT_SECS=$(( POLL * 3 / 10 ))
|
|
148
|
+
echo "[$(date)] MCP readiness gate: gitmem process found (pattern: $PATTERN) after ~${WAIT_SECS}.$(( POLL * 3 % 10 ))s" >> "$PLUGIN_LOG"
|
|
149
|
+
# Buffer for MCP protocol handshake to complete
|
|
150
|
+
sleep "$HANDSHAKE_BUFFER"
|
|
151
|
+
break 2
|
|
152
|
+
fi
|
|
153
|
+
done
|
|
154
|
+
sleep "$POLL_INTERVAL"
|
|
155
|
+
POLL=$((POLL + 1))
|
|
156
|
+
done
|
|
157
|
+
|
|
158
|
+
if [ "$SERVER_FOUND" = "false" ]; then
|
|
159
|
+
echo "[$(date)] MCP readiness gate: gitmem process NOT found after ${MAX_WAIT_SECS}s — proceeding anyway (config detected, server may use different process name)" >> "$PLUGIN_LOG"
|
|
160
|
+
fi
|
|
161
|
+
|
|
162
|
+
GATE_END=$(date +%s%N 2>/dev/null || date +%s)
|
|
163
|
+
echo "[$(date)] MCP readiness gate completed" >> "$PLUGIN_LOG"
|
|
164
|
+
fi
|
|
165
|
+
|
|
166
|
+
# ============================================================================
|
|
167
|
+
# Create session state directory
|
|
168
|
+
# ============================================================================
|
|
169
|
+
|
|
170
|
+
SESSION_ID="${CLAUDE_SESSION_ID:-$$}"
|
|
171
|
+
STATE_DIR="/tmp/gitmem-hooks-${SESSION_ID}"
|
|
172
|
+
mkdir -p "$STATE_DIR"
|
|
173
|
+
date +%s > "$STATE_DIR/start_time"
|
|
174
|
+
echo "0" > "$STATE_DIR/tool_call_count"
|
|
175
|
+
echo "0" > "$STATE_DIR/last_nag_time"
|
|
176
|
+
|
|
177
|
+
# ============================================================================
|
|
178
|
+
# Output hook response
|
|
179
|
+
# ============================================================================
|
|
180
|
+
|
|
181
|
+
if [ "$GITMEM_DETECTED" = "true" ]; then
|
|
182
|
+
echo "[$(date)] Gitmem DETECTED via ${DETECT_SOURCE} — instructing agent to call session_start via MCP" >> "$PLUGIN_LOG"
|
|
183
|
+
|
|
184
|
+
# Instruct agent to call session_start via MCP.
|
|
185
|
+
# The MCP server creates sessions with its own PID, enabling multi-session
|
|
186
|
+
# isolation (Phase 1, GIT-19). CLI binary invocation was removed because
|
|
187
|
+
# the CLI PID dies immediately, defeating PID-based session identity.
|
|
188
|
+
#
|
|
189
|
+
# NOTE: ToolSearch (tengu_mcp_tool_search) was removed. MCP tools load
|
|
190
|
+
# eagerly now — no deferral step needed. Just call session_start directly.
|
|
191
|
+
#
|
|
192
|
+
# Read project from .gitmem/config.json if available.
|
|
193
|
+
# Fallback: let session_start default (reads config.json server-side too).
|
|
194
|
+
GITMEM_PROJECT=""
|
|
195
|
+
if [ -f ".gitmem/config.json" ] && command -v jq &>/dev/null; then
|
|
196
|
+
GITMEM_PROJECT=$(jq -r '.project // empty' .gitmem/config.json 2>/dev/null || true)
|
|
197
|
+
fi
|
|
198
|
+
|
|
199
|
+
if [ -n "$GITMEM_PROJECT" ]; then
|
|
200
|
+
echo "[$(date)] Project from config: ${GITMEM_PROJECT}" >> "$PLUGIN_LOG"
|
|
201
|
+
cat <<HOOK_MSG
|
|
202
|
+
SESSION START — ACTIVE
|
|
203
|
+
|
|
204
|
+
Call mcp__gitmem__session_start(project: "${GITMEM_PROJECT}") as your FIRST tool call.
|
|
205
|
+
HOOK_MSG
|
|
206
|
+
else
|
|
207
|
+
cat <<'HOOK_MSG'
|
|
208
|
+
SESSION START — ACTIVE
|
|
209
|
+
|
|
210
|
+
Call mcp__gitmem__session_start() as your FIRST tool call.
|
|
211
|
+
HOOK_MSG
|
|
212
|
+
fi
|
|
213
|
+
|
|
214
|
+
cat <<'HOOK_MSG2'
|
|
215
|
+
|
|
216
|
+
IMPORTANT:
|
|
217
|
+
- Do NOT respond to the user until session_start completes.
|
|
218
|
+
- Do NOT diagnose tool availability — gitmem tools are loaded via --mcp-config.
|
|
219
|
+
- If session_start fails, report the error directly instead of investigating.
|
|
220
|
+
|
|
221
|
+
You have persistent memory. session_start just loaded context from your last
|
|
222
|
+
session — open threads, recent decisions, what was learned. This compounds
|
|
223
|
+
every session. Use recall before tasks to see what past sessions discovered.
|
|
224
|
+
The more you use it, the better it gets.
|
|
225
|
+
HOOK_MSG2
|
|
226
|
+
else
|
|
227
|
+
echo "[$(date)] Gitmem NOT detected (checked: project .mcp.json, mcp-config, ~/.claude.json, disk)" >> "$PLUGIN_LOG"
|
|
228
|
+
echo "GITMEM PLUGIN: GitMem MCP server not detected. Session lifecycle hooks are inactive. To enable, ensure gitmem is configured via --mcp-config, project .mcp.json, or set GITMEM_ENABLED=true."
|
|
229
|
+
fi
|
|
230
|
+
|
|
231
|
+
echo "[$(date)] Hook completed, exit 0" >> "$PLUGIN_LOG"
|
|
232
|
+
|
|
233
|
+
exit 0
|