gitmem-mcp 1.0.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 (246) hide show
  1. package/CLAUDE.md.template +63 -55
  2. package/README.md +60 -29
  3. package/bin/gitmem.js +233 -109
  4. package/bin/init-wizard.js +642 -0
  5. package/bin/uninstall.js +288 -0
  6. package/dist/commands/check.js +20 -20
  7. package/dist/commands/check.js.map +1 -1
  8. package/dist/constants/closing-questions.d.ts +6 -0
  9. package/dist/constants/closing-questions.d.ts.map +1 -1
  10. package/dist/constants/closing-questions.js +65 -0
  11. package/dist/constants/closing-questions.js.map +1 -1
  12. package/dist/hooks/format-utils.d.ts +52 -0
  13. package/dist/hooks/format-utils.d.ts.map +1 -0
  14. package/dist/hooks/format-utils.js +89 -0
  15. package/dist/hooks/format-utils.js.map +1 -0
  16. package/dist/hooks/quick-retrieve.d.ts +30 -0
  17. package/dist/hooks/quick-retrieve.d.ts.map +1 -0
  18. package/dist/hooks/quick-retrieve.js +149 -0
  19. package/dist/hooks/quick-retrieve.js.map +1 -0
  20. package/dist/index.js +0 -0
  21. package/dist/schemas/active-sessions.d.ts +8 -8
  22. package/dist/schemas/analyze.d.ts +3 -3
  23. package/dist/schemas/common.d.ts +2 -2
  24. package/dist/schemas/common.d.ts.map +1 -1
  25. package/dist/schemas/common.js +1 -1
  26. package/dist/schemas/common.js.map +1 -1
  27. package/dist/schemas/create-decision.d.ts +3 -3
  28. package/dist/schemas/create-learning.d.ts +13 -13
  29. package/dist/schemas/log.d.ts +3 -3
  30. package/dist/schemas/prepare-context.d.ts +3 -3
  31. package/dist/schemas/recall.d.ts +3 -3
  32. package/dist/schemas/record-scar-usage-batch.d.ts +8 -3
  33. package/dist/schemas/record-scar-usage-batch.d.ts.map +1 -1
  34. package/dist/schemas/record-scar-usage.d.ts +3 -0
  35. package/dist/schemas/record-scar-usage.d.ts.map +1 -1
  36. package/dist/schemas/record-scar-usage.js +1 -0
  37. package/dist/schemas/record-scar-usage.js.map +1 -1
  38. package/dist/schemas/registry.d.ts +18 -0
  39. package/dist/schemas/registry.d.ts.map +1 -0
  40. package/dist/schemas/registry.js +158 -0
  41. package/dist/schemas/registry.js.map +1 -0
  42. package/dist/schemas/save-transcript.d.ts +3 -3
  43. package/dist/schemas/search-transcripts.d.ts +33 -0
  44. package/dist/schemas/search-transcripts.d.ts.map +1 -0
  45. package/dist/schemas/search-transcripts.js +26 -0
  46. package/dist/schemas/search-transcripts.js.map +1 -0
  47. package/dist/schemas/search.d.ts +3 -3
  48. package/dist/schemas/session-close.d.ts +43 -15
  49. package/dist/schemas/session-close.d.ts.map +1 -1
  50. package/dist/schemas/session-close.js +7 -2
  51. package/dist/schemas/session-close.js.map +1 -1
  52. package/dist/schemas/session-start.d.ts +3 -3
  53. package/dist/schemas/thread.d.ts +3 -3
  54. package/dist/server.d.ts.map +1 -1
  55. package/dist/server.js +82 -28
  56. package/dist/server.js.map +1 -1
  57. package/dist/services/active-sessions.d.ts +2 -1
  58. package/dist/services/active-sessions.d.ts.map +1 -1
  59. package/dist/services/active-sessions.js +130 -84
  60. package/dist/services/active-sessions.js.map +1 -1
  61. package/dist/services/analytics.d.ts.map +1 -1
  62. package/dist/services/analytics.js +1 -0
  63. package/dist/services/analytics.js.map +1 -1
  64. package/dist/services/behavioral-decay.d.ts +40 -0
  65. package/dist/services/behavioral-decay.d.ts.map +1 -0
  66. package/dist/services/behavioral-decay.js +110 -0
  67. package/dist/services/behavioral-decay.js.map +1 -0
  68. package/dist/services/bm25.d.ts +39 -0
  69. package/dist/services/bm25.d.ts.map +1 -0
  70. package/dist/services/bm25.js +132 -0
  71. package/dist/services/bm25.js.map +1 -0
  72. package/dist/services/cache.d.ts.map +1 -1
  73. package/dist/services/cache.js +9 -8
  74. package/dist/services/cache.js.map +1 -1
  75. package/dist/services/cache.test.js +17 -17
  76. package/dist/services/cache.test.js.map +1 -1
  77. package/dist/services/compliance-validator.d.ts.map +1 -1
  78. package/dist/services/compliance-validator.js +12 -1
  79. package/dist/services/compliance-validator.js.map +1 -1
  80. package/dist/services/display-protocol.d.ts +31 -0
  81. package/dist/services/display-protocol.d.ts.map +1 -0
  82. package/dist/services/display-protocol.js +73 -0
  83. package/dist/services/display-protocol.js.map +1 -0
  84. package/dist/services/effect-tracker.d.ts +81 -0
  85. package/dist/services/effect-tracker.d.ts.map +1 -0
  86. package/dist/services/effect-tracker.js +181 -0
  87. package/dist/services/effect-tracker.js.map +1 -0
  88. package/dist/services/file-lock.d.ts +31 -0
  89. package/dist/services/file-lock.d.ts.map +1 -0
  90. package/dist/services/file-lock.js +124 -0
  91. package/dist/services/file-lock.js.map +1 -0
  92. package/dist/services/gitmem-dir.d.ts +7 -0
  93. package/dist/services/gitmem-dir.d.ts.map +1 -1
  94. package/dist/services/gitmem-dir.js +21 -0
  95. package/dist/services/gitmem-dir.js.map +1 -1
  96. package/dist/services/local-file-storage.d.ts +3 -2
  97. package/dist/services/local-file-storage.d.ts.map +1 -1
  98. package/dist/services/local-file-storage.js +30 -43
  99. package/dist/services/local-file-storage.js.map +1 -1
  100. package/dist/services/local-vector-search.d.ts +10 -9
  101. package/dist/services/local-vector-search.d.ts.map +1 -1
  102. package/dist/services/local-vector-search.js +28 -23
  103. package/dist/services/local-vector-search.js.map +1 -1
  104. package/dist/services/metrics.d.ts +7 -2
  105. package/dist/services/metrics.d.ts.map +1 -1
  106. package/dist/services/metrics.js +41 -33
  107. package/dist/services/metrics.js.map +1 -1
  108. package/dist/services/session-state.d.ts +8 -0
  109. package/dist/services/session-state.d.ts.map +1 -1
  110. package/dist/services/session-state.js +9 -2
  111. package/dist/services/session-state.js.map +1 -1
  112. package/dist/services/startup.d.ts +12 -13
  113. package/dist/services/startup.d.ts.map +1 -1
  114. package/dist/services/startup.js +104 -57
  115. package/dist/services/startup.js.map +1 -1
  116. package/dist/services/supabase-client.d.ts +2 -1
  117. package/dist/services/supabase-client.d.ts.map +1 -1
  118. package/dist/services/supabase-client.js +22 -16
  119. package/dist/services/supabase-client.js.map +1 -1
  120. package/dist/services/thread-dedup.d.ts +9 -0
  121. package/dist/services/thread-dedup.d.ts.map +1 -1
  122. package/dist/services/thread-dedup.js +27 -0
  123. package/dist/services/thread-dedup.js.map +1 -1
  124. package/dist/services/thread-manager.d.ts.map +1 -1
  125. package/dist/services/thread-manager.js +38 -16
  126. package/dist/services/thread-manager.js.map +1 -1
  127. package/dist/services/thread-suggestions.d.ts.map +1 -1
  128. package/dist/services/thread-suggestions.js +1 -1
  129. package/dist/services/thread-suggestions.js.map +1 -1
  130. package/dist/services/thread-supabase.d.ts +0 -1
  131. package/dist/services/thread-supabase.d.ts.map +1 -1
  132. package/dist/services/thread-supabase.js +83 -54
  133. package/dist/services/thread-supabase.js.map +1 -1
  134. package/dist/services/timezone.d.ts.map +1 -1
  135. package/dist/services/timezone.js +1 -0
  136. package/dist/services/timezone.js.map +1 -1
  137. package/dist/services/transcript-chunker.d.ts.map +1 -1
  138. package/dist/services/transcript-chunker.js +18 -4
  139. package/dist/services/transcript-chunker.js.map +1 -1
  140. package/dist/services/variant-generation.d.ts +41 -0
  141. package/dist/services/variant-generation.d.ts.map +1 -0
  142. package/dist/services/variant-generation.js +263 -0
  143. package/dist/services/variant-generation.js.map +1 -0
  144. package/dist/tools/absorb-observations.d.ts.map +1 -1
  145. package/dist/tools/absorb-observations.js +9 -0
  146. package/dist/tools/absorb-observations.js.map +1 -1
  147. package/dist/tools/analyze.d.ts.map +1 -1
  148. package/dist/tools/analyze.js +13 -2
  149. package/dist/tools/analyze.js.map +1 -1
  150. package/dist/tools/archive-learning.d.ts +28 -0
  151. package/dist/tools/archive-learning.d.ts.map +1 -0
  152. package/dist/tools/archive-learning.js +81 -0
  153. package/dist/tools/archive-learning.js.map +1 -0
  154. package/dist/tools/cleanup-threads.d.ts +1 -0
  155. package/dist/tools/cleanup-threads.d.ts.map +1 -1
  156. package/dist/tools/cleanup-threads.js +111 -18
  157. package/dist/tools/cleanup-threads.js.map +1 -1
  158. package/dist/tools/confirm-scars.d.ts.map +1 -1
  159. package/dist/tools/confirm-scars.js +8 -2
  160. package/dist/tools/confirm-scars.js.map +1 -1
  161. package/dist/tools/create-decision.d.ts.map +1 -1
  162. package/dist/tools/create-decision.js +11 -8
  163. package/dist/tools/create-decision.js.map +1 -1
  164. package/dist/tools/create-learning.d.ts.map +1 -1
  165. package/dist/tools/create-learning.js +35 -11
  166. package/dist/tools/create-learning.js.map +1 -1
  167. package/dist/tools/create-linear-issue.d.ts +18 -0
  168. package/dist/tools/create-linear-issue.d.ts.map +1 -0
  169. package/dist/tools/create-linear-issue.js +197 -0
  170. package/dist/tools/create-linear-issue.js.map +1 -0
  171. package/dist/tools/create-thread.d.ts +2 -1
  172. package/dist/tools/create-thread.d.ts.map +1 -1
  173. package/dist/tools/create-thread.js +9 -4
  174. package/dist/tools/create-thread.js.map +1 -1
  175. package/dist/tools/definitions.d.ts +785 -34
  176. package/dist/tools/definitions.d.ts.map +1 -1
  177. package/dist/tools/definitions.js +239 -95
  178. package/dist/tools/definitions.js.map +1 -1
  179. package/dist/tools/dismiss-suggestion.d.ts +1 -0
  180. package/dist/tools/dismiss-suggestion.d.ts.map +1 -1
  181. package/dist/tools/dismiss-suggestion.js +4 -0
  182. package/dist/tools/dismiss-suggestion.js.map +1 -1
  183. package/dist/tools/graph-traverse.d.ts +1 -0
  184. package/dist/tools/graph-traverse.d.ts.map +1 -1
  185. package/dist/tools/graph-traverse.js +24 -9
  186. package/dist/tools/graph-traverse.js.map +1 -1
  187. package/dist/tools/list-threads.d.ts.map +1 -1
  188. package/dist/tools/list-threads.js +49 -5
  189. package/dist/tools/list-threads.js.map +1 -1
  190. package/dist/tools/log.d.ts +1 -0
  191. package/dist/tools/log.d.ts.map +1 -1
  192. package/dist/tools/log.js +84 -17
  193. package/dist/tools/log.js.map +1 -1
  194. package/dist/tools/prepare-context.d.ts +1 -0
  195. package/dist/tools/prepare-context.d.ts.map +1 -1
  196. package/dist/tools/prepare-context.js +15 -85
  197. package/dist/tools/prepare-context.js.map +1 -1
  198. package/dist/tools/promote-suggestion.d.ts +1 -0
  199. package/dist/tools/promote-suggestion.d.ts.map +1 -1
  200. package/dist/tools/promote-suggestion.js +5 -0
  201. package/dist/tools/promote-suggestion.js.map +1 -1
  202. package/dist/tools/recall.d.ts +2 -0
  203. package/dist/tools/recall.d.ts.map +1 -1
  204. package/dist/tools/recall.js +43 -10
  205. package/dist/tools/recall.js.map +1 -1
  206. package/dist/tools/recall.test.js +6 -6
  207. package/dist/tools/recall.test.js.map +1 -1
  208. package/dist/tools/record-scar-usage-batch.d.ts.map +1 -1
  209. package/dist/tools/record-scar-usage-batch.js +13 -0
  210. package/dist/tools/record-scar-usage-batch.js.map +1 -1
  211. package/dist/tools/record-scar-usage.d.ts.map +1 -1
  212. package/dist/tools/record-scar-usage.js +6 -0
  213. package/dist/tools/record-scar-usage.js.map +1 -1
  214. package/dist/tools/resolve-thread.d.ts.map +1 -1
  215. package/dist/tools/resolve-thread.js +57 -6
  216. package/dist/tools/resolve-thread.js.map +1 -1
  217. package/dist/tools/save-transcript.d.ts +1 -0
  218. package/dist/tools/save-transcript.d.ts.map +1 -1
  219. package/dist/tools/save-transcript.js +3 -1
  220. package/dist/tools/save-transcript.js.map +1 -1
  221. package/dist/tools/search-transcripts.d.ts +44 -0
  222. package/dist/tools/search-transcripts.d.ts.map +1 -0
  223. package/dist/tools/search-transcripts.js +158 -0
  224. package/dist/tools/search-transcripts.js.map +1 -0
  225. package/dist/tools/search.d.ts +1 -0
  226. package/dist/tools/search.d.ts.map +1 -1
  227. package/dist/tools/search.js +74 -3
  228. package/dist/tools/search.js.map +1 -1
  229. package/dist/tools/session-close.d.ts.map +1 -1
  230. package/dist/tools/session-close.js +563 -326
  231. package/dist/tools/session-close.js.map +1 -1
  232. package/dist/tools/session-start.d.ts +10 -6
  233. package/dist/tools/session-start.d.ts.map +1 -1
  234. package/dist/tools/session-start.js +317 -426
  235. package/dist/tools/session-start.js.map +1 -1
  236. package/dist/types/index.d.ts +37 -4
  237. package/dist/types/index.d.ts.map +1 -1
  238. package/hooks/hooks/hooks.json +8 -37
  239. package/hooks/scripts/auto-retrieve-hook.sh +163 -0
  240. package/hooks/scripts/post-tool-use.sh +0 -16
  241. package/hooks/scripts/recall-check.sh +0 -11
  242. package/hooks/scripts/session-close-check.sh +1 -1
  243. package/hooks/scripts/session-start.sh +89 -13
  244. package/hooks/tests/test-hooks.sh +3 -49
  245. package/package.json +3 -2
  246. package/schema/setup.sql +1 -1
@@ -73,11 +73,6 @@ case "$TOOL_NAME" in
73
73
  QUERY=$(parse_json "$HOOK_INPUT" ".tool_input.query")
74
74
  DETAIL="query: ${QUERY:-<no query>}"
75
75
  ;;
76
- mcp__supabase__semantic_search|mcp__supabase__scar_search)
77
- EVENT_TYPE="LOOKED"
78
- QUERY=$(parse_json "$HOOK_INPUT" ".tool_input.query")
79
- DETAIL="query: ${QUERY:-<no query>}"
80
- ;;
81
76
  Bash)
82
77
  COMMAND=$(parse_json "$HOOK_INPUT" ".tool_input.command")
83
78
  if echo "$COMMAND" | grep -qE '(git\s+push|git\s+tag|npm\s+publish|npx\s+supabase\s+db\s+push|deploy|supabase\s+functions\s+deploy)'; then
@@ -85,17 +80,6 @@ case "$TOOL_NAME" in
85
80
  DETAIL="command: $COMMAND"
86
81
  fi
87
82
  ;;
88
- mcp__linear__update_issue)
89
- STATE=$(parse_json "$HOOK_INPUT" ".tool_input.state")
90
- STATE_LOWER=$(echo "$STATE" | tr '[:upper:]' '[:lower:]')
91
- case "$STATE_LOWER" in
92
- done|complete|completed|closed)
93
- EVENT_TYPE="ACTION"
94
- ISSUE_ID=$(parse_json "$HOOK_INPUT" ".tool_input.id")
95
- DETAIL="issue: ${ISSUE_ID:-unknown} -> ${STATE}"
96
- ;;
97
- esac
98
- ;;
99
83
  Write|Edit)
100
84
  FILE_PATH=$(parse_json "$HOOK_INPUT" ".tool_input.file_path")
101
85
  if echo "$FILE_PATH" | grep -qE '\.(sql|env)$'; then
@@ -15,7 +15,6 @@
15
15
  #
16
16
  # Filter layer: Only triggers on consequential actions:
17
17
  # - Bash: git push, git tag, npm publish, deploy commands
18
- # - Linear: state changes to Done/Complete
19
18
  # - Write/Edit: .sql migrations, .env files
20
19
  #
21
20
  # Input: JSON via stdin with tool_name and tool_input
@@ -103,16 +102,6 @@ case "$TOOL_NAME" in
103
102
  IS_CONSEQUENTIAL=true
104
103
  fi
105
104
  ;;
106
- mcp__linear__update_issue)
107
- # Check for Done/Complete state transitions
108
- STATE=$(parse_json "$HOOK_INPUT" ".tool_input.state")
109
- STATE_LOWER=$(echo "$STATE" | tr '[:upper:]' '[:lower:]')
110
- case "$STATE_LOWER" in
111
- done|complete|completed|closed)
112
- IS_CONSEQUENTIAL=true
113
- ;;
114
- esac
115
- ;;
116
105
  Write|Edit)
117
106
  # Check for sensitive file types
118
107
  FILE_PATH=$(parse_json "$HOOK_INPUT" ".tool_input.file_path")
@@ -101,7 +101,7 @@ if [ "$SESSION_STARTED" = "true" ]; then
101
101
  cat <<'HOOKJSON'
102
102
  {
103
103
  "decision": "block",
104
- "reason": "GITMEM SESSION STILL OPEN: You have an active GitMem session that hasn't been closed. Please run `session_close` (or `gm-close`) before ending the session. This persists your session data, captures learnings, and records scar usage.\n\nIf this is a trivial session (< 30min, purely exploratory), use close_type: 'quick'. Otherwise use 'standard' for full closing reflection."
104
+ "reason": "GITMEM SESSION STILL OPEN Run the standard closing ceremony:\n\n1. YOU (the agent) ANSWER these 7 reflection questions based on the session. Display your answers to the human:\n - what_broke: What broke that you didn't expect?\n - what_took_longer: What took longer than it should have?\n - do_differently: What would you do differently next time?\n - what_worked: What pattern or approach worked well?\n - wrong_assumption: What assumption was wrong?\n - scars_applied: Which scars or institutional knowledge did you apply?\n - institutional_memory: What from this session should be captured?\n\n2. ASK the human: 'Any corrections or additions to my answers?' WAIT for their response.\n\n3. WRITE structured payload to .gitmem/closing-payload.json with closing_reflection (7 fields above, incorporating human corrections), task_completion (timestamps), and human_corrections.\n\n4. CALL session_close with session_id and close_type: 'standard'.\n\nFor trivial sessions (< 30min, exploratory only), use close_type: 'quick' instead no questions needed."
105
105
  }
106
106
  HOOKJSON
107
107
  exit 0
@@ -98,7 +98,7 @@ fi
98
98
  if [ "$GITMEM_DETECTED" = "false" ]; then
99
99
  for SERVER_PATH in \
100
100
  "${GITMEM_SERVER_PATH:-}" \
101
- "/workspace/gitmem/dist/index.js" \
101
+ "$(which gitmem-mcp 2>/dev/null || echo '')" \
102
102
  "$(which gitmem 2>/dev/null || echo '')"; do
103
103
  if [ -n "$SERVER_PATH" ] && [ -f "$SERVER_PATH" ]; then
104
104
  GITMEM_DETECTED=true
@@ -108,6 +108,61 @@ if [ "$GITMEM_DETECTED" = "false" ]; then
108
108
  done
109
109
  fi
110
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
+
111
166
  # ============================================================================
112
167
  # Create session state directory
113
168
  # ============================================================================
@@ -126,27 +181,48 @@ echo "0" > "$STATE_DIR/last_nag_time"
126
181
  if [ "$GITMEM_DETECTED" = "true" ]; then
127
182
  echo "[$(date)] Gitmem DETECTED via ${DETECT_SOURCE} — instructing agent to call session_start via MCP" >> "$PLUGIN_LOG"
128
183
 
129
- # Always instruct agent to call ToolSearch + session_start via MCP.
184
+ # Instruct agent to call session_start via MCP.
130
185
  # The MCP server creates sessions with its own PID, enabling multi-session
131
186
  # isolation (Phase 1, GIT-19). CLI binary invocation was removed because
132
187
  # the CLI PID dies immediately, defeating PID-based session identity.
133
- cat <<'HOOK_MSG'
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
134
202
  SESSION START — ACTIVE
135
203
 
136
- All MCP tools are deferred. You MUST load them first via ToolSearch.
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
137
209
 
138
- Step 1 Load tools:
139
- ToolSearch(query: "+gitmem session", max_results: 5)
210
+ Call mcp__gitmem__session_start() as your FIRST tool call.
211
+ HOOK_MSG
212
+ fi
140
213
 
141
- Step 2 — Start session:
142
- mcp__gitmem__session_start(project: "orchestra_dev")
214
+ cat <<'HOOK_MSG2'
143
215
 
144
216
  IMPORTANT:
145
- - Do NOT skip Step 1. Without it, session_start will not exist as a callable tool.
146
- - Do NOT say "tools aren't available" ToolSearch makes them available.
147
- - Do NOT respond to the user until both steps complete.
148
- - Execute Step 1 and Step 2 as your FIRST two tool calls of the session.
149
- HOOK_MSG
217
+ - Do NOT respond to the user until session_start completes.
218
+ - Do NOT diagnose tool availabilitygitmem 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
150
226
  else
151
227
  echo "[$(date)] Gitmem NOT detected (checked: project .mcp.json, mcp-config, ~/.claude.json, disk)" >> "$PLUGIN_LOG"
152
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."
@@ -456,22 +456,7 @@ else
456
456
  "exit=$EXIT_CODE, file=$([ -f $AUDIT_FILE ] && cat $AUDIT_FILE || echo 'missing')"
457
457
  fi
458
458
 
459
- # Test 4.3: semantic_search callLOOKED event logged
460
- setup_state 0 0
461
- create_session_registry "test-session"
462
- rm -f "/tmp/gitmem-hooks-test-$$/audit.jsonl"
463
- OUTPUT=$(echo '{"tool_name":"mcp__supabase__semantic_search","tool_input":{"query":"hook enforcement"}}' | \
464
- bash "$SCRIPT_DIR/scripts/post-tool-use.sh" 2>/dev/null)
465
-
466
- if [ -f "$AUDIT_FILE" ] && grep -q '"type":"LOOKED"' "$AUDIT_FILE" && grep -q 'semantic_search' "$AUDIT_FILE"; then
467
- pass "semantic_search → LOOKED event in audit.jsonl"
468
- else
469
- fail "semantic_search → LOOKED event" \
470
- "audit.jsonl contains LOOKED + semantic_search" \
471
- "$([ -f $AUDIT_FILE ] && cat $AUDIT_FILE || echo 'missing')"
472
- fi
473
-
474
- # Test 4.4: Consequential Bash (git push) → ACTION event logged
459
+ # Test 4.3: Consequential Bash (git push) ACTION event logged
475
460
  setup_state 0 0
476
461
  create_session_registry "test-session"
477
462
  rm -f "/tmp/gitmem-hooks-test-$$/audit.jsonl"
@@ -486,7 +471,7 @@ else
486
471
  "$([ -f $AUDIT_FILE ] && cat $AUDIT_FILE || echo 'missing')"
487
472
  fi
488
473
 
489
- # Test 4.5: Non-consequential Bash (ls) → no audit entry
474
+ # Test 4.4: Non-consequential Bash (ls) → no audit entry
490
475
  setup_state 0 0
491
476
  create_session_registry "test-session"
492
477
  rm -f "/tmp/gitmem-hooks-test-$$/audit.jsonl"
@@ -502,38 +487,7 @@ else
502
487
  "exit=$EXIT_CODE, audit=$([ -f $AUDIT_FILE ] && cat $AUDIT_FILE || echo 'missing')"
503
488
  fi
504
489
 
505
- # Test 4.6: Linear update_issue to Done → ACTION event
506
- setup_state 0 0
507
- create_session_registry "test-session"
508
- rm -f "/tmp/gitmem-hooks-test-$$/audit.jsonl"
509
- OUTPUT=$(echo '{"tool_name":"mcp__linear__update_issue","tool_input":{"id":"OD-100","state":"Done"}}' | \
510
- bash "$SCRIPT_DIR/scripts/post-tool-use.sh" 2>/dev/null)
511
-
512
- if [ -f "$AUDIT_FILE" ] && grep -q '"type":"ACTION"' "$AUDIT_FILE" && grep -q 'OD-100' "$AUDIT_FILE"; then
513
- pass "Linear update_issue Done → ACTION event"
514
- else
515
- fail "Linear Done → ACTION event" \
516
- "audit.jsonl contains ACTION + OD-100" \
517
- "$([ -f $AUDIT_FILE ] && cat $AUDIT_FILE || echo 'missing')"
518
- fi
519
-
520
- # Test 4.7: Linear update_issue to non-Done state → no audit entry
521
- setup_state 0 0
522
- create_session_registry "test-session"
523
- rm -f "/tmp/gitmem-hooks-test-$$/audit.jsonl"
524
- OUTPUT=$(echo '{"tool_name":"mcp__linear__update_issue","tool_input":{"id":"OD-100","state":"In Progress"}}' | \
525
- bash "$SCRIPT_DIR/scripts/post-tool-use.sh" 2>/dev/null)
526
- EXIT_CODE=$?
527
-
528
- if [ $EXIT_CODE -eq 0 ] && [ ! -f "$AUDIT_FILE" ]; then
529
- pass "Linear update to In Progress → no audit entry"
530
- else
531
- fail "Linear non-Done → no audit" \
532
- "no audit.jsonl" \
533
- "audit=$([ -f $AUDIT_FILE ] && cat $AUDIT_FILE || echo 'missing')"
534
- fi
535
-
536
- # Test 4.8: Write .sql file → ACTION event
490
+ # Test 4.5: Write .sql file → ACTION event
537
491
  setup_state 0 0
538
492
  create_session_registry "test-session"
539
493
  rm -f "/tmp/gitmem-hooks-test-$$/audit.jsonl"
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "gitmem-mcp",
3
- "version": "1.0.0",
4
- "description": "Institutional memory for AI coding agents. Never repeat the same mistake.",
3
+ "version": "1.0.1",
4
+ "description": "Institutional memory for AI coding agents. Memory that compounds.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
7
7
  "types": "dist/index.d.ts",
@@ -33,6 +33,7 @@
33
33
  "zod": "^3.22.0"
34
34
  },
35
35
  "devDependencies": {
36
+ "@anthropic-ai/claude-agent-sdk": "^0.2.38",
36
37
  "@testcontainers/postgresql": "^10.6.0",
37
38
  "@types/node": "^20.0.0",
38
39
  "@types/pg": "^8.10.0",
package/schema/setup.sql CHANGED
@@ -10,7 +10,7 @@ CREATE EXTENSION IF NOT EXISTS vector;
10
10
  -- ============================================================================
11
11
  CREATE TABLE IF NOT EXISTS gitmem_learnings (
12
12
  id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
13
- learning_type TEXT NOT NULL CHECK (learning_type IN ('scar', 'win', 'pattern')),
13
+ learning_type TEXT NOT NULL CHECK (learning_type IN ('scar', 'win', 'pattern', 'anti_pattern')),
14
14
  title TEXT NOT NULL,
15
15
  description TEXT NOT NULL,
16
16
  severity TEXT CHECK (severity IN ('critical', 'high', 'medium', 'low')),