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.
- package/CLAUDE.md.template +63 -55
- package/README.md +60 -29
- package/bin/gitmem.js +233 -109
- 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/hooks/hooks.json +8 -37
- package/hooks/scripts/auto-retrieve-hook.sh +163 -0
- package/hooks/scripts/post-tool-use.sh +0 -16
- package/hooks/scripts/recall-check.sh +0 -11
- package/hooks/scripts/session-close-check.sh +1 -1
- package/hooks/scripts/session-start.sh +89 -13
- package/hooks/tests/test-hooks.sh +3 -49
- package/package.json +3 -2
- 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
|
|
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
|
-
"
|
|
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
|
-
#
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
139
|
-
|
|
210
|
+
Call mcp__gitmem__session_start() as your FIRST tool call.
|
|
211
|
+
HOOK_MSG
|
|
212
|
+
fi
|
|
140
213
|
|
|
141
|
-
|
|
142
|
-
mcp__gitmem__session_start(project: "orchestra_dev")
|
|
214
|
+
cat <<'HOOK_MSG2'
|
|
143
215
|
|
|
144
216
|
IMPORTANT:
|
|
145
|
-
- Do NOT
|
|
146
|
-
- Do NOT
|
|
147
|
-
-
|
|
148
|
-
|
|
149
|
-
|
|
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
|
|
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:
|
|
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.
|
|
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.
|
|
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.
|
|
4
|
-
"description": "Institutional memory for AI coding agents.
|
|
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')),
|