greenbump 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.
Files changed (116) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +125 -0
  3. package/README.zh-CN.md +213 -0
  4. package/action-dist/index.cjs +19695 -0
  5. package/action.yml +76 -0
  6. package/dist/action/github.js +70 -0
  7. package/dist/action/github.js.map +1 -0
  8. package/dist/action/main.js +99 -0
  9. package/dist/action/main.js.map +1 -0
  10. package/dist/agent/factory.js +72 -0
  11. package/dist/agent/factory.js.map +1 -0
  12. package/dist/agent/fixer.js +307 -0
  13. package/dist/agent/fixer.js.map +1 -0
  14. package/dist/agent/fixer.test.js +224 -0
  15. package/dist/agent/fixer.test.js.map +1 -0
  16. package/dist/agent/provider-anthropic.js +59 -0
  17. package/dist/agent/provider-anthropic.js.map +1 -0
  18. package/dist/agent/provider-openai.js +65 -0
  19. package/dist/agent/provider-openai.js.map +1 -0
  20. package/dist/agent/provider.js +4 -0
  21. package/dist/agent/provider.js.map +1 -0
  22. package/dist/cli.js +138 -0
  23. package/dist/cli.js.map +1 -0
  24. package/dist/engine/batch.js +246 -0
  25. package/dist/engine/batch.js.map +1 -0
  26. package/dist/engine/batch.test.js +59 -0
  27. package/dist/engine/batch.test.js.map +1 -0
  28. package/dist/engine/changelog.js +66 -0
  29. package/dist/engine/changelog.js.map +1 -0
  30. package/dist/engine/checks.js +41 -0
  31. package/dist/engine/checks.js.map +1 -0
  32. package/dist/engine/checks.test.js +92 -0
  33. package/dist/engine/checks.test.js.map +1 -0
  34. package/dist/engine/detect.js +5 -0
  35. package/dist/engine/detect.js.map +1 -0
  36. package/dist/engine/ecosystems/bundler.js +59 -0
  37. package/dist/engine/ecosystems/bundler.js.map +1 -0
  38. package/dist/engine/ecosystems/cargo.js +83 -0
  39. package/dist/engine/ecosystems/cargo.js.map +1 -0
  40. package/dist/engine/ecosystems/cocoapods.js +47 -0
  41. package/dist/engine/ecosystems/cocoapods.js.map +1 -0
  42. package/dist/engine/ecosystems/composer.js +32 -0
  43. package/dist/engine/ecosystems/composer.js.map +1 -0
  44. package/dist/engine/ecosystems/conan.js +106 -0
  45. package/dist/engine/ecosystems/conan.js.map +1 -0
  46. package/dist/engine/ecosystems/elm.js +77 -0
  47. package/dist/engine/ecosystems/elm.js.map +1 -0
  48. package/dist/engine/ecosystems/go.js +72 -0
  49. package/dist/engine/ecosystems/go.js.map +1 -0
  50. package/dist/engine/ecosystems/gradle.js +90 -0
  51. package/dist/engine/ecosystems/gradle.js.map +1 -0
  52. package/dist/engine/ecosystems/index.js +67 -0
  53. package/dist/engine/ecosystems/index.js.map +1 -0
  54. package/dist/engine/ecosystems/maven.js +77 -0
  55. package/dist/engine/ecosystems/maven.js.map +1 -0
  56. package/dist/engine/ecosystems/mix.js +64 -0
  57. package/dist/engine/ecosystems/mix.js.map +1 -0
  58. package/dist/engine/ecosystems/npm.js +47 -0
  59. package/dist/engine/ecosystems/npm.js.map +1 -0
  60. package/dist/engine/ecosystems/nuget.js +50 -0
  61. package/dist/engine/ecosystems/nuget.js.map +1 -0
  62. package/dist/engine/ecosystems/parsers.test.js +255 -0
  63. package/dist/engine/ecosystems/parsers.test.js.map +1 -0
  64. package/dist/engine/ecosystems/pip.js +61 -0
  65. package/dist/engine/ecosystems/pip.js.map +1 -0
  66. package/dist/engine/ecosystems/pipenv.js +37 -0
  67. package/dist/engine/ecosystems/pipenv.js.map +1 -0
  68. package/dist/engine/ecosystems/pnpm.js +48 -0
  69. package/dist/engine/ecosystems/pnpm.js.map +1 -0
  70. package/dist/engine/ecosystems/poetry.js +42 -0
  71. package/dist/engine/ecosystems/poetry.js.map +1 -0
  72. package/dist/engine/ecosystems/pub.js +32 -0
  73. package/dist/engine/ecosystems/pub.js.map +1 -0
  74. package/dist/engine/ecosystems/python-shared.js +29 -0
  75. package/dist/engine/ecosystems/python-shared.js.map +1 -0
  76. package/dist/engine/ecosystems/swiftpm.js +102 -0
  77. package/dist/engine/ecosystems/swiftpm.js.map +1 -0
  78. package/dist/engine/ecosystems/types.js +19 -0
  79. package/dist/engine/ecosystems/types.js.map +1 -0
  80. package/dist/engine/ecosystems/uv.js +36 -0
  81. package/dist/engine/ecosystems/uv.js.map +1 -0
  82. package/dist/engine/ecosystems/yarn.js +62 -0
  83. package/dist/engine/ecosystems/yarn.js.map +1 -0
  84. package/dist/engine/exec.js +47 -0
  85. package/dist/engine/exec.js.map +1 -0
  86. package/dist/engine/git.js +42 -0
  87. package/dist/engine/git.js.map +1 -0
  88. package/dist/engine/git.test.js +111 -0
  89. package/dist/engine/git.test.js.map +1 -0
  90. package/dist/engine/pm.js +14 -0
  91. package/dist/engine/pm.js.map +1 -0
  92. package/dist/engine/run.js +167 -0
  93. package/dist/engine/run.js.map +1 -0
  94. package/dist/engine/run.test.js +47 -0
  95. package/dist/engine/run.test.js.map +1 -0
  96. package/dist/engine/upgrade.js +10 -0
  97. package/dist/engine/upgrade.js.map +1 -0
  98. package/dist/engine/workspace.js +155 -0
  99. package/dist/engine/workspace.js.map +1 -0
  100. package/dist/engine/workspace.test.js +95 -0
  101. package/dist/engine/workspace.test.js.map +1 -0
  102. package/dist/exitcode.js +51 -0
  103. package/dist/exitcode.js.map +1 -0
  104. package/dist/exitcode.test.js +62 -0
  105. package/dist/exitcode.test.js.map +1 -0
  106. package/dist/format.js +101 -0
  107. package/dist/format.js.map +1 -0
  108. package/dist/pr.js +63 -0
  109. package/dist/pr.js.map +1 -0
  110. package/dist/report.js +13 -0
  111. package/dist/report.js.map +1 -0
  112. package/dist/report.test.js +56 -0
  113. package/dist/report.test.js.map +1 -0
  114. package/dist/test-utils.js +36 -0
  115. package/dist/test-utils.js.map +1 -0
  116. package/package.json +56 -0
@@ -0,0 +1,95 @@
1
+ import { test } from "node:test";
2
+ import assert from "node:assert/strict";
3
+ import { mkdir, writeFile } from "node:fs/promises";
4
+ import { join } from "node:path";
5
+ import { withTmpDir } from "../test-utils.js";
6
+ import { detectWorkspaceMembers, resolveWorkspaceTarget, WorkspaceAmbiguityError, WORKSPACE_ROOT, } from "./workspace.js";
7
+ async function writeJson(path, data) {
8
+ await writeFile(path, JSON.stringify(data), "utf8");
9
+ }
10
+ test("detectWorkspaceMembers: non-workspace repo returns []", async () => {
11
+ await withTmpDir(async (dir) => {
12
+ await writeJson(join(dir, "package.json"), { name: "solo" });
13
+ assert.deepEqual(await detectWorkspaceMembers(dir), []);
14
+ });
15
+ });
16
+ test("detectWorkspaceMembers: npm/yarn `workspaces` array field", async () => {
17
+ await withTmpDir(async (dir) => {
18
+ await writeJson(join(dir, "package.json"), { name: "root", workspaces: ["packages/*"] });
19
+ await mkdir(join(dir, "packages", "api"), { recursive: true });
20
+ await mkdir(join(dir, "packages", "web"), { recursive: true });
21
+ await writeJson(join(dir, "packages", "api", "package.json"), { name: "@x/api" });
22
+ await writeJson(join(dir, "packages", "web", "package.json"), { name: "@x/web" });
23
+ const members = await detectWorkspaceMembers(dir);
24
+ const names = members.map((m) => m.name).sort();
25
+ const paths = members.map((m) => m.path).sort();
26
+ assert.deepEqual(names, ["@x/api", "@x/web"]);
27
+ assert.deepEqual(paths, ["packages/api", "packages/web"]);
28
+ });
29
+ });
30
+ test("detectWorkspaceMembers: npm `workspaces.packages` object form", async () => {
31
+ await withTmpDir(async (dir) => {
32
+ await writeJson(join(dir, "package.json"), { name: "root", workspaces: { packages: ["apps/*"] } });
33
+ await mkdir(join(dir, "apps", "cli"), { recursive: true });
34
+ await writeJson(join(dir, "apps", "cli", "package.json"), { name: "cli" });
35
+ const members = await detectWorkspaceMembers(dir);
36
+ assert.deepEqual(members, [{ path: "apps/cli", name: "cli" }]);
37
+ });
38
+ });
39
+ test("detectWorkspaceMembers: pnpm-workspace.yaml", async () => {
40
+ await withTmpDir(async (dir) => {
41
+ await writeJson(join(dir, "package.json"), { name: "root" });
42
+ await writeFile(join(dir, "pnpm-workspace.yaml"), 'packages:\n - "packages/*"\n - "tools/*"\n', "utf8");
43
+ await mkdir(join(dir, "packages", "core"), { recursive: true });
44
+ await mkdir(join(dir, "tools", "gen"), { recursive: true });
45
+ await writeJson(join(dir, "packages", "core", "package.json"), { name: "core" });
46
+ await writeJson(join(dir, "tools", "gen", "package.json"), { name: "gen" });
47
+ const members = await detectWorkspaceMembers(dir);
48
+ const paths = members.map((m) => m.path).sort();
49
+ assert.deepEqual(paths, ["packages/core", "tools/gen"]);
50
+ });
51
+ });
52
+ test("detectWorkspaceMembers: glob directories without a package.json are skipped", async () => {
53
+ await withTmpDir(async (dir) => {
54
+ await writeJson(join(dir, "package.json"), { name: "root", workspaces: ["packages/*"] });
55
+ await mkdir(join(dir, "packages", "empty-scaffold"), { recursive: true });
56
+ // no package.json inside "empty-scaffold"
57
+ assert.deepEqual(await detectWorkspaceMembers(dir), []);
58
+ });
59
+ });
60
+ function outdated(name, current, latest, workspacePath) {
61
+ return { name, current, wanted: "", latest, workspacePath };
62
+ }
63
+ test("resolveWorkspaceTarget: unambiguous single match resolves directly", () => {
64
+ const candidates = [outdated("lodash", "4.17.20", "4.17.21", WORKSPACE_ROOT)];
65
+ const result = resolveWorkspaceTarget("lodash", candidates);
66
+ assert.equal(result?.workspacePath, WORKSPACE_ROOT);
67
+ });
68
+ test("resolveWorkspaceTarget: same version across packages is not ambiguous", () => {
69
+ const candidates = [
70
+ outdated("lodash", "4.17.20", "4.17.21", "packages/api"),
71
+ outdated("lodash", "4.17.20", "4.17.21", "packages/web"),
72
+ ];
73
+ // Same current version everywhere — no real ambiguity, first match wins.
74
+ assert.doesNotThrow(() => resolveWorkspaceTarget("lodash", candidates));
75
+ });
76
+ test("resolveWorkspaceTarget: different versions across packages throws WorkspaceAmbiguityError", () => {
77
+ const candidates = [
78
+ outdated("lodash", "4.17.15", "4.17.21", "packages/api"),
79
+ outdated("lodash", "4.17.20", "4.17.21", "packages/web"),
80
+ ];
81
+ assert.throws(() => resolveWorkspaceTarget("lodash", candidates), WorkspaceAmbiguityError);
82
+ });
83
+ test("resolveWorkspaceTarget: --workspace disambiguates an otherwise-ambiguous name", () => {
84
+ const candidates = [
85
+ outdated("lodash", "4.17.15", "4.17.21", "packages/api"),
86
+ outdated("lodash", "4.17.20", "4.17.21", "packages/web"),
87
+ ];
88
+ const result = resolveWorkspaceTarget("lodash", candidates, "packages/web");
89
+ assert.equal(result?.current, "4.17.20");
90
+ });
91
+ test("resolveWorkspaceTarget: no match returns undefined", () => {
92
+ const candidates = [outdated("lodash", "4.17.20", "4.17.21", WORKSPACE_ROOT)];
93
+ assert.equal(resolveWorkspaceTarget("react", candidates), undefined);
94
+ });
95
+ //# sourceMappingURL=workspace.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace.test.js","sourceRoot":"","sources":["../../src/engine/workspace.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Exit code for a single run.
3
+ * 0 = clean success
4
+ * 1 = hard failure (thrown error) — handled by callers directly, not here
5
+ * 2 = fix loop ran and never got green — unchanged from pre-batch behavior
6
+ * 3 = succeeded (or committed) but a human should look before merging
7
+ */
8
+ export function exitCodeFor(s) {
9
+ if (s.neededFix && !s.fixed)
10
+ return 2;
11
+ if (s.needsReview)
12
+ return 3;
13
+ return 0;
14
+ }
15
+ /**
16
+ * Severity ranking used to pick one exit code out of a batch of results.
17
+ * Higher = worse. 1 (hard failure) outranks 2 (unfixed), which outranks
18
+ * 3 (needs review), which outranks 0 (clean) — note this is NOT the same
19
+ * order as the numeric exit codes themselves.
20
+ */
21
+ function severityRank(code) {
22
+ switch (code) {
23
+ case 1:
24
+ return 3;
25
+ case 2:
26
+ return 2;
27
+ case 3:
28
+ return 1;
29
+ default:
30
+ return 0;
31
+ }
32
+ }
33
+ /** Exit code for one batch item: a thrown/caught failure is always severity 1. */
34
+ export function exitCodeForItem(item) {
35
+ return "error" in item ? 1 : exitCodeFor(item);
36
+ }
37
+ /** Roll up a batch of results into the single highest-severity exit code. */
38
+ export function overallExitCode(items) {
39
+ let best = 0;
40
+ let bestRank = -1;
41
+ for (const item of items) {
42
+ const code = exitCodeForItem(item);
43
+ const rank = severityRank(code);
44
+ if (rank > bestRank) {
45
+ bestRank = rank;
46
+ best = code;
47
+ }
48
+ }
49
+ return best;
50
+ }
51
+ //# sourceMappingURL=exitcode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exitcode.js","sourceRoot":"","sources":["../src/exitcode.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,MAAM,UAAU,WAAW,CAAC,CAAa;IACvC,IAAI,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC,KAAK;QAAE,OAAO,CAAC,CAAC;IACtC,IAAI,CAAC,CAAC,WAAW;QAAE,OAAO,CAAC,CAAC;IAC5B,OAAO,CAAC,CAAC;AACX,CAAC;AAED;;;;;GAKG;AACH,SAAS,YAAY,CAAC,IAAY;IAChC,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,CAAC;YACJ,OAAO,CAAC,CAAC;QACX,KAAK,CAAC;YACJ,OAAO,CAAC,CAAC;QACX,KAAK,CAAC;YACJ,OAAO,CAAC,CAAC;QACX;YACE,OAAO,CAAC,CAAC;IACb,CAAC;AACH,CAAC;AAED,kFAAkF;AAClF,MAAM,UAAU,eAAe,CAAC,IAA6B;IAC3D,OAAO,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;AACjD,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,eAAe,CAAC,KAAqC;IACnE,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,IAAI,QAAQ,GAAG,CAAC,CAAC,CAAC;IAClB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;QACnC,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;QAChC,IAAI,IAAI,GAAG,QAAQ,EAAE,CAAC;YACpB,QAAQ,GAAG,IAAI,CAAC;YAChB,IAAI,GAAG,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,62 @@
1
+ import { test } from "node:test";
2
+ import assert from "node:assert/strict";
3
+ import { exitCodeFor, overallExitCode } from "./exitcode.js";
4
+ function summary(overrides) {
5
+ return {
6
+ dep: "lodash",
7
+ from: "4.17.20",
8
+ to: "4.17.21",
9
+ packageManager: "npm",
10
+ baselineGreen: true,
11
+ neededFix: false,
12
+ fixed: true,
13
+ unverifiable: false,
14
+ needsReview: false,
15
+ committed: true,
16
+ rounds: 0,
17
+ usage: { inputTokens: 0, outputTokens: 0 },
18
+ editedFiles: [],
19
+ testFilesTouched: [],
20
+ durationMs: 0,
21
+ ...overrides,
22
+ };
23
+ }
24
+ test("exitCodeFor: clean success is 0", () => {
25
+ assert.equal(exitCodeFor(summary({})), 0);
26
+ });
27
+ test("exitCodeFor: unfixed after a fix attempt is 2", () => {
28
+ assert.equal(exitCodeFor(summary({ neededFix: true, fixed: false })), 2);
29
+ });
30
+ test("exitCodeFor: needsReview (test file touched) is 3", () => {
31
+ assert.equal(exitCodeFor(summary({ neededFix: true, fixed: true, needsReview: true })), 3);
32
+ });
33
+ test("exitCodeFor: needsReview from unverifiable is 3", () => {
34
+ assert.equal(exitCodeFor(summary({ unverifiable: true, needsReview: true })), 3);
35
+ });
36
+ test("exitCodeFor: unfixed (2) takes priority over needsReview when both would apply", () => {
37
+ // neededFix && !fixed always wins — needsReview never overloads that state.
38
+ assert.equal(exitCodeFor(summary({ neededFix: true, fixed: false, needsReview: true })), 2);
39
+ });
40
+ test("overallExitCode: a hard failure (1) outranks everything else", () => {
41
+ const failure = { dep: "axios", error: "boom", fatal: true };
42
+ const items = [summary({}), summary({ neededFix: true, fixed: false }), failure];
43
+ assert.equal(overallExitCode(items), 1);
44
+ });
45
+ test("overallExitCode: unfixed (2) outranks needsReview (3) when no hard failure", () => {
46
+ const items = [
47
+ summary({ neededFix: true, fixed: true, needsReview: true }),
48
+ summary({ neededFix: true, fixed: false }),
49
+ ];
50
+ assert.equal(overallExitCode(items), 2);
51
+ });
52
+ test("overallExitCode: needsReview (3) outranks clean success (0)", () => {
53
+ const items = [summary({}), summary({ unverifiable: true, needsReview: true })];
54
+ assert.equal(overallExitCode(items), 3);
55
+ });
56
+ test("overallExitCode: all clean is 0", () => {
57
+ assert.equal(overallExitCode([summary({}), summary({})]), 0);
58
+ });
59
+ test("overallExitCode: empty batch is 0", () => {
60
+ assert.equal(overallExitCode([]), 0);
61
+ });
62
+ //# sourceMappingURL=exitcode.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exitcode.test.js","sourceRoot":"","sources":["../src/exitcode.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAG7D,SAAS,OAAO,CAAC,SAA8B;IAC7C,OAAO;QACL,GAAG,EAAE,QAAQ;QACb,IAAI,EAAE,SAAS;QACf,EAAE,EAAE,SAAS;QACb,cAAc,EAAE,KAAK;QACrB,aAAa,EAAE,IAAI;QACnB,SAAS,EAAE,KAAK;QAChB,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,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE;QAC1C,WAAW,EAAE,EAAE;QACf,gBAAgB,EAAE,EAAE;QACpB,UAAU,EAAE,CAAC;QACb,GAAG,SAAS;KACb,CAAC;AACJ,CAAC;AAED,IAAI,CAAC,iCAAiC,EAAE,GAAG,EAAE;IAC3C,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAC5C,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,+CAA+C,EAAE,GAAG,EAAE;IACzD,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAC3E,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,mDAAmD,EAAE,GAAG,EAAE;IAC7D,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAC7F,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,iDAAiD,EAAE,GAAG,EAAE;IAC3D,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACnF,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,gFAAgF,EAAE,GAAG,EAAE;IAC1F,4EAA4E;IAC5E,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAC9F,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,8DAA8D,EAAE,GAAG,EAAE;IACxE,MAAM,OAAO,GAAe,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IACzE,MAAM,KAAK,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC;IACjF,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;AAC1C,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,4EAA4E,EAAE,GAAG,EAAE;IACtF,MAAM,KAAK,GAAG;QACZ,OAAO,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;QAC5D,OAAO,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;KAC3C,CAAC;IACF,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;AAC1C,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,6DAA6D,EAAE,GAAG,EAAE;IACvE,MAAM,KAAK,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAChF,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;AAC1C,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,iCAAiC,EAAE,GAAG,EAAE;IAC3C,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAC/D,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,mCAAmC,EAAE,GAAG,EAAE;IAC7C,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AACvC,CAAC,CAAC,CAAC"}
package/dist/format.js ADDED
@@ -0,0 +1,101 @@
1
+ import pc from "picocolors";
2
+ export function formatDuration(ms) {
3
+ if (ms < 1000)
4
+ return `${ms}ms`;
5
+ const s = ms / 1000;
6
+ if (s < 60)
7
+ return `${s.toFixed(1)}s`;
8
+ const m = Math.floor(s / 60);
9
+ const rem = Math.round(s % 60);
10
+ return `${m}m${rem}s`;
11
+ }
12
+ // A left-rule "callout" style rather than a full box: full-width unicode
13
+ // (emoji, CJK, arrows) renders at inconsistent column widths across
14
+ // terminals, which breaks right-aligned borders. A left bar needs no width
15
+ // math and never looks broken.
16
+ function bar(text, color = pc.dim) {
17
+ return `${color("│")} ${text}`;
18
+ }
19
+ /** Render a one-glance summary of a run to the given writer (e.g. console.error). */
20
+ export function printSummaryBox(summary, write) {
21
+ let headline;
22
+ let barColor;
23
+ if (summary.unverifiable) {
24
+ barColor = pc.yellow;
25
+ headline = `${pc.yellow("⚠")} ${summary.dep} ${summary.from} → ${summary.to} — UNVERIFIED (no build/test)`;
26
+ }
27
+ else if (!summary.neededFix) {
28
+ barColor = pc.green;
29
+ headline = `${pc.green("✓")} ${summary.dep} ${summary.from} → ${summary.to} — clean, nothing broke`;
30
+ }
31
+ else if (summary.fixed && summary.needsReview) {
32
+ barColor = pc.yellow;
33
+ headline = `${pc.yellow("⚠")} ${summary.dep} ${summary.from} → ${summary.to} — fixed, but flagged for review`;
34
+ }
35
+ else if (summary.fixed) {
36
+ barColor = pc.green;
37
+ headline = `${pc.green("✓")} ${summary.dep} ${summary.from} → ${summary.to} — fixed and green`;
38
+ }
39
+ else {
40
+ barColor = pc.red;
41
+ headline = `${pc.red("✗")} ${summary.dep} ${summary.from} → ${summary.to} — could not fully fix`;
42
+ }
43
+ write(bar(pc.bold(headline), barColor));
44
+ write(bar(""));
45
+ write(bar(`${pc.dim("package manager")} ${summary.packageManager}`));
46
+ write(bar(`${pc.dim("duration")} ${formatDuration(summary.durationMs)}`));
47
+ if (summary.neededFix) {
48
+ write(bar(`${pc.dim("fix rounds")} ${summary.rounds}`));
49
+ write(bar(`${pc.dim("tokens")} ${summary.usage.inputTokens.toLocaleString()} in / ${summary.usage.outputTokens.toLocaleString()} out`));
50
+ write(bar(`${pc.dim("files edited")} ${summary.editedFiles.length}`));
51
+ for (const f of summary.editedFiles.slice(0, 6))
52
+ write(bar(` ${pc.cyan("·")} ${f}`));
53
+ if (summary.editedFiles.length > 6)
54
+ write(bar(` ${pc.dim(`… +${summary.editedFiles.length - 6} more`)}`));
55
+ if (summary.testFilesTouched.length > 0) {
56
+ write(bar(""));
57
+ write(bar(pc.yellow(`⚠ agent modified test file(s) — review closely:`)));
58
+ for (const f of summary.testFilesTouched)
59
+ write(bar(` ${pc.yellow("·")} ${f}`));
60
+ }
61
+ }
62
+ if (summary.branch) {
63
+ write(bar(""));
64
+ write(bar(`${pc.dim("branch")} ${summary.branch}${summary.committed ? pc.green(" (committed)") : pc.yellow(" (uncommitted)")}`));
65
+ }
66
+ }
67
+ /** One-line-per-target summary for --all / multi-dep / --group runs. */
68
+ export function printBatchSummary(results, write) {
69
+ write(pc.bold(`${results.length} target(s):`));
70
+ for (const item of results) {
71
+ if ("error" in item) {
72
+ write(bar(`${pc.red("✗")} ${item.dep} — ${item.error}`, pc.red));
73
+ continue;
74
+ }
75
+ let icon;
76
+ let color;
77
+ if (item.unverifiable) {
78
+ icon = "⚠";
79
+ color = pc.yellow;
80
+ }
81
+ else if (!item.neededFix) {
82
+ icon = "✓";
83
+ color = pc.green;
84
+ }
85
+ else if (item.fixed && item.needsReview) {
86
+ icon = "⚠";
87
+ color = pc.yellow;
88
+ }
89
+ else if (item.fixed) {
90
+ icon = "✓";
91
+ color = pc.green;
92
+ }
93
+ else {
94
+ icon = "✗";
95
+ color = pc.red;
96
+ }
97
+ const suffix = item.needsReview ? " (needs review)" : !item.fixed && item.neededFix ? " (unfixed)" : "";
98
+ write(bar(`${color(icon)} ${item.dep} ${item.from} → ${item.to}${suffix}`, color));
99
+ }
100
+ }
101
+ //# sourceMappingURL=format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.js","sourceRoot":"","sources":["../src/format.ts"],"names":[],"mappings":"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"}
package/dist/pr.js ADDED
@@ -0,0 +1,63 @@
1
+ const MAX_DIFF_CHARS = 30_000;
2
+ /** Render a Markdown PR body from a run summary. Reused by the GitHub Action. */
3
+ export function renderPrBody(s) {
4
+ const lines = [];
5
+ lines.push(`## ⬆️ Bump \`${s.dep}\` ${s.from} → ${s.to}`);
6
+ lines.push("");
7
+ if (s.unverifiable) {
8
+ lines.push("> ⚠️ **Unverified** — this repo has no `build` or `test` script, so greenbump upgraded the dependency but could not confirm nothing broke. Please review.");
9
+ }
10
+ else if (!s.neededFix) {
11
+ lines.push("✅ Clean upgrade — build and tests stayed green with **no code changes**.");
12
+ }
13
+ else if (s.fixed && s.needsReview) {
14
+ lines.push(`✅ The upgrade broke the build/tests. greenbump adapted the code and **build + tests are green again** — but flagged for review below.`);
15
+ lines.push("");
16
+ lines.push(`**Files changed by the fix agent (${s.editedFiles.length}):**`);
17
+ for (const f of s.editedFiles)
18
+ lines.push(`- \`${f}\``);
19
+ }
20
+ else if (s.fixed) {
21
+ lines.push(`✅ The upgrade broke the build/tests. greenbump adapted the code and **build + tests are green again**.`);
22
+ lines.push("");
23
+ lines.push(`**Files changed by the fix agent (${s.editedFiles.length}):**`);
24
+ for (const f of s.editedFiles)
25
+ lines.push(`- \`${f}\``);
26
+ }
27
+ else {
28
+ lines.push(`❌ The upgrade broke the build/tests and greenbump **could not fully fix it** within ${s.rounds} rounds. Changes are left on the branch for you to finish.`);
29
+ }
30
+ if (s.neededFix && s.testFilesTouched.length > 0) {
31
+ lines.push("");
32
+ lines.push(`> 🚨 **Review closely** — the fix agent modified test file(s), which greenbump normally avoids: ${s.testFilesTouched.map((f) => `\`${f}\``).join(", ")}`);
33
+ }
34
+ if (s.diffStat) {
35
+ lines.push("");
36
+ lines.push("<details><summary>Diff stat</summary>\n");
37
+ lines.push("```");
38
+ lines.push(s.diffStat);
39
+ lines.push("```");
40
+ lines.push("</details>");
41
+ }
42
+ if (s.fullDiff) {
43
+ const diff = s.fullDiff.length > MAX_DIFF_CHARS
44
+ ? s.fullDiff.slice(0, MAX_DIFF_CHARS) + "\n… (diff truncated, see the branch for the full change)"
45
+ : s.fullDiff;
46
+ lines.push("");
47
+ lines.push("<details><summary>Full diff</summary>\n");
48
+ lines.push("```diff");
49
+ lines.push(diff);
50
+ lines.push("```");
51
+ lines.push("</details>");
52
+ }
53
+ lines.push("");
54
+ const meta = [`pm: ${s.packageManager}`, `duration: ${(s.durationMs / 1000).toFixed(1)}s`];
55
+ if (s.neededFix) {
56
+ meta.push(`fix loop: ${s.rounds} round(s)`, `${s.usage.inputTokens.toLocaleString()} in / ${s.usage.outputTokens.toLocaleString()} out tokens (your own API key)`);
57
+ }
58
+ lines.push(`<sub>${meta.join(" · ")}</sub>`);
59
+ lines.push("");
60
+ lines.push("<sub>🌱 Automated by [greenbump](https://github.com/shidesheng0218/greenbump).</sub>");
61
+ return lines.join("\n");
62
+ }
63
+ //# sourceMappingURL=pr.js.map
package/dist/pr.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pr.js","sourceRoot":"","sources":["../src/pr.ts"],"names":[],"mappings":"AAEA,MAAM,cAAc,GAAG,MAAM,CAAC;AAE9B,iFAAiF;AACjF,MAAM,UAAU,YAAY,CAAC,CAAa;IACxC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC1D,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,IAAI,CAAC,CAAC,YAAY,EAAE,CAAC;QACnB,KAAK,CAAC,IAAI,CACR,2JAA2J,CAC5J,CAAC;IACJ,CAAC;SAAM,IAAI,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;QACxB,KAAK,CAAC,IAAI,CAAC,0EAA0E,CAAC,CAAC;IACzF,CAAC;SAAM,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;QACpC,KAAK,CAAC,IAAI,CACR,uIAAuI,CACxI,CAAC;QACF,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC,WAAW,CAAC,MAAM,MAAM,CAAC,CAAC;QAC5E,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,WAAW;YAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1D,CAAC;SAAM,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;QACnB,KAAK,CAAC,IAAI,CACR,wGAAwG,CACzG,CAAC;QACF,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC,WAAW,CAAC,MAAM,MAAM,CAAC,CAAC;QAC5E,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,WAAW;YAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1D,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,IAAI,CACR,uFAAuF,CAAC,CAAC,MAAM,4DAA4D,CAC5J,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACjD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CACR,mGAAmG,CAAC,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC1J,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC;QACtD,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAClB,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QACvB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAClB,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC3B,CAAC;IAED,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;QACf,MAAM,IAAI,GAAG,CAAC,CAAC,QAAQ,CAAC,MAAM,GAAG,cAAc;YAC7C,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,cAAc,CAAC,GAAG,0DAA0D;YAClG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC;QACtD,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACtB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAClB,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,MAAM,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,cAAc,EAAE,EAAE,aAAa,CAAC,CAAC,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAC3F,IAAI,CAAC,CAAC,SAAS,EAAE,CAAC;QAChB,IAAI,CAAC,IAAI,CACP,aAAa,CAAC,CAAC,MAAM,WAAW,EAChC,GAAG,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,cAAc,EAAE,SAAS,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,cAAc,EAAE,gCAAgC,CACtH,CAAC;IACJ,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAE7C,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,sFAAsF,CAAC,CAAC;IACnG,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
package/dist/report.js ADDED
@@ -0,0 +1,13 @@
1
+ import { writeFile } from "node:fs/promises";
2
+ export const REPORT_SCHEMA_VERSION = 1;
3
+ export function buildReport(runs) {
4
+ return {
5
+ schemaVersion: REPORT_SCHEMA_VERSION,
6
+ generatedAt: new Date().toISOString(),
7
+ runs,
8
+ };
9
+ }
10
+ export async function writeReport(path, envelope) {
11
+ await writeFile(path, JSON.stringify(envelope, null, 2) + "\n", "utf8");
12
+ }
13
+ //# sourceMappingURL=report.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report.js","sourceRoot":"","sources":["../src/report.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAG7C,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC;AASvC,MAAM,UAAU,WAAW,CAAC,IAAuB;IACjD,OAAO;QACL,aAAa,EAAE,qBAAqB;QACpC,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACrC,IAAI;KACL,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAY,EAAE,QAAwB;IACtE,MAAM,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC;AAC1E,CAAC"}
@@ -0,0 +1,56 @@
1
+ import { test } from "node:test";
2
+ import assert from "node:assert/strict";
3
+ import { readFile } from "node:fs/promises";
4
+ import { join } from "node:path";
5
+ import { buildReport, writeReport, REPORT_SCHEMA_VERSION } from "./report.js";
6
+ import { withTmpDir } from "./test-utils.js";
7
+ function summary(overrides = {}) {
8
+ return {
9
+ dep: "lodash",
10
+ from: "4.17.20",
11
+ to: "4.17.21",
12
+ packageManager: "npm",
13
+ baselineGreen: true,
14
+ neededFix: false,
15
+ fixed: true,
16
+ unverifiable: false,
17
+ needsReview: false,
18
+ committed: true,
19
+ rounds: 0,
20
+ usage: { inputTokens: 0, outputTokens: 0 },
21
+ editedFiles: [],
22
+ testFilesTouched: [],
23
+ durationMs: 0,
24
+ ...overrides,
25
+ };
26
+ }
27
+ test("buildReport: wraps a single run in the same array envelope as a batch", () => {
28
+ const envelope = buildReport([summary()]);
29
+ assert.equal(envelope.schemaVersion, REPORT_SCHEMA_VERSION);
30
+ assert.ok(Array.isArray(envelope.runs));
31
+ assert.equal(envelope.runs.length, 1);
32
+ assert.ok(typeof envelope.generatedAt === "string" && !Number.isNaN(Date.parse(envelope.generatedAt)));
33
+ });
34
+ test("buildReport: batch of results, mixing successes and failures, keeps the array shape", () => {
35
+ const failure = { dep: "axios", error: "install failed", fatal: true };
36
+ const envelope = buildReport([summary({ dep: "lodash" }), failure]);
37
+ assert.equal(envelope.runs.length, 2);
38
+ });
39
+ test("writeReport: round-trips through disk with schema and fields intact", async () => {
40
+ await withTmpDir(async (dir) => {
41
+ const failure = { dep: "axios", error: "install failed", fatal: true };
42
+ const envelope = buildReport([summary({ dep: "lodash", rounds: 3 }), failure]);
43
+ const path = join(dir, "report.json");
44
+ await writeReport(path, envelope);
45
+ const raw = await readFile(path, "utf8");
46
+ const parsed = JSON.parse(raw);
47
+ assert.equal(parsed.schemaVersion, 1);
48
+ assert.equal(parsed.runs.length, 2);
49
+ assert.equal(parsed.runs[0].dep, "lodash");
50
+ assert.equal(parsed.runs[0].rounds, 3);
51
+ assert.equal(parsed.runs[1].dep, "axios");
52
+ assert.equal(parsed.runs[1].error, "install failed");
53
+ assert.equal(parsed.runs[1].fatal, true);
54
+ });
55
+ });
56
+ //# sourceMappingURL=report.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report.test.js","sourceRoot":"","sources":["../src/report.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ import { mkdtemp, rm, writeFile } from "node:fs/promises";
2
+ import { tmpdir } from "node:os";
3
+ import { join } from "node:path";
4
+ export async function withTmpDir(fn) {
5
+ const dir = await mkdtemp(join(tmpdir(), "greenbump-test-"));
6
+ try {
7
+ await fn(dir);
8
+ }
9
+ finally {
10
+ await rm(dir, { recursive: true, force: true });
11
+ }
12
+ }
13
+ /** A scripted provider: returns each entry in `turns` in order, one per send() call. */
14
+ export function scriptedProvider(turns) {
15
+ let i = 0;
16
+ const calls = [];
17
+ return {
18
+ name: "stub",
19
+ model: "stub-model",
20
+ calls,
21
+ async send(_system, messages, _tools) {
22
+ calls.push(messages);
23
+ const turn = turns[Math.min(i, turns.length - 1)];
24
+ i++;
25
+ return {
26
+ text: turn.text ?? "",
27
+ toolCalls: turn.toolCalls ?? [],
28
+ usage: { inputTokens: 10, outputTokens: 5 },
29
+ };
30
+ },
31
+ };
32
+ }
33
+ export async function writePkg(dir, scripts, extra = {}) {
34
+ await writeFile(join(dir, "package.json"), JSON.stringify({ name: "tmp", scripts, ...extra }), "utf8");
35
+ }
36
+ //# sourceMappingURL=test-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-utils.js","sourceRoot":"","sources":["../src/test-utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,EAAkC;IACjE,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,iBAAiB,CAAC,CAAC,CAAC;IAC7D,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC;IAChB,CAAC;YAAS,CAAC;QACT,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAClD,CAAC;AACH,CAAC;AAED,wFAAwF;AACxF,MAAM,UAAU,gBAAgB,CAC9B,KAAuD;IAEvD,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,MAAM,KAAK,GAAY,EAAE,CAAC;IAC1B,OAAO;QACL,IAAI,EAAE,MAAM;QACZ,KAAK,EAAE,YAAY;QACnB,KAAK;QACL,KAAK,CAAC,IAAI,CAAC,OAAe,EAAE,QAAe,EAAE,MAAkB;YAC7D,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACrB,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;YAClD,CAAC,EAAE,CAAC;YACJ,OAAO;gBACL,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,EAAE;gBACrB,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,EAAE;gBAC/B,KAAK,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,YAAY,EAAE,CAAC,EAAE;aAC5C,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,GAAW,EAAE,OAA+B,EAAE,QAAiC,EAAE;IAC9G,MAAM,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,KAAK,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;AACzG,CAAC"}
package/package.json ADDED
@@ -0,0 +1,56 @@
1
+ {
2
+ "name": "greenbump",
3
+ "version": "0.2.0",
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
+ "type": "module",
6
+ "bin": {
7
+ "greenbump": "dist/cli.js"
8
+ },
9
+ "files": [
10
+ "dist",
11
+ "action-dist",
12
+ "action.yml"
13
+ ],
14
+ "engines": {
15
+ "node": ">=20"
16
+ },
17
+ "repository": {
18
+ "type": "git",
19
+ "url": "git+https://github.com/shidesheng0218/greenbump.git"
20
+ },
21
+ "bugs": {
22
+ "url": "https://github.com/shidesheng0218/greenbump/issues"
23
+ },
24
+ "homepage": "https://github.com/shidesheng0218/greenbump#readme",
25
+ "scripts": {
26
+ "build": "tsc",
27
+ "build:action": "npm run build && esbuild dist/action/main.js --bundle --platform=node --target=node20 --format=cjs --outfile=action-dist/index.cjs",
28
+ "dev": "tsx src/cli.ts",
29
+ "test": "npm run build && cd dist && node --test",
30
+ "prepublishOnly": "npm run build"
31
+ },
32
+ "keywords": [
33
+ "dependencies",
34
+ "upgrade",
35
+ "renovate",
36
+ "dependabot",
37
+ "ai",
38
+ "agent",
39
+ "claude",
40
+ "automation",
41
+ "codemod"
42
+ ],
43
+ "license": "MIT",
44
+ "dependencies": {
45
+ "@anthropic-ai/sdk": "^0.68.0",
46
+ "commander": "^14.0.0",
47
+ "openai": "^4.77.0",
48
+ "picocolors": "^1.1.1"
49
+ },
50
+ "devDependencies": {
51
+ "@types/node": "^22.10.0",
52
+ "esbuild": "^0.24.0",
53
+ "tsx": "^4.19.0",
54
+ "typescript": "^5.7.0"
55
+ }
56
+ }