greenbump 0.2.0 → 0.2.1

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.
@@ -1,224 +0,0 @@
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 { runFixLoop } from "./fixer.js";
7
- async function withTmpDir(fn) {
8
- const dir = await mkdtemp(join(tmpdir(), "greenbump-fixer-"));
9
- try {
10
- await fn(dir);
11
- }
12
- finally {
13
- await rm(dir, { recursive: true, force: true });
14
- }
15
- }
16
- /** A scripted provider: returns each entry in `turns` in order, one per send() call. */
17
- function scriptedProvider(turns) {
18
- let i = 0;
19
- const calls = [];
20
- return {
21
- name: "stub",
22
- model: "stub-model",
23
- calls,
24
- async send(_system, messages, _tools) {
25
- calls.push(messages);
26
- const turn = turns[Math.min(i, turns.length - 1)];
27
- i++;
28
- return {
29
- text: turn.text ?? "",
30
- toolCalls: turn.toolCalls ?? [],
31
- usage: { inputTokens: 10, outputTokens: 5 },
32
- };
33
- },
34
- };
35
- }
36
- async function writePkg(dir, scripts) {
37
- await writeFile(join(dir, "package.json"), JSON.stringify({ name: "tmp", scripts }), "utf8");
38
- }
39
- const baseOpts = {
40
- pm: "npm",
41
- dep: "lodash",
42
- from: "4.17.20",
43
- to: "4.17.21",
44
- failureOutput: "TypeError: _.pad is not a function",
45
- maxRounds: 5,
46
- };
47
- test("runFixLoop: write_file then run_check passing ends the loop as fixed, tracking the edited file", async () => {
48
- await withTmpDir(async (dir) => {
49
- await writePkg(dir, { build: "node -e \"process.exit(0)\"", test: "node -e \"process.exit(0)\"" });
50
- await writeFile(join(dir, "app.js"), "old content", "utf8");
51
- const provider = scriptedProvider([
52
- {
53
- toolCalls: [
54
- { id: "1", name: "write_file", input: { path: "app.js", content: "new content" } },
55
- { id: "2", name: "run_check", input: {} },
56
- ],
57
- },
58
- ]);
59
- const result = await runFixLoop({ ...baseOpts, cwd: dir, provider });
60
- assert.equal(result.fixed, true);
61
- assert.equal(result.rounds, 1);
62
- assert.deepEqual(result.editedFiles, ["app.js"]);
63
- assert.equal(result.usage.inputTokens, 10);
64
- assert.equal(result.usage.outputTokens, 5);
65
- const { readFile } = await import("node:fs/promises");
66
- assert.equal(await readFile(join(dir, "app.js"), "utf8"), "new content");
67
- });
68
- });
69
- test("runFixLoop: run_check failure keeps the loop going to the next round", async () => {
70
- await withTmpDir(async (dir) => {
71
- await writePkg(dir, { build: "node -e \"process.exit(1)\"" });
72
- const provider = scriptedProvider([
73
- { toolCalls: [{ id: "1", name: "run_check", input: {} }] },
74
- { toolCalls: [{ id: "2", name: "run_check", input: {} }] },
75
- ]);
76
- const result = await runFixLoop({ ...baseOpts, cwd: dir, provider, maxRounds: 2 });
77
- assert.equal(result.fixed, false);
78
- assert.equal(result.rounds, 2);
79
- assert.equal(provider.calls.length, 2);
80
- });
81
- });
82
- test("runFixLoop: exhausting maxRounds without a passing check reports not fixed", async () => {
83
- await withTmpDir(async (dir) => {
84
- await writePkg(dir, { build: "node -e \"process.exit(1)\"" });
85
- const provider = scriptedProvider([{ toolCalls: [{ id: "1", name: "run_check", input: {} }] }]);
86
- const result = await runFixLoop({ ...baseOpts, cwd: dir, provider, maxRounds: 3 });
87
- assert.equal(result.fixed, false);
88
- assert.equal(result.rounds, 3);
89
- });
90
- });
91
- test("runFixLoop: model stopping without a tool call triggers one final verification check", async () => {
92
- await withTmpDir(async (dir) => {
93
- await writePkg(dir, { build: "node -e \"process.exit(0)\"" });
94
- const provider = scriptedProvider([{ text: "I believe this is fixed now.", toolCalls: [] }]);
95
- const result = await runFixLoop({ ...baseOpts, cwd: dir, provider, maxRounds: 5 });
96
- assert.equal(result.fixed, true);
97
- assert.equal(result.rounds, 1);
98
- });
99
- });
100
- test("runFixLoop: read_file/write_file reject paths that escape the project root", async () => {
101
- await withTmpDir(async (dir) => {
102
- await writePkg(dir, {});
103
- const provider = scriptedProvider([
104
- {
105
- toolCalls: [
106
- { id: "1", name: "write_file", input: { path: "../../etc/evil", content: "pwned" } },
107
- ],
108
- },
109
- { toolCalls: [{ id: "2", name: "run_check", input: {} }] },
110
- ]);
111
- await runFixLoop({ ...baseOpts, cwd: dir, provider, maxRounds: 2 });
112
- // The tool call result fed back to the model should carry the error,
113
- // not a silently-succeeded write outside the project.
114
- const secondCallMessages = provider.calls[1];
115
- const toolMsg = secondCallMessages.find((m) => m.role === "tool");
116
- assert.ok(toolMsg);
117
- assert.equal(toolMsg.results[0].isError, true);
118
- assert.match(toolMsg.results[0].content, /escapes project root/);
119
- const { pathExists } = await import("../engine/ecosystems/types.js");
120
- assert.equal(await pathExists(join(dir, "..", "..", "etc", "evil")), false);
121
- });
122
- });
123
- test("runFixLoop: opts.deps builds a multi-dependency prompt listing every upgrade and changelog", async () => {
124
- await withTmpDir(async (dir) => {
125
- await writePkg(dir, { build: "node -e \"process.exit(0)\"" });
126
- const provider = scriptedProvider([{ toolCalls: [{ id: "1", name: "run_check", input: {} }] }]);
127
- const result = await runFixLoop({
128
- ...baseOpts,
129
- cwd: dir,
130
- provider,
131
- maxRounds: 3,
132
- deps: [
133
- { dep: "lodash", from: "4.17.20", to: "4.17.21", changelog: "lodash notes" },
134
- { dep: "axios", from: "1.2.0", to: "1.3.0", changelog: "axios notes" },
135
- ],
136
- });
137
- assert.equal(result.fixed, true);
138
- const firstCallMessages = provider.calls[0];
139
- const userMsg = firstCallMessages.find((m) => m.role === "user");
140
- assert.ok(userMsg);
141
- assert.match(userMsg.text, /lodash/);
142
- assert.match(userMsg.text, /axios/);
143
- assert.match(userMsg.text, /lodash notes/);
144
- assert.match(userMsg.text, /axios notes/);
145
- });
146
- });
147
- test("runFixLoop: single-dep call sites (no opts.deps) keep producing the original singular prompt", async () => {
148
- await withTmpDir(async (dir) => {
149
- await writePkg(dir, { build: "node -e \"process.exit(0)\"" });
150
- const provider = scriptedProvider([{ toolCalls: [{ id: "1", name: "run_check", input: {} }] }]);
151
- await runFixLoop({ ...baseOpts, cwd: dir, provider, maxRounds: 3 });
152
- const firstCallMessages = provider.calls[0];
153
- const userMsg = firstCallMessages.find((m) => m.role === "user");
154
- assert.ok(userMsg);
155
- assert.match(userMsg.text, /`lodash` from 4\.17\.20 to 4\.17\.21/);
156
- });
157
- });
158
- test("runFixLoop: hitting maxTokens stops the loop early and reports budgetExceeded", async () => {
159
- await withTmpDir(async (dir) => {
160
- await writePkg(dir, { build: "node -e \"process.exit(1)\"" });
161
- // Each round costs 10+5=15 tokens (see scriptedProvider); cap at 20 so round 2 trips it.
162
- const provider = scriptedProvider([
163
- { toolCalls: [{ id: "1", name: "run_check", input: {} }] },
164
- { toolCalls: [{ id: "2", name: "run_check", input: {} }] },
165
- { toolCalls: [{ id: "3", name: "run_check", input: {} }] },
166
- ]);
167
- const result = await runFixLoop({ ...baseOpts, cwd: dir, provider, maxRounds: 5, maxTokens: 20 });
168
- assert.equal(result.fixed, false);
169
- assert.equal(result.budgetExceeded, true);
170
- assert.equal(result.rounds, 2);
171
- assert.equal(provider.calls.length, 2);
172
- });
173
- });
174
- test("runFixLoop: without maxTokens set, the loop runs to completion as before", async () => {
175
- await withTmpDir(async (dir) => {
176
- await writePkg(dir, { build: "node -e \"process.exit(0)\"" });
177
- const provider = scriptedProvider([{ toolCalls: [{ id: "1", name: "run_check", input: {} }] }]);
178
- const result = await runFixLoop({ ...baseOpts, cwd: dir, provider, maxRounds: 3 });
179
- assert.equal(result.fixed, true);
180
- assert.equal(result.budgetExceeded, false);
181
- });
182
- });
183
- test("runFixLoop: list_dir and search_code let the agent inspect real project files", async () => {
184
- await withTmpDir(async (dir) => {
185
- await writePkg(dir, { build: "node -e \"process.exit(0)\"" });
186
- await mkdir(join(dir, "src"));
187
- await writeFile(join(dir, "src", "util.js"), "export function pad(s) { return _.pad(s); }\n", "utf8");
188
- const captured = [];
189
- const provider = {
190
- name: "stub",
191
- model: "stub-model",
192
- async send(_system, messages, _tools) {
193
- const last = messages[messages.length - 1];
194
- if (last.role === "tool") {
195
- captured.push(last.results.map((r) => r.content).join("\n"));
196
- }
197
- if (captured.length === 0) {
198
- return {
199
- text: "",
200
- toolCalls: [{ id: "1", name: "list_dir", input: { path: "src" } }],
201
- usage: { inputTokens: 1, outputTokens: 1 },
202
- };
203
- }
204
- if (captured.length === 1) {
205
- return {
206
- text: "",
207
- toolCalls: [{ id: "2", name: "search_code", input: { query: "_.pad", path: "src" } }],
208
- usage: { inputTokens: 1, outputTokens: 1 },
209
- };
210
- }
211
- return {
212
- text: "",
213
- toolCalls: [{ id: "3", name: "run_check", input: {} }],
214
- usage: { inputTokens: 1, outputTokens: 1 },
215
- };
216
- },
217
- };
218
- const result = await runFixLoop({ ...baseOpts, cwd: dir, provider, maxRounds: 5 });
219
- assert.equal(result.fixed, true);
220
- assert.match(captured[0], /util\.js/);
221
- assert.match(captured[1], /src\/util\.js:1: .*_\.pad/);
222
- });
223
- });
224
- //# sourceMappingURL=fixer.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"fixer.test.js","sourceRoot":"","sources":["../../src/agent/fixer.test.ts"],"names":[],"mappings":"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"}
@@ -1,59 +0,0 @@
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
@@ -1 +0,0 @@
1
- {"version":3,"file":"batch.test.js","sourceRoot":"","sources":["../../src/engine/batch.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,cAAc,EAAwB,MAAM,YAAY,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,uBAAuB,EAA0B,MAAM,gBAAgB,CAAC;AACjG,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEpC,SAAS,QAAQ,CAAC,IAAY,EAAE,OAAe,EAAE,MAAc,EAAE,aAAa,GAAG,cAAc;IAC7F,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC;AAC9D,CAAC;AAED,SAAS,QAAQ,CAAC,YAAsC,EAAE;IACxD,OAAO,EAAE,GAAG,EAAE,sBAAsB,EAAE,SAAS,EAAE,CAAC,EAAE,GAAG,SAAS,EAAE,CAAC;AACrE,CAAC;AAED,IAAI,CAAC,gFAAgF,EAAE,GAAG,EAAE;IAC1F,MAAM,UAAU,GAAG,CAAC,QAAQ,CAAC,QAAQ,EAAE,SAAS,EAAE,SAAS,CAAC,EAAE,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;IACnG,MAAM,OAAO,GAAG,cAAc,CAAC,QAAQ,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,UAAU,CAAC,CAAC;IACpE,MAAM,CAAC,SAAS,CACd,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,aAAa,CAAC,CAAC,EAC1D;QACE,CAAC,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,cAAc,CAAC;QAChD,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,cAAc,CAAC;KAC5C,CACF,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,0DAA0D,EAAE,GAAG,EAAE;IACpE,MAAM,UAAU,GAAG,CAAC,QAAQ,CAAC,QAAQ,EAAE,SAAS,EAAE,SAAS,CAAC,EAAE,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;IACnG,MAAM,OAAO,GAAG,cAAc,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,UAAU,CAAC,CAAC;IAC1E,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC;AAC3G,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,qIAAqI,EAAE,GAAG,EAAE;IAC/I,MAAM,UAAU,GAAG,CAAC,QAAQ,CAAC,QAAQ,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;IAC9D,MAAM,OAAO,GAAG,cAAc,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,CAAC,QAAQ,EAAE,oBAAoB,CAAC,EAAE,CAAC,EAAE,UAAU,CAAC,CAAC;IACjG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAChC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IACvC,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACzB,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,oBAAoB,CAAC,CAAC;IACnD,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;AACzC,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,gFAAgF,EAAE,GAAG,EAAE;IAC1F,MAAM,UAAU,GAAG,CAAC,QAAQ,CAAC,QAAQ,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;IAC9D,MAAM,CAAC,MAAM,CACX,GAAG,EAAE,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,EAAE,CAAC,EAAE,UAAU,CAAC,EAC1F,QAAQ,CACT,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,sGAAsG,EAAE,GAAG,EAAE;IAChH,MAAM,UAAU,GAAG,CAAC,QAAQ,CAAC,QAAQ,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;IAC9D,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,UAAU,CAAC,EAAE,QAAQ,CAAC,CAAC;AAC1E,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,oGAAoG,EAAE,GAAG,EAAE;IAC9G,MAAM,UAAU,GAAG;QACjB,QAAQ,CAAC,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,cAAc,CAAC;QACxD,QAAQ,CAAC,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,cAAc,CAAC;KACzD,CAAC;IACF,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,UAAU,CAAC,EAAE,uBAAuB,CAAC,CAAC;AAC3G,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,gFAAgF,EAAE,GAAG,EAAE;IAC1F,MAAM,UAAU,GAAG;QACjB,QAAQ,CAAC,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,cAAc,CAAC;QACxD,QAAQ,CAAC,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,cAAc,CAAC;KACzD,CAAC;IACF,MAAM,OAAO,GAAG,cAAc,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,CAAC,QAAQ,CAAC,EAAE,SAAS,EAAE,cAAc,EAAE,CAAC,EAAE,UAAU,CAAC,CAAC;IACtG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAChC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IACzC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,aAAa,EAAE,cAAc,CAAC,CAAC;AACzD,CAAC,CAAC,CAAC"}
@@ -1,92 +0,0 @@
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
@@ -1 +0,0 @@
1
- {"version":3,"file":"checks.test.js","sourceRoot":"","sources":["../../src/engine/checks.test.ts"],"names":[],"mappings":"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"}