gitmem-mcp 1.0.3 → 1.0.5

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 (293) hide show
  1. package/CHANGELOG.md +14 -14
  2. package/dist/commands/check.d.ts +1 -1
  3. package/dist/commands/check.js +4 -3
  4. package/dist/diagnostics/anonymizer.d.ts +1 -1
  5. package/dist/diagnostics/anonymizer.js +1 -1
  6. package/dist/diagnostics/channels.d.ts +1 -1
  7. package/dist/diagnostics/channels.js +1 -1
  8. package/dist/diagnostics/collector.d.ts +1 -1
  9. package/dist/diagnostics/collector.js +1 -1
  10. package/dist/diagnostics/index.d.ts +1 -1
  11. package/dist/diagnostics/index.js +1 -1
  12. package/dist/hooks/quick-retrieve.js +2 -1
  13. package/dist/index.js +0 -0
  14. package/dist/schemas/active-sessions.d.ts +9 -9
  15. package/dist/schemas/active-sessions.js +1 -1
  16. package/dist/schemas/common.d.ts +2 -5
  17. package/dist/schemas/common.js +13 -7
  18. package/dist/schemas/create-learning.js +1 -1
  19. package/dist/schemas/session-close.d.ts +5 -8
  20. package/dist/schemas/session-close.js +7 -3
  21. package/dist/schemas/session-start.d.ts +4 -4
  22. package/dist/schemas/session-start.js +1 -1
  23. package/dist/schemas/thread.d.ts +1 -1
  24. package/dist/schemas/thread.js +1 -1
  25. package/dist/server.d.ts +2 -2
  26. package/dist/server.js +21 -10
  27. package/dist/services/active-sessions.js +3 -2
  28. package/dist/services/agent-briefing.d.ts +1 -1
  29. package/dist/services/agent-briefing.js +1 -1
  30. package/dist/services/agent-detection.d.ts +1 -0
  31. package/dist/services/agent-detection.js +21 -12
  32. package/dist/services/analytics.d.ts +1 -1
  33. package/dist/services/analytics.js +3 -3
  34. package/dist/services/behavioral-decay.js +2 -2
  35. package/dist/services/cache.d.ts +1 -1
  36. package/dist/services/cache.js +1 -1
  37. package/dist/services/compliance-validator.d.ts +1 -1
  38. package/dist/services/compliance-validator.js +5 -5
  39. package/dist/services/config.d.ts +1 -1
  40. package/dist/services/config.js +1 -1
  41. package/dist/services/file-lock.js +12 -0
  42. package/dist/services/gitmem-dir.d.ts +17 -4
  43. package/dist/services/gitmem-dir.js +43 -9
  44. package/dist/services/local-file-storage.d.ts +1 -1
  45. package/dist/services/local-file-storage.js +4 -3
  46. package/dist/services/local-vector-search.d.ts +1 -1
  47. package/dist/services/local-vector-search.js +2 -2
  48. package/dist/services/metrics.d.ts +6 -6
  49. package/dist/services/metrics.js +8 -8
  50. package/dist/services/session-state.d.ts +7 -7
  51. package/dist/services/session-state.js +19 -7
  52. package/dist/services/startup.d.ts +1 -1
  53. package/dist/services/startup.js +3 -2
  54. package/dist/services/supabase-client.d.ts +17 -6
  55. package/dist/services/supabase-client.js +44 -8
  56. package/dist/services/thread-manager.d.ts +1 -1
  57. package/dist/services/thread-manager.js +5 -5
  58. package/dist/services/thread-supabase.d.ts +1 -1
  59. package/dist/services/thread-supabase.js +2 -2
  60. package/dist/services/transcript-chunker.d.ts +1 -1
  61. package/dist/services/transcript-chunker.js +1 -1
  62. package/dist/services/variant-assignment.d.ts +6 -6
  63. package/dist/services/variant-assignment.js +9 -8
  64. package/dist/tools/analyze.d.ts +2 -2
  65. package/dist/tools/analyze.js +2 -2
  66. package/dist/tools/archive-learning.js +36 -22
  67. package/dist/tools/confirm-scars.js +1 -1
  68. package/dist/tools/create-decision.d.ts +1 -1
  69. package/dist/tools/create-decision.js +2 -2
  70. package/dist/tools/create-learning.d.ts +1 -1
  71. package/dist/tools/create-learning.js +4 -4
  72. package/dist/tools/create-linear-issue.d.ts +18 -0
  73. package/dist/tools/create-linear-issue.js +197 -0
  74. package/dist/tools/create-thread.d.ts +1 -1
  75. package/dist/tools/create-thread.js +2 -2
  76. package/dist/tools/definitions.js +50 -48
  77. package/dist/tools/get-transcript.d.ts +1 -1
  78. package/dist/tools/get-transcript.js +1 -1
  79. package/dist/tools/graph-traverse.d.ts +1 -1
  80. package/dist/tools/graph-traverse.js +18 -16
  81. package/dist/tools/list-threads.d.ts +2 -2
  82. package/dist/tools/list-threads.js +4 -4
  83. package/dist/tools/log.d.ts +1 -1
  84. package/dist/tools/log.js +1 -1
  85. package/dist/tools/prepare-context.d.ts +1 -1
  86. package/dist/tools/prepare-context.js +1 -1
  87. package/dist/tools/recall.d.ts +4 -4
  88. package/dist/tools/recall.js +25 -25
  89. package/dist/tools/record-scar-usage-batch.js +2 -2
  90. package/dist/tools/record-scar-usage.d.ts +1 -1
  91. package/dist/tools/record-scar-usage.js +3 -3
  92. package/dist/tools/resolve-thread.d.ts +2 -2
  93. package/dist/tools/resolve-thread.js +3 -3
  94. package/dist/tools/save-transcript.d.ts +1 -1
  95. package/dist/tools/save-transcript.js +1 -1
  96. package/dist/tools/search.d.ts +1 -1
  97. package/dist/tools/search.js +1 -1
  98. package/dist/tools/session-close.d.ts +1 -1
  99. package/dist/tools/session-close.js +31 -31
  100. package/dist/tools/session-start.d.ts +5 -5
  101. package/dist/tools/session-start.js +63 -61
  102. package/dist/types/index.d.ts +13 -13
  103. package/hooks/.claude-plugin/plugin.json +1 -1
  104. package/hooks/scripts/post-tool-use.sh +1 -1
  105. package/hooks/scripts/recall-check.sh +1 -1
  106. package/hooks/scripts/session-close-check.sh +1 -1
  107. package/hooks/scripts/session-start.sh +1 -1
  108. package/package.json +6 -3
  109. package/dist/commands/check.d.ts.map +0 -1
  110. package/dist/commands/check.js.map +0 -1
  111. package/dist/constants/closing-questions.d.ts.map +0 -1
  112. package/dist/constants/closing-questions.js.map +0 -1
  113. package/dist/diagnostics/anonymizer.d.ts.map +0 -1
  114. package/dist/diagnostics/anonymizer.js.map +0 -1
  115. package/dist/diagnostics/channels.d.ts.map +0 -1
  116. package/dist/diagnostics/channels.js.map +0 -1
  117. package/dist/diagnostics/collector.d.ts.map +0 -1
  118. package/dist/diagnostics/collector.js.map +0 -1
  119. package/dist/diagnostics/index.d.ts.map +0 -1
  120. package/dist/diagnostics/index.js.map +0 -1
  121. package/dist/hooks/format-utils.d.ts.map +0 -1
  122. package/dist/hooks/format-utils.js.map +0 -1
  123. package/dist/hooks/quick-retrieve.d.ts.map +0 -1
  124. package/dist/hooks/quick-retrieve.js.map +0 -1
  125. package/dist/index.d.ts.map +0 -1
  126. package/dist/index.js.map +0 -1
  127. package/dist/schemas/absorb-observations.d.ts.map +0 -1
  128. package/dist/schemas/absorb-observations.js.map +0 -1
  129. package/dist/schemas/active-sessions.d.ts.map +0 -1
  130. package/dist/schemas/active-sessions.js.map +0 -1
  131. package/dist/schemas/analyze.d.ts.map +0 -1
  132. package/dist/schemas/analyze.js.map +0 -1
  133. package/dist/schemas/common.d.ts.map +0 -1
  134. package/dist/schemas/common.js.map +0 -1
  135. package/dist/schemas/create-decision.d.ts.map +0 -1
  136. package/dist/schemas/create-decision.js.map +0 -1
  137. package/dist/schemas/create-learning.d.ts.map +0 -1
  138. package/dist/schemas/create-learning.js.map +0 -1
  139. package/dist/schemas/get-transcript.d.ts.map +0 -1
  140. package/dist/schemas/get-transcript.js.map +0 -1
  141. package/dist/schemas/index.d.ts.map +0 -1
  142. package/dist/schemas/index.js.map +0 -1
  143. package/dist/schemas/log.d.ts.map +0 -1
  144. package/dist/schemas/log.js.map +0 -1
  145. package/dist/schemas/prepare-context.d.ts.map +0 -1
  146. package/dist/schemas/prepare-context.js.map +0 -1
  147. package/dist/schemas/recall.d.ts.map +0 -1
  148. package/dist/schemas/recall.js.map +0 -1
  149. package/dist/schemas/record-scar-usage-batch.d.ts.map +0 -1
  150. package/dist/schemas/record-scar-usage-batch.js.map +0 -1
  151. package/dist/schemas/record-scar-usage.d.ts.map +0 -1
  152. package/dist/schemas/record-scar-usage.js.map +0 -1
  153. package/dist/schemas/registry.d.ts.map +0 -1
  154. package/dist/schemas/registry.js.map +0 -1
  155. package/dist/schemas/save-transcript.d.ts.map +0 -1
  156. package/dist/schemas/save-transcript.js.map +0 -1
  157. package/dist/schemas/search-transcripts.d.ts.map +0 -1
  158. package/dist/schemas/search-transcripts.js.map +0 -1
  159. package/dist/schemas/search.d.ts.map +0 -1
  160. package/dist/schemas/search.js.map +0 -1
  161. package/dist/schemas/session-close.d.ts.map +0 -1
  162. package/dist/schemas/session-close.js.map +0 -1
  163. package/dist/schemas/session-start.d.ts.map +0 -1
  164. package/dist/schemas/session-start.js.map +0 -1
  165. package/dist/schemas/thread.d.ts.map +0 -1
  166. package/dist/schemas/thread.js.map +0 -1
  167. package/dist/server.d.ts.map +0 -1
  168. package/dist/server.js.map +0 -1
  169. package/dist/services/active-sessions.d.ts.map +0 -1
  170. package/dist/services/active-sessions.js.map +0 -1
  171. package/dist/services/agent-briefing.d.ts.map +0 -1
  172. package/dist/services/agent-briefing.js.map +0 -1
  173. package/dist/services/agent-detection.d.ts.map +0 -1
  174. package/dist/services/agent-detection.js.map +0 -1
  175. package/dist/services/analytics.d.ts.map +0 -1
  176. package/dist/services/analytics.js.map +0 -1
  177. package/dist/services/behavioral-decay.d.ts.map +0 -1
  178. package/dist/services/behavioral-decay.js.map +0 -1
  179. package/dist/services/bm25.d.ts.map +0 -1
  180. package/dist/services/bm25.js.map +0 -1
  181. package/dist/services/cache.d.ts.map +0 -1
  182. package/dist/services/cache.js.map +0 -1
  183. package/dist/services/cache.test.d.ts +0 -8
  184. package/dist/services/cache.test.d.ts.map +0 -1
  185. package/dist/services/cache.test.js +0 -267
  186. package/dist/services/cache.test.js.map +0 -1
  187. package/dist/services/compliance-validator.d.ts.map +0 -1
  188. package/dist/services/compliance-validator.js.map +0 -1
  189. package/dist/services/config.d.ts.map +0 -1
  190. package/dist/services/config.js.map +0 -1
  191. package/dist/services/display-protocol.d.ts.map +0 -1
  192. package/dist/services/display-protocol.js.map +0 -1
  193. package/dist/services/effect-tracker.d.ts.map +0 -1
  194. package/dist/services/effect-tracker.js.map +0 -1
  195. package/dist/services/embedding.d.ts.map +0 -1
  196. package/dist/services/embedding.js.map +0 -1
  197. package/dist/services/file-lock.d.ts.map +0 -1
  198. package/dist/services/file-lock.js.map +0 -1
  199. package/dist/services/gitmem-dir.d.ts.map +0 -1
  200. package/dist/services/gitmem-dir.js.map +0 -1
  201. package/dist/services/local-file-storage.d.ts.map +0 -1
  202. package/dist/services/local-file-storage.js.map +0 -1
  203. package/dist/services/local-vector-search.d.ts.map +0 -1
  204. package/dist/services/local-vector-search.js.map +0 -1
  205. package/dist/services/metrics.d.ts.map +0 -1
  206. package/dist/services/metrics.js.map +0 -1
  207. package/dist/services/session-state.d.ts.map +0 -1
  208. package/dist/services/session-state.js.map +0 -1
  209. package/dist/services/startup.d.ts.map +0 -1
  210. package/dist/services/startup.js.map +0 -1
  211. package/dist/services/storage.d.ts.map +0 -1
  212. package/dist/services/storage.js.map +0 -1
  213. package/dist/services/supabase-client.d.ts.map +0 -1
  214. package/dist/services/supabase-client.js.map +0 -1
  215. package/dist/services/thread-dedup.d.ts.map +0 -1
  216. package/dist/services/thread-dedup.js.map +0 -1
  217. package/dist/services/thread-manager.d.ts.map +0 -1
  218. package/dist/services/thread-manager.js.map +0 -1
  219. package/dist/services/thread-suggestions.d.ts.map +0 -1
  220. package/dist/services/thread-suggestions.js.map +0 -1
  221. package/dist/services/thread-supabase.d.ts.map +0 -1
  222. package/dist/services/thread-supabase.js.map +0 -1
  223. package/dist/services/thread-vitality.d.ts.map +0 -1
  224. package/dist/services/thread-vitality.js.map +0 -1
  225. package/dist/services/tier.d.ts.map +0 -1
  226. package/dist/services/tier.js.map +0 -1
  227. package/dist/services/timezone.d.ts.map +0 -1
  228. package/dist/services/timezone.js.map +0 -1
  229. package/dist/services/transcript-chunker.d.ts.map +0 -1
  230. package/dist/services/transcript-chunker.js.map +0 -1
  231. package/dist/services/triple-writer.d.ts.map +0 -1
  232. package/dist/services/triple-writer.js.map +0 -1
  233. package/dist/services/variant-assignment.d.ts.map +0 -1
  234. package/dist/services/variant-assignment.js.map +0 -1
  235. package/dist/services/variant-generation.d.ts.map +0 -1
  236. package/dist/services/variant-generation.js.map +0 -1
  237. package/dist/tools/absorb-observations.d.ts.map +0 -1
  238. package/dist/tools/absorb-observations.js.map +0 -1
  239. package/dist/tools/analyze.d.ts.map +0 -1
  240. package/dist/tools/analyze.js.map +0 -1
  241. package/dist/tools/archive-learning.d.ts.map +0 -1
  242. package/dist/tools/archive-learning.js.map +0 -1
  243. package/dist/tools/cleanup-threads.d.ts.map +0 -1
  244. package/dist/tools/cleanup-threads.js.map +0 -1
  245. package/dist/tools/confirm-scars.d.ts.map +0 -1
  246. package/dist/tools/confirm-scars.js.map +0 -1
  247. package/dist/tools/create-decision.d.ts.map +0 -1
  248. package/dist/tools/create-decision.js.map +0 -1
  249. package/dist/tools/create-learning.d.ts.map +0 -1
  250. package/dist/tools/create-learning.js.map +0 -1
  251. package/dist/tools/create-thread.d.ts.map +0 -1
  252. package/dist/tools/create-thread.js.map +0 -1
  253. package/dist/tools/definitions.d.ts.map +0 -1
  254. package/dist/tools/definitions.js.map +0 -1
  255. package/dist/tools/dismiss-suggestion.d.ts.map +0 -1
  256. package/dist/tools/dismiss-suggestion.js.map +0 -1
  257. package/dist/tools/get-transcript.d.ts.map +0 -1
  258. package/dist/tools/get-transcript.js.map +0 -1
  259. package/dist/tools/graph-traverse.d.ts.map +0 -1
  260. package/dist/tools/graph-traverse.js.map +0 -1
  261. package/dist/tools/list-threads.d.ts.map +0 -1
  262. package/dist/tools/list-threads.js.map +0 -1
  263. package/dist/tools/log.d.ts.map +0 -1
  264. package/dist/tools/log.js.map +0 -1
  265. package/dist/tools/prepare-context.d.ts.map +0 -1
  266. package/dist/tools/prepare-context.js.map +0 -1
  267. package/dist/tools/promote-suggestion.d.ts.map +0 -1
  268. package/dist/tools/promote-suggestion.js.map +0 -1
  269. package/dist/tools/recall.d.ts.map +0 -1
  270. package/dist/tools/recall.js.map +0 -1
  271. package/dist/tools/recall.test.d.ts +0 -5
  272. package/dist/tools/recall.test.d.ts.map +0 -1
  273. package/dist/tools/recall.test.js +0 -155
  274. package/dist/tools/recall.test.js.map +0 -1
  275. package/dist/tools/record-scar-usage-batch.d.ts.map +0 -1
  276. package/dist/tools/record-scar-usage-batch.js.map +0 -1
  277. package/dist/tools/record-scar-usage.d.ts.map +0 -1
  278. package/dist/tools/record-scar-usage.js.map +0 -1
  279. package/dist/tools/resolve-thread.d.ts.map +0 -1
  280. package/dist/tools/resolve-thread.js.map +0 -1
  281. package/dist/tools/save-transcript.d.ts.map +0 -1
  282. package/dist/tools/save-transcript.js.map +0 -1
  283. package/dist/tools/search-transcripts.d.ts.map +0 -1
  284. package/dist/tools/search-transcripts.js.map +0 -1
  285. package/dist/tools/search.d.ts.map +0 -1
  286. package/dist/tools/search.js.map +0 -1
  287. package/dist/tools/session-close.d.ts.map +0 -1
  288. package/dist/tools/session-close.js.map +0 -1
  289. package/dist/tools/session-start.d.ts.map +0 -1
  290. package/dist/tools/session-start.js.map +0 -1
  291. package/dist/types/index.d.ts.map +0 -1
  292. package/dist/types/index.js.map +0 -1
  293. package/hooks/tests/test-hooks.sh +0 -577
package/CHANGELOG.md CHANGED
@@ -10,16 +10,16 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
10
10
  ## [1.0.3] - 2026-02-15
11
11
 
12
12
  ### Changed
13
- - **Tool alias consolidation (OD-691)**: Reduced advertised tools from 55 to 20 (free tier). Aliases still work when called directly. Set `GITMEM_FULL_ALIASES=1` to restore all.
14
- - **Starter scars reduced (OD-684)**: Ship with 3 high-quality starter scars instead of 12. Starter scars deprioritized with 0.7x score multiplier so earned scars outrank them.
15
- - **Recall similarity threshold (OD-686)**: Weak matches below threshold (0.4 BM25, 0.35 embeddings) are suppressed. Empty results show helpful guidance instead of noise.
16
- - **Adaptive session closing (OD-685)**: Auto-detects ceremony level (micro/standard/full) based on session activity. Removed hard rejection gate that blocked standard closes on short sessions.
17
- - **Scar relevance feedback (OD-690)**: Optional `relevance` field (high/low/noise) on `confirm_scars` for recall quality improvement. Defaults derived from decision type.
18
- - **Pro tier messaging (OD-688)**: Rewritten from agent's perspective with concrete value propositions.
13
+ - **Tool alias consolidation**: Reduced advertised tools from 55 to 20 (free tier). Aliases still work when called directly. Set `GITMEM_FULL_ALIASES=1` to restore all.
14
+ - **Starter scars reduced**: Ship with 3 high-quality starter scars instead of 12. Starter scars deprioritized with 0.7x score multiplier so earned scars outrank them.
15
+ - **Recall similarity threshold**: Weak matches below threshold (0.4 BM25, 0.35 embeddings) are suppressed. Empty results show helpful guidance instead of noise.
16
+ - **Adaptive session closing**: Auto-detects ceremony level (micro/standard/full) based on session activity. Removed hard rejection gate that blocked standard closes on short sessions.
17
+ - **Scar relevance feedback**: Optional `relevance` field (high/low/noise) on `confirm_scars` for recall quality improvement. Defaults derived from decision type.
18
+ - **Pro tier messaging**: Rewritten from agent's perspective with concrete value propositions.
19
19
 
20
20
  ### Added
21
- - **Agent briefing (OD-689)**: Generates `.gitmem/agent-briefing.md` at session close with memory state summary for MEMORY.md bridge.
22
- - **PMEM/GitMem boundary docs (OD-687)**: README section documenting how GitMem complements MEMORY.md/cursorrules.
21
+ - **Agent briefing**: Generates `.gitmem/agent-briefing.md` at session close with memory state summary for MEMORY.md bridge.
22
+ - **PMEM/GitMem boundary docs**: README section documenting how GitMem complements MEMORY.md/cursorrules.
23
23
 
24
24
  ## [1.0.2] - 2026-02-15
25
25
 
@@ -31,12 +31,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
31
31
  ## [1.0.0] - 2026-02-10
32
32
 
33
33
  ### Added
34
- - **Hooks plugin bundled**: `gitmem install-hooks` / `uninstall-hooks` CLI commands (OD-605, OD-606)
34
+ - **Hooks plugin bundled**: `gitmem install-hooks` / `uninstall-hooks` CLI commands
35
35
  - **CLI `check` command wired**: `gitmem check` now reachable from CLI (was defined but unreachable)
36
- - **Fresh-install E2E tests**: 16 integration tests covering CLI commands, hooks, and MCP server lifecycle (OD-607)
37
- - **README rewrite**: External-developer-facing docs with no internal jargon (OD-608)
36
+ - **Fresh-install E2E tests**: 16 integration tests covering CLI commands, hooks, and MCP server lifecycle
37
+ - **README rewrite**: External-developer-facing docs with no internal jargon
38
38
  - **CONTRIBUTING.md**: Dev setup, testing tiers, and PR guidelines
39
- - **First public npm release** (OD-609)
39
+ - **First public npm release**
40
40
 
41
41
  ### Changed
42
42
  - Package name standardized to `gitmem-mcp` for npm
@@ -46,11 +46,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
46
46
  ## [0.2.0] - 2026-02-08
47
47
 
48
48
  ### Added
49
- - **Full monorepo sync**: Standalone repo is now source of truth (Option A — OD-574, GIT-1)
49
+ - **Full monorepo sync**: Standalone repo is now source of truth
50
50
  - **Zod schemas**: 14 schema files for all tool parameter validation (`src/schemas/`)
51
51
  - **Diagnostics suite**: Health checks, channel instrumentation, anonymization (`src/diagnostics/`)
52
52
  - **Single source of truth constants**: Closing questions defined once (`src/constants/closing-questions.ts`)
53
- - **Multi-agent tools**: `prepare_context` and `absorb_observations` (GitMem v2 Phase 1-2)
53
+ - **Multi-agent tools**: `prepare_context` and `absorb_observations`
54
54
  - **Tool definitions module**: Centralized tool registration (`src/tools/definitions.ts`)
55
55
  - **Commands module**: `gitmem check` CLI health diagnostics (`src/commands/check.ts`)
56
56
  - **Full test suite**: 354+ unit tests across 20 test files, plus integration, e2e, and performance benchmarks
@@ -8,7 +8,7 @@
8
8
  * npx gitmem check --full — Full diagnostic (~30s)
9
9
  * npx gitmem check --output report.json
10
10
  *
11
- * Issue: OD-584
11
+ *
12
12
  */
13
13
  /**
14
14
  * Command options
@@ -8,13 +8,14 @@
8
8
  * npx gitmem check --full — Full diagnostic (~30s)
9
9
  * npx gitmem check --output report.json
10
10
  *
11
- * Issue: OD-584
11
+ *
12
12
  */
13
13
  import { existsSync, mkdirSync, writeFileSync, readdirSync, statSync } from "fs";
14
14
  import { join } from "path";
15
15
  import { DiagnosticsCollector, runBenchmark, anonymizeSupabaseUrl, anonymizePath, isApiKeyConfigured, getSafeEnvironmentInfo, } from "../diagnostics/index.js";
16
16
  import { getCache, CacheService } from "../services/cache.js";
17
17
  import { getTier, hasSupabase } from "../services/tier.js";
18
+ import { getGitmemDir } from "../services/gitmem-dir.js";
18
19
  // Report version for schema compatibility
19
20
  const REPORT_VERSION = "1.0.0";
20
21
  /**
@@ -287,7 +288,7 @@ async function runQuickCheck() {
287
288
  // Data volume (counts only)
288
289
  let dataVolume;
289
290
  try {
290
- const gitmemDir = join(process.cwd(), ".gitmem");
291
+ const gitmemDir = getGitmemDir();
291
292
  let localCacheFiles = 0;
292
293
  let localCacheBytes = 0;
293
294
  if (existsSync(gitmemDir)) {
@@ -463,7 +464,7 @@ export async function runCheck(options) {
463
464
  dataVolume,
464
465
  };
465
466
  // Determine output path
466
- const gitmemDir = join(process.cwd(), ".gitmem");
467
+ const gitmemDir = getGitmemDir();
467
468
  if (!existsSync(gitmemDir)) {
468
469
  mkdirSync(gitmemDir, { recursive: true });
469
470
  }
@@ -14,7 +14,7 @@
14
14
  * - Hostnames → excluded
15
15
  * - Platform/Node version → included
16
16
  *
17
- * Issue: OD-584
17
+ *
18
18
  */
19
19
  /**
20
20
  * Anonymize a Supabase URL
@@ -14,7 +14,7 @@
14
14
  * - Hostnames → excluded
15
15
  * - Platform/Node version → included
16
16
  *
17
- * Issue: OD-584
17
+ *
18
18
  */
19
19
  /**
20
20
  * Regex patterns for sensitive data
@@ -5,7 +5,7 @@
5
5
  * When no subscriber is attached, publish() is essentially a no-op.
6
6
  *
7
7
  * Pattern reference: @ibm/telemetry-js
8
- * Issue: OD-584
8
+ *
9
9
  */
10
10
  import { channel, Channel } from "diagnostics_channel";
11
11
  /**
@@ -5,7 +5,7 @@
5
5
  * When no subscriber is attached, publish() is essentially a no-op.
6
6
  *
7
7
  * Pattern reference: @ibm/telemetry-js
8
- * Issue: OD-584
8
+ *
9
9
  */
10
10
  import { channel } from "diagnostics_channel";
11
11
  /**
@@ -4,7 +4,7 @@
4
4
  * Subscribes to diagnostics_channel events and collects metrics
5
5
  * during diagnostic pass. Anonymizes data as it's collected.
6
6
  *
7
- * Issue: OD-584
7
+ *
8
8
  */
9
9
  /**
10
10
  * Collected metrics for a diagnostic run
@@ -4,7 +4,7 @@
4
4
  * Subscribes to diagnostics_channel events and collects metrics
5
5
  * during diagnostic pass. Anonymizes data as it's collected.
6
6
  *
7
- * Issue: OD-584
7
+ *
8
8
  */
9
9
  import { subscribe, unsubscribe } from "diagnostics_channel";
10
10
  import { CHANNEL_NAMES, } from "./channels.js";
@@ -20,7 +20,7 @@
20
20
  * // ... run operations ...
21
21
  * const metrics = collector.stop();
22
22
  *
23
- * Issue: OD-584
23
+ *
24
24
  */
25
25
  export { diagnostics, CHANNEL_NAMES, channel, type ToolCallEvent, type CacheEvent, type DbQueryEvent, type EmbeddingCallEvent, type ErrorEvent, } from "./channels.js";
26
26
  export { DiagnosticsCollector, getCollector, resetCollector, runBenchmark, percentile, type DiagnosticMetrics, type DiagnosticReport, type HealthCheckResult, type BenchmarkResult, } from "./collector.js";
@@ -20,7 +20,7 @@
20
20
  * // ... run operations ...
21
21
  * const metrics = collector.stop();
22
22
  *
23
- * Issue: OD-584
23
+ *
24
24
  */
25
25
  // Channel definitions and publisher
26
26
  export { diagnostics, CHANNEL_NAMES, channel, } from "./channels.js";
@@ -21,6 +21,7 @@ import { getStorage } from "../services/storage.js";
21
21
  import { hasSupabase } from "../services/tier.js";
22
22
  import { isLocalSearchReady, localScarSearch } from "../services/local-vector-search.js";
23
23
  import { bm25Search } from "../services/bm25.js";
24
+ import { getGitmemDir } from "../services/gitmem-dir.js";
24
25
  import { formatCompact } from "./format-utils.js";
25
26
  /**
26
27
  * Perform a quick scar search optimized for hook invocation.
@@ -72,7 +73,7 @@ export async function quickRetrieve(prompt, retrievalLevel, options = {}) {
72
73
  * Uses BM25 ranking with field boosting (title 3x, keywords 2x, description 1x).
73
74
  */
74
75
  function searchDiskCache(query, k) {
75
- const cachePath = path.join(process.cwd(), ".gitmem", "cache", "hook-scars.json");
76
+ const cachePath = path.join(getGitmemDir(), "cache", "hook-scars.json");
76
77
  if (!fs.existsSync(cachePath)) {
77
78
  return [];
78
79
  }
package/dist/index.js CHANGED
File without changes
@@ -1,25 +1,25 @@
1
1
  /**
2
- * Zod schemas for active-sessions.json registry (GIT-19)
2
+ * Zod schemas for active-sessions.json registry
3
3
  *
4
4
  * Validates data read from disk — defensive parsing of potentially corrupted JSON.
5
5
  */
6
6
  import { z } from "zod";
7
7
  export declare const ActiveSessionEntrySchema: z.ZodObject<{
8
8
  session_id: z.ZodString;
9
- agent: z.ZodEnum<["CLI", "DAC", "CODA-1", "Brain_Local", "Brain_Cloud", "Unknown"]>;
9
+ agent: z.ZodEffects<z.ZodEffects<z.ZodString, string, string>, "local" | "cli" | "desktop" | "autonomous" | "cloud" | "Unknown", string>;
10
10
  started_at: z.ZodString;
11
11
  hostname: z.ZodString;
12
12
  pid: z.ZodNumber;
13
13
  project: z.ZodDefault<z.ZodString>;
14
14
  }, "strip", z.ZodTypeAny, {
15
15
  project: string;
16
- agent: "CLI" | "DAC" | "CODA-1" | "Brain_Local" | "Brain_Cloud" | "Unknown";
16
+ agent: "local" | "cli" | "desktop" | "autonomous" | "cloud" | "Unknown";
17
17
  session_id: string;
18
18
  started_at: string;
19
19
  hostname: string;
20
20
  pid: number;
21
21
  }, {
22
- agent: "CLI" | "DAC" | "CODA-1" | "Brain_Local" | "Brain_Cloud" | "Unknown";
22
+ agent: string;
23
23
  session_id: string;
24
24
  started_at: string;
25
25
  hostname: string;
@@ -29,20 +29,20 @@ export declare const ActiveSessionEntrySchema: z.ZodObject<{
29
29
  export declare const ActiveSessionsRegistrySchema: z.ZodObject<{
30
30
  sessions: z.ZodArray<z.ZodObject<{
31
31
  session_id: z.ZodString;
32
- agent: z.ZodEnum<["CLI", "DAC", "CODA-1", "Brain_Local", "Brain_Cloud", "Unknown"]>;
32
+ agent: z.ZodEffects<z.ZodEffects<z.ZodString, string, string>, "local" | "cli" | "desktop" | "autonomous" | "cloud" | "Unknown", string>;
33
33
  started_at: z.ZodString;
34
34
  hostname: z.ZodString;
35
35
  pid: z.ZodNumber;
36
36
  project: z.ZodDefault<z.ZodString>;
37
37
  }, "strip", z.ZodTypeAny, {
38
38
  project: string;
39
- agent: "CLI" | "DAC" | "CODA-1" | "Brain_Local" | "Brain_Cloud" | "Unknown";
39
+ agent: "local" | "cli" | "desktop" | "autonomous" | "cloud" | "Unknown";
40
40
  session_id: string;
41
41
  started_at: string;
42
42
  hostname: string;
43
43
  pid: number;
44
44
  }, {
45
- agent: "CLI" | "DAC" | "CODA-1" | "Brain_Local" | "Brain_Cloud" | "Unknown";
45
+ agent: string;
46
46
  session_id: string;
47
47
  started_at: string;
48
48
  hostname: string;
@@ -52,7 +52,7 @@ export declare const ActiveSessionsRegistrySchema: z.ZodObject<{
52
52
  }, "strip", z.ZodTypeAny, {
53
53
  sessions: {
54
54
  project: string;
55
- agent: "CLI" | "DAC" | "CODA-1" | "Brain_Local" | "Brain_Cloud" | "Unknown";
55
+ agent: "local" | "cli" | "desktop" | "autonomous" | "cloud" | "Unknown";
56
56
  session_id: string;
57
57
  started_at: string;
58
58
  hostname: string;
@@ -60,7 +60,7 @@ export declare const ActiveSessionsRegistrySchema: z.ZodObject<{
60
60
  }[];
61
61
  }, {
62
62
  sessions: {
63
- agent: "CLI" | "DAC" | "CODA-1" | "Brain_Local" | "Brain_Cloud" | "Unknown";
63
+ agent: string;
64
64
  session_id: string;
65
65
  started_at: string;
66
66
  hostname: string;
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Zod schemas for active-sessions.json registry (GIT-19)
2
+ * Zod schemas for active-sessions.json registry
3
3
  *
4
4
  * Validates data read from disk — defensive parsing of potentially corrupted JSON.
5
5
  */
@@ -7,11 +7,8 @@ import { z } from "zod";
7
7
  */
8
8
  export declare const ProjectSchema: z.ZodDefault<z.ZodString>;
9
9
  export type Project = string;
10
- /**
11
- * Agent identity enum
12
- */
13
- export declare const AgentIdentitySchema: z.ZodEnum<["CLI", "DAC", "CODA-1", "Brain_Local", "Brain_Cloud", "Unknown"]>;
14
- export type AgentIdentity = z.infer<typeof AgentIdentitySchema>;
10
+ export declare const AgentIdentitySchema: z.ZodEffects<z.ZodEffects<z.ZodString, string, string>, "local" | "cli" | "desktop" | "autonomous" | "cloud" | "Unknown", string>;
11
+ export type AgentIdentity = "cli" | "desktop" | "autonomous" | "local" | "cloud" | "Unknown";
15
12
  /**
16
13
  * Learning type enum (scar, win, pattern)
17
14
  */
@@ -9,14 +9,20 @@ export const ProjectSchema = z.string().default("default");
9
9
  /**
10
10
  * Agent identity enum
11
11
  */
12
- export const AgentIdentitySchema = z.enum([
13
- "CLI",
14
- "DAC",
15
- "CODA-1",
16
- "Brain_Local",
17
- "Brain_Cloud",
18
- "Unknown",
12
+ const LEGACY_AGENT_MAP = {
13
+ "CLI": "cli",
14
+ "DAC": "desktop",
15
+ "CODA-1": "autonomous",
16
+ "Brain_Local": "local",
17
+ "Brain_Cloud": "cloud",
18
+ };
19
+ const VALID_AGENTS = new Set([
20
+ "cli", "desktop", "autonomous", "local", "cloud", "Unknown",
21
+ "CLI", "DAC", "CODA-1", "Brain_Local", "Brain_Cloud",
19
22
  ]);
23
+ export const AgentIdentitySchema = z.string()
24
+ .refine((val) => VALID_AGENTS.has(val), { message: "Invalid agent identity" })
25
+ .transform((val) => (LEGACY_AGENT_MAP[val] || val));
20
26
  /**
21
27
  * Learning type enum (scar, win, pattern)
22
28
  */
@@ -25,7 +25,7 @@ export const CreateLearningParamsSchema = z
25
25
  keywords: z.array(z.string()).optional(),
26
26
  source_linear_issue: z.string().optional(),
27
27
  project: ProjectSchema.optional(),
28
- // OD-508: LLM-cooperative enforcement fields
28
+ // LLM-cooperative enforcement fields
29
29
  why_this_matters: z.string().optional(),
30
30
  action_protocol: z.array(z.string()).optional(),
31
31
  self_check_criteria: z.array(z.string()).optional(),
@@ -41,7 +41,7 @@ export declare const ClosingReflectionSchema: z.ZodObject<{
41
41
  }>;
42
42
  export type ClosingReflection = z.infer<typeof ClosingReflectionSchema>;
43
43
  /**
44
- * Task completion proof schema (OD-491)
44
+ * Task completion proof schema
45
45
  */
46
46
  export declare const TaskCompletionSchema: z.ZodObject<{
47
47
  questions_displayed_at: z.ZodEffects<z.ZodString, string, string>;
@@ -124,11 +124,8 @@ export declare const ScarUsageEntrySchema: z.ZodObject<{
124
124
  variant_id?: string | undefined;
125
125
  }>;
126
126
  export type ScarUsageEntry = z.infer<typeof ScarUsageEntrySchema>;
127
- /**
128
- * Session close parameters schema
129
- */
130
127
  export declare const SessionCloseParamsSchema: z.ZodObject<{
131
- session_id: z.ZodString;
128
+ session_id: z.ZodEffects<z.ZodString, string, string>;
132
129
  close_type: z.ZodEnum<["standard", "quick", "autonomous", "retroactive"]>;
133
130
  task_completion: z.ZodOptional<z.ZodObject<{
134
131
  questions_displayed_at: z.ZodEffects<z.ZodString, string, string>;
@@ -270,10 +267,10 @@ export declare const SessionCloseParamsSchema: z.ZodObject<{
270
267
  variant_id?: string | undefined;
271
268
  }>, "many">>;
272
269
  capture_transcript: z.ZodOptional<z.ZodBoolean>;
273
- transcript_path: z.ZodOptional<z.ZodString>;
270
+ transcript_path: z.ZodOptional<z.ZodEffects<z.ZodString, string, string>>;
274
271
  }, "strip", z.ZodTypeAny, {
275
272
  session_id: string;
276
- close_type: "standard" | "quick" | "autonomous" | "retroactive";
273
+ close_type: "autonomous" | "standard" | "quick" | "retroactive";
277
274
  decisions?: {
278
275
  title: string;
279
276
  decision: string;
@@ -330,7 +327,7 @@ export declare const SessionCloseParamsSchema: z.ZodObject<{
330
327
  capture_transcript?: boolean | undefined;
331
328
  }, {
332
329
  session_id: string;
333
- close_type: "standard" | "quick" | "autonomous" | "retroactive";
330
+ close_type: "autonomous" | "standard" | "quick" | "retroactive";
334
331
  decisions?: {
335
332
  title: string;
336
333
  decision: string;
@@ -22,7 +22,7 @@ export const ClosingReflectionSchema = z.object({
22
22
  rapport_notes: z.string().optional(),
23
23
  });
24
24
  /**
25
- * Task completion proof schema (OD-491)
25
+ * Task completion proof schema
26
26
  */
27
27
  export const TaskCompletionSchema = z.object({
28
28
  questions_displayed_at: ISOTimestampSchema,
@@ -59,8 +59,12 @@ export const ScarUsageEntrySchema = z.object({
59
59
  /**
60
60
  * Session close parameters schema
61
61
  */
62
+ // Session ID must be UUID or 8-char hex short-ID (no path traversal)
63
+ const SessionIdSchema = z.string().min(1, "session_id is required").refine((val) => /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(val) || /^[0-9a-f]{8}$/i.test(val), { message: "session_id must be a UUID or 8-char hex short-ID" });
64
+ // Transcript path must not contain path traversal sequences
65
+ const SafeTranscriptPathSchema = z.string().refine((val) => !val.includes("..") && !val.includes("\0"), { message: "transcript_path must not contain path traversal sequences" });
62
66
  export const SessionCloseParamsSchema = z.object({
63
- session_id: z.string().min(1, "session_id is required"),
67
+ session_id: SessionIdSchema,
64
68
  close_type: CloseTypeSchema,
65
69
  task_completion: TaskCompletionSchema.optional(),
66
70
  closing_reflection: ClosingReflectionSchema.optional(),
@@ -73,7 +77,7 @@ export const SessionCloseParamsSchema = z.object({
73
77
  ceremony_duration_ms: z.number().nonnegative().optional(),
74
78
  scars_to_record: z.array(ScarUsageEntrySchema).optional(),
75
79
  capture_transcript: z.boolean().optional(),
76
- transcript_path: z.string().optional(),
80
+ transcript_path: SafeTranscriptPathSchema.optional(),
77
81
  });
78
82
  /**
79
83
  * Validate session_close params with close type specific rules
@@ -9,19 +9,19 @@ import { z } from "zod";
9
9
  * and use defaults for project.
10
10
  */
11
11
  export declare const SessionStartParamsSchema: z.ZodObject<{
12
- agent_identity: z.ZodOptional<z.ZodEnum<["CLI", "DAC", "CODA-1", "Brain_Local", "Brain_Cloud", "Unknown"]>>;
12
+ agent_identity: z.ZodOptional<z.ZodEffects<z.ZodEffects<z.ZodString, string, string>, "local" | "cli" | "desktop" | "autonomous" | "cloud" | "Unknown", string>>;
13
13
  linear_issue: z.ZodOptional<z.ZodString>;
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
17
  project: z.ZodOptional<z.ZodDefault<z.ZodString>>;
18
- /** OD-558: Force overwrite of existing active session */
18
+ /** Force overwrite of existing active session */
19
19
  force: z.ZodOptional<z.ZodBoolean>;
20
20
  }, "strip", z.ZodTypeAny, {
21
21
  project?: string | undefined;
22
22
  linear_issue?: string | undefined;
23
23
  force?: boolean | undefined;
24
- agent_identity?: "CLI" | "DAC" | "CODA-1" | "Brain_Local" | "Brain_Cloud" | "Unknown" | undefined;
24
+ agent_identity?: "local" | "cli" | "desktop" | "autonomous" | "cloud" | "Unknown" | undefined;
25
25
  issue_title?: string | undefined;
26
26
  issue_description?: string | undefined;
27
27
  issue_labels?: string[] | undefined;
@@ -29,7 +29,7 @@ export declare const SessionStartParamsSchema: z.ZodObject<{
29
29
  project?: string | undefined;
30
30
  linear_issue?: string | undefined;
31
31
  force?: boolean | undefined;
32
- agent_identity?: "CLI" | "DAC" | "CODA-1" | "Brain_Local" | "Brain_Cloud" | "Unknown" | undefined;
32
+ agent_identity?: string | undefined;
33
33
  issue_title?: string | undefined;
34
34
  issue_description?: string | undefined;
35
35
  issue_labels?: string[] | undefined;
@@ -16,7 +16,7 @@ export const SessionStartParamsSchema = z.object({
16
16
  issue_description: z.string().optional(),
17
17
  issue_labels: z.array(z.string()).optional(),
18
18
  project: ProjectSchema.optional(),
19
- /** OD-558: Force overwrite of existing active session */
19
+ /** Force overwrite of existing active session */
20
20
  force: z.boolean().optional(),
21
21
  });
22
22
  /**
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Zod schemas for thread lifecycle tools (OD-thread-lifecycle)
2
+ * Zod schemas for thread lifecycle tools
3
3
  */
4
4
  import { z } from "zod";
5
5
  /**
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Zod schemas for thread lifecycle tools (OD-thread-lifecycle)
2
+ * Zod schemas for thread lifecycle tools
3
3
  */
4
4
  import { z } from "zod";
5
5
  import { ProjectSchema } from "./common.js";
package/dist/server.d.ts CHANGED
@@ -12,8 +12,8 @@ export declare function createServer(): Server;
12
12
  /**
13
13
  * Run the server with stdio transport
14
14
  *
15
- * OD-473: Initializes local vector search in background for fast startup.
16
- * OD-489: Uses direct Supabase queries to get embeddings for local cache.
15
+ * Initializes local vector search in background for fast startup.
16
+ * Uses direct Supabase queries to get embeddings for local cache.
17
17
  *
18
18
  * Server starts immediately; cache loads in background.
19
19
  * First few queries may use Supabase fallback until cache is ready.
package/dist/server.js CHANGED
@@ -43,7 +43,7 @@ import { validateToolArgs } from "./schemas/registry.js";
43
43
  export function createServer() {
44
44
  const server = new Server({
45
45
  name: "gitmem-mcp",
46
- version: "0.1.0",
46
+ version: "1.0.3",
47
47
  }, {
48
48
  capabilities: {
49
49
  tools: {},
@@ -207,6 +207,7 @@ export function createServer() {
207
207
  { alias: "gitmem-r", full: "recall", description: "Check scars before taking action" },
208
208
  { alias: "gitmem-cs", full: "confirm_scars", description: "Confirm recalled scars (APPLYING/N_A/REFUTED)" },
209
209
  { alias: "gitmem-ss", full: "session_start", description: "Initialize session with context" },
210
+ { alias: "gitmem-sr", full: "session_refresh", description: "Refresh context for active session" },
210
211
  { alias: "gitmem-sc", full: "session_close", description: "Close session with compliance validation" },
211
212
  { alias: "gitmem-cl", full: "create_learning", description: "Create scar/win/pattern entry" },
212
213
  { alias: "gitmem-cd", full: "create_decision", description: "Log architectural/operational decision" },
@@ -223,6 +224,7 @@ export function createServer() {
223
224
  { alias: "gitmem-cleanup", full: "cleanup_threads", description: "Triage threads by lifecycle health" },
224
225
  { alias: "gitmem-health", full: "health", description: "Show write health for fire-and-forget operations" },
225
226
  { alias: "gitmem-al", full: "archive_learning", description: "Archive a scar/win/pattern (is_active=false)" },
227
+ { alias: "gitmem-graph", full: "graph_traverse", description: "Traverse knowledge graph over institutional memory" },
226
228
  ];
227
229
  if (hasBatchOperations()) {
228
230
  commands.push({ alias: "gitmem-rsb", full: "record_scar_usage_batch", description: "Track multiple scars (batch)" });
@@ -233,10 +235,12 @@ export function createServer() {
233
235
  if (hasCacheManagement()) {
234
236
  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" });
235
237
  }
238
+ // Filter to only show commands whose canonical tool is actually registered
239
+ const visibleCommands = commands.filter(c => registeredToolNames.has(c.full));
236
240
  // Build command table for display
237
- const cmdLines = commands.map(c => ` ${c.alias.padEnd(22)} ${c.description}`).join("\n");
241
+ const cmdLines = visibleCommands.map(c => ` ${c.alias.padEnd(22)} ${c.description}`).join("\n");
238
242
  const display = [
239
- `gitmem v0.1.0 · ${tier} · ${registeredTools.length} tools · ${hasSupabase() ? "supabase" : "local (.gitmem/)"}`,
243
+ `gitmem v1.0.3 · ${tier} · ${registeredTools.length} tools · ${hasSupabase() ? "supabase" : "local (.gitmem/)"}`,
240
244
  "Memory that compounds.",
241
245
  "",
242
246
  cmdLines,
@@ -248,11 +252,11 @@ export function createServer() {
248
252
  "Tool results are collapsed in the CLI — the user cannot see them unless you echo them.",
249
253
  ].join("\n");
250
254
  result = {
251
- version: "0.1.0",
255
+ version: "1.0.3",
252
256
  tier,
253
257
  tools_registered: registeredTools.length,
254
258
  storage: hasSupabase() ? "supabase" : "local (.gitmem/)",
255
- commands,
259
+ commands: visibleCommands,
256
260
  display,
257
261
  };
258
262
  break;
@@ -277,7 +281,7 @@ export function createServer() {
277
281
  case "gm-graph":
278
282
  result = await graphTraverse(toolArgs);
279
283
  break;
280
- // Cache management tools (OD-473)
284
+ // Cache management tools
281
285
  case "gitmem-cache-status":
282
286
  case "gm-cache-s":
283
287
  result = getCacheStatus(toolArgs.project || getProject() || "default");
@@ -319,12 +323,19 @@ export function createServer() {
319
323
  };
320
324
  }
321
325
  catch (error) {
322
- const message = error instanceof Error ? error.message : String(error);
326
+ const rawMessage = error instanceof Error ? error.message : String(error);
327
+ // Redact internal details: file paths, SQL errors, stack traces
328
+ const safeMessage = rawMessage
329
+ .replace(/\/[^\s:]+/g, "[path]") // redact file paths
330
+ .replace(/\b\d{5}\b/g, "[code]") // redact PG error codes
331
+ .replace(/at\s+\S+\s+\(.+\)/g, "") // strip stack frames
332
+ .slice(0, 200); // cap length
333
+ console.error(`[server] Tool error:`, rawMessage);
323
334
  return {
324
335
  content: [
325
336
  {
326
337
  type: "text",
327
- text: JSON.stringify({ error: message }),
338
+ text: JSON.stringify({ error: safeMessage }),
328
339
  },
329
340
  ],
330
341
  isError: true,
@@ -336,8 +347,8 @@ export function createServer() {
336
347
  /**
337
348
  * Run the server with stdio transport
338
349
  *
339
- * OD-473: Initializes local vector search in background for fast startup.
340
- * OD-489: Uses direct Supabase queries to get embeddings for local cache.
350
+ * Initializes local vector search in background for fast startup.
351
+ * Uses direct Supabase queries to get embeddings for local cache.
341
352
  *
342
353
  * Server starts immediately; cache loads in background.
343
354
  * First few queries may use Supabase fallback until cache is ready.
@@ -13,7 +13,7 @@
13
13
  import * as fs from "fs";
14
14
  import * as path from "path";
15
15
  import * as os from "os";
16
- import { getGitmemDir, getSessionPath } from "./gitmem-dir.js";
16
+ import { getGitmemDir, getSessionPath, sanitizePathComponent } from "./gitmem-dir.js";
17
17
  import { ActiveSessionsRegistrySchema } from "../schemas/active-sessions.js";
18
18
  import { withLockSync } from "./file-lock.js";
19
19
  const REGISTRY_FILENAME = "active-sessions.json";
@@ -276,6 +276,7 @@ function pruneOrphanedDirs(gitmemDir, registry) {
276
276
  */
277
277
  function cleanupSessionDir(gitmemDir, sessionId) {
278
278
  try {
279
+ sanitizePathComponent(sessionId, "sessionId");
279
280
  const sessionDir = path.join(gitmemDir, "sessions", sessionId);
280
281
  if (fs.existsSync(sessionDir)) {
281
282
  fs.rmSync(sessionDir, { recursive: true, force: true });
@@ -328,7 +329,7 @@ export function migrateFromLegacy() {
328
329
  // 2. Create registry with single entry
329
330
  const entry = {
330
331
  session_id: old.session_id,
331
- agent: old.agent || "CLI",
332
+ agent: old.agent || "cli",
332
333
  started_at: old.started_at || new Date().toISOString(),
333
334
  hostname: old.hostname || os.hostname(),
334
335
  pid: old.pid || process.pid,
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Agent Briefing Generator (OD-689)
2
+ * Agent Briefing Generator
3
3
  *
4
4
  * Generates `.gitmem/agent-briefing.md` at session close with a
5
5
  * compact summary of memory state. Designed for inclusion in
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Agent Briefing Generator (OD-689)
2
+ * Agent Briefing Generator
3
3
  *
4
4
  * Generates `.gitmem/agent-briefing.md` at session close with a
5
5
  * compact summary of memory state. Designed for inclusion in
@@ -18,6 +18,7 @@ import type { AgentIdentity, DetectedEnvironment } from "../types/index.js";
18
18
  * Detect the current agent identity based on environment
19
19
  */
20
20
  export declare function detectAgent(): DetectedEnvironment;
21
+ export declare function normalizeAgent(input: string): AgentIdentity;
21
22
  /**
22
23
  * Get just the agent identity (convenience function)
23
24
  */