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 +1 @@
1
- {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../../src/engine/cache/manager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../../src/engine/cache/manager.ts"],"names":[],"mappings":"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"}
@@ -72,4 +72,21 @@ test("CacheManager: clear removes entries", async () => {
72
72
  assert.equal(await cache.getChangelog("react", "18.0.0", "19.0.0"), null);
73
73
  });
74
74
  });
75
+ test("CacheManager: prune evicts expired entries", async () => {
76
+ const dir = await mkdtemp(join(tmpdir(), "greenbump-cache-test-"));
77
+ try {
78
+ // TTL of 1ms: everything is immediately expired
79
+ const cache = new CacheManager({ cacheDir: dir, ttlMs: 1 });
80
+ await cache.init();
81
+ // llm-fixes entries carry no embedded TTL, so the manager's 1ms ttl applies
82
+ await cache.setLlmFix("k", { edits: {}, hits: 0, model: "m" });
83
+ await new Promise((r) => setTimeout(r, 5));
84
+ const pruned = await cache.prune();
85
+ assert.ok(pruned >= 1);
86
+ assert.equal(await cache.getLlmFix("k"), null);
87
+ }
88
+ finally {
89
+ await rm(dir, { recursive: true, force: true });
90
+ }
91
+ });
75
92
  //# sourceMappingURL=manager.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"manager.test.js","sourceRoot":"","sources":["../../../src/engine/cache/manager.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"manager.test.js","sourceRoot":"","sources":["../../../src/engine/cache/manager.test.ts"],"names":[],"mappings":"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"}
@@ -1,17 +1,18 @@
1
- import { exec } from "node:child_process";
2
- import { promisify } from "node:util";
3
- const execAsync = promisify(exec);
1
+ import { exec } from "./exec.js";
4
2
  /**
5
3
  * Detect suspicious changes in the git diff that might indicate the LLM
6
4
  * "cheated" to make tests pass (e.g., commenting out tests, deleting code).
7
5
  */
8
6
  export async function detectSuspiciousChanges(cwd) {
7
+ // Project exec: spawn without shell, no maxBuffer cap — the previous
8
+ // execAsync("git diff HEAD") silently returned [] on diffs over 1MB
9
+ // (ENOBUFS), which is exactly the "big rewrite" case this detector exists for.
10
+ const result = await exec("git", ["diff", "HEAD"], { cwd });
11
+ if (result.code !== 0)
12
+ return []; // not a git repo, or no HEAD yet
13
+ const diff = result.stdout;
9
14
  const changes = [];
10
- try {
11
- // Get git diff for staged + unstaged changes
12
- const { stdout: diff } = await execAsync("git diff HEAD", { cwd });
13
- if (!diff.trim())
14
- return []; // No changes
15
+ if (diff.trim()) {
15
16
  // 1. Detect test file modifications
16
17
  const testFileChanges = detectTestFileChanges(diff);
17
18
  changes.push(...testFileChanges);
@@ -25,8 +26,30 @@ export async function detectSuspiciousChanges(cwd) {
25
26
  const removedTests = detectRemovedTests(diff);
26
27
  changes.push(...removedTests);
27
28
  }
28
- catch (err) {
29
- // Git command failed (e.g., not a git repo) - ignore
29
+ // 5. Detect suspicious untracked/newly created files (e.g. creating dummy mock files or fake tests)
30
+ const untrackedChanges = await detectUntrackedFiles(cwd);
31
+ changes.push(...untrackedChanges);
32
+ return changes;
33
+ }
34
+ async function detectUntrackedFiles(cwd) {
35
+ const changes = [];
36
+ const res = await exec("git", ["status", "--porcelain"], { cwd });
37
+ if (res.code !== 0)
38
+ return [];
39
+ const testFilePattern = /\.(test|spec)\.(ts|js|tsx|jsx)$/;
40
+ for (const line of res.stdout.split("\n")) {
41
+ const trimmed = line.trim();
42
+ if (trimmed.startsWith("?? ")) {
43
+ const file = trimmed.slice(3).trim();
44
+ if (testFilePattern.test(file)) {
45
+ changes.push({
46
+ type: "test-modified",
47
+ file,
48
+ description: "New test file created by agent (verify it is not mocking around real failures)",
49
+ severity: "critical",
50
+ });
51
+ }
52
+ }
30
53
  }
31
54
  return changes;
32
55
  }
@@ -111,16 +134,29 @@ function detectCommentedTests(diff) {
111
134
  }
112
135
  function detectRemovedTests(diff) {
113
136
  const changes = [];
114
- // Look for deleted test cases (lines starting with - that contain it( or test()
115
- const lines = diff.split("\n");
137
+ // Count deleted test cases (lines starting with - that contain it( or test()
138
+ // PER FILE — previously the counter reset at each file header but the report
139
+ // fired only once after the loop, so every file except the last was lost.
116
140
  let removedTestCount = 0;
117
- let currentFile = "unknown";
118
- for (const line of lines) {
141
+ let currentFile = null;
142
+ const flush = () => {
143
+ if (currentFile !== null && removedTestCount > 0) {
144
+ changes.push({
145
+ type: "test-removed",
146
+ file: currentFile,
147
+ description: `${removedTestCount} test case(s) were deleted`,
148
+ severity: "critical",
149
+ });
150
+ }
151
+ };
152
+ for (const line of diff.split("\n")) {
119
153
  // Track current file
120
154
  const fileMatch = line.match(/^diff --git a\/(.+?) b\/(.+?)$/);
121
155
  if (fileMatch) {
156
+ flush();
122
157
  currentFile = fileMatch[2];
123
- removedTestCount = 0; // Reset counter for new file
158
+ removedTestCount = 0;
159
+ continue;
124
160
  }
125
161
  // Check for deleted test cases
126
162
  if (line.startsWith("-") &&
@@ -129,14 +165,7 @@ function detectRemovedTests(diff) {
129
165
  removedTestCount++;
130
166
  }
131
167
  }
132
- if (removedTestCount > 0) {
133
- changes.push({
134
- type: "test-removed",
135
- file: currentFile,
136
- description: `${removedTestCount} test case(s) were deleted`,
137
- severity: "critical",
138
- });
139
- }
168
+ flush();
140
169
  return changes;
141
170
  }
142
171
  function findFileContext(diff, lineIndex) {
@@ -1 +1 @@
1
- {"version":3,"file":"change-detector.js","sourceRoot":"","sources":["../../src/engine/change-detector.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"change-detector.js","sourceRoot":"","sources":["../../src/engine/change-detector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,72 @@
1
+ import { test } from "node:test";
2
+ import assert from "node:assert/strict";
3
+ import { mkdtemp, writeFile, rm, mkdir } from "node:fs/promises";
4
+ import { tmpdir } from "node:os";
5
+ import { join } from "node:path";
6
+ import { exec } from "./exec.js";
7
+ import { detectSuspiciousChanges } from "./change-detector.js";
8
+ async function withRepo(files, fn) {
9
+ const dir = await mkdtemp(join(tmpdir(), "greenbump-changedet-"));
10
+ try {
11
+ await exec("git", ["init", "-q"], { cwd: dir });
12
+ await exec("git", ["config", "user.email", "test@greenbump.dev"], { cwd: dir });
13
+ await exec("git", ["config", "user.name", "greenbump test"], { cwd: dir });
14
+ for (const [path, content] of Object.entries(files)) {
15
+ await mkdir(join(dir, path.split("/").slice(0, -1).join("/")), { recursive: true }).catch(() => { });
16
+ await writeFile(join(dir, path), content, "utf8");
17
+ }
18
+ await exec("git", ["add", "-A"], { cwd: dir });
19
+ await exec("git", ["commit", "-q", "-m", "init", "--no-verify"], { cwd: dir });
20
+ await fn(dir);
21
+ }
22
+ finally {
23
+ await rm(dir, { recursive: true, force: true });
24
+ }
25
+ }
26
+ test("change-detector: removed test cases are reported per file, not just for the last one", async () => {
27
+ await withRepo({
28
+ "a.test.js": "it('one', () => {});\nit('two', () => {});\n",
29
+ "b.test.js": "test('three', () => {});\n",
30
+ }, async (dir) => {
31
+ // The "LLM cheated" scenario: delete test cases from BOTH files.
32
+ await writeFile(join(dir, "a.test.js"), "it('one', () => {});\n", "utf8");
33
+ await writeFile(join(dir, "b.test.js"), "", "utf8");
34
+ const changes = await detectSuspiciousChanges(dir);
35
+ const removed = changes.filter((c) => c.type === "test-removed");
36
+ assert.equal(removed.length, 2);
37
+ assert.deepEqual(removed.map((c) => c.file).sort(), ["a.test.js", "b.test.js"]);
38
+ assert.ok(removed.every((c) => c.severity === "critical"));
39
+ });
40
+ });
41
+ test("change-detector: modifying a test file is flagged critical", async () => {
42
+ await withRepo({ "src/app.test.ts": "it('x', () => {});\n" }, async (dir) => {
43
+ await writeFile(join(dir, "src/app.test.ts"), "it('x changed', () => {});\n", "utf8");
44
+ const changes = await detectSuspiciousChanges(dir);
45
+ assert.ok(changes.some((c) => c.type === "test-modified" && c.file === "src/app.test.ts"));
46
+ });
47
+ });
48
+ test("change-detector: clean source-only edit produces no critical findings", async () => {
49
+ await withRepo({ "src/app.ts": "export const a = 1;\n" }, async (dir) => {
50
+ await writeFile(join(dir, "src/app.ts"), "export const a = 2;\n", "utf8");
51
+ const changes = await detectSuspiciousChanges(dir);
52
+ assert.equal(changes.filter((c) => c.severity === "critical").length, 0);
53
+ });
54
+ });
55
+ test("change-detector: newly created untracked test file is flagged as suspicious", async () => {
56
+ await withRepo({ "src/app.ts": "export const x = 1;\n" }, async (dir) => {
57
+ await writeFile(join(dir, "new-fake.test.ts"), "it('dummy', () => {});\n", "utf8");
58
+ const changes = await detectSuspiciousChanges(dir);
59
+ assert.ok(changes.some((c) => c.type === "test-modified" && c.file === "new-fake.test.ts"));
60
+ });
61
+ });
62
+ test("change-detector: not a git repo returns [] instead of throwing", async () => {
63
+ const dir = await mkdtemp(join(tmpdir(), "greenbump-changedet-"));
64
+ try {
65
+ const changes = await detectSuspiciousChanges(dir);
66
+ assert.deepEqual(changes, []);
67
+ }
68
+ finally {
69
+ await rm(dir, { recursive: true, force: true });
70
+ }
71
+ });
72
+ //# sourceMappingURL=change-detector.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"change-detector.test.js","sourceRoot":"","sources":["../../src/engine/change-detector.test.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import { getCache } from "./cache/manager.js";
1
2
  const FETCH_TIMEOUT_MS = 8_000;
2
3
  const MAX_CHANGELOG_CHARS = 6_000;
3
4
  async function timedFetch(url, headers) {
@@ -48,16 +49,35 @@ async function githubRelease(slug, version) {
48
49
  * upgraded to, to give the fix agent real migration guidance instead of
49
50
  * making it guess from the error alone. Never throws — returns null on any
50
51
  * failure (offline, rate-limited, no GitHub repo, etc).
52
+ *
53
+ * Results are cached per (package, from, to) in the local disk cache —
54
+ * changelogs are immutable, and the anonymous GitHub API rate limit
55
+ * (60 req/h) is easy to hit during batch upgrades. Pass `cache: false`
56
+ * (--no-cache) to bypass.
51
57
  */
52
- export async function fetchChangelog(pkgName, from, to) {
58
+ export async function fetchChangelog(pkgName, from, to, opts) {
59
+ const useCache = opts?.cache !== false;
53
60
  try {
61
+ if (useCache) {
62
+ const cache = getCache();
63
+ await cache.init();
64
+ const cached = await cache.getChangelog(pkgName, from, to);
65
+ if (cached)
66
+ return cached;
67
+ }
54
68
  const slug = await githubSlug(pkgName);
55
69
  if (!slug)
56
70
  return null;
57
71
  const notes = await githubRelease(slug, to);
58
72
  if (!notes)
59
73
  return null;
60
- return truncate(notes);
74
+ const truncated = truncate(notes);
75
+ if (useCache) {
76
+ const cache = getCache();
77
+ await cache.init();
78
+ await cache.setChangelog(pkgName, from, to, truncated).catch(() => { });
79
+ }
80
+ return truncated;
61
81
  }
62
82
  catch {
63
83
  return null;
@@ -1 +1 @@
1
- {"version":3,"file":"changelog.js","sourceRoot":"","sources":["../../src/engine/changelog.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"changelog.js","sourceRoot":"","sources":["../../src/engine/changelog.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import { test } from "node:test";
2
+ import assert from "node:assert/strict";
3
+ import { mkdtemp, rm } from "node:fs/promises";
4
+ import { tmpdir } from "node:os";
5
+ import { join } from "node:path";
6
+ import { fetchChangelog } from "./changelog.js";
7
+ import { getCache, resetCacheForTests } from "./cache/manager.js";
8
+ test("fetchChangelog: serves from cache without touching the network", async () => {
9
+ const dir = await mkdtemp(join(tmpdir(), "greenbump-changelog-"));
10
+ const prev = process.env.GREENBUMP_CACHE_DIR;
11
+ process.env.GREENBUMP_CACHE_DIR = dir;
12
+ resetCacheForTests();
13
+ try {
14
+ const cache = getCache();
15
+ await cache.init();
16
+ await cache.setChangelog("some-pkg", "1.0.0", "2.0.0", "## v2.0.0\n\nBreaking: everything");
17
+ // No network stubbing needed: if the cache is honored, this returns
18
+ // immediately even though the package doesn't exist on npm.
19
+ const result = await fetchChangelog("some-pkg", "1.0.0", "2.0.0");
20
+ assert.equal(result, "## v2.0.0\n\nBreaking: everything");
21
+ }
22
+ finally {
23
+ if (prev === undefined)
24
+ delete process.env.GREENBUMP_CACHE_DIR;
25
+ else
26
+ process.env.GREENBUMP_CACHE_DIR = prev;
27
+ resetCacheForTests();
28
+ await rm(dir, { recursive: true, force: true });
29
+ }
30
+ });
31
+ //# sourceMappingURL=changelog.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"changelog.test.js","sourceRoot":"","sources":["../../src/engine/changelog.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAElE,IAAI,CAAC,gEAAgE,EAAE,KAAK,IAAI,EAAE;IAChF,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,sBAAsB,CAAC,CAAC,CAAC;IAClE,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;IAC7C,OAAO,CAAC,GAAG,CAAC,mBAAmB,GAAG,GAAG,CAAC;IACtC,kBAAkB,EAAE,CAAC;IACrB,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;QACzB,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,MAAM,KAAK,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,mCAAmC,CAAC,CAAC;QAE5F,oEAAoE;QACpE,4DAA4D;QAC5D,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,UAAU,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QAClE,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,mCAAmC,CAAC,CAAC;IAC5D,CAAC;YAAS,CAAC;QACT,IAAI,IAAI,KAAK,SAAS;YAAE,OAAO,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;;YAC1D,OAAO,CAAC,GAAG,CAAC,mBAAmB,GAAG,IAAI,CAAC;QAC5C,kBAAkB,EAAE,CAAC;QACrB,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAClD,CAAC;AACH,CAAC,CAAC,CAAC"}
@@ -10,6 +10,15 @@ function parseOverride(raw) {
10
10
  const [cmd, ...args] = raw.split(/\s+/).filter(Boolean);
11
11
  return { cmd, args };
12
12
  }
13
+ /** Resolve the effective build/test commands: explicit overrides win, else adapter defaults. */
14
+ export async function resolveCheckCommands(pm, cwd, overrides = {}) {
15
+ const adapter = getAdapter(pm);
16
+ const defaults = await adapter.defaultCheckCommands(cwd);
17
+ return {
18
+ build: overrides.buildCmd ? parseOverride(overrides.buildCmd) : defaults.build,
19
+ test: overrides.testCmd ? parseOverride(overrides.testCmd) : defaults.test,
20
+ };
21
+ }
13
22
  /**
14
23
  * Run the project's build then test command, whichever exist. Stops at the
15
24
  * first failure and returns its output so the agent has something concrete
@@ -17,10 +26,7 @@ function parseOverride(raw) {
17
26
  * otherwise from the detected ecosystem adapter's best-effort defaults.
18
27
  */
19
28
  export async function runChecks(pm, cwd, overrides = {}) {
20
- const adapter = getAdapter(pm);
21
- const defaults = await adapter.defaultCheckCommands(cwd);
22
- const build = overrides.buildCmd ? parseOverride(overrides.buildCmd) : defaults.build;
23
- const test = overrides.testCmd ? parseOverride(overrides.testCmd) : defaults.test;
29
+ const { build, test } = await resolveCheckCommands(pm, cwd, overrides);
24
30
  if (!build && !test) {
25
31
  return { ok: true, output: "", unverifiable: true };
26
32
  }
@@ -1 +1 @@
1
- {"version":3,"file":"checks.js","sourceRoot":"","sources":["../../src/engine/checks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,EAAuB,MAAM,SAAS,CAAC;AAmB1D,MAAM,UAAU,GAAG,MAAM,CAAC;AAE1B,SAAS,IAAI,CAAC,CAAS,EAAE,GAAG,GAAG,UAAU;IACvC,IAAI,CAAC,CAAC,MAAM,IAAI,GAAG;QAAE,OAAO,CAAC,CAAC;IAC9B,OAAO,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC;AACzD,CAAC;AAED,SAAS,aAAa,CAAC,GAAW;IAChC,MAAM,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACxD,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;AACvB,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,EAAkB,EAClB,GAAW,EACX,YAA4B,EAAE;IAE9B,MAAM,OAAO,GAAG,UAAU,CAAC,EAAE,CAAC,CAAC;IAC/B,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC;IACzD,MAAM,KAAK,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC;IACtF,MAAM,IAAI,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;IAElF,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC;QACpB,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;IACtD,CAAC;IAED,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;QACvE,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YACjB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC;QAC3F,CAAC;IACH,CAAC;IAED,IAAI,IAAI,EAAE,CAAC;QACT,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;QACrE,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YACjB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC;QAC1F,CAAC;IACH,CAAC;IAED,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC;AACvD,CAAC"}
1
+ {"version":3,"file":"checks.js","sourceRoot":"","sources":["../../src/engine/checks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,EAAuB,MAAM,SAAS,CAAC;AAmB1D,MAAM,UAAU,GAAG,MAAM,CAAC;AAE1B,SAAS,IAAI,CAAC,CAAS,EAAE,GAAG,GAAG,UAAU;IACvC,IAAI,CAAC,CAAC,MAAM,IAAI,GAAG;QAAE,OAAO,CAAC,CAAC;IAC9B,OAAO,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC;AACzD,CAAC;AAED,SAAS,aAAa,CAAC,GAAW;IAChC,MAAM,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACxD,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;AACvB,CAAC;AAED,gGAAgG;AAChG,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,EAAkB,EAClB,GAAW,EACX,YAA4B,EAAE;IAE9B,MAAM,OAAO,GAAG,UAAU,CAAC,EAAE,CAAC,CAAC;IAC/B,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC;IACzD,OAAO;QACL,KAAK,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK;QAC9E,IAAI,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI;KAC3E,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,EAAkB,EAClB,GAAW,EACX,YAA4B,EAAE;IAE9B,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,oBAAoB,CAAC,EAAE,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC;IAEvE,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC;QACpB,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;IACtD,CAAC;IAED,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;QACvE,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YACjB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC;QAC3F,CAAC;IACH,CAAC;IAED,IAAI,IAAI,EAAE,CAAC;QACT,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;QACrE,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YACjB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC;QAC1F,CAAC;IACH,CAAC;IAED,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC;AACvD,CAAC"}
@@ -1,4 +1,4 @@
1
- import { readFile, readdir, stat } from "node:fs/promises";
1
+ import { stat, realpath } from "node:fs/promises";
2
2
  import { join, relative } from "node:path";
3
3
  /**
4
4
  * Context optimizer: shrink what we send to the LLM.
@@ -58,6 +58,10 @@ export function trimFailureOutput(output) {
58
58
  */
59
59
  export async function extractCandidateFiles(failureOutput, cwd) {
60
60
  const found = new Set();
61
+ // Stack frames carry realpaths (symlinks resolved), while cwd may go
62
+ // through a symlink (e.g. macOS /var → /private/var). Both spellings are
63
+ // the same project — match paths against either root.
64
+ const cwdReal = await realpath(cwd).catch(() => cwd);
61
65
  // Match path:line:col references (TS/JS errors), stack frames, webpack errors
62
66
  const patterns = [
63
67
  /([^\s():]+\.(?:ts|tsx|js|jsx|mjs|cjs|vue|svelte)):\d+:\d+/g,
@@ -68,7 +72,7 @@ export async function extractCandidateFiles(failureOutput, cwd) {
68
72
  for (const pattern of patterns) {
69
73
  let m;
70
74
  while ((m = pattern.exec(failureOutput)) !== null) {
71
- const p = normalizePath(m[1], cwd);
75
+ const p = normalizePath(m[1], cwd, cwdReal);
72
76
  if (p)
73
77
  found.add(p);
74
78
  }
@@ -110,26 +114,6 @@ export async function findRelatedTests(candidateFiles, cwd) {
110
114
  }
111
115
  return [...tests].slice(0, 10);
112
116
  }
113
- /**
114
- * Read candidate files (truncated) to include as upfront context.
115
- * Returns a map of path → content.
116
- */
117
- export async function readCandidateContents(files, cwd, maxCharsPerFile = 8_000) {
118
- const out = new Map();
119
- for (const f of files) {
120
- try {
121
- let content = await readFile(join(cwd, f), "utf8");
122
- if (content.length > maxCharsPerFile) {
123
- content = content.slice(0, maxCharsPerFile) + "\n… (file truncated)";
124
- }
125
- out.set(f, content);
126
- }
127
- catch {
128
- // unreadable — skip
129
- }
130
- }
131
- return out;
132
- }
133
117
  /** Estimate token count for a string (~4 chars/token for code+prose mix). */
134
118
  export function estimateTokens(text) {
135
119
  return Math.ceil(text.length / 4);
@@ -148,13 +132,18 @@ export function buildCandidateHint(candidateFiles, relatedTests) {
148
132
  }
149
133
  return parts.join("\n");
150
134
  }
151
- function normalizePath(p, cwd) {
135
+ function normalizePath(p, cwd, cwdReal) {
152
136
  // Strip common prefixes to get a project-relative path
153
137
  let cleaned = p
154
138
  .replace(/^file:\/\//, "")
155
139
  .replace(/\\/g, "/");
156
- if (cleaned.startsWith(cwd)) {
157
- cleaned = relative(cwd, cleaned);
140
+ // Accept the path under either the cwd spelling or its realpath — both
141
+ // refer to the same directory when cwd passes through a symlink.
142
+ for (const root of [cwd, cwdReal]) {
143
+ if (root && cleaned.startsWith(root + "/")) {
144
+ cleaned = relative(root, cleaned);
145
+ break;
146
+ }
158
147
  }
159
148
  // Drop absolute paths that aren't under cwd
160
149
  if (cleaned.startsWith("/"))
@@ -167,23 +156,4 @@ function normalizePath(p, cwd) {
167
156
  return null;
168
157
  return cleaned;
169
158
  }
170
- /**
171
- * Scan the project root for the most likely source dirs, so the candidate
172
- * search can stay focused (cheap heuristic, avoids walking node_modules).
173
- */
174
- export async function guessSourceDirs(cwd) {
175
- const candidates = ["src", "lib", "app", "packages", "source", "test", "tests", "__tests__"];
176
- const found = [];
177
- try {
178
- const entries = await readdir(cwd, { withFileTypes: true });
179
- for (const e of entries) {
180
- if (e.isDirectory() && candidates.includes(e.name))
181
- found.push(e.name);
182
- }
183
- }
184
- catch {
185
- // unreadable root — return empty
186
- }
187
- return found.length > 0 ? found : ["."];
188
- }
189
159
  //# sourceMappingURL=optimizer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"optimizer.js","sourceRoot":"","sources":["../../../src/engine/context/optimizer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"optimizer.js","sourceRoot":"","sources":["../../../src/engine/context/optimizer.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { test } from "node:test";
2
2
  import assert from "node:assert/strict";
3
- import { mkdtemp, writeFile, rm, mkdir } from "node:fs/promises";
3
+ import { mkdtemp, writeFile, rm, mkdir, symlink } from "node:fs/promises";
4
4
  import { tmpdir } from "node:os";
5
5
  import { join } from "node:path";
6
6
  import { trimFailureOutput, extractCandidateFiles, estimateTokens, buildCandidateHint, } from "./optimizer.js";
@@ -65,6 +65,28 @@ test("extractCandidateFiles: only returns files that exist", async () => {
65
65
  await rm(dir, { recursive: true, force: true });
66
66
  }
67
67
  });
68
+ test("extractCandidateFiles: finds files when the stack trace carries the realpath of a symlinked cwd", async () => {
69
+ // e.g. macOS /var → /private/var: the project may be opened through the
70
+ // symlink while Node stack frames resolve it. Both spellings are the same
71
+ // project — extraction must not come back empty.
72
+ const realBase = await mkdtemp(join(tmpdir(), "greenbump-ctx-real-"));
73
+ const linkBase = join(tmpdir(), `greenbump-ctx-link-${process.pid}`);
74
+ await rm(linkBase, { force: true, recursive: true });
75
+ await symlink(realBase, linkBase);
76
+ await mkdir(join(realBase, "src"));
77
+ await writeFile(join(realBase, "src", "routes.js"), "content", "utf8");
78
+ try {
79
+ // Node stack frames carry the fully resolved path…
80
+ const { realpath } = await import("node:fs/promises");
81
+ const projectReal = await realpath(linkBase);
82
+ const files = await extractCandidateFiles(`TypeError: app.del is not a function\n at registerRoutes (${projectReal}/src/routes.js:2:7)`, linkBase);
83
+ assert.deepEqual(files, ["src/routes.js"]);
84
+ }
85
+ finally {
86
+ await rm(linkBase, { force: true, recursive: true });
87
+ await rm(realBase, { recursive: true, force: true });
88
+ }
89
+ });
68
90
  test("estimateTokens: roughly 4 chars per token", () => {
69
91
  assert.equal(estimateTokens(""), 0);
70
92
  assert.equal(estimateTokens("abcd"), 1);
@@ -1 +1 @@
1
- {"version":3,"file":"optimizer.test.js","sourceRoot":"","sources":["../../../src/engine/context/optimizer.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"optimizer.test.js","sourceRoot":"","sources":["../../../src/engine/context/optimizer.test.ts"],"names":[],"mappings":"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"}