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.
Files changed (78) hide show
  1. package/README.md +673 -66
  2. package/README.zh-CN.md +525 -100
  3. package/dist/agent/fixer.js +161 -12
  4. package/dist/agent/fixer.js.map +1 -1
  5. package/dist/agent/fixer.test.js +410 -0
  6. package/dist/agent/fixer.test.js.map +1 -0
  7. package/dist/cli/interactive.js +81 -0
  8. package/dist/cli/interactive.js.map +1 -0
  9. package/dist/cli.js +53 -0
  10. package/dist/cli.js.map +1 -1
  11. package/dist/engine/analyzers/changelog-parser.js +121 -0
  12. package/dist/engine/analyzers/changelog-parser.js.map +1 -0
  13. package/dist/engine/batch.test.js +59 -0
  14. package/dist/engine/batch.test.js.map +1 -0
  15. package/dist/engine/cache/manager.js +165 -0
  16. package/dist/engine/cache/manager.js.map +1 -0
  17. package/dist/engine/cache/manager.test.js +75 -0
  18. package/dist/engine/cache/manager.test.js.map +1 -0
  19. package/dist/engine/checks.test.js +92 -0
  20. package/dist/engine/checks.test.js.map +1 -0
  21. package/dist/engine/context/optimizer.js +189 -0
  22. package/dist/engine/context/optimizer.js.map +1 -0
  23. package/dist/engine/context/optimizer.test.js +81 -0
  24. package/dist/engine/context/optimizer.test.js.map +1 -0
  25. package/dist/engine/ecosystems/parsers.test.js +255 -0
  26. package/dist/engine/ecosystems/parsers.test.js.map +1 -0
  27. package/dist/engine/fixer/patterns.js +356 -0
  28. package/dist/engine/fixer/patterns.js.map +1 -0
  29. package/dist/engine/fixer/patterns.test.js +124 -0
  30. package/dist/engine/fixer/patterns.test.js.map +1 -0
  31. package/dist/engine/git.js +1 -0
  32. package/dist/engine/git.js.map +1 -1
  33. package/dist/engine/git.test.js +111 -0
  34. package/dist/engine/git.test.js.map +1 -0
  35. package/dist/engine/perf/metrics.js +171 -0
  36. package/dist/engine/perf/metrics.js.map +1 -0
  37. package/dist/engine/perf/regression.js +115 -0
  38. package/dist/engine/perf/regression.js.map +1 -0
  39. package/dist/engine/run.js +93 -2
  40. package/dist/engine/run.js.map +1 -1
  41. package/dist/engine/run.test.js +47 -0
  42. package/dist/engine/run.test.js.map +1 -0
  43. package/dist/engine/sandbox/docker-manager.js +215 -0
  44. package/dist/engine/sandbox/docker-manager.js.map +1 -0
  45. package/dist/engine/sandbox/orchestrator.js +107 -0
  46. package/dist/engine/sandbox/orchestrator.js.map +1 -0
  47. package/dist/engine/sandbox/service-detector.js +147 -0
  48. package/dist/engine/sandbox/service-detector.js.map +1 -0
  49. package/dist/engine/sandbox/template-generator.js +241 -0
  50. package/dist/engine/sandbox/template-generator.js.map +1 -0
  51. package/dist/engine/verifiers/ast-analyzer.js +212 -0
  52. package/dist/engine/verifiers/ast-analyzer.js.map +1 -0
  53. package/dist/engine/verifiers/ast-analyzer.test.js +96 -0
  54. package/dist/engine/verifiers/ast-analyzer.test.js.map +1 -0
  55. package/dist/engine/workspace.test.js +95 -0
  56. package/dist/engine/workspace.test.js.map +1 -0
  57. package/dist/exitcode.test.js +62 -0
  58. package/dist/exitcode.test.js.map +1 -0
  59. package/dist/format.js +15 -0
  60. package/dist/format.js.map +1 -1
  61. package/dist/report.test.js +56 -0
  62. package/dist/report.test.js.map +1 -0
  63. package/package.json +7 -4
  64. package/CHANGELOG.md +0 -93
  65. package/CONTRIBUTING.md +0 -52
  66. package/SECURITY.md +0 -38
  67. package/action-dist/index.cjs +0 -19935
  68. package/action.yml +0 -76
  69. package/competitive-analysis.md +0 -304
  70. package/examples/greenbump.yml +0 -37
  71. package/examples/legacy-repo/package.json +0 -12
  72. package/examples/legacy-repo/test.js +0 -17
  73. package/examples/multi-file-repo/models/todo.js +0 -8
  74. package/examples/multi-file-repo/models/user.js +0 -11
  75. package/examples/multi-file-repo/package.json +0 -12
  76. package/examples/multi-file-repo/services/session.js +0 -9
  77. package/examples/multi-file-repo/test.js +0 -19
  78. 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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"}
@@ -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 — refuse to run if it's already broken, so we never chase
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
- const changelog = await fetchChangelog(target.name, from, to);
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,
@@ -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"}