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.
Files changed (249) hide show
  1. package/CHANGELOG.md +17 -1
  2. package/CLAUDE.md.template +63 -55
  3. package/README.md +149 -120
  4. package/bin/gitmem.js +377 -25
  5. package/bin/init-wizard.js +642 -0
  6. package/bin/uninstall.js +288 -0
  7. package/dist/commands/check.js +20 -20
  8. package/dist/commands/check.js.map +1 -1
  9. package/dist/constants/closing-questions.d.ts +6 -0
  10. package/dist/constants/closing-questions.d.ts.map +1 -1
  11. package/dist/constants/closing-questions.js +65 -0
  12. package/dist/constants/closing-questions.js.map +1 -1
  13. package/dist/hooks/format-utils.d.ts +52 -0
  14. package/dist/hooks/format-utils.d.ts.map +1 -0
  15. package/dist/hooks/format-utils.js +89 -0
  16. package/dist/hooks/format-utils.js.map +1 -0
  17. package/dist/hooks/quick-retrieve.d.ts +30 -0
  18. package/dist/hooks/quick-retrieve.d.ts.map +1 -0
  19. package/dist/hooks/quick-retrieve.js +149 -0
  20. package/dist/hooks/quick-retrieve.js.map +1 -0
  21. package/dist/index.js +0 -0
  22. package/dist/schemas/active-sessions.d.ts +8 -8
  23. package/dist/schemas/analyze.d.ts +3 -3
  24. package/dist/schemas/common.d.ts +2 -2
  25. package/dist/schemas/common.d.ts.map +1 -1
  26. package/dist/schemas/common.js +1 -1
  27. package/dist/schemas/common.js.map +1 -1
  28. package/dist/schemas/create-decision.d.ts +3 -3
  29. package/dist/schemas/create-learning.d.ts +13 -13
  30. package/dist/schemas/log.d.ts +3 -3
  31. package/dist/schemas/prepare-context.d.ts +3 -3
  32. package/dist/schemas/recall.d.ts +3 -3
  33. package/dist/schemas/record-scar-usage-batch.d.ts +8 -3
  34. package/dist/schemas/record-scar-usage-batch.d.ts.map +1 -1
  35. package/dist/schemas/record-scar-usage.d.ts +3 -0
  36. package/dist/schemas/record-scar-usage.d.ts.map +1 -1
  37. package/dist/schemas/record-scar-usage.js +1 -0
  38. package/dist/schemas/record-scar-usage.js.map +1 -1
  39. package/dist/schemas/registry.d.ts +18 -0
  40. package/dist/schemas/registry.d.ts.map +1 -0
  41. package/dist/schemas/registry.js +158 -0
  42. package/dist/schemas/registry.js.map +1 -0
  43. package/dist/schemas/save-transcript.d.ts +3 -3
  44. package/dist/schemas/search-transcripts.d.ts +33 -0
  45. package/dist/schemas/search-transcripts.d.ts.map +1 -0
  46. package/dist/schemas/search-transcripts.js +26 -0
  47. package/dist/schemas/search-transcripts.js.map +1 -0
  48. package/dist/schemas/search.d.ts +3 -3
  49. package/dist/schemas/session-close.d.ts +43 -15
  50. package/dist/schemas/session-close.d.ts.map +1 -1
  51. package/dist/schemas/session-close.js +7 -2
  52. package/dist/schemas/session-close.js.map +1 -1
  53. package/dist/schemas/session-start.d.ts +3 -3
  54. package/dist/schemas/thread.d.ts +3 -3
  55. package/dist/server.d.ts.map +1 -1
  56. package/dist/server.js +82 -28
  57. package/dist/server.js.map +1 -1
  58. package/dist/services/active-sessions.d.ts +2 -1
  59. package/dist/services/active-sessions.d.ts.map +1 -1
  60. package/dist/services/active-sessions.js +130 -84
  61. package/dist/services/active-sessions.js.map +1 -1
  62. package/dist/services/analytics.d.ts.map +1 -1
  63. package/dist/services/analytics.js +1 -0
  64. package/dist/services/analytics.js.map +1 -1
  65. package/dist/services/behavioral-decay.d.ts +40 -0
  66. package/dist/services/behavioral-decay.d.ts.map +1 -0
  67. package/dist/services/behavioral-decay.js +110 -0
  68. package/dist/services/behavioral-decay.js.map +1 -0
  69. package/dist/services/bm25.d.ts +39 -0
  70. package/dist/services/bm25.d.ts.map +1 -0
  71. package/dist/services/bm25.js +132 -0
  72. package/dist/services/bm25.js.map +1 -0
  73. package/dist/services/cache.d.ts.map +1 -1
  74. package/dist/services/cache.js +9 -8
  75. package/dist/services/cache.js.map +1 -1
  76. package/dist/services/cache.test.js +17 -17
  77. package/dist/services/cache.test.js.map +1 -1
  78. package/dist/services/compliance-validator.d.ts.map +1 -1
  79. package/dist/services/compliance-validator.js +12 -1
  80. package/dist/services/compliance-validator.js.map +1 -1
  81. package/dist/services/display-protocol.d.ts +31 -0
  82. package/dist/services/display-protocol.d.ts.map +1 -0
  83. package/dist/services/display-protocol.js +73 -0
  84. package/dist/services/display-protocol.js.map +1 -0
  85. package/dist/services/effect-tracker.d.ts +81 -0
  86. package/dist/services/effect-tracker.d.ts.map +1 -0
  87. package/dist/services/effect-tracker.js +181 -0
  88. package/dist/services/effect-tracker.js.map +1 -0
  89. package/dist/services/file-lock.d.ts +31 -0
  90. package/dist/services/file-lock.d.ts.map +1 -0
  91. package/dist/services/file-lock.js +124 -0
  92. package/dist/services/file-lock.js.map +1 -0
  93. package/dist/services/gitmem-dir.d.ts +7 -0
  94. package/dist/services/gitmem-dir.d.ts.map +1 -1
  95. package/dist/services/gitmem-dir.js +21 -0
  96. package/dist/services/gitmem-dir.js.map +1 -1
  97. package/dist/services/local-file-storage.d.ts +3 -2
  98. package/dist/services/local-file-storage.d.ts.map +1 -1
  99. package/dist/services/local-file-storage.js +30 -43
  100. package/dist/services/local-file-storage.js.map +1 -1
  101. package/dist/services/local-vector-search.d.ts +10 -9
  102. package/dist/services/local-vector-search.d.ts.map +1 -1
  103. package/dist/services/local-vector-search.js +28 -23
  104. package/dist/services/local-vector-search.js.map +1 -1
  105. package/dist/services/metrics.d.ts +7 -2
  106. package/dist/services/metrics.d.ts.map +1 -1
  107. package/dist/services/metrics.js +41 -33
  108. package/dist/services/metrics.js.map +1 -1
  109. package/dist/services/session-state.d.ts +8 -0
  110. package/dist/services/session-state.d.ts.map +1 -1
  111. package/dist/services/session-state.js +9 -2
  112. package/dist/services/session-state.js.map +1 -1
  113. package/dist/services/startup.d.ts +12 -13
  114. package/dist/services/startup.d.ts.map +1 -1
  115. package/dist/services/startup.js +104 -57
  116. package/dist/services/startup.js.map +1 -1
  117. package/dist/services/supabase-client.d.ts +2 -1
  118. package/dist/services/supabase-client.d.ts.map +1 -1
  119. package/dist/services/supabase-client.js +22 -16
  120. package/dist/services/supabase-client.js.map +1 -1
  121. package/dist/services/thread-dedup.d.ts +9 -0
  122. package/dist/services/thread-dedup.d.ts.map +1 -1
  123. package/dist/services/thread-dedup.js +27 -0
  124. package/dist/services/thread-dedup.js.map +1 -1
  125. package/dist/services/thread-manager.d.ts.map +1 -1
  126. package/dist/services/thread-manager.js +38 -16
  127. package/dist/services/thread-manager.js.map +1 -1
  128. package/dist/services/thread-suggestions.d.ts.map +1 -1
  129. package/dist/services/thread-suggestions.js +1 -1
  130. package/dist/services/thread-suggestions.js.map +1 -1
  131. package/dist/services/thread-supabase.d.ts +0 -1
  132. package/dist/services/thread-supabase.d.ts.map +1 -1
  133. package/dist/services/thread-supabase.js +83 -54
  134. package/dist/services/thread-supabase.js.map +1 -1
  135. package/dist/services/timezone.d.ts.map +1 -1
  136. package/dist/services/timezone.js +1 -0
  137. package/dist/services/timezone.js.map +1 -1
  138. package/dist/services/transcript-chunker.d.ts.map +1 -1
  139. package/dist/services/transcript-chunker.js +18 -4
  140. package/dist/services/transcript-chunker.js.map +1 -1
  141. package/dist/services/variant-generation.d.ts +41 -0
  142. package/dist/services/variant-generation.d.ts.map +1 -0
  143. package/dist/services/variant-generation.js +263 -0
  144. package/dist/services/variant-generation.js.map +1 -0
  145. package/dist/tools/absorb-observations.d.ts.map +1 -1
  146. package/dist/tools/absorb-observations.js +9 -0
  147. package/dist/tools/absorb-observations.js.map +1 -1
  148. package/dist/tools/analyze.d.ts.map +1 -1
  149. package/dist/tools/analyze.js +13 -2
  150. package/dist/tools/analyze.js.map +1 -1
  151. package/dist/tools/archive-learning.d.ts +28 -0
  152. package/dist/tools/archive-learning.d.ts.map +1 -0
  153. package/dist/tools/archive-learning.js +81 -0
  154. package/dist/tools/archive-learning.js.map +1 -0
  155. package/dist/tools/cleanup-threads.d.ts +1 -0
  156. package/dist/tools/cleanup-threads.d.ts.map +1 -1
  157. package/dist/tools/cleanup-threads.js +111 -18
  158. package/dist/tools/cleanup-threads.js.map +1 -1
  159. package/dist/tools/confirm-scars.d.ts.map +1 -1
  160. package/dist/tools/confirm-scars.js +8 -2
  161. package/dist/tools/confirm-scars.js.map +1 -1
  162. package/dist/tools/create-decision.d.ts.map +1 -1
  163. package/dist/tools/create-decision.js +11 -8
  164. package/dist/tools/create-decision.js.map +1 -1
  165. package/dist/tools/create-learning.d.ts.map +1 -1
  166. package/dist/tools/create-learning.js +35 -11
  167. package/dist/tools/create-learning.js.map +1 -1
  168. package/dist/tools/create-linear-issue.d.ts +18 -0
  169. package/dist/tools/create-linear-issue.d.ts.map +1 -0
  170. package/dist/tools/create-linear-issue.js +197 -0
  171. package/dist/tools/create-linear-issue.js.map +1 -0
  172. package/dist/tools/create-thread.d.ts +2 -1
  173. package/dist/tools/create-thread.d.ts.map +1 -1
  174. package/dist/tools/create-thread.js +9 -4
  175. package/dist/tools/create-thread.js.map +1 -1
  176. package/dist/tools/definitions.d.ts +785 -34
  177. package/dist/tools/definitions.d.ts.map +1 -1
  178. package/dist/tools/definitions.js +239 -95
  179. package/dist/tools/definitions.js.map +1 -1
  180. package/dist/tools/dismiss-suggestion.d.ts +1 -0
  181. package/dist/tools/dismiss-suggestion.d.ts.map +1 -1
  182. package/dist/tools/dismiss-suggestion.js +4 -0
  183. package/dist/tools/dismiss-suggestion.js.map +1 -1
  184. package/dist/tools/graph-traverse.d.ts +1 -0
  185. package/dist/tools/graph-traverse.d.ts.map +1 -1
  186. package/dist/tools/graph-traverse.js +24 -9
  187. package/dist/tools/graph-traverse.js.map +1 -1
  188. package/dist/tools/list-threads.d.ts.map +1 -1
  189. package/dist/tools/list-threads.js +49 -5
  190. package/dist/tools/list-threads.js.map +1 -1
  191. package/dist/tools/log.d.ts +1 -0
  192. package/dist/tools/log.d.ts.map +1 -1
  193. package/dist/tools/log.js +84 -17
  194. package/dist/tools/log.js.map +1 -1
  195. package/dist/tools/prepare-context.d.ts +1 -0
  196. package/dist/tools/prepare-context.d.ts.map +1 -1
  197. package/dist/tools/prepare-context.js +15 -85
  198. package/dist/tools/prepare-context.js.map +1 -1
  199. package/dist/tools/promote-suggestion.d.ts +1 -0
  200. package/dist/tools/promote-suggestion.d.ts.map +1 -1
  201. package/dist/tools/promote-suggestion.js +5 -0
  202. package/dist/tools/promote-suggestion.js.map +1 -1
  203. package/dist/tools/recall.d.ts +2 -0
  204. package/dist/tools/recall.d.ts.map +1 -1
  205. package/dist/tools/recall.js +43 -10
  206. package/dist/tools/recall.js.map +1 -1
  207. package/dist/tools/recall.test.js +6 -6
  208. package/dist/tools/recall.test.js.map +1 -1
  209. package/dist/tools/record-scar-usage-batch.d.ts.map +1 -1
  210. package/dist/tools/record-scar-usage-batch.js +13 -0
  211. package/dist/tools/record-scar-usage-batch.js.map +1 -1
  212. package/dist/tools/record-scar-usage.d.ts.map +1 -1
  213. package/dist/tools/record-scar-usage.js +6 -0
  214. package/dist/tools/record-scar-usage.js.map +1 -1
  215. package/dist/tools/resolve-thread.d.ts.map +1 -1
  216. package/dist/tools/resolve-thread.js +57 -6
  217. package/dist/tools/resolve-thread.js.map +1 -1
  218. package/dist/tools/save-transcript.d.ts +1 -0
  219. package/dist/tools/save-transcript.d.ts.map +1 -1
  220. package/dist/tools/save-transcript.js +3 -1
  221. package/dist/tools/save-transcript.js.map +1 -1
  222. package/dist/tools/search-transcripts.d.ts +44 -0
  223. package/dist/tools/search-transcripts.d.ts.map +1 -0
  224. package/dist/tools/search-transcripts.js +158 -0
  225. package/dist/tools/search-transcripts.js.map +1 -0
  226. package/dist/tools/search.d.ts +1 -0
  227. package/dist/tools/search.d.ts.map +1 -1
  228. package/dist/tools/search.js +74 -3
  229. package/dist/tools/search.js.map +1 -1
  230. package/dist/tools/session-close.d.ts.map +1 -1
  231. package/dist/tools/session-close.js +563 -326
  232. package/dist/tools/session-close.js.map +1 -1
  233. package/dist/tools/session-start.d.ts +10 -6
  234. package/dist/tools/session-start.d.ts.map +1 -1
  235. package/dist/tools/session-start.js +317 -426
  236. package/dist/tools/session-start.js.map +1 -1
  237. package/dist/types/index.d.ts +37 -4
  238. package/dist/types/index.d.ts.map +1 -1
  239. package/hooks/.claude-plugin/plugin.json +8 -0
  240. package/hooks/README.md +107 -0
  241. package/hooks/hooks/hooks.json +123 -0
  242. package/hooks/scripts/auto-retrieve-hook.sh +163 -0
  243. package/hooks/scripts/post-tool-use.sh +112 -0
  244. package/hooks/scripts/recall-check.sh +213 -0
  245. package/hooks/scripts/session-close-check.sh +116 -0
  246. package/hooks/scripts/session-start.sh +233 -0
  247. package/hooks/tests/test-hooks.sh +577 -0
  248. package/package.json +4 -2
  249. 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