@m2015agg/git-skill 0.2.4 → 0.3.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/dist/commands/approve.js +1 -0
- package/dist/commands/approve.js.map +1 -1
- package/dist/commands/context-update.js +54 -16
- package/dist/commands/context-update.js.map +1 -1
- package/dist/commands/verify.d.ts +2 -0
- package/dist/commands/verify.js +343 -0
- package/dist/commands/verify.js.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/commands/approve.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"approve.js","sourceRoot":"","sources":["../../src/commands/approve.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AACxE,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAE7B,SAAS,KAAK,CAAC,GAAW,IAAU,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAEhE,MAAM,aAAa,GAAG;IACpB,0BAA0B;IAC1B,4BAA4B;IAC5B,yBAAyB;IACzB,0BAA0B;IAC1B,4BAA4B;IAC5B,4BAA4B;IAC5B,6BAA6B;IAC7B,2BAA2B;IAC3B,gCAAgC;IAChC,uBAAuB;IACvB,8BAA8B;IAC9B,0BAA0B;IAC1B,iCAAiC;IACjC,kCAAkC;
|
|
1
|
+
{"version":3,"file":"approve.js","sourceRoot":"","sources":["../../src/commands/approve.ts"],"names":[],"mappings":"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"}
|
|
@@ -52,6 +52,58 @@ function buildSummary(historyDir) {
|
|
|
52
52
|
}
|
|
53
53
|
// Generate alerts
|
|
54
54
|
const alerts = [];
|
|
55
|
+
// 1. Value Thrashing — files edited 3+ times in last 10 commits
|
|
56
|
+
const thrashingFiles = db.prepare(`
|
|
57
|
+
SELECT file_path, COUNT(*) as cnt
|
|
58
|
+
FROM commit_files
|
|
59
|
+
WHERE commit_hash IN (SELECT hash FROM commits ORDER BY timestamp DESC LIMIT 10)
|
|
60
|
+
GROUP BY file_path
|
|
61
|
+
HAVING cnt >= 3
|
|
62
|
+
ORDER BY cnt DESC
|
|
63
|
+
LIMIT 3
|
|
64
|
+
`).all();
|
|
65
|
+
for (const f of thrashingFiles) {
|
|
66
|
+
alerts.push(`[WARN] Thrashing: ${f.file_path} edited ${f.cnt} times in last 10 commits`);
|
|
67
|
+
}
|
|
68
|
+
// 2. Revert Chains — files involved in revert commits (last 50 commits)
|
|
69
|
+
const revertedFiles = db.prepare(`
|
|
70
|
+
SELECT cf.file_path, COUNT(*) as revert_count
|
|
71
|
+
FROM commits c
|
|
72
|
+
JOIN commit_files cf ON cf.commit_hash = c.hash
|
|
73
|
+
WHERE (c.message LIKE '%revert%' OR c.message LIKE '%Revert%')
|
|
74
|
+
AND c.hash IN (SELECT hash FROM commits ORDER BY timestamp DESC LIMIT 50)
|
|
75
|
+
GROUP BY cf.file_path
|
|
76
|
+
HAVING revert_count >= 1
|
|
77
|
+
ORDER BY revert_count DESC
|
|
78
|
+
LIMIT 3
|
|
79
|
+
`).all();
|
|
80
|
+
for (const f of revertedFiles) {
|
|
81
|
+
alerts.push(`[WARN] Reverted: ${f.file_path} involved in ${f.revert_count} reverts recently`);
|
|
82
|
+
}
|
|
83
|
+
// 3. Fix-on-Fix Chains — files touched by 2+ sequential fix commits
|
|
84
|
+
const fixCommits = db.prepare(`
|
|
85
|
+
SELECT hash FROM commits
|
|
86
|
+
WHERE message LIKE '%fix%' OR message LIKE '%Fix%'
|
|
87
|
+
ORDER BY timestamp DESC
|
|
88
|
+
LIMIT 20
|
|
89
|
+
`).all();
|
|
90
|
+
if (fixCommits.length >= 2) {
|
|
91
|
+
const fixHashes = fixCommits.map(r => r.hash);
|
|
92
|
+
const placeholders = fixHashes.map(() => "?").join(",");
|
|
93
|
+
const fixFileCounts = db.prepare(`
|
|
94
|
+
SELECT file_path, COUNT(DISTINCT commit_hash) as fix_count
|
|
95
|
+
FROM commit_files
|
|
96
|
+
WHERE commit_hash IN (${placeholders})
|
|
97
|
+
GROUP BY file_path
|
|
98
|
+
HAVING fix_count >= 2
|
|
99
|
+
ORDER BY fix_count DESC
|
|
100
|
+
LIMIT 3
|
|
101
|
+
`).all(...fixHashes);
|
|
102
|
+
for (const f of fixFileCounts) {
|
|
103
|
+
alerts.push(`[WARN] Fix-on-fix: ${f.file_path} has ${f.fix_count} sequential fixes`);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
// Also keep metric-level alerts for revert rate and fix-on-fix rate thresholds
|
|
55
107
|
const revertRate = metrics.find(m => m.name === "revert_rate");
|
|
56
108
|
if (revertRate && revertRate.latest > 0.05) {
|
|
57
109
|
alerts.push(`[WARN] Revert rate: ${(revertRate.latest * 100).toFixed(1)}% (threshold: 5%)`);
|
|
@@ -60,22 +112,8 @@ function buildSummary(historyDir) {
|
|
|
60
112
|
if (fixOnFix && fixOnFix.latest > 0.2) {
|
|
61
113
|
alerts.push(`[WARN] Fix-on-fix rate: ${(fixOnFix.latest * 100).toFixed(1)}% (threshold: 20%)`);
|
|
62
114
|
}
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
// Find which files are thrashing
|
|
66
|
-
const thrashingFiles = db.prepare(`
|
|
67
|
-
SELECT file_path, COUNT(*) as cnt
|
|
68
|
-
FROM commit_files
|
|
69
|
-
WHERE commit_hash IN (SELECT hash FROM commits ORDER BY timestamp DESC LIMIT 10)
|
|
70
|
-
GROUP BY file_path
|
|
71
|
-
HAVING cnt >= 3
|
|
72
|
-
ORDER BY cnt DESC
|
|
73
|
-
LIMIT 3
|
|
74
|
-
`).all();
|
|
75
|
-
for (const f of thrashingFiles) {
|
|
76
|
-
alerts.push(`[WARN] Thrashing: ${f.file_path} (${f.cnt} edits in last 10 commits)`);
|
|
77
|
-
}
|
|
78
|
-
}
|
|
115
|
+
// Cap at 5 alerts, most specific (file-level) first
|
|
116
|
+
alerts.splice(5);
|
|
79
117
|
const snapshotMeta = db.prepare("SELECT value FROM schema_meta WHERE key = 'last_snapshot'").get();
|
|
80
118
|
return {
|
|
81
119
|
totalCommits,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context-update.js","sourceRoot":"","sources":["../../src/commands/context-update.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AACxE,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAE9C,SAAS,KAAK,CAAC,GAAW;IACxB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AAC5B,CAAC;AAED,SAAS,iBAAiB,CAAC,GAAW;IACpC,0CAA0C;IAC1C,OAAO,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AACjC,CAAC;AAED,SAAS,YAAY,CAAC,GAAW;IAC/B,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE,iBAAiB,CAAC,GAAG,CAAC,EAAE,QAAQ,CAAC,CAAC;AAClF,CAAC;AAaD,SAAS,YAAY,CAAC,UAAkB;IACtC,MAAM,EAAE,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;IAE9B,IAAI,CAAC;QACH,MAAM,YAAY,GAAI,EAAE,CAAC,OAAO,CAAC,mCAAmC,CAAC,CAAC,GAAG,EAAU,CAAC,CAAC,CAAC;QACtF,MAAM,aAAa,GAAI,EAAE,CAAC,OAAO,CAAC,oCAAoC,CAAC,CAAC,GAAG,EAAU,CAAC,CAAC,CAAC;QACxF,MAAM,SAAS,GAAI,EAAE,CAAC,OAAO,CAAC,gCAAgC,CAAC,CAAC,GAAG,EAAU,CAAC,CAAC,CAAC;QAEhF,kCAAkC;QAClC,MAAM,QAAQ,GAAG,EAAE,CAAC,OAAO,CAAC;;;;;;KAM3B,CAAC,CAAC,GAAG,EAAqF,CAAC;QAE5F,mCAAmC;QACnC,MAAM,SAAS,GAAG,EAAE,CAAC,OAAO,CAAC;;;;;;KAM5B,CAAC,CAAC,GAAG,EAA0E,CAAC;QAEjF,4DAA4D;QAC5D,MAAM,WAAW,GAAG,EAAE,CAAC,OAAO,CAC5B,gDAAgD,CACjD,CAAC,GAAG,EAA+B,CAAC;QAErC,MAAM,OAAO,GAAuC,EAAE,CAAC;QACvD,KAAK,MAAM,EAAE,WAAW,EAAE,IAAI,WAAW,EAAE,CAAC;YAC1C,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC;;;;;;OAMtB,CAAC,CAAC,GAAG,CAAC,WAAW,CAAkC,CAAC;YACrD,IAAI,GAAG,EAAE,CAAC;gBACR,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC;YACzD,CAAC;QACH,CAAC;QAED,kBAAkB;QAClB,MAAM,MAAM,GAAa,EAAE,CAAC;QAE5B,MAAM,
|
|
1
|
+
{"version":3,"file":"context-update.js","sourceRoot":"","sources":["../../src/commands/context-update.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,343 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import { join } from "path";
|
|
3
|
+
import { execFileSync } from "child_process";
|
|
4
|
+
import { openDb, hasDb } from "../util/db.js";
|
|
5
|
+
import { readConfig } from "../util/config.js";
|
|
6
|
+
import { loadDotEnv, resolveEnvVar } from "../util/env.js";
|
|
7
|
+
const MAX_BUFFER = 10 * 1024 * 1024;
|
|
8
|
+
function getStagedDiff(cwd) {
|
|
9
|
+
try {
|
|
10
|
+
return execFileSync("git", ["diff", "--cached"], {
|
|
11
|
+
cwd,
|
|
12
|
+
encoding: "utf-8",
|
|
13
|
+
timeout: 15000,
|
|
14
|
+
maxBuffer: MAX_BUFFER,
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
return "";
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
function getFileDiff(cwd, filePath) {
|
|
22
|
+
try {
|
|
23
|
+
return execFileSync("git", ["diff", "HEAD", "--", filePath], {
|
|
24
|
+
cwd,
|
|
25
|
+
encoding: "utf-8",
|
|
26
|
+
timeout: 15000,
|
|
27
|
+
maxBuffer: MAX_BUFFER,
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
return "";
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
function getStagedFiles(cwd) {
|
|
35
|
+
try {
|
|
36
|
+
const out = execFileSync("git", ["diff", "--cached", "--name-only"], {
|
|
37
|
+
cwd,
|
|
38
|
+
encoding: "utf-8",
|
|
39
|
+
timeout: 15000,
|
|
40
|
+
maxBuffer: MAX_BUFFER,
|
|
41
|
+
});
|
|
42
|
+
return out.trim().split("\n").filter(Boolean);
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
return [];
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
function getCommitDiff(cwd, hash, maxChars = 2000) {
|
|
49
|
+
try {
|
|
50
|
+
const raw = execFileSync("git", ["show", "--patch", "--no-color", hash], {
|
|
51
|
+
cwd,
|
|
52
|
+
encoding: "utf-8",
|
|
53
|
+
timeout: 10000,
|
|
54
|
+
maxBuffer: MAX_BUFFER,
|
|
55
|
+
});
|
|
56
|
+
const diffStart = raw.indexOf("diff --git");
|
|
57
|
+
if (diffStart === -1)
|
|
58
|
+
return "(no diff)";
|
|
59
|
+
const diff = raw.slice(diffStart);
|
|
60
|
+
return diff.length <= maxChars ? diff : diff.slice(0, maxChars) + `\n... (truncated)`;
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
return "(diff unavailable)";
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
function truncate(s, max) {
|
|
67
|
+
return s.length <= max ? s : s.slice(0, max) + `\n... (truncated, ${s.length - max} chars omitted)`;
|
|
68
|
+
}
|
|
69
|
+
async function callLlmVerify(url, model, apiKey, maxTokens, prompt) {
|
|
70
|
+
const isAnthropic = url.includes("anthropic.com");
|
|
71
|
+
const headers = { "Content-Type": "application/json" };
|
|
72
|
+
if (isAnthropic) {
|
|
73
|
+
if (apiKey)
|
|
74
|
+
headers["x-api-key"] = apiKey;
|
|
75
|
+
headers["anthropic-version"] = "2023-06-01";
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
if (apiKey)
|
|
79
|
+
headers["Authorization"] = `Bearer ${apiKey}`;
|
|
80
|
+
}
|
|
81
|
+
const body = {
|
|
82
|
+
model,
|
|
83
|
+
max_tokens: maxTokens,
|
|
84
|
+
temperature: 0,
|
|
85
|
+
messages: [{ role: "user", content: prompt }],
|
|
86
|
+
};
|
|
87
|
+
try {
|
|
88
|
+
const response = await fetch(url, { method: "POST", headers, body: JSON.stringify(body) });
|
|
89
|
+
if (!response.ok) {
|
|
90
|
+
const err = await response.text().catch(() => "");
|
|
91
|
+
if (err)
|
|
92
|
+
process.stderr.write(`API error: ${response.status} ${err.slice(0, 200)}\n`);
|
|
93
|
+
return null;
|
|
94
|
+
}
|
|
95
|
+
const data = (await response.json());
|
|
96
|
+
const text = data.choices?.[0]?.message?.content ?? data.content?.[0]?.text ?? "";
|
|
97
|
+
const cleaned = text
|
|
98
|
+
.replace(/^```(?:json)?\s*/i, "")
|
|
99
|
+
.replace(/\s*```\s*$/i, "")
|
|
100
|
+
.trim();
|
|
101
|
+
return JSON.parse(cleaned);
|
|
102
|
+
}
|
|
103
|
+
catch (e) {
|
|
104
|
+
process.stderr.write(`Verify LLM error: ${e.message?.slice(0, 150) ?? "unknown"}\n`);
|
|
105
|
+
return null;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
function buildVerifyPrompt(stagedDiff, fileHistories, enrichmentSummaries) {
|
|
109
|
+
const perFileHistory = fileHistories
|
|
110
|
+
.map((fh) => `### ${fh.file}\n${fh.summary}`)
|
|
111
|
+
.join("\n\n");
|
|
112
|
+
return `You are reviewing staged code changes against this repository's git history.
|
|
113
|
+
Your job: identify if any of these changes repeat a pattern that was previously
|
|
114
|
+
tried and reverted, thrash on a value that's been changed multiple times, or
|
|
115
|
+
re-introduce something that was intentionally removed.
|
|
116
|
+
|
|
117
|
+
STAGED DIFF:
|
|
118
|
+
${truncate(stagedDiff, 5000)}
|
|
119
|
+
|
|
120
|
+
FILE HISTORY:
|
|
121
|
+
${perFileHistory}
|
|
122
|
+
|
|
123
|
+
ENRICHMENT CONTEXT:
|
|
124
|
+
${enrichmentSummaries}
|
|
125
|
+
|
|
126
|
+
For each modified file, respond with a JSON array:
|
|
127
|
+
[
|
|
128
|
+
{
|
|
129
|
+
"file": "path/to/file",
|
|
130
|
+
"status": "PASS" | "WARN" | "BLOCK",
|
|
131
|
+
"reason": "explanation with commit references",
|
|
132
|
+
"related_commits": ["hash1", "hash2"]
|
|
133
|
+
}
|
|
134
|
+
]
|
|
135
|
+
|
|
136
|
+
Rules:
|
|
137
|
+
- BLOCK: change directly re-introduces a reverted pattern or re-introduces intentionally removed code
|
|
138
|
+
- WARN: file has high churn history, recent thrashing, or multiple related reverts nearby
|
|
139
|
+
- PASS: no concerning patterns detected
|
|
140
|
+
- Be concise. Reference short hashes (7 chars) when citing commits.
|
|
141
|
+
- Respond ONLY with the JSON array, no markdown fences, no explanation.`;
|
|
142
|
+
}
|
|
143
|
+
function localFallback(files, fileData) {
|
|
144
|
+
return files.map((file) => {
|
|
145
|
+
const data = fileData.get(file);
|
|
146
|
+
if (!data) {
|
|
147
|
+
return { file, status: "PASS", reason: "No history found for this file.", related_commits: [] };
|
|
148
|
+
}
|
|
149
|
+
const { editCount, recentEdits, reverts } = data;
|
|
150
|
+
const revertHashes = reverts.map((r) => r.hash.slice(0, 7));
|
|
151
|
+
if (reverts.length > 0) {
|
|
152
|
+
return {
|
|
153
|
+
file,
|
|
154
|
+
status: "WARN",
|
|
155
|
+
reason: `File has ${reverts.length} revert(s) in history (${revertHashes.join(", ")}). ${editCount} total edits, ${recentEdits} in last 10 commits.`,
|
|
156
|
+
related_commits: revertHashes,
|
|
157
|
+
edit_count: editCount,
|
|
158
|
+
revert_count: reverts.length,
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
if (recentEdits >= 5) {
|
|
162
|
+
return {
|
|
163
|
+
file,
|
|
164
|
+
status: "WARN",
|
|
165
|
+
reason: `High churn: ${recentEdits} edits in last 10 commits (${editCount} total). May be thrashing.`,
|
|
166
|
+
related_commits: [],
|
|
167
|
+
edit_count: editCount,
|
|
168
|
+
revert_count: 0,
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
return {
|
|
172
|
+
file,
|
|
173
|
+
status: "PASS",
|
|
174
|
+
reason: `${editCount} total edit(s), ${recentEdits} in last 10 commits. No reverts detected.`,
|
|
175
|
+
related_commits: [],
|
|
176
|
+
edit_count: editCount,
|
|
177
|
+
revert_count: 0,
|
|
178
|
+
};
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
function formatResultsText(results) {
|
|
182
|
+
const lines = [];
|
|
183
|
+
for (const r of results) {
|
|
184
|
+
const icon = r.status === "PASS" ? "✓" : r.status === "WARN" ? "⚠" : "✗";
|
|
185
|
+
lines.push(`${icon} [${r.status}] ${r.file}`);
|
|
186
|
+
lines.push(` ${r.reason}`);
|
|
187
|
+
if (r.related_commits.length > 0) {
|
|
188
|
+
lines.push(` Related commits: ${r.related_commits.join(", ")}`);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
return lines.join("\n") + "\n";
|
|
192
|
+
}
|
|
193
|
+
export function verifyCommand() {
|
|
194
|
+
return new Command("verify")
|
|
195
|
+
.description("Check staged changes against git history for repeated mistakes and reverted patterns")
|
|
196
|
+
.option("--file <path>", "Check a specific file instead of staged changes")
|
|
197
|
+
.option("--json", "Output structured JSON")
|
|
198
|
+
.action(async (opts) => {
|
|
199
|
+
const cwd = process.cwd();
|
|
200
|
+
// Get the diff to analyze
|
|
201
|
+
let stagedDiff;
|
|
202
|
+
let files;
|
|
203
|
+
if (opts.file) {
|
|
204
|
+
stagedDiff = getFileDiff(cwd, opts.file);
|
|
205
|
+
files = stagedDiff ? [opts.file] : [];
|
|
206
|
+
if (!stagedDiff) {
|
|
207
|
+
process.stdout.write(`No diff found for ${opts.file}\n`);
|
|
208
|
+
return;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
else {
|
|
212
|
+
stagedDiff = getStagedDiff(cwd);
|
|
213
|
+
files = getStagedFiles(cwd);
|
|
214
|
+
if (!stagedDiff || files.length === 0) {
|
|
215
|
+
process.stdout.write("Nothing staged. Use --file or stage changes first.\n");
|
|
216
|
+
return;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
// Check if history DB exists
|
|
220
|
+
const historyDir = join(cwd, ".git-history");
|
|
221
|
+
if (!hasDb(historyDir)) {
|
|
222
|
+
process.stdout.write("No .git-history/ database found. Run `git-skill snapshot` first.\n");
|
|
223
|
+
if (opts.json) {
|
|
224
|
+
process.stdout.write(JSON.stringify([]) + "\n");
|
|
225
|
+
}
|
|
226
|
+
return;
|
|
227
|
+
}
|
|
228
|
+
const db = openDb(historyDir);
|
|
229
|
+
try {
|
|
230
|
+
// Gather per-file history
|
|
231
|
+
const fileData = new Map();
|
|
232
|
+
const revertDiffs = [];
|
|
233
|
+
for (const file of files) {
|
|
234
|
+
// Total edit count
|
|
235
|
+
const editCountRow = db
|
|
236
|
+
.prepare("SELECT COUNT(*) as count FROM commit_files WHERE file_path = ?")
|
|
237
|
+
.get(file);
|
|
238
|
+
const editCount = editCountRow?.count ?? 0;
|
|
239
|
+
// Recent 10 commits touching this file
|
|
240
|
+
const recentRows = db
|
|
241
|
+
.prepare(`SELECT cf.commit_hash FROM commit_files cf
|
|
242
|
+
JOIN commits c ON c.hash = cf.commit_hash
|
|
243
|
+
WHERE cf.file_path = ?
|
|
244
|
+
ORDER BY c.timestamp DESC LIMIT 10`)
|
|
245
|
+
.all(file);
|
|
246
|
+
const recentEdits = recentRows.length;
|
|
247
|
+
// Reverts
|
|
248
|
+
const reverts = db
|
|
249
|
+
.prepare(`SELECT c.hash, c.message FROM commits c
|
|
250
|
+
JOIN commit_files cf ON c.hash = cf.commit_hash
|
|
251
|
+
WHERE cf.file_path = ?
|
|
252
|
+
AND (c.message LIKE '%revert%' OR c.message LIKE '%Revert%')
|
|
253
|
+
ORDER BY c.timestamp DESC LIMIT 5`)
|
|
254
|
+
.all(file);
|
|
255
|
+
// Decision points
|
|
256
|
+
const decisions = db
|
|
257
|
+
.prepare(`SELECT dp.type, c.message, c.hash FROM decision_points dp
|
|
258
|
+
JOIN commits c ON c.hash = dp.commit_hash
|
|
259
|
+
JOIN commit_files cf ON cf.commit_hash = c.hash
|
|
260
|
+
WHERE cf.file_path = ?
|
|
261
|
+
ORDER BY c.timestamp DESC LIMIT 5`)
|
|
262
|
+
.all(file);
|
|
263
|
+
// Enrichments
|
|
264
|
+
const enrichments = db
|
|
265
|
+
.prepare(`SELECT e.intent, e.reasoning, e.category FROM enrichments e
|
|
266
|
+
JOIN commit_files cf ON cf.commit_hash = e.commit_hash
|
|
267
|
+
WHERE cf.file_path = ?
|
|
268
|
+
ORDER BY e.commit_hash DESC LIMIT 5`)
|
|
269
|
+
.all(file);
|
|
270
|
+
fileData.set(file, { editCount, recentEdits, reverts, decisions, enrichments });
|
|
271
|
+
// Pull revert diffs for context (up to 2 per file)
|
|
272
|
+
for (const revert of reverts.slice(0, 2)) {
|
|
273
|
+
const diff = getCommitDiff(cwd, revert.hash, 2000);
|
|
274
|
+
revertDiffs.push(`Revert commit ${revert.hash.slice(0, 7)}: ${revert.message}\n${diff}`);
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
// Try LLM if configured
|
|
278
|
+
const config = readConfig();
|
|
279
|
+
const enrichEnabled = config?.enrichment?.enabled && config.enrichment.url;
|
|
280
|
+
let results;
|
|
281
|
+
if (enrichEnabled) {
|
|
282
|
+
loadDotEnv();
|
|
283
|
+
const apiKey = resolveEnvVar(config.enrichment.apiKey);
|
|
284
|
+
const maxTokens = config.enrichment.maxTokensPerCommit || 5000;
|
|
285
|
+
// Build per-file history summaries
|
|
286
|
+
const fileHistories = files.map((file) => {
|
|
287
|
+
const data = fileData.get(file);
|
|
288
|
+
const parts = [];
|
|
289
|
+
parts.push(`Total edits: ${data.editCount}`);
|
|
290
|
+
parts.push(`Edits in last 10 commits: ${data.recentEdits}`);
|
|
291
|
+
if (data.reverts.length > 0) {
|
|
292
|
+
parts.push(`Reverts (${data.reverts.length}):`);
|
|
293
|
+
data.reverts.forEach((r) => parts.push(` - ${r.hash.slice(0, 7)}: ${r.message}`));
|
|
294
|
+
}
|
|
295
|
+
if (data.decisions.length > 0) {
|
|
296
|
+
parts.push(`Decision points:`);
|
|
297
|
+
data.decisions.forEach((d) => parts.push(` - [${d.type}] ${d.hash.slice(0, 7)}: ${d.message}`));
|
|
298
|
+
}
|
|
299
|
+
return { file, summary: parts.join("\n") };
|
|
300
|
+
});
|
|
301
|
+
// Build enrichment summaries
|
|
302
|
+
const enrichmentParts = [];
|
|
303
|
+
for (const file of files) {
|
|
304
|
+
const data = fileData.get(file);
|
|
305
|
+
if (data.enrichments.length > 0) {
|
|
306
|
+
enrichmentParts.push(`${file}:`);
|
|
307
|
+
data.enrichments.forEach((e) => {
|
|
308
|
+
enrichmentParts.push(` [${e.category ?? "?"}] ${e.intent ?? ""}`);
|
|
309
|
+
if (e.reasoning)
|
|
310
|
+
enrichmentParts.push(` Reasoning: ${e.reasoning.slice(0, 200)}`);
|
|
311
|
+
});
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
if (revertDiffs.length > 0) {
|
|
315
|
+
enrichmentParts.push("\nHistorical revert diffs:");
|
|
316
|
+
revertDiffs.forEach((d) => enrichmentParts.push(d));
|
|
317
|
+
}
|
|
318
|
+
const prompt = buildVerifyPrompt(stagedDiff, fileHistories, enrichmentParts.join("\n"));
|
|
319
|
+
const llmResults = await callLlmVerify(config.enrichment.url, config.enrichment.model, apiKey, maxTokens, prompt);
|
|
320
|
+
if (llmResults) {
|
|
321
|
+
results = llmResults;
|
|
322
|
+
}
|
|
323
|
+
else {
|
|
324
|
+
process.stderr.write("LLM call failed, falling back to local analysis.\n");
|
|
325
|
+
results = localFallback(files, fileData);
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
else {
|
|
329
|
+
results = localFallback(files, fileData);
|
|
330
|
+
}
|
|
331
|
+
if (opts.json) {
|
|
332
|
+
process.stdout.write(JSON.stringify(results, null, 2) + "\n");
|
|
333
|
+
}
|
|
334
|
+
else {
|
|
335
|
+
process.stdout.write(formatResultsText(results));
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
finally {
|
|
339
|
+
db.close();
|
|
340
|
+
}
|
|
341
|
+
});
|
|
342
|
+
}
|
|
343
|
+
//# sourceMappingURL=verify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verify.js","sourceRoot":"","sources":["../../src/commands/verify.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -29,6 +29,7 @@ import { cronCommand } from "./commands/cron.js";
|
|
|
29
29
|
import { updateCommand } from "./commands/update.js";
|
|
30
30
|
import { uninstallCommand } from "./commands/uninstall.js";
|
|
31
31
|
import { contextUpdateCommand } from "./commands/context-update.js";
|
|
32
|
+
import { verifyCommand } from "./commands/verify.js";
|
|
32
33
|
const program = new Command();
|
|
33
34
|
program
|
|
34
35
|
.name("git-skill")
|
|
@@ -59,6 +60,7 @@ program.addCommand(cronCommand());
|
|
|
59
60
|
program.addCommand(updateCommand());
|
|
60
61
|
program.addCommand(uninstallCommand());
|
|
61
62
|
program.addCommand(contextUpdateCommand());
|
|
63
|
+
program.addCommand(verifyCommand());
|
|
62
64
|
program
|
|
63
65
|
.command("snapshot")
|
|
64
66
|
.description("Backfill all git history into SQLite")
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AACvC,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,GAAG,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;AACvC,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|