greenbump 0.5.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/README.md +673 -66
  2. package/README.zh-CN.md +525 -100
  3. package/dist/agent/fixer.js +161 -12
  4. package/dist/agent/fixer.js.map +1 -1
  5. package/dist/agent/fixer.test.js +410 -0
  6. package/dist/agent/fixer.test.js.map +1 -0
  7. package/dist/cli/interactive.js +81 -0
  8. package/dist/cli/interactive.js.map +1 -0
  9. package/dist/cli.js +45 -0
  10. package/dist/cli.js.map +1 -1
  11. package/dist/engine/analyzers/changelog-parser.js +121 -0
  12. package/dist/engine/analyzers/changelog-parser.js.map +1 -0
  13. package/dist/engine/batch.test.js +59 -0
  14. package/dist/engine/batch.test.js.map +1 -0
  15. package/dist/engine/cache/manager.js +165 -0
  16. package/dist/engine/cache/manager.js.map +1 -0
  17. package/dist/engine/cache/manager.test.js +75 -0
  18. package/dist/engine/cache/manager.test.js.map +1 -0
  19. package/dist/engine/checks.test.js +92 -0
  20. package/dist/engine/checks.test.js.map +1 -0
  21. package/dist/engine/context/optimizer.js +189 -0
  22. package/dist/engine/context/optimizer.js.map +1 -0
  23. package/dist/engine/context/optimizer.test.js +81 -0
  24. package/dist/engine/context/optimizer.test.js.map +1 -0
  25. package/dist/engine/ecosystems/parsers.test.js +255 -0
  26. package/dist/engine/ecosystems/parsers.test.js.map +1 -0
  27. package/dist/engine/fixer/patterns.js +356 -0
  28. package/dist/engine/fixer/patterns.js.map +1 -0
  29. package/dist/engine/fixer/patterns.test.js +124 -0
  30. package/dist/engine/fixer/patterns.test.js.map +1 -0
  31. package/dist/engine/git.test.js +111 -0
  32. package/dist/engine/git.test.js.map +1 -0
  33. package/dist/engine/run.js +44 -1
  34. package/dist/engine/run.js.map +1 -1
  35. package/dist/engine/run.test.js +47 -0
  36. package/dist/engine/run.test.js.map +1 -0
  37. package/dist/engine/verifiers/ast-analyzer.js +212 -0
  38. package/dist/engine/verifiers/ast-analyzer.js.map +1 -0
  39. package/dist/engine/verifiers/ast-analyzer.test.js +96 -0
  40. package/dist/engine/verifiers/ast-analyzer.test.js.map +1 -0
  41. package/dist/engine/workspace.test.js +95 -0
  42. package/dist/engine/workspace.test.js.map +1 -0
  43. package/dist/exitcode.test.js +62 -0
  44. package/dist/exitcode.test.js.map +1 -0
  45. package/dist/format.js +15 -0
  46. package/dist/format.js.map +1 -1
  47. package/dist/report.test.js +56 -0
  48. package/dist/report.test.js.map +1 -0
  49. package/package.json +7 -4
  50. package/CHANGELOG.md +0 -136
  51. package/CONTRIBUTING.md +0 -52
  52. package/SECURITY.md +0 -38
  53. package/action-dist/index.cjs +0 -20730
  54. package/action.yml +0 -76
  55. package/competitive-analysis.md +0 -304
  56. package/examples/greenbump.yml +0 -37
  57. package/examples/legacy-repo/package.json +0 -12
  58. package/examples/legacy-repo/test.js +0 -17
  59. package/examples/multi-file-repo/models/todo.js +0 -8
  60. package/examples/multi-file-repo/models/user.js +0 -11
  61. package/examples/multi-file-repo/package.json +0 -12
  62. package/examples/multi-file-repo/services/session.js +0 -9
  63. package/examples/multi-file-repo/test.js +0 -19
  64. package/optimization-roadmap.md +0 -772
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,121 @@
1
+ import { getCache } from "../cache/manager.js";
2
+ const DIGEST_PROMPT = (pkg, from, to, changelog) => `You are analyzing release notes for a dependency upgrade. Extract ONLY the breaking changes.
3
+
4
+ Package: ${pkg}
5
+ Upgrade: ${from} → ${to}
6
+
7
+ Release notes:
8
+ """
9
+ ${changelog}
10
+ """
11
+
12
+ Respond with a JSON array (and NOTHING else — no markdown fences, no commentary):
13
+ [
14
+ {
15
+ "description": "one sentence about what changed",
16
+ "oldApi": "the exact old API/usage that breaks (e.g. ReactDOM.render(el, container))",
17
+ "newApi": "the replacement (e.g. createRoot(container).render(el))",
18
+ "severity": "low" | "medium" | "high",
19
+ "example": "optional short code snippet of the migration"
20
+ }
21
+ ]
22
+
23
+ Rules:
24
+ - Include ONLY breaking changes (removed APIs, renamed exports, changed required signatures, behavior changes that break existing code). Skip new features, bug fixes, deprecations that still work.
25
+ - If there are no breaking changes, respond with [].
26
+ - oldApi/newApi must be concrete enough to search for in source code.`;
27
+ /**
28
+ * Produce a structured digest of the changelog, cached per upgrade path.
29
+ * Returns null when there's no changelog to digest.
30
+ */
31
+ export async function digestChangelog(provider, packageName, from, to, changelog) {
32
+ if (!changelog)
33
+ return null;
34
+ const cache = getCache();
35
+ await cache.init();
36
+ const cacheKey = `digest::${packageName}--${from}--${to}`;
37
+ const cached = await cache.getLlmFix(cacheKey);
38
+ if (cached) {
39
+ try {
40
+ const breakingChanges = JSON.parse(cached.edits["__digest__"] ?? "[]");
41
+ return {
42
+ packageName,
43
+ fromVersion: from,
44
+ toVersion: to,
45
+ breakingChanges,
46
+ fromCache: true,
47
+ tokensUsed: { inputTokens: 0, outputTokens: 0 },
48
+ };
49
+ }
50
+ catch {
51
+ // corrupt cache entry — fall through and re-digest
52
+ }
53
+ }
54
+ const result = await provider.send("You extract breaking changes from release notes and respond with strict JSON only.", [{ role: "user", text: DIGEST_PROMPT(packageName, from, to, changelog) }], []);
55
+ let breakingChanges = [];
56
+ try {
57
+ const text = result.text.trim().replace(/^```(?:json)?\s*/i, "").replace(/```\s*$/, "");
58
+ const parsed = JSON.parse(text);
59
+ if (Array.isArray(parsed)) {
60
+ breakingChanges = parsed.filter((c) => typeof c === "object" &&
61
+ c !== null &&
62
+ typeof c.description === "string" &&
63
+ typeof c.oldApi === "string" &&
64
+ typeof c.newApi === "string");
65
+ }
66
+ }
67
+ catch {
68
+ // Unparseable digest — treat as "no structured info", the raw changelog
69
+ // is still passed to the fix loop as before.
70
+ breakingChanges = [];
71
+ }
72
+ // Cache the digest (reuse the LlmFixCache shape to avoid a second schema)
73
+ await cache.setLlmFix(cacheKey, {
74
+ edits: { __digest__: JSON.stringify(breakingChanges) },
75
+ hits: 0,
76
+ model: provider.model,
77
+ });
78
+ return {
79
+ packageName,
80
+ fromVersion: from,
81
+ toVersion: to,
82
+ breakingChanges,
83
+ fromCache: false,
84
+ tokensUsed: result.usage,
85
+ };
86
+ }
87
+ /**
88
+ * Render the digest as a compact prompt block for the fix loop.
89
+ * Much cheaper than the raw changelog: ~40 tokens per breaking change.
90
+ */
91
+ export function renderDigestForPrompt(digest) {
92
+ if (digest.breakingChanges.length === 0)
93
+ return "";
94
+ const lines = digest.breakingChanges.map((c, i) => `${i + 1}. [${c.severity}] ${c.description}\n Replace: ${c.oldApi}\n With: ${c.newApi}`);
95
+ return `\n\nBreaking changes in ${digest.packageName}@${digest.toVersion} (pre-digested from release notes — treat as authoritative):\n${lines.join("\n")}`;
96
+ }
97
+ /**
98
+ * Which of the breaking changes actually affect this project?
99
+ * Cheap substring scan — a breaking change only matters if the old API
100
+ * string appears somewhere in the project's source.
101
+ */
102
+ export async function findApplicableChanges(digest, searchCode) {
103
+ const applicable = [];
104
+ for (const change of digest.breakingChanges) {
105
+ // Search for the core identifier of the old API (e.g. "ReactDOM.render")
106
+ const probe = change.oldApi.split("(")[0].trim();
107
+ if (probe.length < 4)
108
+ continue;
109
+ try {
110
+ const hits = await searchCode(probe);
111
+ if (hits && hits !== "(no matches)")
112
+ applicable.push(change);
113
+ }
114
+ catch {
115
+ // search failed — include the change to be safe
116
+ applicable.push(change);
117
+ }
118
+ }
119
+ return applicable;
120
+ }
121
+ //# sourceMappingURL=changelog-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"changelog-parser.js","sourceRoot":"","sources":["../../../src/engine/analyzers/changelog-parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,59 @@
1
+ import { test } from "node:test";
2
+ import assert from "node:assert/strict";
3
+ import { resolveTargets } from "./batch.js";
4
+ import { WORKSPACE_ROOT, WorkspaceAmbiguityError } from "./workspace.js";
5
+ import { RunError } from "./run.js";
6
+ function outdated(name, current, latest, workspacePath = WORKSPACE_ROOT) {
7
+ return { name, current, wanted: "", latest, workspacePath };
8
+ }
9
+ function baseOpts(overrides = {}) {
10
+ return { cwd: "/tmp/does-not-matter", maxRounds: 5, ...overrides };
11
+ }
12
+ test("resolveTargets: --all resolves every candidate, carrying from/to/workspacePath", () => {
13
+ const candidates = [outdated("lodash", "4.17.20", "4.17.21"), outdated("axios", "1.2.0", "1.3.0")];
14
+ const targets = resolveTargets(baseOpts({ all: true }), candidates);
15
+ assert.deepEqual(targets.map((t) => [t.dep, t.from, t.to, t.workspacePath]), [
16
+ ["lodash", "4.17.20", "4.17.21", WORKSPACE_ROOT],
17
+ ["axios", "1.2.0", "1.3.0", WORKSPACE_ROOT],
18
+ ]);
19
+ });
20
+ test("resolveTargets: explicit deps list resolves each by name", () => {
21
+ const candidates = [outdated("lodash", "4.17.20", "4.17.21"), outdated("axios", "1.2.0", "1.3.0")];
22
+ const targets = resolveTargets(baseOpts({ deps: ["axios"] }), candidates);
23
+ assert.deepEqual(targets, [{ dep: "axios", from: "1.2.0", to: "1.3.0", workspacePath: WORKSPACE_ROOT }]);
24
+ });
25
+ test("resolveTargets: a mix of valid and invalid names keeps the valid ones and defers invalid ones as targets without a resolved version", () => {
26
+ const candidates = [outdated("lodash", "4.17.20", "4.17.21")];
27
+ const targets = resolveTargets(baseOpts({ deps: ["lodash", "not-a-real-package"] }), candidates);
28
+ assert.equal(targets.length, 2);
29
+ assert.equal(targets[0].dep, "lodash");
30
+ assert.ok(targets[0].to);
31
+ assert.equal(targets[1].dep, "not-a-real-package");
32
+ assert.equal(targets[1].to, undefined);
33
+ });
34
+ test("resolveTargets: every requested name invalid throws before any git/branch work", () => {
35
+ const candidates = [outdated("lodash", "4.17.20", "4.17.21")];
36
+ assert.throws(() => resolveTargets(baseOpts({ deps: ["totally-fake-1", "totally-fake-2"] }), candidates), RunError);
37
+ });
38
+ test("resolveTargets: neither --all nor deps given throws (batch.ts is never called this way from the CLI)", () => {
39
+ const candidates = [outdated("lodash", "4.17.20", "4.17.21")];
40
+ assert.throws(() => resolveTargets(baseOpts({}), candidates), RunError);
41
+ });
42
+ test("resolveTargets: ambiguous dep across workspaces without --workspace throws WorkspaceAmbiguityError", () => {
43
+ const candidates = [
44
+ outdated("lodash", "4.17.15", "4.17.21", "packages/api"),
45
+ outdated("lodash", "4.17.20", "4.17.21", "packages/web"),
46
+ ];
47
+ assert.throws(() => resolveTargets(baseOpts({ deps: ["lodash"] }), candidates), WorkspaceAmbiguityError);
48
+ });
49
+ test("resolveTargets: ambiguous dep resolved via --workspace picks the right package", () => {
50
+ const candidates = [
51
+ outdated("lodash", "4.17.15", "4.17.21", "packages/api"),
52
+ outdated("lodash", "4.17.20", "4.17.21", "packages/web"),
53
+ ];
54
+ const targets = resolveTargets(baseOpts({ deps: ["lodash"], workspace: "packages/web" }), candidates);
55
+ assert.equal(targets.length, 1);
56
+ assert.equal(targets[0].from, "4.17.20");
57
+ assert.equal(targets[0].workspacePath, "packages/web");
58
+ });
59
+ //# sourceMappingURL=batch.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"batch.test.js","sourceRoot":"","sources":["../../src/engine/batch.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,165 @@
1
+ import { mkdir, readFile, writeFile, readdir, stat, rm } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ import { createHash } from "node:crypto";
4
+ import { homedir } from "node:os";
5
+ const DEFAULT_TTL_MS = 30 * 24 * 60 * 60 * 1000; // 30 days
6
+ const MAX_CACHE_SIZE_MB = 500;
7
+ export class CacheManager {
8
+ cacheDir;
9
+ ttlMs;
10
+ constructor(opts) {
11
+ // GREENBUMP_CACHE_DIR lets tests/CI point the cache at a throwaway dir
12
+ // so cached fixes never leak between runs.
13
+ this.cacheDir =
14
+ opts?.cacheDir ??
15
+ process.env.GREENBUMP_CACHE_DIR ??
16
+ join(homedir(), ".greenbump", "cache");
17
+ this.ttlMs = opts?.ttlMs ?? DEFAULT_TTL_MS;
18
+ }
19
+ async init() {
20
+ await mkdir(this.cacheDir, { recursive: true });
21
+ }
22
+ // ── Changelog cache ────────────────────────────────────────────────────
23
+ async getChangelog(pkgName, from, to) {
24
+ return this.get("changelogs", `${pkgName}--${from}--${to}`);
25
+ }
26
+ async setChangelog(pkgName, from, to, changelog) {
27
+ // Changelogs are immutable — use a very long TTL
28
+ await this.set("changelogs", `${pkgName}--${from}--${to}`, changelog, 365 * 24 * 60 * 60 * 1000);
29
+ }
30
+ // ── LLM response cache ─────────────────────────────────────────────────
31
+ /**
32
+ * Cache an LLM fix response keyed by a hash of the full context
33
+ * (dep + versions + failure output). Identical failures across projects
34
+ * hit the same cache entry — this is where the big savings come from.
35
+ */
36
+ async getLlmFix(contextKey) {
37
+ return this.get("llm-fixes", contextKey);
38
+ }
39
+ async setLlmFix(contextKey, fix) {
40
+ await this.set("llm-fixes", contextKey, fix);
41
+ }
42
+ // ── Fix pattern cache ──────────────────────────────────────────────────
43
+ async getFixPattern(pkgName, errorSignature) {
44
+ return this.get("patterns", `${pkgName}--${this.hash(errorSignature)}`);
45
+ }
46
+ async setFixPattern(pkgName, errorSignature, pattern) {
47
+ await this.set("patterns", `${pkgName}--${this.hash(errorSignature)}`, pattern);
48
+ }
49
+ // ── Stats & maintenance ────────────────────────────────────────────────
50
+ async stats() {
51
+ const stats = { entries: 0, sizeBytes: 0, byCategory: {} };
52
+ try {
53
+ const categories = await readdir(this.cacheDir);
54
+ for (const cat of categories) {
55
+ const catDir = join(this.cacheDir, cat);
56
+ const s = await stat(catDir).catch(() => null);
57
+ if (!s?.isDirectory())
58
+ continue;
59
+ const files = await readdir(catDir);
60
+ let catSize = 0;
61
+ for (const f of files) {
62
+ const fs2 = await stat(join(catDir, f)).catch(() => null);
63
+ if (fs2)
64
+ catSize += fs2.size;
65
+ }
66
+ stats.byCategory[cat] = { entries: files.length, sizeBytes: catSize };
67
+ stats.entries += files.length;
68
+ stats.sizeBytes += catSize;
69
+ }
70
+ }
71
+ catch {
72
+ // cache dir doesn't exist yet
73
+ }
74
+ return stats;
75
+ }
76
+ async clear(category) {
77
+ const target = category ? join(this.cacheDir, category) : this.cacheDir;
78
+ await rm(target, { recursive: true, force: true });
79
+ if (!category)
80
+ await this.init();
81
+ }
82
+ /** Evict expired entries and enforce size cap. Call periodically. */
83
+ async prune() {
84
+ let pruned = 0;
85
+ const now = Date.now();
86
+ try {
87
+ const categories = await readdir(this.cacheDir);
88
+ for (const cat of categories) {
89
+ const catDir = join(this.cacheDir, cat);
90
+ const s = await stat(catDir).catch(() => null);
91
+ if (!s?.isDirectory())
92
+ continue;
93
+ const files = await readdir(catDir);
94
+ for (const f of files) {
95
+ const fp = join(catDir, f);
96
+ try {
97
+ const raw = await readFile(fp, "utf8");
98
+ const entry = JSON.parse(raw);
99
+ const ttl = entry.ttl ?? this.ttlMs;
100
+ if (now - entry.createdAt > ttl) {
101
+ await rm(fp, { force: true });
102
+ pruned++;
103
+ }
104
+ }
105
+ catch {
106
+ // corrupt entry — remove it
107
+ await rm(fp, { force: true });
108
+ pruned++;
109
+ }
110
+ }
111
+ }
112
+ }
113
+ catch {
114
+ // nothing to prune
115
+ }
116
+ return pruned;
117
+ }
118
+ // ── Generic get/set ────────────────────────────────────────────────────
119
+ async get(category, key) {
120
+ const fp = join(this.cacheDir, category, `${this.hash(key)}.json`);
121
+ try {
122
+ const raw = await readFile(fp, "utf8");
123
+ const entry = JSON.parse(raw);
124
+ const ttl = entry.ttl ?? this.ttlMs;
125
+ if (Date.now() - entry.createdAt > ttl) {
126
+ await rm(fp, { force: true }).catch(() => { });
127
+ return null;
128
+ }
129
+ return entry.value;
130
+ }
131
+ catch {
132
+ return null;
133
+ }
134
+ }
135
+ async set(category, key, value, ttlMs) {
136
+ const dir = join(this.cacheDir, category);
137
+ await mkdir(dir, { recursive: true });
138
+ const entry = {
139
+ value,
140
+ createdAt: Date.now(),
141
+ ...(ttlMs !== undefined ? { ttl: ttlMs } : {}),
142
+ };
143
+ await writeFile(join(dir, `${this.hash(key)}.json`), JSON.stringify(entry), "utf8");
144
+ }
145
+ hash(input) {
146
+ return createHash("sha256").update(input).digest("hex").slice(0, 24);
147
+ }
148
+ }
149
+ let shared = null;
150
+ let sharedDir = null;
151
+ /** Shared singleton — one cache per process. Re-created if GREENBUMP_CACHE_DIR changes. */
152
+ export function getCache() {
153
+ const dir = process.env.GREENBUMP_CACHE_DIR ?? null;
154
+ if (!shared || sharedDir !== dir) {
155
+ shared = new CacheManager();
156
+ sharedDir = dir;
157
+ }
158
+ return shared;
159
+ }
160
+ /** Test helper: drop the singleton so the next getCache() re-reads the env. */
161
+ export function resetCacheForTests() {
162
+ shared = null;
163
+ sharedDir = null;
164
+ }
165
+ //# sourceMappingURL=manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../../src/engine/cache/manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,75 @@
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 { CacheManager } from "./manager.js";
7
+ async function withCache(fn) {
8
+ const dir = await mkdtemp(join(tmpdir(), "greenbump-cache-test-"));
9
+ const cache = new CacheManager({ cacheDir: dir });
10
+ await cache.init();
11
+ try {
12
+ await fn(cache);
13
+ }
14
+ finally {
15
+ await rm(dir, { recursive: true, force: true });
16
+ }
17
+ }
18
+ test("CacheManager: changelog round-trip", async () => {
19
+ await withCache(async (cache) => {
20
+ assert.equal(await cache.getChangelog("react", "18.0.0", "19.0.0"), null);
21
+ await cache.setChangelog("react", "18.0.0", "19.0.0", "## Breaking\nReactDOM.render removed");
22
+ assert.equal(await cache.getChangelog("react", "18.0.0", "19.0.0"), "## Breaking\nReactDOM.render removed");
23
+ });
24
+ });
25
+ test("CacheManager: LLM fix round-trip with hit counter", async () => {
26
+ await withCache(async (cache) => {
27
+ const key = "lodash@4.17.20->4.17.21::some-error";
28
+ assert.equal(await cache.getLlmFix(key), null);
29
+ await cache.setLlmFix(key, {
30
+ edits: { "app.js": "fixed content" },
31
+ hits: 0,
32
+ model: "test-model",
33
+ });
34
+ const got = await cache.getLlmFix(key);
35
+ assert.ok(got);
36
+ assert.deepEqual(got.edits, { "app.js": "fixed content" });
37
+ assert.equal(got.model, "test-model");
38
+ });
39
+ });
40
+ test("CacheManager: expired entries are evicted on read", async () => {
41
+ const dir = await mkdtemp(join(tmpdir(), "greenbump-cache-test-"));
42
+ const cache = new CacheManager({ cacheDir: dir, ttlMs: 50 }); // 50ms TTL
43
+ await cache.init();
44
+ try {
45
+ // setLlmFix uses the manager's default TTL (unlike setChangelog, which pins 1 year)
46
+ await cache.setLlmFix("some-key", { edits: { "a.js": "x" }, hits: 0, model: "m" });
47
+ // Present immediately
48
+ assert.ok(await cache.getLlmFix("some-key"));
49
+ // Gone after the TTL elapses
50
+ await new Promise((r) => setTimeout(r, 80));
51
+ assert.equal(await cache.getLlmFix("some-key"), null);
52
+ }
53
+ finally {
54
+ await rm(dir, { recursive: true, force: true });
55
+ }
56
+ });
57
+ test("CacheManager: stats reflect stored entries", async () => {
58
+ await withCache(async (cache) => {
59
+ await cache.setChangelog("react", "18.0.0", "19.0.0", "notes");
60
+ await cache.setLlmFix("key1", { edits: {}, hits: 0, model: "m" });
61
+ const stats = await cache.stats();
62
+ assert.equal(stats.entries, 2);
63
+ assert.ok(stats.sizeBytes > 0);
64
+ assert.ok(stats.byCategory["changelogs"]);
65
+ assert.ok(stats.byCategory["llm-fixes"]);
66
+ });
67
+ });
68
+ test("CacheManager: clear removes entries", async () => {
69
+ await withCache(async (cache) => {
70
+ await cache.setChangelog("react", "18.0.0", "19.0.0", "notes");
71
+ await cache.clear("changelogs");
72
+ assert.equal(await cache.getChangelog("react", "18.0.0", "19.0.0"), null);
73
+ });
74
+ });
75
+ //# sourceMappingURL=manager.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.test.js","sourceRoot":"","sources":["../../../src/engine/cache/manager.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,92 @@
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 { runChecks } from "./checks.js";
7
+ async function withTmpDir(fn) {
8
+ const dir = await mkdtemp(join(tmpdir(), "greenbump-checks-"));
9
+ try {
10
+ await fn(dir);
11
+ }
12
+ finally {
13
+ await rm(dir, { recursive: true, force: true });
14
+ }
15
+ }
16
+ async function writePkg(dir, scripts) {
17
+ await writeFile(join(dir, "package.json"), JSON.stringify({ name: "tmp", version: "1.0.0", scripts }), "utf8");
18
+ }
19
+ test("runChecks: unverifiable when the adapter has no build or test script", async () => {
20
+ await withTmpDir(async (dir) => {
21
+ await writePkg(dir, {});
22
+ const r = await runChecks("npm", dir);
23
+ assert.equal(r.unverifiable, true);
24
+ assert.equal(r.ok, true);
25
+ });
26
+ });
27
+ test("runChecks: ok when build and test scripts both succeed", async () => {
28
+ await withTmpDir(async (dir) => {
29
+ await writePkg(dir, { build: "node -e \"process.exit(0)\"", test: "node -e \"process.exit(0)\"" });
30
+ const r = await runChecks("npm", dir);
31
+ assert.equal(r.ok, true);
32
+ assert.equal(r.unverifiable, false);
33
+ assert.equal(r.failedStep, undefined);
34
+ });
35
+ });
36
+ test("runChecks: stops at build failure without running test", async () => {
37
+ await withTmpDir(async (dir) => {
38
+ await writePkg(dir, {
39
+ build: "node -e \"console.error('boom'); process.exit(1)\"",
40
+ test: "node -e \"require('fs').writeFileSync('ran-test','1')\"",
41
+ });
42
+ const r = await runChecks("npm", dir);
43
+ assert.equal(r.ok, false);
44
+ assert.equal(r.failedStep, "build");
45
+ assert.match(r.output, /boom/);
46
+ await assert.rejects(async () => {
47
+ const { stat } = await import("node:fs/promises");
48
+ await stat(join(dir, "ran-test"));
49
+ });
50
+ });
51
+ });
52
+ test("runChecks: build passes, test fails — reports test as the failed step", async () => {
53
+ await withTmpDir(async (dir) => {
54
+ await writePkg(dir, {
55
+ build: "node -e \"process.exit(0)\"",
56
+ test: "node -e \"console.error('test failed'); process.exit(1)\"",
57
+ });
58
+ const r = await runChecks("npm", dir);
59
+ assert.equal(r.ok, false);
60
+ assert.equal(r.failedStep, "test");
61
+ assert.match(r.output, /test failed/);
62
+ });
63
+ });
64
+ test("runChecks: --build-cmd/--test-cmd overrides win over the adapter's own scripts", async () => {
65
+ await withTmpDir(async (dir) => {
66
+ await writePkg(dir, { build: "node -e \"process.exit(1)\"" });
67
+ const r = await runChecks("npm", dir, { buildCmd: "node -e \"process.exit(0)\"" });
68
+ assert.equal(r.ok, true);
69
+ assert.equal(r.unverifiable, false);
70
+ });
71
+ });
72
+ test("runChecks: truncates output that exceeds the max size, keeping the tail", async () => {
73
+ await withTmpDir(async (dir) => {
74
+ // Write >16_000 chars of stdout before failing, then check only the end survives.
75
+ // Use process.exitCode (not process.exit()) so Node drains stdout before exiting —
76
+ // stdout writes to a pipe are asynchronous, and a forced process.exit() right after
77
+ // thousands of console.log calls can truncate the buffer before it's flushed. That
78
+ // race is invisible on a local TTY but reliably bites in CI's piped, headless stdio.
79
+ // MARKER_END also goes through console.log (stdout), not console.error (stderr) —
80
+ // exec.ts appends to `combined` from two independent stream 'data' listeners, so
81
+ // interleaving order across stdout/stderr is not guaranteed; keeping the marker on
82
+ // the same stream as the 2000 lines guarantees it lands after them.
83
+ const script = "for (let i = 0; i < 2000; i++) console.log('line-' + i); console.log('MARKER_END'); process.exitCode = 1;";
84
+ await writePkg(dir, { build: `node -e "${script.replace(/"/g, '\\"')}"` });
85
+ const r = await runChecks("npm", dir);
86
+ assert.equal(r.ok, false);
87
+ assert.match(r.output, /MARKER_END/);
88
+ assert.ok(r.output.length <= 16_000 + 50);
89
+ assert.doesNotMatch(r.output, /line-0\b/);
90
+ });
91
+ });
92
+ //# sourceMappingURL=checks.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checks.test.js","sourceRoot":"","sources":["../../src/engine/checks.test.ts"],"names":[],"mappings":"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"}