git-history-ui 4.0.1 → 5.0.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/CHANGELOG.md +36 -0
- package/CODE_OF_CONDUCT.md +53 -0
- package/CONTRIBUTING.md +132 -0
- package/LICENSE +21 -0
- package/README.md +75 -15
- package/SECURITY.md +51 -0
- package/build/frontend/chunk-6DL2ZTKG.js +1 -0
- package/build/frontend/chunk-ACWXPHRR.js +1 -0
- package/build/frontend/{chunk-CFCRPNUQ.js → chunk-F6HZ5OVS.js} +1 -1
- package/build/frontend/{chunk-UHWTLUOW.js → chunk-GHSRMAIR.js} +1 -1
- package/build/frontend/chunk-J5ZVP6TN.js +9 -0
- package/build/frontend/chunk-PRY6VAFG.js +1 -0
- package/build/frontend/chunk-PXNKNORB.js +1 -0
- package/build/frontend/chunk-S56XRIZ7.js +9 -0
- package/build/frontend/chunk-STUSEB5P.js +1 -0
- package/build/frontend/chunk-UM7ESEXJ.js +5 -0
- package/build/frontend/chunk-VGAHCEAA.js +1 -0
- package/build/frontend/chunk-XLGWMKXV.js +1 -0
- package/build/frontend/chunk-Y6GOUMAT.js +1 -0
- package/build/frontend/index.html +2 -2
- package/build/frontend/main-W5NQX3FE.js +1 -0
- package/build/frontend/styles-RQGRQK4Z.css +1 -0
- package/dist/backend/aggregations.d.ts +1 -0
- package/dist/backend/aggregations.d.ts.map +1 -0
- package/dist/backend/annotations.d.ts +10 -1
- package/dist/backend/annotations.d.ts.map +1 -0
- package/dist/backend/annotations.js +84 -9
- package/dist/backend/annotations.js.map +1 -1
- package/dist/backend/breakage.d.ts +70 -0
- package/dist/backend/breakage.d.ts.map +1 -0
- package/dist/backend/breakage.js +235 -0
- package/dist/backend/breakage.js.map +1 -0
- package/dist/backend/cache/sqliteIndex.d.ts +2 -1
- package/dist/backend/cache/sqliteIndex.d.ts.map +1 -0
- package/dist/backend/cache/sqliteIndex.js +36 -23
- package/dist/backend/cache/sqliteIndex.js.map +1 -1
- package/dist/backend/dev-server.d.ts +1 -0
- package/dist/backend/dev-server.d.ts.map +1 -0
- package/dist/backend/gitService.d.ts +15 -6
- package/dist/backend/gitService.d.ts.map +1 -0
- package/dist/backend/gitService.js +148 -45
- package/dist/backend/gitService.js.map +1 -1
- package/dist/backend/grouping/prGrouping.d.ts +1 -0
- package/dist/backend/grouping/prGrouping.d.ts.map +1 -0
- package/dist/backend/grouping/prGrouping.js +41 -19
- package/dist/backend/grouping/prGrouping.js.map +1 -1
- package/dist/backend/impact.d.ts +4 -1
- package/dist/backend/impact.d.ts.map +1 -0
- package/dist/backend/impact.js +30 -16
- package/dist/backend/impact.js.map +1 -1
- package/dist/backend/insights.d.ts +1 -0
- package/dist/backend/insights.d.ts.map +1 -0
- package/dist/backend/insights.js +8 -3
- package/dist/backend/insights.js.map +1 -1
- package/dist/backend/llm/anthropicProvider.d.ts +2 -0
- package/dist/backend/llm/anthropicProvider.d.ts.map +1 -0
- package/dist/backend/llm/anthropicProvider.js +10 -4
- package/dist/backend/llm/anthropicProvider.js.map +1 -1
- package/dist/backend/llm/heuristicProvider.d.ts +2 -0
- package/dist/backend/llm/heuristicProvider.d.ts.map +1 -0
- package/dist/backend/llm/heuristicProvider.js +54 -4
- package/dist/backend/llm/heuristicProvider.js.map +1 -1
- package/dist/backend/llm/index.d.ts +7 -0
- package/dist/backend/llm/index.d.ts.map +1 -0
- package/dist/backend/llm/index.js +15 -5
- package/dist/backend/llm/index.js.map +1 -1
- package/dist/backend/llm/openaiProvider.d.ts +3 -0
- package/dist/backend/llm/openaiProvider.d.ts.map +1 -0
- package/dist/backend/llm/openaiProvider.js +29 -4
- package/dist/backend/llm/openaiProvider.js.map +1 -1
- package/dist/backend/llm/types.d.ts +3 -1
- package/dist/backend/llm/types.d.ts.map +1 -0
- package/dist/backend/presets.d.ts +1 -0
- package/dist/backend/presets.d.ts.map +1 -0
- package/dist/backend/search/datePhrase.d.ts +1 -0
- package/dist/backend/search/datePhrase.d.ts.map +1 -0
- package/dist/backend/search/nlSearch.d.ts +1 -0
- package/dist/backend/search/nlSearch.d.ts.map +1 -0
- package/dist/backend/server.d.ts +1 -0
- package/dist/backend/server.d.ts.map +1 -0
- package/dist/backend/server.js +100 -26
- package/dist/backend/server.js.map +1 -1
- package/dist/backend/snapshot.d.ts +4 -1
- package/dist/backend/snapshot.d.ts.map +1 -0
- package/dist/backend/snapshot.js +14 -9
- package/dist/backend/snapshot.js.map +1 -1
- package/dist/cli.d.ts +1 -0
- package/dist/cli.d.ts.map +1 -0
- package/docs/API.md +70 -0
- package/docs/architecture.md +85 -0
- package/docs/configuration.md +54 -0
- package/docs/troubleshooting.md +85 -0
- package/package.json +44 -8
- package/build/frontend/chunk-4JCUQ6Y5.js +0 -1
- package/build/frontend/chunk-6VRZZB3T.js +0 -1
- package/build/frontend/chunk-EZUFC4CQ.js +0 -1
- package/build/frontend/chunk-GRG6HTLW.js +0 -9
- package/build/frontend/chunk-I4VBIHH2.js +0 -1
- package/build/frontend/chunk-OBPR2XVH.js +0 -5
- package/build/frontend/chunk-QNEGGJHP.js +0 -2
- package/build/frontend/chunk-UIWFTWLF.js +0 -1
- package/build/frontend/chunk-UNROVCUZ.js +0 -7
- package/build/frontend/chunk-UWM4ZZWH.js +0 -1
- package/build/frontend/chunk-VHEMN3MU.js +0 -1
- package/build/frontend/main-SQFBVJA6.js +0 -1
- package/build/frontend/styles-DUWPKHDX.css +0 -1
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import type { GitService } from './gitService';
|
|
2
|
+
/**
|
|
3
|
+
* Breakage Analysis — heuristic, SZZ-lite "what likely broke this file".
|
|
4
|
+
*
|
|
5
|
+
* Inputs: a file path. Outputs:
|
|
6
|
+
* - the recent commits that touched the file (with churn);
|
|
7
|
+
* - which of those look like fix/revert/hotfix commits;
|
|
8
|
+
* - "suspect" commits scored by how strongly they correlate with the
|
|
9
|
+
* fixes that followed them (immediately preceding a fix, large
|
|
10
|
+
* churn, fix landed within a week, etc.);
|
|
11
|
+
* - co-changed files (files commonly modified alongside the fix
|
|
12
|
+
* commits that touched this file);
|
|
13
|
+
* - a coarse risk score / one-line summary for the UI.
|
|
14
|
+
*
|
|
15
|
+
* The scoring is intentionally local and explainable — every suspect
|
|
16
|
+
* carries a `reasons[]` array so the UI can show *why* a commit is
|
|
17
|
+
* flagged. We do not try to do real SZZ blame because it requires
|
|
18
|
+
* line-level history and is far slower; this heuristic catches the most
|
|
19
|
+
* common "regression introduced by the previous touch" pattern with
|
|
20
|
+
* essentially zero extra git roundtrips.
|
|
21
|
+
*/
|
|
22
|
+
export interface BreakageCommit {
|
|
23
|
+
hash: string;
|
|
24
|
+
shortHash: string;
|
|
25
|
+
author: string;
|
|
26
|
+
date: string;
|
|
27
|
+
subject: string;
|
|
28
|
+
isFix: boolean;
|
|
29
|
+
isRevert: boolean;
|
|
30
|
+
additions: number;
|
|
31
|
+
deletions: number;
|
|
32
|
+
churn: number;
|
|
33
|
+
}
|
|
34
|
+
export interface BreakageFixRef {
|
|
35
|
+
hash: string;
|
|
36
|
+
shortHash: string;
|
|
37
|
+
subject: string;
|
|
38
|
+
date: string;
|
|
39
|
+
}
|
|
40
|
+
export interface BreakageSuspect {
|
|
41
|
+
hash: string;
|
|
42
|
+
shortHash: string;
|
|
43
|
+
subject: string;
|
|
44
|
+
author: string;
|
|
45
|
+
date: string;
|
|
46
|
+
churn: number;
|
|
47
|
+
score: number;
|
|
48
|
+
reasons: string[];
|
|
49
|
+
linkedFixes: BreakageFixRef[];
|
|
50
|
+
}
|
|
51
|
+
export interface CoChangedFile {
|
|
52
|
+
file: string;
|
|
53
|
+
count: number;
|
|
54
|
+
}
|
|
55
|
+
export interface BreakageAnalysis {
|
|
56
|
+
file: string;
|
|
57
|
+
totalCommits: number;
|
|
58
|
+
fixCount: number;
|
|
59
|
+
riskScore: number;
|
|
60
|
+
summary: string;
|
|
61
|
+
commits: BreakageCommit[];
|
|
62
|
+
fixCommits: BreakageCommit[];
|
|
63
|
+
suspects: BreakageSuspect[];
|
|
64
|
+
coChangedFiles: CoChangedFile[];
|
|
65
|
+
}
|
|
66
|
+
export declare function getFileBreakageAnalysis(gitService: GitService, file: string, options?: {
|
|
67
|
+
limit?: number;
|
|
68
|
+
signal?: AbortSignal;
|
|
69
|
+
}): Promise<BreakageAnalysis>;
|
|
70
|
+
//# sourceMappingURL=breakage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"breakage.d.ts","sourceRoot":"","sources":["../../src/backend/breakage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE/C;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,OAAO,CAAC;IACf,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,WAAW,EAAE,cAAc,EAAE,CAAC;CAC/B;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,UAAU,EAAE,cAAc,EAAE,CAAC;IAC7B,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC5B,cAAc,EAAE,aAAa,EAAE,CAAC;CACjC;AAgBD,wBAAsB,uBAAuB,CAC3C,UAAU,EAAE,UAAU,EACtB,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,WAAW,CAAA;CAAO,GACrD,OAAO,CAAC,gBAAgB,CAAC,CA2K3B"}
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getFileBreakageAnalysis = getFileBreakageAnalysis;
|
|
4
|
+
const FIX_RE = /\b(fix(?:e[ds])?|fixing|bug(?:fix)?|hotfix|patch(?:es)?|regression|crash(?:es|ed)?|panic|broken|breaks?|hang|deadlock|null\s*pointer|npe|leak|race(?:\s*condition)?|segfault|oops|undefined\s+behavior)\b/i;
|
|
5
|
+
const REVERT_RE = /\brevert\b/i;
|
|
6
|
+
const COMMITS_LIMIT = 200;
|
|
7
|
+
const SUSPECT_LIMIT = 10;
|
|
8
|
+
const COCHANGE_LIMIT = 10;
|
|
9
|
+
const SUSPECT_LOOKBACK = 6;
|
|
10
|
+
const COCHANGE_FIX_PROBE_LIMIT = 15;
|
|
11
|
+
const COCHANGE_SUSPECT_PROBE_LIMIT = 5;
|
|
12
|
+
const COCHANGE_DIFF_CONCURRENCY = 4;
|
|
13
|
+
const DIFF_CACHE_TTL_MS = 60_000;
|
|
14
|
+
const diffCache = new Map();
|
|
15
|
+
async function getFileBreakageAnalysis(gitService, file, options = {}) {
|
|
16
|
+
if (!file || file.includes('\0'))
|
|
17
|
+
throw new Error('Invalid path');
|
|
18
|
+
const limit = clamp(options.limit ?? COMMITS_LIMIT, 10, 1000);
|
|
19
|
+
const { signal } = options;
|
|
20
|
+
const checkAborted = () => {
|
|
21
|
+
if (signal?.aborted)
|
|
22
|
+
throw new Error('breakage analysis aborted');
|
|
23
|
+
};
|
|
24
|
+
checkAborted();
|
|
25
|
+
const page = await gitService.getCommits({ file, page: 1, pageSize: limit }).catch(() => null);
|
|
26
|
+
checkAborted();
|
|
27
|
+
if (!page || page.commits.length === 0) {
|
|
28
|
+
return emptyResult(file);
|
|
29
|
+
}
|
|
30
|
+
// Per-commit numstat for the same window, scoped to this file via the
|
|
31
|
+
// pathspec git log accepts. Any commit not in the map gets 0 churn.
|
|
32
|
+
const numstat = await gitService
|
|
33
|
+
.getNumstat({ file }, limit, { signal })
|
|
34
|
+
.catch(() => new Map());
|
|
35
|
+
checkAborted();
|
|
36
|
+
const commits = page.commits.map((c) => {
|
|
37
|
+
const stats = (numstat.get(c.hash) ?? []).reduce((acc, n) => ({
|
|
38
|
+
additions: acc.additions + n.additions,
|
|
39
|
+
deletions: acc.deletions + n.deletions
|
|
40
|
+
}), { additions: 0, deletions: 0 });
|
|
41
|
+
const isRevert = REVERT_RE.test(c.subject);
|
|
42
|
+
const isFix = !isRevert && (FIX_RE.test(c.subject) || FIX_RE.test(c.body));
|
|
43
|
+
return {
|
|
44
|
+
hash: c.hash,
|
|
45
|
+
shortHash: c.shortHash,
|
|
46
|
+
author: c.author,
|
|
47
|
+
date: c.date,
|
|
48
|
+
subject: c.subject,
|
|
49
|
+
isFix,
|
|
50
|
+
isRevert,
|
|
51
|
+
additions: stats.additions,
|
|
52
|
+
deletions: stats.deletions,
|
|
53
|
+
churn: stats.additions + stats.deletions
|
|
54
|
+
};
|
|
55
|
+
});
|
|
56
|
+
// Defensive: ensure newest-first ordering for the suspect walk below.
|
|
57
|
+
commits.sort((a, b) => b.date.localeCompare(a.date));
|
|
58
|
+
const indexByHash = new Map();
|
|
59
|
+
commits.forEach((c, i) => indexByHash.set(c.hash, i));
|
|
60
|
+
const fixCommits = commits.filter((c) => c.isFix || c.isRevert);
|
|
61
|
+
const suspectsMap = new Map();
|
|
62
|
+
const ensure = (info) => {
|
|
63
|
+
let entry = suspectsMap.get(info.hash);
|
|
64
|
+
if (!entry) {
|
|
65
|
+
entry = { info, score: 0, reasons: new Set(), fixes: new Map() };
|
|
66
|
+
suspectsMap.set(info.hash, entry);
|
|
67
|
+
}
|
|
68
|
+
return entry;
|
|
69
|
+
};
|
|
70
|
+
for (const fix of fixCommits) {
|
|
71
|
+
const fixIdx = indexByHash.get(fix.hash);
|
|
72
|
+
if (fixIdx === undefined)
|
|
73
|
+
continue;
|
|
74
|
+
const fixRef = {
|
|
75
|
+
hash: fix.hash,
|
|
76
|
+
shortHash: fix.shortHash,
|
|
77
|
+
subject: fix.subject,
|
|
78
|
+
date: fix.date
|
|
79
|
+
};
|
|
80
|
+
let assignedDirect = false;
|
|
81
|
+
for (let i = fixIdx + 1; i < commits.length && i - fixIdx <= SUSPECT_LOOKBACK; i++) {
|
|
82
|
+
const candidate = commits[i];
|
|
83
|
+
if (candidate.isFix || candidate.isRevert)
|
|
84
|
+
continue;
|
|
85
|
+
const entry = ensure(candidate);
|
|
86
|
+
if (entry.fixes.has(fix.hash))
|
|
87
|
+
continue;
|
|
88
|
+
entry.fixes.set(fix.hash, fixRef);
|
|
89
|
+
if (!assignedDirect) {
|
|
90
|
+
entry.score += 5;
|
|
91
|
+
entry.reasons.add('immediately preceded a fix');
|
|
92
|
+
assignedDirect = true;
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
entry.score += 2;
|
|
96
|
+
entry.reasons.add('changed shortly before a fix');
|
|
97
|
+
}
|
|
98
|
+
if (candidate.churn >= 100) {
|
|
99
|
+
entry.score += 2;
|
|
100
|
+
entry.reasons.add('large change (>=100 lines)');
|
|
101
|
+
}
|
|
102
|
+
else if (candidate.churn >= 30) {
|
|
103
|
+
entry.score += 1;
|
|
104
|
+
entry.reasons.add('moderate change (>=30 lines)');
|
|
105
|
+
}
|
|
106
|
+
const days = daysBetween(candidate.date, fix.date);
|
|
107
|
+
if (days >= 0 && days <= 7) {
|
|
108
|
+
entry.score += 2;
|
|
109
|
+
entry.reasons.add('fix landed within a week');
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
const suspects = Array.from(suspectsMap.values())
|
|
114
|
+
.sort((a, b) => b.score - a.score || b.info.date.localeCompare(a.info.date))
|
|
115
|
+
.slice(0, SUSPECT_LIMIT)
|
|
116
|
+
.map((s) => ({
|
|
117
|
+
hash: s.info.hash,
|
|
118
|
+
shortHash: s.info.shortHash,
|
|
119
|
+
subject: s.info.subject,
|
|
120
|
+
author: s.info.author,
|
|
121
|
+
date: s.info.date,
|
|
122
|
+
churn: s.info.churn,
|
|
123
|
+
score: s.score,
|
|
124
|
+
reasons: Array.from(s.reasons),
|
|
125
|
+
linkedFixes: Array.from(s.fixes.values()).sort((a, b) => b.date.localeCompare(a.date))
|
|
126
|
+
}));
|
|
127
|
+
// Co-changed files: enumerate all files in the diffs of recent fix
|
|
128
|
+
// commits + top suspects. Bounded so we stay responsive on huge repos.
|
|
129
|
+
const cofreq = new Map();
|
|
130
|
+
const probeHashes = new Set();
|
|
131
|
+
for (const f of fixCommits.slice(0, COCHANGE_FIX_PROBE_LIMIT))
|
|
132
|
+
probeHashes.add(f.hash);
|
|
133
|
+
for (const s of suspects.slice(0, COCHANGE_SUSPECT_PROBE_LIMIT))
|
|
134
|
+
probeHashes.add(s.hash);
|
|
135
|
+
const cochangeDiffs = await runLimited(Array.from(probeHashes), COCHANGE_DIFF_CONCURRENCY, async (hash) => ({
|
|
136
|
+
hash,
|
|
137
|
+
files: await cachedDiffFiles(gitService, hash, options)
|
|
138
|
+
}));
|
|
139
|
+
for (const { files } of cochangeDiffs) {
|
|
140
|
+
const seen = new Set();
|
|
141
|
+
for (const other of files) {
|
|
142
|
+
if (!other || other === file || seen.has(other))
|
|
143
|
+
continue;
|
|
144
|
+
seen.add(other);
|
|
145
|
+
cofreq.set(other, (cofreq.get(other) ?? 0) + 1);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
const coChangedFiles = Array.from(cofreq.entries())
|
|
149
|
+
.map(([f, count]) => ({ file: f, count }))
|
|
150
|
+
.sort((a, b) => b.count - a.count || a.file.localeCompare(b.file))
|
|
151
|
+
.slice(0, COCHANGE_LIMIT);
|
|
152
|
+
const fixRatio = commits.length > 0 ? fixCommits.length / commits.length : 0;
|
|
153
|
+
const riskScore = Math.min(100, Math.round(fixRatio * 60 + Math.min(commits.length, 50) * 0.4 + suspects.length * 1.5));
|
|
154
|
+
return {
|
|
155
|
+
file,
|
|
156
|
+
totalCommits: page.total ?? commits.length,
|
|
157
|
+
fixCount: fixCommits.length,
|
|
158
|
+
riskScore,
|
|
159
|
+
summary: buildSummary(commits, fixCommits, suspects, riskScore),
|
|
160
|
+
commits,
|
|
161
|
+
fixCommits,
|
|
162
|
+
suspects,
|
|
163
|
+
coChangedFiles
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
async function cachedDiffFiles(gitService, hash, options = {}) {
|
|
167
|
+
const cached = diffCache.get(hash);
|
|
168
|
+
if (cached && cached.expiresAt > Date.now())
|
|
169
|
+
return cached.files;
|
|
170
|
+
if (options.signal?.aborted)
|
|
171
|
+
throw new Error('breakage aborted');
|
|
172
|
+
const files = await gitService
|
|
173
|
+
.getDiff(hash, { signal: options.signal })
|
|
174
|
+
.then((diff) => diff.map((d) => d.file))
|
|
175
|
+
.catch(() => []);
|
|
176
|
+
diffCache.set(hash, { files, expiresAt: Date.now() + DIFF_CACHE_TTL_MS });
|
|
177
|
+
if (diffCache.size > 200) {
|
|
178
|
+
const first = diffCache.keys().next().value;
|
|
179
|
+
if (first)
|
|
180
|
+
diffCache.delete(first);
|
|
181
|
+
}
|
|
182
|
+
return files;
|
|
183
|
+
}
|
|
184
|
+
async function runLimited(items, concurrency, fn) {
|
|
185
|
+
const out = new Array(items.length);
|
|
186
|
+
let cursor = 0;
|
|
187
|
+
await Promise.all(Array.from({ length: Math.min(concurrency, items.length) }, async () => {
|
|
188
|
+
while (cursor < items.length) {
|
|
189
|
+
const i = cursor++;
|
|
190
|
+
out[i] = await fn(items[i]);
|
|
191
|
+
}
|
|
192
|
+
}));
|
|
193
|
+
return out;
|
|
194
|
+
}
|
|
195
|
+
function emptyResult(file) {
|
|
196
|
+
return {
|
|
197
|
+
file,
|
|
198
|
+
totalCommits: 0,
|
|
199
|
+
fixCount: 0,
|
|
200
|
+
riskScore: 0,
|
|
201
|
+
summary: 'No commit history found for this file.',
|
|
202
|
+
commits: [],
|
|
203
|
+
fixCommits: [],
|
|
204
|
+
suspects: [],
|
|
205
|
+
coChangedFiles: []
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
function clamp(v, lo, hi) {
|
|
209
|
+
return Math.max(lo, Math.min(hi, v));
|
|
210
|
+
}
|
|
211
|
+
function daysBetween(a, b) {
|
|
212
|
+
const ta = Date.parse(a);
|
|
213
|
+
const tb = Date.parse(b);
|
|
214
|
+
if (!Number.isFinite(ta) || !Number.isFinite(tb))
|
|
215
|
+
return -1;
|
|
216
|
+
return Math.abs(tb - ta) / (1000 * 60 * 60 * 24);
|
|
217
|
+
}
|
|
218
|
+
function buildSummary(commits, fixCommits, suspects, riskScore) {
|
|
219
|
+
if (commits.length === 0)
|
|
220
|
+
return 'No commit history found.';
|
|
221
|
+
const parts = [];
|
|
222
|
+
parts.push(`${commits.length} recent commit${commits.length === 1 ? '' : 's'}, ` +
|
|
223
|
+
`${fixCommits.length} look${fixCommits.length === 1 ? 's' : ''} like fixes/reverts.`);
|
|
224
|
+
if (suspects.length > 0) {
|
|
225
|
+
const top = suspects[0];
|
|
226
|
+
parts.push(`Most likely culprit: ${top.shortHash} "${top.subject}" by ${top.author}.`);
|
|
227
|
+
}
|
|
228
|
+
parts.push(riskScore >= 60
|
|
229
|
+
? 'High breakage risk — fixes frequently follow recent changes.'
|
|
230
|
+
: riskScore >= 30
|
|
231
|
+
? 'Moderate breakage risk — some fix activity in this file.'
|
|
232
|
+
: 'Low breakage risk based on recent history.');
|
|
233
|
+
return parts.join(' ');
|
|
234
|
+
}
|
|
235
|
+
//# sourceMappingURL=breakage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"breakage.js","sourceRoot":"","sources":["../../src/backend/breakage.ts"],"names":[],"mappings":"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"}
|
|
@@ -43,9 +43,10 @@ export declare class SqliteIndex {
|
|
|
43
43
|
}): Promise<IndexStats>;
|
|
44
44
|
private doBuild;
|
|
45
45
|
/** Quick FTS5 / LIKE search returning hashes + subjects. */
|
|
46
|
-
search(query: string, limit?: number): Promise<
|
|
46
|
+
search(query: string, limit?: number): Promise<Commit[]>;
|
|
47
47
|
close(): void;
|
|
48
48
|
private refSignature;
|
|
49
49
|
private currentHead;
|
|
50
50
|
private isAncestor;
|
|
51
51
|
}
|
|
52
|
+
//# sourceMappingURL=sqliteIndex.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqliteIndex.d.ts","sourceRoot":"","sources":["../../../src/backend/cache/sqliteIndex.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAI5C,eAAO,MAAM,iBAAiB,QAE7B,CAAC;AAIF;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AA2BD,MAAM,MAAM,SAAS,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;AAC5D,MAAM,MAAM,eAAe,GAAG,CAC5B,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,EAChC,IAAI,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,WAAW,CAAA;CAAE,KAC5B,OAAO,CAAC,IAAI,CAAC,CAAC;AAEnB,qBAAa,WAAW;IASpB,OAAO,CAAC,MAAM;IARhB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,EAAE,CAAyB;IACnC,OAAO,CAAC,YAAY,CAA8B;IAClD,OAAO,CAAC,SAAS,CAAyB;gBAGxC,OAAO,EAAE,MAAM,EACP,MAAM,EAAE,SAAS,EACzB,SAAS,CAAC,EAAE,eAAe;IAQ7B,MAAM,CAAC,WAAW,IAAI,OAAO;IAI7B,MAAM,IAAI,OAAO;IAIjB,iFAAiF;IACjF,IAAI,IAAI,OAAO;IAoCT,KAAK,IAAI,OAAO,CAAC,UAAU,CAAC;IAclC,sEAAsE;IAChE,KAAK,CAAC,IAAI,GAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAO,GAAG,OAAO,CAAC,UAAU,CAAC;YAevD,OAAO;IAuGrB,4DAA4D;IACtD,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IA2C1D,KAAK;YAOS,YAAY;YAoBZ,WAAW;YAMX,UAAU;CAMzB"}
|
|
@@ -119,7 +119,7 @@ class SqliteIndex {
|
|
|
119
119
|
return;
|
|
120
120
|
const head = await this.currentHead();
|
|
121
121
|
const storedHead = this.db.prepare("SELECT v FROM meta WHERE k='indexedHead'").get()?.v ?? '';
|
|
122
|
-
const canIncrement = !!storedHead && !!head && await this.isAncestor(storedHead, head);
|
|
122
|
+
const canIncrement = !!storedHead && !!head && (await this.isAncestor(storedHead, head));
|
|
123
123
|
const args = [
|
|
124
124
|
'log',
|
|
125
125
|
'--all',
|
|
@@ -133,12 +133,14 @@ class SqliteIndex {
|
|
|
133
133
|
try {
|
|
134
134
|
this.db.exec('DELETE FROM commits_fts');
|
|
135
135
|
}
|
|
136
|
-
catch {
|
|
136
|
+
catch {
|
|
137
|
+
/* no fts */
|
|
138
|
+
}
|
|
137
139
|
}
|
|
138
140
|
const ins = this.db.prepare('INSERT OR REPLACE INTO commits(hash,short,author,email,date,parents,subject,body) VALUES (?,?,?,?,?,?,?,?)');
|
|
139
141
|
const insFts = (() => {
|
|
140
142
|
try {
|
|
141
|
-
return this.db.prepare(
|
|
143
|
+
return this.db.prepare('INSERT INTO commits_fts(rowid,subject,body) VALUES ((SELECT rowid FROM commits WHERE hash = ?), ?, ?)');
|
|
142
144
|
}
|
|
143
145
|
catch {
|
|
144
146
|
return null;
|
|
@@ -191,7 +193,9 @@ class SqliteIndex {
|
|
|
191
193
|
}
|
|
192
194
|
this.db.prepare("INSERT OR REPLACE INTO meta(k,v) VALUES('refsSig', ?)").run(sig);
|
|
193
195
|
this.db.prepare("INSERT OR REPLACE INTO meta(k,v) VALUES('indexedHead', ?)").run(head);
|
|
194
|
-
this.db
|
|
196
|
+
this.db
|
|
197
|
+
.prepare("INSERT OR REPLACE INTO meta(k,v) VALUES('builtAt', ?)")
|
|
198
|
+
.run(new Date().toISOString());
|
|
195
199
|
this.db.exec('COMMIT');
|
|
196
200
|
}
|
|
197
201
|
catch (err) {
|
|
@@ -207,21 +211,28 @@ class SqliteIndex {
|
|
|
207
211
|
let rows = [];
|
|
208
212
|
try {
|
|
209
213
|
rows = db
|
|
210
|
-
.prepare('SELECT c.hash, c.short, c.subject, c.date, c.author FROM commits_fts f JOIN commits c ON c.rowid = f.rowid WHERE commits_fts MATCH ? LIMIT ?')
|
|
214
|
+
.prepare('SELECT c.hash, c.short, c.subject, c.body, c.date, c.author, c.email, c.parents FROM commits_fts f JOIN commits c ON c.rowid = f.rowid WHERE commits_fts MATCH ? LIMIT ?')
|
|
211
215
|
.all(query, limit);
|
|
212
216
|
}
|
|
213
217
|
catch {
|
|
214
218
|
const like = `%${query}%`;
|
|
215
219
|
rows = db
|
|
216
|
-
.prepare('SELECT hash, short, subject, date, author FROM commits WHERE subject LIKE ? OR body LIKE ? ORDER BY date DESC LIMIT ?')
|
|
220
|
+
.prepare('SELECT hash, short, subject, body, date, author, email, parents FROM commits WHERE subject LIKE ? OR body LIKE ? ORDER BY date DESC LIMIT ?')
|
|
217
221
|
.all(like, like, limit);
|
|
218
222
|
}
|
|
219
223
|
return rows.map((r) => ({
|
|
220
224
|
hash: r.hash,
|
|
221
225
|
shortHash: r.short,
|
|
226
|
+
authorEmail: r.email,
|
|
222
227
|
subject: r.subject,
|
|
228
|
+
body: r.body,
|
|
229
|
+
message: r.body ? `${r.subject}\n\n${r.body}` : r.subject,
|
|
223
230
|
date: r.date,
|
|
224
|
-
author: r.author
|
|
231
|
+
author: r.author,
|
|
232
|
+
parents: r.parents ? r.parents.split(' ').filter(Boolean) : [],
|
|
233
|
+
branches: [],
|
|
234
|
+
tags: [],
|
|
235
|
+
isMerge: !!r.parents && r.parents.split(' ').filter(Boolean).length > 1
|
|
225
236
|
}));
|
|
226
237
|
}
|
|
227
238
|
close() {
|
|
@@ -232,33 +243,35 @@ class SqliteIndex {
|
|
|
232
243
|
}
|
|
233
244
|
async refSignature() {
|
|
234
245
|
const head = await this.currentHead();
|
|
235
|
-
let
|
|
246
|
+
let refs = '';
|
|
236
247
|
try {
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
mtimes += `${full}:${fs_1.default.statSync(full).mtimeMs};`;
|
|
245
|
-
}
|
|
246
|
-
};
|
|
247
|
-
if (fs_1.default.existsSync(refsDir))
|
|
248
|
-
walk(refsDir);
|
|
248
|
+
refs = await this.runGit([
|
|
249
|
+
'for-each-ref',
|
|
250
|
+
'--format=%(refname)%00%(objectname)%00%(creatordate:iso-strict)',
|
|
251
|
+
'refs/heads',
|
|
252
|
+
'refs/remotes',
|
|
253
|
+
'refs/tags'
|
|
254
|
+
]);
|
|
249
255
|
}
|
|
250
256
|
catch {
|
|
251
257
|
/* ignore */
|
|
252
258
|
}
|
|
253
|
-
return crypto_1.default
|
|
259
|
+
return crypto_1.default
|
|
260
|
+
.createHash('sha256')
|
|
261
|
+
.update(head + '|' + refs)
|
|
262
|
+
.digest('hex');
|
|
254
263
|
}
|
|
255
264
|
async currentHead() {
|
|
256
|
-
return this.runGit(['rev-parse', 'HEAD'])
|
|
265
|
+
return this.runGit(['rev-parse', 'HEAD'])
|
|
266
|
+
.then((s) => s.trim())
|
|
267
|
+
.catch(() => '');
|
|
257
268
|
}
|
|
258
269
|
async isAncestor(base, head) {
|
|
259
270
|
if (!/^[0-9a-fA-F]{4,40}$/.test(base) || !/^[0-9a-fA-F]{4,40}$/.test(head))
|
|
260
271
|
return false;
|
|
261
|
-
return this.runGit(['merge-base', '--is-ancestor', base, head])
|
|
272
|
+
return this.runGit(['merge-base', '--is-ancestor', base, head])
|
|
273
|
+
.then(() => true)
|
|
274
|
+
.catch(() => false);
|
|
262
275
|
}
|
|
263
276
|
}
|
|
264
277
|
exports.SqliteIndex = SqliteIndex;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sqliteIndex.js","sourceRoot":"","sources":["../../../src/backend/cache/sqliteIndex.ts"],"names":[],"mappings":";;;;;;AAAA,oDAA4B;AAC5B,4CAAoB;AACpB,4CAAoB;AACpB,gDAAwB;AACxB,mDAA+C;AAG/C,MAAM,SAAS,GAAG,MAAM,CAAC;AACzB,MAAM,UAAU,GAAG,MAAM,CAAC;AACb,QAAA,iBAAiB,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,IAAI,
|
|
1
|
+
{"version":3,"file":"sqliteIndex.js","sourceRoot":"","sources":["../../../src/backend/cache/sqliteIndex.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dev-server.d.ts","sourceRoot":"","sources":["../../src/backend/dev-server.ts"],"names":[],"mappings":""}
|
|
@@ -56,21 +56,29 @@ export declare class GitService {
|
|
|
56
56
|
private repoPath;
|
|
57
57
|
private refIndexCache;
|
|
58
58
|
private countCache;
|
|
59
|
+
private authorsCache;
|
|
59
60
|
private repoCheckResult;
|
|
60
61
|
constructor(repoPath?: string);
|
|
61
62
|
verifyRepository(): Promise<boolean>;
|
|
62
63
|
private getRefIndex;
|
|
63
|
-
getCommits(options?: GitOptions): Promise<PaginatedCommits>;
|
|
64
|
+
getCommits(options?: GitOptions, opts?: GitStreamOptions): Promise<PaginatedCommits>;
|
|
65
|
+
getCommitsForFiles(files: string[], limit?: number, opts?: GitStreamOptions): Promise<Commit[]>;
|
|
66
|
+
private getCachedTotal;
|
|
64
67
|
private getTotalCount;
|
|
65
68
|
private buildFilterArgs;
|
|
66
69
|
private revisionArg;
|
|
67
70
|
private parseLog;
|
|
68
71
|
getCommit(hash: string): Promise<Commit>;
|
|
69
|
-
getAuthors(): Promise<string[]>;
|
|
70
|
-
getDiff(hash: string): Promise<DiffFile[]>;
|
|
71
|
-
getRangeDiff(from: string, to: string): Promise<DiffFile[]>;
|
|
72
|
+
getAuthors(opts?: GitStreamOptions): Promise<string[]>;
|
|
73
|
+
getDiff(hash: string, opts?: GitStreamOptions): Promise<DiffFile[]>;
|
|
74
|
+
getRangeDiff(from: string, to: string, opts?: GitStreamOptions): Promise<DiffFile[]>;
|
|
72
75
|
/** Resolve any ref (branch/tag/HEAD) to its commit at or before `atIso`. */
|
|
73
|
-
revAt(ref: string, atIso: string): Promise<string | null>;
|
|
76
|
+
revAt(ref: string, atIso: string, opts?: GitStreamOptions): Promise<string | null>;
|
|
77
|
+
refsAt(atIso: string, opts?: GitStreamOptions): Promise<{
|
|
78
|
+
head: string | null;
|
|
79
|
+
branches: Record<string, string>;
|
|
80
|
+
tags: Record<string, string>;
|
|
81
|
+
}>;
|
|
74
82
|
/** Origin URL of the first remote (typically `origin`). */
|
|
75
83
|
getRemoteUrl(name?: string): Promise<string>;
|
|
76
84
|
getFileStats(filePath: string): Promise<{
|
|
@@ -81,7 +89,7 @@ export declare class GitService {
|
|
|
81
89
|
contributors: string[];
|
|
82
90
|
}>;
|
|
83
91
|
/** Read the contents of a file at a specific commit. */
|
|
84
|
-
getFileAtCommit(hash: string, filePath: string): Promise<string>;
|
|
92
|
+
getFileAtCommit(hash: string, filePath: string, opts?: GitStreamOptions): Promise<string>;
|
|
85
93
|
/** Pass-through git runner for trusted callers (e.g., SqliteIndex builder). */
|
|
86
94
|
runRaw(args: string[], opts?: {
|
|
87
95
|
maxBuffer?: number;
|
|
@@ -119,3 +127,4 @@ export declare class GitService {
|
|
|
119
127
|
getBranches(): Promise<string[]>;
|
|
120
128
|
private git;
|
|
121
129
|
}
|
|
130
|
+
//# sourceMappingURL=gitService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gitService.d.ts","sourceRoot":"","sources":["../../src/backend/gitService.ts"],"names":[],"mappings":"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"}
|