@m2015agg/git-skill 0.3.0 → 0.4.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/README.md +42 -1
- package/dist/commands/docs.js +8 -0
- package/dist/commands/docs.js.map +1 -1
- package/dist/commands/embed.js +40 -4
- package/dist/commands/embed.js.map +1 -1
- package/dist/commands/enrich.js +13 -0
- package/dist/commands/enrich.js.map +1 -1
- package/dist/commands/search.js +21 -4
- package/dist/commands/search.js.map +1 -1
- package/dist/util/db.js +12 -0
- package/dist/util/db.js.map +1 -1
- package/dist/util/embedding.d.ts +2 -0
- package/dist/util/embedding.js +8 -0
- package/dist/util/embedding.js.map +1 -1
- package/dist/util/search-hybrid.d.ts +3 -0
- package/dist/util/search-hybrid.js +79 -0
- package/dist/util/search-hybrid.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -148,6 +148,8 @@ git-skill why <hash> # View enrichment for a commit
|
|
|
148
148
|
| `git-skill diff-summary <range>` | Range summary (e.g., `v1.0..v1.1`) |
|
|
149
149
|
| `git-skill why <hash>` | Commit intent/reasoning |
|
|
150
150
|
| `git-skill regression` | Change-point detection |
|
|
151
|
+
| `git-skill verify` | Check staged changes against history (was this tried before?) |
|
|
152
|
+
| `git-skill context-update` | Refresh Claude memory with codebase health |
|
|
151
153
|
| `git-skill doctor` | Health check |
|
|
152
154
|
|
|
153
155
|
### Write (require confirmation)
|
|
@@ -198,6 +200,43 @@ Automatically tracked per commit:
|
|
|
198
200
|
- **Time-to-commit** — time between commits
|
|
199
201
|
- **Same-file churn** — same file 3+ times in recent commits (thrashing)
|
|
200
202
|
|
|
203
|
+
## Smart Churn Alerts
|
|
204
|
+
|
|
205
|
+
Automatically detected and written to Claude's memory on every commit:
|
|
206
|
+
|
|
207
|
+
- **Thrashing** — `[WARN] Thrashing: block_generator.py edited 5 times in last 10 commits`
|
|
208
|
+
- **Revert chains** — `[WARN] Reverted: rag.py involved in 2 reverts recently`
|
|
209
|
+
- **Fix-on-fix** — `[WARN] Fix-on-fix: semantic_tier.py has 3 sequential fixes`
|
|
210
|
+
- **Elevated rates** — `[WARN] Revert rate: 10.0% (threshold: 5%)`
|
|
211
|
+
|
|
212
|
+
These appear in Claude's memory at session start. No manual action needed — the post-commit hook keeps them fresh.
|
|
213
|
+
|
|
214
|
+
## Verify: "Was This Tried Before?"
|
|
215
|
+
|
|
216
|
+
Check staged changes against enriched history before committing:
|
|
217
|
+
|
|
218
|
+
```bash
|
|
219
|
+
git-skill verify # Check all staged changes
|
|
220
|
+
git-skill verify --file src/foo.py # Check specific file
|
|
221
|
+
git-skill verify --json # Structured output
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
Example output:
|
|
225
|
+
```
|
|
226
|
+
[BLOCK] block_generator.py — max_tokens value
|
|
227
|
+
You're setting max_tokens to 150. This value has been tried before:
|
|
228
|
+
- ea2761a (Mar 27): Set to 150, caused Sonnet to write paragraphs
|
|
229
|
+
- 0090014 (Mar 27): Increased to 200 because 150 truncated Day 2 content
|
|
230
|
+
Suggestion: The problem isn't the token count — it's the prompt structure.
|
|
231
|
+
|
|
232
|
+
[WARN] rag.py — source truncation pattern
|
|
233
|
+
Similar approach tried in eeea6a4 and reverted in e0137be (prod risk).
|
|
234
|
+
|
|
235
|
+
[PASS] api/routes.py — no concerning history
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
Works without an LLM configured (local-only analysis shows edit counts and revert history). With an LLM configured, provides deep reasoning about why previous attempts failed.
|
|
239
|
+
|
|
201
240
|
## Need Help?
|
|
202
241
|
|
|
203
242
|
git-skill is designed for AI agents. If you're using Claude Code, just ask:
|
|
@@ -222,7 +261,9 @@ Claude can read the config, run the commands, and interpret the results. When in
|
|
|
222
261
|
|
|
223
262
|
- [Design Spec](docs/specs/2026-03-31-git-skill-design.md) — Full architecture, schema, algorithms, and test strategy
|
|
224
263
|
- [GeorgeWorks: Memory Integration](docs/specs/context-injection.md) — How context-update writes to Claude's memory system, internal architecture of `findRelevantMemories`, consolidation phases, and thresholds
|
|
225
|
-
- [Opus Verification Layer](docs/specs/opus-verification-layer.md) —
|
|
264
|
+
- [Opus Verification Layer](docs/specs/opus-verification-layer.md) — Design and real-world case studies for the verify command
|
|
265
|
+
- [Churn Alerts + Verify](docs/specs/churn-alerts-and-verify.md) — Passive alerts and active verification implementation details
|
|
266
|
+
- [Team Collaboration](docs/specs/team-collaboration.md) — Brainstorm on sharing enrichments across teams
|
|
226
267
|
|
|
227
268
|
## License
|
|
228
269
|
|
package/dist/commands/docs.js
CHANGED
|
@@ -17,6 +17,8 @@ export function getSkillDoc() {
|
|
|
17
17
|
| \`git-skill diff-summary <range>\` | Range summary |
|
|
18
18
|
| \`git-skill why <hash>\` | Commit intent/reasoning |
|
|
19
19
|
| \`git-skill regression\` | Change-point detection |
|
|
20
|
+
| \`git-skill verify\` | Check staged changes against history (was this tried before?) |
|
|
21
|
+
| \`git-skill context-update\` | Refresh Claude memory with codebase health |
|
|
20
22
|
| \`git-skill doctor\` | Health check |
|
|
21
23
|
|
|
22
24
|
### Write Commands (require confirmation)
|
|
@@ -25,6 +27,12 @@ export function getSkillDoc() {
|
|
|
25
27
|
| \`git-skill release-notes <range>\` | Generate release notes |
|
|
26
28
|
| \`git-skill embed\` | Generate embeddings |
|
|
27
29
|
|
|
30
|
+
### Smart Alerts (automatic, written to Claude memory)
|
|
31
|
+
- Thrashing detection: files edited 3+ times in last 10 commits
|
|
32
|
+
- Revert chain detection: files involved in recent reverts
|
|
33
|
+
- Fix-on-fix detection: sequential fix commits on same file
|
|
34
|
+
- Runs on every commit (post-commit hook) and nightly (cron)
|
|
35
|
+
|
|
28
36
|
### Global Flags
|
|
29
37
|
- \`--json\` — structured output
|
|
30
38
|
- \`--limit N\` — cap results
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"docs.js","sourceRoot":"","sources":["../../src/commands/docs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,SAAS,KAAK,CAAC,GAAW,IAAU,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAEhE,MAAM,UAAU,WAAW;IACzB,OAAO
|
|
1
|
+
{"version":3,"file":"docs.js","sourceRoot":"","sources":["../../src/commands/docs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,SAAS,KAAK,CAAC,GAAW,IAAU,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAEhE,MAAM,UAAU,WAAW;IACzB,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;wDAmC+C,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC;SACvB,WAAW,CAAC,sCAAsC,CAAC;SACnD,MAAM,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACpD,CAAC"}
|
package/dist/commands/embed.js
CHANGED
|
@@ -2,7 +2,7 @@ import { Command } from "commander";
|
|
|
2
2
|
import { join } from "path";
|
|
3
3
|
import { openDb, hasDb } from "../util/db.js";
|
|
4
4
|
import { readConfig } from "../util/config.js";
|
|
5
|
-
import { generateEmbedding } from "../util/embedding.js";
|
|
5
|
+
import { generateEmbedding, vectorToBuffer } from "../util/embedding.js";
|
|
6
6
|
export function embedCommand() {
|
|
7
7
|
return new Command("embed")
|
|
8
8
|
.description("Generate/refresh embeddings for commit messages")
|
|
@@ -48,9 +48,7 @@ export function embedCommand() {
|
|
|
48
48
|
for (const commit of commits) {
|
|
49
49
|
const result = await generateEmbedding(commit.message);
|
|
50
50
|
if (result) {
|
|
51
|
-
const buf =
|
|
52
|
-
const arr = new Float32Array(result.vector);
|
|
53
|
-
Buffer.from(arr.buffer).copy(buf);
|
|
51
|
+
const buf = vectorToBuffer(result.vector);
|
|
54
52
|
insertEmbed.run({
|
|
55
53
|
commitHash: commit.hash,
|
|
56
54
|
contentType: "message",
|
|
@@ -65,6 +63,44 @@ export function embedCommand() {
|
|
|
65
63
|
}
|
|
66
64
|
}
|
|
67
65
|
process.stdout.write(`Done. Embedded: ${successCount}, Failed: ${failCount}\n`);
|
|
66
|
+
// Second pass: embed enrichments
|
|
67
|
+
let enrichQuery = `SELECT e.commit_hash, e.intent, e.reasoning
|
|
68
|
+
FROM enrichments e
|
|
69
|
+
LEFT JOIN embeddings emb ON e.commit_hash = emb.commit_hash AND emb.content_type = 'enrichment'
|
|
70
|
+
WHERE emb.commit_hash IS NULL`;
|
|
71
|
+
if (opts.force) {
|
|
72
|
+
enrichQuery = "SELECT commit_hash, intent, reasoning FROM enrichments";
|
|
73
|
+
}
|
|
74
|
+
const enrichments = (limit > 0
|
|
75
|
+
? db.prepare(enrichQuery + " LIMIT ?").all(limit)
|
|
76
|
+
: db.prepare(enrichQuery).all());
|
|
77
|
+
if (enrichments.length > 0) {
|
|
78
|
+
process.stdout.write(`Embedding ${enrichments.length} enrichments...\n`);
|
|
79
|
+
let enrichSuccess = 0;
|
|
80
|
+
let enrichFail = 0;
|
|
81
|
+
for (const enrichment of enrichments) {
|
|
82
|
+
const text = [enrichment.intent, enrichment.reasoning].filter(Boolean).join(" ");
|
|
83
|
+
const result = await generateEmbedding(text);
|
|
84
|
+
if (result) {
|
|
85
|
+
const buf = vectorToBuffer(result.vector);
|
|
86
|
+
insertEmbed.run({
|
|
87
|
+
commitHash: enrichment.commit_hash,
|
|
88
|
+
contentType: "enrichment",
|
|
89
|
+
vector: buf,
|
|
90
|
+
model: result.model,
|
|
91
|
+
createdAt: new Date().toISOString(),
|
|
92
|
+
});
|
|
93
|
+
enrichSuccess++;
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
enrichFail++;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
process.stdout.write(`Done. Enrichment embeddings: ${enrichSuccess}, Failed: ${enrichFail}\n`);
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
process.stdout.write("No enrichments to embed.\n");
|
|
103
|
+
}
|
|
68
104
|
}
|
|
69
105
|
finally {
|
|
70
106
|
db.close();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"embed.js","sourceRoot":"","sources":["../../src/commands/embed.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"embed.js","sourceRoot":"","sources":["../../src/commands/embed.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/enrich.js
CHANGED
|
@@ -4,6 +4,7 @@ import { execFileSync } from "child_process";
|
|
|
4
4
|
import { openDb, hasDb } from "../util/db.js";
|
|
5
5
|
import { readConfig } from "../util/config.js";
|
|
6
6
|
import { loadDotEnv, resolveEnvVar } from "../util/env.js";
|
|
7
|
+
import { generateEmbedding, vectorToBuffer } from "../util/embedding.js";
|
|
7
8
|
function getDiff(cwd, hash, maxChars = 3000) {
|
|
8
9
|
try {
|
|
9
10
|
const raw = execFileSync("git", ["show", "--patch", "--no-color", hash], {
|
|
@@ -213,6 +214,18 @@ export function enrichCommand() {
|
|
|
213
214
|
sessionContext: result.session_context ?? null,
|
|
214
215
|
});
|
|
215
216
|
successCount++;
|
|
217
|
+
// Best-effort: embed the enrichment if embedding is configured
|
|
218
|
+
try {
|
|
219
|
+
const enrichText = [intentParts.join(" | "), result.reasoning].filter(Boolean).join(" ");
|
|
220
|
+
const embResult = await generateEmbedding(enrichText);
|
|
221
|
+
if (embResult) {
|
|
222
|
+
db.prepare(`
|
|
223
|
+
INSERT OR REPLACE INTO embeddings (commit_hash, content_type, vector, model, created_at)
|
|
224
|
+
VALUES (?, 'enrichment', ?, ?, ?)
|
|
225
|
+
`).run(commit.hash, vectorToBuffer(embResult.vector), embResult.model, new Date().toISOString());
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
catch { /* embedding is best-effort */ }
|
|
216
229
|
}
|
|
217
230
|
else {
|
|
218
231
|
failCount++;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"enrich.js","sourceRoot":"","sources":["../../src/commands/enrich.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"enrich.js","sourceRoot":"","sources":["../../src/commands/enrich.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/search.js
CHANGED
|
@@ -1,19 +1,20 @@
|
|
|
1
1
|
import { Command } from "commander";
|
|
2
2
|
import { join } from "path";
|
|
3
3
|
import { openDb, hasDb } from "../util/db.js";
|
|
4
|
-
import { searchBM25 } from "../util/search-hybrid.js";
|
|
4
|
+
import { searchBM25, hybridSearch, hasEmbeddings } from "../util/search-hybrid.js";
|
|
5
5
|
function write(msg) {
|
|
6
6
|
process.stdout.write(msg);
|
|
7
7
|
}
|
|
8
8
|
export function searchCommand() {
|
|
9
9
|
return new Command("search")
|
|
10
|
-
.description("Search git history
|
|
10
|
+
.description("Search git history (hybrid BM25 + semantic when embeddings exist)")
|
|
11
11
|
.argument("<query>", "Search query")
|
|
12
12
|
.option("--limit <n>", "Maximum results", "20")
|
|
13
13
|
.option("--json", "Output as JSON")
|
|
14
14
|
.option("--since <date>", "Only show results from commits after this date")
|
|
15
15
|
.option("--until <date>", "Only show results from commits before this date")
|
|
16
|
-
.
|
|
16
|
+
.option("--bm25", "Force BM25-only search (skip semantic)")
|
|
17
|
+
.action(async (query, opts) => {
|
|
17
18
|
const cwd = process.cwd();
|
|
18
19
|
const historyDir = join(cwd, ".git-history");
|
|
19
20
|
if (!hasDb(historyDir)) {
|
|
@@ -23,7 +24,13 @@ export function searchCommand() {
|
|
|
23
24
|
const db = openDb(historyDir);
|
|
24
25
|
try {
|
|
25
26
|
const limit = parseInt(opts.limit, 10) || 20;
|
|
26
|
-
let results
|
|
27
|
+
let results;
|
|
28
|
+
if (opts.bm25 || !hasEmbeddings(db)) {
|
|
29
|
+
results = searchBM25(db, query, limit);
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
results = await hybridSearch(db, query, limit);
|
|
33
|
+
}
|
|
27
34
|
// Filter by date if --since or --until provided
|
|
28
35
|
if ((opts.since || opts.until) && results.length > 0) {
|
|
29
36
|
const hashes = [...new Set(results.map(r => r.hash))];
|
|
@@ -83,6 +90,16 @@ export function searchCommand() {
|
|
|
83
90
|
write(` ${shortHash} ${r.path} [${r.detail}] (${date})\n`);
|
|
84
91
|
}
|
|
85
92
|
}
|
|
93
|
+
const enrichResults = results.filter(r => r.type === "enrichment");
|
|
94
|
+
if (enrichResults.length > 0) {
|
|
95
|
+
write("\nEnrichments:\n");
|
|
96
|
+
for (const r of enrichResults) {
|
|
97
|
+
const shortHash = r.hash.slice(0, 7);
|
|
98
|
+
const meta = commitMeta.get(r.hash);
|
|
99
|
+
const date = meta ? meta.timestamp.slice(0, 10) : "";
|
|
100
|
+
write(` ${shortHash} ${r.message.slice(0, 80)} (${date})\n`);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
86
103
|
write("\n");
|
|
87
104
|
}
|
|
88
105
|
finally {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/commands/search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAgB,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/commands/search.ts"],"names":[],"mappings":"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"}
|
package/dist/util/db.js
CHANGED
|
@@ -169,6 +169,18 @@ function initSchema(db) {
|
|
|
169
169
|
value TEXT
|
|
170
170
|
);
|
|
171
171
|
`);
|
|
172
|
+
// Unique index for embeddings dedup — try-catch for existing DBs with duplicates
|
|
173
|
+
try {
|
|
174
|
+
db.exec("CREATE UNIQUE INDEX IF NOT EXISTS idx_embeddings_hash_type ON embeddings(commit_hash, content_type)");
|
|
175
|
+
}
|
|
176
|
+
catch {
|
|
177
|
+
// Existing DB may have duplicates — dedup first, then retry
|
|
178
|
+
try {
|
|
179
|
+
db.exec("DELETE FROM embeddings WHERE id NOT IN (SELECT MIN(id) FROM embeddings GROUP BY commit_hash, content_type)");
|
|
180
|
+
db.exec("CREATE UNIQUE INDEX IF NOT EXISTS idx_embeddings_hash_type ON embeddings(commit_hash, content_type)");
|
|
181
|
+
}
|
|
182
|
+
catch { /* ignore — index creation is best-effort */ }
|
|
183
|
+
}
|
|
172
184
|
db.prepare("INSERT OR REPLACE INTO schema_meta (key, value) VALUES ('schema_version', ?)").run(String(SCHEMA_VERSION));
|
|
173
185
|
}
|
|
174
186
|
function getSchemaVersion(db) {
|
package/dist/util/db.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"db.js","sourceRoot":"","sources":["../../src/util/db.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAEhC,MAAM,cAAc,GAAG,CAAC,CAAC;AAEzB,MAAM,UAAU,MAAM,CAAC,UAAkB;IACvC,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;IAC9C,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC;IAChC,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;IAChC,EAAE,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC;IACjC,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;IAChC,UAAU,CAAC,EAAE,CAAC,CAAC;IACf,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,UAAkB;IACtC,OAAO,UAAU,CAAC,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC,CAAC;AACpD,CAAC;AAED,SAAS,UAAU,CAAC,EAAqB;IACvC,MAAM,cAAc,GAAG,gBAAgB,CAAC,EAAE,CAAC,CAAC;IAC5C,IAAI,cAAc,IAAI,cAAc;QAAE,OAAO;IAE7C,EAAE,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsJP,CAAC,CAAC;IAEH,EAAE,CAAC,OAAO,CAAC,8EAA8E,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC;AACzH,CAAC;AAED,SAAS,gBAAgB,CAAC,EAAqB;IAC7C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,4DAA4D,CAAC,CAAC,GAAG,EAAmC,CAAC;QAC5H,OAAO,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,CAAC;IACX,CAAC;AACH,CAAC"}
|
|
1
|
+
{"version":3,"file":"db.js","sourceRoot":"","sources":["../../src/util/db.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAEhC,MAAM,cAAc,GAAG,CAAC,CAAC;AAEzB,MAAM,UAAU,MAAM,CAAC,UAAkB;IACvC,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;IAC9C,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC;IAChC,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;IAChC,EAAE,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC;IACjC,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;IAChC,UAAU,CAAC,EAAE,CAAC,CAAC;IACf,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,UAAkB;IACtC,OAAO,UAAU,CAAC,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC,CAAC;AACpD,CAAC;AAED,SAAS,UAAU,CAAC,EAAqB;IACvC,MAAM,cAAc,GAAG,gBAAgB,CAAC,EAAE,CAAC,CAAC;IAC5C,IAAI,cAAc,IAAI,cAAc;QAAE,OAAO;IAE7C,EAAE,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsJP,CAAC,CAAC;IAEH,iFAAiF;IACjF,IAAI,CAAC;QACH,EAAE,CAAC,IAAI,CAAC,qGAAqG,CAAC,CAAC;IACjH,CAAC;IAAC,MAAM,CAAC;QACP,4DAA4D;QAC5D,IAAI,CAAC;YACH,EAAE,CAAC,IAAI,CAAC,4GAA4G,CAAC,CAAC;YACtH,EAAE,CAAC,IAAI,CAAC,qGAAqG,CAAC,CAAC;QACjH,CAAC;QAAC,MAAM,CAAC,CAAC,4CAA4C,CAAC,CAAC;IAC1D,CAAC;IAED,EAAE,CAAC,OAAO,CAAC,8EAA8E,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC;AACzH,CAAC;AAED,SAAS,gBAAgB,CAAC,EAAqB;IAC7C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,4DAA4D,CAAC,CAAC,GAAG,EAAmC,CAAC;QAC5H,OAAO,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,CAAC;IACX,CAAC;AACH,CAAC"}
|
package/dist/util/embedding.d.ts
CHANGED
|
@@ -4,3 +4,5 @@ export interface EmbeddingResult {
|
|
|
4
4
|
}
|
|
5
5
|
export declare function generateEmbedding(text: string): Promise<EmbeddingResult | null>;
|
|
6
6
|
export declare function cosineSimilarity(a: number[], b: number[]): number;
|
|
7
|
+
export declare function vectorToBuffer(vector: number[]): Buffer;
|
|
8
|
+
export declare function bufferToVector(buf: Buffer): number[];
|
package/dist/util/embedding.js
CHANGED
|
@@ -41,4 +41,12 @@ export function cosineSimilarity(a, b) {
|
|
|
41
41
|
}
|
|
42
42
|
return dot / (Math.sqrt(normA) * Math.sqrt(normB) || 1);
|
|
43
43
|
}
|
|
44
|
+
export function vectorToBuffer(vector) {
|
|
45
|
+
const arr = new Float32Array(vector);
|
|
46
|
+
return Buffer.from(arr.buffer);
|
|
47
|
+
}
|
|
48
|
+
export function bufferToVector(buf) {
|
|
49
|
+
const arr = new Float32Array(new Uint8Array(buf).buffer);
|
|
50
|
+
return Array.from(arr);
|
|
51
|
+
}
|
|
44
52
|
//# sourceMappingURL=embedding.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"embedding.js","sourceRoot":"","sources":["../../src/util/embedding.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAOrD,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,IAAY;IAClD,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IAEtE,UAAU,EAAE,CAAC;IACb,MAAM,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IACtD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,EAAE;YACjD,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,UAAU,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE;YACzG,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;SACrE,CAAC,CAAC;QACH,IAAI,CAAC,QAAQ,CAAC,EAAE;YAAE,OAAO,IAAI,CAAC;QAC9B,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAS,CAAC;QAC1C,gBAAgB;QAChB,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS;YAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,KAAK,EAAE,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;QACxG,8CAA8C;QAC9C,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;YAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;QAC/F,uBAAuB;QACvB,IAAI,IAAI,CAAC,SAAS;YAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;QACrF,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,IAAI,CAAC;IAAC,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,CAAW,EAAE,CAAW;IACvD,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;QAAE,OAAO,CAAC,CAAC;IACpC,IAAI,GAAG,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC;IAClC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,GAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAAC,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,GAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAAC,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,GAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAAC,CAAC;IAChG,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;AAC1D,CAAC"}
|
|
1
|
+
{"version":3,"file":"embedding.js","sourceRoot":"","sources":["../../src/util/embedding.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,3 +8,6 @@ export interface SearchResult {
|
|
|
8
8
|
score: number;
|
|
9
9
|
}
|
|
10
10
|
export declare function searchBM25(db: Database.Database, query: string, limit?: number): SearchResult[];
|
|
11
|
+
export declare function hasEmbeddings(db: Database.Database): boolean;
|
|
12
|
+
export declare function searchVector(db: Database.Database, query: string, limit?: number): Promise<SearchResult[]>;
|
|
13
|
+
export declare function hybridSearch(db: Database.Database, query: string, limit?: number): Promise<SearchResult[]>;
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { generateEmbedding, cosineSimilarity, bufferToVector } from "./embedding.js";
|
|
1
2
|
export function searchBM25(db, query, limit = 20) {
|
|
2
3
|
const safeQuery = query.replace(/['"]/g, "").trim();
|
|
3
4
|
if (!safeQuery)
|
|
@@ -30,4 +31,82 @@ export function searchBM25(db, query, limit = 20) {
|
|
|
30
31
|
return [...commitMatches, ...fileMatches].slice(0, limit);
|
|
31
32
|
}
|
|
32
33
|
}
|
|
34
|
+
export function hasEmbeddings(db) {
|
|
35
|
+
const row = db.prepare("SELECT COUNT(*) as cnt FROM embeddings").get();
|
|
36
|
+
return row.cnt > 0;
|
|
37
|
+
}
|
|
38
|
+
export async function searchVector(db, query, limit = 20) {
|
|
39
|
+
const embeddingResult = await generateEmbedding(query);
|
|
40
|
+
if (!embeddingResult)
|
|
41
|
+
return [];
|
|
42
|
+
const queryVector = embeddingResult.vector;
|
|
43
|
+
const rows = db.prepare("SELECT commit_hash, content_type, vector FROM embeddings ORDER BY created_at DESC LIMIT 5000").all();
|
|
44
|
+
const scored = rows.map((row) => ({
|
|
45
|
+
hash: row.commit_hash,
|
|
46
|
+
type: row.content_type,
|
|
47
|
+
similarity: cosineSimilarity(queryVector, bufferToVector(row.vector)),
|
|
48
|
+
}));
|
|
49
|
+
scored.sort((a, b) => b.similarity - a.similarity);
|
|
50
|
+
const top = scored.slice(0, limit);
|
|
51
|
+
const results = [];
|
|
52
|
+
for (const item of top) {
|
|
53
|
+
let message = "";
|
|
54
|
+
if (item.type === "message") {
|
|
55
|
+
const commit = db.prepare("SELECT message, author FROM commits WHERE hash = ?").get(item.hash);
|
|
56
|
+
message = commit?.message ?? "";
|
|
57
|
+
}
|
|
58
|
+
else if (item.type === "enrichment") {
|
|
59
|
+
const enrichment = db.prepare("SELECT intent FROM enrichments WHERE commit_hash = ?").get(item.hash);
|
|
60
|
+
message = enrichment?.intent ?? "";
|
|
61
|
+
}
|
|
62
|
+
results.push({
|
|
63
|
+
hash: item.hash,
|
|
64
|
+
type: item.type,
|
|
65
|
+
path: "",
|
|
66
|
+
message,
|
|
67
|
+
detail: "",
|
|
68
|
+
score: item.similarity,
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
return results;
|
|
72
|
+
}
|
|
73
|
+
export async function hybridSearch(db, query, limit = 20) {
|
|
74
|
+
const [bm25, vector] = await Promise.all([
|
|
75
|
+
Promise.resolve(searchBM25(db, query, limit * 2)),
|
|
76
|
+
searchVector(db, query, limit * 2),
|
|
77
|
+
]);
|
|
78
|
+
if (vector.length === 0) {
|
|
79
|
+
return bm25.slice(0, limit);
|
|
80
|
+
}
|
|
81
|
+
const map = new Map();
|
|
82
|
+
for (let i = 0; i < bm25.length; i++) {
|
|
83
|
+
const r = bm25[i];
|
|
84
|
+
const rrf = 1 / (60 + i + 1);
|
|
85
|
+
const existing = map.get(r.hash);
|
|
86
|
+
if (existing) {
|
|
87
|
+
existing.score += rrf;
|
|
88
|
+
if (!existing.result.message && r.message)
|
|
89
|
+
existing.result = r;
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
map.set(r.hash, { score: rrf, result: r });
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
for (let i = 0; i < vector.length; i++) {
|
|
96
|
+
const r = vector[i];
|
|
97
|
+
const rrf = 1 / (60 + i + 1);
|
|
98
|
+
const existing = map.get(r.hash);
|
|
99
|
+
if (existing) {
|
|
100
|
+
existing.score += rrf;
|
|
101
|
+
if (!existing.result.message && r.message)
|
|
102
|
+
existing.result = r;
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
map.set(r.hash, { score: rrf, result: r });
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
const merged = Array.from(map.values());
|
|
109
|
+
merged.sort((a, b) => b.score - a.score);
|
|
110
|
+
return merged.slice(0, limit).map(({ score, result }) => ({ ...result, score }));
|
|
111
|
+
}
|
|
33
112
|
//# sourceMappingURL=search-hybrid.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search-hybrid.js","sourceRoot":"","sources":["../../src/util/search-hybrid.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"search-hybrid.js","sourceRoot":"","sources":["../../src/util/search-hybrid.ts"],"names":[],"mappings":"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"}
|