@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.
Files changed (56) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/LICENSE +21 -0
  3. package/README.md +171 -0
  4. package/dist/args.d.ts +9 -0
  5. package/dist/args.js +105 -0
  6. package/dist/args.js.map +1 -0
  7. package/dist/candidates.d.ts +6 -0
  8. package/dist/candidates.js +319 -0
  9. package/dist/candidates.js.map +1 -0
  10. package/dist/cli.d.ts +2 -0
  11. package/dist/cli.js +521 -0
  12. package/dist/cli.js.map +1 -0
  13. package/dist/clusters.d.ts +7 -0
  14. package/dist/clusters.js +399 -0
  15. package/dist/clusters.js.map +1 -0
  16. package/dist/defaults.d.ts +5 -0
  17. package/dist/defaults.js +130 -0
  18. package/dist/defaults.js.map +1 -0
  19. package/dist/discovery.d.ts +10 -0
  20. package/dist/discovery.js +48 -0
  21. package/dist/discovery.js.map +1 -0
  22. package/dist/evidence.d.ts +16 -0
  23. package/dist/evidence.js +853 -0
  24. package/dist/evidence.js.map +1 -0
  25. package/dist/ids.d.ts +4 -0
  26. package/dist/ids.js +16 -0
  27. package/dist/ids.js.map +1 -0
  28. package/dist/json.d.ts +3 -0
  29. package/dist/json.js +12 -0
  30. package/dist/json.js.map +1 -0
  31. package/dist/plans.d.ts +3 -0
  32. package/dist/plans.js +171 -0
  33. package/dist/plans.js.map +1 -0
  34. package/dist/reporting.d.ts +13 -0
  35. package/dist/reporting.js +227 -0
  36. package/dist/reporting.js.map +1 -0
  37. package/dist/reviewers.d.ts +22 -0
  38. package/dist/reviewers.js +461 -0
  39. package/dist/reviewers.js.map +1 -0
  40. package/dist/state.d.ts +41 -0
  41. package/dist/state.js +211 -0
  42. package/dist/state.js.map +1 -0
  43. package/dist/synthesis.d.ts +17 -0
  44. package/dist/synthesis.js +396 -0
  45. package/dist/synthesis.js.map +1 -0
  46. package/dist/types.d.ts +389 -0
  47. package/dist/types.js +236 -0
  48. package/dist/types.js.map +1 -0
  49. package/dist/verification.d.ts +11 -0
  50. package/dist/verification.js +111 -0
  51. package/dist/verification.js.map +1 -0
  52. package/docs/privacy-and-trust.md +33 -0
  53. package/docs/public-readiness.md +19 -0
  54. package/docs/reviewer-references.md +33 -0
  55. package/docs/troubleshooting.md +80 -0
  56. package/package.json +55 -0
@@ -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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"}
@@ -0,0 +1,5 @@
1
+ import { type DeepcleanConfig } from "./types.js";
2
+ export declare const stateDirName = ".deepclean";
3
+ export declare const defaultExcludeDirs: string[];
4
+ export declare const sourceExtensions: Set<string>;
5
+ export declare function defaultConfig(): DeepcleanConfig;
@@ -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>;