assertloom 0.0.0-stage → 0.2.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/LICENSE +21 -0
- package/README.md +393 -2
- package/dist/ai/anthropic.d.ts +11 -0
- package/dist/ai/anthropic.js +68 -0
- package/dist/ai/anthropic.js.map +1 -0
- package/dist/ai/index.d.ts +12 -0
- package/dist/ai/index.js +23 -0
- package/dist/ai/index.js.map +1 -0
- package/dist/ai/openai.d.ts +9 -0
- package/dist/ai/openai.js +57 -0
- package/dist/ai/openai.js.map +1 -0
- package/dist/ai/openaiCompatible.d.ts +13 -0
- package/dist/ai/openaiCompatible.js +62 -0
- package/dist/ai/openaiCompatible.js.map +1 -0
- package/dist/ai/pricing.d.ts +38 -0
- package/dist/ai/pricing.js +105 -0
- package/dist/ai/pricing.js.map +1 -0
- package/dist/ai/prompts.d.ts +27 -0
- package/dist/ai/prompts.js +89 -0
- package/dist/ai/prompts.js.map +1 -0
- package/dist/ai/provider.d.ts +26 -0
- package/dist/ai/provider.js +4 -0
- package/dist/ai/provider.js.map +1 -0
- package/dist/ai/redact.d.ts +5 -0
- package/dist/ai/redact.js +31 -0
- package/dist/ai/redact.js.map +1 -0
- package/dist/analyzer/dependencies.d.ts +16 -0
- package/dist/analyzer/dependencies.js +168 -0
- package/dist/analyzer/dependencies.js.map +1 -0
- package/dist/analyzer/format.d.ts +3 -0
- package/dist/analyzer/format.js +14 -0
- package/dist/analyzer/format.js.map +1 -0
- package/dist/analyzer/functions.d.ts +4 -0
- package/dist/analyzer/functions.js +324 -0
- package/dist/analyzer/functions.js.map +1 -0
- package/dist/analyzer/index.d.ts +5 -0
- package/dist/analyzer/index.js +29 -0
- package/dist/analyzer/index.js.map +1 -0
- package/dist/analyzer/parser.d.ts +11 -0
- package/dist/analyzer/parser.js +38 -0
- package/dist/analyzer/parser.js.map +1 -0
- package/dist/analyzer/usage.d.ts +16 -0
- package/dist/analyzer/usage.js +159 -0
- package/dist/analyzer/usage.js.map +1 -0
- package/dist/ci/report.d.ts +88 -0
- package/dist/ci/report.js +139 -0
- package/dist/ci/report.js.map +1 -0
- package/dist/ci/run.d.ts +70 -0
- package/dist/ci/run.js +198 -0
- package/dist/ci/run.js.map +1 -0
- package/dist/ci/select.d.ts +58 -0
- package/dist/ci/select.js +238 -0
- package/dist/ci/select.js.map +1 -0
- package/dist/cli/commands/analyze.d.ts +2 -0
- package/dist/cli/commands/analyze.js +49 -0
- package/dist/cli/commands/analyze.js.map +1 -0
- package/dist/cli/commands/ci.d.ts +37 -0
- package/dist/cli/commands/ci.js +258 -0
- package/dist/cli/commands/ci.js.map +1 -0
- package/dist/cli/commands/generate.d.ts +3 -0
- package/dist/cli/commands/generate.js +201 -0
- package/dist/cli/commands/generate.js.map +1 -0
- package/dist/cli/commands/run.d.ts +4 -0
- package/dist/cli/commands/run.js +53 -0
- package/dist/cli/commands/run.js.map +1 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.js +16 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/program.d.ts +2 -0
- package/dist/cli/program.js +20 -0
- package/dist/cli/program.js.map +1 -0
- package/dist/cli/report.d.ts +3 -0
- package/dist/cli/report.js +36 -0
- package/dist/cli/report.js.map +1 -0
- package/dist/cli/validateFile.d.ts +5 -0
- package/dist/cli/validateFile.js +43 -0
- package/dist/cli/validateFile.js.map +1 -0
- package/dist/errors.d.ts +4 -0
- package/dist/errors.js +8 -0
- package/dist/errors.js.map +1 -0
- package/dist/generator/diff.d.ts +5 -0
- package/dist/generator/diff.js +56 -0
- package/dist/generator/diff.js.map +1 -0
- package/dist/generator/importPlan.d.ts +15 -0
- package/dist/generator/importPlan.js +62 -0
- package/dist/generator/importPlan.js.map +1 -0
- package/dist/generator/index.d.ts +5 -0
- package/dist/generator/index.js +6 -0
- package/dist/generator/index.js.map +1 -0
- package/dist/generator/mocks.d.ts +48 -0
- package/dist/generator/mocks.js +356 -0
- package/dist/generator/mocks.js.map +1 -0
- package/dist/generator/schema.d.ts +40 -0
- package/dist/generator/schema.js +15 -0
- package/dist/generator/schema.js.map +1 -0
- package/dist/generator/testGenerator.d.ts +36 -0
- package/dist/generator/testGenerator.js +85 -0
- package/dist/generator/testGenerator.js.map +1 -0
- package/dist/generator/testWriter.d.ts +22 -0
- package/dist/generator/testWriter.js +93 -0
- package/dist/generator/testWriter.js.map +1 -0
- package/dist/generator/validate.d.ts +31 -0
- package/dist/generator/validate.js +180 -0
- package/dist/generator/validate.js.map +1 -0
- package/dist/repair/classifyFailure.d.ts +11 -0
- package/dist/repair/classifyFailure.js +26 -0
- package/dist/repair/classifyFailure.js.map +1 -0
- package/dist/repair/index.d.ts +2 -0
- package/dist/repair/index.js +3 -0
- package/dist/repair/index.js.map +1 -0
- package/dist/repair/repairLoop.d.ts +74 -0
- package/dist/repair/repairLoop.js +219 -0
- package/dist/repair/repairLoop.js.map +1 -0
- package/dist/repair/schema.d.ts +17 -0
- package/dist/repair/schema.js +14 -0
- package/dist/repair/schema.js.map +1 -0
- package/dist/runner/coverage.d.ts +5 -0
- package/dist/runner/coverage.js +42 -0
- package/dist/runner/coverage.js.map +1 -0
- package/dist/runner/index.d.ts +5 -0
- package/dist/runner/index.js +5 -0
- package/dist/runner/index.js.map +1 -0
- package/dist/runner/jestConfig.d.ts +11 -0
- package/dist/runner/jestConfig.js +103 -0
- package/dist/runner/jestConfig.js.map +1 -0
- package/dist/runner/jestRunner.d.ts +17 -0
- package/dist/runner/jestRunner.js +154 -0
- package/dist/runner/jestRunner.js.map +1 -0
- package/dist/runner/networkGuard.d.ts +4 -0
- package/dist/runner/networkGuard.js +55 -0
- package/dist/runner/networkGuard.js.map +1 -0
- package/dist/runner/project.d.ts +30 -0
- package/dist/runner/project.js +86 -0
- package/dist/runner/project.js.map +1 -0
- package/dist/runner/results.d.ts +32 -0
- package/dist/runner/results.js +58 -0
- package/dist/runner/results.js.map +1 -0
- package/dist/runner/types.d.ts +39 -0
- package/dist/runner/types.js +2 -0
- package/dist/runner/types.js.map +1 -0
- package/dist/runner/vitest.d.ts +24 -0
- package/dist/runner/vitest.js +105 -0
- package/dist/runner/vitest.js.map +1 -0
- package/dist/types/index.d.ts +96 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -0
- package/package.json +67 -4
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
import traverse from "@babel/traverse";
|
|
2
|
+
/** Globals Assertloom replaces with mocks when the source uses them. */
|
|
3
|
+
export const MOCKABLE_GLOBALS = ["fetch"];
|
|
4
|
+
const MAX_DEPTH = 6;
|
|
5
|
+
export function emptyShape() {
|
|
6
|
+
return { called: false, constructed: false, instanceOf: false, members: {}, resultNames: [], createdAtLoad: false };
|
|
7
|
+
}
|
|
8
|
+
/** True for a reference to a mockable global that the code does not declare itself. */
|
|
9
|
+
export function isMockableGlobal(path) {
|
|
10
|
+
if (!path.isReferencedIdentifier() || path.node.type !== "Identifier")
|
|
11
|
+
return false;
|
|
12
|
+
const name = path.node.name;
|
|
13
|
+
return MOCKABLE_GLOBALS.includes(name) && !path.scope.hasBinding(name, { noGlobals: true });
|
|
14
|
+
}
|
|
15
|
+
function memberName(node) {
|
|
16
|
+
if (node.type !== "MemberExpression" && node.type !== "OptionalMemberExpression")
|
|
17
|
+
return undefined;
|
|
18
|
+
if (!node.computed && node.property.type === "Identifier")
|
|
19
|
+
return node.property.name;
|
|
20
|
+
if (node.property.type === "StringLiteral")
|
|
21
|
+
return node.property.value;
|
|
22
|
+
return undefined;
|
|
23
|
+
}
|
|
24
|
+
const TRANSPARENT = new Set(["TSNonNullExpression", "TSAsExpression", "TSSatisfiesExpression", "ParenthesizedExpression"]);
|
|
25
|
+
/** Records how the expression at `path`, whose value is described by `shape`, is used. */
|
|
26
|
+
function follow(path, shape, depth) {
|
|
27
|
+
if (depth > MAX_DEPTH)
|
|
28
|
+
return;
|
|
29
|
+
let current = path;
|
|
30
|
+
let cur = shape;
|
|
31
|
+
for (;;) {
|
|
32
|
+
const parent = current.parentPath;
|
|
33
|
+
if (!parent)
|
|
34
|
+
return;
|
|
35
|
+
const node = parent.node;
|
|
36
|
+
if (TRANSPARENT.has(node.type)) {
|
|
37
|
+
current = parent;
|
|
38
|
+
continue;
|
|
39
|
+
}
|
|
40
|
+
if ((node.type === "MemberExpression" || node.type === "OptionalMemberExpression") && node.object === current.node) {
|
|
41
|
+
const name = memberName(node);
|
|
42
|
+
if (!name)
|
|
43
|
+
return;
|
|
44
|
+
cur = cur.members[name] ??= emptyShape();
|
|
45
|
+
current = parent;
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
const isCall = (node.type === "CallExpression" || node.type === "OptionalCallExpression") && node.callee === current.node;
|
|
49
|
+
const isNew = node.type === "NewExpression" && node.callee === current.node;
|
|
50
|
+
if (isCall || isNew) {
|
|
51
|
+
if (isCall)
|
|
52
|
+
cur.called = true;
|
|
53
|
+
else
|
|
54
|
+
cur.constructed = true;
|
|
55
|
+
let resultPath = parent;
|
|
56
|
+
if (resultPath.parentPath?.isAwaitExpression())
|
|
57
|
+
resultPath = resultPath.parentPath;
|
|
58
|
+
const declarator = resultPath.parentPath;
|
|
59
|
+
if (declarator?.isVariableDeclarator() && declarator.node.init === resultPath.node && declarator.node.id.type === "Identifier") {
|
|
60
|
+
const name = declarator.node.id.name;
|
|
61
|
+
const result = (cur.result ??= emptyShape());
|
|
62
|
+
if (!cur.resultNames.includes(name))
|
|
63
|
+
cur.resultNames.push(name);
|
|
64
|
+
if (declarator.scope.block.type === "Program")
|
|
65
|
+
cur.createdAtLoad = true;
|
|
66
|
+
for (const ref of declarator.scope.getBinding(name)?.referencePaths ?? [])
|
|
67
|
+
follow(ref, result, depth + 1);
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
const next = resultPath.parentPath?.node;
|
|
71
|
+
if (next && (next.type === "MemberExpression" || next.type === "OptionalMemberExpression") && next.object === resultPath.node) {
|
|
72
|
+
cur = cur.result ??= emptyShape();
|
|
73
|
+
current = resultPath;
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
if (node.type === "BinaryExpression" && node.operator === "instanceof" && node.right === current.node) {
|
|
79
|
+
cur.instanceOf = true;
|
|
80
|
+
}
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
function stringValue(node) {
|
|
85
|
+
if (node?.type === "StringLiteral")
|
|
86
|
+
return node.value;
|
|
87
|
+
if (node?.type === "TemplateLiteral" && node.expressions.length === 0)
|
|
88
|
+
return node.quasis[0].value.cooked ?? undefined;
|
|
89
|
+
return undefined;
|
|
90
|
+
}
|
|
91
|
+
function propertyKey(node) {
|
|
92
|
+
if (node.type === "Identifier")
|
|
93
|
+
return node.name;
|
|
94
|
+
if (node.type === "StringLiteral")
|
|
95
|
+
return node.value;
|
|
96
|
+
return undefined;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Finds every runtime binding created by `import` or `require()` and records how the code uses it
|
|
100
|
+
* (calls, `new`, member access, stored results), plus references to mockable globals.
|
|
101
|
+
*/
|
|
102
|
+
export function collectImportUsage(ast) {
|
|
103
|
+
const importUsage = [];
|
|
104
|
+
const globals = new Set();
|
|
105
|
+
const track = (entry, binding) => {
|
|
106
|
+
const shape = emptyShape();
|
|
107
|
+
for (const ref of binding?.referencePaths ?? [])
|
|
108
|
+
follow(ref, shape, 0);
|
|
109
|
+
importUsage.push({ ...entry, shape });
|
|
110
|
+
};
|
|
111
|
+
traverse(ast, {
|
|
112
|
+
ImportDeclaration(path) {
|
|
113
|
+
if (path.node.importKind === "type" || path.node.importKind === "typeof")
|
|
114
|
+
return;
|
|
115
|
+
const source = path.node.source.value;
|
|
116
|
+
for (const s of path.node.specifiers) {
|
|
117
|
+
if (s.type === "ImportSpecifier" && (s.importKind === "type" || s.importKind === "typeof"))
|
|
118
|
+
continue;
|
|
119
|
+
const imported = s.type === "ImportDefaultSpecifier" ? "default" : s.type === "ImportNamespaceSpecifier" ? "*" : propertyKey(s.imported) ?? "";
|
|
120
|
+
track({ source, local: s.local.name, imported, style: "esm" }, path.scope.getBinding(s.local.name));
|
|
121
|
+
}
|
|
122
|
+
},
|
|
123
|
+
CallExpression(path) {
|
|
124
|
+
const callee = path.node.callee;
|
|
125
|
+
if (callee.type !== "Identifier" || callee.name !== "require" || path.scope.hasBinding("require"))
|
|
126
|
+
return;
|
|
127
|
+
const source = stringValue(path.node.arguments[0]);
|
|
128
|
+
if (!source)
|
|
129
|
+
return;
|
|
130
|
+
const declarator = path.parentPath;
|
|
131
|
+
if (declarator.isVariableDeclarator() && declarator.node.init === path.node) {
|
|
132
|
+
const id = declarator.node.id;
|
|
133
|
+
if (id.type === "Identifier") {
|
|
134
|
+
track({ source, local: id.name, imported: "*", style: "commonjs" }, declarator.scope.getBinding(id.name));
|
|
135
|
+
}
|
|
136
|
+
else if (id.type === "ObjectPattern") {
|
|
137
|
+
for (const prop of id.properties) {
|
|
138
|
+
if (prop.type !== "ObjectProperty" || prop.value.type !== "Identifier")
|
|
139
|
+
continue;
|
|
140
|
+
const imported = propertyKey(prop.key);
|
|
141
|
+
if (imported)
|
|
142
|
+
track({ source, local: prop.value.name, imported, style: "commonjs" }, declarator.scope.getBinding(prop.value.name));
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
// `require("x").get(...)`: follow the call itself.
|
|
148
|
+
const shape = emptyShape();
|
|
149
|
+
follow(path, shape, 0);
|
|
150
|
+
importUsage.push({ source, local: "", imported: "*", style: "commonjs", shape });
|
|
151
|
+
},
|
|
152
|
+
Identifier(path) {
|
|
153
|
+
if (isMockableGlobal(path))
|
|
154
|
+
globals.add(path.node.name);
|
|
155
|
+
},
|
|
156
|
+
});
|
|
157
|
+
return { importUsage, globals: [...globals].sort() };
|
|
158
|
+
}
|
|
159
|
+
//# sourceMappingURL=usage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usage.js","sourceRoot":"","sources":["../../src/analyzer/usage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import type { FileReport } from "./run.js";
|
|
2
|
+
export declare const FAIL_ON: readonly ["never", "errors", "tests"];
|
|
3
|
+
export type FailOn = (typeof FAIL_ON)[number];
|
|
4
|
+
export interface CiReport {
|
|
5
|
+
schemaVersion: 1;
|
|
6
|
+
assertloom: string;
|
|
7
|
+
startedAt: string;
|
|
8
|
+
finishedAt: string;
|
|
9
|
+
mode: "pull-request" | "files";
|
|
10
|
+
base?: string;
|
|
11
|
+
head?: string;
|
|
12
|
+
provider: string;
|
|
13
|
+
model: string;
|
|
14
|
+
limits: {
|
|
15
|
+
maxFiles: number;
|
|
16
|
+
maxCostUsd: number | null;
|
|
17
|
+
maxTokens: number | null;
|
|
18
|
+
maxAttempts: number;
|
|
19
|
+
timeoutSeconds: number;
|
|
20
|
+
};
|
|
21
|
+
budget: {
|
|
22
|
+
exhausted: boolean;
|
|
23
|
+
costKnown: boolean;
|
|
24
|
+
spentUsd: number | null;
|
|
25
|
+
tokens: {
|
|
26
|
+
input: number;
|
|
27
|
+
output: number;
|
|
28
|
+
};
|
|
29
|
+
};
|
|
30
|
+
totals: Totals;
|
|
31
|
+
policy: {
|
|
32
|
+
failOn: FailOn;
|
|
33
|
+
failed: boolean;
|
|
34
|
+
reasons: string[];
|
|
35
|
+
};
|
|
36
|
+
files: FileReport[];
|
|
37
|
+
/** Set when the run stopped before every file was handled. */
|
|
38
|
+
error?: string;
|
|
39
|
+
}
|
|
40
|
+
export interface Totals {
|
|
41
|
+
files: {
|
|
42
|
+
changed: number;
|
|
43
|
+
selected: number;
|
|
44
|
+
processed: number;
|
|
45
|
+
skipped: number;
|
|
46
|
+
failed: number;
|
|
47
|
+
};
|
|
48
|
+
tests: {
|
|
49
|
+
generated: number;
|
|
50
|
+
accepted: number;
|
|
51
|
+
rejected: number;
|
|
52
|
+
initial: {
|
|
53
|
+
passed: number;
|
|
54
|
+
failed: number;
|
|
55
|
+
skipped: number;
|
|
56
|
+
};
|
|
57
|
+
final: {
|
|
58
|
+
passed: number;
|
|
59
|
+
failed: number;
|
|
60
|
+
skipped: number;
|
|
61
|
+
};
|
|
62
|
+
repaired: number;
|
|
63
|
+
flaggedAsSourceBugs: number;
|
|
64
|
+
removed: number;
|
|
65
|
+
gaveUp: number;
|
|
66
|
+
};
|
|
67
|
+
regressions: number;
|
|
68
|
+
infrastructureFailures: number;
|
|
69
|
+
durationMs: number;
|
|
70
|
+
}
|
|
71
|
+
export declare function computeTotals(files: FileReport[]): Totals;
|
|
72
|
+
/**
|
|
73
|
+
* `errors`: fail if any selected file could not be processed (generation error, tests that could not run, timeout).
|
|
74
|
+
* `tests`: also fail unless every generated test passes, with none skipped or removed by repair.
|
|
75
|
+
* `never`: only configuration errors fail the run.
|
|
76
|
+
*/
|
|
77
|
+
export declare function evaluatePolicy(failOn: FailOn, files: FileReport[]): {
|
|
78
|
+
failed: boolean;
|
|
79
|
+
reasons: string[];
|
|
80
|
+
};
|
|
81
|
+
/**
|
|
82
|
+
* Removes credentials from text that leaves the process (reports, summaries, logs): the exact values of the
|
|
83
|
+
* configured secrets, plus anything that looks like a key or token.
|
|
84
|
+
*/
|
|
85
|
+
export declare function createRedactor(secrets: Array<string | undefined>): (text: string) => string;
|
|
86
|
+
/** Escapes untrusted text (file names, error messages) for a Markdown table cell. Not for code spans, which show entities literally. */
|
|
87
|
+
export declare function cell(text: string): string;
|
|
88
|
+
export declare function renderSummary(report: CiReport): string;
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import { formatUsd } from "../ai/pricing.js";
|
|
2
|
+
import { redactSecrets } from "../ai/redact.js";
|
|
3
|
+
export const FAIL_ON = ["never", "errors", "tests"];
|
|
4
|
+
const sum = (values) => values.reduce((a, b) => a + b, 0);
|
|
5
|
+
/** Skip reasons decided after a file passed selection. */
|
|
6
|
+
const LATE_SKIPS = new Set(["file-limit", "budget", "no-exported-functions", "preview-exists", "dry-run", "not-processed"]);
|
|
7
|
+
export function computeTotals(files) {
|
|
8
|
+
const ran = files.filter((f) => f.initial && f.final);
|
|
9
|
+
return {
|
|
10
|
+
files: {
|
|
11
|
+
changed: files.length,
|
|
12
|
+
selected: files.filter((f) => f.status !== "skipped" || LATE_SKIPS.has(f.skipReason ?? "")).length,
|
|
13
|
+
processed: files.filter((f) => f.status === "processed").length,
|
|
14
|
+
skipped: files.filter((f) => f.status === "skipped").length,
|
|
15
|
+
failed: files.filter((f) => f.status === "failed").length,
|
|
16
|
+
},
|
|
17
|
+
tests: {
|
|
18
|
+
generated: sum(files.map((f) => f.generated)),
|
|
19
|
+
accepted: sum(files.map((f) => f.accepted)),
|
|
20
|
+
rejected: sum(files.map((f) => f.rejected)),
|
|
21
|
+
initial: {
|
|
22
|
+
passed: sum(ran.map((f) => f.initial.passed)),
|
|
23
|
+
failed: sum(ran.map((f) => f.initial.failed)),
|
|
24
|
+
skipped: sum(ran.map((f) => f.initial.skipped)),
|
|
25
|
+
},
|
|
26
|
+
final: {
|
|
27
|
+
passed: sum(ran.map((f) => f.final.passed)),
|
|
28
|
+
failed: sum(ran.map((f) => f.final.failed)),
|
|
29
|
+
skipped: sum(ran.map((f) => f.final.skipped)),
|
|
30
|
+
},
|
|
31
|
+
repaired: sum(files.map((f) => f.repaired)),
|
|
32
|
+
flaggedAsSourceBugs: sum(files.map((f) => f.flaggedAsSourceBugs)),
|
|
33
|
+
removed: sum(files.map((f) => f.removed)),
|
|
34
|
+
gaveUp: sum(files.map((f) => f.gaveUp)),
|
|
35
|
+
},
|
|
36
|
+
regressions: sum(files.map((f) => f.regressions)),
|
|
37
|
+
infrastructureFailures: files.filter((f) => f.infra).length,
|
|
38
|
+
durationMs: sum(files.map((f) => f.durationMs)),
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* `errors`: fail if any selected file could not be processed (generation error, tests that could not run, timeout).
|
|
43
|
+
* `tests`: also fail unless every generated test passes, with none skipped or removed by repair.
|
|
44
|
+
* `never`: only configuration errors fail the run.
|
|
45
|
+
*/
|
|
46
|
+
export function evaluatePolicy(failOn, files) {
|
|
47
|
+
const reasons = [];
|
|
48
|
+
if (failOn === "never")
|
|
49
|
+
return { failed: false, reasons };
|
|
50
|
+
const failed = files.filter((f) => f.status === "failed");
|
|
51
|
+
if (failed.length)
|
|
52
|
+
reasons.push(`${failed.length} file${failed.length === 1 ? "" : "s"} could not be processed`);
|
|
53
|
+
if (failOn === "tests") {
|
|
54
|
+
const notPassing = files.filter((f) => f.status === "processed" && f.final && (f.final.failed > 0 || f.final.skipped > 0 || f.removed > 0 || f.final.status !== "passed"));
|
|
55
|
+
if (notPassing.length)
|
|
56
|
+
reasons.push(`${notPassing.length} file${notPassing.length === 1 ? "" : "s"} ended with failing, skipped, or removed tests`);
|
|
57
|
+
}
|
|
58
|
+
return { failed: reasons.length > 0, reasons };
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Removes credentials from text that leaves the process (reports, summaries, logs): the exact values of the
|
|
62
|
+
* configured secrets, plus anything that looks like a key or token.
|
|
63
|
+
*/
|
|
64
|
+
export function createRedactor(secrets) {
|
|
65
|
+
const values = [...new Set(secrets.filter((s) => !!s && s.length >= 6))].sort((a, b) => b.length - a.length);
|
|
66
|
+
return (text) => {
|
|
67
|
+
let result = text;
|
|
68
|
+
for (const value of values)
|
|
69
|
+
result = result.split(value).join("<redacted>");
|
|
70
|
+
return redactSecrets(result).code;
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
/** Escapes untrusted text (file names, error messages) for a Markdown table cell. Not for code spans, which show entities literally. */
|
|
74
|
+
export function cell(text) {
|
|
75
|
+
return text
|
|
76
|
+
.replace(/[\r\n]+/g, " ")
|
|
77
|
+
.replace(/[\\`*_[\]<>|#!~&]/g, (c) => `&#${c.charCodeAt(0)};`)
|
|
78
|
+
.slice(0, 300);
|
|
79
|
+
}
|
|
80
|
+
const pct = (value) => (value === null || value === undefined ? "–" : `${Math.round(value * 10) / 10}%`);
|
|
81
|
+
const seconds = (ms) => `${(ms / 1000).toFixed(1)}s`;
|
|
82
|
+
const counts = (s) => (s ? `${s.passed} / ${s.failed} / ${s.skipped}` : "–");
|
|
83
|
+
const SKIP_LABELS = {
|
|
84
|
+
deleted: "deleted",
|
|
85
|
+
unsupported: "unsupported type",
|
|
86
|
+
excluded: "excluded",
|
|
87
|
+
"not-included": "not included",
|
|
88
|
+
generated: "generated file",
|
|
89
|
+
"not-a-file": "not a regular file",
|
|
90
|
+
"outside-workspace": "outside the repository",
|
|
91
|
+
"too-large": "too large",
|
|
92
|
+
"file-limit": "file limit reached",
|
|
93
|
+
budget: "budget exhausted",
|
|
94
|
+
"no-exported-functions": "no exported functions",
|
|
95
|
+
"preview-exists": "preview file already exists",
|
|
96
|
+
"dry-run": "eligible (dry run)",
|
|
97
|
+
"not-processed": "eligible, not reached",
|
|
98
|
+
};
|
|
99
|
+
export function renderSummary(report) {
|
|
100
|
+
const t = report.totals;
|
|
101
|
+
const lines = [];
|
|
102
|
+
const verdict = report.error
|
|
103
|
+
? "⚠️ Stopped early"
|
|
104
|
+
: report.policy.failed
|
|
105
|
+
? `❌ Failed (fail-on: ${report.policy.failOn})`
|
|
106
|
+
: `✅ Completed (fail-on: ${report.policy.failOn})`;
|
|
107
|
+
lines.push(`## Assertloom: generated tests for changed files`, "");
|
|
108
|
+
lines.push(`**${verdict}.** Generated tests are previews for review. A completed run does not mean every generated test passed.`, "");
|
|
109
|
+
if (report.error)
|
|
110
|
+
lines.push(`> **Error:** ${cell(report.error)}`, "");
|
|
111
|
+
for (const reason of report.policy.reasons)
|
|
112
|
+
lines.push(`- ${cell(reason)}`);
|
|
113
|
+
if (report.policy.reasons.length)
|
|
114
|
+
lines.push("");
|
|
115
|
+
if (report.budget.exhausted)
|
|
116
|
+
lines.push("> **Budget exhausted.** The shared spending limit was reached; remaining files were not processed.", "");
|
|
117
|
+
const cost = report.budget.costKnown && report.budget.spentUsd !== null ? `≈${formatUsd(report.budget.spentUsd)}` : "unknown (no price for this model)";
|
|
118
|
+
lines.push("| | |", "| --- | --- |", `| Files | ${t.files.changed} changed, ${t.files.selected} selected, ${t.files.processed} processed, ${t.files.skipped} skipped, ${t.files.failed} failed |`, `| Test cases | ${t.tests.generated} generated, ${t.tests.accepted} accepted, ${t.tests.rejected} rejected by validation |`, `| First run (passed / failed / skipped) | ${counts(t.tests.initial)} |`, `| Final run (passed / failed / skipped) | ${counts(t.tests.final)} |`, `| Repair | repaired: ${t.tests.repaired}; skipped as suspected source bugs: ${t.tests.flaggedAsSourceBugs}; skipped after repair gave up: ${t.tests.gaveUp}; removed: ${t.tests.removed} |`, `| Regressions (reverted repair rounds) | ${t.regressions} |`, `| Infrastructure failures | ${t.infrastructureFailures} |`, `| Runtime | ${seconds(t.durationMs)} |`, `| Model | ${report.model ? `${cell(report.model)} (${cell(report.provider)})` : "none (no model was called)"} |`, `| Tokens (in / out) | ${report.budget.tokens.input.toLocaleString("en-US")} / ${report.budget.tokens.output.toLocaleString("en-US")} |`, `| Estimated cost | ${cost} |`, "");
|
|
119
|
+
const evaluated = report.files.filter((f) => f.status !== "skipped" || f.generated > 0);
|
|
120
|
+
if (evaluated.length) {
|
|
121
|
+
lines.push("### Files", "", "| File | Status | Cases | First run | Final run | Repaired | Skipped / removed | Lines | Branches | Time | Cost |", "| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |");
|
|
122
|
+
for (const f of evaluated) {
|
|
123
|
+
const status = f.status === "processed" ? "processed" : `${f.status}: ${cell(f.detail ?? "")}`;
|
|
124
|
+
const fileCost = f.costUsd === null ? (f.usage.inputTokens + f.usage.outputTokens > 0 ? "unknown" : "–") : formatUsd(f.costUsd);
|
|
125
|
+
lines.push(`| ${cell(f.path)} | ${status} | ${f.accepted}/${f.generated} | ${counts(f.initial)} | ${counts(f.final)} | ${f.repaired} | ${f.flaggedAsSourceBugs + f.gaveUp} / ${f.removed} | ${pct(f.final?.coverage?.lines)} | ${pct(f.final?.coverage?.branches)} | ${seconds(f.durationMs)} | ${fileCost} |`);
|
|
126
|
+
}
|
|
127
|
+
lines.push("");
|
|
128
|
+
}
|
|
129
|
+
const skipped = report.files.filter((f) => f.status === "skipped" && f.generated === 0);
|
|
130
|
+
if (skipped.length) {
|
|
131
|
+
lines.push("<details><summary>Skipped files (" + skipped.length + ")</summary>", "", "| File | Reason |", "| --- | --- |");
|
|
132
|
+
for (const f of skipped)
|
|
133
|
+
lines.push(`| ${cell(f.path)} | ${cell(SKIP_LABELS[f.skipReason ?? ""] ?? f.skipReason ?? "")} |`);
|
|
134
|
+
lines.push("", "</details>", "");
|
|
135
|
+
}
|
|
136
|
+
lines.push("Generated tests, `report.json`, and this summary are in the workflow artifact. Nothing was committed or pushed.", "");
|
|
137
|
+
return lines.join("\n");
|
|
138
|
+
}
|
|
139
|
+
//# sourceMappingURL=report.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report.js","sourceRoot":"","sources":["../../src/ci/report.ts"],"names":[],"mappings":"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"}
|
package/dist/ci/run.d.ts
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { type Budget } from "../ai/pricing.js";
|
|
2
|
+
import type { LLMProvider, TokenUsage } from "../ai/provider.js";
|
|
3
|
+
import type { RunSummary } from "../repair/repairLoop.js";
|
|
4
|
+
import { type RunResult } from "../runner/index.js";
|
|
5
|
+
import type { Candidate, ChangedFile, SkipReason } from "./select.js";
|
|
6
|
+
export interface FileReport {
|
|
7
|
+
path: string;
|
|
8
|
+
from?: string;
|
|
9
|
+
change: ChangedFile["status"];
|
|
10
|
+
status: "processed" | "skipped" | "failed";
|
|
11
|
+
skipReason?: SkipReason;
|
|
12
|
+
/** Why the file was skipped or failed. */
|
|
13
|
+
detail?: string;
|
|
14
|
+
generated: number;
|
|
15
|
+
accepted: number;
|
|
16
|
+
rejected: number;
|
|
17
|
+
initial?: RunSummary;
|
|
18
|
+
final?: RunSummary;
|
|
19
|
+
/** Tests that failed on the first run and pass at the end. Skips and removals are counted separately. */
|
|
20
|
+
repaired: number;
|
|
21
|
+
/** Tests the model marked `it.skip` as suspected source bugs. */
|
|
22
|
+
flaggedAsSourceBugs: number;
|
|
23
|
+
/** Tests removed by repair because they could not be made reliable. */
|
|
24
|
+
removed: number;
|
|
25
|
+
/** Tests still failing after repair, kept as `it.skip`. */
|
|
26
|
+
gaveUp: number;
|
|
27
|
+
repairRounds: number;
|
|
28
|
+
/** Repair rounds that broke passing tests and were reverted. */
|
|
29
|
+
regressions: number;
|
|
30
|
+
stopReason?: string;
|
|
31
|
+
infra?: {
|
|
32
|
+
kind: string;
|
|
33
|
+
message: string;
|
|
34
|
+
};
|
|
35
|
+
durationMs: number;
|
|
36
|
+
usage: TokenUsage;
|
|
37
|
+
costUsd: number | null;
|
|
38
|
+
/** Path of the generated tests inside the artifact directory. */
|
|
39
|
+
artifact?: string;
|
|
40
|
+
}
|
|
41
|
+
export interface RunFilesOptions {
|
|
42
|
+
/** Repository root; candidate paths are relative to it. */
|
|
43
|
+
root: string;
|
|
44
|
+
candidates: Candidate[];
|
|
45
|
+
provider: LLMProvider;
|
|
46
|
+
/** One budget shared by every model call in the run. */
|
|
47
|
+
budget: Budget;
|
|
48
|
+
maxFiles: number;
|
|
49
|
+
maxAttempts: number;
|
|
50
|
+
/** Time limit for each Jest run. */
|
|
51
|
+
timeoutMs: number;
|
|
52
|
+
/** Where generated tests are copied for review. */
|
|
53
|
+
testsDir: string;
|
|
54
|
+
/** Called after every file, so partial results survive a crash or cancellation. */
|
|
55
|
+
onProgress?: (files: FileReport[]) => Promise<void>;
|
|
56
|
+
/** For tests: replaces Jest. */
|
|
57
|
+
runTests?: (testPath: string, sourcePath: string) => Promise<RunResult>;
|
|
58
|
+
log?: (line: string) => void;
|
|
59
|
+
}
|
|
60
|
+
export interface RunFilesResult {
|
|
61
|
+
files: FileReport[];
|
|
62
|
+
budgetExhausted: boolean;
|
|
63
|
+
}
|
|
64
|
+
/** Tests that failed in the first run and pass in the final run. */
|
|
65
|
+
export declare function countRepaired(initial: RunResult, final: RunResult): number;
|
|
66
|
+
/**
|
|
67
|
+
* Generates, runs, and repairs tests for each eligible file in turn, with one shared budget.
|
|
68
|
+
* Never writes outside generated preview files, which are removed from the tree once copied to `testsDir`.
|
|
69
|
+
*/
|
|
70
|
+
export declare function runFiles(options: RunFilesOptions): Promise<RunFilesResult>;
|