gitmem-mcp 1.0.2 → 1.0.4

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 (299) hide show
  1. package/CHANGELOG.md +20 -6
  2. package/README.md +30 -9
  3. package/dist/commands/check.d.ts +1 -1
  4. package/dist/commands/check.js +4 -3
  5. package/dist/diagnostics/anonymizer.d.ts +1 -1
  6. package/dist/diagnostics/anonymizer.js +1 -1
  7. package/dist/diagnostics/channels.d.ts +1 -1
  8. package/dist/diagnostics/channels.js +1 -1
  9. package/dist/diagnostics/collector.d.ts +1 -1
  10. package/dist/diagnostics/collector.js +1 -1
  11. package/dist/diagnostics/index.d.ts +1 -1
  12. package/dist/diagnostics/index.js +1 -1
  13. package/dist/hooks/quick-retrieve.js +2 -1
  14. package/dist/index.js +0 -0
  15. package/dist/schemas/active-sessions.d.ts +9 -9
  16. package/dist/schemas/active-sessions.js +1 -1
  17. package/dist/schemas/common.d.ts +2 -5
  18. package/dist/schemas/common.js +13 -7
  19. package/dist/schemas/create-learning.d.ts +4 -4
  20. package/dist/schemas/create-learning.js +1 -1
  21. package/dist/schemas/session-close.d.ts +5 -8
  22. package/dist/schemas/session-close.js +7 -3
  23. package/dist/schemas/session-start.d.ts +4 -4
  24. package/dist/schemas/session-start.js +1 -1
  25. package/dist/schemas/thread.d.ts +1 -1
  26. package/dist/schemas/thread.js +1 -1
  27. package/dist/server.d.ts +2 -2
  28. package/dist/server.js +21 -10
  29. package/dist/services/active-sessions.js +3 -2
  30. package/dist/services/agent-briefing.d.ts +12 -0
  31. package/dist/services/agent-briefing.js +81 -0
  32. package/dist/services/agent-detection.d.ts +2 -1
  33. package/dist/services/agent-detection.js +23 -14
  34. package/dist/services/analytics.d.ts +1 -1
  35. package/dist/services/analytics.js +3 -3
  36. package/dist/services/behavioral-decay.js +2 -2
  37. package/dist/services/cache.d.ts +1 -1
  38. package/dist/services/cache.js +1 -1
  39. package/dist/services/compliance-validator.d.ts +1 -1
  40. package/dist/services/compliance-validator.js +5 -5
  41. package/dist/services/config.d.ts +1 -1
  42. package/dist/services/config.js +1 -1
  43. package/dist/services/file-lock.js +12 -0
  44. package/dist/services/gitmem-dir.d.ts +17 -4
  45. package/dist/services/gitmem-dir.js +43 -9
  46. package/dist/services/local-file-storage.d.ts +1 -1
  47. package/dist/services/local-file-storage.js +16 -10
  48. package/dist/services/local-vector-search.d.ts +1 -1
  49. package/dist/services/local-vector-search.js +2 -2
  50. package/dist/services/metrics.d.ts +6 -6
  51. package/dist/services/metrics.js +8 -8
  52. package/dist/services/session-state.d.ts +7 -7
  53. package/dist/services/session-state.js +19 -7
  54. package/dist/services/startup.d.ts +1 -1
  55. package/dist/services/startup.js +3 -2
  56. package/dist/services/supabase-client.d.ts +17 -6
  57. package/dist/services/supabase-client.js +44 -8
  58. package/dist/services/thread-manager.d.ts +1 -1
  59. package/dist/services/thread-manager.js +5 -5
  60. package/dist/services/thread-supabase.d.ts +1 -1
  61. package/dist/services/thread-supabase.js +2 -2
  62. package/dist/services/tier.d.ts +2 -0
  63. package/dist/services/tier.js +4 -0
  64. package/dist/services/transcript-chunker.d.ts +1 -1
  65. package/dist/services/transcript-chunker.js +1 -1
  66. package/dist/services/triple-writer.d.ts +4 -4
  67. package/dist/services/triple-writer.js +11 -20
  68. package/dist/services/variant-assignment.d.ts +6 -6
  69. package/dist/services/variant-assignment.js +9 -8
  70. package/dist/tools/analyze.d.ts +2 -2
  71. package/dist/tools/analyze.js +2 -2
  72. package/dist/tools/archive-learning.js +36 -22
  73. package/dist/tools/confirm-scars.js +4 -0
  74. package/dist/tools/create-decision.d.ts +1 -1
  75. package/dist/tools/create-decision.js +2 -2
  76. package/dist/tools/create-learning.d.ts +1 -1
  77. package/dist/tools/create-learning.js +4 -4
  78. package/dist/tools/create-linear-issue.d.ts +18 -0
  79. package/dist/tools/create-linear-issue.js +197 -0
  80. package/dist/tools/create-thread.d.ts +1 -1
  81. package/dist/tools/create-thread.js +2 -2
  82. package/dist/tools/definitions.d.ts +280 -58
  83. package/dist/tools/definitions.js +127 -87
  84. package/dist/tools/get-transcript.d.ts +1 -1
  85. package/dist/tools/get-transcript.js +1 -1
  86. package/dist/tools/graph-traverse.d.ts +1 -1
  87. package/dist/tools/graph-traverse.js +20 -17
  88. package/dist/tools/list-threads.d.ts +2 -2
  89. package/dist/tools/list-threads.js +4 -4
  90. package/dist/tools/log.d.ts +1 -1
  91. package/dist/tools/log.js +1 -1
  92. package/dist/tools/prepare-context.d.ts +1 -1
  93. package/dist/tools/prepare-context.js +2 -2
  94. package/dist/tools/recall.d.ts +5 -4
  95. package/dist/tools/recall.js +37 -28
  96. package/dist/tools/record-scar-usage-batch.js +2 -2
  97. package/dist/tools/record-scar-usage.d.ts +1 -1
  98. package/dist/tools/record-scar-usage.js +3 -3
  99. package/dist/tools/resolve-thread.d.ts +2 -2
  100. package/dist/tools/resolve-thread.js +3 -3
  101. package/dist/tools/save-transcript.d.ts +1 -1
  102. package/dist/tools/save-transcript.js +1 -1
  103. package/dist/tools/search.d.ts +1 -1
  104. package/dist/tools/search.js +1 -1
  105. package/dist/tools/session-close.d.ts +1 -1
  106. package/dist/tools/session-close.js +58 -57
  107. package/dist/tools/session-start.d.ts +5 -5
  108. package/dist/tools/session-start.js +63 -61
  109. package/dist/types/index.d.ts +17 -13
  110. package/hooks/.claude-plugin/plugin.json +1 -1
  111. package/hooks/scripts/post-tool-use.sh +1 -1
  112. package/hooks/scripts/recall-check.sh +1 -1
  113. package/hooks/scripts/session-close-check.sh +1 -1
  114. package/hooks/scripts/session-start.sh +1 -1
  115. package/package.json +6 -3
  116. package/schema/starter-scars.json +3 -153
  117. package/dist/commands/check.d.ts.map +0 -1
  118. package/dist/commands/check.js.map +0 -1
  119. package/dist/constants/closing-questions.d.ts.map +0 -1
  120. package/dist/constants/closing-questions.js.map +0 -1
  121. package/dist/diagnostics/anonymizer.d.ts.map +0 -1
  122. package/dist/diagnostics/anonymizer.js.map +0 -1
  123. package/dist/diagnostics/channels.d.ts.map +0 -1
  124. package/dist/diagnostics/channels.js.map +0 -1
  125. package/dist/diagnostics/collector.d.ts.map +0 -1
  126. package/dist/diagnostics/collector.js.map +0 -1
  127. package/dist/diagnostics/index.d.ts.map +0 -1
  128. package/dist/diagnostics/index.js.map +0 -1
  129. package/dist/hooks/format-utils.d.ts.map +0 -1
  130. package/dist/hooks/format-utils.js.map +0 -1
  131. package/dist/hooks/quick-retrieve.d.ts.map +0 -1
  132. package/dist/hooks/quick-retrieve.js.map +0 -1
  133. package/dist/index.d.ts.map +0 -1
  134. package/dist/index.js.map +0 -1
  135. package/dist/schemas/absorb-observations.d.ts.map +0 -1
  136. package/dist/schemas/absorb-observations.js.map +0 -1
  137. package/dist/schemas/active-sessions.d.ts.map +0 -1
  138. package/dist/schemas/active-sessions.js.map +0 -1
  139. package/dist/schemas/analyze.d.ts.map +0 -1
  140. package/dist/schemas/analyze.js.map +0 -1
  141. package/dist/schemas/common.d.ts.map +0 -1
  142. package/dist/schemas/common.js.map +0 -1
  143. package/dist/schemas/create-decision.d.ts.map +0 -1
  144. package/dist/schemas/create-decision.js.map +0 -1
  145. package/dist/schemas/create-learning.d.ts.map +0 -1
  146. package/dist/schemas/create-learning.js.map +0 -1
  147. package/dist/schemas/get-transcript.d.ts.map +0 -1
  148. package/dist/schemas/get-transcript.js.map +0 -1
  149. package/dist/schemas/index.d.ts.map +0 -1
  150. package/dist/schemas/index.js.map +0 -1
  151. package/dist/schemas/log.d.ts.map +0 -1
  152. package/dist/schemas/log.js.map +0 -1
  153. package/dist/schemas/prepare-context.d.ts.map +0 -1
  154. package/dist/schemas/prepare-context.js.map +0 -1
  155. package/dist/schemas/recall.d.ts.map +0 -1
  156. package/dist/schemas/recall.js.map +0 -1
  157. package/dist/schemas/record-scar-usage-batch.d.ts.map +0 -1
  158. package/dist/schemas/record-scar-usage-batch.js.map +0 -1
  159. package/dist/schemas/record-scar-usage.d.ts.map +0 -1
  160. package/dist/schemas/record-scar-usage.js.map +0 -1
  161. package/dist/schemas/registry.d.ts.map +0 -1
  162. package/dist/schemas/registry.js.map +0 -1
  163. package/dist/schemas/save-transcript.d.ts.map +0 -1
  164. package/dist/schemas/save-transcript.js.map +0 -1
  165. package/dist/schemas/search-transcripts.d.ts.map +0 -1
  166. package/dist/schemas/search-transcripts.js.map +0 -1
  167. package/dist/schemas/search.d.ts.map +0 -1
  168. package/dist/schemas/search.js.map +0 -1
  169. package/dist/schemas/session-close.d.ts.map +0 -1
  170. package/dist/schemas/session-close.js.map +0 -1
  171. package/dist/schemas/session-start.d.ts.map +0 -1
  172. package/dist/schemas/session-start.js.map +0 -1
  173. package/dist/schemas/thread.d.ts.map +0 -1
  174. package/dist/schemas/thread.js.map +0 -1
  175. package/dist/server.d.ts.map +0 -1
  176. package/dist/server.js.map +0 -1
  177. package/dist/services/active-sessions.d.ts.map +0 -1
  178. package/dist/services/active-sessions.js.map +0 -1
  179. package/dist/services/agent-detection.d.ts.map +0 -1
  180. package/dist/services/agent-detection.js.map +0 -1
  181. package/dist/services/analytics.d.ts.map +0 -1
  182. package/dist/services/analytics.js.map +0 -1
  183. package/dist/services/behavioral-decay.d.ts.map +0 -1
  184. package/dist/services/behavioral-decay.js.map +0 -1
  185. package/dist/services/bm25.d.ts.map +0 -1
  186. package/dist/services/bm25.js.map +0 -1
  187. package/dist/services/cache.d.ts.map +0 -1
  188. package/dist/services/cache.js.map +0 -1
  189. package/dist/services/cache.test.d.ts +0 -8
  190. package/dist/services/cache.test.d.ts.map +0 -1
  191. package/dist/services/cache.test.js +0 -267
  192. package/dist/services/cache.test.js.map +0 -1
  193. package/dist/services/compliance-validator.d.ts.map +0 -1
  194. package/dist/services/compliance-validator.js.map +0 -1
  195. package/dist/services/config.d.ts.map +0 -1
  196. package/dist/services/config.js.map +0 -1
  197. package/dist/services/display-protocol.d.ts.map +0 -1
  198. package/dist/services/display-protocol.js.map +0 -1
  199. package/dist/services/effect-tracker.d.ts.map +0 -1
  200. package/dist/services/effect-tracker.js.map +0 -1
  201. package/dist/services/embedding.d.ts.map +0 -1
  202. package/dist/services/embedding.js.map +0 -1
  203. package/dist/services/file-lock.d.ts.map +0 -1
  204. package/dist/services/file-lock.js.map +0 -1
  205. package/dist/services/gitmem-dir.d.ts.map +0 -1
  206. package/dist/services/gitmem-dir.js.map +0 -1
  207. package/dist/services/local-file-storage.d.ts.map +0 -1
  208. package/dist/services/local-file-storage.js.map +0 -1
  209. package/dist/services/local-vector-search.d.ts.map +0 -1
  210. package/dist/services/local-vector-search.js.map +0 -1
  211. package/dist/services/metrics.d.ts.map +0 -1
  212. package/dist/services/metrics.js.map +0 -1
  213. package/dist/services/session-state.d.ts.map +0 -1
  214. package/dist/services/session-state.js.map +0 -1
  215. package/dist/services/startup.d.ts.map +0 -1
  216. package/dist/services/startup.js.map +0 -1
  217. package/dist/services/storage.d.ts.map +0 -1
  218. package/dist/services/storage.js.map +0 -1
  219. package/dist/services/supabase-client.d.ts.map +0 -1
  220. package/dist/services/supabase-client.js.map +0 -1
  221. package/dist/services/thread-dedup.d.ts.map +0 -1
  222. package/dist/services/thread-dedup.js.map +0 -1
  223. package/dist/services/thread-manager.d.ts.map +0 -1
  224. package/dist/services/thread-manager.js.map +0 -1
  225. package/dist/services/thread-suggestions.d.ts.map +0 -1
  226. package/dist/services/thread-suggestions.js.map +0 -1
  227. package/dist/services/thread-supabase.d.ts.map +0 -1
  228. package/dist/services/thread-supabase.js.map +0 -1
  229. package/dist/services/thread-vitality.d.ts.map +0 -1
  230. package/dist/services/thread-vitality.js.map +0 -1
  231. package/dist/services/tier.d.ts.map +0 -1
  232. package/dist/services/tier.js.map +0 -1
  233. package/dist/services/timezone.d.ts.map +0 -1
  234. package/dist/services/timezone.js.map +0 -1
  235. package/dist/services/transcript-chunker.d.ts.map +0 -1
  236. package/dist/services/transcript-chunker.js.map +0 -1
  237. package/dist/services/triple-writer.d.ts.map +0 -1
  238. package/dist/services/triple-writer.js.map +0 -1
  239. package/dist/services/variant-assignment.d.ts.map +0 -1
  240. package/dist/services/variant-assignment.js.map +0 -1
  241. package/dist/services/variant-generation.d.ts.map +0 -1
  242. package/dist/services/variant-generation.js.map +0 -1
  243. package/dist/tools/absorb-observations.d.ts.map +0 -1
  244. package/dist/tools/absorb-observations.js.map +0 -1
  245. package/dist/tools/analyze.d.ts.map +0 -1
  246. package/dist/tools/analyze.js.map +0 -1
  247. package/dist/tools/archive-learning.d.ts.map +0 -1
  248. package/dist/tools/archive-learning.js.map +0 -1
  249. package/dist/tools/cleanup-threads.d.ts.map +0 -1
  250. package/dist/tools/cleanup-threads.js.map +0 -1
  251. package/dist/tools/confirm-scars.d.ts.map +0 -1
  252. package/dist/tools/confirm-scars.js.map +0 -1
  253. package/dist/tools/create-decision.d.ts.map +0 -1
  254. package/dist/tools/create-decision.js.map +0 -1
  255. package/dist/tools/create-learning.d.ts.map +0 -1
  256. package/dist/tools/create-learning.js.map +0 -1
  257. package/dist/tools/create-thread.d.ts.map +0 -1
  258. package/dist/tools/create-thread.js.map +0 -1
  259. package/dist/tools/definitions.d.ts.map +0 -1
  260. package/dist/tools/definitions.js.map +0 -1
  261. package/dist/tools/dismiss-suggestion.d.ts.map +0 -1
  262. package/dist/tools/dismiss-suggestion.js.map +0 -1
  263. package/dist/tools/get-transcript.d.ts.map +0 -1
  264. package/dist/tools/get-transcript.js.map +0 -1
  265. package/dist/tools/graph-traverse.d.ts.map +0 -1
  266. package/dist/tools/graph-traverse.js.map +0 -1
  267. package/dist/tools/list-threads.d.ts.map +0 -1
  268. package/dist/tools/list-threads.js.map +0 -1
  269. package/dist/tools/log.d.ts.map +0 -1
  270. package/dist/tools/log.js.map +0 -1
  271. package/dist/tools/prepare-context.d.ts.map +0 -1
  272. package/dist/tools/prepare-context.js.map +0 -1
  273. package/dist/tools/promote-suggestion.d.ts.map +0 -1
  274. package/dist/tools/promote-suggestion.js.map +0 -1
  275. package/dist/tools/recall.d.ts.map +0 -1
  276. package/dist/tools/recall.js.map +0 -1
  277. package/dist/tools/recall.test.d.ts +0 -5
  278. package/dist/tools/recall.test.d.ts.map +0 -1
  279. package/dist/tools/recall.test.js +0 -155
  280. package/dist/tools/recall.test.js.map +0 -1
  281. package/dist/tools/record-scar-usage-batch.d.ts.map +0 -1
  282. package/dist/tools/record-scar-usage-batch.js.map +0 -1
  283. package/dist/tools/record-scar-usage.d.ts.map +0 -1
  284. package/dist/tools/record-scar-usage.js.map +0 -1
  285. package/dist/tools/resolve-thread.d.ts.map +0 -1
  286. package/dist/tools/resolve-thread.js.map +0 -1
  287. package/dist/tools/save-transcript.d.ts.map +0 -1
  288. package/dist/tools/save-transcript.js.map +0 -1
  289. package/dist/tools/search-transcripts.d.ts.map +0 -1
  290. package/dist/tools/search-transcripts.js.map +0 -1
  291. package/dist/tools/search.d.ts.map +0 -1
  292. package/dist/tools/search.js.map +0 -1
  293. package/dist/tools/session-close.d.ts.map +0 -1
  294. package/dist/tools/session-close.js.map +0 -1
  295. package/dist/tools/session-start.d.ts.map +0 -1
  296. package/dist/tools/session-start.js.map +0 -1
  297. package/dist/types/index.d.ts.map +0 -1
  298. package/dist/types/index.js.map +0 -1
  299. package/hooks/tests/test-hooks.sh +0 -577
@@ -4,27 +4,26 @@
4
4
  * Initialize session, detect agent, load institutional context.
5
5
  * Returns threads and recent decisions. Scars surface via recall on demand.
6
6
  *
7
- * Performance target: <750ms (OD-645: Lean Start)
7
+ * Performance target: <750ms
8
8
  *
9
- * OD-645: Removed scar/wins queries from start pipeline.
9
+ * Removed scar/wins queries from start pipeline.
10
10
  * Scars load on-demand via recall(). Wins available via search/log.
11
11
  * loadLastSession and loadRecentDecisions run in parallel.
12
12
  * createSessionRecord is fire-and-forget.
13
13
  */
14
14
  import * as fs from "fs";
15
- import * as path from "path";
16
15
  import { v4 as uuidv4 } from "uuid";
17
16
  import { detectAgent } from "../services/agent-detection.js";
18
17
  import * as supabase from "../services/supabase-client.js";
19
- // OD-645: Scar search removed from start pipeline (loads on-demand via recall)
18
+ // Scar search removed from start pipeline (loads on-demand via recall)
20
19
  import { ensureInitialized } from "../services/startup.js";
21
20
  import { hasSupabase } from "../services/tier.js";
22
21
  import { getStorage } from "../services/storage.js";
23
22
  import { Timer, recordMetrics, calculateContextBytes, buildPerformanceData, buildComponentPerformance, } from "../services/metrics.js";
24
- import { setCurrentSession, getCurrentSession, addSurfacedScars, getSurfacedScars } from "../services/session-state.js"; // OD-547, OD-552
25
- import { aggregateThreads, saveThreadsFile, loadThreadsFile, mergeThreadStates } from "../services/thread-manager.js"; // OD-thread-lifecycle
26
- import { deduplicateThreadList } from "../services/thread-dedup.js"; // OD-641
27
- import { loadActiveThreadsFromSupabase, archiveDormantThreads } from "../services/thread-supabase.js"; // OD-623, Phase 6
23
+ import { setCurrentSession, getCurrentSession, addSurfacedScars, getSurfacedScars } from "../services/session-state.js";
24
+ import { aggregateThreads, saveThreadsFile, loadThreadsFile, mergeThreadStates } from "../services/thread-manager.js"; //
25
+ import { deduplicateThreadList } from "../services/thread-dedup.js";
26
+ import { loadActiveThreadsFromSupabase, archiveDormantThreads } from "../services/thread-supabase.js";
28
27
  import { setGitmemDir, getGitmemDir, getSessionPath, getConfigProject } from "../services/gitmem-dir.js";
29
28
  import { registerSession, findSessionByHostPid, pruneStale, migrateFromLegacy } from "../services/active-sessions.js";
30
29
  import * as os from "os";
@@ -37,19 +36,19 @@ import { formatDate } from "../services/timezone.js";
37
36
  function normalizeDecisions(decisions) {
38
37
  return decisions.map((d) => typeof d === "string" ? d : d.title);
39
38
  }
40
- // OD-645: WinRecord removed (wins available via search/log)
39
+ // WinRecord removed (wins available via search/log)
41
40
  /**
42
41
  * Aggregate open threads across multiple recent sessions.
43
42
  * Deduplicates by exact lowercase match. Excludes PROJECT STATE: threads
44
43
  * (handled separately). Only includes sessions from the last maxAgeDays.
45
44
  */
46
- // aggregateOpenThreads replaced by aggregateThreads from thread-manager.ts (OD-thread-lifecycle)
45
+ // aggregateOpenThreads replaced by aggregateThreads from thread-manager.ts ()
47
46
  /**
48
47
  * Load the last CLOSED session for this agent.
49
48
  * Filters out orphaned sessions (those without close_compliance).
50
- * Uses _lite view for performance (OD-460 added arrays to view).
49
+ * Uses _lite view for performance.
51
50
  *
52
- * OD-489: Returns timing and network call info for instrumentation.
51
+ * Returns timing and network call info for instrumentation.
53
52
  */
54
53
  async function loadLastSession(agent, project) {
55
54
  const timer = new Timer();
@@ -67,14 +66,14 @@ async function loadLastSession(agent, project) {
67
66
  }
68
67
  try {
69
68
  // Use _lite view for performance (excludes embedding)
70
- // OD-460: View now includes decisions/open_threads arrays
69
+ // View now includes decisions/open_threads arrays
71
70
  const sessions = await supabase.listRecords({
72
71
  table: "orchestra_sessions_lite",
73
72
  filters: { agent, project },
74
73
  limit: 10, // Get several to find a closed one + aggregate threads
75
74
  orderBy: { column: "created_at", ascending: false },
76
75
  });
77
- // OD-623: Try loading threads from Supabase (source of truth) first
76
+ // Try loading threads from Supabase (source of truth) first
78
77
  let aggregated_open_threads;
79
78
  let displayInfo = [];
80
79
  let threadsFromSupabase = false;
@@ -86,7 +85,7 @@ async function loadLastSession(agent, project) {
86
85
  threadsFromSupabase = true;
87
86
  console.error(`[session_start] Loaded ${aggregated_open_threads.length} open threads from Supabase`);
88
87
  // Phase 6: Auto-archive dormant threads (fire-and-forget)
89
- archiveDormantThreads(project).catch(() => { });
88
+ archiveDormantThreads(project).catch((err) => console.error("[session_start] archiveDormantThreads failed:", err instanceof Error ? err.message : err));
90
89
  }
91
90
  else {
92
91
  // Fallback: aggregate from session records (original behavior)
@@ -139,9 +138,9 @@ async function loadLastSession(agent, project) {
139
138
  return { session: null, aggregated_open_threads: [], displayInfo: [], latency_ms: timer.stop(), network_call: true, threadsFromSupabase: false };
140
139
  }
141
140
  }
142
- // OD-645: queryRelevantScars removed — scars load on-demand via recall()
141
+ // queryRelevantScars removed — scars load on-demand via recall()
143
142
  /**
144
- * OD-666: Load recent rapport summaries across all agents for this project.
143
+ * Load recent rapport summaries across all agents for this project.
145
144
  * Returns up to 3 most recent sessions that have a non-null rapport_summary.
146
145
  * Cross-agent by design: CLI session rapport visible to DAC's next session.
147
146
  */
@@ -171,14 +170,14 @@ async function loadRecentRapport(project) {
171
170
  }
172
171
  }
173
172
  /**
174
- * Load recent decisions with caching (OD-473)
173
+ * Load recent decisions with caching
175
174
  *
176
- * OD-489: Returns timing and network call info for instrumentation.
175
+ * Returns timing and network call info for instrumentation.
177
176
  */
178
177
  async function loadRecentDecisions(project, limit = 5) {
179
178
  const timer = new Timer();
180
179
  try {
181
- // Use cached decisions query (OD-473)
180
+ // Use cached decisions query
182
181
  // Fetch extra to account for date filtering
183
182
  const { data: decisions, cache_hit, cache_age_ms } = await supabase.cachedListDecisions(project, limit + 5);
184
183
  // Filter by project in memory if needed (ww-mcp filters may not work with views)
@@ -216,13 +215,13 @@ async function loadRecentDecisions(project, limit = 5) {
216
215
  };
217
216
  }
218
217
  }
219
- // OD-645: loadRecentWins removed — wins available via search/log on-demand
218
+ // loadRecentWins removed — wins available via search/log on-demand
220
219
  /**
221
220
  * Create a new session record
222
221
  *
223
- * OD-489: Returns timing and network call info for instrumentation.
222
+ * Returns timing and network call info for instrumentation.
224
223
  */
225
- async function createSessionRecord(agent, project, linearIssue, preGeneratedId // OD-645: Accept pre-generated UUID for fire-and-forget pattern
224
+ async function createSessionRecord(agent, project, linearIssue, preGeneratedId // Accept pre-generated UUID for fire-and-forget pattern
226
225
  ) {
227
226
  const sessionId = preGeneratedId || uuidv4();
228
227
  const today = new Date().toISOString().split("T")[0];
@@ -232,7 +231,7 @@ async function createSessionRecord(agent, project, linearIssue, preGeneratedId /
232
231
  return { session_id: sessionId, latency_ms: timer.stop(), network_call: false };
233
232
  }
234
233
  try {
235
- // OD-cast: Capture asciinema recording path from Docker entrypoint
234
+ // Capture asciinema recording path from Docker entrypoint
236
235
  const recordingPath = process.env.GITMEM_RECORDING_PATH || null;
237
236
  await supabase.directUpsert("orchestra_sessions", {
238
237
  id: sessionId,
@@ -308,7 +307,7 @@ async function sessionStartFree(params, env, agent, project, timer, metricsId, e
308
307
  order: "session_date.desc",
309
308
  limit: 10,
310
309
  });
311
- // Aggregate threads across recent sessions (OD-thread-lifecycle)
310
+ // Aggregate threads across recent sessions ()
312
311
  const freeThreadResult = aggregateThreads(sessions);
313
312
  freeAggregatedThreads = freeThreadResult.open;
314
313
  const closedSession = sessions.find((s) => s.close_compliance != null) || sessions[0];
@@ -325,7 +324,7 @@ async function sessionStartFree(params, env, agent, project, timer, metricsId, e
325
324
  catch (error) {
326
325
  console.error("[session_start] Failed to load last session:", error);
327
326
  }
328
- // OD-645: Scars removed from start pipeline — load on-demand via recall
327
+ // Scars removed from start pipeline — load on-demand via recall
329
328
  // Load recent decisions from local storage (time-scoped to 5 days)
330
329
  let decisions = [];
331
330
  try {
@@ -349,7 +348,7 @@ async function sessionStartFree(params, env, agent, project, timer, metricsId, e
349
348
  catch (error) {
350
349
  console.error("[session_start] Failed to load decisions:", error);
351
350
  }
352
- // OD-645: Wins removed from start pipeline — available via search/log
351
+ // Wins removed from start pipeline — available via search/log
353
352
  // Create session record locally (skip if resuming existing session)
354
353
  if (!isResuming) {
355
354
  try {
@@ -378,9 +377,9 @@ async function sessionStartFree(params, env, agent, project, timer, metricsId, e
378
377
  ?.map((t) => typeof t === "string" ? t : t.text)
379
378
  .find((t) => t.startsWith("PROJECT STATE:"))
380
379
  ?.replace(/^PROJECT STATE:\s*/, "");
381
- // OD-645: Simplified performance data (no scars/wins)
380
+ // Simplified performance data (no scars/wins)
382
381
  const performance = buildPerformanceData("session_start", latencyMs, decisions.length + (lastSession ? 1 : 0));
383
- // OD-645: surfacedScars initialized empty — populated by recall during session
382
+ // surfacedScars initialized empty — populated by recall during session
384
383
  const surfacedScars = [];
385
384
  // GIT-20: Persist to per-session dir, legacy file, and registry
386
385
  // writeSessionFiles merges with existing file threads to preserve mid-session creations
@@ -403,7 +402,7 @@ async function sessionStartFree(params, env, agent, project, timer, metricsId, e
403
402
  children: forceCarryActivity?.children,
404
403
  threads: freeMergedThreads,
405
404
  });
406
- // OD-645: No scars/wins in start result
405
+ // No scars/wins in start result
407
406
  const freeResult = {
408
407
  session_id: sessionId,
409
408
  agent,
@@ -421,11 +420,14 @@ async function sessionStartFree(params, env, agent, project, timer, metricsId, e
421
420
  // Write display to per-session dir
422
421
  try {
423
422
  const sessionFilePath = getSessionPath(sessionId, "session.json");
424
- const sessionData = JSON.parse(fs.readFileSync(sessionFilePath, "utf-8"));
423
+ const raw = fs.readFileSync(sessionFilePath, "utf-8");
424
+ const sessionData = JSON.parse(raw);
425
425
  sessionData.display = freeResult.display;
426
426
  fs.writeFileSync(sessionFilePath, JSON.stringify(sessionData, null, 2));
427
427
  }
428
- catch { /* non-critical */ }
428
+ catch (err) {
429
+ console.error("[session_start] Failed to write display to session file:", err instanceof Error ? err.message : err);
430
+ }
429
431
  return freeResult;
430
432
  }
431
433
  /**
@@ -465,7 +467,7 @@ function restoreSessionState(existing, fallbackAgent) {
465
467
  };
466
468
  }
467
469
  /**
468
- * GIT-20 / OD-558: Check for existing active session and return it if found.
470
+ * Check for existing active session and return it if found.
469
471
  *
470
472
  * Uses the active-sessions registry (hostname+PID) to identify THIS process's
471
473
  * session, preventing cross-process session theft on shared filesystems.
@@ -506,7 +508,7 @@ function checkExistingSession(agent, force) {
506
508
  * Consolidates write logic used by session_start (main + free) and session_refresh.
507
509
  */
508
510
  function writeSessionFiles(sessionId, agent, project, surfacedScars, threads, recordingPath, isRefresh, supabaseAuthoritative, startedAt) {
509
- const gitmemDir = path.join(process.cwd(), ".gitmem");
511
+ const gitmemDir = getGitmemDir();
510
512
  if (!fs.existsSync(gitmemDir)) {
511
513
  fs.mkdirSync(gitmemDir, { recursive: true });
512
514
  }
@@ -671,10 +673,10 @@ function formatStartDisplay(result, displayInfoMap) {
671
673
  /**
672
674
  * Execute session_start tool
673
675
  *
674
- * OD-489: Returns detailed performance breakdown for test harness validation.
676
+ * Returns detailed performance breakdown for test harness validation.
675
677
  * Key metrics: network_calls_made, fully_local, breakdown per component.
676
678
  *
677
- * OD-558: Guards against overwriting existing active sessions.
679
+ * Guards against overwriting existing active sessions.
678
680
  * Returns existing session if active-session.json exists (idempotent).
679
681
  * Pass force=true to override.
680
682
  */
@@ -685,7 +687,7 @@ export async function sessionStart(params) {
685
687
  const env = detectAgent();
686
688
  const agent = params.agent_identity || env.agent;
687
689
  const project = params.project || getConfigProject() || "default";
688
- // OD-558: Check for existing active session — reuse session_id but still load full context
690
+ // Check for existing active session — reuse session_id but still load full context
689
691
  const existingSession = checkExistingSession(agent, params.force);
690
692
  const isResuming = existingSession !== null;
691
693
  // t-f7c2fa01: When force:true kills an existing session, carry forward its startedAt
@@ -700,18 +702,18 @@ export async function sessionStart(params) {
700
702
  if (!hasSupabase()) {
701
703
  return sessionStartFree(params, env, agent, project, timer, metricsId, existingSession?.sessionId, existingSession?.startedAt || forceCarryStartedAt, priorSession ? { surfacedScars: forceCarrySurfacedScars, observations: forceCarryObservations, children: forceCarryChildren } : undefined);
702
704
  }
703
- // 2. OD-645: Load last session + decisions in parallel (was sequential)
705
+ // 2. Load last session + decisions in parallel (was sequential)
704
706
  // Scars and wins removed from pipeline — load on-demand via recall/search
705
- // OD-666: Rapport loading disabled — recording kept in session_close but not injected
707
+ // Rapport loading disabled — recording kept in session_close but not injected
706
708
  const [lastSessionResult, decisionsResult] = await Promise.all([
707
709
  loadLastSession(agent, project),
708
710
  loadRecentDecisions(project, 3),
709
711
  ]);
710
712
  const lastSession = lastSessionResult.session;
711
713
  const decisions = decisionsResult.decisions;
712
- // OD-645: surfacedScars initialized empty — populated by recall/confirm_scars during session
714
+ // surfacedScars initialized empty — populated by recall/confirm_scars during session
713
715
  const surfacedScars = [];
714
- // 3. Create session record — fire-and-forget (OD-645)
716
+ // 3. Create session record — fire-and-forget
715
717
  // UUID generated locally, Supabase write runs in background
716
718
  let sessionId;
717
719
  if (isResuming) {
@@ -742,12 +744,12 @@ export async function sessionStart(params) {
742
744
  });
743
745
  }).catch(() => { });
744
746
  const latencyMs = timer.stop();
745
- // OD-534: Extract PROJECT STATE from last session if present
747
+ // Extract PROJECT STATE from last session if present
746
748
  const projectState = lastSession?.open_threads
747
749
  ?.map((t) => typeof t === "string" ? t : t.text)
748
750
  .find(t => t.startsWith("PROJECT STATE:"))
749
751
  ?.replace(/^PROJECT STATE:\s*/, "");
750
- // OD-645: Simplified performance breakdown (no scar_search, wins, session_create)
752
+ // Simplified performance breakdown (no scar_search, wins, session_create)
751
753
  const breakdown = {
752
754
  last_session: buildComponentPerformance(lastSessionResult.latency_ms, "supabase", lastSessionResult.network_call, lastSessionResult.network_call ? "miss" : "hit"),
753
755
  decisions: buildComponentPerformance(decisionsResult.latency_ms, decisionsResult.cache_hit ? "local_cache" : "supabase", decisionsResult.network_call, decisionsResult.cache_hit ? "hit" : "miss"),
@@ -770,9 +772,9 @@ export async function sessionStart(params) {
770
772
  catch (error) {
771
773
  console.warn("[session_start] Failed to persist session files:", error);
772
774
  }
773
- // OD-547: Set active session for variant assignment in recall
774
- // OD-552: Initialize with surfaced scars for auto-bridge at close time
775
- // OD-thread-lifecycle: Initialize with merged threads (aggregated + mid-session preserved)
775
+ // Set active session for variant assignment in recall
776
+ // Initialize with surfaced scars for auto-bridge at close time
777
+ // : Initialize with merged threads (aggregated + mid-session preserved)
776
778
  // t-f7c2fa01: On resume OR force, preserve original startedAt so session_close duration is accurate
777
779
  const mergedScars = [...forceCarrySurfacedScars, ...surfacedScars];
778
780
  setCurrentSession({
@@ -786,7 +788,7 @@ export async function sessionStart(params) {
786
788
  children: forceCarryChildren,
787
789
  threads: mergedThreads,
788
790
  });
789
- // OD-645: Build result — no scars/wins (load on-demand via recall/search)
791
+ // Build result — no scars/wins (load on-demand via recall/search)
790
792
  const openOnly = mergedThreads.filter(t => t.status === "open" || !t.status);
791
793
  // Strip bulky fields from last_session — open_threads used only for PROJECT STATE extraction above
792
794
  const slimLastSession = lastSession ? {
@@ -802,7 +804,7 @@ export async function sessionStart(params) {
802
804
  ...(isResuming && { resumed: true }),
803
805
  detected_environment: env,
804
806
  last_session: slimLastSession,
805
- ...(projectState && { project_state: projectState }), // OD-534
807
+ ...(projectState && { project_state: projectState }),
806
808
  ...(openOnly.length > 0 && { open_threads: openOnly }),
807
809
  recent_decisions: decisions,
808
810
  ...(recordingPath && { recording_path: recordingPath }),
@@ -810,7 +812,7 @@ export async function sessionStart(params) {
810
812
  project,
811
813
  performance,
812
814
  };
813
- // Record metrics (OD-645: simplified — no scar-related fields)
815
+ // Record metrics
814
816
  recordMetrics({
815
817
  id: metricsId,
816
818
  session_id: sessionId,
@@ -859,11 +861,11 @@ export async function sessionRefresh(params) {
859
861
  let project;
860
862
  if (currentSession) {
861
863
  sessionId = currentSession.sessionId;
862
- agent = currentSession.agent || "CLI";
864
+ agent = currentSession.agent || "cli";
863
865
  project = params.project || currentSession.project || "default";
864
866
  }
865
867
  else {
866
- // GIT-20: Fallback — check registry for this process, then legacy file
868
+ // Fallback — check registry for this process, then legacy file
867
869
  const mySession = findSessionByHostPid(os.hostname(), process.pid);
868
870
  let raw = null;
869
871
  if (mySession) {
@@ -872,14 +874,14 @@ export async function sessionRefresh(params) {
872
874
  if (!raw || !raw.session_id) {
873
875
  return {
874
876
  session_id: "",
875
- agent: "CLI",
877
+ agent: "cli",
876
878
  refreshed: true,
877
879
  message: "No active session — call session_start first",
878
880
  performance: buildPerformanceData("session_refresh", timer.stop(), 0),
879
881
  };
880
882
  }
881
883
  sessionId = raw.session_id;
882
- agent = raw.agent || "CLI";
884
+ agent = raw.agent || "cli";
883
885
  project = params.project || raw.project || "default";
884
886
  }
885
887
  // Free tier: all-local path (reuse session_start free path)
@@ -892,24 +894,24 @@ export async function sessionRefresh(params) {
892
894
  performance: buildPerformanceData("session_refresh", timer.stop(), 0),
893
895
  };
894
896
  }
895
- // 2. OD-645: Load last session + decisions in parallel (same as session_start)
897
+ // 2. Load last session + decisions in parallel (same as session_start)
896
898
  // Scars and wins removed — load on-demand via recall/search
897
- // OD-666: Rapport loading disabled — recording kept in session_close but not injected
899
+ // Rapport loading disabled — recording kept in session_close but not injected
898
900
  const [lastSessionResult, decisionsResult] = await Promise.all([
899
901
  loadLastSession(agent, project),
900
902
  loadRecentDecisions(project, 3),
901
903
  ]);
902
904
  const lastSession = lastSessionResult.session;
903
905
  const decisions = decisionsResult.decisions;
904
- // OD-645: surfacedScars not re-queried on refresh — existing ones preserved in session state
906
+ // surfacedScars not re-queried on refresh — existing ones preserved in session state
905
907
  const refreshAggregatedThreads = lastSessionResult.aggregated_open_threads;
906
908
  const refreshDisplayInfo = lastSessionResult.displayInfo;
907
- // 3. Extract PROJECT STATE (OD-534)
909
+ // 3. Extract PROJECT STATE
908
910
  const projectState = lastSession?.open_threads
909
911
  ?.map((t) => typeof t === "string" ? t : t.text)
910
912
  .find(t => t.startsWith("PROJECT STATE:"))
911
913
  ?.replace(/^PROJECT STATE:\s*/, "");
912
- // 4. OD-645: Simplified performance breakdown (no scar_search, wins)
914
+ // 4. Simplified performance breakdown (no scar_search, wins)
913
915
  const latencyMs = timer.stop();
914
916
  const breakdown = {
915
917
  last_session: buildComponentPerformance(lastSessionResult.latency_ms, "supabase", lastSessionResult.network_call, lastSessionResult.network_call ? "miss" : "hit"),
@@ -917,7 +919,7 @@ export async function sessionRefresh(params) {
917
919
  };
918
920
  const performance = buildPerformanceData("session_refresh", latencyMs, decisions.length + (lastSession ? 1 : 0), { breakdown });
919
921
  const recordingPath = process.env.GITMEM_RECORDING_PATH || undefined;
920
- // OD-645: Build result — no scars/wins
922
+ // Build result — no scars/wins
921
923
  const result = {
922
924
  session_id: sessionId,
923
925
  agent,
@@ -927,7 +929,7 @@ export async function sessionRefresh(params) {
927
929
  ...(projectState && { project_state: projectState }),
928
930
  // open_threads filled after merge below
929
931
  recent_decisions: decisions,
930
- // OD-666: Rapport disabled — not injected into session context
932
+ // Rapport disabled — not injected into session context
931
933
  ...(recordingPath && { recording_path: recordingPath }),
932
934
  project,
933
935
  performance,
@@ -957,7 +959,7 @@ export async function sessionRefresh(params) {
957
959
  threads: refreshMergedThreads,
958
960
  linearIssue: currentSession?.linearIssue,
959
961
  });
960
- // Record metrics (OD-645: simplified — no scar-related fields)
962
+ // Record metrics
961
963
  recordMetrics({
962
964
  id: metricsId,
963
965
  session_id: sessionId,
@@ -35,7 +35,7 @@ export interface PerformanceData {
35
35
  cache_age_ms?: number;
36
36
  search_mode?: "local" | "remote";
37
37
  }
38
- export type AgentIdentity = "CLI" | "DAC" | "CODA-1" | "Brain_Local" | "Brain_Cloud" | "Unknown";
38
+ export type AgentIdentity = "cli" | "desktop" | "autonomous" | "local" | "cloud" | "Unknown";
39
39
  export type Project = string;
40
40
  export type ThreadStatus = "open" | "resolved";
41
41
  export interface ThreadObject {
@@ -94,7 +94,7 @@ export interface SessionStartParams {
94
94
  issue_description?: string;
95
95
  issue_labels?: string[];
96
96
  project?: Project;
97
- /** OD-558: Force overwrite of existing active session */
97
+ /** Force overwrite of existing active session */
98
98
  force?: boolean;
99
99
  }
100
100
  export interface LastSession {
@@ -117,6 +117,7 @@ export interface RelevantScar {
117
117
  action_protocol?: string[];
118
118
  self_check_criteria?: string[];
119
119
  decay_multiplier?: number;
120
+ is_starter?: boolean;
120
121
  }
121
122
  export interface RecentDecision {
122
123
  id: string;
@@ -136,7 +137,7 @@ export interface SessionStartResult {
136
137
  agent: AgentIdentity;
137
138
  detected_environment?: DetectedEnvironment;
138
139
  last_session?: LastSession | null;
139
- /** OD-534: PROJECT STATE thread extracted from last session (if present) */
140
+ /** PROJECT STATE thread extracted from last session (if present) */
140
141
  project_state?: string;
141
142
  /** Aggregated open threads across last 5 sessions (deduplicated, migrated to objects) */
142
143
  open_threads?: ThreadObject[];
@@ -144,7 +145,7 @@ export interface SessionStartResult {
144
145
  suggested_threads?: ThreadSuggestion[];
145
146
  relevant_scars?: RelevantScar[];
146
147
  recent_decisions?: RecentDecision[];
147
- /** OD-666: Cross-agent rapport summaries from recent sessions */
148
+ /** Cross-agent rapport summaries from recent sessions */
148
149
  rapport_summaries?: {
149
150
  agent: string;
150
151
  summary: string;
@@ -152,11 +153,11 @@ export interface SessionStartResult {
152
153
  }[];
153
154
  recent_wins?: RecentWin[];
154
155
  performance?: PerformanceData;
155
- /** OD-558: Whether this session was resumed from an existing active session */
156
+ /** Whether this session was resumed from an existing active session */
156
157
  resumed?: boolean;
157
158
  /** Whether this result is from a mid-session refresh (no new session created) */
158
159
  refreshed?: boolean;
159
- /** OD-558: Message explaining session state */
160
+ /** Message explaining session state */
160
161
  message?: string;
161
162
  /** Asciinema recording path for session replay (from GITMEM_RECORDING_PATH env var) */
162
163
  recording_path?: string;
@@ -183,7 +184,7 @@ export interface ClosingReflection {
183
184
  rapport_notes?: string;
184
185
  }
185
186
  /**
186
- * Task completion proof for standard close (OD-491)
187
+ * Task completion proof for standard close
187
188
  *
188
189
  * Enforces that each step in the closing protocol was actually completed.
189
190
  * Timestamps must be in logical order and human_response requires minimum gap.
@@ -209,21 +210,21 @@ export interface SessionDecision {
209
210
  export interface SessionCloseParams {
210
211
  session_id: string;
211
212
  close_type: CloseType;
212
- /** Task completion proof - REQUIRED for standard close (OD-491) */
213
+ /** Task completion proof - REQUIRED for standard close */
213
214
  task_completion?: TaskCompletion;
214
215
  closing_reflection?: ClosingReflection;
215
216
  human_corrections?: string;
216
217
  decisions?: SessionDecision[];
217
218
  open_threads?: (string | ThreadObject)[];
218
- /** Optional PROJECT STATE that auto-prepends to open_threads[0] (OD-534) */
219
+ /** Optional PROJECT STATE that auto-prepends to open_threads[0] */
219
220
  project_state?: string;
220
221
  learnings_created?: (string | Record<string, unknown>)[];
221
222
  linear_issue?: string;
222
223
  ceremony_duration_ms?: number;
223
224
  scars_to_record?: ScarUsageEntry[];
224
- /** OD-538: Capture full conversation transcript to Supabase storage (defaults to true for CLI/DAC) */
225
+ /** Capture full conversation transcript to Supabase storage (defaults to true for CLI/DAC) */
225
226
  capture_transcript?: boolean;
226
- /** OD-538: Explicit transcript file path (overrides automatic detection) */
227
+ /** Explicit transcript file path (overrides automatic detection) */
227
228
  transcript_path?: string;
228
229
  }
229
230
  export interface CloseCompliance {
@@ -270,7 +271,7 @@ export interface CreateLearningResult {
270
271
  success: boolean;
271
272
  learning_id: string;
272
273
  embedding_generated: boolean;
273
- /** Error details when success=false (OD-554: surface DB/validation errors) */
274
+ /** Error details when success=false */
274
275
  errors?: string[];
275
276
  display?: string;
276
277
  performance: PerformanceData;
@@ -301,18 +302,21 @@ export interface SurfacedScar {
301
302
  variant_id?: string;
302
303
  }
303
304
  export type ConfirmationDecision = "APPLYING" | "N_A" | "REFUTED";
305
+ export type ScarRelevance = "high" | "low" | "noise";
304
306
  export interface ScarConfirmation {
305
307
  scar_id: string;
306
308
  scar_title: string;
307
309
  decision: ConfirmationDecision;
308
310
  evidence: string;
309
311
  confirmed_at: string;
312
+ relevance?: ScarRelevance;
310
313
  }
311
314
  export interface ConfirmScarsParams {
312
315
  confirmations: Array<{
313
316
  scar_id: string;
314
317
  decision: ConfirmationDecision;
315
318
  evidence: string;
319
+ relevance?: ScarRelevance;
316
320
  }>;
317
321
  }
318
322
  export interface ConfirmScarsResult {
@@ -341,7 +345,7 @@ export interface RecordScarUsageParams {
341
345
  export interface RecordScarUsageResult {
342
346
  success: boolean;
343
347
  usage_id: string;
344
- /** Error details when success=false (OD-554: surface DB errors) */
348
+ /** Error details when success=false */
345
349
  errors?: string[];
346
350
  display?: string;
347
351
  performance: PerformanceData;
@@ -3,6 +3,6 @@
3
3
  "description": "Enforces the GitMem institutional memory lifecycle through hooks — auto-starts sessions, reminds you to recall before consequential actions, and ensures proper session closure.",
4
4
  "author": {
5
5
  "name": "nTEG Labs",
6
- "email": "support@nteg.com"
6
+ "email": "support@gitmem.ai"
7
7
  }
8
8
  }
@@ -21,7 +21,7 @@ HOOK_INPUT=$(cat -)
21
21
  # Graceful degradation: skip if no active gitmem session
22
22
  # ============================================================================
23
23
 
24
- # Check active sessions registry (Phase 1 multi-session, GIT-19)
24
+ # Check active sessions registry
25
25
  ACTIVE_SESSIONS=".gitmem/active-sessions.json"
26
26
  if [ ! -f "$ACTIVE_SESSIONS" ]; then
27
27
  exit 0
@@ -26,7 +26,7 @@ set -e
26
26
  HOOK_INPUT=$(cat -)
27
27
 
28
28
  # ============================================================================
29
- # Resolve active session from registry (Phase 1 multi-session, GIT-19)
29
+ # Resolve active session from registry
30
30
  # ============================================================================
31
31
 
32
32
  ACTIVE_SESSIONS=".gitmem/active-sessions.json"
@@ -38,7 +38,7 @@ IS_MEANINGFUL=false
38
38
  ACTIVE_SESSIONS=".gitmem/active-sessions.json"
39
39
  SESSION_STARTED=false
40
40
  if [ -f "$ACTIVE_SESSIONS" ]; then
41
- # Check if registry has active session entries (Phase 1 multi-session, GIT-19)
41
+ # Check if registry has active session entries
42
42
  if command -v jq &>/dev/null; then
43
43
  [ "$(jq '.sessions | length' "$ACTIVE_SESSIONS" 2>/dev/null || echo 0)" -gt 0 ] 2>/dev/null && SESSION_STARTED=true
44
44
  elif command -v node &>/dev/null; then
@@ -183,7 +183,7 @@ if [ "$GITMEM_DETECTED" = "true" ]; then
183
183
 
184
184
  # Instruct agent to call session_start via MCP.
185
185
  # The MCP server creates sessions with its own PID, enabling multi-session
186
- # isolation (Phase 1, GIT-19). CLI binary invocation was removed because
186
+ # isolation. CLI binary invocation was removed because
187
187
  # the CLI PID dies immediately, defeating PID-based session identity.
188
188
  #
189
189
  # NOTE: ToolSearch (tengu_mcp_tool_search) was removed. MCP tools load
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gitmem-mcp",
3
- "version": "1.0.2",
3
+ "version": "1.0.4",
4
4
  "description": "Institutional memory for AI coding agents. Memory that compounds.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -46,9 +46,12 @@
46
46
  "node": ">=18.0.0"
47
47
  },
48
48
  "files": [
49
- "dist",
49
+ "dist/**/*.js",
50
+ "dist/**/*.d.ts",
51
+ "!dist/**/*.test.*",
50
52
  "bin",
51
53
  "hooks",
54
+ "!hooks/tests",
52
55
  "schema",
53
56
  "CLAUDE.md.template",
54
57
  "README.md",
@@ -70,7 +73,7 @@
70
73
  "type": "git",
71
74
  "url": "https://github.com/nTEG-dev/gitmem.git"
72
75
  },
73
- "homepage": "https://github.com/nTEG-dev/gitmem#readme",
76
+ "homepage": "https://gitmem.ai",
74
77
  "publishConfig": {
75
78
  "registry": "https://registry.npmjs.org/",
76
79
  "access": "public"