greenbump 0.7.0 → 0.9.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 (121) hide show
  1. package/README.md +73 -15
  2. package/README.zh-CN.md +37 -4
  3. package/dist/action/github.test.js +37 -0
  4. package/dist/action/github.test.js.map +1 -0
  5. package/dist/action/main.js +19 -4
  6. package/dist/action/main.js.map +1 -1
  7. package/dist/agent/calllog.js +23 -0
  8. package/dist/agent/calllog.js.map +1 -0
  9. package/dist/agent/calllog.test.js +77 -0
  10. package/dist/agent/calllog.test.js.map +1 -0
  11. package/dist/agent/fixer.js +246 -29
  12. package/dist/agent/fixer.js.map +1 -1
  13. package/dist/agent/fixer.test.js +299 -0
  14. package/dist/agent/fixer.test.js.map +1 -1
  15. package/dist/agent/guard.js +37 -0
  16. package/dist/agent/guard.js.map +1 -0
  17. package/dist/agent/guard.test.js +48 -0
  18. package/dist/agent/guard.test.js.map +1 -0
  19. package/dist/agent/provider-anthropic.js +2 -2
  20. package/dist/agent/provider-anthropic.js.map +1 -1
  21. package/dist/agent/provider-openai.js +2 -2
  22. package/dist/agent/provider-openai.js.map +1 -1
  23. package/dist/benchmarks/run.js +0 -0
  24. package/dist/benchmarks/run.js.map +1 -0
  25. package/dist/cli/interactive.js +46 -11
  26. package/dist/cli/interactive.js.map +1 -1
  27. package/dist/cli.js +37 -7
  28. package/dist/cli.js.map +1 -1
  29. package/dist/engine/analyzers/changelog-parser.js +51 -2
  30. package/dist/engine/analyzers/changelog-parser.js.map +1 -1
  31. package/dist/engine/batch.js +54 -10
  32. package/dist/engine/batch.js.map +1 -1
  33. package/dist/engine/cache/manager.js +19 -1
  34. package/dist/engine/cache/manager.js.map +1 -1
  35. package/dist/engine/cache/manager.test.js +17 -0
  36. package/dist/engine/cache/manager.test.js.map +1 -1
  37. package/dist/engine/change-detector.js +52 -23
  38. package/dist/engine/change-detector.js.map +1 -1
  39. package/dist/engine/change-detector.test.js +72 -0
  40. package/dist/engine/change-detector.test.js.map +1 -0
  41. package/dist/engine/changelog.js +22 -2
  42. package/dist/engine/changelog.js.map +1 -1
  43. package/dist/engine/changelog.test.js +31 -0
  44. package/dist/engine/changelog.test.js.map +1 -0
  45. package/dist/engine/checks.js +10 -4
  46. package/dist/engine/checks.js.map +1 -1
  47. package/dist/engine/context/optimizer.js +14 -44
  48. package/dist/engine/context/optimizer.js.map +1 -1
  49. package/dist/engine/context/optimizer.test.js +23 -1
  50. package/dist/engine/context/optimizer.test.js.map +1 -1
  51. package/dist/engine/ecosystems/cargo.js +2 -1
  52. package/dist/engine/ecosystems/cargo.js.map +1 -1
  53. package/dist/engine/ecosystems/conan.js +2 -1
  54. package/dist/engine/ecosystems/conan.js.map +1 -1
  55. package/dist/engine/ecosystems/elm.js +2 -1
  56. package/dist/engine/ecosystems/elm.js.map +1 -1
  57. package/dist/engine/ecosystems/gradle.js +2 -1
  58. package/dist/engine/ecosystems/gradle.js.map +1 -1
  59. package/dist/engine/ecosystems/http.js +18 -0
  60. package/dist/engine/ecosystems/http.js.map +1 -0
  61. package/dist/engine/ecosystems/maven.js +2 -1
  62. package/dist/engine/ecosystems/maven.js.map +1 -1
  63. package/dist/engine/ecosystems/swiftpm.js +2 -1
  64. package/dist/engine/ecosystems/swiftpm.js.map +1 -1
  65. package/dist/engine/exec.js +37 -7
  66. package/dist/engine/exec.js.map +1 -1
  67. package/dist/engine/exec.test.js +36 -0
  68. package/dist/engine/exec.test.js.map +1 -0
  69. package/dist/engine/fixer/patterns.js +55 -18
  70. package/dist/engine/fixer/patterns.js.map +1 -1
  71. package/dist/engine/fixer/patterns.test.js +95 -1
  72. package/dist/engine/fixer/patterns.test.js.map +1 -1
  73. package/dist/engine/git.js +38 -16
  74. package/dist/engine/git.js.map +1 -1
  75. package/dist/engine/git.test.js +51 -1
  76. package/dist/engine/git.test.js.map +1 -1
  77. package/dist/engine/perf/metrics.js +44 -57
  78. package/dist/engine/perf/metrics.js.map +1 -1
  79. package/dist/engine/run.js +141 -15
  80. package/dist/engine/run.js.map +1 -1
  81. package/dist/engine/run.test.js +65 -1
  82. package/dist/engine/run.test.js.map +1 -1
  83. package/dist/engine/sandbox/docker-manager.js +52 -26
  84. package/dist/engine/sandbox/docker-manager.js.map +1 -1
  85. package/dist/engine/sandbox/template-generator.js +0 -4
  86. package/dist/engine/sandbox/template-generator.js.map +1 -1
  87. package/dist/engine/sandbox/template-generator.test.js +16 -0
  88. package/dist/engine/sandbox/template-generator.test.js.map +1 -0
  89. package/dist/engine/scan/benchmark-crosscheck.test.js +116 -0
  90. package/dist/engine/scan/benchmark-crosscheck.test.js.map +1 -0
  91. package/dist/engine/scan/detect.js +96 -0
  92. package/dist/engine/scan/detect.js.map +1 -0
  93. package/dist/engine/scan/impact.js +128 -0
  94. package/dist/engine/scan/impact.js.map +1 -0
  95. package/dist/engine/scan/impact.test.js +217 -0
  96. package/dist/engine/scan/impact.test.js.map +1 -0
  97. package/dist/engine/scan/indexer.js +129 -0
  98. package/dist/engine/scan/indexer.js.map +1 -0
  99. package/dist/engine/scan/indexer.test.js +149 -0
  100. package/dist/engine/scan/indexer.test.js.map +1 -0
  101. package/dist/engine/scan/probes.js +92 -0
  102. package/dist/engine/scan/probes.js.map +1 -0
  103. package/dist/engine/scan/probes.test.js +100 -0
  104. package/dist/engine/scan/probes.test.js.map +1 -0
  105. package/dist/engine/verify.js +41 -58
  106. package/dist/engine/verify.js.map +1 -1
  107. package/dist/engine/verify.test.js +49 -0
  108. package/dist/engine/verify.test.js.map +1 -0
  109. package/dist/format.js +96 -0
  110. package/dist/format.js.map +1 -1
  111. package/dist/format.test.js +53 -0
  112. package/dist/format.test.js.map +1 -0
  113. package/dist/pr.test.js +48 -0
  114. package/dist/pr.test.js.map +1 -0
  115. package/package.json +4 -4
  116. package/dist/engine/dep-graph.js +0 -101
  117. package/dist/engine/dep-graph.js.map +0 -1
  118. package/dist/engine/staged-fix.js +0 -108
  119. package/dist/engine/staged-fix.js.map +0 -1
  120. package/dist/engine/stages.js +0 -125
  121. package/dist/engine/stages.js.map +0 -1
@@ -1,8 +1,8 @@
1
- import { exec } from "node:child_process";
2
- import { promisify } from "node:util";
1
+ import { exec } from "./exec.js";
3
2
  import { join } from "node:path";
4
3
  import { pathExists } from "./ecosystems/types.js";
5
- const execAsync = promisify(exec);
4
+ /** Milliseconds; type/lint checks on a large project must not hang the run forever. */
5
+ const CHECK_TIMEOUT_MS = 120_000;
6
6
  /**
7
7
  * Run static analysis checks (TypeScript, ESLint) on the codebase.
8
8
  * This catches issues that runtime tests might miss:
@@ -14,80 +14,63 @@ export async function runStaticAnalysis(cwd, options = {}) {
14
14
  const results = [];
15
15
  // 1. TypeScript type check
16
16
  if (checkTypes && (await hasTsConfig(cwd))) {
17
- try {
18
- const { stdout, stderr } = await execAsync("npx tsc --noEmit", {
19
- cwd,
20
- timeout: 60000, // 1 minute timeout
21
- });
22
- results.push({
23
- passed: true,
24
- stage: "types",
25
- output: stdout + stderr,
26
- });
27
- }
28
- catch (err) {
29
- const output = err.stdout + err.stderr;
30
- results.push({
31
- passed: false,
32
- stage: "types",
33
- output,
34
- warnings: parseTypeErrors(output),
35
- });
36
- }
17
+ const r = await exec("npx", ["tsc", "--noEmit"], { cwd, timeout: CHECK_TIMEOUT_MS });
18
+ results.push({
19
+ passed: r.code === 0,
20
+ stage: "types",
21
+ output: r.combined,
22
+ ...(r.code !== 0 ? { warnings: parseTypeErrors(r.combined) } : {}),
23
+ });
37
24
  }
38
25
  // 2. ESLint check
39
- if (checkLint && (await hasEslintConfig(cwd))) {
40
- try {
41
- const { stdout, stderr } = await execAsync("npx eslint . --ext .ts,.tsx,.js,.jsx --format compact", {
42
- cwd,
43
- timeout: 60000,
44
- });
45
- results.push({
46
- passed: true,
47
- stage: "lint",
48
- output: stdout + stderr,
49
- });
50
- }
51
- catch (err) {
52
- const output = err.stdout + err.stderr;
53
- results.push({
54
- passed: strictLint ? false : true, // Lint warnings don't fail by default
55
- stage: "lint",
56
- output,
57
- warnings: parseLintWarnings(output),
58
- });
59
- }
26
+ const eslint = await detectEslintConfig(cwd);
27
+ if (checkLint && eslint) {
28
+ // ESLint 9 flat config rejects --ext (it lints configured files); only
29
+ // legacy eslintrc setups need the explicit extension list.
30
+ const args = eslint.kind === "flat"
31
+ ? ["eslint", ".", "--format", "compact"]
32
+ : ["eslint", ".", "--ext", ".ts,.tsx,.js,.jsx", "--format", "compact"];
33
+ const r = await exec("npx", args, { cwd, timeout: CHECK_TIMEOUT_MS });
34
+ const failed = r.code !== 0;
35
+ results.push({
36
+ passed: strictLint ? !failed : true, // Lint errors don't fail by default…
37
+ stage: "lint",
38
+ output: r.combined,
39
+ // …but the warnings must still reach the summary — previously they were
40
+ // computed and then silently dropped by the caller.
41
+ ...(failed ? { warnings: parseLintWarnings(r.combined) } : {}),
42
+ });
60
43
  }
61
44
  return results;
62
45
  }
63
46
  async function hasTsConfig(cwd) {
64
47
  return await pathExists(join(cwd, "tsconfig.json"));
65
48
  }
66
- async function hasEslintConfig(cwd) {
67
- const configs = [
68
- ".eslintrc.js",
69
- ".eslintrc.cjs",
70
- ".eslintrc.json",
71
- ".eslintrc.yml",
72
- ".eslintrc.yaml",
73
- ];
74
- for (const cfg of configs) {
49
+ export async function detectEslintConfig(cwd) {
50
+ // ESLint 9+ flat config
51
+ for (const cfg of ["eslint.config.js", "eslint.config.mjs", "eslint.config.cjs", "eslint.config.ts"]) {
52
+ if (await pathExists(join(cwd, cfg)))
53
+ return { kind: "flat" };
54
+ }
55
+ // Legacy eslintrc (including the extension-less variant)
56
+ for (const cfg of [".eslintrc", ".eslintrc.js", ".eslintrc.cjs", ".eslintrc.json", ".eslintrc.yml", ".eslintrc.yaml"]) {
75
57
  if (await pathExists(join(cwd, cfg)))
76
- return true;
58
+ return { kind: "legacy" };
77
59
  }
78
- // Check package.json for eslintConfig field
60
+ // package.json eslintConfig field is legacy-style config
79
61
  try {
80
62
  const pkgPath = join(cwd, "package.json");
81
63
  if (await pathExists(pkgPath)) {
82
- const pkg = JSON.parse(await import("node:fs/promises").then((fs) => fs.readFile(pkgPath, "utf8")));
64
+ const { readFile } = await import("node:fs/promises");
65
+ const pkg = JSON.parse(await readFile(pkgPath, "utf8"));
83
66
  if (pkg.eslintConfig)
84
- return true;
67
+ return { kind: "legacy" };
85
68
  }
86
69
  }
87
70
  catch {
88
71
  // Ignore
89
72
  }
90
- return false;
73
+ return null;
91
74
  }
92
75
  function parseTypeErrors(output) {
93
76
  // TypeScript error format: "file.ts(line,col): error TS1234: message"
@@ -1 +1 @@
1
- {"version":3,"file":"verify.js","sourceRoot":"","sources":["../../src/engine/verify.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"verify.js","sourceRoot":"","sources":["../../src/engine/verify.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ import { test } from "node:test";
2
+ import assert from "node:assert/strict";
3
+ import { mkdtemp, writeFile, rm } from "node:fs/promises";
4
+ import { tmpdir } from "node:os";
5
+ import { join } from "node:path";
6
+ import { detectEslintConfig } from "./verify.js";
7
+ async function withDir(files, fn) {
8
+ const dir = await mkdtemp(join(tmpdir(), "greenbump-verify-"));
9
+ for (const f of files)
10
+ await writeFile(join(dir, f), "{}", "utf8");
11
+ try {
12
+ await fn(dir);
13
+ }
14
+ finally {
15
+ await rm(dir, { recursive: true, force: true });
16
+ }
17
+ }
18
+ test("detectEslintConfig: recognizes ESLint 9 flat config", async () => {
19
+ await withDir(["eslint.config.js"], async (dir) => {
20
+ assert.deepEqual(await detectEslintConfig(dir), { kind: "flat" });
21
+ });
22
+ await withDir(["eslint.config.mjs"], async (dir) => {
23
+ assert.deepEqual(await detectEslintConfig(dir), { kind: "flat" });
24
+ });
25
+ });
26
+ test("detectEslintConfig: recognizes legacy eslintrc variants", async () => {
27
+ await withDir([".eslintrc.json"], async (dir) => {
28
+ assert.deepEqual(await detectEslintConfig(dir), { kind: "legacy" });
29
+ });
30
+ await withDir([".eslintrc"], async (dir) => {
31
+ assert.deepEqual(await detectEslintConfig(dir), { kind: "legacy" });
32
+ });
33
+ });
34
+ test("detectEslintConfig: package.json eslintConfig field counts as legacy", async () => {
35
+ const dir = await mkdtemp(join(tmpdir(), "greenbump-verify-"));
36
+ try {
37
+ await writeFile(join(dir, "package.json"), JSON.stringify({ eslintConfig: {} }), "utf8");
38
+ assert.deepEqual(await detectEslintConfig(dir), { kind: "legacy" });
39
+ }
40
+ finally {
41
+ await rm(dir, { recursive: true, force: true });
42
+ }
43
+ });
44
+ test("detectEslintConfig: no config returns null", async () => {
45
+ await withDir(["index.js"], async (dir) => {
46
+ assert.equal(await detectEslintConfig(dir), null);
47
+ });
48
+ });
49
+ //# sourceMappingURL=verify.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify.test.js","sourceRoot":"","sources":["../../src/engine/verify.test.ts"],"names":[],"mappings":"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"}
package/dist/format.js CHANGED
@@ -52,6 +52,9 @@ export function printSummaryBox(summary, write) {
52
52
  const tierNames = ["", "codemod (free)", "learned pattern (free)", "cached fix (free)"];
53
53
  write(bar(`${pc.dim("fixed by")} ${pc.green(tierNames[summary.fixedByTier])}`));
54
54
  }
55
+ if (summary.enhancedRounds) {
56
+ write(bar(`${pc.dim("enhanced loop")} ${summary.enhancedRounds} extra round(s) — verifier findings fixed automatically`));
57
+ }
55
58
  write(bar(`${pc.dim("files edited")} ${summary.editedFiles.length}`));
56
59
  for (const f of summary.editedFiles.slice(0, 6))
57
60
  write(bar(` ${pc.cyan("·")} ${f}`));
@@ -98,6 +101,21 @@ export function printSummaryBox(summary, write) {
98
101
  write(bar(""));
99
102
  write(bar(`${pc.dim("branch")} ${summary.branch}${summary.committed ? pc.green(" (committed)") : pc.yellow(" (uncommitted)")}`));
100
103
  }
104
+ // Failed fix: the working tree still holds the upgraded dependency plus
105
+ // whatever partial edits the agent made. Tell the user exactly how to get
106
+ // back to a clean state — a red run must never leave them stranded.
107
+ if (summary.neededFix && !summary.fixed) {
108
+ write(bar(""));
109
+ if (summary.branch && summary.baseBranch && !summary.committed) {
110
+ write(bar(pc.red("✗ nothing was committed — the branch holds the upgrade + partial AI edits.")));
111
+ write(bar(`${pc.dim("to inspect")} git diff`));
112
+ write(bar(`${pc.dim("to roll back")} git reset --hard && git checkout ${summary.baseBranch} && git branch -D ${summary.branch}`));
113
+ }
114
+ else if (!summary.branch) {
115
+ write(bar(pc.red("✗ no git isolation — the upgrade and partial AI edits are in your working tree.") +
116
+ pc.dim(" Review the changes (in a git repo: `git diff`, discard with `git restore .`), or re-install the previous version.")));
117
+ }
118
+ }
101
119
  }
102
120
  /** One-line-per-target summary for --all / multi-dep / --group runs. */
103
121
  export function printBatchSummary(results, write) {
@@ -133,4 +151,82 @@ export function printBatchSummary(results, write) {
133
151
  write(bar(`${color(icon)} ${item.dep} ${item.from} → ${item.to}${suffix}`, color));
134
152
  }
135
153
  }
154
+ /** Format the deterministic impact analysis report for --scan. */
155
+ export function formatScanImpact(report) {
156
+ const lines = [];
157
+ const { summary, detections } = report;
158
+ lines.push(pc.bold(`🌱 greenbump scan — ${summary.depsScanned} outdated ${summary.depsScanned === 1 ? "dependency" : "dependencies"}, ${summary.depsWithKnownBreaking} with known breaking changes`));
159
+ lines.push("");
160
+ for (const d of detections) {
161
+ // Dependency header line
162
+ const wsLabel = d.workspacePath && d.workspacePath !== "." ? ` (${d.workspacePath})` : "";
163
+ let statusLabel;
164
+ if (d.status === "unknown") {
165
+ statusLabel = pc.dim(" [unknown — no cached analysis]");
166
+ }
167
+ else if (d.status === "info-only") {
168
+ statusLabel = pc.dim(" [info-only — config migration, no code patterns]");
169
+ }
170
+ else if (d.status === "approx") {
171
+ statusLabel = pc.yellow(` [breaking: ${d.changes.length} ${d.changes.length === 1 ? "change" : "changes"} — ~${d.filesMatched} files, ~${d.locationsMatched} locations]`);
172
+ }
173
+ else {
174
+ const truncMark = d.truncated ? "≈ " : "";
175
+ statusLabel = ` [breaking: ${d.changes.length} ${d.changes.length === 1 ? "change" : "changes"} — ${truncMark}${d.filesMatched} files, ${truncMark}${d.locationsMatched} locations]`;
176
+ }
177
+ lines.push(`${pc.cyan(d.name)} ${pc.dim(d.current)} → ${pc.green(d.latest)}${wsLabel}${statusLabel}`);
178
+ // Changes
179
+ if (d.status === "ok" || d.status === "approx") {
180
+ d.changes.forEach((change, idx) => {
181
+ const approxMark = change.approx ? pc.yellow("[~] ") : "";
182
+ lines.push(` ${idx + 1}. ${approxMark}[${change.severity}] ${change.description} (${change.source})`);
183
+ if (change.rewrite) {
184
+ lines.push(` ${pc.dim("fix:")} ${change.rewrite}`);
185
+ }
186
+ // Show up to 5 locations per change
187
+ const maxShown = 5;
188
+ let shownCount = 0;
189
+ for (const fg of change.fileGroups) {
190
+ for (const loc of fg.locations) {
191
+ if (shownCount >= maxShown)
192
+ break;
193
+ lines.push(` ${pc.dim(loc.file)}:${loc.line}: ${loc.excerpt}`);
194
+ shownCount++;
195
+ }
196
+ if (shownCount >= maxShown)
197
+ break;
198
+ }
199
+ if (change.matches > maxShown) {
200
+ lines.push(` ${pc.dim(`… +${change.matches - maxShown} more`)}`);
201
+ }
202
+ lines.push(` ${pc.dim(`→ ${change.matches} ${change.matches === 1 ? "location" : "locations"} in ${change.fileGroups.length} ${change.fileGroups.length === 1 ? "file" : "files"}`)}`);
203
+ });
204
+ }
205
+ else if (d.status === "unknown") {
206
+ lines.push(` ${pc.dim(`Run: greenbump ${d.name} && greenbump --scan (uses your API key once, then free)`)}`);
207
+ }
208
+ else if (d.status === "info-only") {
209
+ // Show first change description
210
+ if (d.changes.length > 0) {
211
+ lines.push(` ${pc.dim(d.changes[0].description)}`);
212
+ }
213
+ if (d.fileCreations) {
214
+ for (const fc of d.fileCreations) {
215
+ lines.push(` ${pc.dim(`note: will create ${fc.path}`)}`);
216
+ }
217
+ }
218
+ }
219
+ lines.push("");
220
+ }
221
+ // Summary
222
+ if (summary.depsWithKnownBreaking > 0) {
223
+ const truncNote = summary.truncated ? " (approximate — some hits truncated)" : "";
224
+ lines.push(pc.bold(`Summary: ${summary.depsWithKnownBreaking} ${summary.depsWithKnownBreaking === 1 ? "dependency" : "dependencies"} with breaking changes touch ${summary.filesAffected} ${summary.filesAffected === 1 ? "file" : "files"}, ${summary.locationsAffected} ${summary.locationsAffected === 1 ? "location" : "locations"}.${truncNote}`));
225
+ lines.push(pc.dim("Deterministic preview: no LLM calls, no network — sources: built-in codemods, changelog cache."));
226
+ }
227
+ else {
228
+ lines.push(pc.green("✓ No known breaking changes detected in outdated dependencies."));
229
+ }
230
+ return lines.join("\n");
231
+ }
136
232
  //# sourceMappingURL=format.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"format.js","sourceRoot":"","sources":["../src/format.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"format.js","sourceRoot":"","sources":["../src/format.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ import { test } from "node:test";
2
+ import assert from "node:assert/strict";
3
+ import { printSummaryBox } from "./format.js";
4
+ function baseSummary(overrides) {
5
+ return {
6
+ dep: "react",
7
+ from: "18.3.1",
8
+ to: "19.2.0",
9
+ packageManager: "npm",
10
+ baselineGreen: true,
11
+ neededFix: true,
12
+ fixed: false,
13
+ unverifiable: false,
14
+ needsReview: false,
15
+ committed: false,
16
+ rounds: 3,
17
+ usage: { inputTokens: 100, outputTokens: 50 },
18
+ editedFiles: ["src/App.tsx"],
19
+ testFilesTouched: [],
20
+ durationMs: 1234,
21
+ ...overrides,
22
+ };
23
+ }
24
+ function render(summary) {
25
+ const lines = [];
26
+ // strip ANSI so assertions match plain text
27
+ printSummaryBox(summary, (s) => lines.push(s.replace(/\[\d+m/g, "")));
28
+ return lines.join("\n");
29
+ }
30
+ test("printSummaryBox: failed fix on a branch prints exact rollback commands", () => {
31
+ const out = render(baseSummary({ branch: "greenbump/react-19.2.0", baseBranch: "main", committed: false }));
32
+ assert.match(out, /git reset --hard && git checkout main && git branch -D greenbump\/react-19\.2\.0/);
33
+ assert.match(out, /nothing was committed/);
34
+ });
35
+ test("printSummaryBox: failed fix without git isolation warns about the dirty working tree", () => {
36
+ const out = render(baseSummary({ branch: undefined, baseBranch: undefined }));
37
+ assert.match(out, /no git isolation/);
38
+ assert.doesNotMatch(out, /git branch -D/);
39
+ });
40
+ test("printSummaryBox: successful fix prints no rollback block", () => {
41
+ const out = render(baseSummary({ fixed: true, committed: true, branch: "greenbump/react-19.2.0", baseBranch: "main" }));
42
+ assert.doesNotMatch(out, /git reset --hard/);
43
+ assert.doesNotMatch(out, /no git isolation/);
44
+ });
45
+ test("printSummaryBox: enhanced loop rounds are surfaced when verifier feedback saved the run", () => {
46
+ const out = render(baseSummary({ fixed: true, enhancedRounds: 2 }));
47
+ assert.match(out, /enhanced loop\s+2 extra round\(s\) — verifier findings fixed automatically/);
48
+ });
49
+ test("printSummaryBox: no enhanced loop line when the first pass was clean", () => {
50
+ const out = render(baseSummary({ fixed: true }));
51
+ assert.doesNotMatch(out, /enhanced loop/);
52
+ });
53
+ //# sourceMappingURL=format.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.test.js","sourceRoot":"","sources":["../src/format.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ import { test } from "node:test";
2
+ import assert from "node:assert/strict";
3
+ import { renderPrBody } from "./pr.js";
4
+ function baseSummary(overrides) {
5
+ return {
6
+ dep: "react",
7
+ from: "18.3.1",
8
+ to: "19.2.0",
9
+ packageManager: "npm",
10
+ baselineGreen: true,
11
+ neededFix: true,
12
+ fixed: true,
13
+ unverifiable: false,
14
+ needsReview: false,
15
+ committed: true,
16
+ rounds: 3,
17
+ usage: { inputTokens: 1000, outputTokens: 200 },
18
+ editedFiles: ["src/App.tsx"],
19
+ testFilesTouched: [],
20
+ durationMs: 12_000,
21
+ ...overrides,
22
+ };
23
+ }
24
+ test("renderPrBody: fixed-with-review mentions both the fix and the review flag", () => {
25
+ const body = renderPrBody(baseSummary({ needsReview: true }));
26
+ assert.match(body, /green again/);
27
+ assert.match(body, /flagged for review/);
28
+ assert.match(body, /src\/App\.tsx/);
29
+ });
30
+ test("renderPrBody: test files touched get the 🚨 callout", () => {
31
+ const body = renderPrBody(baseSummary({ testFilesTouched: ["app.test.ts"], needsReview: true }));
32
+ assert.match(body, /Review closely/);
33
+ assert.match(body, /app\.test\.ts/);
34
+ });
35
+ test("renderPrBody: unfixable upgrade says so plainly", () => {
36
+ const body = renderPrBody(baseSummary({ fixed: false, rounds: 15 }));
37
+ assert.match(body, /could not fully fix/);
38
+ });
39
+ test("renderPrBody: unverifiable run carries the warning", () => {
40
+ const body = renderPrBody(baseSummary({ unverifiable: true, neededFix: false, fixed: false }));
41
+ assert.match(body, /Unverified/);
42
+ });
43
+ test("renderPrBody: oversized diffs are truncated with a marker", () => {
44
+ const body = renderPrBody(baseSummary({ fullDiff: "x".repeat(60_000) }));
45
+ assert.match(body, /diff truncated/);
46
+ assert.ok(body.length < 40_000);
47
+ });
48
+ //# sourceMappingURL=pr.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pr.test.js","sourceRoot":"","sources":["../src/pr.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAGvC,SAAS,WAAW,CAAC,SAA8B;IACjD,OAAO;QACL,GAAG,EAAE,OAAO;QACZ,IAAI,EAAE,QAAQ;QACd,EAAE,EAAE,QAAQ;QACZ,cAAc,EAAE,KAAK;QACrB,aAAa,EAAE,IAAI;QACnB,SAAS,EAAE,IAAI;QACf,KAAK,EAAE,IAAI;QACX,YAAY,EAAE,KAAK;QACnB,WAAW,EAAE,KAAK;QAClB,SAAS,EAAE,IAAI;QACf,MAAM,EAAE,CAAC;QACT,KAAK,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,YAAY,EAAE,GAAG,EAAE;QAC/C,WAAW,EAAE,CAAC,aAAa,CAAC;QAC5B,gBAAgB,EAAE,EAAE;QACpB,UAAU,EAAE,MAAM;QAClB,GAAG,SAAS;KACb,CAAC;AACJ,CAAC;AAED,IAAI,CAAC,2EAA2E,EAAE,GAAG,EAAE;IACrF,MAAM,IAAI,GAAG,YAAY,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAC9D,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;IAClC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,oBAAoB,CAAC,CAAC;IACzC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;AACtC,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,qDAAqD,EAAE,GAAG,EAAE;IAC/D,MAAM,IAAI,GAAG,YAAY,CAAC,WAAW,CAAC,EAAE,gBAAgB,EAAE,CAAC,aAAa,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IACjG,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC;IACrC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;AACtC,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,iDAAiD,EAAE,GAAG,EAAE;IAC3D,MAAM,IAAI,GAAG,YAAY,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;IACrE,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,qBAAqB,CAAC,CAAC;AAC5C,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,oDAAoD,EAAE,GAAG,EAAE;IAC9D,MAAM,IAAI,GAAG,YAAY,CAAC,WAAW,CAAC,EAAE,YAAY,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;IAC/F,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;AACnC,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,2DAA2D,EAAE,GAAG,EAAE;IACrE,MAAM,IAAI,GAAG,YAAY,CAAC,WAAW,CAAC,EAAE,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IACzE,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC;IACrC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;AAClC,CAAC,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "greenbump",
3
- "version": "0.7.0",
3
+ "version": "0.9.0",
4
4
  "description": "Upgrade a dependency and let an AI agent fix the code it breaks — until CI is green. The Renovate that actually mends your code.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -22,9 +22,11 @@
22
22
  "homepage": "https://github.com/shidesheng0218/greenbump#readme",
23
23
  "scripts": {
24
24
  "build": "tsc",
25
- "build:action": "npm run build && esbuild dist/action/main.js --bundle --platform=node --target=node20 --format=cjs --outfile=action-dist/index.cjs",
25
+ "build:action": "npm run build && esbuild dist/action/main.js --bundle --platform=node --target=node24 --format=cjs --outfile=action-dist/index.cjs",
26
26
  "dev": "tsx src/cli.ts",
27
27
  "test": "npm run build && cd dist && node --test",
28
+ "bench": "npm run build && node dist/benchmarks/run.js",
29
+ "bench:no-llm": "npm run build && node dist/benchmarks/run.js --no-llm",
28
30
  "prepublishOnly": "npm run build"
29
31
  },
30
32
  "keywords": [
@@ -42,13 +44,11 @@
42
44
  "dependencies": {
43
45
  "@anthropic-ai/sdk": "^0.68.0",
44
46
  "commander": "^14.0.0",
45
- "madge": "^8.0.0",
46
47
  "openai": "^4.77.0",
47
48
  "picocolors": "^1.1.1",
48
49
  "typescript": "^5.7.0"
49
50
  },
50
51
  "devDependencies": {
51
- "@types/madge": "^5.0.3",
52
52
  "@types/node": "^22.10.0",
53
53
  "esbuild": "^0.24.0",
54
54
  "glob": "^13.0.6",
@@ -1,101 +0,0 @@
1
- import madge from "madge";
2
- /**
3
- * Build a dependency graph for the codebase and identify which files
4
- * are affected by upgrading a specific package.
5
- *
6
- * This helps prioritize which files to fix first in a staged fix approach.
7
- */
8
- export async function buildDependencyGraph(cwd, upgradedPkg) {
9
- try {
10
- // Use madge to analyze dependencies
11
- const result = await madge(cwd, {
12
- fileExtensions: ["js", "ts", "jsx", "tsx"],
13
- excludeRegExp: [/node_modules/, /dist/, /build/, /\.test\.|\.spec\./],
14
- });
15
- const graph = result.obj();
16
- const nodes = [];
17
- // Convert madge graph to our format
18
- for (const [file, imports] of Object.entries(graph)) {
19
- const importsList = imports;
20
- // Check if this file directly imports the upgraded package
21
- const usesUpgradedPkg = importsList.some((imp) => {
22
- // Match import statements like: import x from 'react'
23
- // or: const x = require('react')
24
- return imp === upgradedPkg || imp.startsWith(`${upgradedPkg}/`);
25
- });
26
- nodes.push({
27
- file,
28
- imports: importsList,
29
- usesUpgradedPkg,
30
- });
31
- }
32
- return nodes;
33
- }
34
- catch (err) {
35
- // Madge might fail on certain codebases - return empty graph
36
- console.warn(`Failed to build dependency graph: ${err.message}`);
37
- return [];
38
- }
39
- }
40
- /**
41
- * Organize files into layers based on dependency distance from the upgraded package.
42
- *
43
- * Layer 0: Files that directly import the upgraded package
44
- * Layer 1: Files that import Layer 0 files
45
- * Layer 2: Files that import Layer 1 files
46
- * etc.
47
- *
48
- * This layering helps fix files in order: fix the "leaves" first (directly affected),
49
- * then work up the dependency tree.
50
- */
51
- export function organizeLayers(nodes) {
52
- const layers = [];
53
- const fileToLayer = new Map();
54
- // Layer 0: direct users of the upgraded package
55
- const layer0Files = nodes
56
- .filter((n) => n.usesUpgradedPkg)
57
- .map((n) => n.file);
58
- if (layer0Files.length === 0) {
59
- // No direct imports found - return all files as one layer
60
- return [
61
- {
62
- level: 0,
63
- files: nodes.map((n) => n.file),
64
- },
65
- ];
66
- }
67
- layers.push({ level: 0, files: layer0Files });
68
- layer0Files.forEach((f) => fileToLayer.set(f, 0));
69
- // Build subsequent layers
70
- let currentLayer = 0;
71
- let remainingNodes = nodes.filter((n) => !n.usesUpgradedPkg);
72
- while (remainingNodes.length > 0 && currentLayer < 10) {
73
- // Cap at 10 layers to avoid infinite loops
74
- currentLayer++;
75
- const prevLayerFiles = layers[currentLayer - 1].files;
76
- const nextLayerFiles = [];
77
- for (const node of remainingNodes) {
78
- // Check if this node imports any files from the previous layer
79
- const importsPrevLayer = node.imports.some((imp) => prevLayerFiles.includes(imp));
80
- if (importsPrevLayer) {
81
- nextLayerFiles.push(node.file);
82
- fileToLayer.set(node.file, currentLayer);
83
- }
84
- }
85
- if (nextLayerFiles.length === 0) {
86
- // No more dependencies found - remaining files are unaffected
87
- break;
88
- }
89
- layers.push({ level: currentLayer, files: nextLayerFiles });
90
- remainingNodes = remainingNodes.filter((n) => !fileToLayer.has(n.file));
91
- }
92
- return layers;
93
- }
94
- /**
95
- * Get a flat list of files to fix, ordered by dependency layer (leaves first).
96
- * This is what the fix loop will iterate through.
97
- */
98
- export function getPrioritizedFiles(layers) {
99
- return layers.flatMap((layer) => layer.files);
100
- }
101
- //# sourceMappingURL=dep-graph.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"dep-graph.js","sourceRoot":"","sources":["../../src/engine/dep-graph.ts"],"names":[],"mappings":"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"}