@fraction12/deepclean 0.1.0-alpha.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/CHANGELOG.md +22 -0
- package/LICENSE +21 -0
- package/README.md +171 -0
- package/dist/args.d.ts +9 -0
- package/dist/args.js +105 -0
- package/dist/args.js.map +1 -0
- package/dist/candidates.d.ts +6 -0
- package/dist/candidates.js +319 -0
- package/dist/candidates.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +521 -0
- package/dist/cli.js.map +1 -0
- package/dist/clusters.d.ts +7 -0
- package/dist/clusters.js +399 -0
- package/dist/clusters.js.map +1 -0
- package/dist/defaults.d.ts +5 -0
- package/dist/defaults.js +130 -0
- package/dist/defaults.js.map +1 -0
- package/dist/discovery.d.ts +10 -0
- package/dist/discovery.js +48 -0
- package/dist/discovery.js.map +1 -0
- package/dist/evidence.d.ts +16 -0
- package/dist/evidence.js +853 -0
- package/dist/evidence.js.map +1 -0
- package/dist/ids.d.ts +4 -0
- package/dist/ids.js +16 -0
- package/dist/ids.js.map +1 -0
- package/dist/json.d.ts +3 -0
- package/dist/json.js +12 -0
- package/dist/json.js.map +1 -0
- package/dist/plans.d.ts +3 -0
- package/dist/plans.js +171 -0
- package/dist/plans.js.map +1 -0
- package/dist/reporting.d.ts +13 -0
- package/dist/reporting.js +227 -0
- package/dist/reporting.js.map +1 -0
- package/dist/reviewers.d.ts +22 -0
- package/dist/reviewers.js +461 -0
- package/dist/reviewers.js.map +1 -0
- package/dist/state.d.ts +41 -0
- package/dist/state.js +211 -0
- package/dist/state.js.map +1 -0
- package/dist/synthesis.d.ts +17 -0
- package/dist/synthesis.js +396 -0
- package/dist/synthesis.js.map +1 -0
- package/dist/types.d.ts +389 -0
- package/dist/types.js +236 -0
- package/dist/types.js.map +1 -0
- package/dist/verification.d.ts +11 -0
- package/dist/verification.js +111 -0
- package/dist/verification.js.map +1 -0
- package/docs/privacy-and-trust.md +33 -0
- package/docs/public-readiness.md +19 -0
- package/docs/reviewer-references.md +33 -0
- package/docs/troubleshooting.md +80 -0
- package/package.json +55 -0
package/dist/clusters.js
ADDED
|
@@ -0,0 +1,399 @@
|
|
|
1
|
+
import { clusterId } from "./ids.js";
|
|
2
|
+
import { candidateCategories, schemaVersion, } from "./types.js";
|
|
3
|
+
const priorityScore = { P0: 0, P1: 1, P2: 2, P3: 3 };
|
|
4
|
+
const confidenceScore = { low: 1, medium: 2, high: 3 };
|
|
5
|
+
const effortScore = { small: 1, medium: 2, large: 3 };
|
|
6
|
+
const impactScore = { local: 1, feature: 2, "cross-cutting": 3 };
|
|
7
|
+
const riskScore = { safe: 1, moderate: 2, "design-needed": 3 };
|
|
8
|
+
export function buildClusters(runId, candidates, evidence, createdAt = new Date().toISOString(), options = {}) {
|
|
9
|
+
const maxCandidates = options.maxCandidates ?? 12;
|
|
10
|
+
const maxFiles = options.maxFiles ?? 18;
|
|
11
|
+
const splitBroad = options.splitBroad ?? true;
|
|
12
|
+
const active = candidates.filter((candidate) => !["ignored", "false-positive", "stale"].includes(candidate.status));
|
|
13
|
+
const graph = buildCandidateGraph(active, evidence);
|
|
14
|
+
const components = connectedComponents(active, graph.edges);
|
|
15
|
+
const clusters = components
|
|
16
|
+
.flatMap((component) => splitBroad ? splitBroadComponent(component, maxCandidates) : [component])
|
|
17
|
+
.filter((component) => component.length >= 2)
|
|
18
|
+
.map((component, index) => clusterForComponent(runId, component, index, graph.reasons, createdAt, {
|
|
19
|
+
maxCandidates,
|
|
20
|
+
maxFiles,
|
|
21
|
+
}));
|
|
22
|
+
return clusters.sort(compareClusters).map((cluster, index) => ({
|
|
23
|
+
...cluster,
|
|
24
|
+
id: clusterId(index),
|
|
25
|
+
}));
|
|
26
|
+
}
|
|
27
|
+
export function unclusteredCandidateIds(candidates, clusters) {
|
|
28
|
+
const clustered = new Set(clusters.flatMap((cluster) => cluster.candidateIds));
|
|
29
|
+
return candidates
|
|
30
|
+
.filter((candidate) => candidate.status === "open" && !clustered.has(candidate.id))
|
|
31
|
+
.map((candidate) => candidate.id);
|
|
32
|
+
}
|
|
33
|
+
function buildCandidateGraph(candidates, evidence) {
|
|
34
|
+
const codeEdges = codeGraphEdges(evidence);
|
|
35
|
+
const edges = [];
|
|
36
|
+
const reasons = new Map();
|
|
37
|
+
for (let leftIndex = 0; leftIndex < candidates.length; leftIndex += 1) {
|
|
38
|
+
for (let rightIndex = leftIndex + 1; rightIndex < candidates.length; rightIndex += 1) {
|
|
39
|
+
const left = candidates[leftIndex];
|
|
40
|
+
const right = candidates[rightIndex];
|
|
41
|
+
if (!left || !right) {
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
const result = similarity(left, right, codeEdges);
|
|
45
|
+
if (result.weight < 4) {
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
edges.push({ from: left.id, to: right.id, weight: result.weight });
|
|
49
|
+
reasons.set(pairKey(left.id, right.id), result.reasons);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return { edges, reasons };
|
|
53
|
+
}
|
|
54
|
+
function similarity(left, right, codeEdges) {
|
|
55
|
+
let weight = 0;
|
|
56
|
+
const reasons = [];
|
|
57
|
+
const sharedEvidence = intersection(left.evidenceIds, right.evidenceIds);
|
|
58
|
+
if (sharedEvidence.length > 0) {
|
|
59
|
+
weight += Math.min(8, sharedEvidence.length * 5);
|
|
60
|
+
reasons.push(`shared evidence ${sharedEvidence.join(", ")}`);
|
|
61
|
+
}
|
|
62
|
+
const leftFiles = left.files.map((file) => file.path);
|
|
63
|
+
const rightFiles = right.files.map((file) => file.path);
|
|
64
|
+
const sharedFiles = intersection(leftFiles, rightFiles);
|
|
65
|
+
if (sharedFiles.length > 0) {
|
|
66
|
+
weight += Math.min(8, sharedFiles.length * 4);
|
|
67
|
+
reasons.push(`shared files ${sharedFiles.slice(0, 3).join(", ")}`);
|
|
68
|
+
}
|
|
69
|
+
const sharedAreas = intersection(leftFiles.map(moduleArea), rightFiles.map(moduleArea))
|
|
70
|
+
.filter((area) => area !== "." && area.split("/").length >= 3);
|
|
71
|
+
if (sharedAreas.length > 0) {
|
|
72
|
+
weight += 2;
|
|
73
|
+
reasons.push(`same module area ${sharedAreas[0]}`);
|
|
74
|
+
}
|
|
75
|
+
if (hasCodeGraphLink(leftFiles, rightFiles, codeEdges)) {
|
|
76
|
+
weight += 3;
|
|
77
|
+
reasons.push("connected by local import graph");
|
|
78
|
+
}
|
|
79
|
+
if (left.category === right.category) {
|
|
80
|
+
weight += 1;
|
|
81
|
+
}
|
|
82
|
+
const titleOverlap = intersection(tokens(left.title), tokens(right.title));
|
|
83
|
+
if (titleOverlap.length >= 2) {
|
|
84
|
+
weight += 1.5;
|
|
85
|
+
reasons.push(`related language ${titleOverlap.slice(0, 3).join(", ")}`);
|
|
86
|
+
}
|
|
87
|
+
return { weight, reasons };
|
|
88
|
+
}
|
|
89
|
+
function connectedComponents(candidates, edges) {
|
|
90
|
+
const byId = new Map(candidates.map((candidate) => [candidate.id, candidate]));
|
|
91
|
+
const adjacency = new Map();
|
|
92
|
+
for (const candidate of candidates) {
|
|
93
|
+
adjacency.set(candidate.id, new Set());
|
|
94
|
+
}
|
|
95
|
+
for (const edge of edges) {
|
|
96
|
+
adjacency.get(edge.from)?.add(edge.to);
|
|
97
|
+
adjacency.get(edge.to)?.add(edge.from);
|
|
98
|
+
}
|
|
99
|
+
const visited = new Set();
|
|
100
|
+
const components = [];
|
|
101
|
+
for (const candidate of candidates) {
|
|
102
|
+
if (visited.has(candidate.id)) {
|
|
103
|
+
continue;
|
|
104
|
+
}
|
|
105
|
+
const stack = [candidate.id];
|
|
106
|
+
const component = [];
|
|
107
|
+
visited.add(candidate.id);
|
|
108
|
+
while (stack.length > 0) {
|
|
109
|
+
const id = stack.pop();
|
|
110
|
+
if (!id) {
|
|
111
|
+
continue;
|
|
112
|
+
}
|
|
113
|
+
const item = byId.get(id);
|
|
114
|
+
if (item) {
|
|
115
|
+
component.push(item);
|
|
116
|
+
}
|
|
117
|
+
for (const next of adjacency.get(id) ?? []) {
|
|
118
|
+
if (!visited.has(next)) {
|
|
119
|
+
visited.add(next);
|
|
120
|
+
stack.push(next);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
components.push(component);
|
|
125
|
+
}
|
|
126
|
+
return components;
|
|
127
|
+
}
|
|
128
|
+
function clusterForComponent(runId, candidates, index, reasons, createdAt, options) {
|
|
129
|
+
const sorted = [...candidates].sort(compareCandidates);
|
|
130
|
+
const allFiles = uniqueFiles(sorted.flatMap((candidate) => candidate.files));
|
|
131
|
+
const files = allFiles.slice(0, 20);
|
|
132
|
+
const category = mode(sorted.map((candidate) => candidate.category), candidateCategories);
|
|
133
|
+
const focus = clusterFocus(sorted, files);
|
|
134
|
+
const priority = minBy(sorted.map((candidate) => candidate.priority), priorityScore);
|
|
135
|
+
const confidence = maxBy(sorted.map((candidate) => candidate.confidence), confidenceScore);
|
|
136
|
+
const impact = maxBy(sorted.map((candidate) => candidate.impact), impactScore);
|
|
137
|
+
const effort = maxBy(sorted.map((candidate) => candidate.effort), effortScore);
|
|
138
|
+
const risk = maxBy(sorted.map((candidate) => candidate.risk), riskScore);
|
|
139
|
+
const evidenceIds = unique(sorted.flatMap((candidate) => candidate.evidenceIds));
|
|
140
|
+
const connectionReasons = connectionReasonsFor(sorted, reasons);
|
|
141
|
+
const title = clusterTitle(category, focus, sorted);
|
|
142
|
+
const warnings = clusterWarnings(sorted, allFiles, options);
|
|
143
|
+
const actionability = warnings.length > 0 ? "too-broad" : "bounded";
|
|
144
|
+
return {
|
|
145
|
+
schemaVersion,
|
|
146
|
+
recordType: "cluster",
|
|
147
|
+
id: clusterId(index),
|
|
148
|
+
runId,
|
|
149
|
+
title,
|
|
150
|
+
summary: `${sorted.length} related candidates point at ${focus === "." ? "a shared cleanup theme" : focus}.`,
|
|
151
|
+
category,
|
|
152
|
+
status: aggregateStatus(sorted),
|
|
153
|
+
priority,
|
|
154
|
+
confidence,
|
|
155
|
+
impact,
|
|
156
|
+
effort,
|
|
157
|
+
risk,
|
|
158
|
+
candidateIds: sorted.map((candidate) => candidate.id),
|
|
159
|
+
evidenceIds,
|
|
160
|
+
files,
|
|
161
|
+
rationale: connectionReasons.length > 0
|
|
162
|
+
? `Candidates are grouped because they have ${connectionReasons.slice(0, 4).join("; ")}.`
|
|
163
|
+
: "Candidates are grouped because they share module area, files, category, or graph relationships.",
|
|
164
|
+
suggestedDirection: `Treat this as one cleanup theme. Start by mapping the shared responsibility in ${focus}, then address the highest-priority candidate first while keeping the remaining candidates visible as constraints.`,
|
|
165
|
+
verification: unique(sorted.flatMap((candidate) => candidate.verification)),
|
|
166
|
+
actionability,
|
|
167
|
+
warnings,
|
|
168
|
+
createdAt,
|
|
169
|
+
updatedAt: createdAt,
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
function splitBroadComponent(candidates, maxCandidates) {
|
|
173
|
+
if (candidates.length <= maxCandidates) {
|
|
174
|
+
return [candidates];
|
|
175
|
+
}
|
|
176
|
+
const byArea = groupBy(candidates, (candidate) => primaryArea(candidate));
|
|
177
|
+
const areaGroups = [...byArea.values()].filter((group) => group.length >= 2);
|
|
178
|
+
const singletons = [...byArea.values()].filter((group) => group.length === 1).flat();
|
|
179
|
+
if (areaGroups.length > 1) {
|
|
180
|
+
return [...areaGroups, ...splitByCategory(singletons, maxCandidates)].filter((group) => group.length >= 2);
|
|
181
|
+
}
|
|
182
|
+
return splitByCategory(candidates, maxCandidates);
|
|
183
|
+
}
|
|
184
|
+
function splitByCategory(candidates, maxCandidates) {
|
|
185
|
+
if (candidates.length === 0) {
|
|
186
|
+
return [];
|
|
187
|
+
}
|
|
188
|
+
const byCategory = groupBy(candidates, (candidate) => candidate.category);
|
|
189
|
+
const groups = [...byCategory.values()];
|
|
190
|
+
if (groups.length === 1 && candidates.length > maxCandidates) {
|
|
191
|
+
return chunk(candidates, maxCandidates);
|
|
192
|
+
}
|
|
193
|
+
return groups;
|
|
194
|
+
}
|
|
195
|
+
function clusterWarnings(candidates, files, options) {
|
|
196
|
+
const warnings = [];
|
|
197
|
+
if (candidates.length > options.maxCandidates) {
|
|
198
|
+
warnings.push(`Theme has ${candidates.length} candidates, above the configured ${options.maxCandidates} candidate limit.`);
|
|
199
|
+
}
|
|
200
|
+
if (files.length > options.maxFiles) {
|
|
201
|
+
warnings.push(`Theme spans ${files.length} files, above the configured ${options.maxFiles} file limit.`);
|
|
202
|
+
}
|
|
203
|
+
return warnings;
|
|
204
|
+
}
|
|
205
|
+
function primaryArea(candidate) {
|
|
206
|
+
return mode(candidate.files.map((file) => moduleArea(file.path)), []) || candidate.category;
|
|
207
|
+
}
|
|
208
|
+
function codeGraphEdges(evidence) {
|
|
209
|
+
const graph = evidence.find((record) => record.kind === "code-graph-summary");
|
|
210
|
+
const rawEdges = graph?.data["edges"];
|
|
211
|
+
const edges = new Set();
|
|
212
|
+
if (!Array.isArray(rawEdges)) {
|
|
213
|
+
return edges;
|
|
214
|
+
}
|
|
215
|
+
for (const edge of rawEdges) {
|
|
216
|
+
if (!isObject(edge) || typeof edge["from"] !== "string" || typeof edge["to"] !== "string") {
|
|
217
|
+
continue;
|
|
218
|
+
}
|
|
219
|
+
edges.add(`${edge["from"]}->${edge["to"]}`);
|
|
220
|
+
edges.add(`${edge["to"]}->${edge["from"]}`);
|
|
221
|
+
}
|
|
222
|
+
return edges;
|
|
223
|
+
}
|
|
224
|
+
function hasCodeGraphLink(leftFiles, rightFiles, codeEdges) {
|
|
225
|
+
for (const left of leftFiles) {
|
|
226
|
+
for (const right of rightFiles) {
|
|
227
|
+
if (codeEdges.has(`${left}->${right}`)) {
|
|
228
|
+
return true;
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
return false;
|
|
233
|
+
}
|
|
234
|
+
function connectionReasonsFor(candidates, reasons) {
|
|
235
|
+
const values = [];
|
|
236
|
+
for (let leftIndex = 0; leftIndex < candidates.length; leftIndex += 1) {
|
|
237
|
+
for (let rightIndex = leftIndex + 1; rightIndex < candidates.length; rightIndex += 1) {
|
|
238
|
+
const left = candidates[leftIndex];
|
|
239
|
+
const right = candidates[rightIndex];
|
|
240
|
+
if (!left || !right) {
|
|
241
|
+
continue;
|
|
242
|
+
}
|
|
243
|
+
values.push(...(reasons.get(pairKey(left.id, right.id)) ?? []));
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
return unique(values);
|
|
247
|
+
}
|
|
248
|
+
function compareClusters(a, b) {
|
|
249
|
+
const priorityDelta = priorityScore[a.priority] - priorityScore[b.priority];
|
|
250
|
+
if (priorityDelta !== 0) {
|
|
251
|
+
return priorityDelta;
|
|
252
|
+
}
|
|
253
|
+
const impactDelta = impactScore[b.impact] - impactScore[a.impact];
|
|
254
|
+
if (impactDelta !== 0) {
|
|
255
|
+
return impactDelta;
|
|
256
|
+
}
|
|
257
|
+
return b.candidateIds.length - a.candidateIds.length;
|
|
258
|
+
}
|
|
259
|
+
function compareCandidates(a, b) {
|
|
260
|
+
const priorityDelta = priorityScore[a.priority] - priorityScore[b.priority];
|
|
261
|
+
if (priorityDelta !== 0) {
|
|
262
|
+
return priorityDelta;
|
|
263
|
+
}
|
|
264
|
+
return a.id.localeCompare(b.id);
|
|
265
|
+
}
|
|
266
|
+
function clusterTitle(category, focus, candidates) {
|
|
267
|
+
const label = category
|
|
268
|
+
.replace("-", " ")
|
|
269
|
+
.replace(/\b\w/g, (value) => value.toUpperCase());
|
|
270
|
+
if (focus !== ".") {
|
|
271
|
+
return `${label} cleanup around ${focus}`;
|
|
272
|
+
}
|
|
273
|
+
return `${label} cleanup theme: ${candidates[0]?.title ?? "related candidates"}`;
|
|
274
|
+
}
|
|
275
|
+
function clusterFocus(candidates, files) {
|
|
276
|
+
const specificAreas = files
|
|
277
|
+
.map((file) => moduleArea(file.path))
|
|
278
|
+
.filter((area) => area !== "." && area.split("/").length >= 3);
|
|
279
|
+
if (specificAreas.length > 0) {
|
|
280
|
+
return mode(specificAreas, []);
|
|
281
|
+
}
|
|
282
|
+
const fileCounts = new Map();
|
|
283
|
+
for (const candidate of candidates) {
|
|
284
|
+
for (const file of candidate.files) {
|
|
285
|
+
fileCounts.set(file.path, (fileCounts.get(file.path) ?? 0) + 1);
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
const commonFile = [...fileCounts.entries()].sort((a, b) => b[1] - a[1])[0];
|
|
289
|
+
if (commonFile && commonFile[1] >= 2) {
|
|
290
|
+
return commonFile[0];
|
|
291
|
+
}
|
|
292
|
+
return candidates[0]?.files[0]?.path ?? ".";
|
|
293
|
+
}
|
|
294
|
+
function aggregateStatus(candidates) {
|
|
295
|
+
if (candidates.some((candidate) => candidate.status === "open")) {
|
|
296
|
+
return "open";
|
|
297
|
+
}
|
|
298
|
+
return candidates[0]?.status ?? "open";
|
|
299
|
+
}
|
|
300
|
+
function uniqueFiles(files) {
|
|
301
|
+
const seen = new Set();
|
|
302
|
+
const result = [];
|
|
303
|
+
for (const file of files) {
|
|
304
|
+
const key = `${file.path}:${file.startLine ?? ""}:${file.endLine ?? ""}`;
|
|
305
|
+
if (seen.has(key)) {
|
|
306
|
+
continue;
|
|
307
|
+
}
|
|
308
|
+
seen.add(key);
|
|
309
|
+
result.push(file);
|
|
310
|
+
}
|
|
311
|
+
return result;
|
|
312
|
+
}
|
|
313
|
+
function moduleArea(filePath) {
|
|
314
|
+
const parts = filePath.split("/");
|
|
315
|
+
if (parts.includes("src")) {
|
|
316
|
+
const srcIndex = parts.indexOf("src");
|
|
317
|
+
return parts.slice(0, Math.min(parts.length - 1, srcIndex + 3)).join("/");
|
|
318
|
+
}
|
|
319
|
+
if (parts.length <= 1) {
|
|
320
|
+
return ".";
|
|
321
|
+
}
|
|
322
|
+
return parts.slice(0, Math.min(parts.length - 1, 2)).join("/");
|
|
323
|
+
}
|
|
324
|
+
function pairKey(left, right) {
|
|
325
|
+
return [left, right].sort().join("|");
|
|
326
|
+
}
|
|
327
|
+
function intersection(left, right) {
|
|
328
|
+
const rightSet = new Set(right);
|
|
329
|
+
return unique(left.filter((item) => rightSet.has(item)));
|
|
330
|
+
}
|
|
331
|
+
function tokens(value) {
|
|
332
|
+
return unique(value.toLowerCase().match(/[a-z][a-z0-9]{2,}/g) ?? [])
|
|
333
|
+
.filter((token) => ![
|
|
334
|
+
"the",
|
|
335
|
+
"and",
|
|
336
|
+
"with",
|
|
337
|
+
"from",
|
|
338
|
+
"into",
|
|
339
|
+
"around",
|
|
340
|
+
"candidate",
|
|
341
|
+
"large",
|
|
342
|
+
"source",
|
|
343
|
+
"file",
|
|
344
|
+
"function",
|
|
345
|
+
"nearby",
|
|
346
|
+
"test",
|
|
347
|
+
"discovered",
|
|
348
|
+
"cleanup",
|
|
349
|
+
].includes(token));
|
|
350
|
+
}
|
|
351
|
+
function unique(values) {
|
|
352
|
+
return [...new Set(values)];
|
|
353
|
+
}
|
|
354
|
+
function groupBy(values, keyFor) {
|
|
355
|
+
const groups = new Map();
|
|
356
|
+
for (const value of values) {
|
|
357
|
+
const key = keyFor(value);
|
|
358
|
+
const group = groups.get(key) ?? [];
|
|
359
|
+
group.push(value);
|
|
360
|
+
groups.set(key, group);
|
|
361
|
+
}
|
|
362
|
+
return groups;
|
|
363
|
+
}
|
|
364
|
+
function chunk(values, size) {
|
|
365
|
+
const chunks = [];
|
|
366
|
+
for (let index = 0; index < values.length; index += size) {
|
|
367
|
+
chunks.push(values.slice(index, index + size));
|
|
368
|
+
}
|
|
369
|
+
return chunks;
|
|
370
|
+
}
|
|
371
|
+
function mode(values, allowed) {
|
|
372
|
+
const allowedSet = allowed.length > 0 ? new Set(allowed) : undefined;
|
|
373
|
+
const counts = new Map();
|
|
374
|
+
for (const value of values) {
|
|
375
|
+
if (allowedSet && !allowedSet.has(value)) {
|
|
376
|
+
continue;
|
|
377
|
+
}
|
|
378
|
+
counts.set(value, (counts.get(value) ?? 0) + 1);
|
|
379
|
+
}
|
|
380
|
+
return [...counts.entries()].sort((a, b) => b[1] - a[1])[0]?.[0] ?? values[0] ?? ".";
|
|
381
|
+
}
|
|
382
|
+
function minBy(values, scores) {
|
|
383
|
+
const first = [...values].sort((a, b) => scores[a] - scores[b])[0];
|
|
384
|
+
if (!first) {
|
|
385
|
+
throw new Error("Cannot select minimum from empty values");
|
|
386
|
+
}
|
|
387
|
+
return first;
|
|
388
|
+
}
|
|
389
|
+
function maxBy(values, scores) {
|
|
390
|
+
const first = [...values].sort((a, b) => scores[b] - scores[a])[0];
|
|
391
|
+
if (!first) {
|
|
392
|
+
throw new Error("Cannot select maximum from empty values");
|
|
393
|
+
}
|
|
394
|
+
return first;
|
|
395
|
+
}
|
|
396
|
+
function isObject(value) {
|
|
397
|
+
return typeof value === "object" && value !== null;
|
|
398
|
+
}
|
|
399
|
+
//# sourceMappingURL=clusters.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clusters.js","sourceRoot":"","sources":["../src/clusters.ts"],"names":[],"mappings":"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"}
|
package/dist/defaults.js
ADDED
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { schemaVersion } from "./types.js";
|
|
2
|
+
export const stateDirName = ".deepclean";
|
|
3
|
+
export const defaultExcludeDirs = [
|
|
4
|
+
".git",
|
|
5
|
+
".deepclean",
|
|
6
|
+
".clawpatch",
|
|
7
|
+
".codex",
|
|
8
|
+
".claude",
|
|
9
|
+
".vercel",
|
|
10
|
+
".potato",
|
|
11
|
+
"node_modules",
|
|
12
|
+
"__pycache__",
|
|
13
|
+
".pytest_cache",
|
|
14
|
+
".mypy_cache",
|
|
15
|
+
".ruff_cache",
|
|
16
|
+
".venv",
|
|
17
|
+
"venv",
|
|
18
|
+
"dist",
|
|
19
|
+
"build",
|
|
20
|
+
"coverage",
|
|
21
|
+
"output",
|
|
22
|
+
".next",
|
|
23
|
+
".turbo",
|
|
24
|
+
".cache",
|
|
25
|
+
"vendor",
|
|
26
|
+
];
|
|
27
|
+
export const sourceExtensions = new Set([
|
|
28
|
+
".ts",
|
|
29
|
+
".tsx",
|
|
30
|
+
".js",
|
|
31
|
+
".jsx",
|
|
32
|
+
".mjs",
|
|
33
|
+
".cjs",
|
|
34
|
+
".mts",
|
|
35
|
+
".cts",
|
|
36
|
+
".py",
|
|
37
|
+
]);
|
|
38
|
+
export function defaultConfig() {
|
|
39
|
+
return {
|
|
40
|
+
schemaVersion,
|
|
41
|
+
recordType: "config",
|
|
42
|
+
enabledAdapters: [
|
|
43
|
+
"file-metrics",
|
|
44
|
+
"line-window-duplication",
|
|
45
|
+
"semgrep",
|
|
46
|
+
"sarif-ingest",
|
|
47
|
+
"code-graph",
|
|
48
|
+
"import-graph",
|
|
49
|
+
"typescript-structure",
|
|
50
|
+
"git-history",
|
|
51
|
+
"test-discovery",
|
|
52
|
+
],
|
|
53
|
+
exclude: defaultExcludeDirs,
|
|
54
|
+
reviewSynthesis: {
|
|
55
|
+
enabled: false,
|
|
56
|
+
provider: "codex",
|
|
57
|
+
command: "codex",
|
|
58
|
+
timeoutMs: 120_000,
|
|
59
|
+
maxCandidates: 8,
|
|
60
|
+
},
|
|
61
|
+
candidateCaps: {
|
|
62
|
+
byKind: {
|
|
63
|
+
"duplicate-cluster": 16,
|
|
64
|
+
"external-duplicate": 16,
|
|
65
|
+
"sarif-finding": 24,
|
|
66
|
+
"dependency-hotspot": 24,
|
|
67
|
+
"large-function": 24,
|
|
68
|
+
"large-file": 24,
|
|
69
|
+
"test-gap": 24,
|
|
70
|
+
"churn-hotspot": 12,
|
|
71
|
+
"shallow-wrapper-cluster": 16,
|
|
72
|
+
},
|
|
73
|
+
byKindAndArea: {
|
|
74
|
+
"duplicate-cluster": 4,
|
|
75
|
+
"external-duplicate": 4,
|
|
76
|
+
"sarif-finding": 8,
|
|
77
|
+
"dependency-hotspot": 8,
|
|
78
|
+
"large-function": 8,
|
|
79
|
+
"large-file": 8,
|
|
80
|
+
"test-gap": 8,
|
|
81
|
+
},
|
|
82
|
+
},
|
|
83
|
+
clusters: {
|
|
84
|
+
maxCandidates: 12,
|
|
85
|
+
maxFiles: 18,
|
|
86
|
+
splitBroad: true,
|
|
87
|
+
},
|
|
88
|
+
reviewers: {
|
|
89
|
+
enabled: [
|
|
90
|
+
"architecture-deepening",
|
|
91
|
+
"deep-module-discipline",
|
|
92
|
+
"duplication-consolidation",
|
|
93
|
+
"dependency-graph",
|
|
94
|
+
"testability",
|
|
95
|
+
"feedback-loop-discipline",
|
|
96
|
+
"domain-language",
|
|
97
|
+
"agent-ready-slices",
|
|
98
|
+
"ai-slop-patterns",
|
|
99
|
+
"critic-pass",
|
|
100
|
+
],
|
|
101
|
+
customPaths: [],
|
|
102
|
+
},
|
|
103
|
+
externalAnalyzers: {
|
|
104
|
+
jscpd: {
|
|
105
|
+
enabled: false,
|
|
106
|
+
command: "jscpd",
|
|
107
|
+
minTokens: 80,
|
|
108
|
+
maxFindings: 20,
|
|
109
|
+
},
|
|
110
|
+
semgrep: {
|
|
111
|
+
enabled: false,
|
|
112
|
+
command: "semgrep",
|
|
113
|
+
config: "auto",
|
|
114
|
+
timeoutMs: 120_000,
|
|
115
|
+
maxFindings: 80,
|
|
116
|
+
},
|
|
117
|
+
sarifPaths: [
|
|
118
|
+
"semgrep.sarif",
|
|
119
|
+
"semgrep-results.sarif",
|
|
120
|
+
".semgrep/semgrep.sarif",
|
|
121
|
+
".deepclean/input/semgrep.sarif",
|
|
122
|
+
],
|
|
123
|
+
},
|
|
124
|
+
privacy: {
|
|
125
|
+
allowSourceInModel: false,
|
|
126
|
+
allowWebResearch: false,
|
|
127
|
+
},
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=defaults.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"defaults.js","sourceRoot":"","sources":["../src/defaults.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwB,aAAa,EAAE,MAAM,YAAY,CAAC;AAEjE,MAAM,CAAC,MAAM,YAAY,GAAG,YAAY,CAAC;AAEzC,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,MAAM;IACN,YAAY;IACZ,YAAY;IACZ,QAAQ;IACR,SAAS;IACT,SAAS;IACT,SAAS;IACT,cAAc;IACd,aAAa;IACb,eAAe;IACf,aAAa;IACb,aAAa;IACb,OAAO;IACP,MAAM;IACN,MAAM;IACN,OAAO;IACP,UAAU;IACV,QAAQ;IACR,OAAO;IACP,QAAQ;IACR,QAAQ;IACR,QAAQ;CACT,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC;IACtC,KAAK;IACL,MAAM;IACN,KAAK;IACL,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,KAAK;CACN,CAAC,CAAC;AAEH,MAAM,UAAU,aAAa;IAC3B,OAAO;QACL,aAAa;QACb,UAAU,EAAE,QAAQ;QACpB,eAAe,EAAE;YACf,cAAc;YACd,yBAAyB;YACzB,SAAS;YACT,cAAc;YACd,YAAY;YACZ,cAAc;YACd,sBAAsB;YACtB,aAAa;YACb,gBAAgB;SACjB;QACD,OAAO,EAAE,kBAAkB;QAC3B,eAAe,EAAE;YACf,OAAO,EAAE,KAAK;YACd,QAAQ,EAAE,OAAO;YACjB,OAAO,EAAE,OAAO;YAChB,SAAS,EAAE,OAAO;YAClB,aAAa,EAAE,CAAC;SACjB;QACD,aAAa,EAAE;YACb,MAAM,EAAE;gBACN,mBAAmB,EAAE,EAAE;gBACvB,oBAAoB,EAAE,EAAE;gBACxB,eAAe,EAAE,EAAE;gBACnB,oBAAoB,EAAE,EAAE;gBACxB,gBAAgB,EAAE,EAAE;gBACpB,YAAY,EAAE,EAAE;gBAChB,UAAU,EAAE,EAAE;gBACd,eAAe,EAAE,EAAE;gBACnB,yBAAyB,EAAE,EAAE;aAC9B;YACD,aAAa,EAAE;gBACb,mBAAmB,EAAE,CAAC;gBACtB,oBAAoB,EAAE,CAAC;gBACvB,eAAe,EAAE,CAAC;gBAClB,oBAAoB,EAAE,CAAC;gBACvB,gBAAgB,EAAE,CAAC;gBACnB,YAAY,EAAE,CAAC;gBACf,UAAU,EAAE,CAAC;aACd;SACF;QACD,QAAQ,EAAE;YACR,aAAa,EAAE,EAAE;YACjB,QAAQ,EAAE,EAAE;YACZ,UAAU,EAAE,IAAI;SACjB;QACD,SAAS,EAAE;YACT,OAAO,EAAE;gBACP,wBAAwB;gBACxB,wBAAwB;gBACxB,2BAA2B;gBAC3B,kBAAkB;gBAClB,aAAa;gBACb,0BAA0B;gBAC1B,iBAAiB;gBACjB,oBAAoB;gBACpB,kBAAkB;gBAClB,aAAa;aACd;YACD,WAAW,EAAE,EAAE;SAChB;QACD,iBAAiB,EAAE;YACjB,KAAK,EAAE;gBACL,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,OAAO;gBAChB,SAAS,EAAE,EAAE;gBACb,WAAW,EAAE,EAAE;aAChB;YACD,OAAO,EAAE;gBACP,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,SAAS;gBAClB,MAAM,EAAE,MAAM;gBACd,SAAS,EAAE,OAAO;gBAClB,WAAW,EAAE,EAAE;aAChB;YACD,UAAU,EAAE;gBACV,eAAe;gBACf,uBAAuB;gBACvB,wBAAwB;gBACxB,gCAAgC;aACjC;SACF;QACD,OAAO,EAAE;YACP,kBAAkB,EAAE,KAAK;YACzB,gBAAgB,EAAE,KAAK;SACxB;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export interface SourceFile {
|
|
2
|
+
path: string;
|
|
3
|
+
absolutePath: string;
|
|
4
|
+
extension: string;
|
|
5
|
+
text: string;
|
|
6
|
+
lines: string[];
|
|
7
|
+
}
|
|
8
|
+
export declare function discoverSourceFiles(root: string, excludes: string[]): Promise<SourceFile[]>;
|
|
9
|
+
export declare function normalizePath(value: string): string;
|
|
10
|
+
export declare function isTestPath(filePath: string): boolean;
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { readdir, readFile } from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { sourceExtensions } from "./defaults.js";
|
|
4
|
+
export async function discoverSourceFiles(root, excludes) {
|
|
5
|
+
const files = [];
|
|
6
|
+
const excludeSet = new Set(excludes);
|
|
7
|
+
async function walk(dir) {
|
|
8
|
+
const entries = await readdir(dir, { withFileTypes: true });
|
|
9
|
+
for (const entry of entries) {
|
|
10
|
+
if (excludeSet.has(entry.name)) {
|
|
11
|
+
continue;
|
|
12
|
+
}
|
|
13
|
+
const absolutePath = path.join(dir, entry.name);
|
|
14
|
+
if (entry.isDirectory()) {
|
|
15
|
+
await walk(absolutePath);
|
|
16
|
+
continue;
|
|
17
|
+
}
|
|
18
|
+
if (!entry.isFile()) {
|
|
19
|
+
continue;
|
|
20
|
+
}
|
|
21
|
+
const extension = path.extname(entry.name);
|
|
22
|
+
if (!sourceExtensions.has(extension)) {
|
|
23
|
+
continue;
|
|
24
|
+
}
|
|
25
|
+
const text = await readFile(absolutePath, "utf8");
|
|
26
|
+
const relativePath = path.relative(root, absolutePath);
|
|
27
|
+
files.push({
|
|
28
|
+
path: normalizePath(relativePath),
|
|
29
|
+
absolutePath,
|
|
30
|
+
extension,
|
|
31
|
+
text,
|
|
32
|
+
lines: text.split(/\r?\n/),
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
await walk(root);
|
|
37
|
+
return files.sort((a, b) => a.path.localeCompare(b.path));
|
|
38
|
+
}
|
|
39
|
+
export function normalizePath(value) {
|
|
40
|
+
return value.split(path.sep).join("/");
|
|
41
|
+
}
|
|
42
|
+
export function isTestPath(filePath) {
|
|
43
|
+
return /(^|\/)(__tests__|test|tests|spec)\//.test(filePath)
|
|
44
|
+
|| /\.(test|spec)\.[cm]?[jt]sx?$/.test(filePath)
|
|
45
|
+
|| /(^|\/)test_[^/]+\.py$/.test(filePath)
|
|
46
|
+
|| /(^|\/)[^/]+_(test|tests)\.py$/.test(filePath);
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=discovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discovery.js","sourceRoot":"","sources":["../src/discovery.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAUjD,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,IAAY,EACZ,QAAkB;IAElB,MAAM,KAAK,GAAiB,EAAE,CAAC;IAC/B,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC;IAErC,KAAK,UAAU,IAAI,CAAC,GAAW;QAC7B,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5D,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC/B,SAAS;YACX,CAAC;YACD,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YAChD,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBACxB,MAAM,IAAI,CAAC,YAAY,CAAC,CAAC;gBACzB,SAAS;YACX,CAAC;YACD,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;gBACpB,SAAS;YACX,CAAC;YACD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC3C,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;gBACrC,SAAS;YACX,CAAC;YACD,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;YAClD,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;YACvD,KAAK,CAAC,IAAI,CAAC;gBACT,IAAI,EAAE,aAAa,CAAC,YAAY,CAAC;gBACjC,YAAY;gBACZ,SAAS;gBACT,IAAI;gBACJ,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;aAC3B,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC;IACjB,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AAC5D,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,OAAO,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,QAAgB;IACzC,OAAO,qCAAqC,CAAC,IAAI,CAAC,QAAQ,CAAC;WACtD,8BAA8B,CAAC,IAAI,CAAC,QAAQ,CAAC;WAC7C,uBAAuB,CAAC,IAAI,CAAC,QAAQ,CAAC;WACtC,+BAA+B,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AACtD,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { type SourceFile } from "./discovery.js";
|
|
2
|
+
import { type DeepcleanConfig, type Diagnostic, type EvidenceRecord } from "./types.js";
|
|
3
|
+
export interface AdapterContext {
|
|
4
|
+
root: string;
|
|
5
|
+
runId: string;
|
|
6
|
+
createdAt: string;
|
|
7
|
+
files: SourceFile[];
|
|
8
|
+
config: DeepcleanConfig;
|
|
9
|
+
}
|
|
10
|
+
export interface AdapterResult {
|
|
11
|
+
evidence: EvidenceRecord[];
|
|
12
|
+
diagnostics: Diagnostic[];
|
|
13
|
+
}
|
|
14
|
+
export type EvidenceAdapter = (context: AdapterContext) => Promise<AdapterResult>;
|
|
15
|
+
export declare const evidenceAdapters: Record<string, EvidenceAdapter>;
|
|
16
|
+
export declare function runEvidenceAdapters(enabledAdapters: string[], context: AdapterContext): Promise<AdapterResult>;
|