@m2015agg/git-skill 0.1.3 → 0.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +39 -0
- package/dist/commands/enrich.js +116 -38
- package/dist/commands/enrich.js.map +1 -1
- package/dist/commands/install.js +15 -1
- package/dist/commands/install.js.map +1 -1
- package/dist/util/config.js +1 -1
- package/dist/util/config.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -42,6 +42,45 @@ Or manually edit `~/.config/git-skill/config.json`:
|
|
|
42
42
|
}
|
|
43
43
|
```
|
|
44
44
|
|
|
45
|
+
## LLM Enrichment (Optional)
|
|
46
|
+
|
|
47
|
+
Enrich your commit history with AI-analyzed intent, reasoning, and impact. Uses the actual diff + file list + surrounding commits to understand *what changed and why*.
|
|
48
|
+
|
|
49
|
+
Edit `~/.config/git-skill/config.json`:
|
|
50
|
+
|
|
51
|
+
```json
|
|
52
|
+
{
|
|
53
|
+
"enrichment": {
|
|
54
|
+
"enabled": true,
|
|
55
|
+
"url": "https://api.anthropic.com/v1/messages",
|
|
56
|
+
"model": "claude-sonnet-4-5-20250514",
|
|
57
|
+
"apiKey": "${GIT_SKILL_LLM_KEY}",
|
|
58
|
+
"batchSize": 10,
|
|
59
|
+
"maxTokensPerCommit": 5000
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
Set your API key:
|
|
65
|
+
|
|
66
|
+
```bash
|
|
67
|
+
export GIT_SKILL_LLM_KEY="sk-ant-..." # Anthropic
|
|
68
|
+
# or
|
|
69
|
+
export GIT_SKILL_LLM_KEY="sk-..." # OpenAI (change url + model)
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
Then run:
|
|
73
|
+
|
|
74
|
+
```bash
|
|
75
|
+
git-skill enrich # Enrich all unenriched commits
|
|
76
|
+
git-skill enrich --dry-run # Preview what would be enriched
|
|
77
|
+
git-skill enrich --limit 50 # Enrich 50 at a time
|
|
78
|
+
git-skill enrich v1.0..v1.1 # Enrich a specific range
|
|
79
|
+
git-skill why <hash> # View enrichment for a commit
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
**Supported providers:** Any OpenAI-compatible chat endpoint — Anthropic, OpenAI, Ollama, LMStudio, Together, etc. Recommended model: `claude-sonnet-4-5-20250514` or `gpt-4o`.
|
|
83
|
+
|
|
45
84
|
## Commands
|
|
46
85
|
|
|
47
86
|
### Query (read-only, pre-approved for Claude Code)
|
package/dist/commands/enrich.js
CHANGED
|
@@ -3,20 +3,34 @@ import { join } from "path";
|
|
|
3
3
|
import { execSync } from "child_process";
|
|
4
4
|
import { openDb, hasDb } from "../util/db.js";
|
|
5
5
|
import { readConfig } from "../util/config.js";
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
{
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
6
|
+
function getDiff(cwd, hash, maxChars = 3000) {
|
|
7
|
+
try {
|
|
8
|
+
const raw = execSync(`git show --patch --no-color ${hash}`, {
|
|
9
|
+
cwd,
|
|
10
|
+
encoding: "utf-8",
|
|
11
|
+
timeout: 10000,
|
|
12
|
+
maxBuffer: 10 * 1024 * 1024,
|
|
13
|
+
});
|
|
14
|
+
// Skip the header (everything before first diff --git)
|
|
15
|
+
const diffStart = raw.indexOf("diff --git");
|
|
16
|
+
if (diffStart === -1)
|
|
17
|
+
return "(no diff)";
|
|
18
|
+
const diff = raw.slice(diffStart);
|
|
19
|
+
if (diff.length <= maxChars)
|
|
20
|
+
return diff;
|
|
21
|
+
return diff.slice(0, maxChars) + `\n... (truncated, ${diff.length - maxChars} chars omitted)`;
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
return "(diff unavailable)";
|
|
25
|
+
}
|
|
14
26
|
}
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
27
|
+
function getRecentMessages(db, beforeTimestamp, limit = 3) {
|
|
28
|
+
const rows = db
|
|
29
|
+
.prepare("SELECT message FROM commits WHERE timestamp < ? ORDER BY timestamp DESC LIMIT ?")
|
|
30
|
+
.all(beforeTimestamp, limit);
|
|
31
|
+
return rows.map((r) => r.message);
|
|
32
|
+
}
|
|
33
|
+
async function callLlm(url, model, apiKey, maxTokens, prompt) {
|
|
20
34
|
const headers = { "Content-Type": "application/json" };
|
|
21
35
|
if (apiKey)
|
|
22
36
|
headers["Authorization"] = `Bearer ${apiKey}`;
|
|
@@ -27,22 +41,59 @@ Message: ${commit.message}`;
|
|
|
27
41
|
body: JSON.stringify({
|
|
28
42
|
model,
|
|
29
43
|
messages: [{ role: "user", content: prompt }],
|
|
30
|
-
max_tokens:
|
|
44
|
+
max_tokens: maxTokens,
|
|
31
45
|
temperature: 0,
|
|
32
46
|
}),
|
|
33
47
|
});
|
|
34
48
|
if (!response.ok)
|
|
35
49
|
return null;
|
|
36
|
-
const data = await response.json();
|
|
50
|
+
const data = (await response.json());
|
|
37
51
|
const text = data.choices?.[0]?.message?.content ?? data.content?.[0]?.text ?? "";
|
|
38
|
-
|
|
39
|
-
|
|
52
|
+
const cleaned = text
|
|
53
|
+
.replace(/^```(?:json)?\s*/i, "")
|
|
54
|
+
.replace(/\s*```\s*$/i, "")
|
|
55
|
+
.trim();
|
|
40
56
|
return JSON.parse(cleaned);
|
|
41
57
|
}
|
|
42
58
|
catch {
|
|
43
59
|
return null;
|
|
44
60
|
}
|
|
45
61
|
}
|
|
62
|
+
function buildPrompt(commit, files, diff, recentMessages) {
|
|
63
|
+
const fileList = files
|
|
64
|
+
.map((f) => ` [${f.status}] ${f.file_path} (+${f.insertions}/-${f.deletions})`)
|
|
65
|
+
.join("\n");
|
|
66
|
+
const recentContext = recentMessages.length > 0
|
|
67
|
+
? `\nRecent commits before this one:\n${recentMessages.map((m) => ` - ${m}`).join("\n")}\n`
|
|
68
|
+
: "";
|
|
69
|
+
return `You are analyzing a git commit to extract structured intelligence about what changed and why.
|
|
70
|
+
|
|
71
|
+
Study the commit message, file list, and diff carefully. Respond with ONLY a JSON object — no markdown fences, no explanation.
|
|
72
|
+
|
|
73
|
+
{
|
|
74
|
+
"intent": "One clear sentence: what is the developer trying to accomplish with this commit?",
|
|
75
|
+
"what_changed": "Concrete description of the actual code changes (functions added/removed/modified, config changes, structural changes). Be specific — reference actual names from the diff.",
|
|
76
|
+
"goal": "The broader goal or problem being solved. Why does this change exist? What user/system need does it serve?",
|
|
77
|
+
"reasoning": "Why was this approach chosen? What tradeoffs were made?",
|
|
78
|
+
"category": "One of: feature, bugfix, refactor, cleanup, docs, test, config, perf, revert",
|
|
79
|
+
"impact": "One of: low (typo, comment, minor tweak), medium (single feature/fix, localized change), high (architecture change, breaking change, cross-cutting concern)",
|
|
80
|
+
"alternatives_considered": "What other approaches could have been taken? Say 'none apparent' if the change is straightforward.",
|
|
81
|
+
"session_context": "Based on the recent commits and this change, what broader work session or initiative is this part of?"
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
--- COMMIT ---
|
|
85
|
+
Hash: ${commit.hash.slice(0, 7)}
|
|
86
|
+
Author: ${commit.author}
|
|
87
|
+
Date: ${commit.timestamp.slice(0, 10)}
|
|
88
|
+
Message: ${commit.message}
|
|
89
|
+
Stats: +${commit.insertions}/-${commit.deletions} across ${commit.files_changed} files
|
|
90
|
+
${recentContext}
|
|
91
|
+
--- FILES CHANGED ---
|
|
92
|
+
${fileList}
|
|
93
|
+
|
|
94
|
+
--- DIFF ---
|
|
95
|
+
${diff}`;
|
|
96
|
+
}
|
|
46
97
|
function resolveEnvVar(val) {
|
|
47
98
|
if (!val)
|
|
48
99
|
return undefined;
|
|
@@ -54,35 +105,37 @@ export function enrichCommand() {
|
|
|
54
105
|
.description("Backfill LLM enrichments for commit history")
|
|
55
106
|
.argument("[range]", "Git range to filter commits (e.g. v1.0..v1.1)")
|
|
56
107
|
.option("--dry-run", "Show what would be enriched without doing it")
|
|
57
|
-
.option("--limit <n>", "Max commits to enrich
|
|
108
|
+
.option("--limit <n>", "Max commits to enrich (default: all)")
|
|
58
109
|
.action(async (range, opts) => {
|
|
59
|
-
const
|
|
110
|
+
const cwd = process.cwd();
|
|
111
|
+
const historyDir = join(cwd, ".git-history");
|
|
60
112
|
if (!hasDb(historyDir)) {
|
|
61
113
|
process.stdout.write("No .git-history/ database found. Run `git-skill snapshot` first.\n");
|
|
62
114
|
process.exit(1);
|
|
63
115
|
}
|
|
64
116
|
const db = openDb(historyDir);
|
|
65
117
|
try {
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
`)
|
|
77
|
-
.all(limit);
|
|
118
|
+
let query = `
|
|
119
|
+
SELECT c.hash, c.message, c.author, c.timestamp, c.insertions, c.deletions, c.files_changed
|
|
120
|
+
FROM commits c
|
|
121
|
+
LEFT JOIN enrichments e ON c.hash = e.commit_hash
|
|
122
|
+
WHERE e.commit_hash IS NULL
|
|
123
|
+
ORDER BY c.timestamp DESC
|
|
124
|
+
`;
|
|
125
|
+
if (opts.limit)
|
|
126
|
+
query += ` LIMIT ${parseInt(opts.limit, 10)}`;
|
|
127
|
+
let commits = db.prepare(query).all();
|
|
78
128
|
// Filter by range if provided
|
|
79
129
|
if (range) {
|
|
80
130
|
try {
|
|
81
131
|
const rangeHashes = execSync(`git rev-list ${range}`, {
|
|
82
|
-
cwd
|
|
132
|
+
cwd,
|
|
83
133
|
encoding: "utf-8",
|
|
84
134
|
timeout: 10000,
|
|
85
|
-
})
|
|
135
|
+
})
|
|
136
|
+
.trim()
|
|
137
|
+
.split("\n")
|
|
138
|
+
.filter(Boolean);
|
|
86
139
|
const rangeSet = new Set(rangeHashes);
|
|
87
140
|
commits = commits.filter((c) => rangeSet.has(c.hash));
|
|
88
141
|
}
|
|
@@ -107,11 +160,13 @@ export function enrichCommand() {
|
|
|
107
160
|
return;
|
|
108
161
|
}
|
|
109
162
|
if (!enrichEnabled) {
|
|
110
|
-
process.stdout.write(
|
|
163
|
+
process.stdout.write("Enrichment not configured. Set enrichment.enabled and enrichment.url in ~/.config/git-skill/config.json\n");
|
|
164
|
+
process.stdout.write(`Recommended models: claude-sonnet-4-5-20250514, gpt-4o, gpt-4o-mini\n`);
|
|
111
165
|
process.stdout.write(`${commits.length} commit${commits.length !== 1 ? "s" : ""} would be enriched.\n`);
|
|
112
166
|
return;
|
|
113
167
|
}
|
|
114
|
-
|
|
168
|
+
const maxTokens = config.enrichment.maxTokensPerCommit || 5000;
|
|
169
|
+
process.stdout.write(`Enriching ${commits.length} commits (model: ${config.enrichment.model}, max_tokens: ${maxTokens})...\n`);
|
|
115
170
|
const apiKey = resolveEnvVar(config.enrichment.apiKey);
|
|
116
171
|
const insertEnrichment = db.prepare(`
|
|
117
172
|
INSERT OR REPLACE INTO enrichments
|
|
@@ -121,12 +176,31 @@ export function enrichCommand() {
|
|
|
121
176
|
`);
|
|
122
177
|
let successCount = 0;
|
|
123
178
|
let failCount = 0;
|
|
124
|
-
for (
|
|
125
|
-
const
|
|
179
|
+
for (let i = 0; i < commits.length; i++) {
|
|
180
|
+
const commit = commits[i];
|
|
181
|
+
// Get file list from SQLite
|
|
182
|
+
const files = db
|
|
183
|
+
.prepare("SELECT file_path, status, insertions, deletions FROM commit_files WHERE commit_hash = ?")
|
|
184
|
+
.all(commit.hash);
|
|
185
|
+
// Get actual diff (truncated)
|
|
186
|
+
const diff = getDiff(cwd, commit.hash);
|
|
187
|
+
// Get recent commit messages for session context
|
|
188
|
+
const recentMessages = getRecentMessages(db, commit.timestamp);
|
|
189
|
+
// Build rich prompt
|
|
190
|
+
const prompt = buildPrompt(commit, files, diff, recentMessages);
|
|
191
|
+
const result = await callLlm(config.enrichment.url, config.enrichment.model, apiKey, maxTokens, prompt);
|
|
126
192
|
if (result) {
|
|
193
|
+
// Combine new fields into existing schema
|
|
194
|
+
const intentParts = [result.intent];
|
|
195
|
+
if (result.what_changed)
|
|
196
|
+
intentParts.push(`Changes: ${result.what_changed}`);
|
|
197
|
+
if (result.goal)
|
|
198
|
+
intentParts.push(`Goal: ${result.goal}`);
|
|
199
|
+
if (result.impact)
|
|
200
|
+
intentParts.push(`Impact: ${result.impact}`);
|
|
127
201
|
insertEnrichment.run({
|
|
128
202
|
commitHash: commit.hash,
|
|
129
|
-
intent:
|
|
203
|
+
intent: intentParts.join(" | "),
|
|
130
204
|
reasoning: result.reasoning ?? null,
|
|
131
205
|
category: result.category ?? null,
|
|
132
206
|
alternativesConsidered: result.alternatives_considered ?? null,
|
|
@@ -137,6 +211,10 @@ export function enrichCommand() {
|
|
|
137
211
|
else {
|
|
138
212
|
failCount++;
|
|
139
213
|
}
|
|
214
|
+
// Progress
|
|
215
|
+
if ((i + 1) % 10 === 0 || i === commits.length - 1) {
|
|
216
|
+
process.stdout.write(` ${i + 1}/${commits.length} (${successCount} ok, ${failCount} failed)\n`);
|
|
217
|
+
}
|
|
140
218
|
}
|
|
141
219
|
process.stdout.write(`Done. Enriched: ${successCount}, Failed: ${failCount}\n`);
|
|
142
220
|
}
|
|
@@ -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,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"enrich.js","sourceRoot":"","sources":["../../src/commands/enrich.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/install.js
CHANGED
|
@@ -49,8 +49,22 @@ export function installCommand() {
|
|
|
49
49
|
write("Next steps:\n");
|
|
50
50
|
write(" cd <your-repo>\n");
|
|
51
51
|
write(" git-skill init # initialize in a repo\n");
|
|
52
|
-
write(" git-skill approve # pre-approve read-only commands in Claude Code\n");
|
|
53
52
|
write(" git-skill doctor # verify setup health\n");
|
|
53
|
+
write("\n");
|
|
54
|
+
write("Optional — Embeddings (semantic search):\n");
|
|
55
|
+
write(" Edit ~/.config/git-skill/config.json and set:\n");
|
|
56
|
+
write(' embedding.enabled = true\n');
|
|
57
|
+
write(' embedding.url = "http://localhost:11434/api/embed" (Ollama)\n');
|
|
58
|
+
write(' embedding.model = "mxbai-embed-large" (or any model)\n');
|
|
59
|
+
write(" Then run: git-skill embed\n");
|
|
60
|
+
write("\n");
|
|
61
|
+
write("Optional — LLM Enrichment (commit analysis):\n");
|
|
62
|
+
write(" Edit ~/.config/git-skill/config.json and set:\n");
|
|
63
|
+
write(' enrichment.enabled = true\n');
|
|
64
|
+
write(' enrichment.url = "https://api.anthropic.com/v1/messages" (or OpenAI-compatible)\n');
|
|
65
|
+
write(' enrichment.model = "claude-sonnet-4-5-20250514" (recommended)\n');
|
|
66
|
+
write(' enrichment.apiKey = "${GIT_SKILL_LLM_KEY}" (env var or raw key)\n');
|
|
67
|
+
write(" Then run: git-skill enrich\n");
|
|
54
68
|
if (!opts.ci) {
|
|
55
69
|
write("\nTip: Run `git-skill approve --global` to pre-approve commands globally.\n");
|
|
56
70
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC9E,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAExC,SAAS,KAAK,CAAC,GAAW,IAAU,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAEhE,SAAS,QAAQ;IACf,IAAI,CAAC;QACH,QAAQ,CAAC,eAAe,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC/C,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,OAAO,IAAI,OAAO,CAAC,SAAS,CAAC;SAC1B,WAAW,CAAC,qDAAqD,CAAC;SAClE,MAAM,CAAC,MAAM,EAAE,oCAAoC,CAAC;SACpD,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;QACf,KAAK,CAAC,sCAAsC,CAAC,CAAC;QAE9C,eAAe;QACf,KAAK,CAAC,sBAAsB,CAAC,CAAC;QAC9B,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC;YAChB,KAAK,CAAC,uDAAuD,CAAC,CAAC;YAC/D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,KAAK,CAAC,iBAAiB,CAAC,CAAC;QAEzB,0BAA0B;QAC1B,KAAK,CAAC,gCAAgC,CAAC,CAAC;QACxC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;QAC1D,MAAM,QAAQ,GAAG,UAAU,EAAE,CAAC;QAC9B,IAAI,QAAQ,EAAE,CAAC;YACb,KAAK,CAAC,+BAA+B,SAAS,4BAA4B,CAAC,CAAC;QAC9E,CAAC;aAAM,CAAC;YACN,WAAW,CAAC,gBAAgB,EAAE,CAAC,CAAC;YAChC,KAAK,CAAC,wBAAwB,SAAS,gBAAgB,CAAC,CAAC;QAC3D,CAAC;QAED,gCAAgC;QAChC,KAAK,CAAC,sCAAsC,CAAC,CAAC;QAC9C,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;QAC7D,MAAM,MAAM,GAAG,aAAa,CAAC,YAAY,EAAE,WAAW,EAAE,CAAC,CAAC;QAC1D,KAAK,CAAC,iBAAiB,MAAM,IAAI,CAAC,CAAC;QAEnC,0BAA0B;QAC1B,KAAK,CAAC,yCAAyC,CAAC,CAAC;QACjD,KAAK,CAAC,eAAe,CAAC,CAAC;QACvB,KAAK,CAAC,oBAAoB,CAAC,CAAC;QAC5B,KAAK,CAAC,oDAAoD,CAAC,CAAC;QAC5D,KAAK,CAAC,
|
|
1
|
+
{"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC9E,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAExC,SAAS,KAAK,CAAC,GAAW,IAAU,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAEhE,SAAS,QAAQ;IACf,IAAI,CAAC;QACH,QAAQ,CAAC,eAAe,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC/C,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,OAAO,IAAI,OAAO,CAAC,SAAS,CAAC;SAC1B,WAAW,CAAC,qDAAqD,CAAC;SAClE,MAAM,CAAC,MAAM,EAAE,oCAAoC,CAAC;SACpD,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;QACf,KAAK,CAAC,sCAAsC,CAAC,CAAC;QAE9C,eAAe;QACf,KAAK,CAAC,sBAAsB,CAAC,CAAC;QAC9B,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC;YAChB,KAAK,CAAC,uDAAuD,CAAC,CAAC;YAC/D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,KAAK,CAAC,iBAAiB,CAAC,CAAC;QAEzB,0BAA0B;QAC1B,KAAK,CAAC,gCAAgC,CAAC,CAAC;QACxC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;QAC1D,MAAM,QAAQ,GAAG,UAAU,EAAE,CAAC;QAC9B,IAAI,QAAQ,EAAE,CAAC;YACb,KAAK,CAAC,+BAA+B,SAAS,4BAA4B,CAAC,CAAC;QAC9E,CAAC;aAAM,CAAC;YACN,WAAW,CAAC,gBAAgB,EAAE,CAAC,CAAC;YAChC,KAAK,CAAC,wBAAwB,SAAS,gBAAgB,CAAC,CAAC;QAC3D,CAAC;QAED,gCAAgC;QAChC,KAAK,CAAC,sCAAsC,CAAC,CAAC;QAC9C,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;QAC7D,MAAM,MAAM,GAAG,aAAa,CAAC,YAAY,EAAE,WAAW,EAAE,CAAC,CAAC;QAC1D,KAAK,CAAC,iBAAiB,MAAM,IAAI,CAAC,CAAC;QAEnC,0BAA0B;QAC1B,KAAK,CAAC,yCAAyC,CAAC,CAAC;QACjD,KAAK,CAAC,eAAe,CAAC,CAAC;QACvB,KAAK,CAAC,oBAAoB,CAAC,CAAC;QAC5B,KAAK,CAAC,oDAAoD,CAAC,CAAC;QAC5D,KAAK,CAAC,mDAAmD,CAAC,CAAC;QAC3D,KAAK,CAAC,IAAI,CAAC,CAAC;QACZ,KAAK,CAAC,4CAA4C,CAAC,CAAC;QACpD,KAAK,CAAC,mDAAmD,CAAC,CAAC;QAC3D,KAAK,CAAC,gCAAgC,CAAC,CAAC;QACxC,KAAK,CAAC,oEAAoE,CAAC,CAAC;QAC5E,KAAK,CAAC,yEAAyE,CAAC,CAAC;QACjF,KAAK,CAAC,+BAA+B,CAAC,CAAC;QACvC,KAAK,CAAC,IAAI,CAAC,CAAC;QACZ,KAAK,CAAC,gDAAgD,CAAC,CAAC;QACxD,KAAK,CAAC,mDAAmD,CAAC,CAAC;QAC3D,KAAK,CAAC,iCAAiC,CAAC,CAAC;QACzC,KAAK,CAAC,wFAAwF,CAAC,CAAC;QAChG,KAAK,CAAC,+EAA+E,CAAC,CAAC;QACvF,KAAK,CAAC,qFAAqF,CAAC,CAAC;QAC7F,KAAK,CAAC,gCAAgC,CAAC,CAAC;QAExC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;YACb,KAAK,CAAC,6EAA6E,CAAC,CAAC;QACvF,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
package/dist/util/config.js
CHANGED
|
@@ -6,7 +6,7 @@ const CONFIG_PATH = join(CONFIG_DIR, "config.json");
|
|
|
6
6
|
export function getDefaultConfig() {
|
|
7
7
|
return {
|
|
8
8
|
embedding: { enabled: false, provider: "openai", model: "text-embedding-3-small", url: "", apiKey: "", dimensions: 1536 },
|
|
9
|
-
enrichment: { enabled: false, url: "", model: "
|
|
9
|
+
enrichment: { enabled: false, url: "", model: "claude-sonnet-4-5-20250514", apiKey: "", batchSize: 10, maxTokensPerCommit: 5000 },
|
|
10
10
|
};
|
|
11
11
|
}
|
|
12
12
|
export function readConfig() {
|
package/dist/util/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/util/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AACxE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAqB7B,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;AAC3D,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;AAEpD,MAAM,UAAU,gBAAgB;IAC9B,OAAO;QACL,SAAS,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,wBAAwB,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE;QACzH,UAAU,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/util/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AACxE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAqB7B,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;AAC3D,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;AAEpD,MAAM,UAAU,gBAAgB;IAC9B,OAAO;QACL,SAAS,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,wBAAwB,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE;QACzH,UAAU,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,4BAA4B,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,kBAAkB,EAAE,IAAI,EAAE;KAClI,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,IAAI,CAAC;QACH,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC;YAAE,OAAO,IAAI,CAAC;QAC1C,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;IACxD,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,IAAI,CAAC;IAAC,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,MAAsB;IAChD,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACxD,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;AAC/E,CAAC"}
|