@claudexor/review 3.1.2 → 3.3.7-rc.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/dist/findings.d.ts +11 -0
- package/dist/findings.d.ts.map +1 -1
- package/dist/findings.js +48 -5
- package/dist/findings.js.map +1 -1
- package/dist/readiness.d.ts.map +1 -1
- package/dist/revalidate.js.map +1 -1
- package/dist/reviewEngine.d.ts +2 -4
- package/dist/reviewEngine.d.ts.map +1 -1
- package/dist/reviewEngine.js +168 -350
- package/dist/reviewEngine.js.map +1 -1
- package/dist/reviewPrompt.d.ts +122 -1
- package/dist/reviewPrompt.d.ts.map +1 -1
- package/dist/reviewPrompt.js +102 -17
- package/dist/reviewPrompt.js.map +1 -1
- package/dist/reviewRuntimeTypes.d.ts +1 -0
- package/dist/reviewRuntimeTypes.d.ts.map +1 -1
- package/dist/reviewRuntimeTypes.js.map +1 -1
- package/dist/reviewerCostKnowledge.d.ts.map +1 -1
- package/dist/reviewerSpendAccumulator.d.ts.map +1 -1
- package/dist/reviewerWorkspace.d.ts +24 -0
- package/dist/reviewerWorkspace.d.ts.map +1 -0
- package/dist/reviewerWorkspace.js +360 -0
- package/dist/reviewerWorkspace.js.map +1 -0
- package/dist/route.js.map +1 -1
- package/dist/sealedReviewEnvelope.d.ts +20 -0
- package/dist/sealedReviewEnvelope.d.ts.map +1 -0
- package/dist/sealedReviewEnvelope.js +176 -0
- package/dist/sealedReviewEnvelope.js.map +1 -0
- package/package.json +6 -6
|
@@ -0,0 +1,360 @@
|
|
|
1
|
+
import { parseUnifiedDiff, runCapture, runCaptureRaw } from "@claudexor/core";
|
|
2
|
+
import { existsSync, lstatSync, readlinkSync, realpathSync, statSync } from "node:fs";
|
|
3
|
+
import { cp, mkdir, readdir, rm } from "node:fs/promises";
|
|
4
|
+
import { tmpdir } from "node:os";
|
|
5
|
+
import { dirname, isAbsolute, join, normalize, relative, resolve, sep } from "node:path";
|
|
6
|
+
import { containsSecretLikeToken, newId, readTextSafe, redactSecrets, sensitiveResourcePolicy, writeJson, writeText, } from "@claudexor/util";
|
|
7
|
+
const BLOCKED_REVIEWER_RUNTIME_ROOTS = new Set("auth cache daemon home homes logs runs secrets state tmp workspaces".split(" "));
|
|
8
|
+
const TEXT_EVIDENCE_SUFFIXES = [".md", ".txt", ".json", ".yaml", ".yml", ".patch"];
|
|
9
|
+
export function selectReviewerWorkspaceBaseDir(sourceRoot, artifactsBaseDir, sourceEvidenceDir) {
|
|
10
|
+
const durableBase = join(artifactsBaseDir, "workspaces");
|
|
11
|
+
if (!isSameOrInside(sourceRoot, durableBase) && !isSameOrInside(sourceEvidenceDir, durableBase)) {
|
|
12
|
+
return durableBase;
|
|
13
|
+
}
|
|
14
|
+
return join(tmpdir(), `claudexor-review-workspaces-${newId("ws")}`);
|
|
15
|
+
}
|
|
16
|
+
function isTemporaryReviewerWorkspaceBaseDir(baseDir) {
|
|
17
|
+
const resolved = resolve(baseDir);
|
|
18
|
+
const rel = relative(tmpdir(), resolved);
|
|
19
|
+
return (isSameOrInside(tmpdir(), resolved) &&
|
|
20
|
+
rel.split(sep)[0]?.startsWith("claudexor-review-workspaces-") === true);
|
|
21
|
+
}
|
|
22
|
+
export async function prepareReviewerWorkspace(input) {
|
|
23
|
+
const sourceRoot = resolve(input.sourceRoot);
|
|
24
|
+
const workspaceBaseDir = resolve(input.workspaceBaseDir);
|
|
25
|
+
const root = join(workspaceBaseDir, input.reviewerDirName);
|
|
26
|
+
if (!existsSync(sourceRoot)) {
|
|
27
|
+
throw new Error(`candidate root does not exist: ${sourceRoot}`);
|
|
28
|
+
}
|
|
29
|
+
if (isSameOrInside(sourceRoot, root)) {
|
|
30
|
+
throw new Error(`reviewer workspace must be outside candidate root: ${root}`);
|
|
31
|
+
}
|
|
32
|
+
try {
|
|
33
|
+
await rm(root, { recursive: true, force: true });
|
|
34
|
+
await mkdir(root, { recursive: true, mode: 0o700 });
|
|
35
|
+
const excludeRoots = input.excludeRoots.map((p) => resolve(p));
|
|
36
|
+
const resolvedSourceRoot = realpathSync(sourceRoot);
|
|
37
|
+
await cp(sourceRoot, root, {
|
|
38
|
+
recursive: true,
|
|
39
|
+
dereference: false,
|
|
40
|
+
filter: (sourcePath) => shouldCopyReviewerPath(sourceRoot, resolvedSourceRoot, sourcePath, excludeRoots, input.postimagePaths, true, input.candidateCopyPaths),
|
|
41
|
+
});
|
|
42
|
+
const sourceEvidenceDir = resolve(input.sourceEvidenceDir);
|
|
43
|
+
const evidenceDir = join(root, ".claudexor-review-evidence");
|
|
44
|
+
if (existsSync(sourceEvidenceDir)) {
|
|
45
|
+
const resolvedSourceEvidenceDir = realpathSync(sourceEvidenceDir);
|
|
46
|
+
const evidenceExcludeRoots = excludeRoots.filter((root) => !isSameOrInside(root, sourceEvidenceDir));
|
|
47
|
+
await rm(evidenceDir, { recursive: true, force: true });
|
|
48
|
+
await cp(sourceEvidenceDir, evidenceDir, input.preserveEvidenceBytes
|
|
49
|
+
? { recursive: true, dereference: false }
|
|
50
|
+
: {
|
|
51
|
+
recursive: true,
|
|
52
|
+
dereference: false,
|
|
53
|
+
filter: (sourcePath) => shouldCopyReviewerPath(sourceEvidenceDir, resolvedSourceEvidenceDir, sourcePath, evidenceExcludeRoots),
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
await mkdir(evidenceDir, { recursive: true, mode: 0o700 });
|
|
57
|
+
await initializeReviewerWorkspaceGit(root);
|
|
58
|
+
return { root, evidenceDir };
|
|
59
|
+
}
|
|
60
|
+
catch (err) {
|
|
61
|
+
await rm(root, { recursive: true, force: true });
|
|
62
|
+
throw err;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
export async function copyReviewEvidencePacket(sourceEvidenceDir, persistentEvidenceDir, preserveBytes = false) {
|
|
66
|
+
const source = resolve(sourceEvidenceDir);
|
|
67
|
+
const target = resolve(persistentEvidenceDir);
|
|
68
|
+
await rm(target, { recursive: true, force: true });
|
|
69
|
+
if (!existsSync(source)) {
|
|
70
|
+
await mkdir(target, { recursive: true, mode: 0o700 });
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
if (preserveBytes) {
|
|
74
|
+
await mkdir(dirname(target), { recursive: true, mode: 0o700 });
|
|
75
|
+
await cp(source, target, { recursive: true, dereference: false });
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
await mkdir(target, { recursive: true, mode: 0o700 });
|
|
79
|
+
const resolvedSource = realpathSync(source);
|
|
80
|
+
for (const entry of await readdir(source, { withFileTypes: true })) {
|
|
81
|
+
const sourcePath = join(source, entry.name);
|
|
82
|
+
if (!shouldCopyEvidencePacketPath(source, resolvedSource, sourcePath, target)) {
|
|
83
|
+
continue;
|
|
84
|
+
}
|
|
85
|
+
await copyReviewEvidenceEntry(source, resolvedSource, sourcePath, join(target, entry.name), target);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
async function copyReviewEvidenceEntry(sourceEvidenceDir, resolvedSourceEvidenceDir, sourcePath, targetPath, targetEvidenceDir) {
|
|
89
|
+
const stat = lstatSync(sourcePath);
|
|
90
|
+
if (stat.isDirectory()) {
|
|
91
|
+
await mkdir(targetPath, { recursive: true, mode: 0o700 });
|
|
92
|
+
for (const entry of await readdir(sourcePath, { withFileTypes: true })) {
|
|
93
|
+
const childSource = join(sourcePath, entry.name);
|
|
94
|
+
if (!shouldCopyEvidencePacketPath(sourceEvidenceDir, resolvedSourceEvidenceDir, childSource, targetEvidenceDir)) {
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
97
|
+
await copyReviewEvidenceEntry(sourceEvidenceDir, resolvedSourceEvidenceDir, childSource, join(targetPath, entry.name), targetEvidenceDir);
|
|
98
|
+
}
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
if (stat.isFile() && shouldTextSanitizeEvidenceFile(sourcePath)) {
|
|
102
|
+
const raw = readTextSafe(sourcePath);
|
|
103
|
+
if (raw === null)
|
|
104
|
+
throw new Error(`could not read review evidence file: ${sourcePath}`);
|
|
105
|
+
const text = shouldFailClosedEvidenceFile(sourcePath) ? raw : redactSecrets(raw);
|
|
106
|
+
if (containsSecretLikeToken(text)) {
|
|
107
|
+
throw new Error(`review evidence file contains a secret-like token: ${relative(sourceEvidenceDir, sourcePath)}`);
|
|
108
|
+
}
|
|
109
|
+
writeText(targetPath, text);
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
await mkdir(dirname(targetPath), { recursive: true, mode: 0o700 });
|
|
113
|
+
await cp(sourcePath, targetPath, { recursive: false, dereference: false });
|
|
114
|
+
}
|
|
115
|
+
function shouldTextSanitizeEvidenceFile(path) {
|
|
116
|
+
return TEXT_EVIDENCE_SUFFIXES.some((extension) => path.toLowerCase().endsWith(extension));
|
|
117
|
+
}
|
|
118
|
+
function shouldFailClosedEvidenceFile(path) {
|
|
119
|
+
return path.toLowerCase().endsWith(".patch");
|
|
120
|
+
}
|
|
121
|
+
function shouldCopyEvidencePacketPath(sourceEvidenceDir, resolvedSourceEvidenceDir, sourcePath, targetEvidenceDir) {
|
|
122
|
+
const resolvedSourcePath = resolve(sourcePath);
|
|
123
|
+
if (isSameOrInside(resolvedSourcePath, targetEvidenceDir))
|
|
124
|
+
return false;
|
|
125
|
+
if (isSameOrInside(targetEvidenceDir, resolvedSourcePath))
|
|
126
|
+
return false;
|
|
127
|
+
return shouldCopyReviewerPath(sourceEvidenceDir, resolvedSourceEvidenceDir, resolvedSourcePath, [targetEvidenceDir], new Set(), false);
|
|
128
|
+
}
|
|
129
|
+
export async function cleanupTemporaryReviewerWorkspaceBaseDir(workspaceBaseDir, artifactsBaseDir) {
|
|
130
|
+
if (!isTemporaryReviewerWorkspaceBaseDir(workspaceBaseDir))
|
|
131
|
+
return;
|
|
132
|
+
try {
|
|
133
|
+
await rm(workspaceBaseDir, { recursive: true, force: true });
|
|
134
|
+
}
|
|
135
|
+
catch (err) {
|
|
136
|
+
try {
|
|
137
|
+
writeJson(join(artifactsBaseDir, "reviewer-workspace-base-cleanup-error.json"), {
|
|
138
|
+
reviewer_workspace_base_cleanup: "failed",
|
|
139
|
+
workspace_base_dir: workspaceBaseDir,
|
|
140
|
+
error: redactSecrets(err instanceof Error ? err.message : String(err)),
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
catch {
|
|
144
|
+
// Do not let cleanup telemetry hide the review result or the original error.
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
function shouldCopyReviewerPath(sourceRoot, resolvedSourceRoot, sourcePath, excludeRoots, postimagePaths = new Set(), enforceContentPolicy = true, candidateCopyPaths) {
|
|
149
|
+
const resolvedSourcePath = resolve(sourcePath);
|
|
150
|
+
const rel = relative(sourceRoot, resolvedSourcePath);
|
|
151
|
+
if (rel && candidateCopyPaths) {
|
|
152
|
+
const normalized = normalizeReviewerRelativePath(rel);
|
|
153
|
+
if (!normalized || !candidateCopyPaths.has(normalized))
|
|
154
|
+
return false;
|
|
155
|
+
}
|
|
156
|
+
if (!isCopyableReviewerSymlink(sourceRoot, resolvedSourceRoot, resolvedSourcePath, excludeRoots)) {
|
|
157
|
+
return false;
|
|
158
|
+
}
|
|
159
|
+
if (excludeRoots.some((root) => isSameOrInside(root, resolvedSourcePath)))
|
|
160
|
+
return false;
|
|
161
|
+
if (!rel)
|
|
162
|
+
return true;
|
|
163
|
+
const normalizedRel = normalizeReviewerRelativePath(rel);
|
|
164
|
+
if (!normalizedRel)
|
|
165
|
+
return false;
|
|
166
|
+
const parts = normalizedRel.split("/");
|
|
167
|
+
if (sensitiveResourcePolicy.classifyPath(rel).sensitive) {
|
|
168
|
+
return false;
|
|
169
|
+
}
|
|
170
|
+
if (parts[0] === ".claudexor") {
|
|
171
|
+
return (isCopyableReviewerClaudexorPath(rel, parts, postimagePaths) &&
|
|
172
|
+
(!enforceContentPolicy || reviewerFileContentAllowed(resolvedSourcePath)));
|
|
173
|
+
}
|
|
174
|
+
if (parts.some((part) => [".git", ".adversarial-review", ".turbo", "node_modules"].includes(part))) {
|
|
175
|
+
return false;
|
|
176
|
+
}
|
|
177
|
+
if (parts.some((part) => [".next", ".cache", "coverage", "dist"].includes(part)) &&
|
|
178
|
+
!isReviewerPostimagePath(rel, postimagePaths)) {
|
|
179
|
+
return false;
|
|
180
|
+
}
|
|
181
|
+
return (!rel.endsWith(".tsbuildinfo") &&
|
|
182
|
+
(!enforceContentPolicy || reviewerFileContentAllowed(resolvedSourcePath)));
|
|
183
|
+
}
|
|
184
|
+
function reviewerFileContentAllowed(path) {
|
|
185
|
+
let targetStat;
|
|
186
|
+
try {
|
|
187
|
+
targetStat = statSync(path);
|
|
188
|
+
}
|
|
189
|
+
catch {
|
|
190
|
+
return false;
|
|
191
|
+
}
|
|
192
|
+
if (!targetStat.isFile())
|
|
193
|
+
return true;
|
|
194
|
+
const content = readTextSafe(path);
|
|
195
|
+
return content !== null && !sensitiveResourcePolicy.containsSensitiveContent(content);
|
|
196
|
+
}
|
|
197
|
+
function isCopyableReviewerClaudexorPath(rel, parts, postimagePaths) {
|
|
198
|
+
if (parts.length === 1) {
|
|
199
|
+
return true;
|
|
200
|
+
}
|
|
201
|
+
if (parts.length === 2 && parts[1] === "config.yaml") {
|
|
202
|
+
return true;
|
|
203
|
+
}
|
|
204
|
+
const runtimeRoot = parts[1]?.toLowerCase();
|
|
205
|
+
if (runtimeRoot && BLOCKED_REVIEWER_RUNTIME_ROOTS.has(runtimeRoot))
|
|
206
|
+
return false;
|
|
207
|
+
return isReviewerPostimagePath(rel, postimagePaths);
|
|
208
|
+
}
|
|
209
|
+
function isReviewerPostimagePath(rel, postimagePaths) {
|
|
210
|
+
const normalized = normalizeReviewerRelativePath(rel);
|
|
211
|
+
if (!normalized)
|
|
212
|
+
return false;
|
|
213
|
+
if (postimagePaths.has(normalized))
|
|
214
|
+
return true;
|
|
215
|
+
const prefix = `${normalized}/`;
|
|
216
|
+
for (const postimage of postimagePaths) {
|
|
217
|
+
if (postimage.startsWith(prefix))
|
|
218
|
+
return true;
|
|
219
|
+
}
|
|
220
|
+
return false;
|
|
221
|
+
}
|
|
222
|
+
export function extractDiffPostimagePaths(diff) {
|
|
223
|
+
const paths = new Set();
|
|
224
|
+
for (const file of parseUnifiedDiff(diff).files) {
|
|
225
|
+
// Reviewer workspaces represent the candidate postimage. Old rename and
|
|
226
|
+
// deletion paths live in DIFF.patch; re-reading them from the live source
|
|
227
|
+
// could pick up an unrelated ignored file recreated at the retired path.
|
|
228
|
+
if (!file.deleted && file.newPath)
|
|
229
|
+
addReviewerPreservePath(paths, file.newPath);
|
|
230
|
+
}
|
|
231
|
+
return paths;
|
|
232
|
+
}
|
|
233
|
+
function addReviewerPreservePath(paths, value) {
|
|
234
|
+
const normalized = normalizeReviewerRelativePath(value);
|
|
235
|
+
if (normalized)
|
|
236
|
+
paths.add(normalized);
|
|
237
|
+
}
|
|
238
|
+
function normalizeReviewerRelativePath(value) {
|
|
239
|
+
if (!value || value === "/dev/null" || isAbsolute(value))
|
|
240
|
+
return null;
|
|
241
|
+
const platformPath = normalize(value);
|
|
242
|
+
// Git paths are slash-delimited, but on POSIX a backslash is a literal file
|
|
243
|
+
// name byte. Convert it only where the host path implementation treats it as
|
|
244
|
+
// a separator; otherwise `safe\\file` must not authorize `safe/file`.
|
|
245
|
+
const normalized = sep === "\\" ? platformPath.replace(/\\/g, "/") : platformPath;
|
|
246
|
+
if (!normalized || normalized === "." || normalized === ".." || normalized.startsWith("../")) {
|
|
247
|
+
return null;
|
|
248
|
+
}
|
|
249
|
+
return normalized;
|
|
250
|
+
}
|
|
251
|
+
export async function buildReviewerCandidateInventory(sourceRoot, postimagePaths, requireGit) {
|
|
252
|
+
const result = await runCaptureRaw("git", ["-C", sourceRoot, "ls-files", "--cached", "--others", "--exclude-standard", "-z", "--"], { env: reviewerGitEnv(), timeoutMs: 30_000 });
|
|
253
|
+
if (result.code !== 0) {
|
|
254
|
+
const detail = redactSecrets((result.stderr || result.stdout || `exit ${String(result.code)}`).trim());
|
|
255
|
+
if (requireGit) {
|
|
256
|
+
throw new Error(`failed to inventory frozen reviewer candidate: ${detail}`);
|
|
257
|
+
}
|
|
258
|
+
return {
|
|
259
|
+
mode: "diff_only",
|
|
260
|
+
reason: detail || "Git inventory unavailable",
|
|
261
|
+
copyPaths: reviewerCopyPathClosure(postimagePaths),
|
|
262
|
+
};
|
|
263
|
+
}
|
|
264
|
+
const visiblePaths = result.stdout.split("\0").filter(Boolean);
|
|
265
|
+
return {
|
|
266
|
+
mode: "git_visible",
|
|
267
|
+
reason: null,
|
|
268
|
+
copyPaths: reviewerCopyPathClosure([...visiblePaths, ...postimagePaths]),
|
|
269
|
+
};
|
|
270
|
+
}
|
|
271
|
+
function reviewerCopyPathClosure(paths) {
|
|
272
|
+
const closure = new Set();
|
|
273
|
+
for (const value of paths) {
|
|
274
|
+
const normalized = normalizeReviewerRelativePath(value);
|
|
275
|
+
if (!normalized)
|
|
276
|
+
continue;
|
|
277
|
+
const parts = normalized.split("/");
|
|
278
|
+
for (let length = 1; length <= parts.length; length += 1) {
|
|
279
|
+
closure.add(parts.slice(0, length).join("/"));
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
return closure;
|
|
283
|
+
}
|
|
284
|
+
function isCopyableReviewerSymlink(sourceRoot, resolvedSourceRoot, sourcePath, excludeRoots) {
|
|
285
|
+
let stat;
|
|
286
|
+
try {
|
|
287
|
+
stat = lstatSync(sourcePath);
|
|
288
|
+
}
|
|
289
|
+
catch {
|
|
290
|
+
return false;
|
|
291
|
+
}
|
|
292
|
+
if (!stat.isSymbolicLink())
|
|
293
|
+
return true;
|
|
294
|
+
let linkTarget = "";
|
|
295
|
+
let resolvedTarget = "";
|
|
296
|
+
let targetKind = "other";
|
|
297
|
+
try {
|
|
298
|
+
linkTarget = readlinkSync(sourcePath);
|
|
299
|
+
resolvedTarget = realpathSync(sourcePath);
|
|
300
|
+
const targetStat = statSync(sourcePath);
|
|
301
|
+
targetKind = targetStat.isDirectory() ? "directory" : targetStat.isFile() ? "file" : "other";
|
|
302
|
+
}
|
|
303
|
+
catch {
|
|
304
|
+
return false;
|
|
305
|
+
}
|
|
306
|
+
return sensitiveResourcePolicy.assessSymlink({
|
|
307
|
+
sourceRoot,
|
|
308
|
+
canonicalSourceRoot: resolvedSourceRoot,
|
|
309
|
+
sourcePath,
|
|
310
|
+
linkTarget,
|
|
311
|
+
resolvedTargetPath: resolvedTarget,
|
|
312
|
+
targetKind,
|
|
313
|
+
allowedTargetKinds: ["file", "directory"],
|
|
314
|
+
excludedRoots: excludeRoots,
|
|
315
|
+
relocationRoot: sourceRoot,
|
|
316
|
+
}).allowed;
|
|
317
|
+
}
|
|
318
|
+
async function initializeReviewerWorkspaceGit(root) {
|
|
319
|
+
const noHooks = ["-c", "core.hooksPath=/dev/null"];
|
|
320
|
+
await runGitOrThrow("init", root, ["-c", "init.templateDir=", ...noHooks, "init"]);
|
|
321
|
+
for (const [key, value] of [
|
|
322
|
+
["user.email", "claudexor-review@example.invalid"],
|
|
323
|
+
["user.name", "Claudexor Review"],
|
|
324
|
+
]) {
|
|
325
|
+
await runGitOrThrow(`config ${key}`, root, [...noHooks, "config", key, value]);
|
|
326
|
+
}
|
|
327
|
+
await runGitOrThrow("add", root, [...noHooks, "add", "-A", "--force"]);
|
|
328
|
+
await runGitOrThrow("commit", root, [
|
|
329
|
+
...noHooks,
|
|
330
|
+
"commit",
|
|
331
|
+
"--allow-empty",
|
|
332
|
+
"--no-verify",
|
|
333
|
+
"--no-gpg-sign",
|
|
334
|
+
"-m",
|
|
335
|
+
"review baseline",
|
|
336
|
+
]);
|
|
337
|
+
}
|
|
338
|
+
async function runGitOrThrow(label, cwd, args) {
|
|
339
|
+
const result = await runCapture("git", args, {
|
|
340
|
+
cwd,
|
|
341
|
+
env: reviewerGitEnv(),
|
|
342
|
+
timeoutMs: 60_000,
|
|
343
|
+
});
|
|
344
|
+
if (result.code === 0)
|
|
345
|
+
return;
|
|
346
|
+
const detail = redactSecrets((result.stderr || result.stdout || `exit ${result.code}`).trim());
|
|
347
|
+
throw new Error(`failed to prepare reviewer workspace (${label}): ${detail}`);
|
|
348
|
+
}
|
|
349
|
+
function reviewerGitEnv() {
|
|
350
|
+
const gitEnv = Object.fromEntries(Object.keys(process.env)
|
|
351
|
+
.filter((key) => key.startsWith("GIT_"))
|
|
352
|
+
.map((key) => [key, null]));
|
|
353
|
+
gitEnv.GIT_CONFIG_NOSYSTEM = "1";
|
|
354
|
+
return gitEnv;
|
|
355
|
+
}
|
|
356
|
+
export function isSameOrInside(parent, target) {
|
|
357
|
+
const rel = relative(resolve(parent), resolve(target));
|
|
358
|
+
return rel === "" || (!!rel && rel !== ".." && !rel.startsWith(`..${sep}`) && !isAbsolute(rel));
|
|
359
|
+
}
|
|
360
|
+
//# sourceMappingURL=reviewerWorkspace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reviewerWorkspace.js","sourceRoot":"","sources":["../src/reviewerWorkspace.ts"],"names":[],"mappings":"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"}
|
package/dist/route.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"route.js","sourceRoot":"","sources":["../src/route.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,IAAI,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAcnE,gGAAgG;AAChG,MAAM,UAAU,eAAe,CAC7B,SAAyB,EACzB,QAAuB,EACvB,
|
|
1
|
+
{"version":3,"file":"route.js","sourceRoot":"","sources":["../src/route.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,IAAI,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAcnE,gGAAgG;AAChG,MAAM,UAAU,eAAe,CAC7B,SAAyB,EACzB,QAAuB,EACvB,gBAAgB,GAAa,EAAE;IAE/B,MAAM,cAAc,GAAG,QAAQ,CAAC,eAAe,IAAI,aAAa,CAAC;IACjE,MAAM,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,cAAc,KAAK,aAAa,CAAC;IACnF,MAAM,MAAM,GAAG,CAAC,WAAW;QACzB,CAAC,CAAC,YAAY;QACd,CAAC,CAAC,cAAc,KAAK,UAAU;YAC7B,CAAC,CAAC,oBAAoB;YACtB,CAAC,CAAC,UAAU,CAAC;IACjB,OAAO,gBAAgB,CAAC,KAAK,CAAC;QAC5B,SAAS,EAAE;YACT,UAAU,EAAE,SAAS,CAAC,UAAU;YAChC,eAAe,EAAE,SAAS,CAAC,eAAe;YAC1C,UAAU,EAAE,SAAS,CAAC,UAAU,IAAI,IAAI;SACzC;QACD,QAAQ,EAAE;YACR,QAAQ,EAAE,QAAQ,CAAC,QAAQ,IAAI,IAAI;YACnC,QAAQ,EAAE,QAAQ,CAAC,QAAQ,IAAI,IAAI;YACnC,eAAe,EAAE,cAAc;SAChC;QACD,iBAAiB,EAAE,gBAAgB;QACnC,MAAM;KACP,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAoB;IACpD,MAAM,uBAAuB,GAAG,IAAI,GAAG,EAA+B,CAAC;IACvE,MAAM,6BAA6B,GAAG,IAAI,GAAG,EAAuB,CAAC;IACrE,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,IAAI,CAAC,CAAC,MAAM,KAAK,UAAU,IAAI,CAAC,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;YACnD,MAAM,QAAQ,GACZ,uBAAuB,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,GAAG,EAAkB,CAAC;YAChF,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;YAC1C,uBAAuB,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;YAC3D,MAAM,cAAc,GAClB,6BAA6B,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,GAAG,EAAU,CAAC;YAC9E,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC;YACjD,6BAA6B,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;QACzE,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACtB,MAAM,aAAa,GAAG,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAC1C,MAAM,SAAS,GACb,CAAC,CAAC,MAAM,KAAK,UAAU;YACvB,aAAa;YACb,CAAC,CAAC,uBAAuB,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC;gBAC1D,CAAC,6BAA6B,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACvE,OAAO,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,qBAA8B,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1E,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export declare const RELEASE_NATIVE_CHECKLIST_ITEMS: readonly ["sealed_evidence", "intent_and_scope", "runtime_and_security", "tests_and_release"];
|
|
2
|
+
export declare const SEALED_REVIEW_SEVERITY_VALUES: readonly ["BLOCK", "FIX_FIRST", "WARN", "NIT", "OUT_OF_SCOPE", "INSUFFICIENT_EVIDENCE", "NEEDS_HUMAN"];
|
|
3
|
+
export declare const SEALED_REVIEW_CATEGORY_VALUES: readonly ["correctness", "regression", "security", "performance", "maintainability", "test_gap", "spec_gap", "deploy", "architecture", "ux"];
|
|
4
|
+
export interface SealedReviewDecisionFinding {
|
|
5
|
+
severity: string;
|
|
6
|
+
}
|
|
7
|
+
export interface SealedReviewDecisionEnvelopeParse {
|
|
8
|
+
findings: SealedReviewDecisionFinding[];
|
|
9
|
+
rawFindings: unknown[];
|
|
10
|
+
malformed: number;
|
|
11
|
+
error: string | null;
|
|
12
|
+
blocks: unknown[];
|
|
13
|
+
}
|
|
14
|
+
/** Deterministic persisted transcript projection for sealed native reviews. */
|
|
15
|
+
export declare function sealedReviewTranscriptChunk(event: unknown): string | null;
|
|
16
|
+
export declare function sealedReviewTranscriptFromEvents(events: readonly unknown[]): string;
|
|
17
|
+
/** Dependency-free decision parser shared by the product and receipt verifier.
|
|
18
|
+
* Full product normalization still runs the canonical ReviewFinding schema. */
|
|
19
|
+
export declare function parseSealedReviewDecisionEnvelopeDetailed(text: string): SealedReviewDecisionEnvelopeParse;
|
|
20
|
+
//# sourceMappingURL=sealedReviewEnvelope.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sealedReviewEnvelope.d.ts","sourceRoot":"","sources":["../src/sealedReviewEnvelope.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,8BAA8B,YACzC,iBAAiB,EACjB,kBAAkB,EAClB,sBAAsB,EACtB,mBAAmB,CACX,CAAC;AAEX,eAAO,MAAM,6BAA6B,YACxC,OAAO,EACP,WAAW,EACX,MAAM,EACN,KAAK,EACL,cAAc,EACd,uBAAuB,EACvB,aAAa,CACL,CAAC;AACX,eAAO,MAAM,6BAA6B,YACxC,aAAa,EACb,YAAY,EACZ,UAAU,EACV,aAAa,EACb,iBAAiB,EACjB,UAAU,EACV,UAAU,EACV,QAAQ,EACR,cAAc,EACd,IAAI,CACI,CAAC;AAKX,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,iCAAiC;IAChD,QAAQ,EAAE,2BAA2B,EAAE,CAAC;IACxC,WAAW,EAAE,OAAO,EAAE,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,MAAM,EAAE,OAAO,EAAE,CAAC;CACnB;AAED,+EAA+E;AAC/E,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAMzE;AAED,wBAAgB,gCAAgC,CAAC,MAAM,EAAE,SAAS,OAAO,EAAE,GAAG,MAAM,CAkBnF;AAED;+EAC+E;AAC/E,wBAAgB,yCAAyC,CACvD,IAAI,EAAE,MAAM,GACX,iCAAiC,CAoFnC"}
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
export const RELEASE_NATIVE_CHECKLIST_ITEMS = [
|
|
2
|
+
"sealed_evidence",
|
|
3
|
+
"intent_and_scope",
|
|
4
|
+
"runtime_and_security",
|
|
5
|
+
"tests_and_release",
|
|
6
|
+
];
|
|
7
|
+
export const SEALED_REVIEW_SEVERITY_VALUES = [
|
|
8
|
+
"BLOCK",
|
|
9
|
+
"FIX_FIRST",
|
|
10
|
+
"WARN",
|
|
11
|
+
"NIT",
|
|
12
|
+
"OUT_OF_SCOPE",
|
|
13
|
+
"INSUFFICIENT_EVIDENCE",
|
|
14
|
+
"NEEDS_HUMAN",
|
|
15
|
+
];
|
|
16
|
+
export const SEALED_REVIEW_CATEGORY_VALUES = [
|
|
17
|
+
"correctness",
|
|
18
|
+
"regression",
|
|
19
|
+
"security",
|
|
20
|
+
"performance",
|
|
21
|
+
"maintainability",
|
|
22
|
+
"test_gap",
|
|
23
|
+
"spec_gap",
|
|
24
|
+
"deploy",
|
|
25
|
+
"architecture",
|
|
26
|
+
"ux",
|
|
27
|
+
];
|
|
28
|
+
const SEALED_REVIEW_SEVERITIES = new Set(SEALED_REVIEW_SEVERITY_VALUES);
|
|
29
|
+
const SEALED_REVIEW_CATEGORIES = new Set(SEALED_REVIEW_CATEGORY_VALUES);
|
|
30
|
+
const BLOCKING_SEVERITIES = new Set(["BLOCK", "FIX_FIRST", "NEEDS_HUMAN", "INSUFFICIENT_EVIDENCE"]);
|
|
31
|
+
/** Deterministic persisted transcript projection for sealed native reviews. */
|
|
32
|
+
export function sealedReviewTranscriptChunk(event) {
|
|
33
|
+
if (!isRecord(event) || event["type"] !== "message")
|
|
34
|
+
return null;
|
|
35
|
+
if (isRecord(event["payload"]) && event["payload"]["auth_switched"] === true)
|
|
36
|
+
return null;
|
|
37
|
+
const text = event["text"];
|
|
38
|
+
if (typeof text !== "string" || text.length === 0)
|
|
39
|
+
return null;
|
|
40
|
+
return text.endsWith("\n") ? text : `${text}\n`;
|
|
41
|
+
}
|
|
42
|
+
export function sealedReviewTranscriptFromEvents(events) {
|
|
43
|
+
// HarnessEvent.final is the cross-harness typed-answer contract. Adapter
|
|
44
|
+
// provenance such as payload.final_source remains preserved in raw events
|
|
45
|
+
// and pinned by adapter conformance, but is not a second finality authority.
|
|
46
|
+
const finals = events.filter((event) => isRecord(event) && event["type"] === "message" && event["final"] === true);
|
|
47
|
+
if (finals.length !== 1) {
|
|
48
|
+
throw new Error(`sealed review requires exactly one typed final message; observed ${finals.length}`);
|
|
49
|
+
}
|
|
50
|
+
const transcript = sealedReviewTranscriptChunk(finals[0]);
|
|
51
|
+
if (transcript === null) {
|
|
52
|
+
throw new Error("sealed review final message has no projectable text");
|
|
53
|
+
}
|
|
54
|
+
return transcript;
|
|
55
|
+
}
|
|
56
|
+
/** Dependency-free decision parser shared by the product and receipt verifier.
|
|
57
|
+
* Full product normalization still runs the canonical ReviewFinding schema. */
|
|
58
|
+
export function parseSealedReviewDecisionEnvelopeDetailed(text) {
|
|
59
|
+
const empty = (error) => ({
|
|
60
|
+
findings: [],
|
|
61
|
+
rawFindings: [],
|
|
62
|
+
malformed: 0,
|
|
63
|
+
error,
|
|
64
|
+
blocks: [],
|
|
65
|
+
});
|
|
66
|
+
const source = text.trim();
|
|
67
|
+
if (source.length === 0)
|
|
68
|
+
return empty("no sealed review envelope");
|
|
69
|
+
let envelope;
|
|
70
|
+
try {
|
|
71
|
+
envelope = JSON.parse(source);
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
return empty("sealed review output must be exactly one JSON object with no surrounding prose");
|
|
75
|
+
}
|
|
76
|
+
const blocks = [envelope];
|
|
77
|
+
const fail = (error, rawFindings = [], findings = [], malformed = 0) => ({
|
|
78
|
+
findings,
|
|
79
|
+
rawFindings,
|
|
80
|
+
malformed,
|
|
81
|
+
error,
|
|
82
|
+
blocks,
|
|
83
|
+
});
|
|
84
|
+
if (!isRecord(envelope) || !hasExactKeys(envelope, ["completion", "findings"])) {
|
|
85
|
+
return fail("invalid sealed review envelope shape");
|
|
86
|
+
}
|
|
87
|
+
const completion = envelope["completion"];
|
|
88
|
+
const rawFindings = envelope["findings"];
|
|
89
|
+
if (!isRecord(completion) ||
|
|
90
|
+
!hasExactKeys(completion, ["checklist", "findingCount", "verdict"]) ||
|
|
91
|
+
!Array.isArray(rawFindings)) {
|
|
92
|
+
return fail("invalid sealed completion shape");
|
|
93
|
+
}
|
|
94
|
+
const checklist = completion["checklist"];
|
|
95
|
+
if (!Array.isArray(checklist) ||
|
|
96
|
+
checklist.length !== RELEASE_NATIVE_CHECKLIST_ITEMS.length ||
|
|
97
|
+
checklist.some((row, index) => {
|
|
98
|
+
if (!isRecord(row) || !hasOnlyKeys(row, ["item", "completed", "note"]))
|
|
99
|
+
return true;
|
|
100
|
+
if (row["item"] !== RELEASE_NATIVE_CHECKLIST_ITEMS[index] || row["completed"] !== true)
|
|
101
|
+
return true;
|
|
102
|
+
return row["note"] !== undefined && typeof row["note"] !== "string";
|
|
103
|
+
})) {
|
|
104
|
+
return fail("sealed checklist must contain the four exact completed items in order", rawFindings);
|
|
105
|
+
}
|
|
106
|
+
const findingCount = completion["findingCount"];
|
|
107
|
+
if (!Number.isSafeInteger(findingCount) || findingCount < 0) {
|
|
108
|
+
return fail("findingCount must be a non-negative integer", rawFindings);
|
|
109
|
+
}
|
|
110
|
+
if (findingCount !== rawFindings.length) {
|
|
111
|
+
return fail("findingCount does not match findings.length", rawFindings);
|
|
112
|
+
}
|
|
113
|
+
const findings = rawFindings.filter(isSealedReviewFinding).map((finding) => ({
|
|
114
|
+
severity: finding["severity"],
|
|
115
|
+
}));
|
|
116
|
+
const malformed = rawFindings.length - findings.length;
|
|
117
|
+
if (malformed > 0) {
|
|
118
|
+
return fail("sealed findings contain malformed items", rawFindings, findings, malformed);
|
|
119
|
+
}
|
|
120
|
+
const expectedVerdict = findings.some((finding) => BLOCKING_SEVERITIES.has(finding.severity))
|
|
121
|
+
? "FAIL"
|
|
122
|
+
: "PASS";
|
|
123
|
+
if (completion["verdict"] !== expectedVerdict) {
|
|
124
|
+
return fail(`completion verdict must be ${expectedVerdict} for these findings`, rawFindings, findings);
|
|
125
|
+
}
|
|
126
|
+
return { findings, rawFindings, malformed: 0, error: null, blocks };
|
|
127
|
+
}
|
|
128
|
+
function isSealedReviewFinding(value) {
|
|
129
|
+
if (!isRecord(value) || !SEALED_REVIEW_SEVERITIES.has(value["severity"]))
|
|
130
|
+
return false;
|
|
131
|
+
const id = value["id"];
|
|
132
|
+
if (id != null && (typeof id !== "string" || id.length === 0))
|
|
133
|
+
return false;
|
|
134
|
+
const category = value["category"];
|
|
135
|
+
if (category != null && !SEALED_REVIEW_CATEGORIES.has(category))
|
|
136
|
+
return false;
|
|
137
|
+
const criteria = value["linked_acceptance_criteria"];
|
|
138
|
+
if (criteria != null &&
|
|
139
|
+
!isArrayOf(criteria, (item) => typeof item === "string" && item.length > 0))
|
|
140
|
+
return false;
|
|
141
|
+
const proposedFix = value["proposed_fix"];
|
|
142
|
+
if (proposedFix != null && typeof proposedFix !== "string")
|
|
143
|
+
return false;
|
|
144
|
+
return isFindingEvidence(value["evidence"]);
|
|
145
|
+
}
|
|
146
|
+
function isFindingEvidence(value) {
|
|
147
|
+
if (value == null)
|
|
148
|
+
return true;
|
|
149
|
+
if (!isRecord(value))
|
|
150
|
+
return false;
|
|
151
|
+
return (isOptionalArrayOf(value["files"], (item) => isRecord(item) &&
|
|
152
|
+
typeof item["path"] === "string" &&
|
|
153
|
+
(item["lines"] === undefined ||
|
|
154
|
+
item["lines"] === null ||
|
|
155
|
+
typeof item["lines"] === "string")) &&
|
|
156
|
+
isOptionalArrayOf(value["diff_hunks"], (item) => typeof item === "string") &&
|
|
157
|
+
isOptionalArrayOf(value["commands"], (item) => isRecord(item) && typeof item["command"] === "string") &&
|
|
158
|
+
isOptionalArrayOf(value["logs"], (item) => isRecord(item) && typeof item["path"] === "string"));
|
|
159
|
+
}
|
|
160
|
+
function isOptionalArrayOf(value, predicate) {
|
|
161
|
+
return value === undefined || isArrayOf(value, predicate);
|
|
162
|
+
}
|
|
163
|
+
function isArrayOf(value, predicate) {
|
|
164
|
+
return Array.isArray(value) && value.every(predicate);
|
|
165
|
+
}
|
|
166
|
+
function isRecord(value) {
|
|
167
|
+
return !!value && typeof value === "object" && !Array.isArray(value);
|
|
168
|
+
}
|
|
169
|
+
function hasExactKeys(value, keys) {
|
|
170
|
+
return Object.keys(value).length === keys.length && hasOnlyKeys(value, keys);
|
|
171
|
+
}
|
|
172
|
+
function hasOnlyKeys(value, keys) {
|
|
173
|
+
const allowed = new Set(keys);
|
|
174
|
+
return Object.keys(value).every((key) => allowed.has(key));
|
|
175
|
+
}
|
|
176
|
+
//# sourceMappingURL=sealedReviewEnvelope.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sealedReviewEnvelope.js","sourceRoot":"","sources":["../src/sealedReviewEnvelope.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@claudexor/review",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.3.7-rc.0",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"description": "Deterministic gates, cross-family review, finding revalidation, route proof, convergence, readiness-debt.",
|
|
6
6
|
"type": "module",
|
|
@@ -16,11 +16,11 @@
|
|
|
16
16
|
"dist"
|
|
17
17
|
],
|
|
18
18
|
"dependencies": {
|
|
19
|
-
"@claudexor/context": "3.
|
|
20
|
-
"@claudexor/core": "3.
|
|
21
|
-
"@claudexor/schema": "3.
|
|
22
|
-
"@claudexor/
|
|
23
|
-
"@claudexor/
|
|
19
|
+
"@claudexor/context": "3.3.7-rc.0",
|
|
20
|
+
"@claudexor/core": "3.3.7-rc.0",
|
|
21
|
+
"@claudexor/schema": "3.3.7-rc.0",
|
|
22
|
+
"@claudexor/util": "3.3.7-rc.0",
|
|
23
|
+
"@claudexor/config": "3.3.7-rc.0"
|
|
24
24
|
},
|
|
25
25
|
"repository": {
|
|
26
26
|
"type": "git",
|