greenbump 0.4.0 → 0.6.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/README.md +673 -66
- package/README.zh-CN.md +525 -100
- package/dist/agent/fixer.js +161 -12
- package/dist/agent/fixer.js.map +1 -1
- package/dist/agent/fixer.test.js +410 -0
- package/dist/agent/fixer.test.js.map +1 -0
- package/dist/cli/interactive.js +81 -0
- package/dist/cli/interactive.js.map +1 -0
- package/dist/cli.js +53 -0
- package/dist/cli.js.map +1 -1
- package/dist/engine/analyzers/changelog-parser.js +121 -0
- package/dist/engine/analyzers/changelog-parser.js.map +1 -0
- package/dist/engine/batch.test.js +59 -0
- package/dist/engine/batch.test.js.map +1 -0
- package/dist/engine/cache/manager.js +165 -0
- package/dist/engine/cache/manager.js.map +1 -0
- package/dist/engine/cache/manager.test.js +75 -0
- package/dist/engine/cache/manager.test.js.map +1 -0
- package/dist/engine/checks.test.js +92 -0
- package/dist/engine/checks.test.js.map +1 -0
- package/dist/engine/context/optimizer.js +189 -0
- package/dist/engine/context/optimizer.js.map +1 -0
- package/dist/engine/context/optimizer.test.js +81 -0
- package/dist/engine/context/optimizer.test.js.map +1 -0
- package/dist/engine/ecosystems/parsers.test.js +255 -0
- package/dist/engine/ecosystems/parsers.test.js.map +1 -0
- package/dist/engine/fixer/patterns.js +356 -0
- package/dist/engine/fixer/patterns.js.map +1 -0
- package/dist/engine/fixer/patterns.test.js +124 -0
- package/dist/engine/fixer/patterns.test.js.map +1 -0
- package/dist/engine/git.js +1 -0
- package/dist/engine/git.js.map +1 -1
- package/dist/engine/git.test.js +111 -0
- package/dist/engine/git.test.js.map +1 -0
- package/dist/engine/perf/metrics.js +171 -0
- package/dist/engine/perf/metrics.js.map +1 -0
- package/dist/engine/perf/regression.js +115 -0
- package/dist/engine/perf/regression.js.map +1 -0
- package/dist/engine/run.js +93 -2
- package/dist/engine/run.js.map +1 -1
- package/dist/engine/run.test.js +47 -0
- package/dist/engine/run.test.js.map +1 -0
- package/dist/engine/sandbox/docker-manager.js +215 -0
- package/dist/engine/sandbox/docker-manager.js.map +1 -0
- package/dist/engine/sandbox/orchestrator.js +107 -0
- package/dist/engine/sandbox/orchestrator.js.map +1 -0
- package/dist/engine/sandbox/service-detector.js +147 -0
- package/dist/engine/sandbox/service-detector.js.map +1 -0
- package/dist/engine/sandbox/template-generator.js +241 -0
- package/dist/engine/sandbox/template-generator.js.map +1 -0
- package/dist/engine/verifiers/ast-analyzer.js +212 -0
- package/dist/engine/verifiers/ast-analyzer.js.map +1 -0
- package/dist/engine/verifiers/ast-analyzer.test.js +96 -0
- package/dist/engine/verifiers/ast-analyzer.test.js.map +1 -0
- package/dist/engine/workspace.test.js +95 -0
- package/dist/engine/workspace.test.js.map +1 -0
- package/dist/exitcode.test.js +62 -0
- package/dist/exitcode.test.js.map +1 -0
- package/dist/format.js +15 -0
- package/dist/format.js.map +1 -1
- package/dist/report.test.js +56 -0
- package/dist/report.test.js.map +1 -0
- package/package.json +7 -4
- package/CHANGELOG.md +0 -93
- package/CONTRIBUTING.md +0 -52
- package/SECURITY.md +0 -38
- package/action-dist/index.cjs +0 -19935
- package/action.yml +0 -76
- package/competitive-analysis.md +0 -304
- package/examples/greenbump.yml +0 -37
- package/examples/legacy-repo/package.json +0 -12
- package/examples/legacy-repo/test.js +0 -17
- package/examples/multi-file-repo/models/todo.js +0 -8
- package/examples/multi-file-repo/models/user.js +0 -11
- package/examples/multi-file-repo/package.json +0 -12
- package/examples/multi-file-repo/services/session.js +0 -9
- package/examples/multi-file-repo/test.js +0 -19
- package/optimization-roadmap.md +0 -772
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
import { existsSync } from "fs";
|
|
2
|
+
import { join } from "path";
|
|
3
|
+
import { readFile, writeFile, mkdir } from "fs/promises";
|
|
4
|
+
import { exec } from "../git.js";
|
|
5
|
+
/**
|
|
6
|
+
* Check if project has build script
|
|
7
|
+
*/
|
|
8
|
+
async function hasBuildScript(cwd) {
|
|
9
|
+
const pkgPath = join(cwd, "package.json");
|
|
10
|
+
if (!existsSync(pkgPath))
|
|
11
|
+
return false;
|
|
12
|
+
try {
|
|
13
|
+
const content = await readFile(pkgPath, "utf-8");
|
|
14
|
+
const pkg = JSON.parse(content);
|
|
15
|
+
return pkg.scripts?.build !== undefined;
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
return false;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Check if project has test script
|
|
23
|
+
*/
|
|
24
|
+
async function hasTestScript(cwd) {
|
|
25
|
+
const pkgPath = join(cwd, "package.json");
|
|
26
|
+
if (!existsSync(pkgPath))
|
|
27
|
+
return false;
|
|
28
|
+
try {
|
|
29
|
+
const content = await readFile(pkgPath, "utf-8");
|
|
30
|
+
const pkg = JSON.parse(content);
|
|
31
|
+
return pkg.scripts?.test !== undefined;
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Get total size of directory in bytes
|
|
39
|
+
*/
|
|
40
|
+
async function getTotalSize(dirPath) {
|
|
41
|
+
if (!existsSync(dirPath))
|
|
42
|
+
return 0;
|
|
43
|
+
try {
|
|
44
|
+
const result = await exec("du", ["-sb", dirPath], { cwd: dirPath });
|
|
45
|
+
const match = result.stdout.match(/^(\d+)/);
|
|
46
|
+
return match ? parseInt(match[1], 10) : 0;
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
return 0;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Capture performance baseline before upgrade
|
|
54
|
+
*/
|
|
55
|
+
export async function captureBaseline(cwd) {
|
|
56
|
+
console.log("📊 Capturing performance baseline...");
|
|
57
|
+
const metrics = {
|
|
58
|
+
timestamp: new Date(),
|
|
59
|
+
};
|
|
60
|
+
try {
|
|
61
|
+
// Measure install time
|
|
62
|
+
console.log(" Measuring install time...");
|
|
63
|
+
const installStart = Date.now();
|
|
64
|
+
await exec("npm", ["install"], { cwd });
|
|
65
|
+
metrics.installTime = (Date.now() - installStart) / 1000;
|
|
66
|
+
console.log(` ✓ Install: ${metrics.installTime.toFixed(1)}s`);
|
|
67
|
+
// Measure build time (if build script exists)
|
|
68
|
+
if (await hasBuildScript(cwd)) {
|
|
69
|
+
console.log(" Measuring build time...");
|
|
70
|
+
const buildStart = Date.now();
|
|
71
|
+
await exec("npm", ["run", "build"], { cwd });
|
|
72
|
+
metrics.buildTime = (Date.now() - buildStart) / 1000;
|
|
73
|
+
console.log(` ✓ Build: ${metrics.buildTime.toFixed(1)}s`);
|
|
74
|
+
// Measure bundle size
|
|
75
|
+
const distDir = join(cwd, "dist");
|
|
76
|
+
if (existsSync(distDir)) {
|
|
77
|
+
metrics.bundleSize = await getTotalSize(distDir);
|
|
78
|
+
console.log(` ✓ Bundle: ${(metrics.bundleSize / 1024).toFixed(0)} KB`);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
// Measure test time
|
|
82
|
+
if (await hasTestScript(cwd)) {
|
|
83
|
+
console.log(" Measuring test time...");
|
|
84
|
+
const testStart = Date.now();
|
|
85
|
+
await exec("npm", ["test"], { cwd });
|
|
86
|
+
metrics.testTime = (Date.now() - testStart) / 1000;
|
|
87
|
+
console.log(` ✓ Test: ${metrics.testTime.toFixed(1)}s`);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
console.warn("⚠️ Warning: Failed to capture complete baseline:", error.message);
|
|
92
|
+
}
|
|
93
|
+
// Save baseline to .greenbump/perf-baseline.json
|
|
94
|
+
const greenbumpDir = join(cwd, ".greenbump");
|
|
95
|
+
if (!existsSync(greenbumpDir)) {
|
|
96
|
+
await mkdir(greenbumpDir, { recursive: true });
|
|
97
|
+
}
|
|
98
|
+
const baselinePath = join(greenbumpDir, "perf-baseline.json");
|
|
99
|
+
await writeFile(baselinePath, JSON.stringify(metrics, null, 2));
|
|
100
|
+
return metrics;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Load baseline from file
|
|
104
|
+
*/
|
|
105
|
+
export async function loadBaseline(cwd) {
|
|
106
|
+
const baselinePath = join(cwd, ".greenbump", "perf-baseline.json");
|
|
107
|
+
if (!existsSync(baselinePath)) {
|
|
108
|
+
return null;
|
|
109
|
+
}
|
|
110
|
+
try {
|
|
111
|
+
const content = await readFile(baselinePath, "utf-8");
|
|
112
|
+
const baseline = JSON.parse(content);
|
|
113
|
+
// Convert timestamp string back to Date
|
|
114
|
+
if (baseline.timestamp) {
|
|
115
|
+
baseline.timestamp = new Date(baseline.timestamp);
|
|
116
|
+
}
|
|
117
|
+
return baseline;
|
|
118
|
+
}
|
|
119
|
+
catch {
|
|
120
|
+
return null;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Collect current performance metrics
|
|
125
|
+
*/
|
|
126
|
+
export async function collectCurrentMetrics(cwd) {
|
|
127
|
+
console.log("📊 Collecting current performance metrics...");
|
|
128
|
+
const metrics = {
|
|
129
|
+
timestamp: new Date(),
|
|
130
|
+
};
|
|
131
|
+
try {
|
|
132
|
+
// Check bundle size if build output exists
|
|
133
|
+
const distDir = join(cwd, "dist");
|
|
134
|
+
if (existsSync(distDir)) {
|
|
135
|
+
metrics.bundleSize = await getTotalSize(distDir);
|
|
136
|
+
}
|
|
137
|
+
// We can't easily measure install/build/test time after the fact
|
|
138
|
+
// These would need to be captured during the actual operations
|
|
139
|
+
}
|
|
140
|
+
catch (error) {
|
|
141
|
+
console.warn("⚠️ Warning: Failed to collect metrics:", error.message);
|
|
142
|
+
}
|
|
143
|
+
return metrics;
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Extract performance metrics from Docker container logs
|
|
147
|
+
*/
|
|
148
|
+
export async function extractMetricsFromLogs(logs) {
|
|
149
|
+
const metrics = {};
|
|
150
|
+
// Try to extract timing information from logs
|
|
151
|
+
// This is a simple heuristic-based approach
|
|
152
|
+
// Look for npm install time
|
|
153
|
+
const installMatch = logs.match(/added \d+ packages.*in ([\d.]+)s/);
|
|
154
|
+
if (installMatch) {
|
|
155
|
+
metrics.installTime = parseFloat(installMatch[1]);
|
|
156
|
+
}
|
|
157
|
+
// Look for build time (webpack/vite output)
|
|
158
|
+
const buildMatch = logs.match(/built in ([\d.]+)s/i) ||
|
|
159
|
+
logs.match(/Done in ([\d.]+)s/);
|
|
160
|
+
if (buildMatch) {
|
|
161
|
+
metrics.buildTime = parseFloat(buildMatch[1]);
|
|
162
|
+
}
|
|
163
|
+
// Look for test time
|
|
164
|
+
const testMatch = logs.match(/Tests:\s+\d+ passed.*\(([\d.]+)s\)/) ||
|
|
165
|
+
logs.match(/Ran \d+ tests? in ([\d.]+)s/);
|
|
166
|
+
if (testMatch) {
|
|
167
|
+
metrics.testTime = parseFloat(testMatch[1]);
|
|
168
|
+
}
|
|
169
|
+
return metrics;
|
|
170
|
+
}
|
|
171
|
+
//# sourceMappingURL=metrics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metrics.js","sourceRoot":"","sources":["../../../src/engine/perf/metrics.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
const DEFAULT_THRESHOLDS = {
|
|
2
|
+
installTime: 0.30, // 30% slower
|
|
3
|
+
buildTime: 0.20, // 20% slower
|
|
4
|
+
testTime: 0.30, // 30% slower
|
|
5
|
+
bundleSize: 0.15, // 15% larger
|
|
6
|
+
memoryPeak: 0.40, // 40% more memory
|
|
7
|
+
};
|
|
8
|
+
/**
|
|
9
|
+
* Compare performance metrics and detect regressions
|
|
10
|
+
*/
|
|
11
|
+
export function comparePerformance(baseline, current, thresholds = {}) {
|
|
12
|
+
const mergedThresholds = { ...DEFAULT_THRESHOLDS, ...thresholds };
|
|
13
|
+
const comparisons = [];
|
|
14
|
+
// Compare each metric
|
|
15
|
+
for (const [metric, threshold] of Object.entries(mergedThresholds)) {
|
|
16
|
+
const before = baseline[metric];
|
|
17
|
+
const after = current[metric];
|
|
18
|
+
if (before === undefined || after === undefined)
|
|
19
|
+
continue;
|
|
20
|
+
if (before === 0)
|
|
21
|
+
continue; // Avoid division by zero
|
|
22
|
+
const delta = after - before;
|
|
23
|
+
const percentChange = (delta / before) * 100;
|
|
24
|
+
const isRegression = percentChange > threshold * 100;
|
|
25
|
+
comparisons.push({
|
|
26
|
+
metric,
|
|
27
|
+
before,
|
|
28
|
+
after,
|
|
29
|
+
delta,
|
|
30
|
+
percentChange,
|
|
31
|
+
isRegression,
|
|
32
|
+
severity: isRegression
|
|
33
|
+
? percentChange > threshold * 200
|
|
34
|
+
? "critical"
|
|
35
|
+
: "warning"
|
|
36
|
+
: "ok",
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
return comparisons;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Check if any regressions were detected
|
|
43
|
+
*/
|
|
44
|
+
export function hasRegressions(comparisons) {
|
|
45
|
+
return comparisons.some(c => c.isRegression);
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Get human-readable metric name
|
|
49
|
+
*/
|
|
50
|
+
export function getMetricDisplayName(metric) {
|
|
51
|
+
const names = {
|
|
52
|
+
installTime: "Install time",
|
|
53
|
+
buildTime: "Build time",
|
|
54
|
+
testTime: "Test time",
|
|
55
|
+
bundleSize: "Bundle size",
|
|
56
|
+
memoryPeak: "Memory usage",
|
|
57
|
+
};
|
|
58
|
+
return names[metric] || metric;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Format metric value for display
|
|
62
|
+
*/
|
|
63
|
+
export function formatMetricValue(metric, value) {
|
|
64
|
+
if (metric === "bundleSize") {
|
|
65
|
+
// Format as KB or MB
|
|
66
|
+
if (value < 1024 * 1024) {
|
|
67
|
+
return `${(value / 1024).toFixed(0)} KB`;
|
|
68
|
+
}
|
|
69
|
+
return `${(value / (1024 * 1024)).toFixed(1)} MB`;
|
|
70
|
+
}
|
|
71
|
+
if (metric === "memoryPeak") {
|
|
72
|
+
return `${value.toFixed(0)} MB`;
|
|
73
|
+
}
|
|
74
|
+
// Time metrics - format as seconds
|
|
75
|
+
return `${value.toFixed(1)}s`;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Format percent change for display
|
|
79
|
+
*/
|
|
80
|
+
export function formatPercentChange(percentChange) {
|
|
81
|
+
const sign = percentChange > 0 ? "+" : "";
|
|
82
|
+
return `${sign}${percentChange.toFixed(1)}%`;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Display performance comparison results
|
|
86
|
+
*/
|
|
87
|
+
export function displayPerformanceComparison(comparisons) {
|
|
88
|
+
if (comparisons.length === 0) {
|
|
89
|
+
console.log("📊 No performance metrics to compare");
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
console.log("\n📊 Performance Comparison:");
|
|
93
|
+
for (const comparison of comparisons) {
|
|
94
|
+
const name = getMetricDisplayName(comparison.metric);
|
|
95
|
+
const before = formatMetricValue(comparison.metric, comparison.before);
|
|
96
|
+
const after = formatMetricValue(comparison.metric, comparison.after);
|
|
97
|
+
const change = formatPercentChange(comparison.percentChange);
|
|
98
|
+
if (comparison.isRegression) {
|
|
99
|
+
const icon = comparison.severity === "critical" ? "🔴" : "⚠️";
|
|
100
|
+
console.log(` ${icon} ${name}: ${before} → ${after} (${change}) - REGRESSION`);
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
console.log(` ✓ ${name}: ${before} → ${after} (${change})`);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
const regressionCount = comparisons.filter(c => c.isRegression).length;
|
|
107
|
+
if (regressionCount > 0) {
|
|
108
|
+
console.log(`\n⚠️ ${regressionCount} performance regression(s) detected!`);
|
|
109
|
+
console.log(" Review changes before committing.\n");
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
console.log("\n✅ No performance regressions detected\n");
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=regression.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"regression.js","sourceRoot":"","sources":["../../../src/engine/perf/regression.ts"],"names":[],"mappings":"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"}
|
package/dist/engine/run.js
CHANGED
|
@@ -8,6 +8,11 @@ import { runFixLoop } from "../agent/fixer.js";
|
|
|
8
8
|
import { createProvider } from "../agent/factory.js";
|
|
9
9
|
import { runStaticAnalysis } from "./verify.js";
|
|
10
10
|
import { detectSuspiciousChanges } from "./change-detector.js";
|
|
11
|
+
import { runInSandbox } from "./sandbox/orchestrator.js";
|
|
12
|
+
import { captureBaseline, loadBaseline } from "./perf/metrics.js";
|
|
13
|
+
import { comparePerformance, displayPerformanceComparison, hasRegressions } from "./perf/regression.js";
|
|
14
|
+
import { analyzeApiChanges, readFromGitHead } from "./verifiers/ast-analyzer.js";
|
|
15
|
+
import { digestChangelog, renderDigestForPrompt } from "./analyzers/changelog-parser.js";
|
|
11
16
|
export class RunError extends Error {
|
|
12
17
|
}
|
|
13
18
|
/**
|
|
@@ -62,7 +67,13 @@ export async function run(opts) {
|
|
|
62
67
|
await createBranch(cwd, branch);
|
|
63
68
|
log(`created branch ${branch}`);
|
|
64
69
|
}
|
|
65
|
-
// 4. baseline
|
|
70
|
+
// 4. Performance baseline (if regression detection enabled)
|
|
71
|
+
let perfBaseline;
|
|
72
|
+
if (opts.detectRegressions) {
|
|
73
|
+
log("capturing performance baseline…");
|
|
74
|
+
perfBaseline = await captureBaseline(cwd);
|
|
75
|
+
}
|
|
76
|
+
// 4a. baseline — refuse to run if it's already broken, so we never chase
|
|
66
77
|
// failures that predate the upgrade.
|
|
67
78
|
log("running baseline build + tests…");
|
|
68
79
|
const baseline = await runChecks(pm, cwd, checkOverrides);
|
|
@@ -114,7 +125,7 @@ export async function run(opts) {
|
|
|
114
125
|
}
|
|
115
126
|
// 7. broke — fetch changelog context, then run the fix agent
|
|
116
127
|
summary.neededFix = true;
|
|
117
|
-
|
|
128
|
+
let changelog = await fetchChangelog(target.name, from, to);
|
|
118
129
|
if (changelog)
|
|
119
130
|
log(`found changelog/release notes for ${target.name}`);
|
|
120
131
|
const provider = createProvider({
|
|
@@ -123,6 +134,23 @@ export async function run(opts) {
|
|
|
123
134
|
baseURL: opts.baseURL,
|
|
124
135
|
apiKey: opts.apiKey,
|
|
125
136
|
});
|
|
137
|
+
// Deep-digest the changelog once (cached per upgrade path) — replaces the
|
|
138
|
+
// raw changelog with a compact breaking-change checklist in the fix prompt.
|
|
139
|
+
// Best-effort: any digest failure (bad key, offline, unparseable) falls
|
|
140
|
+
// back to the raw changelog — the digest is an optimization, not a gate.
|
|
141
|
+
if (changelog && !opts.noCache) {
|
|
142
|
+
try {
|
|
143
|
+
const digest = await digestChangelog(provider, target.name, from, to, changelog);
|
|
144
|
+
if (digest && digest.breakingChanges.length > 0) {
|
|
145
|
+
log(`changelog digest: ${digest.breakingChanges.length} breaking change(s) extracted` +
|
|
146
|
+
(digest.fromCache ? " (from cache)" : ` (${digest.tokensUsed.inputTokens} tokens)`));
|
|
147
|
+
changelog = renderDigestForPrompt(digest) + `\n\nRaw release notes:\n${changelog.slice(0, 2000)}`;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
catch (err) {
|
|
151
|
+
log(`changelog digest skipped (${err.message.slice(0, 80)})`);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
126
154
|
log(`upgrade broke ${post.failedStep} — starting fix loop via ${provider.name} (${provider.model})`);
|
|
127
155
|
const fix = await runFixLoop({
|
|
128
156
|
cwd,
|
|
@@ -137,11 +165,20 @@ export async function run(opts) {
|
|
|
137
165
|
failureOutput: post.output,
|
|
138
166
|
changelog,
|
|
139
167
|
onLog: log,
|
|
168
|
+
noFreeTiers: opts.noFreeTiers,
|
|
169
|
+
noCache: opts.noCache,
|
|
170
|
+
onFixSuggestion: opts.interactive ? opts.onFixSuggestion : undefined,
|
|
140
171
|
});
|
|
141
172
|
summary.fixed = fix.fixed;
|
|
142
173
|
summary.rounds = fix.rounds;
|
|
143
174
|
summary.usage = fix.usage;
|
|
144
175
|
summary.editedFiles = fix.editedFiles;
|
|
176
|
+
summary.fixedByTier = fix.fixedByTier;
|
|
177
|
+
summary.cacheHit = fix.cacheHit;
|
|
178
|
+
if (fix.fixedByTier && fix.fixedByTier < 4) {
|
|
179
|
+
const tierNames = ["", "codemod", "learned pattern", "cached fix"];
|
|
180
|
+
log(`fixed by tier ${fix.fixedByTier} (${tierNames[fix.fixedByTier]}) — 0 tokens spent`);
|
|
181
|
+
}
|
|
145
182
|
summary.testFilesTouched = fix.editedFiles.filter((f) => /(^|\/)(test|tests|__tests__|spec)(\/|\.)|\.(test|spec)\./i.test(f));
|
|
146
183
|
// Run static analysis (TypeScript + ESLint)
|
|
147
184
|
log("running static analysis…");
|
|
@@ -162,6 +199,60 @@ export async function run(opts) {
|
|
|
162
199
|
summary.needsReview = true;
|
|
163
200
|
summary.suspiciousChanges = suspiciousChanges.map(c => `${c.type}: ${c.file} - ${c.description}`);
|
|
164
201
|
}
|
|
202
|
+
// AST-level API surface analysis (did the fix quietly change OUR exports?)
|
|
203
|
+
if (opts.astAnalysis !== false && fix.fixed && fix.editedFiles.length > 0) {
|
|
204
|
+
log("analyzing API surface changes…");
|
|
205
|
+
const astResult = await analyzeApiChanges(cwd, fix.editedFiles, (p) => readFromGitHead(cwd, p));
|
|
206
|
+
if (astResult.changes.length > 0) {
|
|
207
|
+
log(`⚠️ API surface: ${astResult.summary}`);
|
|
208
|
+
summary.apiChanges = astResult.changes.map((c) => `[${c.severity}] ${c.file}: ${c.detail}`);
|
|
209
|
+
if (astResult.hasCritical) {
|
|
210
|
+
summary.needsReview = true;
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
else {
|
|
214
|
+
log("API surface: no changes to exported symbols");
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
// Sandbox verification (if enabled)
|
|
218
|
+
if (opts.sandbox) {
|
|
219
|
+
log("running sandbox verification…");
|
|
220
|
+
const sandboxResult = await runInSandbox(cwd, {
|
|
221
|
+
enabled: true,
|
|
222
|
+
services: opts.services,
|
|
223
|
+
keepContainer: opts.keepContainer,
|
|
224
|
+
timeout: 600,
|
|
225
|
+
});
|
|
226
|
+
if (!sandboxResult.skipped) {
|
|
227
|
+
summary.sandboxResult = {
|
|
228
|
+
passed: sandboxResult.passed,
|
|
229
|
+
services: sandboxResult.services.map(s => s.displayName),
|
|
230
|
+
};
|
|
231
|
+
if (!sandboxResult.passed) {
|
|
232
|
+
log("⚠️ Sandbox verification failed");
|
|
233
|
+
summary.needsReview = true;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
// Performance regression detection (if enabled)
|
|
238
|
+
if (opts.detectRegressions && perfBaseline) {
|
|
239
|
+
log("checking for performance regressions…");
|
|
240
|
+
const currentMetrics = await loadBaseline(cwd); // Load the metrics captured during the fix
|
|
241
|
+
if (currentMetrics) {
|
|
242
|
+
const comparisons = comparePerformance(perfBaseline, currentMetrics);
|
|
243
|
+
displayPerformanceComparison(comparisons);
|
|
244
|
+
if (hasRegressions(comparisons)) {
|
|
245
|
+
log("⚠️ Performance regressions detected");
|
|
246
|
+
summary.needsReview = true;
|
|
247
|
+
summary.performanceRegression = {
|
|
248
|
+
detected: true,
|
|
249
|
+
details: comparisons
|
|
250
|
+
.filter(c => c.isRegression)
|
|
251
|
+
.map(c => `${c.metric}: ${c.percentChange.toFixed(1)}% slower/larger`),
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
}
|
|
165
256
|
summary.needsReview = computeNeedsReview({
|
|
166
257
|
unverifiable: false,
|
|
167
258
|
neededFix: true,
|
package/dist/engine/run.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/engine/run.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/engine/run.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { test } from "node:test";
|
|
2
|
+
import assert from "node:assert/strict";
|
|
3
|
+
import { computeNeedsReview } from "./run.js";
|
|
4
|
+
test("computeNeedsReview: unverifiable always needs review, regardless of anything else", () => {
|
|
5
|
+
assert.equal(computeNeedsReview({ unverifiable: true, neededFix: false, fixed: true, testFilesTouched: [] }), true);
|
|
6
|
+
});
|
|
7
|
+
test("computeNeedsReview: clean upgrade (no fix needed) never needs review", () => {
|
|
8
|
+
assert.equal(computeNeedsReview({ unverifiable: false, neededFix: false, fixed: true, testFilesTouched: [] }), false);
|
|
9
|
+
});
|
|
10
|
+
test("computeNeedsReview: fixed with a test file touched needs review", () => {
|
|
11
|
+
assert.equal(computeNeedsReview({
|
|
12
|
+
unverifiable: false,
|
|
13
|
+
neededFix: true,
|
|
14
|
+
fixed: true,
|
|
15
|
+
testFilesTouched: ["src/foo.test.ts"],
|
|
16
|
+
}), true);
|
|
17
|
+
});
|
|
18
|
+
test("computeNeedsReview: fixed with no test file touched does not need review", () => {
|
|
19
|
+
assert.equal(computeNeedsReview({ unverifiable: false, neededFix: true, fixed: true, testFilesTouched: [] }), false);
|
|
20
|
+
});
|
|
21
|
+
test("computeNeedsReview: fix loop failed (unfixed) never needs review — that's exit code 2's job, not 3's", () => {
|
|
22
|
+
assert.equal(computeNeedsReview({
|
|
23
|
+
unverifiable: false,
|
|
24
|
+
neededFix: true,
|
|
25
|
+
fixed: false,
|
|
26
|
+
testFilesTouched: ["src/foo.test.ts"],
|
|
27
|
+
}), false);
|
|
28
|
+
});
|
|
29
|
+
test("computeNeedsReview: budgetExceeded always needs review, even on a clean/no-fix-needed run", () => {
|
|
30
|
+
assert.equal(computeNeedsReview({
|
|
31
|
+
unverifiable: false,
|
|
32
|
+
neededFix: false,
|
|
33
|
+
fixed: true,
|
|
34
|
+
testFilesTouched: [],
|
|
35
|
+
budgetExceeded: true,
|
|
36
|
+
}), true);
|
|
37
|
+
});
|
|
38
|
+
test("computeNeedsReview: budgetExceeded still needs review even when fixed with no test file touched", () => {
|
|
39
|
+
assert.equal(computeNeedsReview({
|
|
40
|
+
unverifiable: false,
|
|
41
|
+
neededFix: true,
|
|
42
|
+
fixed: true,
|
|
43
|
+
testFilesTouched: [],
|
|
44
|
+
budgetExceeded: true,
|
|
45
|
+
}), true);
|
|
46
|
+
});
|
|
47
|
+
//# sourceMappingURL=run.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.test.js","sourceRoot":"","sources":["../../src/engine/run.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAE9C,IAAI,CAAC,mFAAmF,EAAE,GAAG,EAAE;IAC7F,MAAM,CAAC,KAAK,CACV,kBAAkB,CAAC,EAAE,YAAY,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,gBAAgB,EAAE,EAAE,EAAE,CAAC,EAC/F,IAAI,CACL,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,sEAAsE,EAAE,GAAG,EAAE;IAChF,MAAM,CAAC,KAAK,CACV,kBAAkB,CAAC,EAAE,YAAY,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,gBAAgB,EAAE,EAAE,EAAE,CAAC,EAChG,KAAK,CACN,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,iEAAiE,EAAE,GAAG,EAAE;IAC3E,MAAM,CAAC,KAAK,CACV,kBAAkB,CAAC;QACjB,YAAY,EAAE,KAAK;QACnB,SAAS,EAAE,IAAI;QACf,KAAK,EAAE,IAAI;QACX,gBAAgB,EAAE,CAAC,iBAAiB,CAAC;KACtC,CAAC,EACF,IAAI,CACL,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,0EAA0E,EAAE,GAAG,EAAE;IACpF,MAAM,CAAC,KAAK,CACV,kBAAkB,CAAC,EAAE,YAAY,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,gBAAgB,EAAE,EAAE,EAAE,CAAC,EAC/F,KAAK,CACN,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,sGAAsG,EAAE,GAAG,EAAE;IAChH,MAAM,CAAC,KAAK,CACV,kBAAkB,CAAC;QACjB,YAAY,EAAE,KAAK;QACnB,SAAS,EAAE,IAAI;QACf,KAAK,EAAE,KAAK;QACZ,gBAAgB,EAAE,CAAC,iBAAiB,CAAC;KACtC,CAAC,EACF,KAAK,CACN,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,2FAA2F,EAAE,GAAG,EAAE;IACrG,MAAM,CAAC,KAAK,CACV,kBAAkB,CAAC;QACjB,YAAY,EAAE,KAAK;QACnB,SAAS,EAAE,KAAK;QAChB,KAAK,EAAE,IAAI;QACX,gBAAgB,EAAE,EAAE;QACpB,cAAc,EAAE,IAAI;KACrB,CAAC,EACF,IAAI,CACL,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,iGAAiG,EAAE,GAAG,EAAE;IAC3G,MAAM,CAAC,KAAK,CACV,kBAAkB,CAAC;QACjB,YAAY,EAAE,KAAK;QACnB,SAAS,EAAE,IAAI;QACf,KAAK,EAAE,IAAI;QACX,gBAAgB,EAAE,EAAE;QACpB,cAAc,EAAE,IAAI;KACrB,CAAC,EACF,IAAI,CACL,CAAC;AACJ,CAAC,CAAC,CAAC"}
|