@m2015agg/git-skill 0.2.4 → 0.3.1
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/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/docs.js +8 -0
- package/dist/commands/docs.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/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/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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"}
|
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"}
|
|
@@ -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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"}
|