@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/state.js
ADDED
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
import { mkdir, readFile, readdir, writeFile } from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { defaultConfig, stateDirName } from "./defaults.js";
|
|
4
|
+
import { candidateRecordSchema, clusterRecordSchema, configSchema, evidenceRecordSchema, handoffRecordSchema, planRecordSchema, reportRecordSchema, runRecordSchema, triageRecordSchema, } from "./types.js";
|
|
5
|
+
export function resolveStatePaths(options) {
|
|
6
|
+
const root = path.resolve(options.cwd, options.root ?? ".");
|
|
7
|
+
const stateDir = path.resolve(root, options.stateDir ?? stateDirName);
|
|
8
|
+
return {
|
|
9
|
+
root,
|
|
10
|
+
stateDir,
|
|
11
|
+
configPath: path.resolve(root, options.config ?? path.join(stateDir, "config.json")),
|
|
12
|
+
runsDir: path.join(stateDir, "runs"),
|
|
13
|
+
evidenceDir: path.join(stateDir, "evidence"),
|
|
14
|
+
candidatesDir: path.join(stateDir, "candidates"),
|
|
15
|
+
clustersDir: path.join(stateDir, "clusters"),
|
|
16
|
+
reportsDir: path.join(stateDir, "reports"),
|
|
17
|
+
triageDir: path.join(stateDir, "triage"),
|
|
18
|
+
handoffsDir: path.join(stateDir, "handoffs"),
|
|
19
|
+
plansDir: path.join(stateDir, "plans"),
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
export async function ensureState(paths) {
|
|
23
|
+
await Promise.all([
|
|
24
|
+
mkdir(paths.runsDir, { recursive: true }),
|
|
25
|
+
mkdir(paths.evidenceDir, { recursive: true }),
|
|
26
|
+
mkdir(paths.candidatesDir, { recursive: true }),
|
|
27
|
+
mkdir(paths.clustersDir, { recursive: true }),
|
|
28
|
+
mkdir(paths.reportsDir, { recursive: true }),
|
|
29
|
+
mkdir(paths.triageDir, { recursive: true }),
|
|
30
|
+
mkdir(paths.handoffsDir, { recursive: true }),
|
|
31
|
+
mkdir(paths.plansDir, { recursive: true }),
|
|
32
|
+
]);
|
|
33
|
+
try {
|
|
34
|
+
return await readConfig(paths);
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
const config = defaultConfig();
|
|
38
|
+
await writeJson(paths.configPath, config);
|
|
39
|
+
return config;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
export async function readConfig(paths) {
|
|
43
|
+
const raw = await readFile(paths.configPath, "utf8");
|
|
44
|
+
const parsed = JSON.parse(raw);
|
|
45
|
+
return configSchema.parse(mergeConfig(defaultConfig(), parsed));
|
|
46
|
+
}
|
|
47
|
+
export async function writeRun(paths, run) {
|
|
48
|
+
runRecordSchema.parse(run);
|
|
49
|
+
const filePath = path.join(paths.runsDir, `${run.id}.json`);
|
|
50
|
+
await writeJson(filePath, run);
|
|
51
|
+
return filePath;
|
|
52
|
+
}
|
|
53
|
+
export async function writeEvidence(paths, runId, records) {
|
|
54
|
+
for (const record of records) {
|
|
55
|
+
evidenceRecordSchema.parse(record);
|
|
56
|
+
}
|
|
57
|
+
const filePath = path.join(paths.evidenceDir, `${runId}.json`);
|
|
58
|
+
await writeJson(filePath, records);
|
|
59
|
+
return filePath;
|
|
60
|
+
}
|
|
61
|
+
export async function writeCandidates(paths, runId, records) {
|
|
62
|
+
for (const record of records) {
|
|
63
|
+
candidateRecordSchema.parse(record);
|
|
64
|
+
}
|
|
65
|
+
const filePath = path.join(paths.candidatesDir, `${runId}.json`);
|
|
66
|
+
await writeJson(filePath, records);
|
|
67
|
+
return filePath;
|
|
68
|
+
}
|
|
69
|
+
export async function writeReport(paths, report, markdown) {
|
|
70
|
+
reportRecordSchema.parse(report);
|
|
71
|
+
const jsonPath = path.join(paths.reportsDir, `${report.id}.json`);
|
|
72
|
+
const markdownPath = path.join(paths.reportsDir, `${report.id}.md`);
|
|
73
|
+
await writeJson(jsonPath, report);
|
|
74
|
+
await writeFile(markdownPath, markdown, "utf8");
|
|
75
|
+
return { jsonPath, markdownPath };
|
|
76
|
+
}
|
|
77
|
+
export async function writeClusters(paths, runId, records) {
|
|
78
|
+
for (const record of records) {
|
|
79
|
+
clusterRecordSchema.parse(record);
|
|
80
|
+
}
|
|
81
|
+
const filePath = path.join(paths.clustersDir, `${runId}.json`);
|
|
82
|
+
await writeJson(filePath, records);
|
|
83
|
+
return filePath;
|
|
84
|
+
}
|
|
85
|
+
export async function writeTriage(paths, triage) {
|
|
86
|
+
triageRecordSchema.parse(triage);
|
|
87
|
+
const filePath = path.join(paths.triageDir, `${triage.id}.json`);
|
|
88
|
+
await writeJson(filePath, triage);
|
|
89
|
+
return filePath;
|
|
90
|
+
}
|
|
91
|
+
export async function writeHandoff(paths, handoff) {
|
|
92
|
+
handoffRecordSchema.parse(handoff);
|
|
93
|
+
const filePath = path.join(paths.handoffsDir, `${handoff.id}.json`);
|
|
94
|
+
await writeJson(filePath, handoff);
|
|
95
|
+
return filePath;
|
|
96
|
+
}
|
|
97
|
+
export async function writePlan(paths, plan) {
|
|
98
|
+
planRecordSchema.parse(plan);
|
|
99
|
+
const filePath = path.join(paths.plansDir, `${plan.id}.json`);
|
|
100
|
+
await writeJson(filePath, plan);
|
|
101
|
+
return filePath;
|
|
102
|
+
}
|
|
103
|
+
export async function latestRunId(paths) {
|
|
104
|
+
const files = await jsonFiles(paths.runsDir);
|
|
105
|
+
return files.at(-1)?.replace(/\.json$/, "");
|
|
106
|
+
}
|
|
107
|
+
export async function readLatestCandidates(paths) {
|
|
108
|
+
const runId = await latestRunId(paths);
|
|
109
|
+
if (!runId) {
|
|
110
|
+
return [];
|
|
111
|
+
}
|
|
112
|
+
return readCandidates(paths, runId);
|
|
113
|
+
}
|
|
114
|
+
export async function readLatestClusters(paths) {
|
|
115
|
+
const runId = await latestRunId(paths);
|
|
116
|
+
if (!runId) {
|
|
117
|
+
return [];
|
|
118
|
+
}
|
|
119
|
+
return readClusters(paths, runId);
|
|
120
|
+
}
|
|
121
|
+
export async function readLatestEvidence(paths) {
|
|
122
|
+
const runId = await latestRunId(paths);
|
|
123
|
+
if (!runId) {
|
|
124
|
+
return [];
|
|
125
|
+
}
|
|
126
|
+
return readEvidence(paths, runId);
|
|
127
|
+
}
|
|
128
|
+
export async function readClusters(paths, runId) {
|
|
129
|
+
try {
|
|
130
|
+
const raw = await readFile(path.join(paths.clustersDir, `${runId}.json`), "utf8");
|
|
131
|
+
const parsed = JSON.parse(raw);
|
|
132
|
+
return parsed.map((item) => clusterRecordSchema.parse(item));
|
|
133
|
+
}
|
|
134
|
+
catch {
|
|
135
|
+
return [];
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
export async function readCandidates(paths, runId) {
|
|
139
|
+
const raw = await readFile(path.join(paths.candidatesDir, `${runId}.json`), "utf8");
|
|
140
|
+
const parsed = JSON.parse(raw);
|
|
141
|
+
return parsed.map((item) => candidateRecordSchema.parse(item));
|
|
142
|
+
}
|
|
143
|
+
export async function readEvidence(paths, runId) {
|
|
144
|
+
const raw = await readFile(path.join(paths.evidenceDir, `${runId}.json`), "utf8");
|
|
145
|
+
const parsed = JSON.parse(raw);
|
|
146
|
+
return parsed.map((item) => evidenceRecordSchema.parse(item));
|
|
147
|
+
}
|
|
148
|
+
export async function updateLatestCandidates(paths, candidates) {
|
|
149
|
+
const runId = await latestRunId(paths);
|
|
150
|
+
if (!runId) {
|
|
151
|
+
throw new Error("No scan run exists yet");
|
|
152
|
+
}
|
|
153
|
+
return writeCandidates(paths, runId, candidates);
|
|
154
|
+
}
|
|
155
|
+
async function jsonFiles(dir) {
|
|
156
|
+
try {
|
|
157
|
+
const files = await readdir(dir);
|
|
158
|
+
return files.filter((file) => file.endsWith(".json")).sort();
|
|
159
|
+
}
|
|
160
|
+
catch {
|
|
161
|
+
return [];
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
async function writeJson(filePath, value) {
|
|
165
|
+
await mkdir(path.dirname(filePath), { recursive: true });
|
|
166
|
+
await writeFile(filePath, `${JSON.stringify(value, null, 2)}\n`, "utf8");
|
|
167
|
+
}
|
|
168
|
+
function mergeConfig(defaults, value) {
|
|
169
|
+
return {
|
|
170
|
+
...defaults,
|
|
171
|
+
...value,
|
|
172
|
+
reviewSynthesis: {
|
|
173
|
+
...defaults.reviewSynthesis,
|
|
174
|
+
...value.reviewSynthesis,
|
|
175
|
+
},
|
|
176
|
+
candidateCaps: {
|
|
177
|
+
byKind: {
|
|
178
|
+
...defaults.candidateCaps.byKind,
|
|
179
|
+
...value.candidateCaps?.byKind,
|
|
180
|
+
},
|
|
181
|
+
byKindAndArea: {
|
|
182
|
+
...defaults.candidateCaps.byKindAndArea,
|
|
183
|
+
...value.candidateCaps?.byKindAndArea,
|
|
184
|
+
},
|
|
185
|
+
},
|
|
186
|
+
clusters: {
|
|
187
|
+
...defaults.clusters,
|
|
188
|
+
...value.clusters,
|
|
189
|
+
},
|
|
190
|
+
reviewers: {
|
|
191
|
+
...defaults.reviewers,
|
|
192
|
+
...value.reviewers,
|
|
193
|
+
},
|
|
194
|
+
externalAnalyzers: {
|
|
195
|
+
jscpd: {
|
|
196
|
+
...defaults.externalAnalyzers.jscpd,
|
|
197
|
+
...value.externalAnalyzers?.jscpd,
|
|
198
|
+
},
|
|
199
|
+
semgrep: {
|
|
200
|
+
...defaults.externalAnalyzers.semgrep,
|
|
201
|
+
...value.externalAnalyzers?.semgrep,
|
|
202
|
+
},
|
|
203
|
+
sarifPaths: value.externalAnalyzers?.sarifPaths ?? defaults.externalAnalyzers.sarifPaths,
|
|
204
|
+
},
|
|
205
|
+
privacy: {
|
|
206
|
+
...defaults.privacy,
|
|
207
|
+
...value.privacy,
|
|
208
|
+
},
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
//# sourceMappingURL=state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.js","sourceRoot":"","sources":["../src/state.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { type VerificationProfile } from "./verification.js";
|
|
2
|
+
import { type CandidateRecord, type DeepcleanConfig, type Diagnostic, type EvidenceRecord } from "./types.js";
|
|
3
|
+
export interface SynthesisResult {
|
|
4
|
+
candidates: CandidateRecord[];
|
|
5
|
+
diagnostics: Diagnostic[];
|
|
6
|
+
}
|
|
7
|
+
export declare function synthesizeWithCodex(options: {
|
|
8
|
+
root: string;
|
|
9
|
+
runId: string;
|
|
10
|
+
createdAt: string;
|
|
11
|
+
evidence: EvidenceRecord[];
|
|
12
|
+
config: DeepcleanConfig;
|
|
13
|
+
existingCandidates: CandidateRecord[];
|
|
14
|
+
includeSource: boolean;
|
|
15
|
+
model?: string | undefined;
|
|
16
|
+
verificationProfile?: VerificationProfile | undefined;
|
|
17
|
+
}): Promise<SynthesisResult>;
|
|
@@ -0,0 +1,396 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { mkdtemp, readFile, rm, writeFile } from "node:fs/promises";
|
|
3
|
+
import os from "node:os";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
import { z } from "zod";
|
|
6
|
+
import { candidateId } from "./ids.js";
|
|
7
|
+
import { buildCleanupSurfaces, reviewerRubrics } from "./reviewers.js";
|
|
8
|
+
import { commandsForFiles, mergeVerificationCommands } from "./verification.js";
|
|
9
|
+
import { candidateCategories, confidenceLevels, effortLevels, impactLevels, priorities, riskLevels, schemaVersion, } from "./types.js";
|
|
10
|
+
const promptVersion = "codex-synthesis-v3-matt-pocock-reviewers";
|
|
11
|
+
const synthesisOutputSchema = z.object({
|
|
12
|
+
candidates: z.array(z.object({
|
|
13
|
+
title: z.string().min(1),
|
|
14
|
+
category: z.enum(candidateCategories),
|
|
15
|
+
priority: z.enum(priorities),
|
|
16
|
+
confidence: z.enum(confidenceLevels),
|
|
17
|
+
impact: z.enum(impactLevels),
|
|
18
|
+
effort: z.enum(effortLevels),
|
|
19
|
+
risk: z.enum(riskLevels),
|
|
20
|
+
files: z.array(z.object({
|
|
21
|
+
path: z.string(),
|
|
22
|
+
startLine: z.number().int().positive().optional(),
|
|
23
|
+
endLine: z.number().int().positive().optional(),
|
|
24
|
+
})),
|
|
25
|
+
evidenceIds: z.array(z.string()).min(1),
|
|
26
|
+
whyItMatters: z.string().min(1),
|
|
27
|
+
likelyRootCause: z.string().min(1),
|
|
28
|
+
suggestedDirection: z.string().min(1),
|
|
29
|
+
verification: z.array(z.string()).min(1),
|
|
30
|
+
})),
|
|
31
|
+
rejectedEvidenceIds: z.array(z.string()).default([]),
|
|
32
|
+
notes: z.array(z.string()).default([]),
|
|
33
|
+
});
|
|
34
|
+
export async function synthesizeWithCodex(options) {
|
|
35
|
+
const diagnostics = [];
|
|
36
|
+
const tempDir = await mkdtemp(path.join(os.tmpdir(), "deepclean-codex-"));
|
|
37
|
+
const outputPath = path.join(tempDir, "codex-output.json");
|
|
38
|
+
const schemaPath = path.join(tempDir, "synthesis.schema.json");
|
|
39
|
+
try {
|
|
40
|
+
await writeFile(schemaPath, JSON.stringify(jsonSchema(), null, 2), "utf8");
|
|
41
|
+
const reviewerPack = await resolveReviewerPack(options.root, options.config);
|
|
42
|
+
diagnostics.push(...reviewerPack.diagnostics);
|
|
43
|
+
const prompt = buildPrompt(options, reviewerPack.rubrics);
|
|
44
|
+
const args = [
|
|
45
|
+
"exec",
|
|
46
|
+
"-C",
|
|
47
|
+
options.root,
|
|
48
|
+
"-s",
|
|
49
|
+
"read-only",
|
|
50
|
+
"--skip-git-repo-check",
|
|
51
|
+
"--output-schema",
|
|
52
|
+
schemaPath,
|
|
53
|
+
"-o",
|
|
54
|
+
outputPath,
|
|
55
|
+
];
|
|
56
|
+
const model = options.model ?? options.config.reviewSynthesis.model;
|
|
57
|
+
if (model) {
|
|
58
|
+
args.push("-m", model);
|
|
59
|
+
}
|
|
60
|
+
args.push("-");
|
|
61
|
+
const result = await runProcess(options.config.reviewSynthesis.command, args, prompt, options.config.reviewSynthesis.timeoutMs);
|
|
62
|
+
if (result.exitCode !== 0) {
|
|
63
|
+
return {
|
|
64
|
+
candidates: [],
|
|
65
|
+
diagnostics: [{
|
|
66
|
+
level: "warning",
|
|
67
|
+
code: result.timedOut ? "codex_synthesis_timeout" : "codex_synthesis_failed",
|
|
68
|
+
message: codexFailureMessage(result),
|
|
69
|
+
adapter: "codex-synthesis",
|
|
70
|
+
}, ...diagnostics],
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
const raw = await readFile(outputPath, "utf8");
|
|
74
|
+
const parsed = parseSynthesisOutput(raw);
|
|
75
|
+
const evidenceIds = new Set(options.evidence.map((item) => item.id));
|
|
76
|
+
const maxCandidates = options.config.reviewSynthesis.maxCandidates;
|
|
77
|
+
const candidates = [];
|
|
78
|
+
for (const draft of parsed.candidates.slice(0, maxCandidates)) {
|
|
79
|
+
const supportedIds = draft.evidenceIds.filter((id) => evidenceIds.has(id));
|
|
80
|
+
if (supportedIds.length === 0) {
|
|
81
|
+
diagnostics.push({
|
|
82
|
+
level: "warning",
|
|
83
|
+
code: "synthesis_candidate_without_evidence",
|
|
84
|
+
message: `Rejected model candidate without valid evidence IDs: ${draft.title}`,
|
|
85
|
+
adapter: "codex-synthesis",
|
|
86
|
+
});
|
|
87
|
+
continue;
|
|
88
|
+
}
|
|
89
|
+
const verification = commandsForFiles(options.verificationProfile ?? {
|
|
90
|
+
defaultCommands: [],
|
|
91
|
+
pythonCommands: [],
|
|
92
|
+
frontendCommands: [],
|
|
93
|
+
adminCommands: [],
|
|
94
|
+
}, draft.files, draft.verification);
|
|
95
|
+
candidates.push({
|
|
96
|
+
schemaVersion,
|
|
97
|
+
recordType: "candidate",
|
|
98
|
+
id: candidateId(options.existingCandidates.length + candidates.length),
|
|
99
|
+
runId: options.runId,
|
|
100
|
+
title: draft.title,
|
|
101
|
+
category: draft.category,
|
|
102
|
+
status: "open",
|
|
103
|
+
priority: draft.priority,
|
|
104
|
+
confidence: draft.confidence,
|
|
105
|
+
impact: draft.impact,
|
|
106
|
+
effort: draft.effort,
|
|
107
|
+
risk: draft.risk,
|
|
108
|
+
files: draft.files,
|
|
109
|
+
evidenceIds: supportedIds,
|
|
110
|
+
whyItMatters: draft.whyItMatters,
|
|
111
|
+
likelyRootCause: draft.likelyRootCause,
|
|
112
|
+
suggestedDirection: draft.suggestedDirection,
|
|
113
|
+
verification: mergeVerificationCommands(verification, draft.verification),
|
|
114
|
+
provenance: {
|
|
115
|
+
source: "model-synthesis",
|
|
116
|
+
provider: "codex",
|
|
117
|
+
model,
|
|
118
|
+
promptVersion,
|
|
119
|
+
reviewers: reviewerPack.rubrics.map((rubric) => rubric.id),
|
|
120
|
+
},
|
|
121
|
+
createdAt: options.createdAt,
|
|
122
|
+
updatedAt: options.createdAt,
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
if (parsed.notes.length > 0) {
|
|
126
|
+
diagnostics.push(...parsed.notes.map((note) => ({
|
|
127
|
+
level: "info",
|
|
128
|
+
code: "codex_synthesis_note",
|
|
129
|
+
message: note,
|
|
130
|
+
adapter: "codex-synthesis",
|
|
131
|
+
})));
|
|
132
|
+
}
|
|
133
|
+
return { candidates, diagnostics };
|
|
134
|
+
}
|
|
135
|
+
catch (error) {
|
|
136
|
+
return {
|
|
137
|
+
candidates: [],
|
|
138
|
+
diagnostics: [{
|
|
139
|
+
level: "warning",
|
|
140
|
+
code: "codex_synthesis_error",
|
|
141
|
+
message: error instanceof Error ? error.message : String(error),
|
|
142
|
+
adapter: "codex-synthesis",
|
|
143
|
+
}],
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
finally {
|
|
147
|
+
await rm(tempDir, { recursive: true, force: true });
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
function buildPrompt(options, rubrics) {
|
|
151
|
+
const cleanupSurfaces = buildCleanupSurfaces(options.evidence, options.existingCandidates);
|
|
152
|
+
const evidenceBundle = options.evidence.map((record) => ({
|
|
153
|
+
id: record.id,
|
|
154
|
+
adapter: record.adapter,
|
|
155
|
+
kind: record.kind,
|
|
156
|
+
title: record.title,
|
|
157
|
+
summary: record.summary,
|
|
158
|
+
files: record.files,
|
|
159
|
+
confidence: record.confidence,
|
|
160
|
+
data: redactedData(record.data, options.includeSource),
|
|
161
|
+
}));
|
|
162
|
+
const existing = options.existingCandidates.map((candidate) => ({
|
|
163
|
+
id: candidate.id,
|
|
164
|
+
title: candidate.title,
|
|
165
|
+
category: candidate.category,
|
|
166
|
+
priority: candidate.priority,
|
|
167
|
+
confidence: candidate.confidence,
|
|
168
|
+
evidenceIds: candidate.evidenceIds,
|
|
169
|
+
}));
|
|
170
|
+
return `You are Deepclean's maintainability synthesis reviewer.
|
|
171
|
+
|
|
172
|
+
Use only the evidence bundle below. Do not invent file paths, line numbers, commands, or evidence IDs.
|
|
173
|
+
Return only JSON matching the provided schema.
|
|
174
|
+
|
|
175
|
+
Goal:
|
|
176
|
+
- synthesize higher-quality maintainability cleanup candidates from local evidence
|
|
177
|
+
- prefer cross-evidence architectural/testability/duplication issues over one metric in isolation
|
|
178
|
+
- reject weak or noisy evidence rather than forcing findings
|
|
179
|
+
- produce agent-ready cleanup directions, not code patches
|
|
180
|
+
|
|
181
|
+
Clawpatch-style review flow for Deepclean:
|
|
182
|
+
- Treat local evidence as the source of truth.
|
|
183
|
+
- Review mapped cleanup surfaces the way a bug finder reviews semantic feature slices.
|
|
184
|
+
- Produce findings only when the surface shows a durable maintainability issue, not just an ugly file.
|
|
185
|
+
- Think like a senior maintainer preparing bounded work for a future coding agent.
|
|
186
|
+
- Prefer issues that explain how the codebase got sloppy and how to make it harder to re-slop.
|
|
187
|
+
|
|
188
|
+
Matt Pocock skills influence:
|
|
189
|
+
- The built-in reviewer pack includes distilled guidance from the MIT-licensed Matt Pocock skills snapshot vendored in this repo for reference.
|
|
190
|
+
- Apply those principles as engineering discipline, not as a reason to create unsupported findings.
|
|
191
|
+
- Favor deep modules with small interfaces, behavior-level feedback loops, domain vocabulary, and independently grabbable agent slices.
|
|
192
|
+
|
|
193
|
+
Reviewer pack:
|
|
194
|
+
${JSON.stringify(rubrics, null, 2)}
|
|
195
|
+
|
|
196
|
+
Project verification commands:
|
|
197
|
+
${JSON.stringify(options.verificationProfile ?? {}, null, 2)}
|
|
198
|
+
|
|
199
|
+
Cleanup surfaces:
|
|
200
|
+
${JSON.stringify(cleanupSurfaces, null, 2)}
|
|
201
|
+
|
|
202
|
+
Hard rules:
|
|
203
|
+
- every candidate MUST cite one or more provided evidenceIds
|
|
204
|
+
- every file reference MUST include path, startLine, and endLine; use startLine 1 and endLine 1 when exact line evidence is unavailable
|
|
205
|
+
- do not suggest modifying code as part of this response
|
|
206
|
+
- no security claims unless directly supported by evidence
|
|
207
|
+
- verification commands should be practical for a future agent, usually npm test and npm run typecheck
|
|
208
|
+
- every candidate should be traceable to one or more cleanup surfaces when possible
|
|
209
|
+
- do not create a candidate that the critic-pass reviewer would reject
|
|
210
|
+
- use notes for promising but under-supported themes instead of forcing weak candidates
|
|
211
|
+
|
|
212
|
+
Existing local candidates:
|
|
213
|
+
${JSON.stringify(existing, null, 2)}
|
|
214
|
+
|
|
215
|
+
Evidence bundle:
|
|
216
|
+
${JSON.stringify(evidenceBundle, null, 2)}
|
|
217
|
+
`;
|
|
218
|
+
}
|
|
219
|
+
function redactedData(data, includeSource) {
|
|
220
|
+
if (includeSource) {
|
|
221
|
+
return data;
|
|
222
|
+
}
|
|
223
|
+
const copy = {};
|
|
224
|
+
for (const [key, value] of Object.entries(data)) {
|
|
225
|
+
if (key.toLowerCase().includes("sample") || key.toLowerCase().includes("source")) {
|
|
226
|
+
continue;
|
|
227
|
+
}
|
|
228
|
+
copy[key] = value;
|
|
229
|
+
}
|
|
230
|
+
return copy;
|
|
231
|
+
}
|
|
232
|
+
function parseSynthesisOutput(raw) {
|
|
233
|
+
const trimmed = raw.trim();
|
|
234
|
+
const direct = tryParseJson(trimmed);
|
|
235
|
+
if (direct) {
|
|
236
|
+
return synthesisOutputSchema.parse(direct);
|
|
237
|
+
}
|
|
238
|
+
const match = trimmed.match(/\{[\s\S]*\}/);
|
|
239
|
+
if (!match) {
|
|
240
|
+
throw new Error("Codex did not return JSON");
|
|
241
|
+
}
|
|
242
|
+
return synthesisOutputSchema.parse(JSON.parse(match[0]));
|
|
243
|
+
}
|
|
244
|
+
function tryParseJson(value) {
|
|
245
|
+
try {
|
|
246
|
+
return JSON.parse(value);
|
|
247
|
+
}
|
|
248
|
+
catch {
|
|
249
|
+
return undefined;
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
async function runProcess(command, args, stdin, timeoutMs) {
|
|
253
|
+
return new Promise((resolve) => {
|
|
254
|
+
let timedOut = false;
|
|
255
|
+
const child = spawn(command, args, {
|
|
256
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
257
|
+
env: process.env,
|
|
258
|
+
});
|
|
259
|
+
let stdout = "";
|
|
260
|
+
let stderr = "";
|
|
261
|
+
const timeout = setTimeout(() => {
|
|
262
|
+
timedOut = true;
|
|
263
|
+
child.kill("SIGTERM");
|
|
264
|
+
}, timeoutMs);
|
|
265
|
+
child.stdout.setEncoding("utf8");
|
|
266
|
+
child.stderr.setEncoding("utf8");
|
|
267
|
+
child.stdout.on("data", (chunk) => {
|
|
268
|
+
stdout += chunk;
|
|
269
|
+
});
|
|
270
|
+
child.stderr.on("data", (chunk) => {
|
|
271
|
+
stderr += chunk;
|
|
272
|
+
});
|
|
273
|
+
child.on("error", (error) => {
|
|
274
|
+
clearTimeout(timeout);
|
|
275
|
+
resolve({ exitCode: 1, stdout, stderr: error.message, timedOut });
|
|
276
|
+
});
|
|
277
|
+
child.on("close", (exitCode) => {
|
|
278
|
+
clearTimeout(timeout);
|
|
279
|
+
resolve({ exitCode, stdout, stderr, timedOut });
|
|
280
|
+
});
|
|
281
|
+
child.stdin.end(stdin);
|
|
282
|
+
});
|
|
283
|
+
}
|
|
284
|
+
async function resolveReviewerPack(root, config) {
|
|
285
|
+
const diagnostics = [];
|
|
286
|
+
const enabled = new Set(config.reviewers.enabled);
|
|
287
|
+
const builtIn = reviewerRubrics.filter((rubric) => enabled.size === 0 || enabled.has(rubric.id));
|
|
288
|
+
for (const id of enabled) {
|
|
289
|
+
if (!reviewerRubrics.some((rubric) => rubric.id === id)) {
|
|
290
|
+
diagnostics.push({
|
|
291
|
+
level: "warning",
|
|
292
|
+
code: "reviewer_not_found",
|
|
293
|
+
message: `Configured reviewer is not built in and was ignored: ${id}`,
|
|
294
|
+
adapter: "codex-synthesis",
|
|
295
|
+
});
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
const custom = [];
|
|
299
|
+
for (const reviewerPath of config.reviewers.customPaths) {
|
|
300
|
+
const resolved = path.resolve(root, reviewerPath);
|
|
301
|
+
try {
|
|
302
|
+
const body = await readFile(resolved, "utf8");
|
|
303
|
+
custom.push({
|
|
304
|
+
id: `custom:${path.basename(reviewerPath).replace(/\.[^.]+$/, "")}`,
|
|
305
|
+
title: `Custom reviewer: ${reviewerPath}`,
|
|
306
|
+
purpose: body.slice(0, 4000),
|
|
307
|
+
lookFor: ["Follow the custom reviewer instructions."],
|
|
308
|
+
reject: ["Reject findings not supported by evidence IDs."],
|
|
309
|
+
output: ["Return bounded, agent-ready cleanup candidates."],
|
|
310
|
+
});
|
|
311
|
+
}
|
|
312
|
+
catch (error) {
|
|
313
|
+
diagnostics.push({
|
|
314
|
+
level: "warning",
|
|
315
|
+
code: "custom_reviewer_unavailable",
|
|
316
|
+
message: `Could not load custom reviewer ${reviewerPath}: ${error instanceof Error ? error.message : String(error)}`,
|
|
317
|
+
adapter: "codex-synthesis",
|
|
318
|
+
});
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
return { rubrics: [...builtIn, ...custom], diagnostics };
|
|
322
|
+
}
|
|
323
|
+
function codexFailureMessage(result) {
|
|
324
|
+
if (result.timedOut) {
|
|
325
|
+
return "Codex synthesis timed out before returning schema-valid JSON.";
|
|
326
|
+
}
|
|
327
|
+
const text = result.stderr || result.stdout || `Codex exited with code ${result.exitCode}`;
|
|
328
|
+
if (/not found|ENOENT/i.test(text)) {
|
|
329
|
+
return `Codex command was unavailable: ${text}`;
|
|
330
|
+
}
|
|
331
|
+
if (/auth|login|unauthori[sz]ed|api key/i.test(text)) {
|
|
332
|
+
return `Codex appears unauthenticated: ${text}`;
|
|
333
|
+
}
|
|
334
|
+
return text;
|
|
335
|
+
}
|
|
336
|
+
function jsonSchema() {
|
|
337
|
+
return {
|
|
338
|
+
type: "object",
|
|
339
|
+
additionalProperties: false,
|
|
340
|
+
required: ["candidates", "rejectedEvidenceIds", "notes"],
|
|
341
|
+
properties: {
|
|
342
|
+
candidates: {
|
|
343
|
+
type: "array",
|
|
344
|
+
items: {
|
|
345
|
+
type: "object",
|
|
346
|
+
additionalProperties: false,
|
|
347
|
+
required: [
|
|
348
|
+
"title",
|
|
349
|
+
"category",
|
|
350
|
+
"priority",
|
|
351
|
+
"confidence",
|
|
352
|
+
"impact",
|
|
353
|
+
"effort",
|
|
354
|
+
"risk",
|
|
355
|
+
"files",
|
|
356
|
+
"evidenceIds",
|
|
357
|
+
"whyItMatters",
|
|
358
|
+
"likelyRootCause",
|
|
359
|
+
"suggestedDirection",
|
|
360
|
+
"verification",
|
|
361
|
+
],
|
|
362
|
+
properties: {
|
|
363
|
+
title: { type: "string" },
|
|
364
|
+
category: { enum: [...candidateCategories] },
|
|
365
|
+
priority: { enum: [...priorities] },
|
|
366
|
+
confidence: { enum: [...confidenceLevels] },
|
|
367
|
+
impact: { enum: [...impactLevels] },
|
|
368
|
+
effort: { enum: [...effortLevels] },
|
|
369
|
+
risk: { enum: [...riskLevels] },
|
|
370
|
+
files: {
|
|
371
|
+
type: "array",
|
|
372
|
+
items: {
|
|
373
|
+
type: "object",
|
|
374
|
+
additionalProperties: false,
|
|
375
|
+
required: ["path", "startLine", "endLine"],
|
|
376
|
+
properties: {
|
|
377
|
+
path: { type: "string" },
|
|
378
|
+
startLine: { type: "integer", minimum: 1 },
|
|
379
|
+
endLine: { type: "integer", minimum: 1 },
|
|
380
|
+
},
|
|
381
|
+
},
|
|
382
|
+
},
|
|
383
|
+
evidenceIds: { type: "array", items: { type: "string" }, minItems: 1 },
|
|
384
|
+
whyItMatters: { type: "string" },
|
|
385
|
+
likelyRootCause: { type: "string" },
|
|
386
|
+
suggestedDirection: { type: "string" },
|
|
387
|
+
verification: { type: "array", items: { type: "string" }, minItems: 1 },
|
|
388
|
+
},
|
|
389
|
+
},
|
|
390
|
+
},
|
|
391
|
+
rejectedEvidenceIds: { type: "array", items: { type: "string" } },
|
|
392
|
+
notes: { type: "array", items: { type: "string" } },
|
|
393
|
+
},
|
|
394
|
+
};
|
|
395
|
+
}
|
|
396
|
+
//# sourceMappingURL=synthesis.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"synthesis.js","sourceRoot":"","sources":["../src/synthesis.ts"],"names":[],"mappings":"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"}
|