gitmem-mcp 1.0.0 → 1.0.2

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 (242) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/CLAUDE.md.template +63 -55
  3. package/README.md +79 -163
  4. package/bin/gitmem.js +233 -109
  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/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-thread.d.ts +2 -1
  168. package/dist/tools/create-thread.d.ts.map +1 -1
  169. package/dist/tools/create-thread.js +9 -4
  170. package/dist/tools/create-thread.js.map +1 -1
  171. package/dist/tools/definitions.d.ts +785 -34
  172. package/dist/tools/definitions.d.ts.map +1 -1
  173. package/dist/tools/definitions.js +239 -95
  174. package/dist/tools/definitions.js.map +1 -1
  175. package/dist/tools/dismiss-suggestion.d.ts +1 -0
  176. package/dist/tools/dismiss-suggestion.d.ts.map +1 -1
  177. package/dist/tools/dismiss-suggestion.js +4 -0
  178. package/dist/tools/dismiss-suggestion.js.map +1 -1
  179. package/dist/tools/graph-traverse.d.ts +1 -0
  180. package/dist/tools/graph-traverse.d.ts.map +1 -1
  181. package/dist/tools/graph-traverse.js +24 -9
  182. package/dist/tools/graph-traverse.js.map +1 -1
  183. package/dist/tools/list-threads.d.ts.map +1 -1
  184. package/dist/tools/list-threads.js +49 -5
  185. package/dist/tools/list-threads.js.map +1 -1
  186. package/dist/tools/log.d.ts +1 -0
  187. package/dist/tools/log.d.ts.map +1 -1
  188. package/dist/tools/log.js +84 -17
  189. package/dist/tools/log.js.map +1 -1
  190. package/dist/tools/prepare-context.d.ts +1 -0
  191. package/dist/tools/prepare-context.d.ts.map +1 -1
  192. package/dist/tools/prepare-context.js +15 -85
  193. package/dist/tools/prepare-context.js.map +1 -1
  194. package/dist/tools/promote-suggestion.d.ts +1 -0
  195. package/dist/tools/promote-suggestion.d.ts.map +1 -1
  196. package/dist/tools/promote-suggestion.js +5 -0
  197. package/dist/tools/promote-suggestion.js.map +1 -1
  198. package/dist/tools/recall.d.ts +2 -0
  199. package/dist/tools/recall.d.ts.map +1 -1
  200. package/dist/tools/recall.js +43 -10
  201. package/dist/tools/recall.js.map +1 -1
  202. package/dist/tools/recall.test.js +6 -6
  203. package/dist/tools/recall.test.js.map +1 -1
  204. package/dist/tools/record-scar-usage-batch.d.ts.map +1 -1
  205. package/dist/tools/record-scar-usage-batch.js +13 -0
  206. package/dist/tools/record-scar-usage-batch.js.map +1 -1
  207. package/dist/tools/record-scar-usage.d.ts.map +1 -1
  208. package/dist/tools/record-scar-usage.js +6 -0
  209. package/dist/tools/record-scar-usage.js.map +1 -1
  210. package/dist/tools/resolve-thread.d.ts.map +1 -1
  211. package/dist/tools/resolve-thread.js +57 -6
  212. package/dist/tools/resolve-thread.js.map +1 -1
  213. package/dist/tools/save-transcript.d.ts +1 -0
  214. package/dist/tools/save-transcript.d.ts.map +1 -1
  215. package/dist/tools/save-transcript.js +3 -1
  216. package/dist/tools/save-transcript.js.map +1 -1
  217. package/dist/tools/search-transcripts.d.ts +44 -0
  218. package/dist/tools/search-transcripts.d.ts.map +1 -0
  219. package/dist/tools/search-transcripts.js +158 -0
  220. package/dist/tools/search-transcripts.js.map +1 -0
  221. package/dist/tools/search.d.ts +1 -0
  222. package/dist/tools/search.d.ts.map +1 -1
  223. package/dist/tools/search.js +74 -3
  224. package/dist/tools/search.js.map +1 -1
  225. package/dist/tools/session-close.d.ts.map +1 -1
  226. package/dist/tools/session-close.js +563 -326
  227. package/dist/tools/session-close.js.map +1 -1
  228. package/dist/tools/session-start.d.ts +10 -6
  229. package/dist/tools/session-start.d.ts.map +1 -1
  230. package/dist/tools/session-start.js +319 -426
  231. package/dist/tools/session-start.js.map +1 -1
  232. package/dist/types/index.d.ts +37 -4
  233. package/dist/types/index.d.ts.map +1 -1
  234. package/hooks/hooks/hooks.json +8 -37
  235. package/hooks/scripts/auto-retrieve-hook.sh +163 -0
  236. package/hooks/scripts/post-tool-use.sh +0 -16
  237. package/hooks/scripts/recall-check.sh +0 -11
  238. package/hooks/scripts/session-close-check.sh +1 -1
  239. package/hooks/scripts/session-start.sh +89 -13
  240. package/hooks/tests/test-hooks.sh +3 -49
  241. package/package.json +3 -2
  242. package/schema/setup.sql +1 -1
@@ -14,11 +14,11 @@ export declare const SessionStartParamsSchema: z.ZodObject<{
14
14
  issue_title: z.ZodOptional<z.ZodString>;
15
15
  issue_description: z.ZodOptional<z.ZodString>;
16
16
  issue_labels: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
17
- project: z.ZodOptional<z.ZodEnum<["orchestra_dev", "weekend_warrior"]>>;
17
+ project: z.ZodOptional<z.ZodDefault<z.ZodString>>;
18
18
  /** OD-558: Force overwrite of existing active session */
19
19
  force: z.ZodOptional<z.ZodBoolean>;
20
20
  }, "strip", z.ZodTypeAny, {
21
- project?: "orchestra_dev" | "weekend_warrior" | undefined;
21
+ project?: string | undefined;
22
22
  linear_issue?: string | undefined;
23
23
  force?: boolean | undefined;
24
24
  agent_identity?: "CLI" | "DAC" | "CODA-1" | "Brain_Local" | "Brain_Cloud" | "Unknown" | undefined;
@@ -26,7 +26,7 @@ export declare const SessionStartParamsSchema: z.ZodObject<{
26
26
  issue_description?: string | undefined;
27
27
  issue_labels?: string[] | undefined;
28
28
  }, {
29
- project?: "orchestra_dev" | "weekend_warrior" | undefined;
29
+ project?: string | undefined;
30
30
  linear_issue?: string | undefined;
31
31
  force?: boolean | undefined;
32
32
  agent_identity?: "CLI" | "DAC" | "CODA-1" | "Brain_Local" | "Brain_Cloud" | "Unknown" | undefined;
@@ -43,13 +43,13 @@ export declare const ThreadObjectSchema: z.ZodObject<{
43
43
  export declare const ListThreadsParamsSchema: z.ZodObject<{
44
44
  status: z.ZodOptional<z.ZodEnum<["open", "resolved"]>>;
45
45
  include_resolved: z.ZodOptional<z.ZodBoolean>;
46
- project: z.ZodOptional<z.ZodEnum<["orchestra_dev", "weekend_warrior"]>>;
46
+ project: z.ZodOptional<z.ZodDefault<z.ZodString>>;
47
47
  }, "strip", z.ZodTypeAny, {
48
- project?: "orchestra_dev" | "weekend_warrior" | undefined;
48
+ project?: string | undefined;
49
49
  status?: "open" | "resolved" | undefined;
50
50
  include_resolved?: boolean | undefined;
51
51
  }, {
52
- project?: "orchestra_dev" | "weekend_warrior" | undefined;
52
+ project?: string | undefined;
53
53
  status?: "open" | "resolved" | undefined;
54
54
  include_resolved?: boolean | undefined;
55
55
  }>;
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAqEnE;;GAEG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAyQrC;AAED;;;;;;;;GAQG;AACH,wBAAsB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CA0B/C"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AA4EnE;;GAEG;AACH,wBAAgB,YAAY,IAAI,MAAM,CA+TrC;AAED;;;;;;;;GAQG;AACH,wBAAsB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAwB/C"}
package/dist/server.js CHANGED
@@ -17,6 +17,7 @@ import { recall } from "./tools/recall.js";
17
17
  import { confirmScars } from "./tools/confirm-scars.js";
18
18
  import { saveTranscript } from "./tools/save-transcript.js";
19
19
  import { getTranscript } from "./tools/get-transcript.js";
20
+ import { searchTranscripts } from "./tools/search-transcripts.js";
20
21
  import { search } from "./tools/search.js";
21
22
  import { log } from "./tools/log.js";
22
23
  import { analyze } from "./tools/analyze.js";
@@ -29,9 +30,13 @@ import { createThread } from "./tools/create-thread.js";
29
30
  import { promoteSuggestion } from "./tools/promote-suggestion.js";
30
31
  import { dismissSuggestion } from "./tools/dismiss-suggestion.js";
31
32
  import { cleanupThreads } from "./tools/cleanup-threads.js";
33
+ import { archiveLearning } from "./tools/archive-learning.js";
32
34
  import { getCacheStatus, checkCacheHealth, flushCache, startBackgroundInit, } from "./services/startup.js";
35
+ import { getEffectTracker } from "./services/effect-tracker.js";
36
+ import { getProject } from "./services/session-state.js";
33
37
  import { getTier, hasSupabase, hasCacheManagement, hasBatchOperations, hasTranscripts, } from "./services/tier.js";
34
38
  import { getRegisteredTools } from "./tools/definitions.js";
39
+ import { validateToolArgs } from "./schemas/registry.js";
35
40
  /**
36
41
  * Create and configure the MCP server
37
42
  */
@@ -66,6 +71,19 @@ export function createServer() {
66
71
  isError: true,
67
72
  };
68
73
  }
74
+ // Validate tool arguments against registered Zod schemas
75
+ const validationError = validateToolArgs(name, toolArgs);
76
+ if (validationError) {
77
+ return {
78
+ content: [
79
+ {
80
+ type: "text",
81
+ text: JSON.stringify({ error: validationError }),
82
+ },
83
+ ],
84
+ isError: true,
85
+ };
86
+ }
69
87
  try {
70
88
  let result;
71
89
  switch (name) {
@@ -118,6 +136,11 @@ export function createServer() {
118
136
  case "gitmem-gt":
119
137
  result = await getTranscript(toolArgs);
120
138
  break;
139
+ case "search_transcripts":
140
+ case "gitmem-stx":
141
+ case "gm-stx":
142
+ result = await searchTranscripts(toolArgs);
143
+ break;
121
144
  case "search":
122
145
  case "gitmem-search":
123
146
  case "gm-search":
@@ -173,6 +196,11 @@ export function createServer() {
173
196
  case "gm-cleanup":
174
197
  result = await cleanupThreads(toolArgs);
175
198
  break;
199
+ case "archive_learning":
200
+ case "gitmem-al":
201
+ case "gm-archive":
202
+ result = await archiveLearning(toolArgs);
203
+ break;
176
204
  case "gitmem-help": {
177
205
  const tier = getTier();
178
206
  const commands = [
@@ -193,38 +221,53 @@ export function createServer() {
193
221
  { alias: "gitmem-ps", full: "promote_suggestion", description: "Promote a suggested thread to open thread" },
194
222
  { alias: "gitmem-ds", full: "dismiss_suggestion", description: "Dismiss a suggested thread" },
195
223
  { alias: "gitmem-cleanup", full: "cleanup_threads", description: "Triage threads by lifecycle health" },
224
+ { alias: "gitmem-health", full: "health", description: "Show write health for fire-and-forget operations" },
225
+ { alias: "gitmem-al", full: "archive_learning", description: "Archive a scar/win/pattern (is_active=false)" },
196
226
  ];
197
227
  if (hasBatchOperations()) {
198
228
  commands.push({ alias: "gitmem-rsb", full: "record_scar_usage_batch", description: "Track multiple scars (batch)" });
199
229
  }
200
230
  if (hasTranscripts()) {
201
- commands.push({ alias: "gitmem-st", full: "save_transcript", description: "Save session transcript to storage" }, { alias: "gitmem-gt", full: "get_transcript", description: "Retrieve session transcript" });
231
+ commands.push({ alias: "gitmem-st", full: "save_transcript", description: "Save session transcript to storage" }, { alias: "gitmem-gt", full: "get_transcript", description: "Retrieve session transcript" }, { alias: "gitmem-stx", full: "search_transcripts", description: "Semantic search over transcript chunks" });
202
232
  }
203
233
  if (hasCacheManagement()) {
204
234
  commands.push({ alias: "gitmem-cache-status", full: "cache_status", description: "Show cache status" }, { alias: "gitmem-cache-health", full: "cache_health", description: "Compare local vs remote" }, { alias: "gitmem-cache-flush", full: "cache_flush", description: "Force reload from Supabase" });
205
235
  }
206
- // Output colored header directly to terminal (stderr)
207
- console.error(`
208
- \x1b[31m╔═══════════════════════════════════════════════════════════╗\x1b[0m
209
- \x1b[31m║\x1b[0m \x1b[31m║\x1b[0m
210
- \x1b[31m║ ██████ ██ ████████ ███ ███ ███████ ███ ███ ║\x1b[0m
211
- \x1b[38;5;208m║ ██ ██ ██ ████ ████ ██ ████ ████ ║\x1b[0m
212
- \x1b[38;5;208m║ ██ ███ ██ ██ ██ ████ ██ █████ ██ ████ ██ ║\x1b[0m
213
- \x1b[33m║ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ║\x1b[0m
214
- \x1b[33m║ ██████ ██ ██ ██ ██ ███████ ██ ██ ║\x1b[0m
215
- \x1b[33m║\x1b[0m \x1b[33m║\x1b[0m
216
- \x1b[38;5;208m║\x1b[0m \x1b[1;37mInstitutional Memory & Learning System\x1b[0m \x1b[38;5;208m║\x1b[0m
217
- \x1b[31m║\x1b[0m \x1b[3;90mNever repeat the same mistake\x1b[0m \x1b[31m║\x1b[0m
218
- \x1b[31m║\x1b[0m \x1b[31m║\x1b[0m
219
- \x1b[31m╚═══════════════════════════════════════════════════════════╝\x1b[0m
220
- `);
221
- // Return plain JSON result (no header - it's already printed above)
236
+ // Build command table for display
237
+ const cmdLines = commands.map(c => ` ${c.alias.padEnd(22)} ${c.description}`).join("\n");
238
+ const display = [
239
+ `gitmem v0.1.0 · ${tier} · ${registeredTools.length} tools · ${hasSupabase() ? "supabase" : "local (.gitmem/)"}`,
240
+ "Memory that compounds.",
241
+ "",
242
+ cmdLines,
243
+ "",
244
+ "**For detailed documentation and help, visit https://gitmem.ai/docs**",
245
+ "",
246
+ "───────────────────────────────────────────────────",
247
+ "DISPLAY PROTOCOL: Output the content above verbatim as your response text.",
248
+ "Tool results are collapsed in the CLI — the user cannot see them unless you echo them.",
249
+ ].join("\n");
222
250
  result = {
223
251
  version: "0.1.0",
224
252
  tier,
225
253
  tools_registered: registeredTools.length,
226
254
  storage: hasSupabase() ? "supabase" : "local (.gitmem/)",
227
255
  commands,
256
+ display,
257
+ };
258
+ break;
259
+ }
260
+ // Effect Tracker health report
261
+ case "health":
262
+ case "gitmem-health":
263
+ case "gm-health": {
264
+ const failureLimit = typeof toolArgs.failure_limit === "number" ? toolArgs.failure_limit : 10;
265
+ const tracker = getEffectTracker();
266
+ const report = tracker.getHealthReport(failureLimit);
267
+ const summary = tracker.formatSummary();
268
+ result = {
269
+ ...report,
270
+ text: summary || "No tracked effects this session.",
228
271
  };
229
272
  break;
230
273
  }
@@ -237,28 +280,40 @@ export function createServer() {
237
280
  // Cache management tools (OD-473)
238
281
  case "gitmem-cache-status":
239
282
  case "gm-cache-s":
240
- result = getCacheStatus(toolArgs.project || "orchestra_dev");
283
+ result = getCacheStatus(toolArgs.project || getProject() || "default");
241
284
  break;
242
285
  case "gitmem-cache-health":
243
286
  case "gm-cache-h":
244
- result = await checkCacheHealth(toolArgs.project || "orchestra_dev");
287
+ result = await checkCacheHealth(toolArgs.project || getProject() || "default");
245
288
  break;
246
289
  case "gitmem-cache-flush":
247
290
  case "gm-cache-f":
248
- result = await flushCache(toolArgs.project || "orchestra_dev");
291
+ result = await flushCache(toolArgs.project || getProject() || "default");
249
292
  break;
250
293
  default:
251
294
  throw new Error(`Unknown tool: ${name}`);
252
295
  }
296
+ // Build the response text.
297
+ // When a `display` field exists, use it directly as the response.
298
+ // The display should contain everything both the user and LLM need —
299
+ // formatted output for readability, plus any key IDs/refs inline.
300
+ // No separate machine-data blob: it bloats the response and causes
301
+ // CLI auto-collapse ("+N lines"), hurting the user experience.
302
+ let responseText;
303
+ if (result && typeof result === "object" && "display" in result && typeof result.display === "string") {
304
+ responseText = result.display;
305
+ }
306
+ else if (result && typeof result === "object" && "text" in result && typeof result.text === "string") {
307
+ responseText = result.text;
308
+ }
309
+ else {
310
+ responseText = JSON.stringify(result, null, 2);
311
+ }
253
312
  return {
254
313
  content: [
255
314
  {
256
315
  type: "text",
257
- text: (result && typeof result === "object" && "display" in result && typeof result.display === "string")
258
- ? result.display
259
- : (result && typeof result === "object" && "text" in result && typeof result.text === "string")
260
- ? result.text
261
- : JSON.stringify(result, null, 2),
316
+ text: responseText,
262
317
  },
263
318
  ],
264
319
  };
@@ -300,9 +355,8 @@ export async function runServer() {
300
355
  // Pro/Dev: Initialize local vector search in background (non-blocking)
301
356
  // This loads scars with embeddings directly from Supabase REST API
302
357
  console.error("[gitmem] Starting background cache initialization...");
303
- startBackgroundInit("orchestra_dev");
304
- // Also init weekend_warrior if needed (non-blocking)
305
- startBackgroundInit("weekend_warrior");
358
+ const warmupProject = process.env.GITMEM_DEFAULT_PROJECT || "default";
359
+ startBackgroundInit(warmupProject);
306
360
  console.error("[gitmem] Server ready | Cache loading in background");
307
361
  }
308
362
  else {
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
@@ -14,8 +14,9 @@ import type { ActiveSessionEntry } from "../types/index.js";
14
14
  /**
15
15
  * Register a new session in the active-sessions registry.
16
16
  * Idempotent: re-registering the same session_id replaces the entry.
17
+ * Returns session IDs that were displaced (different session_id, same hostname+pid).
17
18
  */
18
- export declare function registerSession(entry: ActiveSessionEntry): void;
19
+ export declare function registerSession(entry: ActiveSessionEntry): string[];
19
20
  /**
20
21
  * Unregister a session from the active-sessions registry.
21
22
  * Returns true if the session was found and removed.
@@ -1 +1 @@
1
- {"version":3,"file":"active-sessions.d.ts","sourceRoot":"","sources":["../../src/services/active-sessions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAOH,OAAO,KAAK,EAAE,kBAAkB,EAA0B,MAAM,mBAAmB,CAAC;AAyEpF;;;GAGG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,kBAAkB,GAAG,IAAI,CAQ/D;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAc5D;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,kBAAkB,EAAE,CAEzD;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,kBAAkB,GAAG,IAAI,CAG7F;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,kBAAkB,GAAG,IAAI,CAG5E;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,UAAU,IAAI,MAAM,CA2DnC;AAyDD;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAsD3C;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,IAAI,CAEzC"}
1
+ {"version":3,"file":"active-sessions.d.ts","sourceRoot":"","sources":["../../src/services/active-sessions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAOH,OAAO,KAAK,EAAE,kBAAkB,EAA0B,MAAM,mBAAmB,CAAC;AAgFpF;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,kBAAkB,GAAG,MAAM,EAAE,CA4BnE;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAoB5D;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,kBAAkB,EAAE,CAEzD;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,kBAAkB,GAAG,IAAI,CAG7F;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,kBAAkB,GAAG,IAAI,CAG5E;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,UAAU,IAAI,MAAM,CA4EnC;AAyDD;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAwD3C;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,IAAI,CAEzC"}
@@ -15,8 +15,11 @@ import * as path from "path";
15
15
  import * as os from "os";
16
16
  import { getGitmemDir, getSessionPath } from "./gitmem-dir.js";
17
17
  import { ActiveSessionsRegistrySchema } from "../schemas/active-sessions.js";
18
+ import { withLockSync } from "./file-lock.js";
18
19
  const REGISTRY_FILENAME = "active-sessions.json";
20
+ const LOCK_FILENAME = "active-sessions.lock";
19
21
  const STALE_THRESHOLD_MS = 24 * 60 * 60 * 1000; // 24 hours
22
+ const ADOPT_THRESHOLD_MS = 2 * 60 * 60 * 1000; // 2 hours — adopt dead-PID sessions if recent
20
23
  // --- Atomic write utility ---
21
24
  /**
22
25
  * Atomic write: write to a temp file in the same directory, then rename.
@@ -45,6 +48,9 @@ function atomicWriteFileSync(filePath, data) {
45
48
  function getRegistryPath() {
46
49
  return path.join(getGitmemDir(), REGISTRY_FILENAME);
47
50
  }
51
+ function getLockPath() {
52
+ return path.join(getGitmemDir(), LOCK_FILENAME);
53
+ }
48
54
  /**
49
55
  * Read the registry from disk. Returns empty registry if file
50
56
  * doesn't exist, is corrupted, or fails Zod validation.
@@ -84,25 +90,48 @@ function writeRegistry(registry) {
84
90
  /**
85
91
  * Register a new session in the active-sessions registry.
86
92
  * Idempotent: re-registering the same session_id replaces the entry.
93
+ * Returns session IDs that were displaced (different session_id, same hostname+pid).
87
94
  */
88
95
  export function registerSession(entry) {
89
- const registry = readRegistry();
90
- registry.sessions = registry.sessions.filter((s) => s.session_id !== entry.session_id);
91
- registry.sessions.push(entry);
92
- writeRegistry(registry);
93
- console.error(`[active-sessions] Registered session ${entry.session_id.slice(0, 8)} (agent: ${entry.agent}, pid: ${entry.pid})`);
96
+ const displaced = [];
97
+ withLockSync(getLockPath(), () => {
98
+ const registry = readRegistry();
99
+ // Collect displaced session IDs (same hostname+pid, different session_id)
100
+ for (const s of registry.sessions) {
101
+ if (s.session_id !== entry.session_id && s.hostname === entry.hostname && s.pid === entry.pid) {
102
+ displaced.push(s.session_id);
103
+ }
104
+ }
105
+ // Remove by session_id AND by hostname+pid to prevent duplicates
106
+ registry.sessions = registry.sessions.filter((s) => s.session_id !== entry.session_id &&
107
+ !(s.hostname === entry.hostname && s.pid === entry.pid));
108
+ registry.sessions.push(entry);
109
+ writeRegistry(registry);
110
+ });
111
+ if (displaced.length > 0) {
112
+ console.error(`[active-sessions] Registered session ${entry.session_id.slice(0, 8)} — displaced ${displaced.length} prior session(s): ${displaced.map(id => id.slice(0, 8)).join(", ")}`);
113
+ }
114
+ else {
115
+ console.error(`[active-sessions] Registered session ${entry.session_id.slice(0, 8)} (agent: ${entry.agent}, pid: ${entry.pid})`);
116
+ }
117
+ return displaced;
94
118
  }
95
119
  /**
96
120
  * Unregister a session from the active-sessions registry.
97
121
  * Returns true if the session was found and removed.
98
122
  */
99
123
  export function unregisterSession(sessionId) {
100
- const registry = readRegistry();
101
- const before = registry.sessions.length;
102
- registry.sessions = registry.sessions.filter((s) => s.session_id !== sessionId);
103
- const removed = registry.sessions.length < before;
124
+ const removed = withLockSync(getLockPath(), () => {
125
+ const registry = readRegistry();
126
+ const before = registry.sessions.length;
127
+ registry.sessions = registry.sessions.filter((s) => s.session_id !== sessionId);
128
+ const wasRemoved = registry.sessions.length < before;
129
+ if (wasRemoved) {
130
+ writeRegistry(registry);
131
+ }
132
+ return wasRemoved;
133
+ });
104
134
  if (removed) {
105
- writeRegistry(registry);
106
135
  console.error(`[active-sessions] Unregistered session ${sessionId.slice(0, 8)}`);
107
136
  }
108
137
  else {
@@ -144,52 +173,67 @@ export function findSessionById(sessionId) {
144
173
  * Returns the number of sessions pruned.
145
174
  */
146
175
  export function pruneStale() {
147
- const registry = readRegistry();
148
- const now = Date.now();
149
- const currentHostname = os.hostname();
150
- const before = registry.sessions.length;
151
- const gitmemDir = getGitmemDir();
152
- registry.sessions = registry.sessions.filter((entry) => {
153
- // GIT-22: Check for orphaned registry entry (session file missing)
154
- const sessionFile = path.join(gitmemDir, "sessions", entry.session_id, "session.json");
155
- if (!fs.existsSync(sessionFile)) {
156
- // Only prune if session is old enough that session_start should have written the file.
157
- // Brand-new sessions may not have the file yet (race window during session_start).
176
+ return withLockSync(getLockPath(), () => {
177
+ const registry = readRegistry();
178
+ const now = Date.now();
179
+ const currentHostname = os.hostname();
180
+ const currentPid = process.pid;
181
+ const before = registry.sessions.length;
182
+ const gitmemDir = getGitmemDir();
183
+ let adopted = false;
184
+ registry.sessions = registry.sessions.filter((entry) => {
185
+ // GIT-22: Check for orphaned registry entry (session file missing)
186
+ const sessionFile = path.join(gitmemDir, "sessions", entry.session_id, "session.json");
187
+ if (!fs.existsSync(sessionFile)) {
188
+ // Only prune if session is old enough that session_start should have written the file.
189
+ // Brand-new sessions may not have the file yet (race window during session_start).
190
+ const age = now - new Date(entry.started_at).getTime();
191
+ if (age > 60_000) { // 1 minute grace period
192
+ console.error(`[active-sessions] Pruning orphaned registry entry ${entry.session_id.slice(0, 8)} (session file missing)`);
193
+ cleanupSessionDir(gitmemDir, entry.session_id);
194
+ return false;
195
+ }
196
+ }
197
+ // Check age
158
198
  const age = now - new Date(entry.started_at).getTime();
159
- if (age > 60_000) { // 1 minute grace period
160
- console.error(`[active-sessions] Pruning orphaned registry entry ${entry.session_id.slice(0, 8)} (session file missing)`);
199
+ if (age > STALE_THRESHOLD_MS) {
200
+ console.error(`[active-sessions] Pruning stale session ${entry.session_id.slice(0, 8)} (age: ${Math.round(age / 3600000)}h)`);
161
201
  cleanupSessionDir(gitmemDir, entry.session_id);
162
202
  return false;
163
203
  }
164
- }
165
- // Check age
166
- const age = now - new Date(entry.started_at).getTime();
167
- if (age > STALE_THRESHOLD_MS) {
168
- console.error(`[active-sessions] Pruning stale session ${entry.session_id.slice(0, 8)} (age: ${Math.round(age / 3600000)}h)`);
169
- cleanupSessionDir(gitmemDir, entry.session_id);
170
- return false;
171
- }
172
- // Check if PID is alive (only for sessions on the same host)
173
- if (entry.hostname === currentHostname) {
174
- try {
175
- process.kill(entry.pid, 0); // Signal 0 = check existence only
204
+ // Check if PID is alive (only for sessions on the same host)
205
+ if (entry.hostname === currentHostname) {
206
+ try {
207
+ process.kill(entry.pid, 0); // Signal 0 = check existence only
208
+ }
209
+ catch {
210
+ // PID is dead. If session is recent, adopt it into the current process
211
+ // instead of pruning. This handles MCP server restarts during context
212
+ // compaction where the hostname stays the same but the PID changes.
213
+ if (age < ADOPT_THRESHOLD_MS) {
214
+ console.error(`[active-sessions] Adopting orphaned session ${entry.session_id.slice(0, 8)} (dead pid ${entry.pid} → ${currentPid})`);
215
+ entry.pid = currentPid;
216
+ adopted = true;
217
+ return true; // Keep in registry with updated PID
218
+ }
219
+ console.error(`[active-sessions] Pruning dead session ${entry.session_id.slice(0, 8)} (pid ${entry.pid} no longer running)`);
220
+ cleanupSessionDir(gitmemDir, entry.session_id);
221
+ return false;
222
+ }
176
223
  }
177
- catch {
178
- console.error(`[active-sessions] Pruning dead session ${entry.session_id.slice(0, 8)} (pid ${entry.pid} no longer running)`);
179
- cleanupSessionDir(gitmemDir, entry.session_id);
180
- return false;
224
+ return true;
225
+ });
226
+ const pruned = before - registry.sessions.length;
227
+ if (pruned > 0 || adopted) {
228
+ writeRegistry(registry);
229
+ if (pruned > 0) {
230
+ console.error(`[active-sessions] Pruned ${pruned} stale session(s)`);
181
231
  }
182
232
  }
183
- return true;
233
+ // GIT-22: Clean up orphaned session directories (dir exists but no registry entry)
234
+ pruneOrphanedDirs(gitmemDir, registry);
235
+ return pruned;
184
236
  });
185
- const pruned = before - registry.sessions.length;
186
- if (pruned > 0) {
187
- writeRegistry(registry);
188
- console.error(`[active-sessions] Pruned ${pruned} stale session(s)`);
189
- }
190
- // GIT-22: Clean up orphaned session directories (dir exists but no registry entry)
191
- pruneOrphanedDirs(gitmemDir, registry);
192
- return pruned;
193
237
  }
194
238
  /**
195
239
  * GIT-22: Remove session directories that have no corresponding registry entry.
@@ -260,42 +304,44 @@ export function migrateFromLegacy() {
260
304
  return false;
261
305
  migrationRan = true;
262
306
  try {
263
- const gitmemDir = getGitmemDir();
264
- const oldPath = path.join(gitmemDir, "active-session.json");
265
- const newPath = path.join(gitmemDir, REGISTRY_FILENAME);
266
- // Skip if new registry already exists or old file is absent
267
- if (fs.existsSync(newPath) || !fs.existsSync(oldPath)) {
268
- return false;
269
- }
270
- const raw = fs.readFileSync(oldPath, "utf-8");
271
- const old = JSON.parse(raw);
272
- if (!old.session_id) {
273
- console.warn("[active-sessions] Legacy file has no session_id, skipping migration");
274
- return false;
275
- }
276
- // 1. Create per-session directory with session.json
277
- const sessionFilePath = getSessionPath(old.session_id, "session.json");
278
- fs.writeFileSync(sessionFilePath, JSON.stringify({
279
- ...old,
280
- hostname: old.hostname || os.hostname(),
281
- pid: old.pid || process.pid,
282
- }, null, 2));
283
- // 2. Create registry with single entry
284
- const entry = {
285
- session_id: old.session_id,
286
- agent: old.agent || "CLI",
287
- started_at: old.started_at || new Date().toISOString(),
288
- hostname: old.hostname || os.hostname(),
289
- pid: old.pid || process.pid,
290
- project: old.project || "orchestra_dev",
291
- };
292
- writeRegistry({ sessions: [entry] });
293
- // 3. Rename old file to backup
294
- const backupPath = path.join(gitmemDir, "active-session.json.migrated");
295
- fs.renameSync(oldPath, backupPath);
296
- console.error(`[active-sessions] Migrated legacy active-session.json → ` +
297
- `sessions/${old.session_id.slice(0, 8)}/ + active-sessions.json (backup: active-session.json.migrated)`);
298
- return true;
307
+ return withLockSync(getLockPath(), () => {
308
+ const gitmemDir = getGitmemDir();
309
+ const oldPath = path.join(gitmemDir, "active-session.json");
310
+ const newPath = path.join(gitmemDir, REGISTRY_FILENAME);
311
+ // Skip if new registry already exists or old file is absent
312
+ if (fs.existsSync(newPath) || !fs.existsSync(oldPath)) {
313
+ return false;
314
+ }
315
+ const raw = fs.readFileSync(oldPath, "utf-8");
316
+ const old = JSON.parse(raw);
317
+ if (!old.session_id) {
318
+ console.warn("[active-sessions] Legacy file has no session_id, skipping migration");
319
+ return false;
320
+ }
321
+ // 1. Create per-session directory with session.json
322
+ const sessionFilePath = getSessionPath(old.session_id, "session.json");
323
+ fs.writeFileSync(sessionFilePath, JSON.stringify({
324
+ ...old,
325
+ hostname: old.hostname || os.hostname(),
326
+ pid: old.pid || process.pid,
327
+ }, null, 2));
328
+ // 2. Create registry with single entry
329
+ const entry = {
330
+ session_id: old.session_id,
331
+ agent: old.agent || "CLI",
332
+ started_at: old.started_at || new Date().toISOString(),
333
+ hostname: old.hostname || os.hostname(),
334
+ pid: old.pid || process.pid,
335
+ project: old.project || "default",
336
+ };
337
+ writeRegistry({ sessions: [entry] });
338
+ // 3. Rename old file to backup
339
+ const backupPath = path.join(gitmemDir, "active-session.json.migrated");
340
+ fs.renameSync(oldPath, backupPath);
341
+ console.error(`[active-sessions] Migrated legacy active-session.json` +
342
+ `sessions/${old.session_id.slice(0, 8)}/ + active-sessions.json (backup: active-session.json.migrated)`);
343
+ return true;
344
+ });
299
345
  }
300
346
  catch (error) {
301
347
  console.warn("[active-sessions] Legacy migration failed (non-fatal):", error);