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.
- package/CHANGELOG.md +47 -0
- package/CLAUDE.md.template +65 -0
- package/LICENSE +21 -0
- package/README.md +221 -0
- package/bin/gitmem.js +383 -0
- package/dist/commands/check.d.ts +33 -0
- package/dist/commands/check.d.ts.map +1 -0
- package/dist/commands/check.js +492 -0
- package/dist/commands/check.js.map +1 -0
- package/dist/constants/closing-questions.d.ts +40 -0
- package/dist/constants/closing-questions.d.ts.map +1 -0
- package/dist/constants/closing-questions.js +107 -0
- package/dist/constants/closing-questions.js.map +1 -0
- package/dist/diagnostics/anonymizer.d.ts +55 -0
- package/dist/diagnostics/anonymizer.d.ts.map +1 -0
- package/dist/diagnostics/anonymizer.js +191 -0
- package/dist/diagnostics/anonymizer.js.map +1 -0
- package/dist/diagnostics/channels.d.ts +132 -0
- package/dist/diagnostics/channels.d.ts.map +1 -0
- package/dist/diagnostics/channels.js +150 -0
- package/dist/diagnostics/channels.js.map +1 -0
- package/dist/diagnostics/collector.d.ts +183 -0
- package/dist/diagnostics/collector.d.ts.map +1 -0
- package/dist/diagnostics/collector.js +227 -0
- package/dist/diagnostics/collector.js.map +1 -0
- package/dist/diagnostics/index.d.ts +28 -0
- package/dist/diagnostics/index.d.ts.map +1 -0
- package/dist/diagnostics/index.js +31 -0
- package/dist/diagnostics/index.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -0
- package/dist/schemas/absorb-observations.d.ts +63 -0
- package/dist/schemas/absorb-observations.d.ts.map +1 -0
- package/dist/schemas/absorb-observations.js +25 -0
- package/dist/schemas/absorb-observations.js.map +1 -0
- package/dist/schemas/active-sessions.d.ts +71 -0
- package/dist/schemas/active-sessions.d.ts.map +1 -0
- package/dist/schemas/active-sessions.js +19 -0
- package/dist/schemas/active-sessions.js.map +1 -0
- package/dist/schemas/analyze.d.ts +38 -0
- package/dist/schemas/analyze.d.ts.map +1 -0
- package/dist/schemas/analyze.js +30 -0
- package/dist/schemas/analyze.js.map +1 -0
- package/dist/schemas/common.d.ts +55 -0
- package/dist/schemas/common.d.ts.map +1 -0
- package/dist/schemas/common.js +65 -0
- package/dist/schemas/common.js.map +1 -0
- package/dist/schemas/create-decision.d.ts +48 -0
- package/dist/schemas/create-decision.d.ts.map +1 -0
- package/dist/schemas/create-decision.js +31 -0
- package/dist/schemas/create-decision.js.map +1 -0
- package/dist/schemas/create-learning.d.ts +107 -0
- package/dist/schemas/create-learning.d.ts.map +1 -0
- package/dist/schemas/create-learning.js +64 -0
- package/dist/schemas/create-learning.js.map +1 -0
- package/dist/schemas/get-transcript.d.ts +24 -0
- package/dist/schemas/get-transcript.d.ts.map +1 -0
- package/dist/schemas/get-transcript.js +22 -0
- package/dist/schemas/get-transcript.js.map +1 -0
- package/dist/schemas/index.d.ts +23 -0
- package/dist/schemas/index.d.ts.map +1 -0
- package/dist/schemas/index.js +23 -0
- package/dist/schemas/index.js.map +1 -0
- package/dist/schemas/log.d.ts +36 -0
- package/dist/schemas/log.d.ts.map +1 -0
- package/dist/schemas/log.js +27 -0
- package/dist/schemas/log.js.map +1 -0
- package/dist/schemas/prepare-context.d.ts +41 -0
- package/dist/schemas/prepare-context.d.ts.map +1 -0
- package/dist/schemas/prepare-context.js +31 -0
- package/dist/schemas/prepare-context.js.map +1 -0
- package/dist/schemas/recall.d.ts +41 -0
- package/dist/schemas/recall.d.ts.map +1 -0
- package/dist/schemas/recall.js +47 -0
- package/dist/schemas/recall.js.map +1 -0
- package/dist/schemas/record-scar-usage-batch.d.ts +82 -0
- package/dist/schemas/record-scar-usage-batch.d.ts.map +1 -0
- package/dist/schemas/record-scar-usage-batch.js +25 -0
- package/dist/schemas/record-scar-usage-batch.js.map +1 -0
- package/dist/schemas/record-scar-usage.d.ts +51 -0
- package/dist/schemas/record-scar-usage.d.ts.map +1 -0
- package/dist/schemas/record-scar-usage.js +32 -0
- package/dist/schemas/record-scar-usage.js.map +1 -0
- package/dist/schemas/save-transcript.d.ts +38 -0
- package/dist/schemas/save-transcript.d.ts.map +1 -0
- package/dist/schemas/save-transcript.js +30 -0
- package/dist/schemas/save-transcript.js.map +1 -0
- package/dist/schemas/search.d.ts +36 -0
- package/dist/schemas/search.d.ts.map +1 -0
- package/dist/schemas/search.js +27 -0
- package/dist/schemas/search.js.map +1 -0
- package/dist/schemas/session-close.d.ts +371 -0
- package/dist/schemas/session-close.d.ts.map +1 -0
- package/dist/schemas/session-close.js +95 -0
- package/dist/schemas/session-close.js.map +1 -0
- package/dist/schemas/session-start.d.ts +46 -0
- package/dist/schemas/session-start.d.ts.map +1 -0
- package/dist/schemas/session-start.js +33 -0
- package/dist/schemas/session-start.js.map +1 -0
- package/dist/schemas/thread.d.ts +72 -0
- package/dist/schemas/thread.d.ts.map +1 -0
- package/dist/schemas/thread.js +39 -0
- package/dist/schemas/thread.js.map +1 -0
- package/dist/server.d.ts +22 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +313 -0
- package/dist/server.js.map +1 -0
- package/dist/services/active-sessions.d.ts +66 -0
- package/dist/services/active-sessions.d.ts.map +1 -0
- package/dist/services/active-sessions.js +311 -0
- package/dist/services/active-sessions.js.map +1 -0
- package/dist/services/agent-detection.d.ts +25 -0
- package/dist/services/agent-detection.d.ts.map +1 -0
- package/dist/services/agent-detection.js +93 -0
- package/dist/services/agent-detection.js.map +1 -0
- package/dist/services/analytics.d.ts +201 -0
- package/dist/services/analytics.d.ts.map +1 -0
- package/dist/services/analytics.js +483 -0
- package/dist/services/analytics.js.map +1 -0
- package/dist/services/cache.d.ts +148 -0
- package/dist/services/cache.d.ts.map +1 -0
- package/dist/services/cache.js +384 -0
- package/dist/services/cache.js.map +1 -0
- package/dist/services/cache.test.d.ts +8 -0
- package/dist/services/cache.test.d.ts.map +1 -0
- package/dist/services/cache.test.js +267 -0
- package/dist/services/cache.test.js.map +1 -0
- package/dist/services/compliance-validator.d.ts +30 -0
- package/dist/services/compliance-validator.d.ts.map +1 -0
- package/dist/services/compliance-validator.js +257 -0
- package/dist/services/compliance-validator.js.map +1 -0
- package/dist/services/config.d.ts +48 -0
- package/dist/services/config.d.ts.map +1 -0
- package/dist/services/config.js +128 -0
- package/dist/services/config.js.map +1 -0
- package/dist/services/embedding.d.ts +58 -0
- package/dist/services/embedding.d.ts.map +1 -0
- package/dist/services/embedding.js +243 -0
- package/dist/services/embedding.js.map +1 -0
- package/dist/services/gitmem-dir.d.ts +38 -0
- package/dist/services/gitmem-dir.d.ts.map +1 -0
- package/dist/services/gitmem-dir.js +84 -0
- package/dist/services/gitmem-dir.js.map +1 -0
- package/dist/services/local-file-storage.d.ts +56 -0
- package/dist/services/local-file-storage.d.ts.map +1 -0
- package/dist/services/local-file-storage.js +213 -0
- package/dist/services/local-file-storage.js.map +1 -0
- package/dist/services/local-vector-search.d.ts +137 -0
- package/dist/services/local-vector-search.d.ts.map +1 -0
- package/dist/services/local-vector-search.js +311 -0
- package/dist/services/local-vector-search.js.map +1 -0
- package/dist/services/metrics.d.ts +104 -0
- package/dist/services/metrics.d.ts.map +1 -0
- package/dist/services/metrics.js +264 -0
- package/dist/services/metrics.js.map +1 -0
- package/dist/services/session-state.d.ts +113 -0
- package/dist/services/session-state.d.ts.map +1 -0
- package/dist/services/session-state.js +203 -0
- package/dist/services/session-state.js.map +1 -0
- package/dist/services/startup.d.ts +112 -0
- package/dist/services/startup.d.ts.map +1 -0
- package/dist/services/startup.js +436 -0
- package/dist/services/startup.js.map +1 -0
- package/dist/services/storage.d.ts +43 -0
- package/dist/services/storage.d.ts.map +1 -0
- package/dist/services/storage.js +92 -0
- package/dist/services/storage.js.map +1 -0
- package/dist/services/supabase-client.d.ts +163 -0
- package/dist/services/supabase-client.d.ts.map +1 -0
- package/dist/services/supabase-client.js +510 -0
- package/dist/services/supabase-client.js.map +1 -0
- package/dist/services/thread-dedup.d.ts +44 -0
- package/dist/services/thread-dedup.d.ts.map +1 -0
- package/dist/services/thread-dedup.js +113 -0
- package/dist/services/thread-dedup.js.map +1 -0
- package/dist/services/thread-manager.d.ts +77 -0
- package/dist/services/thread-manager.d.ts.map +1 -0
- package/dist/services/thread-manager.js +250 -0
- package/dist/services/thread-manager.js.map +1 -0
- package/dist/services/thread-suggestions.d.ts +66 -0
- package/dist/services/thread-suggestions.d.ts.map +1 -0
- package/dist/services/thread-suggestions.js +243 -0
- package/dist/services/thread-suggestions.js.map +1 -0
- package/dist/services/thread-supabase.d.ts +111 -0
- package/dist/services/thread-supabase.d.ts.map +1 -0
- package/dist/services/thread-supabase.js +459 -0
- package/dist/services/thread-supabase.js.map +1 -0
- package/dist/services/thread-vitality.d.ts +65 -0
- package/dist/services/thread-vitality.d.ts.map +1 -0
- package/dist/services/thread-vitality.js +143 -0
- package/dist/services/thread-vitality.js.map +1 -0
- package/dist/services/tier.d.ts +52 -0
- package/dist/services/tier.d.ts.map +1 -0
- package/dist/services/tier.js +109 -0
- package/dist/services/tier.js.map +1 -0
- package/dist/services/timezone.d.ts +37 -0
- package/dist/services/timezone.d.ts.map +1 -0
- package/dist/services/timezone.js +147 -0
- package/dist/services/timezone.js.map +1 -0
- package/dist/services/transcript-chunker.d.ts +18 -0
- package/dist/services/transcript-chunker.d.ts.map +1 -0
- package/dist/services/transcript-chunker.js +237 -0
- package/dist/services/transcript-chunker.js.map +1 -0
- package/dist/services/triple-writer.d.ts +128 -0
- package/dist/services/triple-writer.d.ts.map +1 -0
- package/dist/services/triple-writer.js +338 -0
- package/dist/services/triple-writer.js.map +1 -0
- package/dist/services/variant-assignment.d.ts +92 -0
- package/dist/services/variant-assignment.d.ts.map +1 -0
- package/dist/services/variant-assignment.js +196 -0
- package/dist/services/variant-assignment.js.map +1 -0
- package/dist/tools/absorb-observations.d.ts +16 -0
- package/dist/tools/absorb-observations.d.ts.map +1 -0
- package/dist/tools/absorb-observations.js +82 -0
- package/dist/tools/absorb-observations.js.map +1 -0
- package/dist/tools/analyze.d.ts +55 -0
- package/dist/tools/analyze.d.ts.map +1 -0
- package/dist/tools/analyze.js +139 -0
- package/dist/tools/analyze.js.map +1 -0
- package/dist/tools/cleanup-threads.d.ts +47 -0
- package/dist/tools/cleanup-threads.d.ts.map +1 -0
- package/dist/tools/cleanup-threads.js +127 -0
- package/dist/tools/cleanup-threads.js.map +1 -0
- package/dist/tools/confirm-scars.d.ts +23 -0
- package/dist/tools/confirm-scars.d.ts.map +1 -0
- package/dist/tools/confirm-scars.js +209 -0
- package/dist/tools/confirm-scars.js.map +1 -0
- package/dist/tools/create-decision.d.ts +15 -0
- package/dist/tools/create-decision.d.ts.map +1 -0
- package/dist/tools/create-decision.js +138 -0
- package/dist/tools/create-decision.js.map +1 -0
- package/dist/tools/create-learning.d.ts +15 -0
- package/dist/tools/create-learning.d.ts.map +1 -0
- package/dist/tools/create-learning.js +226 -0
- package/dist/tools/create-learning.js.map +1 -0
- package/dist/tools/create-thread.d.ts +42 -0
- package/dist/tools/create-thread.d.ts.map +1 -0
- package/dist/tools/create-thread.js +180 -0
- package/dist/tools/create-thread.js.map +1 -0
- package/dist/tools/definitions.d.ts +5013 -0
- package/dist/tools/definitions.d.ts.map +1 -0
- package/dist/tools/definitions.js +2017 -0
- package/dist/tools/definitions.js.map +1 -0
- package/dist/tools/dismiss-suggestion.d.ts +20 -0
- package/dist/tools/dismiss-suggestion.d.ts.map +1 -0
- package/dist/tools/dismiss-suggestion.js +40 -0
- package/dist/tools/dismiss-suggestion.js.map +1 -0
- package/dist/tools/get-transcript.d.ts +24 -0
- package/dist/tools/get-transcript.d.ts.map +1 -0
- package/dist/tools/get-transcript.js +52 -0
- package/dist/tools/get-transcript.js.map +1 -0
- package/dist/tools/graph-traverse.d.ts +83 -0
- package/dist/tools/graph-traverse.d.ts.map +1 -0
- package/dist/tools/graph-traverse.js +394 -0
- package/dist/tools/graph-traverse.js.map +1 -0
- package/dist/tools/list-threads.d.ts +15 -0
- package/dist/tools/list-threads.d.ts.map +1 -0
- package/dist/tools/list-threads.js +114 -0
- package/dist/tools/list-threads.js.map +1 -0
- package/dist/tools/log.d.ts +43 -0
- package/dist/tools/log.d.ts.map +1 -0
- package/dist/tools/log.js +157 -0
- package/dist/tools/log.js.map +1 -0
- package/dist/tools/prepare-context.d.ts +36 -0
- package/dist/tools/prepare-context.d.ts.map +1 -0
- package/dist/tools/prepare-context.js +353 -0
- package/dist/tools/prepare-context.js.map +1 -0
- package/dist/tools/promote-suggestion.d.ts +25 -0
- package/dist/tools/promote-suggestion.d.ts.map +1 -0
- package/dist/tools/promote-suggestion.js +60 -0
- package/dist/tools/promote-suggestion.js.map +1 -0
- package/dist/tools/recall.d.ts +77 -0
- package/dist/tools/recall.d.ts.map +1 -0
- package/dist/tools/recall.js +423 -0
- package/dist/tools/recall.js.map +1 -0
- package/dist/tools/recall.test.d.ts +5 -0
- package/dist/tools/recall.test.d.ts.map +1 -0
- package/dist/tools/recall.test.js +155 -0
- package/dist/tools/recall.test.js.map +1 -0
- package/dist/tools/record-scar-usage-batch.d.ts +10 -0
- package/dist/tools/record-scar-usage-batch.d.ts.map +1 -0
- package/dist/tools/record-scar-usage-batch.js +153 -0
- package/dist/tools/record-scar-usage-batch.js.map +1 -0
- package/dist/tools/record-scar-usage.d.ts +14 -0
- package/dist/tools/record-scar-usage.d.ts.map +1 -0
- package/dist/tools/record-scar-usage.js +94 -0
- package/dist/tools/record-scar-usage.js.map +1 -0
- package/dist/tools/resolve-thread.d.ts +16 -0
- package/dist/tools/resolve-thread.d.ts.map +1 -0
- package/dist/tools/resolve-thread.js +102 -0
- package/dist/tools/resolve-thread.js.map +1 -0
- package/dist/tools/save-transcript.d.ts +29 -0
- package/dist/tools/save-transcript.d.ts.map +1 -0
- package/dist/tools/save-transcript.js +97 -0
- package/dist/tools/save-transcript.js.map +1 -0
- package/dist/tools/search.d.ts +46 -0
- package/dist/tools/search.d.ts.map +1 -0
- package/dist/tools/search.js +186 -0
- package/dist/tools/search.js.map +1 -0
- package/dist/tools/session-close.d.ts +14 -0
- package/dist/tools/session-close.d.ts.map +1 -0
- package/dist/tools/session-close.js +881 -0
- package/dist/tools/session-close.js.map +1 -0
- package/dist/tools/session-start.d.ts +38 -0
- package/dist/tools/session-start.d.ts.map +1 -0
- package/dist/tools/session-start.js +1104 -0
- package/dist/tools/session-start.js.map +1 -0
- package/dist/types/index.d.ts +456 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +5 -0
- package/dist/types/index.js.map +1 -0
- package/package.json +76 -0
- package/schema/setup.sql +193 -0
- package/schema/starter-scars.json +206 -0
package/bin/gitmem.js
ADDED
|
@@ -0,0 +1,383 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* GitMem CLI
|
|
5
|
+
*
|
|
6
|
+
* Commands:
|
|
7
|
+
* gitmem setup — Output SQL to paste into Supabase SQL Editor (pro/dev)
|
|
8
|
+
* gitmem init — Load starter scars (local JSON or Supabase)
|
|
9
|
+
* gitmem configure — Generate .mcp.json entry for Claude Code
|
|
10
|
+
* gitmem server — Start MCP server (default)
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import { readFileSync, writeFileSync, mkdirSync, existsSync } from "fs";
|
|
14
|
+
import { dirname, join } from "path";
|
|
15
|
+
import { fileURLToPath } from "url";
|
|
16
|
+
|
|
17
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
18
|
+
const command = process.argv[2];
|
|
19
|
+
|
|
20
|
+
function printUsage() {
|
|
21
|
+
console.log(`
|
|
22
|
+
GitMem — Institutional Memory for AI Coding
|
|
23
|
+
|
|
24
|
+
Usage:
|
|
25
|
+
npx gitmem setup Output SQL for Supabase schema setup (pro/dev tier)
|
|
26
|
+
npx gitmem init Load starter scars (auto-detects tier)
|
|
27
|
+
npx gitmem configure Generate .mcp.json config for Claude Code
|
|
28
|
+
npx gitmem server Start MCP server (default)
|
|
29
|
+
npx gitmem help Show this help message
|
|
30
|
+
|
|
31
|
+
Free Tier (zero config):
|
|
32
|
+
1. npx gitmem init
|
|
33
|
+
2. npx gitmem configure
|
|
34
|
+
3. Copy CLAUDE.md.template into your project
|
|
35
|
+
4. Start coding — memory is active!
|
|
36
|
+
|
|
37
|
+
Pro Tier (with Supabase):
|
|
38
|
+
1. Create free Supabase project → database.new
|
|
39
|
+
2. npx gitmem setup (copy SQL → Supabase SQL Editor)
|
|
40
|
+
3. Get API key for embeddings (OpenAI, OpenRouter, or Ollama)
|
|
41
|
+
4. npx gitmem configure
|
|
42
|
+
5. npx gitmem init (load starter scars into Supabase)
|
|
43
|
+
6. Copy CLAUDE.md.template into your project
|
|
44
|
+
7. Start coding — memory is active!
|
|
45
|
+
`);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
async function cmdSetup() {
|
|
49
|
+
try {
|
|
50
|
+
const sqlPath = join(__dirname, "..", "schema", "setup.sql");
|
|
51
|
+
const sql = readFileSync(sqlPath, "utf-8");
|
|
52
|
+
console.log("-- GitMem Schema Setup (Pro/Dev Tier)");
|
|
53
|
+
console.log("-- Copy and paste this SQL into your Supabase SQL Editor");
|
|
54
|
+
console.log("-- (Dashboard → SQL Editor → New query → Paste → Run)");
|
|
55
|
+
console.log("");
|
|
56
|
+
console.log(sql);
|
|
57
|
+
} catch {
|
|
58
|
+
console.error("Error: Could not read setup.sql. Ensure the package is installed correctly.");
|
|
59
|
+
process.exit(1);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
async function cmdInit() {
|
|
64
|
+
const supabaseUrl = process.env.SUPABASE_URL;
|
|
65
|
+
const supabaseKey = process.env.SUPABASE_SERVICE_ROLE_KEY;
|
|
66
|
+
|
|
67
|
+
let starterScars;
|
|
68
|
+
try {
|
|
69
|
+
const scarsPath = join(__dirname, "..", "schema", "starter-scars.json");
|
|
70
|
+
starterScars = JSON.parse(readFileSync(scarsPath, "utf-8"));
|
|
71
|
+
} catch {
|
|
72
|
+
console.error("Error: Could not read starter-scars.json.");
|
|
73
|
+
process.exit(1);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
if (!supabaseUrl || !supabaseKey) {
|
|
77
|
+
// Free tier: copy starter scars to local .gitmem/ directory
|
|
78
|
+
console.log("No Supabase credentials found — initializing free tier (local storage).");
|
|
79
|
+
console.log("");
|
|
80
|
+
|
|
81
|
+
const gitmemDir = join(process.cwd(), ".gitmem");
|
|
82
|
+
if (!existsSync(gitmemDir)) {
|
|
83
|
+
mkdirSync(gitmemDir, { recursive: true });
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
const learningsPath = join(gitmemDir, "learnings.json");
|
|
87
|
+
let existing = [];
|
|
88
|
+
if (existsSync(learningsPath)) {
|
|
89
|
+
try {
|
|
90
|
+
existing = JSON.parse(readFileSync(learningsPath, "utf-8"));
|
|
91
|
+
} catch {
|
|
92
|
+
existing = [];
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
// Merge: skip scars that already exist by id
|
|
97
|
+
const existingIds = new Set(existing.map((s) => s.id));
|
|
98
|
+
let added = 0;
|
|
99
|
+
for (const scar of starterScars) {
|
|
100
|
+
if (!existingIds.has(scar.id)) {
|
|
101
|
+
existing.push(scar);
|
|
102
|
+
added++;
|
|
103
|
+
console.log(` + ${scar.title}`);
|
|
104
|
+
} else {
|
|
105
|
+
console.log(` = ${scar.title} (already exists)`);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
writeFileSync(learningsPath, JSON.stringify(existing, null, 2));
|
|
110
|
+
|
|
111
|
+
// Create empty files for other collections
|
|
112
|
+
for (const file of ["sessions.json", "decisions.json", "scar-usage.json"]) {
|
|
113
|
+
const filePath = join(gitmemDir, file);
|
|
114
|
+
if (!existsSync(filePath)) {
|
|
115
|
+
writeFileSync(filePath, "[]");
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
console.log("");
|
|
120
|
+
console.log(`Done: ${added} new scars added to .gitmem/learnings.json`);
|
|
121
|
+
console.log("");
|
|
122
|
+
console.log("Add .gitmem/ to your .gitignore:");
|
|
123
|
+
console.log(" echo '.gitmem/' >> .gitignore");
|
|
124
|
+
console.log("");
|
|
125
|
+
console.log("To upgrade to Pro tier (semantic search + Supabase persistence):");
|
|
126
|
+
console.log(" Set SUPABASE_URL and SUPABASE_SERVICE_ROLE_KEY, then run init again.");
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
// Pro/Dev tier: load into Supabase via REST API
|
|
131
|
+
const tablePrefix = process.env.GITMEM_TABLE_PREFIX || "gitmem_";
|
|
132
|
+
const restUrl = `${supabaseUrl}/rest/v1/${tablePrefix}learnings`;
|
|
133
|
+
|
|
134
|
+
console.log(`Loading ${starterScars.length} starter scars into Supabase (${tablePrefix}learnings)...`);
|
|
135
|
+
|
|
136
|
+
let loaded = 0;
|
|
137
|
+
let failed = 0;
|
|
138
|
+
|
|
139
|
+
for (const scar of starterScars) {
|
|
140
|
+
try {
|
|
141
|
+
const response = await fetch(restUrl, {
|
|
142
|
+
method: "POST",
|
|
143
|
+
headers: {
|
|
144
|
+
apikey: supabaseKey,
|
|
145
|
+
Authorization: `Bearer ${supabaseKey}`,
|
|
146
|
+
"Content-Type": "application/json",
|
|
147
|
+
Prefer: "return=representation,resolution=merge-duplicates",
|
|
148
|
+
"Content-Profile": "public",
|
|
149
|
+
},
|
|
150
|
+
body: JSON.stringify(scar),
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
if (response.ok) {
|
|
154
|
+
loaded++;
|
|
155
|
+
console.log(` ✓ ${scar.title}`);
|
|
156
|
+
} else {
|
|
157
|
+
const text = await response.text();
|
|
158
|
+
failed++;
|
|
159
|
+
console.error(` ✗ ${scar.title}: ${text.slice(0, 100)}`);
|
|
160
|
+
}
|
|
161
|
+
} catch (err) {
|
|
162
|
+
failed++;
|
|
163
|
+
console.error(` ✗ ${scar.title}: ${err}`);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
console.log("");
|
|
168
|
+
console.log(`Done: ${loaded} loaded, ${failed} failed`);
|
|
169
|
+
|
|
170
|
+
if (loaded > 0) {
|
|
171
|
+
console.log("");
|
|
172
|
+
console.log("Starter scars are ready! Start a session and try:");
|
|
173
|
+
console.log(' recall({ plan: "deploy to production" })');
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
function cmdConfigure() {
|
|
178
|
+
const supabaseUrl = process.env.SUPABASE_URL;
|
|
179
|
+
|
|
180
|
+
if (!supabaseUrl) {
|
|
181
|
+
// Free tier config — no env vars needed
|
|
182
|
+
const config = {
|
|
183
|
+
mcpServers: {
|
|
184
|
+
gitmem: {
|
|
185
|
+
command: "npx",
|
|
186
|
+
args: ["-y", "@nteg-dev/gitmem"],
|
|
187
|
+
},
|
|
188
|
+
},
|
|
189
|
+
};
|
|
190
|
+
|
|
191
|
+
console.log("Free tier — no API keys needed!");
|
|
192
|
+
console.log("");
|
|
193
|
+
console.log("Add this to your .mcp.json (Claude Code) or settings (Cursor):");
|
|
194
|
+
console.log("");
|
|
195
|
+
console.log(JSON.stringify(config, null, 2));
|
|
196
|
+
console.log("");
|
|
197
|
+
console.log("To upgrade to Pro tier (semantic search + cloud persistence):");
|
|
198
|
+
console.log(" Set SUPABASE_URL and an embedding API key in the env block.");
|
|
199
|
+
} else {
|
|
200
|
+
// Pro/Dev tier config
|
|
201
|
+
const config = {
|
|
202
|
+
mcpServers: {
|
|
203
|
+
gitmem: {
|
|
204
|
+
command: "npx",
|
|
205
|
+
args: ["-y", "@nteg-dev/gitmem"],
|
|
206
|
+
env: {
|
|
207
|
+
SUPABASE_URL: "https://YOUR_PROJECT.supabase.co",
|
|
208
|
+
SUPABASE_SERVICE_ROLE_KEY: "eyJ...",
|
|
209
|
+
OPENAI_API_KEY: "sk-...",
|
|
210
|
+
},
|
|
211
|
+
},
|
|
212
|
+
},
|
|
213
|
+
};
|
|
214
|
+
|
|
215
|
+
console.log("Add this to your .mcp.json (Claude Code) or settings (Cursor):");
|
|
216
|
+
console.log("");
|
|
217
|
+
console.log(JSON.stringify(config, null, 2));
|
|
218
|
+
console.log("");
|
|
219
|
+
console.log("Replace the placeholder values with your actual keys:");
|
|
220
|
+
console.log(" SUPABASE_URL — From Supabase Dashboard → Settings → API");
|
|
221
|
+
console.log(" SUPABASE_SERVICE_ROLE_KEY — From Supabase Dashboard → Settings → API");
|
|
222
|
+
console.log(" OPENAI_API_KEY — From platform.openai.com/api-keys");
|
|
223
|
+
console.log("");
|
|
224
|
+
console.log("Alternative embedding providers:");
|
|
225
|
+
console.log(" OPENROUTER_API_KEY=sk-or-... (instead of OPENAI_API_KEY)");
|
|
226
|
+
console.log(" OLLAMA_URL=http://localhost:11434 (local, no API key needed)");
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
/**
|
|
231
|
+
* Run session-start directly (for hook scripts that need context without MCP)
|
|
232
|
+
*
|
|
233
|
+
* Outputs formatted session context to stdout.
|
|
234
|
+
* Used by gitmem-hooks SessionStart hook to provide immediate context
|
|
235
|
+
* without requiring ToolSearch → session_start two-step dance.
|
|
236
|
+
*
|
|
237
|
+
* Args: --project <project> --agent <agent>
|
|
238
|
+
*/
|
|
239
|
+
async function cmdSessionStart() {
|
|
240
|
+
const args = process.argv.slice(3);
|
|
241
|
+
let project = "orchestra_dev";
|
|
242
|
+
let agentIdentity = undefined;
|
|
243
|
+
|
|
244
|
+
for (let i = 0; i < args.length; i++) {
|
|
245
|
+
if (args[i] === "--project" && args[i + 1]) project = args[i + 1];
|
|
246
|
+
if (args[i] === "--agent" && args[i + 1]) agentIdentity = args[i + 1];
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
try {
|
|
250
|
+
const { sessionStart } = await import("../dist/tools/session-start.js");
|
|
251
|
+
const result = await sessionStart({ project, agent_identity: agentIdentity });
|
|
252
|
+
|
|
253
|
+
// Use pre-formatted display from formatStartDisplay() — single source of truth
|
|
254
|
+
console.log(result.display || "GITMEM SESSION ACTIVE");
|
|
255
|
+
} catch (error) {
|
|
256
|
+
console.error("[gitmem session-start]", error.message || error);
|
|
257
|
+
process.exit(1);
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
/**
|
|
262
|
+
* Run session-refresh directly (re-surface context without new session)
|
|
263
|
+
*
|
|
264
|
+
* Args: --project <project>
|
|
265
|
+
*/
|
|
266
|
+
async function cmdSessionRefresh() {
|
|
267
|
+
const args = process.argv.slice(3);
|
|
268
|
+
let project = undefined;
|
|
269
|
+
|
|
270
|
+
for (let i = 0; i < args.length; i++) {
|
|
271
|
+
if (args[i] === "--project" && args[i + 1]) project = args[i + 1];
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
try {
|
|
275
|
+
const { sessionRefresh } = await import("../dist/tools/session-start.js");
|
|
276
|
+
const result = await sessionRefresh({ project });
|
|
277
|
+
|
|
278
|
+
if (!result.session_id) {
|
|
279
|
+
console.error(result.message || "No active session");
|
|
280
|
+
process.exit(1);
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
// Format as readable text (same structure as session-start output)
|
|
284
|
+
const lines = [];
|
|
285
|
+
lines.push(`GITMEM CONTEXT REFRESHED`);
|
|
286
|
+
lines.push(``);
|
|
287
|
+
lines.push(`Session: ${result.session_id} | Agent: ${result.agent} | Refreshed`);
|
|
288
|
+
|
|
289
|
+
if (result.last_session) {
|
|
290
|
+
lines.push(``);
|
|
291
|
+
lines.push(`Last session: "${result.last_session.title}" (${result.last_session.date})`);
|
|
292
|
+
if (result.last_session.key_decisions?.length) {
|
|
293
|
+
lines.push(` Decisions: ${result.last_session.key_decisions.slice(0, 3).join("; ")}`);
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
if (result.open_threads?.length) {
|
|
298
|
+
lines.push(``);
|
|
299
|
+
lines.push(`Open threads (${result.open_threads.length}):`);
|
|
300
|
+
for (const thread of result.open_threads.slice(0, 5)) {
|
|
301
|
+
const text = typeof thread === "string" ? thread : thread.text;
|
|
302
|
+
const truncated = text && text.length > 80 ? text.slice(0, 77) + "..." : text;
|
|
303
|
+
lines.push(` - ${truncated || "[unnamed thread]"}`);
|
|
304
|
+
}
|
|
305
|
+
if (result.open_threads.length > 5) {
|
|
306
|
+
lines.push(` ... and ${result.open_threads.length - 5} more`);
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
if (result.relevant_scars?.length) {
|
|
311
|
+
lines.push(``);
|
|
312
|
+
lines.push(`Relevant scars (${result.relevant_scars.length}):`);
|
|
313
|
+
for (const scar of result.relevant_scars) {
|
|
314
|
+
const sev = (scar.severity || "medium").toUpperCase();
|
|
315
|
+
lines.push(` [${sev}] ${scar.title}`);
|
|
316
|
+
if (scar.description) {
|
|
317
|
+
lines.push(` ${scar.description.slice(0, 150)}`);
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
if (result.recent_decisions?.length) {
|
|
323
|
+
lines.push(``);
|
|
324
|
+
lines.push(`Recent decisions (${result.recent_decisions.length}):`);
|
|
325
|
+
for (const d of result.recent_decisions) {
|
|
326
|
+
lines.push(` - ${d.title} (${d.date})`);
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
if (result.recent_wins?.length) {
|
|
331
|
+
lines.push(``);
|
|
332
|
+
lines.push(`Recent wins (${result.recent_wins.length}):`);
|
|
333
|
+
for (const w of result.recent_wins) {
|
|
334
|
+
lines.push(` - ${w.title} (${w.date})`);
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
if (result.project_state) {
|
|
339
|
+
lines.push(``);
|
|
340
|
+
lines.push(`Project state: ${result.project_state}`);
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
console.log(lines.join("\n"));
|
|
344
|
+
} catch (error) {
|
|
345
|
+
console.error("[gitmem session-refresh]", error.message || error);
|
|
346
|
+
process.exit(1);
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
switch (command) {
|
|
351
|
+
case "setup":
|
|
352
|
+
cmdSetup();
|
|
353
|
+
break;
|
|
354
|
+
case "init":
|
|
355
|
+
cmdInit();
|
|
356
|
+
break;
|
|
357
|
+
case "configure":
|
|
358
|
+
cmdConfigure();
|
|
359
|
+
break;
|
|
360
|
+
case "session-start":
|
|
361
|
+
cmdSessionStart();
|
|
362
|
+
break;
|
|
363
|
+
case "session-refresh":
|
|
364
|
+
cmdSessionRefresh();
|
|
365
|
+
break;
|
|
366
|
+
case "server":
|
|
367
|
+
case "--stdio":
|
|
368
|
+
import("../dist/index.js");
|
|
369
|
+
break;
|
|
370
|
+
case "help":
|
|
371
|
+
case "--help":
|
|
372
|
+
case "-h":
|
|
373
|
+
printUsage();
|
|
374
|
+
break;
|
|
375
|
+
case undefined:
|
|
376
|
+
// Default: start MCP server (npx @nteg-dev/gitmem should start serving)
|
|
377
|
+
import("../dist/index.js");
|
|
378
|
+
break;
|
|
379
|
+
default:
|
|
380
|
+
console.error(`Unknown command: ${command}`);
|
|
381
|
+
printUsage();
|
|
382
|
+
process.exit(1);
|
|
383
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
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
|
+
/**
|
|
14
|
+
* Command options
|
|
15
|
+
*/
|
|
16
|
+
interface CheckOptions {
|
|
17
|
+
full: boolean;
|
|
18
|
+
output?: string;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Parse command line arguments
|
|
22
|
+
*/
|
|
23
|
+
export declare function parseArgs(args: string[]): CheckOptions;
|
|
24
|
+
/**
|
|
25
|
+
* Main check command
|
|
26
|
+
*/
|
|
27
|
+
export declare function runCheck(options: CheckOptions): Promise<void>;
|
|
28
|
+
/**
|
|
29
|
+
* Entry point for CLI
|
|
30
|
+
*/
|
|
31
|
+
export declare function main(args: string[]): Promise<void>;
|
|
32
|
+
export {};
|
|
33
|
+
//# sourceMappingURL=check.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../../src/commands/check.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAqBH;;GAEG;AACH,UAAU,YAAY;IACpB,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,YAAY,CAgBtD;AAkZD;;GAEG;AACH,wBAAsB,QAAQ,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAiFnE;AAED;;GAEG;AACH,wBAAsB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAGxD"}
|