git-memory 0.1.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/LICENSE +661 -0
- package/config/mcp_config_example.json +16 -0
- package/dist/chroma-index.d.ts +63 -0
- package/dist/chroma-index.d.ts.map +1 -0
- package/dist/chroma-index.js +166 -0
- package/dist/chroma-index.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +311 -0
- package/dist/cli.js.map +1 -0
- package/dist/context-store.d.ts +54 -0
- package/dist/context-store.d.ts.map +1 -0
- package/dist/context-store.js +187 -0
- package/dist/context-store.js.map +1 -0
- package/dist/embeddings.d.ts +10 -0
- package/dist/embeddings.d.ts.map +1 -0
- package/dist/embeddings.js +42 -0
- package/dist/embeddings.js.map +1 -0
- package/dist/filters.d.ts +70 -0
- package/dist/filters.d.ts.map +1 -0
- package/dist/filters.js +131 -0
- package/dist/filters.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -0
- package/dist/indexer.d.ts +45 -0
- package/dist/indexer.d.ts.map +1 -0
- package/dist/indexer.js +242 -0
- package/dist/indexer.js.map +1 -0
- package/dist/mcp-server.d.ts +8 -0
- package/dist/mcp-server.d.ts.map +1 -0
- package/dist/mcp-server.js +373 -0
- package/dist/mcp-server.js.map +1 -0
- package/dist/store.d.ts +17 -0
- package/dist/store.d.ts.map +1 -0
- package/dist/store.js +47 -0
- package/dist/store.js.map +1 -0
- package/dist/types.d.ts +59 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +25 -0
- package/dist/types.js.map +1 -0
- package/dist/vector-store.d.ts +65 -0
- package/dist/vector-store.d.ts.map +1 -0
- package/dist/vector-store.js +152 -0
- package/dist/vector-store.js.map +1 -0
- package/package.json +52 -0
- package/skills/git-memory-debug/SKILL.md +99 -0
- package/skills/git-memory-index/SKILL.md +88 -0
- package/skills/git-memory-search/SKILL.md +92 -0
- package/skills/git-memory-status/SKILL.md +69 -0
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import type { CommitCategory, CommitRecord } from './types.js';
|
|
2
|
+
import type { IEmbeddingFunction } from './embeddings.js';
|
|
3
|
+
export declare class ChromaCommitIndex {
|
|
4
|
+
private col;
|
|
5
|
+
private constructor();
|
|
6
|
+
/** Async factory — opens (or creates) the local SQLite vector store. */
|
|
7
|
+
static create(chromaDir: string, embedFn: IEmbeddingFunction): Promise<ChromaCommitIndex>;
|
|
8
|
+
/**
|
|
9
|
+
* Insert a commit if not already indexed. Returns false if duplicate.
|
|
10
|
+
* Exact port of Python upsert_commit():
|
|
11
|
+
* 1. Check existence (col.has)
|
|
12
|
+
* 2. Build document text
|
|
13
|
+
* 3. col.add() with metadata
|
|
14
|
+
*/
|
|
15
|
+
upsertCommit(params: {
|
|
16
|
+
commitHash: string;
|
|
17
|
+
authorName: string;
|
|
18
|
+
authorEmail: string;
|
|
19
|
+
committedDate: string;
|
|
20
|
+
message: string;
|
|
21
|
+
category: CommitCategory;
|
|
22
|
+
files: string[];
|
|
23
|
+
statsStr: string;
|
|
24
|
+
repo: string;
|
|
25
|
+
}): Promise<boolean>;
|
|
26
|
+
/**
|
|
27
|
+
* Semantic cosine similarity search.
|
|
28
|
+
* Clamps nResults to collection count (matches Python behaviour).
|
|
29
|
+
*/
|
|
30
|
+
search(params: {
|
|
31
|
+
query: string;
|
|
32
|
+
nResults?: number;
|
|
33
|
+
category?: string;
|
|
34
|
+
repo?: string;
|
|
35
|
+
}): Promise<CommitRecord[]>;
|
|
36
|
+
/**
|
|
37
|
+
* Get N most recent commits sorted by committed_date descending.
|
|
38
|
+
* Matches Python get_latest():
|
|
39
|
+
* - Fetches min(count, max(n*3, 50)) — bounded window
|
|
40
|
+
* - Sorts by date in JS
|
|
41
|
+
* - Returns first n
|
|
42
|
+
*/
|
|
43
|
+
getLatest(params: {
|
|
44
|
+
n?: number;
|
|
45
|
+
repo?: string;
|
|
46
|
+
}): Promise<CommitRecord[]>;
|
|
47
|
+
/**
|
|
48
|
+
* Find commits that touched a file.
|
|
49
|
+
* Matches Python search_by_file():
|
|
50
|
+
* 1. Fetch ALL docs (with optional repo filter)
|
|
51
|
+
* 2. JS-side string matching: filename in files_str
|
|
52
|
+
* 3. Sort by date, return first n_results
|
|
53
|
+
* 4. Fallback: semantic search
|
|
54
|
+
*/
|
|
55
|
+
searchByFile(params: {
|
|
56
|
+
filename: string;
|
|
57
|
+
nResults?: number;
|
|
58
|
+
repo?: string;
|
|
59
|
+
}): Promise<CommitRecord[]>;
|
|
60
|
+
/** Count indexed commits, optionally filtered by repo. */
|
|
61
|
+
count(repo?: string): Promise<number>;
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=chroma-index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chroma-index.d.ts","sourceRoot":"","sources":["../src/chroma-index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAI1D,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,GAAG,CAAmB;IAE9B,OAAO;IAIP,wEAAwE;WAC3D,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAM/F;;;;;;OAMG;IACG,YAAY,CAAC,MAAM,EAAE;QACzB,UAAU,EAAE,MAAM,CAAC;QACnB,UAAU,EAAE,MAAM,CAAC;QACnB,WAAW,EAAE,MAAM,CAAC;QACpB,aAAa,EAAE,MAAM,CAAC;QACtB,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,EAAE,cAAc,CAAC;QACzB,KAAK,EAAE,MAAM,EAAE,CAAC;QAChB,QAAQ,EAAE,MAAM,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC;KACd,GAAG,OAAO,CAAC,OAAO,CAAC;IA6BpB;;;OAGG;IACG,MAAM,CAAC,MAAM,EAAE;QACnB,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAmB3B;;;;;;OAMG;IACG,SAAS,CAAC,MAAM,EAAE;QAAE,CAAC,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAc/E;;;;;;;OAOG;IACG,YAAY,CAAC,MAAM,EAAE;QACzB,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAuB3B,0DAA0D;IACpD,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAM5C"}
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
import { join } from 'path';
|
|
2
|
+
import { VectorCollection } from './vector-store.js';
|
|
3
|
+
import { buildDocument } from './filters.js';
|
|
4
|
+
const DB_FILENAME = 'git_commits.db';
|
|
5
|
+
export class ChromaCommitIndex {
|
|
6
|
+
col;
|
|
7
|
+
constructor(col) {
|
|
8
|
+
this.col = col;
|
|
9
|
+
}
|
|
10
|
+
/** Async factory — opens (or creates) the local SQLite vector store. */
|
|
11
|
+
static async create(chromaDir, embedFn) {
|
|
12
|
+
const dbPath = join(chromaDir, DB_FILENAME);
|
|
13
|
+
const col = VectorCollection.open(dbPath, 'git_commits', embedFn);
|
|
14
|
+
return new ChromaCommitIndex(col);
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Insert a commit if not already indexed. Returns false if duplicate.
|
|
18
|
+
* Exact port of Python upsert_commit():
|
|
19
|
+
* 1. Check existence (col.has)
|
|
20
|
+
* 2. Build document text
|
|
21
|
+
* 3. col.add() with metadata
|
|
22
|
+
*/
|
|
23
|
+
async upsertCommit(params) {
|
|
24
|
+
if (this.col.has(params.commitHash))
|
|
25
|
+
return false;
|
|
26
|
+
const document = buildDocument(params.message, params.authorName, params.authorEmail, params.committedDate.slice(0, 10), params.statsStr, params.files);
|
|
27
|
+
await this.col.add({
|
|
28
|
+
id: params.commitHash,
|
|
29
|
+
document,
|
|
30
|
+
metadata: {
|
|
31
|
+
short_hash: params.commitHash.slice(0, 8),
|
|
32
|
+
author_name: params.authorName,
|
|
33
|
+
author_email: params.authorEmail,
|
|
34
|
+
committed_date: params.committedDate,
|
|
35
|
+
category: params.category,
|
|
36
|
+
repo: params.repo,
|
|
37
|
+
files_str: params.files.join('|'),
|
|
38
|
+
date_str: params.committedDate.slice(0, 10),
|
|
39
|
+
},
|
|
40
|
+
});
|
|
41
|
+
return true;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Semantic cosine similarity search.
|
|
45
|
+
* Clamps nResults to collection count (matches Python behaviour).
|
|
46
|
+
*/
|
|
47
|
+
async search(params) {
|
|
48
|
+
const count = this.col.count();
|
|
49
|
+
if (count === 0)
|
|
50
|
+
return [];
|
|
51
|
+
const nResults = Math.min(params.nResults ?? 10, Math.max(1, count));
|
|
52
|
+
const where = buildWhere(params.category, params.repo);
|
|
53
|
+
try {
|
|
54
|
+
const raw = await this.col.query({
|
|
55
|
+
queryTexts: [params.query],
|
|
56
|
+
nResults,
|
|
57
|
+
...(where ? { where } : {}),
|
|
58
|
+
});
|
|
59
|
+
return formatQueryResults(raw);
|
|
60
|
+
}
|
|
61
|
+
catch (e) {
|
|
62
|
+
process.stderr.write(`VectorStore search error: ${e}\n`);
|
|
63
|
+
return [];
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Get N most recent commits sorted by committed_date descending.
|
|
68
|
+
* Matches Python get_latest():
|
|
69
|
+
* - Fetches min(count, max(n*3, 50)) — bounded window
|
|
70
|
+
* - Sorts by date in JS
|
|
71
|
+
* - Returns first n
|
|
72
|
+
*/
|
|
73
|
+
async getLatest(params) {
|
|
74
|
+
const n = params.n ?? 10;
|
|
75
|
+
const count = this.col.count();
|
|
76
|
+
if (count === 0)
|
|
77
|
+
return [];
|
|
78
|
+
const fetchLimit = Math.min(count, Math.max(n * 3, 50));
|
|
79
|
+
const where = buildWhere(undefined, params.repo);
|
|
80
|
+
const raw = this.col.get({ limit: fetchLimit, where });
|
|
81
|
+
const records = formatGetResults(raw);
|
|
82
|
+
records.sort((a, b) => b.date.localeCompare(a.date));
|
|
83
|
+
return records.slice(0, n);
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Find commits that touched a file.
|
|
87
|
+
* Matches Python search_by_file():
|
|
88
|
+
* 1. Fetch ALL docs (with optional repo filter)
|
|
89
|
+
* 2. JS-side string matching: filename in files_str
|
|
90
|
+
* 3. Sort by date, return first n_results
|
|
91
|
+
* 4. Fallback: semantic search
|
|
92
|
+
*/
|
|
93
|
+
async searchByFile(params) {
|
|
94
|
+
const nResults = params.nResults ?? 20;
|
|
95
|
+
const needle = params.filename.toLowerCase();
|
|
96
|
+
const where = buildWhere(undefined, params.repo);
|
|
97
|
+
const all = this.col.get({ where });
|
|
98
|
+
const matched = [];
|
|
99
|
+
for (let i = 0; i < all.ids.length; i++) {
|
|
100
|
+
const filesStr = String(all.metadatas[i]?.files_str ?? '');
|
|
101
|
+
if (filesStr.toLowerCase().includes(needle)) {
|
|
102
|
+
matched.push(makeGetRecord(all.ids[i], all.documents[i], all.metadatas[i]));
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
if (matched.length > 0) {
|
|
106
|
+
matched.sort((a, b) => b.date.localeCompare(a.date));
|
|
107
|
+
return matched.slice(0, nResults);
|
|
108
|
+
}
|
|
109
|
+
return this.search({ query: `changes to ${params.filename}`, nResults, repo: params.repo });
|
|
110
|
+
}
|
|
111
|
+
/** Count indexed commits, optionally filtered by repo. */
|
|
112
|
+
async count(repo) {
|
|
113
|
+
if (!repo)
|
|
114
|
+
return this.col.count();
|
|
115
|
+
const where = buildWhere(undefined, repo);
|
|
116
|
+
const result = this.col.get({ where });
|
|
117
|
+
return result.ids.length;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
// ── Helpers ───────────────────────────────────────────────────────────────────
|
|
121
|
+
function buildWhere(category, repo) {
|
|
122
|
+
const conds = [];
|
|
123
|
+
if (category)
|
|
124
|
+
conds.push({ category: { $eq: category } });
|
|
125
|
+
if (repo)
|
|
126
|
+
conds.push({ repo: { $eq: repo } });
|
|
127
|
+
if (conds.length === 0)
|
|
128
|
+
return undefined;
|
|
129
|
+
if (conds.length === 1)
|
|
130
|
+
return conds[0];
|
|
131
|
+
return { $and: conds };
|
|
132
|
+
}
|
|
133
|
+
function formatQueryResults(raw) {
|
|
134
|
+
const ids = raw.ids?.[0] ?? [];
|
|
135
|
+
const docs = raw.documents?.[0] ?? [];
|
|
136
|
+
const metas = raw.metadatas?.[0] ?? [];
|
|
137
|
+
const dists = raw.distances?.[0] ?? [];
|
|
138
|
+
return ids.map((hash, i) => ({
|
|
139
|
+
commit_hash: hash,
|
|
140
|
+
short_hash: String(metas[i]?.short_hash ?? hash.slice(0, 8)),
|
|
141
|
+
author: String(metas[i]?.author_name ?? 'unknown'),
|
|
142
|
+
date: String(metas[i]?.committed_date ?? ''),
|
|
143
|
+
category: String(metas[i]?.category ?? 'general'),
|
|
144
|
+
files_changed: String(metas[i]?.files_str ?? '').split('|').filter(Boolean),
|
|
145
|
+
summary: docs[i] ?? '',
|
|
146
|
+
relevance_score: Math.round((1.0 - (dists[i] ?? 1.0)) * 10000) / 10000,
|
|
147
|
+
source: 'chroma',
|
|
148
|
+
}));
|
|
149
|
+
}
|
|
150
|
+
function formatGetResults(raw) {
|
|
151
|
+
return raw.ids.map((hash, i) => makeGetRecord(hash, raw.documents[i], raw.metadatas[i]));
|
|
152
|
+
}
|
|
153
|
+
function makeGetRecord(hash, doc, meta) {
|
|
154
|
+
return {
|
|
155
|
+
commit_hash: hash,
|
|
156
|
+
short_hash: String(meta?.short_hash ?? ''),
|
|
157
|
+
author: String(meta?.author_name ?? ''),
|
|
158
|
+
date: String(meta?.committed_date ?? ''),
|
|
159
|
+
category: String(meta?.category ?? 'general'),
|
|
160
|
+
files_changed: String(meta?.files_str ?? '').split('|').filter(Boolean),
|
|
161
|
+
summary: doc ?? '',
|
|
162
|
+
relevance_score: 0,
|
|
163
|
+
source: 'chroma',
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
//# sourceMappingURL=chroma-index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chroma-index.js","sourceRoot":"","sources":["../src/chroma-index.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,311 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Command } from 'commander';
|
|
3
|
+
import { readFileSync, writeFileSync, existsSync, mkdirSync, cpSync } from 'fs';
|
|
4
|
+
import { resolve, basename, dirname } from 'path';
|
|
5
|
+
import { homedir } from 'os';
|
|
6
|
+
import { execSync } from 'child_process';
|
|
7
|
+
import { simpleGit } from 'simple-git';
|
|
8
|
+
import { GitMemoryIndexer } from './indexer.js';
|
|
9
|
+
import { ChromaCommitIndex } from './chroma-index.js';
|
|
10
|
+
import { createEmbeddingFunction } from './embeddings.js';
|
|
11
|
+
import { configFromEnv } from './types.js';
|
|
12
|
+
import { fileURLToPath } from 'url';
|
|
13
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
14
|
+
const __dirname = dirname(__filename);
|
|
15
|
+
// ── CLAUDE.md template ────────────────────────────────────────────────────────
|
|
16
|
+
const MARKER_START = '<!-- git-memory:start -->';
|
|
17
|
+
const MARKER_END = '<!-- git-memory:end -->';
|
|
18
|
+
const CLAUDE_MD_BLOCK = `${MARKER_START}
|
|
19
|
+
|
|
20
|
+
# Git Memory System
|
|
21
|
+
|
|
22
|
+
This project uses **git-memory** — a semantic index over Git commit history for Claude Code.
|
|
23
|
+
|
|
24
|
+
## Always Start Here
|
|
25
|
+
|
|
26
|
+
When beginning any task in this repository:
|
|
27
|
+
|
|
28
|
+
1. Call \`latest_commits(5)\` to understand what changed recently
|
|
29
|
+
2. Call \`search_git_history(<relevant topic>)\` before touching any module with history
|
|
30
|
+
3. After fixing a bug, call \`bug_fix_history(<component>)\` to check for prior regressions
|
|
31
|
+
|
|
32
|
+
## Available Skills
|
|
33
|
+
|
|
34
|
+
| Task | Skill |
|
|
35
|
+
|------|-------|
|
|
36
|
+
| Search commit history for a topic | \`/git-memory-search\` |
|
|
37
|
+
| Index a new repository | \`/git-memory-index\` |
|
|
38
|
+
| Debug why a component behaves a certain way | \`/git-memory-debug\` |
|
|
39
|
+
| Check what's currently indexed | \`/git-memory-status\` |
|
|
40
|
+
|
|
41
|
+
## MCP Tools Reference
|
|
42
|
+
|
|
43
|
+
| Tool | What it gives you | When to use |
|
|
44
|
+
|------|-------------------|-------------|
|
|
45
|
+
| \`search_git_history(query, limit, category)\` | Commits semantically related to a topic | Before editing any significant module |
|
|
46
|
+
| \`latest_commits(limit)\` | N most-recent indexed commits | Session start, before investigating regressions |
|
|
47
|
+
| \`commits_touching_file(filename, limit)\` | All commits that modified a file | Before editing a file |
|
|
48
|
+
| \`bug_fix_history(component, include_security)\` | Bug/security fixes for a component | Before adding new code near known bug areas |
|
|
49
|
+
| \`architecture_decisions(topic, limit)\` | Refactors, migrations, design decisions | Understanding why code is structured a certain way |
|
|
50
|
+
|
|
51
|
+
## Proactive Usage Rules
|
|
52
|
+
|
|
53
|
+
**Always call before editing:**
|
|
54
|
+
\`\`\`
|
|
55
|
+
commits_touching_file("PaymentService.ts") # know what's changed here before
|
|
56
|
+
bug_fix_history("auth") # avoid re-introducing fixed bugs
|
|
57
|
+
\`\`\`
|
|
58
|
+
|
|
59
|
+
**Always call at session start:**
|
|
60
|
+
\`\`\`
|
|
61
|
+
latest_commits(10) # what changed while you were away?
|
|
62
|
+
\`\`\`
|
|
63
|
+
|
|
64
|
+
## Category Filter Values
|
|
65
|
+
|
|
66
|
+
Use \`category=\` in \`search_git_history()\` to narrow results:
|
|
67
|
+
|
|
68
|
+
| Category | Matches |
|
|
69
|
+
|----------|---------|
|
|
70
|
+
| \`fix\` | Bug fixes, hotfixes, patches |
|
|
71
|
+
| \`feat\` | New features |
|
|
72
|
+
| \`security\` | Security-related changes |
|
|
73
|
+
| \`refactor\` | Code refactors |
|
|
74
|
+
| \`migration\` | Database/schema migrations |
|
|
75
|
+
| \`arch\` | Architecture decisions |
|
|
76
|
+
| \`perf\` | Performance improvements |
|
|
77
|
+
|
|
78
|
+
${MARKER_END}`;
|
|
79
|
+
// ── Helpers ───────────────────────────────────────────────────────────────────
|
|
80
|
+
function installClaudeMd(repoPath) {
|
|
81
|
+
const mdPath = resolve(repoPath, 'CLAUDE.md');
|
|
82
|
+
if (existsSync(mdPath)) {
|
|
83
|
+
const existing = readFileSync(mdPath, 'utf-8');
|
|
84
|
+
if (existing.includes(MARKER_START) && existing.includes(MARKER_END)) {
|
|
85
|
+
// Replace existing block in-place
|
|
86
|
+
const pattern = new RegExp(escapeRegex(MARKER_START) + '[\\s\\S]*?' + escapeRegex(MARKER_END));
|
|
87
|
+
const updated = existing.replace(pattern, CLAUDE_MD_BLOCK);
|
|
88
|
+
writeFileSync(mdPath, updated, 'utf-8');
|
|
89
|
+
console.log(`✓ Updated git-memory block in ${mdPath}`);
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
// Prepend block to existing file
|
|
93
|
+
writeFileSync(mdPath, CLAUDE_MD_BLOCK + '\n\n' + existing, 'utf-8');
|
|
94
|
+
console.log(`✓ Prepended git-memory block to ${mdPath}`);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
writeFileSync(mdPath, CLAUDE_MD_BLOCK + '\n', 'utf-8');
|
|
99
|
+
console.log(`✓ Created ${mdPath}`);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
function escapeRegex(str) {
|
|
103
|
+
return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
104
|
+
}
|
|
105
|
+
/** Locate the bundled skills directory. */
|
|
106
|
+
function findSkillsDir() {
|
|
107
|
+
// When running from dist/cli.js, skills/ is two levels up (project root)
|
|
108
|
+
const fromDist = resolve(__dirname, '..', 'skills');
|
|
109
|
+
if (existsSync(fromDist))
|
|
110
|
+
return fromDist;
|
|
111
|
+
// When running via tsx src/cli.ts
|
|
112
|
+
const fromSrc = resolve(__dirname, '..', 'skills');
|
|
113
|
+
if (existsSync(fromSrc))
|
|
114
|
+
return fromSrc;
|
|
115
|
+
throw new Error('Skills directory not found. Reinstall git-memory.');
|
|
116
|
+
}
|
|
117
|
+
/** Find the git-memory binary path. */
|
|
118
|
+
function findBin() {
|
|
119
|
+
try {
|
|
120
|
+
return execSync('which git-memory').toString().trim();
|
|
121
|
+
}
|
|
122
|
+
catch {
|
|
123
|
+
return 'npx git-memory';
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
// ── Commands ──────────────────────────────────────────────────────────────────
|
|
127
|
+
async function indexCmd(opts) {
|
|
128
|
+
const config = configFromEnv();
|
|
129
|
+
config.repoPath = resolve(opts.repoPath);
|
|
130
|
+
if (opts.userId)
|
|
131
|
+
config.userId = opts.userId;
|
|
132
|
+
const indexer = await GitMemoryIndexer.create(config);
|
|
133
|
+
const stats = await indexer.indexAll({
|
|
134
|
+
branch: opts.branch,
|
|
135
|
+
limit: opts.limit,
|
|
136
|
+
dryRun: opts.dryRun,
|
|
137
|
+
});
|
|
138
|
+
console.log('\n── Indexing Summary ─────────────────────────────');
|
|
139
|
+
for (const [k, v] of Object.entries(stats)) {
|
|
140
|
+
console.log(` ${k.padEnd(25)} ${v}`);
|
|
141
|
+
}
|
|
142
|
+
console.log();
|
|
143
|
+
}
|
|
144
|
+
async function serveCmd() {
|
|
145
|
+
// Import and run mcp-server.ts — it has its own main()
|
|
146
|
+
await import('./mcp-server.js');
|
|
147
|
+
}
|
|
148
|
+
async function storeCmd(commitRef, opts) {
|
|
149
|
+
const { storeCommit } = await import('./store.js');
|
|
150
|
+
const stored = await storeCommit(commitRef ?? 'HEAD', {
|
|
151
|
+
repoPath: resolve(opts.repoPath),
|
|
152
|
+
userId: opts.userId,
|
|
153
|
+
force: opts.force,
|
|
154
|
+
});
|
|
155
|
+
process.exit(stored ? 0 : 1);
|
|
156
|
+
}
|
|
157
|
+
async function statusCmd(opts) {
|
|
158
|
+
const repoPath = resolve(opts.repoPath);
|
|
159
|
+
const config = configFromEnv();
|
|
160
|
+
config.repoPath = repoPath;
|
|
161
|
+
const embedFn = await createEmbeddingFunction(config.embedProvider, config.embedModel, config.ollamaUrl, config.openaiApiKey);
|
|
162
|
+
const chroma = await ChromaCommitIndex.create(config.chromaDir, embedFn);
|
|
163
|
+
const git = simpleGit(repoPath);
|
|
164
|
+
let totalCommits = '?';
|
|
165
|
+
let repoName = basename(repoPath);
|
|
166
|
+
try {
|
|
167
|
+
const root = await git.revparse(['--show-toplevel']);
|
|
168
|
+
repoName = basename(root.trim());
|
|
169
|
+
const log = await git.log();
|
|
170
|
+
totalCommits = log.total;
|
|
171
|
+
}
|
|
172
|
+
catch { /* use fallbacks */ }
|
|
173
|
+
const count = await chroma.count(repoName);
|
|
174
|
+
const countAll = await chroma.count();
|
|
175
|
+
console.log('\n── git-memory status ──────────────────────────');
|
|
176
|
+
console.log(` Repo : ${repoName}`);
|
|
177
|
+
console.log(` Chroma docs : ${count} (this repo) / ${countAll} (all repos)`);
|
|
178
|
+
console.log(` Total commits : ${totalCommits}`);
|
|
179
|
+
if (typeof totalCommits === 'number' && totalCommits > 0) {
|
|
180
|
+
console.log(` Coverage : ${Math.round(count / totalCommits * 100)}%`);
|
|
181
|
+
}
|
|
182
|
+
console.log(` Embed provider: ${config.embedProvider}`);
|
|
183
|
+
console.log();
|
|
184
|
+
}
|
|
185
|
+
async function installCmd(opts) {
|
|
186
|
+
const repoPath = resolve(opts.repoPath);
|
|
187
|
+
// 1. Validate git repo
|
|
188
|
+
const git = simpleGit(repoPath);
|
|
189
|
+
let repoRoot;
|
|
190
|
+
try {
|
|
191
|
+
repoRoot = (await git.revparse(['--show-toplevel'])).trim();
|
|
192
|
+
}
|
|
193
|
+
catch {
|
|
194
|
+
console.error(`Error: ${repoPath} is not inside a Git repository.`);
|
|
195
|
+
process.exit(1);
|
|
196
|
+
}
|
|
197
|
+
const repoName = basename(repoRoot);
|
|
198
|
+
const userId = opts.userId ?? repoName;
|
|
199
|
+
// 2. Install skills
|
|
200
|
+
if (!opts.mcpOnly) {
|
|
201
|
+
try {
|
|
202
|
+
const skillsSrc = findSkillsDir();
|
|
203
|
+
const skillsDst = resolve(homedir(), '.claude', 'skills');
|
|
204
|
+
mkdirSync(skillsDst, { recursive: true });
|
|
205
|
+
const { readdirSync, statSync } = await import('fs');
|
|
206
|
+
const installed = [];
|
|
207
|
+
for (const entry of readdirSync(skillsSrc)) {
|
|
208
|
+
const srcDir = resolve(skillsSrc, entry);
|
|
209
|
+
if (statSync(srcDir).isDirectory()) {
|
|
210
|
+
const dstDir = resolve(skillsDst, entry);
|
|
211
|
+
cpSync(srcDir, dstDir, { recursive: true });
|
|
212
|
+
installed.push(entry);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
console.log(`\n✓ Installed ${installed.length} skills to ${skillsDst}:`);
|
|
216
|
+
for (const s of installed)
|
|
217
|
+
console.log(` /${s}`);
|
|
218
|
+
}
|
|
219
|
+
catch (e) {
|
|
220
|
+
console.warn(`Warning: Could not install skills: ${e}`);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
// 3. Configure MCP server in .claude.json
|
|
224
|
+
if (!opts.skillsOnly) {
|
|
225
|
+
const claudeJsonPath = resolve(repoRoot, '.claude.json');
|
|
226
|
+
let existing = {};
|
|
227
|
+
if (existsSync(claudeJsonPath)) {
|
|
228
|
+
try {
|
|
229
|
+
existing = JSON.parse(readFileSync(claudeJsonPath, 'utf-8'));
|
|
230
|
+
}
|
|
231
|
+
catch { /* start fresh */ }
|
|
232
|
+
}
|
|
233
|
+
const mcpServers = (existing.mcpServers ?? {});
|
|
234
|
+
mcpServers['git-memory'] = {
|
|
235
|
+
command: 'git-memory',
|
|
236
|
+
args: ['serve'],
|
|
237
|
+
env: {
|
|
238
|
+
GIT_MEMORY_REPO_PATH: repoRoot,
|
|
239
|
+
GIT_MEMORY_USER_ID: userId,
|
|
240
|
+
},
|
|
241
|
+
};
|
|
242
|
+
existing.mcpServers = mcpServers;
|
|
243
|
+
writeFileSync(claudeJsonPath, JSON.stringify(existing, null, 2) + '\n', 'utf-8');
|
|
244
|
+
console.log(`\n── MCP Server Config ──────────────────────────────`);
|
|
245
|
+
console.log(`✓ Configured MCP server in ${claudeJsonPath}`);
|
|
246
|
+
console.log(`\n Repo path : ${repoRoot}`);
|
|
247
|
+
console.log(` User ID : ${userId}`);
|
|
248
|
+
}
|
|
249
|
+
// 4. Update CLAUDE.md
|
|
250
|
+
console.log(`\n── CLAUDE.md ──────────────────────────────────────`);
|
|
251
|
+
installClaudeMd(repoRoot);
|
|
252
|
+
// 5. Auto-index (unless --no-index)
|
|
253
|
+
const shouldIndex = opts.index !== false;
|
|
254
|
+
if (shouldIndex) {
|
|
255
|
+
console.log(`\n── Indexing repository ─────────────────────────────`);
|
|
256
|
+
try {
|
|
257
|
+
const config = configFromEnv();
|
|
258
|
+
config.repoPath = repoRoot;
|
|
259
|
+
config.userId = userId;
|
|
260
|
+
const indexer = await GitMemoryIndexer.create(config);
|
|
261
|
+
const stats = await indexer.indexAll({});
|
|
262
|
+
console.log(`✓ Indexed ${stats.stored} commits ` +
|
|
263
|
+
`(${stats.skipped_duplicate} duplicates, ${stats.skipped_irrelevant} irrelevant)`);
|
|
264
|
+
}
|
|
265
|
+
catch (e) {
|
|
266
|
+
console.warn(`Warning: Auto-indexing failed: ${e}`);
|
|
267
|
+
console.warn(` You can index manually later with: git-memory index`);
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
console.log(`\n Restart Claude Code to pick up the new MCP server.\n`);
|
|
271
|
+
}
|
|
272
|
+
// ── Program definition ────────────────────────────────────────────────────────
|
|
273
|
+
const program = new Command();
|
|
274
|
+
program
|
|
275
|
+
.name('git-memory')
|
|
276
|
+
.description('Semantic Git history index for Claude Code')
|
|
277
|
+
.version('0.1.0');
|
|
278
|
+
program.command('index')
|
|
279
|
+
.description('Bulk-index a repository commit history into ChromaDB')
|
|
280
|
+
.option('--repo-path <path>', 'Path to git repository', process.cwd())
|
|
281
|
+
.option('--user-id <id>', 'Namespace identifier for this repo')
|
|
282
|
+
.option('--branch <branch>', 'Branch to index', 'HEAD')
|
|
283
|
+
.option('--limit <n>', 'Max commits to index', (v) => parseInt(v, 10))
|
|
284
|
+
.option('--dry-run', 'Preview without writing')
|
|
285
|
+
.action(indexCmd);
|
|
286
|
+
program.command('serve')
|
|
287
|
+
.description('Start MCP server (stdio)')
|
|
288
|
+
.action(serveCmd);
|
|
289
|
+
program.command('store [commit-ref]')
|
|
290
|
+
.description('Store a single commit (for post-commit hook). Defaults to HEAD.')
|
|
291
|
+
.option('--repo-path <path>', 'Path to git repository', process.cwd())
|
|
292
|
+
.option('--user-id <id>', 'Namespace identifier')
|
|
293
|
+
.option('--force', 'Store even if commit message has no signal keywords')
|
|
294
|
+
.action(storeCmd);
|
|
295
|
+
program.command('status')
|
|
296
|
+
.description('Show index statistics for a repository')
|
|
297
|
+
.option('--repo-path <path>', 'Path to git repository', process.cwd())
|
|
298
|
+
.action(statusCmd);
|
|
299
|
+
program.command('install')
|
|
300
|
+
.description('Install Claude Code skills + configure MCP server')
|
|
301
|
+
.option('--repo-path <path>', 'Path to git repository', process.cwd())
|
|
302
|
+
.option('--user-id <id>', 'Namespace identifier for this repo')
|
|
303
|
+
.option('--skills-only', 'Only install skill files, skip MCP config')
|
|
304
|
+
.option('--mcp-only', 'Only configure MCP server, skip skills')
|
|
305
|
+
.option('--no-index', 'Skip auto-indexing after install')
|
|
306
|
+
.action(installCmd);
|
|
307
|
+
program.parseAsync(process.argv).catch(e => {
|
|
308
|
+
console.error(e);
|
|
309
|
+
process.exit(1);
|
|
310
|
+
});
|
|
311
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import type { CommitRecord, CommitMetadata, GitMemoryConfig } from './types.js';
|
|
2
|
+
import type { IEmbeddingFunction } from './embeddings.js';
|
|
3
|
+
export declare class ContextStore {
|
|
4
|
+
private col;
|
|
5
|
+
private llm;
|
|
6
|
+
private llmModel;
|
|
7
|
+
private constructor();
|
|
8
|
+
/**
|
|
9
|
+
* Async factory — opens (or creates) the local SQLite context store and detects LLM availability.
|
|
10
|
+
* LLM detection order (matches Python _default_mem0_config() priority):
|
|
11
|
+
* 1. OPENAI_API_KEY set → use OpenAI gpt-4o-mini
|
|
12
|
+
* 2. otherwise → attempt Ollama at OLLAMA_URL
|
|
13
|
+
* 3. Ollama fails → llm = null (graceful degradation)
|
|
14
|
+
*/
|
|
15
|
+
static create(config: GitMemoryConfig, embedFn: IEmbeddingFunction): Promise<ContextStore>;
|
|
16
|
+
/**
|
|
17
|
+
* Extract LLM interpretation and store it.
|
|
18
|
+
* Mirrors Python: memory.add(messages=[{"role":"user","content":summary}], metadata)
|
|
19
|
+
*
|
|
20
|
+
* Flow:
|
|
21
|
+
* 1. If llm is null → no-op (graceful degradation)
|
|
22
|
+
* 2. Dedup check — skip if hash already stored
|
|
23
|
+
* 3. Extract 1–2 sentence interpretation via LLM
|
|
24
|
+
* 4. Store extracted text + metadata in collection
|
|
25
|
+
*/
|
|
26
|
+
addCommit(params: {
|
|
27
|
+
hash: string;
|
|
28
|
+
summary: string;
|
|
29
|
+
metadata: CommitMetadata;
|
|
30
|
+
userId: string;
|
|
31
|
+
}): Promise<void>;
|
|
32
|
+
/**
|
|
33
|
+
* Semantic search on extracted context collection.
|
|
34
|
+
* Returns CommitRecord[] with the LLM interpretation as the summary field.
|
|
35
|
+
*/
|
|
36
|
+
search(params: {
|
|
37
|
+
query: string;
|
|
38
|
+
userId: string;
|
|
39
|
+
limit: number;
|
|
40
|
+
}): Promise<CommitRecord[]>;
|
|
41
|
+
/**
|
|
42
|
+
* Get all stored context entries (for latest_commits enrichment map).
|
|
43
|
+
* Matches Python: mem.get_all(user_id=USER_ID)
|
|
44
|
+
*/
|
|
45
|
+
getAll(_userId: string): Promise<CommitRecord[]>;
|
|
46
|
+
/** Whether LLM context extraction is available. */
|
|
47
|
+
get isActive(): boolean;
|
|
48
|
+
/**
|
|
49
|
+
* Call LLM to extract a concise interpretation of a commit.
|
|
50
|
+
* Prompt matches spirit of mem0's extraction: brief, why-focused.
|
|
51
|
+
*/
|
|
52
|
+
private extractContext;
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=context-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-store.d.ts","sourceRoot":"","sources":["../src/context-store.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAkB,YAAY,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAChG,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAQ1D,qBAAa,YAAY;IACvB,OAAO,CAAC,GAAG,CAAmB;IAC9B,OAAO,CAAC,GAAG,CAAmB;IAC9B,OAAO,CAAC,QAAQ,CAAS;IAEzB,OAAO;IAMP;;;;;;OAMG;WACU,MAAM,CAAC,MAAM,EAAE,eAAe,EAAE,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,YAAY,CAAC;IA8BhG;;;;;;;;;OASG;IACG,SAAS,CAAC,MAAM,EAAE;QACtB,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,EAAE,cAAc,CAAC;QACzB,MAAM,EAAE,MAAM,CAAC;KAChB,GAAG,OAAO,CAAC,IAAI,CAAC;IA6BjB;;;OAGG;IACG,MAAM,CAAC,MAAM,EAAE;QACnB,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,EAAE,MAAM,CAAC;KACf,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAiB3B;;;OAGG;IACG,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAStD,mDAAmD;IACnD,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAID;;;OAGG;YACW,cAAc;CA6B7B"}
|