@urateam/cli 0.1.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 (45) hide show
  1. package/dist/__tests__/cli-integration.test.d.ts +2 -0
  2. package/dist/__tests__/cli-integration.test.d.ts.map +1 -0
  3. package/dist/__tests__/cli-integration.test.js +91 -0
  4. package/dist/__tests__/cli-integration.test.js.map +1 -0
  5. package/dist/__tests__/config.test.d.ts +2 -0
  6. package/dist/__tests__/config.test.d.ts.map +1 -0
  7. package/dist/__tests__/config.test.js +92 -0
  8. package/dist/__tests__/config.test.js.map +1 -0
  9. package/dist/__tests__/run.test.d.ts +2 -0
  10. package/dist/__tests__/run.test.d.ts.map +1 -0
  11. package/dist/__tests__/run.test.js +297 -0
  12. package/dist/__tests__/run.test.js.map +1 -0
  13. package/dist/__tests__/webhook.test.d.ts +2 -0
  14. package/dist/__tests__/webhook.test.d.ts.map +1 -0
  15. package/dist/__tests__/webhook.test.js +142 -0
  16. package/dist/__tests__/webhook.test.js.map +1 -0
  17. package/dist/commands/config.d.ts +3 -0
  18. package/dist/commands/config.d.ts.map +1 -0
  19. package/dist/commands/config.js +44 -0
  20. package/dist/commands/config.js.map +1 -0
  21. package/dist/commands/dev.d.ts +3 -0
  22. package/dist/commands/dev.d.ts.map +1 -0
  23. package/dist/commands/dev.js +73 -0
  24. package/dist/commands/dev.js.map +1 -0
  25. package/dist/commands/migrate.d.ts +3 -0
  26. package/dist/commands/migrate.d.ts.map +1 -0
  27. package/dist/commands/migrate.js +119 -0
  28. package/dist/commands/migrate.js.map +1 -0
  29. package/dist/commands/run.d.ts +28 -0
  30. package/dist/commands/run.d.ts.map +1 -0
  31. package/dist/commands/run.js +283 -0
  32. package/dist/commands/run.js.map +1 -0
  33. package/dist/commands/start.d.ts +3 -0
  34. package/dist/commands/start.d.ts.map +1 -0
  35. package/dist/commands/start.js +196 -0
  36. package/dist/commands/start.js.map +1 -0
  37. package/dist/commands/webhook.d.ts +3 -0
  38. package/dist/commands/webhook.d.ts.map +1 -0
  39. package/dist/commands/webhook.js +34 -0
  40. package/dist/commands/webhook.js.map +1 -0
  41. package/dist/index.d.ts +3 -0
  42. package/dist/index.d.ts.map +1 -0
  43. package/dist/index.js +21 -0
  44. package/dist/index.js.map +1 -0
  45. package/package.json +36 -0
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=cli-integration.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-integration.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/cli-integration.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,91 @@
1
+ import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
2
+ import { Command } from "commander";
3
+ // ---------------------------------------------------------------------------
4
+ // Command registration — all expected commands are registered
5
+ // ---------------------------------------------------------------------------
6
+ describe("command registration", () => {
7
+ it("registers all expected commands: run, dev, webhook, config, start", async () => {
8
+ // We cannot import index.ts directly because it calls .parse() on import,
9
+ // so we verify by importing each command and checking its name.
10
+ const { runCommand } = await import("../commands/run.js");
11
+ const { devCommand } = await import("../commands/dev.js");
12
+ const { webhookCommand } = await import("../commands/webhook.js");
13
+ const { configCommand } = await import("../commands/config.js");
14
+ const { startCommand } = await import("../commands/start.js");
15
+ // Build a program the same way index.ts does
16
+ const program = new Command();
17
+ program.name("ura").version("0.1.0");
18
+ program.addCommand(runCommand);
19
+ program.addCommand(devCommand);
20
+ program.addCommand(webhookCommand);
21
+ program.addCommand(configCommand);
22
+ program.addCommand(startCommand);
23
+ const commandNames = program.commands.map((c) => c.name());
24
+ expect(commandNames).toContain("run");
25
+ expect(commandNames).toContain("dev");
26
+ expect(commandNames).toContain("webhook");
27
+ expect(commandNames).toContain("config");
28
+ expect(commandNames).toContain("start");
29
+ expect(commandNames).toHaveLength(5);
30
+ });
31
+ it("each command has a non-empty description", async () => {
32
+ const { runCommand } = await import("../commands/run.js");
33
+ const { devCommand } = await import("../commands/dev.js");
34
+ const { webhookCommand } = await import("../commands/webhook.js");
35
+ const { configCommand } = await import("../commands/config.js");
36
+ const { startCommand } = await import("../commands/start.js");
37
+ for (const cmd of [runCommand, devCommand, webhookCommand, configCommand, startCommand]) {
38
+ expect(cmd.description()).toBeTruthy();
39
+ }
40
+ });
41
+ it("run command declares --issue as a required option", async () => {
42
+ const { runCommand } = await import("../commands/run.js");
43
+ const issueOpt = runCommand.options.find((o) => o.long === "--issue");
44
+ expect(issueOpt).toBeDefined();
45
+ expect(issueOpt.required).toBe(true);
46
+ });
47
+ it("webhook command declares --file as a required option", async () => {
48
+ const { webhookCommand } = await import("../commands/webhook.js");
49
+ const fileOpt = webhookCommand.options.find((o) => o.long === "--file");
50
+ expect(fileOpt).toBeDefined();
51
+ expect(fileOpt.required).toBe(true);
52
+ });
53
+ });
54
+ // ---------------------------------------------------------------------------
55
+ // Required option enforcement — commander rejects missing --issue
56
+ // ---------------------------------------------------------------------------
57
+ describe("run command — missing required --issue", () => {
58
+ it("throws when --issue is not provided", async () => {
59
+ const { runCommand } = await import("../commands/run.js");
60
+ // commander exits or throws when a required option is missing
61
+ runCommand.exitOverride(); // make it throw instead of process.exit
62
+ await expect(runCommand.parseAsync(["--dry-run"], { from: "user" })).rejects.toThrow();
63
+ });
64
+ });
65
+ // ---------------------------------------------------------------------------
66
+ // --only flag combined with --stage in dry-run output
67
+ // ---------------------------------------------------------------------------
68
+ describe("run command — --only flag with --stage", () => {
69
+ let consoleLog;
70
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
71
+ let processExit;
72
+ beforeEach(() => {
73
+ consoleLog = vi.spyOn(console, "log").mockImplementation(() => { });
74
+ processExit = vi.spyOn(process, "exit").mockImplementation(((_code) => {
75
+ throw new Error(`process.exit(${_code})`);
76
+ }));
77
+ });
78
+ afterEach(() => {
79
+ consoleLog.mockRestore();
80
+ processExit.mockRestore();
81
+ });
82
+ it("reports only: true when --stage and --only are both provided", async () => {
83
+ const { runCommand } = await import("../commands/run.js");
84
+ await runCommand.parseAsync(["--issue", "LIN-42", "--dry-run", "--stage", "test", "--only"], { from: "user" });
85
+ expect(processExit).not.toHaveBeenCalled();
86
+ const logs = consoleLog.mock.calls.map((c) => c.join(" ")).join("\n");
87
+ expect(logs).toContain("only: true");
88
+ expect(logs).toContain("test");
89
+ });
90
+ });
91
+ //# sourceMappingURL=cli-integration.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-integration.test.js","sourceRoot":"","sources":["../../src/__tests__/cli-integration.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=config.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/config.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,92 @@
1
+ import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
2
+ // Mock @urateam/core before any imports that might resolve it
3
+ vi.mock("@urateam/core", () => ({
4
+ validatePipelineConfigs: vi.fn((configs) => configs),
5
+ validateRepoConfigs: vi.fn((configs) => configs),
6
+ defaultConfigs: {
7
+ default: {
8
+ name: "default",
9
+ stages: ["triage", "implement", "test", "review"],
10
+ },
11
+ },
12
+ }));
13
+ import { configCommand } from "../commands/config.js";
14
+ describe("lag config validate", () => {
15
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
16
+ let exitSpy;
17
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
18
+ let logSpy;
19
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
20
+ let errorSpy;
21
+ beforeEach(() => {
22
+ exitSpy = vi.spyOn(process, "exit").mockImplementation((() => { }));
23
+ logSpy = vi.spyOn(console, "log").mockImplementation(() => { });
24
+ errorSpy = vi.spyOn(console, "error").mockImplementation(() => { });
25
+ });
26
+ afterEach(() => {
27
+ vi.restoreAllMocks();
28
+ });
29
+ it("reports default pipeline config when no custom config file exists", async () => {
30
+ await configCommand.parseAsync([
31
+ "node",
32
+ "ura",
33
+ "validate",
34
+ "--pipeline",
35
+ "./nonexistent-pipeline.config.ts",
36
+ "--repos",
37
+ "./nonexistent-repos.config.ts",
38
+ ]);
39
+ expect(logSpy).toHaveBeenCalledWith(expect.stringContaining("Validating configurations"));
40
+ expect(logSpy).toHaveBeenCalledWith(expect.stringContaining("No custom pipeline config found"));
41
+ expect(logSpy).toHaveBeenCalledWith(expect.stringContaining("Configuration is valid"));
42
+ expect(exitSpy).not.toHaveBeenCalled();
43
+ });
44
+ it("reports that no repo config was found when file is missing", async () => {
45
+ await configCommand.parseAsync([
46
+ "node",
47
+ "ura",
48
+ "validate",
49
+ "--pipeline",
50
+ "./nonexistent-pipeline.config.ts",
51
+ "--repos",
52
+ "./nonexistent-repos.config.ts",
53
+ ]);
54
+ expect(logSpy).toHaveBeenCalledWith(expect.stringContaining("No repo config found"));
55
+ expect(exitSpy).not.toHaveBeenCalled();
56
+ });
57
+ it("lists default pipeline names after loading defaults", async () => {
58
+ await configCommand.parseAsync([
59
+ "node",
60
+ "ura",
61
+ "validate",
62
+ "--pipeline",
63
+ "./nonexistent-pipeline.config.ts",
64
+ ]);
65
+ // Should list the pipeline keys from defaultConfigs
66
+ const pipelineLogCall = logSpy.mock.calls.find((args) => String(args[0]).includes("Pipelines:"));
67
+ expect(pipelineLogCall).toBeDefined();
68
+ expect(String(pipelineLogCall[0])).toContain("default");
69
+ });
70
+ it("exits with code 1 for unknown actions", async () => {
71
+ await configCommand.parseAsync([
72
+ "node",
73
+ "ura",
74
+ "unknown-action",
75
+ "--pipeline",
76
+ "./nonexistent-pipeline.config.ts",
77
+ ]);
78
+ expect(errorSpy).toHaveBeenCalledWith(expect.stringContaining("Unknown action"));
79
+ expect(exitSpy).toHaveBeenCalledWith(1);
80
+ });
81
+ it("defaults to validate action when no action argument is given", async () => {
82
+ await configCommand.parseAsync([
83
+ "node",
84
+ "ura",
85
+ "--pipeline",
86
+ "./nonexistent-pipeline.config.ts",
87
+ ]);
88
+ expect(logSpy).toHaveBeenCalledWith(expect.stringContaining("Validating configurations"));
89
+ expect(exitSpy).not.toHaveBeenCalled();
90
+ });
91
+ });
92
+ //# sourceMappingURL=config.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.test.js","sourceRoot":"","sources":["../../src/__tests__/config.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=run.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/run.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,297 @@
1
+ import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
2
+ import { writeFile, mkdir, rm } from "node:fs/promises";
3
+ import { join } from "node:path";
4
+ import { tmpdir } from "node:os";
5
+ import { filterPipelineToStage, resolveRepoConfig, createConsoleNotifier, } from "../commands/run.js";
6
+ // ---------------------------------------------------------------------------
7
+ // Fixtures
8
+ // ---------------------------------------------------------------------------
9
+ const bugPipeline = {
10
+ name: "Bug Fix",
11
+ stages: ["reproduce", "implement", "test", "review"],
12
+ retry: { maxAttempts: 2, strategy: "fix-and-retry" },
13
+ review: { requiredApprovals: 1 },
14
+ prStrategy: "draft",
15
+ };
16
+ const featurePipeline = {
17
+ name: "Feature",
18
+ stages: ["implement", "test", "review"],
19
+ retry: { maxAttempts: 1, strategy: "escalate" },
20
+ review: { requiredApprovals: 1 },
21
+ prStrategy: "draft",
22
+ };
23
+ const repoConfig = {
24
+ url: "https://github.com/org/my-app",
25
+ defaultBranch: "main",
26
+ testCommand: "pnpm test",
27
+ buildCommand: "pnpm build",
28
+ };
29
+ // ---------------------------------------------------------------------------
30
+ // filterPipelineToStage
31
+ // ---------------------------------------------------------------------------
32
+ describe("filterPipelineToStage", () => {
33
+ it("returns a config with stages limited to the specified stage", () => {
34
+ const filtered = filterPipelineToStage(bugPipeline, "implement");
35
+ expect(filtered.stages).toEqual(["implement"]);
36
+ });
37
+ it("preserves all other pipeline properties", () => {
38
+ const filtered = filterPipelineToStage(bugPipeline, "test");
39
+ expect(filtered.name).toBe(bugPipeline.name);
40
+ expect(filtered.retry).toEqual(bugPipeline.retry);
41
+ expect(filtered.review).toEqual(bugPipeline.review);
42
+ expect(filtered.prStrategy).toBe(bugPipeline.prStrategy);
43
+ });
44
+ it("does not mutate the original config", () => {
45
+ filterPipelineToStage(bugPipeline, "review");
46
+ expect(bugPipeline.stages).toHaveLength(4);
47
+ });
48
+ it("throws when the stage is not in the pipeline", () => {
49
+ expect(() => filterPipelineToStage(featurePipeline, "reproduce")).toThrow(/stage "reproduce" is not in pipeline/i);
50
+ });
51
+ it("includes the stage name and available stages in the error", () => {
52
+ expect(() => filterPipelineToStage(bugPipeline, "triage")).toThrow(/triage/);
53
+ });
54
+ it("works for all stages in a pipeline", () => {
55
+ for (const stage of bugPipeline.stages) {
56
+ const filtered = filterPipelineToStage(bugPipeline, stage);
57
+ expect(filtered.stages).toEqual([stage]);
58
+ }
59
+ });
60
+ });
61
+ // ---------------------------------------------------------------------------
62
+ // resolveRepoConfig
63
+ // ---------------------------------------------------------------------------
64
+ describe("resolveRepoConfig", () => {
65
+ const repoConfigs = {
66
+ "team-123": repoConfig,
67
+ "team-456": {
68
+ ...repoConfig,
69
+ url: "https://github.com/org/other-app",
70
+ },
71
+ };
72
+ it("returns the config matching the teamId", () => {
73
+ const result = resolveRepoConfig(repoConfigs, "team-123");
74
+ expect(result?.url).toBe("https://github.com/org/my-app");
75
+ });
76
+ it("returns the config for a different teamId", () => {
77
+ const result = resolveRepoConfig(repoConfigs, "team-456");
78
+ expect(result?.url).toBe("https://github.com/org/other-app");
79
+ });
80
+ it("falls back to the first config when teamId is not found", () => {
81
+ const result = resolveRepoConfig(repoConfigs, "team-unknown");
82
+ expect(result).not.toBeNull();
83
+ // Should return one of the two configs (the first key)
84
+ expect(["https://github.com/org/my-app", "https://github.com/org/other-app"]).toContain(result?.url);
85
+ });
86
+ it("returns null when repoConfigs is empty", () => {
87
+ const result = resolveRepoConfig({}, "team-123");
88
+ expect(result).toBeNull();
89
+ });
90
+ it("returns the only config regardless of teamId", () => {
91
+ const single = { "team-abc": repoConfig };
92
+ const result = resolveRepoConfig(single, "team-xyz");
93
+ expect(result?.url).toBe(repoConfig.url);
94
+ });
95
+ });
96
+ // ---------------------------------------------------------------------------
97
+ // createConsoleNotifier
98
+ // ---------------------------------------------------------------------------
99
+ describe("createConsoleNotifier", () => {
100
+ let consoleLog;
101
+ let consoleError;
102
+ beforeEach(() => {
103
+ consoleLog = vi.spyOn(console, "log").mockImplementation(() => { });
104
+ consoleError = vi.spyOn(console, "error").mockImplementation(() => { });
105
+ });
106
+ afterEach(() => {
107
+ consoleLog.mockRestore();
108
+ consoleError.mockRestore();
109
+ });
110
+ const fakeRun = {
111
+ id: "abc12345xyz",
112
+ issueId: "LIN-42",
113
+ branch: "agent/LIN-42-fix",
114
+ pipelineKey: "bug",
115
+ repoUrl: "https://github.com/org/app",
116
+ status: "running",
117
+ };
118
+ it("logs on pipeline start", async () => {
119
+ const notifier = createConsoleNotifier();
120
+ await notifier.onPipelineStart(fakeRun);
121
+ expect(consoleLog).toHaveBeenCalledWith(expect.stringContaining("Pipeline started"));
122
+ });
123
+ it("logs stage completion with ✅ on success", async () => {
124
+ const notifier = createConsoleNotifier();
125
+ await notifier.onStageComplete(fakeRun, "implement", {
126
+ status: "completed",
127
+ inputTokens: 100,
128
+ outputTokens: 200,
129
+ turns: 1,
130
+ });
131
+ expect(consoleLog).toHaveBeenCalledWith(expect.stringContaining("✅"));
132
+ });
133
+ it("logs stage completion with ❌ on failure", async () => {
134
+ const notifier = createConsoleNotifier();
135
+ await notifier.onStageComplete(fakeRun, "test", {
136
+ status: "failed",
137
+ inputTokens: 50,
138
+ outputTokens: 75,
139
+ turns: 1,
140
+ });
141
+ expect(consoleLog).toHaveBeenCalledWith(expect.stringContaining("❌"));
142
+ });
143
+ it("logs pipeline complete with PR URL when present", async () => {
144
+ const notifier = createConsoleNotifier();
145
+ await notifier.onPipelineComplete(fakeRun, {
146
+ prUrl: "https://github.com/org/app/pull/42",
147
+ stagesCompleted: 3,
148
+ totalInputTokens: 1000,
149
+ totalOutputTokens: 2000,
150
+ });
151
+ expect(consoleLog).toHaveBeenCalledWith(expect.stringContaining("complete"));
152
+ expect(consoleLog).toHaveBeenCalledWith(expect.stringContaining("https://github.com/org/app/pull/42"));
153
+ });
154
+ it("logs pipeline failure with stage and message", async () => {
155
+ const notifier = createConsoleNotifier();
156
+ await notifier.onPipelineFailed(fakeRun, {
157
+ stage: "implement",
158
+ message: "out of retries",
159
+ retriesExhausted: true,
160
+ });
161
+ expect(consoleError).toHaveBeenCalledWith(expect.stringContaining("failed"));
162
+ });
163
+ it("logs human review needed with PR URL", async () => {
164
+ const notifier = createConsoleNotifier();
165
+ await notifier.onHumanReviewNeeded(fakeRun, "https://github.com/org/app/pull/99", "blocking findings");
166
+ expect(consoleLog).toHaveBeenCalledWith(expect.stringContaining("Human review needed"));
167
+ expect(consoleLog).toHaveBeenCalledWith(expect.stringContaining("https://github.com/org/app/pull/99"));
168
+ });
169
+ });
170
+ // ---------------------------------------------------------------------------
171
+ // Integration wiring: run command action (mocked Linear client + executor)
172
+ // ---------------------------------------------------------------------------
173
+ describe("run command — auth error", () => {
174
+ let origEnv;
175
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
176
+ let processExit;
177
+ let consoleError;
178
+ beforeEach(() => {
179
+ origEnv = process.env.LINEAR_API_KEY;
180
+ delete process.env.LINEAR_API_KEY;
181
+ processExit = vi
182
+ .spyOn(process, "exit")
183
+ .mockImplementation((_code) => {
184
+ throw new Error(`process.exit(${_code})`);
185
+ });
186
+ consoleError = vi.spyOn(console, "error").mockImplementation(() => { });
187
+ });
188
+ afterEach(() => {
189
+ if (origEnv !== undefined) {
190
+ process.env.LINEAR_API_KEY = origEnv;
191
+ }
192
+ else {
193
+ delete process.env.LINEAR_API_KEY;
194
+ }
195
+ processExit.mockRestore();
196
+ consoleError.mockRestore();
197
+ });
198
+ it("surfaces a clear actionable message when LINEAR_API_KEY is missing", async () => {
199
+ const { runCommand } = await import("../commands/run.js");
200
+ // Parse with the --issue flag (required) and trigger the action
201
+ await expect(runCommand.parseAsync(["--issue", "LIN-1"], { from: "user" })).rejects.toThrow("process.exit(1)");
202
+ // Check that a helpful message was printed
203
+ const errorMessages = consoleError.mock.calls.map((c) => c.join(" "));
204
+ expect(errorMessages.some((m) => m.includes("LINEAR_API_KEY"))).toBe(true);
205
+ });
206
+ });
207
+ // ---------------------------------------------------------------------------
208
+ // Dry-run wiring: resolves pipeline from mocked configs + mock Linear issue
209
+ // ---------------------------------------------------------------------------
210
+ describe("run command — dry run wiring", () => {
211
+ let origKey;
212
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
213
+ let processExit;
214
+ let consoleLog;
215
+ let consoleError;
216
+ let tmpDir;
217
+ beforeEach(async () => {
218
+ origKey = process.env.LINEAR_API_KEY;
219
+ process.env.LINEAR_API_KEY = "lin_api_test_key";
220
+ // Create a temporary directory for config files
221
+ tmpDir = join(tmpdir(), `lag-test-${Math.random().toString(36).slice(2)}`);
222
+ await mkdir(tmpDir, { recursive: true });
223
+ processExit = vi
224
+ .spyOn(process, "exit")
225
+ .mockImplementation((_code) => {
226
+ throw new Error(`process.exit(${_code})`);
227
+ });
228
+ consoleLog = vi.spyOn(console, "log").mockImplementation(() => { });
229
+ consoleError = vi.spyOn(console, "error").mockImplementation(() => { });
230
+ });
231
+ afterEach(async () => {
232
+ if (origKey !== undefined) {
233
+ process.env.LINEAR_API_KEY = origKey;
234
+ }
235
+ else {
236
+ delete process.env.LINEAR_API_KEY;
237
+ }
238
+ processExit.mockRestore();
239
+ consoleLog.mockRestore();
240
+ consoleError.mockRestore();
241
+ await rm(tmpDir, { recursive: true, force: true });
242
+ vi.resetModules();
243
+ });
244
+ it("prints dry-run plan when Linear issue resolves to a known pipeline", async () => {
245
+ // Write minimal config files
246
+ await writeFile(join(tmpDir, "pipeline.config.mjs"), `export const pipelines = {
247
+ "auto-implement": {
248
+ name: "Auto Implement",
249
+ stages: ["implement", "test", "review"],
250
+ retry: { maxAttempts: 2, strategy: "fix-and-retry" },
251
+ review: { requiredApprovals: 1 },
252
+ prStrategy: "draft",
253
+ },
254
+ };`);
255
+ await writeFile(join(tmpDir, "repos.config.mjs"), `export const repos = {
256
+ "team-abc": {
257
+ url: "https://github.com/org/app",
258
+ defaultBranch: "main",
259
+ testCommand: "pnpm test",
260
+ buildCommand: "pnpm build",
261
+ },
262
+ };`);
263
+ // Mock @linear/sdk — use doMock (not hoisted) so it applies after resetModules
264
+ vi.doMock("@linear/sdk", () => ({
265
+ LinearClient: vi.fn().mockImplementation(() => ({
266
+ issue: vi.fn().mockResolvedValue({
267
+ id: "issue-uuid",
268
+ identifier: "LIN-99",
269
+ title: "Test issue",
270
+ description: "A test issue",
271
+ priority: 2,
272
+ team: Promise.resolve({ id: "team-abc" }),
273
+ project: Promise.resolve(null),
274
+ labels: vi.fn().mockResolvedValue({
275
+ nodes: [{ name: "auto-implement" }],
276
+ }),
277
+ }),
278
+ })),
279
+ }));
280
+ const { runCommand } = await import("../commands/run.js");
281
+ await runCommand.parseAsync([
282
+ "--issue",
283
+ "LIN-99",
284
+ "--dry-run",
285
+ "--config",
286
+ join(tmpDir, "pipeline.config.mjs"),
287
+ "--repos",
288
+ join(tmpDir, "repos.config.mjs"),
289
+ ], { from: "user" });
290
+ const logOutput = consoleLog.mock.calls.map((c) => c.join(" ")).join("\n");
291
+ expect(logOutput).toMatch(/Dry Run/i);
292
+ expect(logOutput).toMatch(/LIN-99/);
293
+ expect(logOutput).toMatch(/auto-implement/i);
294
+ expect(logOutput).toMatch(/implement.*test.*review/i);
295
+ }, 15000);
296
+ });
297
+ //# sourceMappingURL=run.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.test.js","sourceRoot":"","sources":["../../src/__tests__/run.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=webhook.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webhook.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/webhook.test.ts"],"names":[],"mappings":""}