gitmem-mcp 0.2.0

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 (316) hide show
  1. package/CHANGELOG.md +47 -0
  2. package/CLAUDE.md.template +65 -0
  3. package/LICENSE +21 -0
  4. package/README.md +221 -0
  5. package/bin/gitmem.js +383 -0
  6. package/dist/commands/check.d.ts +33 -0
  7. package/dist/commands/check.d.ts.map +1 -0
  8. package/dist/commands/check.js +492 -0
  9. package/dist/commands/check.js.map +1 -0
  10. package/dist/constants/closing-questions.d.ts +40 -0
  11. package/dist/constants/closing-questions.d.ts.map +1 -0
  12. package/dist/constants/closing-questions.js +107 -0
  13. package/dist/constants/closing-questions.js.map +1 -0
  14. package/dist/diagnostics/anonymizer.d.ts +55 -0
  15. package/dist/diagnostics/anonymizer.d.ts.map +1 -0
  16. package/dist/diagnostics/anonymizer.js +191 -0
  17. package/dist/diagnostics/anonymizer.js.map +1 -0
  18. package/dist/diagnostics/channels.d.ts +132 -0
  19. package/dist/diagnostics/channels.d.ts.map +1 -0
  20. package/dist/diagnostics/channels.js +150 -0
  21. package/dist/diagnostics/channels.js.map +1 -0
  22. package/dist/diagnostics/collector.d.ts +183 -0
  23. package/dist/diagnostics/collector.d.ts.map +1 -0
  24. package/dist/diagnostics/collector.js +227 -0
  25. package/dist/diagnostics/collector.js.map +1 -0
  26. package/dist/diagnostics/index.d.ts +28 -0
  27. package/dist/diagnostics/index.d.ts.map +1 -0
  28. package/dist/diagnostics/index.js +31 -0
  29. package/dist/diagnostics/index.js.map +1 -0
  30. package/dist/index.d.ts +13 -0
  31. package/dist/index.d.ts.map +1 -0
  32. package/dist/index.js +18 -0
  33. package/dist/index.js.map +1 -0
  34. package/dist/schemas/absorb-observations.d.ts +63 -0
  35. package/dist/schemas/absorb-observations.d.ts.map +1 -0
  36. package/dist/schemas/absorb-observations.js +25 -0
  37. package/dist/schemas/absorb-observations.js.map +1 -0
  38. package/dist/schemas/active-sessions.d.ts +71 -0
  39. package/dist/schemas/active-sessions.d.ts.map +1 -0
  40. package/dist/schemas/active-sessions.js +19 -0
  41. package/dist/schemas/active-sessions.js.map +1 -0
  42. package/dist/schemas/analyze.d.ts +38 -0
  43. package/dist/schemas/analyze.d.ts.map +1 -0
  44. package/dist/schemas/analyze.js +30 -0
  45. package/dist/schemas/analyze.js.map +1 -0
  46. package/dist/schemas/common.d.ts +55 -0
  47. package/dist/schemas/common.d.ts.map +1 -0
  48. package/dist/schemas/common.js +65 -0
  49. package/dist/schemas/common.js.map +1 -0
  50. package/dist/schemas/create-decision.d.ts +48 -0
  51. package/dist/schemas/create-decision.d.ts.map +1 -0
  52. package/dist/schemas/create-decision.js +31 -0
  53. package/dist/schemas/create-decision.js.map +1 -0
  54. package/dist/schemas/create-learning.d.ts +107 -0
  55. package/dist/schemas/create-learning.d.ts.map +1 -0
  56. package/dist/schemas/create-learning.js +64 -0
  57. package/dist/schemas/create-learning.js.map +1 -0
  58. package/dist/schemas/get-transcript.d.ts +24 -0
  59. package/dist/schemas/get-transcript.d.ts.map +1 -0
  60. package/dist/schemas/get-transcript.js +22 -0
  61. package/dist/schemas/get-transcript.js.map +1 -0
  62. package/dist/schemas/index.d.ts +23 -0
  63. package/dist/schemas/index.d.ts.map +1 -0
  64. package/dist/schemas/index.js +23 -0
  65. package/dist/schemas/index.js.map +1 -0
  66. package/dist/schemas/log.d.ts +36 -0
  67. package/dist/schemas/log.d.ts.map +1 -0
  68. package/dist/schemas/log.js +27 -0
  69. package/dist/schemas/log.js.map +1 -0
  70. package/dist/schemas/prepare-context.d.ts +41 -0
  71. package/dist/schemas/prepare-context.d.ts.map +1 -0
  72. package/dist/schemas/prepare-context.js +31 -0
  73. package/dist/schemas/prepare-context.js.map +1 -0
  74. package/dist/schemas/recall.d.ts +41 -0
  75. package/dist/schemas/recall.d.ts.map +1 -0
  76. package/dist/schemas/recall.js +47 -0
  77. package/dist/schemas/recall.js.map +1 -0
  78. package/dist/schemas/record-scar-usage-batch.d.ts +82 -0
  79. package/dist/schemas/record-scar-usage-batch.d.ts.map +1 -0
  80. package/dist/schemas/record-scar-usage-batch.js +25 -0
  81. package/dist/schemas/record-scar-usage-batch.js.map +1 -0
  82. package/dist/schemas/record-scar-usage.d.ts +51 -0
  83. package/dist/schemas/record-scar-usage.d.ts.map +1 -0
  84. package/dist/schemas/record-scar-usage.js +32 -0
  85. package/dist/schemas/record-scar-usage.js.map +1 -0
  86. package/dist/schemas/save-transcript.d.ts +38 -0
  87. package/dist/schemas/save-transcript.d.ts.map +1 -0
  88. package/dist/schemas/save-transcript.js +30 -0
  89. package/dist/schemas/save-transcript.js.map +1 -0
  90. package/dist/schemas/search.d.ts +36 -0
  91. package/dist/schemas/search.d.ts.map +1 -0
  92. package/dist/schemas/search.js +27 -0
  93. package/dist/schemas/search.js.map +1 -0
  94. package/dist/schemas/session-close.d.ts +371 -0
  95. package/dist/schemas/session-close.d.ts.map +1 -0
  96. package/dist/schemas/session-close.js +95 -0
  97. package/dist/schemas/session-close.js.map +1 -0
  98. package/dist/schemas/session-start.d.ts +46 -0
  99. package/dist/schemas/session-start.d.ts.map +1 -0
  100. package/dist/schemas/session-start.js +33 -0
  101. package/dist/schemas/session-start.js.map +1 -0
  102. package/dist/schemas/thread.d.ts +72 -0
  103. package/dist/schemas/thread.d.ts.map +1 -0
  104. package/dist/schemas/thread.js +39 -0
  105. package/dist/schemas/thread.js.map +1 -0
  106. package/dist/server.d.ts +22 -0
  107. package/dist/server.d.ts.map +1 -0
  108. package/dist/server.js +313 -0
  109. package/dist/server.js.map +1 -0
  110. package/dist/services/active-sessions.d.ts +66 -0
  111. package/dist/services/active-sessions.d.ts.map +1 -0
  112. package/dist/services/active-sessions.js +311 -0
  113. package/dist/services/active-sessions.js.map +1 -0
  114. package/dist/services/agent-detection.d.ts +25 -0
  115. package/dist/services/agent-detection.d.ts.map +1 -0
  116. package/dist/services/agent-detection.js +93 -0
  117. package/dist/services/agent-detection.js.map +1 -0
  118. package/dist/services/analytics.d.ts +201 -0
  119. package/dist/services/analytics.d.ts.map +1 -0
  120. package/dist/services/analytics.js +483 -0
  121. package/dist/services/analytics.js.map +1 -0
  122. package/dist/services/cache.d.ts +148 -0
  123. package/dist/services/cache.d.ts.map +1 -0
  124. package/dist/services/cache.js +384 -0
  125. package/dist/services/cache.js.map +1 -0
  126. package/dist/services/cache.test.d.ts +8 -0
  127. package/dist/services/cache.test.d.ts.map +1 -0
  128. package/dist/services/cache.test.js +267 -0
  129. package/dist/services/cache.test.js.map +1 -0
  130. package/dist/services/compliance-validator.d.ts +30 -0
  131. package/dist/services/compliance-validator.d.ts.map +1 -0
  132. package/dist/services/compliance-validator.js +257 -0
  133. package/dist/services/compliance-validator.js.map +1 -0
  134. package/dist/services/config.d.ts +48 -0
  135. package/dist/services/config.d.ts.map +1 -0
  136. package/dist/services/config.js +128 -0
  137. package/dist/services/config.js.map +1 -0
  138. package/dist/services/embedding.d.ts +58 -0
  139. package/dist/services/embedding.d.ts.map +1 -0
  140. package/dist/services/embedding.js +243 -0
  141. package/dist/services/embedding.js.map +1 -0
  142. package/dist/services/gitmem-dir.d.ts +38 -0
  143. package/dist/services/gitmem-dir.d.ts.map +1 -0
  144. package/dist/services/gitmem-dir.js +84 -0
  145. package/dist/services/gitmem-dir.js.map +1 -0
  146. package/dist/services/local-file-storage.d.ts +56 -0
  147. package/dist/services/local-file-storage.d.ts.map +1 -0
  148. package/dist/services/local-file-storage.js +213 -0
  149. package/dist/services/local-file-storage.js.map +1 -0
  150. package/dist/services/local-vector-search.d.ts +137 -0
  151. package/dist/services/local-vector-search.d.ts.map +1 -0
  152. package/dist/services/local-vector-search.js +311 -0
  153. package/dist/services/local-vector-search.js.map +1 -0
  154. package/dist/services/metrics.d.ts +104 -0
  155. package/dist/services/metrics.d.ts.map +1 -0
  156. package/dist/services/metrics.js +264 -0
  157. package/dist/services/metrics.js.map +1 -0
  158. package/dist/services/session-state.d.ts +113 -0
  159. package/dist/services/session-state.d.ts.map +1 -0
  160. package/dist/services/session-state.js +203 -0
  161. package/dist/services/session-state.js.map +1 -0
  162. package/dist/services/startup.d.ts +112 -0
  163. package/dist/services/startup.d.ts.map +1 -0
  164. package/dist/services/startup.js +436 -0
  165. package/dist/services/startup.js.map +1 -0
  166. package/dist/services/storage.d.ts +43 -0
  167. package/dist/services/storage.d.ts.map +1 -0
  168. package/dist/services/storage.js +92 -0
  169. package/dist/services/storage.js.map +1 -0
  170. package/dist/services/supabase-client.d.ts +163 -0
  171. package/dist/services/supabase-client.d.ts.map +1 -0
  172. package/dist/services/supabase-client.js +510 -0
  173. package/dist/services/supabase-client.js.map +1 -0
  174. package/dist/services/thread-dedup.d.ts +44 -0
  175. package/dist/services/thread-dedup.d.ts.map +1 -0
  176. package/dist/services/thread-dedup.js +113 -0
  177. package/dist/services/thread-dedup.js.map +1 -0
  178. package/dist/services/thread-manager.d.ts +77 -0
  179. package/dist/services/thread-manager.d.ts.map +1 -0
  180. package/dist/services/thread-manager.js +250 -0
  181. package/dist/services/thread-manager.js.map +1 -0
  182. package/dist/services/thread-suggestions.d.ts +66 -0
  183. package/dist/services/thread-suggestions.d.ts.map +1 -0
  184. package/dist/services/thread-suggestions.js +243 -0
  185. package/dist/services/thread-suggestions.js.map +1 -0
  186. package/dist/services/thread-supabase.d.ts +111 -0
  187. package/dist/services/thread-supabase.d.ts.map +1 -0
  188. package/dist/services/thread-supabase.js +459 -0
  189. package/dist/services/thread-supabase.js.map +1 -0
  190. package/dist/services/thread-vitality.d.ts +65 -0
  191. package/dist/services/thread-vitality.d.ts.map +1 -0
  192. package/dist/services/thread-vitality.js +143 -0
  193. package/dist/services/thread-vitality.js.map +1 -0
  194. package/dist/services/tier.d.ts +52 -0
  195. package/dist/services/tier.d.ts.map +1 -0
  196. package/dist/services/tier.js +109 -0
  197. package/dist/services/tier.js.map +1 -0
  198. package/dist/services/timezone.d.ts +37 -0
  199. package/dist/services/timezone.d.ts.map +1 -0
  200. package/dist/services/timezone.js +147 -0
  201. package/dist/services/timezone.js.map +1 -0
  202. package/dist/services/transcript-chunker.d.ts +18 -0
  203. package/dist/services/transcript-chunker.d.ts.map +1 -0
  204. package/dist/services/transcript-chunker.js +237 -0
  205. package/dist/services/transcript-chunker.js.map +1 -0
  206. package/dist/services/triple-writer.d.ts +128 -0
  207. package/dist/services/triple-writer.d.ts.map +1 -0
  208. package/dist/services/triple-writer.js +338 -0
  209. package/dist/services/triple-writer.js.map +1 -0
  210. package/dist/services/variant-assignment.d.ts +92 -0
  211. package/dist/services/variant-assignment.d.ts.map +1 -0
  212. package/dist/services/variant-assignment.js +196 -0
  213. package/dist/services/variant-assignment.js.map +1 -0
  214. package/dist/tools/absorb-observations.d.ts +16 -0
  215. package/dist/tools/absorb-observations.d.ts.map +1 -0
  216. package/dist/tools/absorb-observations.js +82 -0
  217. package/dist/tools/absorb-observations.js.map +1 -0
  218. package/dist/tools/analyze.d.ts +55 -0
  219. package/dist/tools/analyze.d.ts.map +1 -0
  220. package/dist/tools/analyze.js +139 -0
  221. package/dist/tools/analyze.js.map +1 -0
  222. package/dist/tools/cleanup-threads.d.ts +47 -0
  223. package/dist/tools/cleanup-threads.d.ts.map +1 -0
  224. package/dist/tools/cleanup-threads.js +127 -0
  225. package/dist/tools/cleanup-threads.js.map +1 -0
  226. package/dist/tools/confirm-scars.d.ts +23 -0
  227. package/dist/tools/confirm-scars.d.ts.map +1 -0
  228. package/dist/tools/confirm-scars.js +209 -0
  229. package/dist/tools/confirm-scars.js.map +1 -0
  230. package/dist/tools/create-decision.d.ts +15 -0
  231. package/dist/tools/create-decision.d.ts.map +1 -0
  232. package/dist/tools/create-decision.js +138 -0
  233. package/dist/tools/create-decision.js.map +1 -0
  234. package/dist/tools/create-learning.d.ts +15 -0
  235. package/dist/tools/create-learning.d.ts.map +1 -0
  236. package/dist/tools/create-learning.js +226 -0
  237. package/dist/tools/create-learning.js.map +1 -0
  238. package/dist/tools/create-thread.d.ts +42 -0
  239. package/dist/tools/create-thread.d.ts.map +1 -0
  240. package/dist/tools/create-thread.js +180 -0
  241. package/dist/tools/create-thread.js.map +1 -0
  242. package/dist/tools/definitions.d.ts +5013 -0
  243. package/dist/tools/definitions.d.ts.map +1 -0
  244. package/dist/tools/definitions.js +2017 -0
  245. package/dist/tools/definitions.js.map +1 -0
  246. package/dist/tools/dismiss-suggestion.d.ts +20 -0
  247. package/dist/tools/dismiss-suggestion.d.ts.map +1 -0
  248. package/dist/tools/dismiss-suggestion.js +40 -0
  249. package/dist/tools/dismiss-suggestion.js.map +1 -0
  250. package/dist/tools/get-transcript.d.ts +24 -0
  251. package/dist/tools/get-transcript.d.ts.map +1 -0
  252. package/dist/tools/get-transcript.js +52 -0
  253. package/dist/tools/get-transcript.js.map +1 -0
  254. package/dist/tools/graph-traverse.d.ts +83 -0
  255. package/dist/tools/graph-traverse.d.ts.map +1 -0
  256. package/dist/tools/graph-traverse.js +394 -0
  257. package/dist/tools/graph-traverse.js.map +1 -0
  258. package/dist/tools/list-threads.d.ts +15 -0
  259. package/dist/tools/list-threads.d.ts.map +1 -0
  260. package/dist/tools/list-threads.js +114 -0
  261. package/dist/tools/list-threads.js.map +1 -0
  262. package/dist/tools/log.d.ts +43 -0
  263. package/dist/tools/log.d.ts.map +1 -0
  264. package/dist/tools/log.js +157 -0
  265. package/dist/tools/log.js.map +1 -0
  266. package/dist/tools/prepare-context.d.ts +36 -0
  267. package/dist/tools/prepare-context.d.ts.map +1 -0
  268. package/dist/tools/prepare-context.js +353 -0
  269. package/dist/tools/prepare-context.js.map +1 -0
  270. package/dist/tools/promote-suggestion.d.ts +25 -0
  271. package/dist/tools/promote-suggestion.d.ts.map +1 -0
  272. package/dist/tools/promote-suggestion.js +60 -0
  273. package/dist/tools/promote-suggestion.js.map +1 -0
  274. package/dist/tools/recall.d.ts +77 -0
  275. package/dist/tools/recall.d.ts.map +1 -0
  276. package/dist/tools/recall.js +423 -0
  277. package/dist/tools/recall.js.map +1 -0
  278. package/dist/tools/recall.test.d.ts +5 -0
  279. package/dist/tools/recall.test.d.ts.map +1 -0
  280. package/dist/tools/recall.test.js +155 -0
  281. package/dist/tools/recall.test.js.map +1 -0
  282. package/dist/tools/record-scar-usage-batch.d.ts +10 -0
  283. package/dist/tools/record-scar-usage-batch.d.ts.map +1 -0
  284. package/dist/tools/record-scar-usage-batch.js +153 -0
  285. package/dist/tools/record-scar-usage-batch.js.map +1 -0
  286. package/dist/tools/record-scar-usage.d.ts +14 -0
  287. package/dist/tools/record-scar-usage.d.ts.map +1 -0
  288. package/dist/tools/record-scar-usage.js +94 -0
  289. package/dist/tools/record-scar-usage.js.map +1 -0
  290. package/dist/tools/resolve-thread.d.ts +16 -0
  291. package/dist/tools/resolve-thread.d.ts.map +1 -0
  292. package/dist/tools/resolve-thread.js +102 -0
  293. package/dist/tools/resolve-thread.js.map +1 -0
  294. package/dist/tools/save-transcript.d.ts +29 -0
  295. package/dist/tools/save-transcript.d.ts.map +1 -0
  296. package/dist/tools/save-transcript.js +97 -0
  297. package/dist/tools/save-transcript.js.map +1 -0
  298. package/dist/tools/search.d.ts +46 -0
  299. package/dist/tools/search.d.ts.map +1 -0
  300. package/dist/tools/search.js +186 -0
  301. package/dist/tools/search.js.map +1 -0
  302. package/dist/tools/session-close.d.ts +14 -0
  303. package/dist/tools/session-close.d.ts.map +1 -0
  304. package/dist/tools/session-close.js +881 -0
  305. package/dist/tools/session-close.js.map +1 -0
  306. package/dist/tools/session-start.d.ts +38 -0
  307. package/dist/tools/session-start.d.ts.map +1 -0
  308. package/dist/tools/session-start.js +1104 -0
  309. package/dist/tools/session-start.js.map +1 -0
  310. package/dist/types/index.d.ts +456 -0
  311. package/dist/types/index.d.ts.map +1 -0
  312. package/dist/types/index.js +5 -0
  313. package/dist/types/index.js.map +1 -0
  314. package/package.json +76 -0
  315. package/schema/setup.sql +193 -0
  316. package/schema/starter-scars.json +206 -0
@@ -0,0 +1,492 @@
1
+ /**
2
+ * GitMem Check Command
3
+ *
4
+ * Diagnostic CLI command for health checks and benchmarks.
5
+ *
6
+ * Usage:
7
+ * npx gitmem check — Quick health check (~5s)
8
+ * npx gitmem check --full — Full diagnostic (~30s)
9
+ * npx gitmem check --output report.json
10
+ *
11
+ * Issue: OD-584
12
+ */
13
+ import { existsSync, mkdirSync, writeFileSync, readdirSync, statSync } from "fs";
14
+ import { join } from "path";
15
+ import { DiagnosticsCollector, runBenchmark, anonymizeSupabaseUrl, anonymizePath, isApiKeyConfigured, getSafeEnvironmentInfo, } from "../diagnostics/index.js";
16
+ import { getCache, CacheService } from "../services/cache.js";
17
+ import { getTier, hasSupabase } from "../services/tier.js";
18
+ // Report version for schema compatibility
19
+ const REPORT_VERSION = "1.0.0";
20
+ /**
21
+ * Parse command line arguments
22
+ */
23
+ export function parseArgs(args) {
24
+ const options = {
25
+ full: false,
26
+ };
27
+ for (let i = 0; i < args.length; i++) {
28
+ const arg = args[i];
29
+ if (arg === "--full" || arg === "-f") {
30
+ options.full = true;
31
+ }
32
+ else if (arg === "--output" || arg === "-o") {
33
+ options.output = args[i + 1];
34
+ i++;
35
+ }
36
+ }
37
+ return options;
38
+ }
39
+ /**
40
+ * Run quick health check (~5s)
41
+ */
42
+ async function runQuickCheck() {
43
+ const health = {
44
+ supabase: { status: "skip", message: "Not checked" },
45
+ embedding: { status: "skip", message: "Not checked" },
46
+ cache: { status: "skip", message: "Not checked" },
47
+ recall: { status: "skip", message: "Not checked" },
48
+ write: { status: "skip", message: "Not checked" },
49
+ };
50
+ // Detect tier and configuration
51
+ const tier = getTier();
52
+ const supabaseUrl = process.env.SUPABASE_URL;
53
+ const supabaseKey = process.env.SUPABASE_SERVICE_ROLE_KEY;
54
+ const openaiKey = process.env.OPENAI_API_KEY;
55
+ const openrouterKey = process.env.OPENROUTER_API_KEY;
56
+ const ollamaUrl = process.env.OLLAMA_URL;
57
+ // Determine embedding provider
58
+ let embeddingProvider = "none";
59
+ let embeddingConfigured = false;
60
+ if (isApiKeyConfigured(openaiKey)) {
61
+ embeddingProvider = "openai";
62
+ embeddingConfigured = true;
63
+ }
64
+ else if (isApiKeyConfigured(openrouterKey)) {
65
+ embeddingProvider = "openrouter";
66
+ embeddingConfigured = true;
67
+ }
68
+ else if (ollamaUrl) {
69
+ embeddingProvider = "ollama";
70
+ embeddingConfigured = true;
71
+ }
72
+ // Cache check
73
+ const cache = getCache();
74
+ const cacheEnabled = cache.isEnabled();
75
+ const cachePath = process.env.GITMEM_CACHE_DIR ||
76
+ (process.env.HOME ? `${process.env.HOME}/.cache/gitmem` : "/tmp/gitmem-cache");
77
+ const configuration = {
78
+ supabaseConfigured: hasSupabase(),
79
+ supabaseUrl: anonymizeSupabaseUrl(supabaseUrl),
80
+ embeddingProvider,
81
+ embeddingConfigured,
82
+ cacheEnabled,
83
+ cachePath: anonymizePath(cachePath),
84
+ };
85
+ // Health check: Cache
86
+ if (cacheEnabled) {
87
+ try {
88
+ const startTime = Date.now();
89
+ const stats = await cache.getStats();
90
+ const durationMs = Date.now() - startTime;
91
+ health.cache = {
92
+ status: "pass",
93
+ message: `Cache operational (${stats.resultCount} entries, ${Math.round(stats.resultBytes / 1024)}KB)`,
94
+ durationMs,
95
+ };
96
+ }
97
+ catch (error) {
98
+ health.cache = {
99
+ status: "fail",
100
+ message: `Cache error: ${error instanceof Error ? error.message : String(error)}`,
101
+ };
102
+ }
103
+ }
104
+ else {
105
+ health.cache = {
106
+ status: "skip",
107
+ message: "Cache disabled",
108
+ };
109
+ }
110
+ // Health check: Supabase connection
111
+ if (hasSupabase()) {
112
+ try {
113
+ const startTime = Date.now();
114
+ // Try to fetch from Supabase REST API
115
+ const restUrl = `${supabaseUrl}/rest/v1/gitmem_learnings?select=id&limit=1`;
116
+ const response = await fetch(restUrl, {
117
+ headers: {
118
+ apikey: supabaseKey,
119
+ Authorization: `Bearer ${supabaseKey}`,
120
+ },
121
+ });
122
+ const durationMs = Date.now() - startTime;
123
+ if (response.ok) {
124
+ health.supabase = {
125
+ status: "pass",
126
+ message: "Supabase connection successful",
127
+ durationMs,
128
+ };
129
+ }
130
+ else {
131
+ health.supabase = {
132
+ status: "fail",
133
+ message: `Supabase returned ${response.status}: ${response.statusText}`,
134
+ durationMs,
135
+ };
136
+ }
137
+ }
138
+ catch (error) {
139
+ health.supabase = {
140
+ status: "fail",
141
+ message: `Supabase connection failed: ${error instanceof Error ? error.message : String(error)}`,
142
+ };
143
+ }
144
+ }
145
+ else {
146
+ health.supabase = {
147
+ status: "skip",
148
+ message: "Supabase not configured (free tier)",
149
+ };
150
+ }
151
+ // Health check: Embedding provider
152
+ if (embeddingConfigured) {
153
+ if (embeddingProvider === "openai") {
154
+ try {
155
+ const startTime = Date.now();
156
+ const response = await fetch("https://api.openai.com/v1/models", {
157
+ headers: {
158
+ Authorization: `Bearer ${openaiKey}`,
159
+ },
160
+ });
161
+ const durationMs = Date.now() - startTime;
162
+ if (response.ok) {
163
+ health.embedding = {
164
+ status: "pass",
165
+ message: "OpenAI API accessible",
166
+ durationMs,
167
+ };
168
+ }
169
+ else {
170
+ health.embedding = {
171
+ status: "fail",
172
+ message: `OpenAI API returned ${response.status}`,
173
+ durationMs,
174
+ };
175
+ }
176
+ }
177
+ catch (error) {
178
+ health.embedding = {
179
+ status: "fail",
180
+ message: `OpenAI connection failed: ${error instanceof Error ? error.message : String(error)}`,
181
+ };
182
+ }
183
+ }
184
+ else if (embeddingProvider === "openrouter") {
185
+ try {
186
+ const startTime = Date.now();
187
+ const response = await fetch("https://openrouter.ai/api/v1/models", {
188
+ headers: {
189
+ Authorization: `Bearer ${openrouterKey}`,
190
+ },
191
+ });
192
+ const durationMs = Date.now() - startTime;
193
+ if (response.ok) {
194
+ health.embedding = {
195
+ status: "pass",
196
+ message: "OpenRouter API accessible",
197
+ durationMs,
198
+ };
199
+ }
200
+ else {
201
+ health.embedding = {
202
+ status: "fail",
203
+ message: `OpenRouter API returned ${response.status}`,
204
+ durationMs,
205
+ };
206
+ }
207
+ }
208
+ catch (error) {
209
+ health.embedding = {
210
+ status: "fail",
211
+ message: `OpenRouter connection failed: ${error instanceof Error ? error.message : String(error)}`,
212
+ };
213
+ }
214
+ }
215
+ else if (embeddingProvider === "ollama") {
216
+ try {
217
+ const startTime = Date.now();
218
+ const response = await fetch(`${ollamaUrl}/api/tags`);
219
+ const durationMs = Date.now() - startTime;
220
+ if (response.ok) {
221
+ health.embedding = {
222
+ status: "pass",
223
+ message: "Ollama server accessible",
224
+ durationMs,
225
+ };
226
+ }
227
+ else {
228
+ health.embedding = {
229
+ status: "fail",
230
+ message: `Ollama server returned ${response.status}`,
231
+ durationMs,
232
+ };
233
+ }
234
+ }
235
+ catch (error) {
236
+ health.embedding = {
237
+ status: "fail",
238
+ message: `Ollama connection failed: ${error instanceof Error ? error.message : String(error)}`,
239
+ };
240
+ }
241
+ }
242
+ }
243
+ else {
244
+ health.embedding = {
245
+ status: "skip",
246
+ message: "No embedding provider configured",
247
+ };
248
+ }
249
+ // Health check: Basic recall test (just verify it doesn't crash)
250
+ try {
251
+ const startTime = Date.now();
252
+ // We can't actually call recall without the full MCP server
253
+ // So we just verify the cache can be read
254
+ const testKey = cache.scarSearchKey("health check test", "test", 5);
255
+ await cache.getResult(testKey);
256
+ const durationMs = Date.now() - startTime;
257
+ health.recall = {
258
+ status: "pass",
259
+ message: "Recall infrastructure operational",
260
+ durationMs,
261
+ };
262
+ }
263
+ catch (error) {
264
+ health.recall = {
265
+ status: "fail",
266
+ message: `Recall check failed: ${error instanceof Error ? error.message : String(error)}`,
267
+ };
268
+ }
269
+ // Health check: Write test (verify we can write to cache)
270
+ try {
271
+ const startTime = Date.now();
272
+ const testKey = `health_check_${Date.now()}`;
273
+ await cache.setResult(testKey, { test: true }, 1000); // 1 second TTL
274
+ const durationMs = Date.now() - startTime;
275
+ health.write = {
276
+ status: "pass",
277
+ message: "Write operations functional",
278
+ durationMs,
279
+ };
280
+ }
281
+ catch (error) {
282
+ health.write = {
283
+ status: "fail",
284
+ message: `Write check failed: ${error instanceof Error ? error.message : String(error)}`,
285
+ };
286
+ }
287
+ // Data volume (counts only)
288
+ let dataVolume;
289
+ try {
290
+ const gitmemDir = join(process.cwd(), ".gitmem");
291
+ let localCacheFiles = 0;
292
+ let localCacheBytes = 0;
293
+ if (existsSync(gitmemDir)) {
294
+ const files = readdirSync(gitmemDir);
295
+ for (const file of files) {
296
+ if (file.endsWith(".json")) {
297
+ localCacheFiles++;
298
+ try {
299
+ const stat = statSync(join(gitmemDir, file));
300
+ localCacheBytes += stat.size;
301
+ }
302
+ catch {
303
+ // Ignore stat errors
304
+ }
305
+ }
306
+ }
307
+ }
308
+ // For Supabase counts, we'd need to query the database
309
+ // For now, just report local counts
310
+ dataVolume = {
311
+ learningsCount: 0, // Would need DB query
312
+ sessionsCount: 0,
313
+ decisionsCount: 0,
314
+ localCacheFiles,
315
+ localCacheBytes,
316
+ };
317
+ // If Supabase is configured, try to get counts
318
+ if (hasSupabase()) {
319
+ try {
320
+ const tables = ["learnings", "sessions", "decisions"];
321
+ for (const table of tables) {
322
+ const response = await fetch(`${supabaseUrl}/rest/v1/gitmem_${table}?select=id&limit=0`, {
323
+ method: "HEAD",
324
+ headers: {
325
+ apikey: supabaseKey,
326
+ Authorization: `Bearer ${supabaseKey}`,
327
+ Prefer: "count=exact",
328
+ },
329
+ });
330
+ const count = response.headers.get("content-range");
331
+ if (count) {
332
+ const match = count.match(/\/(\d+)/);
333
+ if (match) {
334
+ const key = `${table}Count`;
335
+ dataVolume[key] = parseInt(match[1]);
336
+ }
337
+ }
338
+ }
339
+ }
340
+ catch {
341
+ // Ignore count errors
342
+ }
343
+ }
344
+ }
345
+ catch {
346
+ // Ignore data volume errors
347
+ }
348
+ return { health, configuration, dataVolume };
349
+ }
350
+ /**
351
+ * Run full diagnostic with benchmarks (~30s)
352
+ */
353
+ async function runFullCheck() {
354
+ const benchmarks = {};
355
+ const cache = getCache();
356
+ // Cold start benchmark (cache initialization)
357
+ console.log(" Running cold start benchmark...");
358
+ try {
359
+ benchmarks.coldStart = await runBenchmark("coldStart", async () => {
360
+ // Simulate cold start by creating new cache instance
361
+ const testCache = new CacheService(`/tmp/gitmem-bench-${Date.now()}`);
362
+ await testCache.getStats();
363
+ }, 5);
364
+ }
365
+ catch (error) {
366
+ console.log(` Cold start benchmark failed: ${error}`);
367
+ }
368
+ // Cache populate benchmark
369
+ console.log(" Running cache populate benchmark...");
370
+ try {
371
+ benchmarks.cachePopulate = await runBenchmark("cachePopulate", async () => {
372
+ const key = `bench_populate_${Date.now()}`;
373
+ await cache.setResult(key, { test: true, data: "x".repeat(1000) }, 60000);
374
+ }, 5);
375
+ }
376
+ catch (error) {
377
+ console.log(` Cache populate benchmark failed: ${error}`);
378
+ }
379
+ // Cache hit benchmark
380
+ console.log(" Running cache hit benchmark...");
381
+ try {
382
+ // First, populate a cache entry
383
+ const hitKey = `bench_hit_${Date.now()}`;
384
+ await cache.setResult(hitKey, { test: true, data: "x".repeat(1000) }, 60000);
385
+ benchmarks.cacheHit = await runBenchmark("cacheHit", async () => {
386
+ await cache.getResult(hitKey);
387
+ }, 5);
388
+ }
389
+ catch (error) {
390
+ console.log(` Cache hit benchmark failed: ${error}`);
391
+ }
392
+ // Recall benchmark (if Supabase configured)
393
+ if (hasSupabase()) {
394
+ console.log(" Running recall benchmark...");
395
+ try {
396
+ benchmarks.recall = await runBenchmark("recall", async () => {
397
+ // Simulate recall by doing a search
398
+ const supabaseUrl = process.env.SUPABASE_URL;
399
+ const supabaseKey = process.env.SUPABASE_SERVICE_ROLE_KEY;
400
+ await fetch(`${supabaseUrl}/rest/v1/gitmem_learnings?select=id,title&limit=5`, {
401
+ headers: {
402
+ apikey: supabaseKey,
403
+ Authorization: `Bearer ${supabaseKey}`,
404
+ },
405
+ });
406
+ }, 5);
407
+ }
408
+ catch (error) {
409
+ console.log(` Recall benchmark failed: ${error}`);
410
+ }
411
+ }
412
+ return benchmarks;
413
+ }
414
+ /**
415
+ * Main check command
416
+ */
417
+ export async function runCheck(options) {
418
+ const mode = options.full ? "full" : "quick";
419
+ console.log(`\nGitMem Diagnostic Check (${mode} mode)\n`);
420
+ console.log("=".repeat(50));
421
+ const collector = new DiagnosticsCollector();
422
+ collector.start();
423
+ // Run quick checks
424
+ console.log("\nRunning health checks...");
425
+ const { health, configuration, dataVolume } = await runQuickCheck();
426
+ // Print health check results
427
+ console.log("\nHealth Checks:");
428
+ for (const [name, result] of Object.entries(health)) {
429
+ const icon = result.status === "pass" ? "✓" : result.status === "fail" ? "✗" : "○";
430
+ const time = result.durationMs ? ` (${result.durationMs}ms)` : "";
431
+ console.log(` ${icon} ${name}: ${result.message}${time}`);
432
+ }
433
+ // Run benchmarks if full mode
434
+ let benchmarks;
435
+ if (options.full) {
436
+ console.log("\nRunning benchmarks...");
437
+ benchmarks = await runFullCheck();
438
+ if (benchmarks) {
439
+ console.log("\nBenchmark Results:");
440
+ for (const [name, result] of Object.entries(benchmarks)) {
441
+ if (result) {
442
+ console.log(` ${name}: mean=${result.meanMs.toFixed(2)}ms, p95=${result.p95Ms.toFixed(2)}ms`);
443
+ }
444
+ }
445
+ }
446
+ }
447
+ // Stop collecting metrics
448
+ const metrics = collector.stop();
449
+ // Build report
450
+ const envInfo = getSafeEnvironmentInfo();
451
+ const report = {
452
+ version: REPORT_VERSION,
453
+ generatedAt: new Date().toISOString(),
454
+ mode,
455
+ environment: {
456
+ ...envInfo,
457
+ tier: getTier(),
458
+ },
459
+ configuration,
460
+ health,
461
+ metrics,
462
+ benchmarks,
463
+ dataVolume,
464
+ };
465
+ // Determine output path
466
+ const gitmemDir = join(process.cwd(), ".gitmem");
467
+ if (!existsSync(gitmemDir)) {
468
+ mkdirSync(gitmemDir, { recursive: true });
469
+ }
470
+ const outputPath = options.output || join(gitmemDir, `diagnostic-${Date.now()}.json`);
471
+ // Write report
472
+ writeFileSync(outputPath, JSON.stringify(report, null, 2));
473
+ console.log(`\nReport saved to: ${outputPath}`);
474
+ // Summary
475
+ const passCount = Object.values(health).filter((h) => h.status === "pass").length;
476
+ const failCount = Object.values(health).filter((h) => h.status === "fail").length;
477
+ const skipCount = Object.values(health).filter((h) => h.status === "skip").length;
478
+ console.log(`\nSummary: ${passCount} passed, ${failCount} failed, ${skipCount} skipped`);
479
+ if (failCount > 0) {
480
+ console.log("\n⚠️ Some health checks failed. Review the report for details.");
481
+ process.exit(1);
482
+ }
483
+ console.log("\n✓ All health checks passed.");
484
+ }
485
+ /**
486
+ * Entry point for CLI
487
+ */
488
+ export async function main(args) {
489
+ const options = parseArgs(args);
490
+ await runCheck(options);
491
+ }
492
+ //# sourceMappingURL=check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check.js","sourceRoot":"","sources":["../../src/commands/check.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Single Source of Truth: Closing Reflection Questions
3
+ *
4
+ * All 7 closing questions defined once. Used by:
5
+ * - definitions.ts (JSON schema for tool registration)
6
+ * - compliance-validator.ts (validation error messages)
7
+ * - schemas/session-close.ts (Zod schema)
8
+ * - types/index.ts (ClosingReflection interface)
9
+ *
10
+ * Changing a question here propagates everywhere.
11
+ */
12
+ export interface ClosingQuestion {
13
+ /** Field name in closing_reflection object */
14
+ key: string;
15
+ /** Question number (Q1-Q7) */
16
+ number: number;
17
+ /** Full question text */
18
+ question: string;
19
+ /** What type of institutional memory this question surfaces */
20
+ memoryType: "scar" | "win" | "decision" | "synthesis" | null;
21
+ /** Whether compliance validator enforces a non-empty answer */
22
+ required: boolean;
23
+ /** JSON schema type for the field */
24
+ fieldType: "string" | "string[]";
25
+ }
26
+ export declare const CLOSING_QUESTIONS: ClosingQuestion[];
27
+ /**
28
+ * Build JSON schema properties for closing_reflection in tool definitions.
29
+ * Returns the `properties` object for the closing_reflection schema.
30
+ */
31
+ export declare function closingReflectionSchemaProperties(): Record<string, unknown>;
32
+ /**
33
+ * Build the full closing_reflection JSON schema object for tool definitions.
34
+ */
35
+ export declare function closingReflectionSchema(): Record<string, unknown>;
36
+ /**
37
+ * Build a description string listing all questions (for tool descriptions or prompts).
38
+ */
39
+ export declare function closingReflectionDescription(): string;
40
+ //# sourceMappingURL=closing-questions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"closing-questions.d.ts","sourceRoot":"","sources":["../../src/constants/closing-questions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,MAAM,WAAW,eAAe;IAC9B,8CAA8C;IAC9C,GAAG,EAAE,MAAM,CAAC;IACZ,8BAA8B;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,yBAAyB;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,+DAA+D;IAC/D,UAAU,EAAE,MAAM,GAAG,KAAK,GAAG,UAAU,GAAG,WAAW,GAAG,IAAI,CAAC;IAC7D,+DAA+D;IAC/D,QAAQ,EAAE,OAAO,CAAC;IAClB,qCAAqC;IACrC,SAAS,EAAE,QAAQ,GAAG,UAAU,CAAC;CAClC;AAED,eAAO,MAAM,iBAAiB,EAAE,eAAe,EA4D9C,CAAC;AAEF;;;GAGG;AACH,wBAAgB,iCAAiC,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAa3E;AAED;;GAEG;AACH,wBAAgB,uBAAuB,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAMjE;AAED;;GAEG;AACH,wBAAgB,4BAA4B,IAAI,MAAM,CAIrD"}
@@ -0,0 +1,107 @@
1
+ /**
2
+ * Single Source of Truth: Closing Reflection Questions
3
+ *
4
+ * All 7 closing questions defined once. Used by:
5
+ * - definitions.ts (JSON schema for tool registration)
6
+ * - compliance-validator.ts (validation error messages)
7
+ * - schemas/session-close.ts (Zod schema)
8
+ * - types/index.ts (ClosingReflection interface)
9
+ *
10
+ * Changing a question here propagates everywhere.
11
+ */
12
+ export const CLOSING_QUESTIONS = [
13
+ {
14
+ key: "what_broke",
15
+ number: 1,
16
+ question: "What broke that you didn't expect?",
17
+ memoryType: "scar",
18
+ required: true,
19
+ fieldType: "string",
20
+ },
21
+ {
22
+ key: "what_took_longer",
23
+ number: 2,
24
+ question: "What took longer than it should have?",
25
+ memoryType: "scar",
26
+ required: true,
27
+ fieldType: "string",
28
+ },
29
+ {
30
+ key: "do_differently",
31
+ number: 3,
32
+ question: "What would you do differently next time?",
33
+ memoryType: "scar",
34
+ required: true,
35
+ fieldType: "string",
36
+ },
37
+ {
38
+ key: "what_worked",
39
+ number: 4,
40
+ question: "What pattern or approach worked well?",
41
+ memoryType: "win",
42
+ required: true,
43
+ fieldType: "string",
44
+ },
45
+ {
46
+ key: "wrong_assumption",
47
+ number: 5,
48
+ question: "What assumption was wrong?",
49
+ memoryType: "scar",
50
+ required: true,
51
+ fieldType: "string",
52
+ },
53
+ {
54
+ key: "scars_applied",
55
+ number: 6,
56
+ question: "Which scars or institutional knowledge did you apply?",
57
+ memoryType: null,
58
+ required: false,
59
+ fieldType: "string[]",
60
+ },
61
+ {
62
+ key: "institutional_memory_items",
63
+ number: 7,
64
+ question: "What from this session should be captured as institutional memory? " +
65
+ "Review Q1-Q6 first — Q1/Q5 are scar candidates, Q3 is almost always a scar, " +
66
+ "Q4 is a win, and any significant design choice is a decision.",
67
+ memoryType: "synthesis",
68
+ required: false,
69
+ fieldType: "string",
70
+ },
71
+ ];
72
+ /**
73
+ * Build JSON schema properties for closing_reflection in tool definitions.
74
+ * Returns the `properties` object for the closing_reflection schema.
75
+ */
76
+ export function closingReflectionSchemaProperties() {
77
+ const properties = {};
78
+ for (const q of CLOSING_QUESTIONS) {
79
+ if (q.fieldType === "string[]") {
80
+ properties[q.key] = {
81
+ type: "array",
82
+ items: { type: "string" },
83
+ };
84
+ }
85
+ else {
86
+ properties[q.key] = { type: "string" };
87
+ }
88
+ }
89
+ return properties;
90
+ }
91
+ /**
92
+ * Build the full closing_reflection JSON schema object for tool definitions.
93
+ */
94
+ export function closingReflectionSchema() {
95
+ return {
96
+ type: "object",
97
+ properties: closingReflectionSchemaProperties(),
98
+ description: `Answers to ${CLOSING_QUESTIONS.length} closing questions (required for standard close)`,
99
+ };
100
+ }
101
+ /**
102
+ * Build a description string listing all questions (for tool descriptions or prompts).
103
+ */
104
+ export function closingReflectionDescription() {
105
+ return CLOSING_QUESTIONS.map((q) => `Q${q.number} (${q.key}): ${q.question}`).join("\n");
106
+ }
107
+ //# sourceMappingURL=closing-questions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"closing-questions.js","sourceRoot":"","sources":["../../src/constants/closing-questions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAiBH,MAAM,CAAC,MAAM,iBAAiB,GAAsB;IAClD;QACE,GAAG,EAAE,YAAY;QACjB,MAAM,EAAE,CAAC;QACT,QAAQ,EAAE,oCAAoC;QAC9C,UAAU,EAAE,MAAM;QAClB,QAAQ,EAAE,IAAI;QACd,SAAS,EAAE,QAAQ;KACpB;IACD;QACE,GAAG,EAAE,kBAAkB;QACvB,MAAM,EAAE,CAAC;QACT,QAAQ,EAAE,uCAAuC;QACjD,UAAU,EAAE,MAAM;QAClB,QAAQ,EAAE,IAAI;QACd,SAAS,EAAE,QAAQ;KACpB;IACD;QACE,GAAG,EAAE,gBAAgB;QACrB,MAAM,EAAE,CAAC;QACT,QAAQ,EAAE,0CAA0C;QACpD,UAAU,EAAE,MAAM;QAClB,QAAQ,EAAE,IAAI;QACd,SAAS,EAAE,QAAQ;KACpB;IACD;QACE,GAAG,EAAE,aAAa;QAClB,MAAM,EAAE,CAAC;QACT,QAAQ,EAAE,uCAAuC;QACjD,UAAU,EAAE,KAAK;QACjB,QAAQ,EAAE,IAAI;QACd,SAAS,EAAE,QAAQ;KACpB;IACD;QACE,GAAG,EAAE,kBAAkB;QACvB,MAAM,EAAE,CAAC;QACT,QAAQ,EAAE,4BAA4B;QACtC,UAAU,EAAE,MAAM;QAClB,QAAQ,EAAE,IAAI;QACd,SAAS,EAAE,QAAQ;KACpB;IACD;QACE,GAAG,EAAE,eAAe;QACpB,MAAM,EAAE,CAAC;QACT,QAAQ,EAAE,uDAAuD;QACjE,UAAU,EAAE,IAAI;QAChB,QAAQ,EAAE,KAAK;QACf,SAAS,EAAE,UAAU;KACtB;IACD;QACE,GAAG,EAAE,4BAA4B;QACjC,MAAM,EAAE,CAAC;QACT,QAAQ,EACN,qEAAqE;YACrE,8EAA8E;YAC9E,+DAA+D;QACjE,UAAU,EAAE,WAAW;QACvB,QAAQ,EAAE,KAAK;QACf,SAAS,EAAE,QAAQ;KACpB;CACF,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,iCAAiC;IAC/C,MAAM,UAAU,GAA4B,EAAE,CAAC;IAC/C,KAAK,MAAM,CAAC,IAAI,iBAAiB,EAAE,CAAC;QAClC,IAAI,CAAC,CAAC,SAAS,KAAK,UAAU,EAAE,CAAC;YAC/B,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG;gBAClB,IAAI,EAAE,OAAO;gBACb,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;aAC1B,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;QACzC,CAAC;IACH,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,uBAAuB;IACrC,OAAO;QACL,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE,iCAAiC,EAAE;QAC/C,WAAW,EAAE,cAAc,iBAAiB,CAAC,MAAM,kDAAkD;KACtG,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,4BAA4B;IAC1C,OAAO,iBAAiB,CAAC,GAAG,CAC1B,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,QAAQ,EAAE,CAChD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC"}