@urateam/core 0.1.27 → 0.1.28

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 (52) hide show
  1. package/dist/__tests__/bec-183-pre-stream-stall.test.d.ts +2 -0
  2. package/dist/__tests__/bec-183-pre-stream-stall.test.d.ts.map +1 -0
  3. package/dist/__tests__/bec-183-pre-stream-stall.test.js +139 -0
  4. package/dist/__tests__/bec-183-pre-stream-stall.test.js.map +1 -0
  5. package/dist/__tests__/gh-linear-sync.test.d.ts +2 -0
  6. package/dist/__tests__/gh-linear-sync.test.d.ts.map +1 -0
  7. package/dist/__tests__/gh-linear-sync.test.js +325 -0
  8. package/dist/__tests__/gh-linear-sync.test.js.map +1 -0
  9. package/dist/__tests__/select-repo-config.test.d.ts +2 -0
  10. package/dist/__tests__/select-repo-config.test.d.ts.map +1 -0
  11. package/dist/__tests__/select-repo-config.test.js +132 -0
  12. package/dist/__tests__/select-repo-config.test.js.map +1 -0
  13. package/dist/__tests__/start-todo.test.js +124 -0
  14. package/dist/__tests__/start-todo.test.js.map +1 -1
  15. package/dist/executor/agent-stream.d.ts +29 -4
  16. package/dist/executor/agent-stream.d.ts.map +1 -1
  17. package/dist/executor/agent-stream.js +65 -17
  18. package/dist/executor/agent-stream.js.map +1 -1
  19. package/dist/executor/executor.d.ts.map +1 -1
  20. package/dist/executor/executor.js +71 -15
  21. package/dist/executor/executor.js.map +1 -1
  22. package/dist/executor/index.d.ts +1 -1
  23. package/dist/executor/index.d.ts.map +1 -1
  24. package/dist/executor/index.js +1 -1
  25. package/dist/executor/index.js.map +1 -1
  26. package/dist/index.d.ts +1 -0
  27. package/dist/index.d.ts.map +1 -1
  28. package/dist/index.js +1 -0
  29. package/dist/index.js.map +1 -1
  30. package/dist/pm/actions/select-repo-config.d.ts +22 -0
  31. package/dist/pm/actions/select-repo-config.d.ts.map +1 -0
  32. package/dist/pm/actions/select-repo-config.js +38 -0
  33. package/dist/pm/actions/select-repo-config.js.map +1 -0
  34. package/dist/pm/actions/start-todo.d.ts.map +1 -1
  35. package/dist/pm/actions/start-todo.js +13 -8
  36. package/dist/pm/actions/start-todo.js.map +1 -1
  37. package/dist/sync/gh-linear-sync.d.ts +189 -0
  38. package/dist/sync/gh-linear-sync.d.ts.map +1 -0
  39. package/dist/sync/gh-linear-sync.js +279 -0
  40. package/dist/sync/gh-linear-sync.js.map +1 -0
  41. package/dist/sync/index.d.ts +2 -0
  42. package/dist/sync/index.d.ts.map +1 -0
  43. package/dist/sync/index.js +3 -0
  44. package/dist/sync/index.js.map +1 -0
  45. package/dist/types.d.ts +1 -0
  46. package/dist/types.d.ts.map +1 -1
  47. package/dist/types.js +12 -0
  48. package/dist/types.js.map +1 -1
  49. package/dist/webhook/handler.d.ts.map +1 -1
  50. package/dist/webhook/handler.js +4 -2
  51. package/dist/webhook/handler.js.map +1 -1
  52. package/package.json +1 -1
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=bec-183-pre-stream-stall.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bec-183-pre-stream-stall.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/bec-183-pre-stream-stall.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,139 @@
1
+ /**
2
+ * BEC-183: pre-stream stall — verify the fix.
3
+ *
4
+ * Tests verify:
5
+ * 1. StagePreStreamStalledError is exported from agent-stream.ts
6
+ * 2. consumeAgentStream throws it when no message arrives within firstMessageTimeoutMs
7
+ * 3. Mid-stream stall (after ≥1 message) still throws StageStalledError (regression guard)
8
+ * 4. executor.ts source contains wall-clock stage timeout (WALL_CLOCK_STAGE_TIMEOUT_MS)
9
+ * and passes firstMessageTimeoutMs to consumeAgentStream
10
+ *
11
+ * Run with:
12
+ * cd packages/core && npx vitest run src/__tests__/bec-183-pre-stream-stall.test.ts
13
+ */
14
+ import { describe, it, expect } from "vitest";
15
+ import * as agentStreamModule from "../executor/agent-stream.js";
16
+ import { consumeAgentStream, StageStalledError, StagePreStreamStalledError, } from "../executor/agent-stream.js";
17
+ // ---------------------------------------------------------------------------
18
+ // Helpers
19
+ // ---------------------------------------------------------------------------
20
+ /** Simulates the SDK's query() returning an iterator that hangs before the
21
+ * very first message — e.g., blocked inside an auth-retry loop. */
22
+ async function* neverYields() {
23
+ // The generator is entered but immediately suspends forever, producing
24
+ // zero messages. This is the trigger scenario from the BEC-183 dogfood log.
25
+ await new Promise(() => { });
26
+ }
27
+ /** Yields one real assistant message, then hangs — the existing mid-stream
28
+ * stall pattern already covered by StageStalledError. */
29
+ async function* hangsAfterOne() {
30
+ yield {
31
+ type: "assistant",
32
+ usage: { output_tokens: 10 },
33
+ content: [{ type: "text", text: "one message then hang" }],
34
+ };
35
+ await new Promise(() => { });
36
+ }
37
+ // ---------------------------------------------------------------------------
38
+ // Fix 1 — StagePreStreamStalledError class is exported
39
+ // ---------------------------------------------------------------------------
40
+ describe("BEC-183 fix 1 — StagePreStreamStalledError class is exported", () => {
41
+ it("StagePreStreamStalledError is exported from agent-stream.ts", () => {
42
+ const cls = agentStreamModule["StagePreStreamStalledError"];
43
+ expect(cls).toBeDefined();
44
+ expect(typeof cls).toBe("function");
45
+ });
46
+ it("StagePreStreamStalledError is a distinct class from StageStalledError", () => {
47
+ const preStream = new StagePreStreamStalledError(5000);
48
+ expect(preStream).toBeInstanceOf(StagePreStreamStalledError);
49
+ expect(preStream).not.toBeInstanceOf(StageStalledError);
50
+ expect(preStream.name).toBe("StagePreStreamStalledError");
51
+ expect(preStream.timeoutMs).toBe(5000);
52
+ expect(preStream.message).toContain("pre-stream stall");
53
+ expect(preStream.message).toContain("5s");
54
+ });
55
+ });
56
+ // ---------------------------------------------------------------------------
57
+ // Fix 2 — consumeAgentStream throws StagePreStreamStalledError when iterator
58
+ // never yields its first message within firstMessageTimeoutMs
59
+ // ---------------------------------------------------------------------------
60
+ describe("BEC-183 fix 2 — firstMessageTimeoutMs fires StagePreStreamStalledError", () => {
61
+ it("neverYields iterator throws StagePreStreamStalledError after firstMessageTimeoutMs (not StageStalledError)", async () => {
62
+ const err = await consumeAgentStream(neverYields(), {
63
+ firstMessageTimeoutMs: 150, // short for test speed
64
+ progressTimeoutMs: 5_000, // large; must not fire first
65
+ }).catch((e) => e);
66
+ // Must be StagePreStreamStalledError, not the mid-stream StageStalledError
67
+ expect(err).toBeInstanceOf(StagePreStreamStalledError);
68
+ expect(err).not.toBeInstanceOf(StageStalledError);
69
+ const preStream = err;
70
+ expect(preStream.timeoutMs).toBe(150);
71
+ }, 3_000);
72
+ it("when firstMessageTimeoutMs fires first, StagePreStreamStalledError is thrown; StageStalledError fires only after first message arrives", async () => {
73
+ // firstMessageTimeoutMs (100ms) fires before progressTimeoutMs (1000ms)
74
+ // and no first message has arrived → StagePreStreamStalledError
75
+ const errPreStream = await consumeAgentStream(neverYields(), {
76
+ firstMessageTimeoutMs: 100,
77
+ progressTimeoutMs: 1_000,
78
+ }).catch((e) => e);
79
+ expect(errPreStream).toBeInstanceOf(StagePreStreamStalledError);
80
+ // A first message arrives immediately; then hangs.
81
+ // firstMessageTimeoutMs (1000ms) does NOT fire because firstMessageReceived=true.
82
+ // progressTimeoutMs (100ms) fires after mid-stream silence → StageStalledError.
83
+ const errStalled = await consumeAgentStream(hangsAfterOne(), {
84
+ firstMessageTimeoutMs: 1_000,
85
+ progressTimeoutMs: 100,
86
+ }).catch((e) => e);
87
+ expect(errStalled).toBeInstanceOf(StageStalledError);
88
+ }, 5_000);
89
+ });
90
+ // ---------------------------------------------------------------------------
91
+ // Fix 3 — mid-stream stall still throws StageStalledError (regression guard)
92
+ // ---------------------------------------------------------------------------
93
+ describe("BEC-183 fix 3 — mid-stream stall regression guard", () => {
94
+ it("iterator that yields once then hangs throws StageStalledError, not StagePreStreamStalledError", async () => {
95
+ const err = await consumeAgentStream(hangsAfterOne(), {
96
+ firstMessageTimeoutMs: 5_000, // large; must not fire (first message arrives quickly)
97
+ progressTimeoutMs: 150, // short; fires after mid-stream hang
98
+ }).catch((e) => e);
99
+ expect(err).toBeInstanceOf(StageStalledError);
100
+ expect(err).not.toBeInstanceOf(StagePreStreamStalledError);
101
+ }, 3_000);
102
+ });
103
+ // ---------------------------------------------------------------------------
104
+ // Fix 4 — executor.ts has wall-clock stage timeout
105
+ // (static analysis check — we inspect the source text)
106
+ // ---------------------------------------------------------------------------
107
+ describe("BEC-183 fix 4 — executor.ts wall-clock stage timeout", () => {
108
+ it("executeStage source contains WALL_CLOCK_STAGE_TIMEOUT_MS constant", async () => {
109
+ const fs = await import("node:fs");
110
+ const path = await import("node:path");
111
+ const url = await import("node:url");
112
+ const __dirname = path.dirname(url.fileURLToPath(import.meta.url));
113
+ const executorSrc = fs.readFileSync(path.resolve(__dirname, "../executor/executor.ts"), "utf8");
114
+ expect(executorSrc).toContain("WALL_CLOCK_STAGE_TIMEOUT_MS");
115
+ expect(executorSrc).toContain("stageTimeoutMs");
116
+ });
117
+ it("consumeAgentStream call in executor.ts passes firstMessageTimeoutMs", async () => {
118
+ const fs = await import("node:fs");
119
+ const path = await import("node:path");
120
+ const url = await import("node:url");
121
+ const __dirname = path.dirname(url.fileURLToPath(import.meta.url));
122
+ const executorSrc = fs.readFileSync(path.resolve(__dirname, "../executor/executor.ts"), "utf8");
123
+ expect(executorSrc).toContain("firstMessageTimeoutMs");
124
+ });
125
+ it("executor.ts default stage timeout is 30 min and implement is 60 min", async () => {
126
+ const fs = await import("node:fs");
127
+ const path = await import("node:path");
128
+ const url = await import("node:url");
129
+ const __dirname = path.dirname(url.fileURLToPath(import.meta.url));
130
+ const executorSrc = fs.readFileSync(path.resolve(__dirname, "../executor/executor.ts"), "utf8");
131
+ // 60 min for implement
132
+ expect(executorSrc).toContain("60 * 60_000");
133
+ // 30 min default
134
+ expect(executorSrc).toContain("30 * 60_000");
135
+ // implement key explicitly named
136
+ expect(executorSrc).toContain("implement");
137
+ });
138
+ });
139
+ //# sourceMappingURL=bec-183-pre-stream-stall.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bec-183-pre-stream-stall.test.js","sourceRoot":"","sources":["../../src/__tests__/bec-183-pre-stream-stall.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=gh-linear-sync.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gh-linear-sync.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/gh-linear-sync.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,325 @@
1
+ import { describe, it, expect, vi } from "vitest";
2
+ import { runGhLinearSync, findLinearTicketForGhIssue, createLinearTicketForGhIssue, makeIdempotencyMarker, getErrorMessage, DEFAULT_TRIAGE_STATE_NAME, } from "../sync/gh-linear-sync.js";
3
+ // ---------------------------------------------------------------------------
4
+ // Fixtures
5
+ // ---------------------------------------------------------------------------
6
+ const TEAM_ID = "team-abc";
7
+ const TRIAGE_STATE_ID = "state-triage-id";
8
+ const DONE_STATE_ID = "state-done-id";
9
+ const triageState = {
10
+ id: TRIAGE_STATE_ID,
11
+ name: "Triage",
12
+ type: "triage",
13
+ };
14
+ const doneState = {
15
+ id: DONE_STATE_ID,
16
+ name: "Done",
17
+ type: "completed",
18
+ };
19
+ function makeGhIssue(overrides = {}) {
20
+ const number = overrides.number ?? 42;
21
+ return {
22
+ number,
23
+ title: "Some bug report",
24
+ body: "The app crashes when login.",
25
+ html_url: `https://github.com/owner/repo/issues/${number}`,
26
+ labels: [{ name: "urateam-quality-observer" }],
27
+ state: "open",
28
+ ...overrides,
29
+ };
30
+ }
31
+ function makeLinearIssue(overrides = {}) {
32
+ return {
33
+ id: "linear-issue-1",
34
+ identifier: "BEC-100",
35
+ title: "[GH#42] Some bug report",
36
+ state: { name: "Triage", type: "triage" },
37
+ ...overrides,
38
+ };
39
+ }
40
+ // ---------------------------------------------------------------------------
41
+ // Mock factories
42
+ // ---------------------------------------------------------------------------
43
+ function makeMockGitHub(issues = []) {
44
+ const closeIssue = vi.fn().mockResolvedValue(undefined);
45
+ const client = {
46
+ listIssues: vi.fn().mockResolvedValue(issues),
47
+ closeIssue,
48
+ };
49
+ return { client, closeIssue };
50
+ }
51
+ function makeMockLinear(existingIssues = [], states = [triageState]) {
52
+ const createIssue = vi.fn().mockResolvedValue({
53
+ issue: { id: "new-linear-id", identifier: "BEC-200" },
54
+ });
55
+ const client = {
56
+ issues: vi.fn().mockResolvedValue({ nodes: existingIssues }),
57
+ workflowStates: vi.fn().mockResolvedValue({ nodes: states }),
58
+ createIssue,
59
+ };
60
+ return { client, createIssue };
61
+ }
62
+ const defaultConfig = {
63
+ githubToken: "gh-token",
64
+ githubRepo: "owner/repo",
65
+ linearApiKey: "lin-key",
66
+ linearTeamId: TEAM_ID,
67
+ };
68
+ // ---------------------------------------------------------------------------
69
+ // getErrorMessage
70
+ // ---------------------------------------------------------------------------
71
+ describe("getErrorMessage", () => {
72
+ it("returns the message from an Error instance", () => {
73
+ expect(getErrorMessage(new Error("boom"))).toBe("boom");
74
+ });
75
+ it("stringifies non-Error values", () => {
76
+ expect(getErrorMessage("plain string")).toBe("plain string");
77
+ expect(getErrorMessage(42)).toBe("42");
78
+ expect(getErrorMessage({ toString: () => "custom" })).toBe("custom");
79
+ });
80
+ });
81
+ // ---------------------------------------------------------------------------
82
+ // DEFAULT_TRIAGE_STATE_NAME
83
+ // ---------------------------------------------------------------------------
84
+ describe("DEFAULT_TRIAGE_STATE_NAME", () => {
85
+ it("equals 'Triage'", () => {
86
+ expect(DEFAULT_TRIAGE_STATE_NAME).toBe("Triage");
87
+ });
88
+ });
89
+ // ---------------------------------------------------------------------------
90
+ // makeIdempotencyMarker
91
+ // ---------------------------------------------------------------------------
92
+ describe("makeIdempotencyMarker", () => {
93
+ it("formats correctly", () => {
94
+ expect(makeIdempotencyMarker(42)).toBe("<!-- gh-linear-sync:42 -->");
95
+ expect(makeIdempotencyMarker(1)).toBe("<!-- gh-linear-sync:1 -->");
96
+ });
97
+ });
98
+ // ---------------------------------------------------------------------------
99
+ // findLinearTicketForGhIssue
100
+ // ---------------------------------------------------------------------------
101
+ describe("findLinearTicketForGhIssue", () => {
102
+ it("returns the first matching issue when one exists", async () => {
103
+ const existingIssue = makeLinearIssue();
104
+ const { client } = makeMockLinear([existingIssue]);
105
+ const result = await findLinearTicketForGhIssue(client, 42, TEAM_ID);
106
+ expect(result).toEqual(existingIssue);
107
+ expect(client.issues).toHaveBeenCalledWith({
108
+ filter: {
109
+ team: { id: { eq: TEAM_ID } },
110
+ title: { startsWith: "[GH#42]" },
111
+ },
112
+ first: 1,
113
+ });
114
+ });
115
+ it("returns null when no matching issue exists", async () => {
116
+ const { client } = makeMockLinear([]);
117
+ const result = await findLinearTicketForGhIssue(client, 99, TEAM_ID);
118
+ expect(result).toBeNull();
119
+ });
120
+ });
121
+ // ---------------------------------------------------------------------------
122
+ // createLinearTicketForGhIssue
123
+ // ---------------------------------------------------------------------------
124
+ describe("createLinearTicketForGhIssue", () => {
125
+ it("creates a ticket with correct title, description, and idempotency marker", async () => {
126
+ const ghIssue = makeGhIssue();
127
+ const { client, createIssue } = makeMockLinear();
128
+ const result = await createLinearTicketForGhIssue(client, ghIssue, TEAM_ID, TRIAGE_STATE_ID);
129
+ expect(result).toEqual({ id: "new-linear-id", identifier: "BEC-200" });
130
+ expect(createIssue).toHaveBeenCalledWith({
131
+ teamId: TEAM_ID,
132
+ title: "[GH#42] Some bug report",
133
+ description: expect.stringContaining("<!-- gh-linear-sync:42 -->"),
134
+ stateId: TRIAGE_STATE_ID,
135
+ });
136
+ const call = createIssue.mock.calls[0][0];
137
+ expect(call.description).toContain(ghIssue.body);
138
+ expect(call.description).toContain(ghIssue.html_url);
139
+ expect(call.description).toContain("[GitHub Issue #42]");
140
+ });
141
+ it("handles null body gracefully", async () => {
142
+ const ghIssue = makeGhIssue({ body: null });
143
+ const { client, createIssue } = makeMockLinear();
144
+ await createLinearTicketForGhIssue(client, ghIssue, TEAM_ID, TRIAGE_STATE_ID);
145
+ const call = createIssue.mock.calls[0][0];
146
+ expect(call.description).toContain("<!-- gh-linear-sync:42 -->");
147
+ });
148
+ it("throws when createIssue returns no issue", async () => {
149
+ const ghIssue = makeGhIssue();
150
+ const { client, createIssue } = makeMockLinear();
151
+ createIssue.mockResolvedValue({ issue: null });
152
+ await expect(createLinearTicketForGhIssue(client, ghIssue, TEAM_ID, TRIAGE_STATE_ID)).rejects.toThrow("GH#42");
153
+ });
154
+ });
155
+ // ---------------------------------------------------------------------------
156
+ // runGhLinearSync — round-trip integration path
157
+ // ---------------------------------------------------------------------------
158
+ describe("runGhLinearSync", () => {
159
+ it("creates a Linear ticket for a new GitHub issue (round-trip)", async () => {
160
+ const ghIssue = makeGhIssue({
161
+ number: 10,
162
+ title: "Quality Observer finding",
163
+ labels: [{ name: "urateam-quality-observer" }],
164
+ });
165
+ const { client: ghClient } = makeMockGitHub([ghIssue]);
166
+ const { client: linClient, createIssue } = makeMockLinear([], [triageState]);
167
+ const result = await runGhLinearSync(defaultConfig, {
168
+ github: ghClient,
169
+ linear: linClient,
170
+ });
171
+ expect(result.processed).toBe(1);
172
+ expect(result.created).toBe(1);
173
+ expect(result.skipped).toBe(0);
174
+ expect(result.errors).toHaveLength(0);
175
+ expect(createIssue).toHaveBeenCalledOnce();
176
+ const call = createIssue.mock.calls[0][0];
177
+ expect(call.title).toBe("[GH#10] Quality Observer finding");
178
+ expect(call.stateId).toBe(TRIAGE_STATE_ID);
179
+ expect(call.description).toContain("<!-- gh-linear-sync:10 -->");
180
+ expect(call.description).toContain("https://github.com/owner/repo/issues/10");
181
+ });
182
+ it("is idempotent — skips issues that already have a Linear ticket", async () => {
183
+ const ghIssue = makeGhIssue({ number: 42 });
184
+ const existing = makeLinearIssue();
185
+ const { client: ghClient } = makeMockGitHub([ghIssue]);
186
+ const { client: linClient, createIssue } = makeMockLinear([existing]);
187
+ const result1 = await runGhLinearSync(defaultConfig, {
188
+ github: ghClient,
189
+ linear: linClient,
190
+ });
191
+ const result2 = await runGhLinearSync(defaultConfig, {
192
+ github: ghClient,
193
+ linear: linClient,
194
+ });
195
+ // Second run should also skip
196
+ expect(result1.created).toBe(0);
197
+ expect(result1.skipped).toBe(1);
198
+ expect(result2.created).toBe(0);
199
+ expect(result2.skipped).toBe(1);
200
+ // createIssue must NOT be called either time
201
+ expect(createIssue).not.toHaveBeenCalled();
202
+ });
203
+ it("throws when the Triage state is not found", async () => {
204
+ const { client: ghClient } = makeMockGitHub([makeGhIssue()]);
205
+ const { client: linClient } = makeMockLinear([], [doneState]); // no Triage state
206
+ await expect(runGhLinearSync(defaultConfig, { github: ghClient, linear: linClient })).rejects.toThrow(/"Triage" not found/);
207
+ });
208
+ it("throws on invalid githubRepo format (no slash)", async () => {
209
+ const { client: ghClient } = makeMockGitHub([]);
210
+ const { client: linClient } = makeMockLinear([], [triageState]);
211
+ await expect(runGhLinearSync({ ...defaultConfig, githubRepo: "no-slash-here" }, { github: ghClient, linear: linClient })).rejects.toThrow(/Invalid githubRepo format/);
212
+ });
213
+ it("throws on invalid githubRepo format (empty owner)", async () => {
214
+ const { client: ghClient } = makeMockGitHub([]);
215
+ const { client: linClient } = makeMockLinear([], [triageState]);
216
+ await expect(runGhLinearSync({ ...defaultConfig, githubRepo: "/repo" }, { github: ghClient, linear: linClient })).rejects.toThrow(/Invalid githubRepo format/);
217
+ });
218
+ it("respects triageStateName override", async () => {
219
+ const backlogState = {
220
+ id: "state-backlog",
221
+ name: "Backlog",
222
+ type: "backlog",
223
+ };
224
+ const { client: ghClient } = makeMockGitHub([makeGhIssue()]);
225
+ const { client: linClient, createIssue } = makeMockLinear([], [backlogState]);
226
+ const result = await runGhLinearSync({ ...defaultConfig, triageStateName: "Backlog" }, { github: ghClient, linear: linClient });
227
+ expect(result.created).toBe(1);
228
+ expect(createIssue.mock.calls[0][0].stateId).toBe("state-backlog");
229
+ });
230
+ it("dry-run mode increments created count without calling createIssue", async () => {
231
+ const { client: ghClient } = makeMockGitHub([makeGhIssue()]);
232
+ const { client: linClient, createIssue } = makeMockLinear([], [triageState]);
233
+ const result = await runGhLinearSync({ ...defaultConfig, dryRun: true }, { github: ghClient, linear: linClient });
234
+ expect(result.created).toBe(1);
235
+ expect(createIssue).not.toHaveBeenCalled();
236
+ });
237
+ it("bidirectional close: closes GH issue when Linear ticket is Done", async () => {
238
+ const ghIssue = makeGhIssue({ number: 42, state: "open" });
239
+ const doneTicket = makeLinearIssue({
240
+ state: { name: "Done", type: "completed" },
241
+ });
242
+ const { client: ghClient, closeIssue } = makeMockGitHub([ghIssue]);
243
+ const { client: linClient } = makeMockLinear([doneTicket], [triageState, doneState]);
244
+ const result = await runGhLinearSync({ ...defaultConfig, bidirectionalClose: true }, { github: ghClient, linear: linClient });
245
+ expect(result.closed).toBe(1);
246
+ expect(closeIssue).toHaveBeenCalledWith({
247
+ owner: "owner",
248
+ repo: "repo",
249
+ issue_number: 42,
250
+ });
251
+ });
252
+ it("bidirectional close: does NOT close GH issue when Linear ticket is in progress", async () => {
253
+ const ghIssue = makeGhIssue({ number: 42, state: "open" });
254
+ const inProgressTicket = makeLinearIssue({
255
+ state: { name: "In Progress", type: "started" },
256
+ });
257
+ const { client: ghClient, closeIssue } = makeMockGitHub([ghIssue]);
258
+ const { client: linClient } = makeMockLinear([inProgressTicket], [triageState]);
259
+ const result = await runGhLinearSync({ ...defaultConfig, bidirectionalClose: true }, { github: ghClient, linear: linClient });
260
+ expect(result.closed).toBe(0);
261
+ expect(closeIssue).not.toHaveBeenCalled();
262
+ });
263
+ it("dry-run + bidirectionalClose: increments closed count without calling closeIssue", async () => {
264
+ const ghIssue = makeGhIssue({ number: 42, state: "open" });
265
+ const doneTicket = makeLinearIssue({
266
+ state: { name: "Done", type: "completed" },
267
+ });
268
+ const { client: ghClient, closeIssue } = makeMockGitHub([ghIssue]);
269
+ const { client: linClient } = makeMockLinear([doneTicket], [triageState, doneState]);
270
+ const result = await runGhLinearSync({ ...defaultConfig, bidirectionalClose: true, dryRun: true }, { github: ghClient, linear: linClient });
271
+ expect(result.closed).toBe(1);
272
+ expect(closeIssue).not.toHaveBeenCalled();
273
+ });
274
+ it("collects per-issue errors without aborting the whole sync", async () => {
275
+ const issues = [makeGhIssue({ number: 1 }), makeGhIssue({ number: 2 })];
276
+ const { client: ghClient } = makeMockGitHub(issues);
277
+ const { client: linClient, createIssue } = makeMockLinear([], [triageState]);
278
+ // First call succeeds, second throws
279
+ createIssue
280
+ .mockResolvedValueOnce({ issue: { id: "ok", identifier: "BEC-1" } })
281
+ .mockRejectedValueOnce(new Error("API rate limit"));
282
+ const result = await runGhLinearSync(defaultConfig, {
283
+ github: ghClient,
284
+ linear: linClient,
285
+ });
286
+ expect(result.processed).toBe(2);
287
+ expect(result.created).toBe(1);
288
+ expect(result.errors).toHaveLength(1);
289
+ expect(result.errors[0]).toContain("GH#2");
290
+ expect(result.errors[0]).toContain("API rate limit");
291
+ });
292
+ it("passes label filters to GitHub listIssues", async () => {
293
+ const { client: ghClient } = makeMockGitHub([]);
294
+ const { client: linClient } = makeMockLinear([], [triageState]);
295
+ await runGhLinearSync({ ...defaultConfig, labelFilters: ["urateam-quality-observer", "bug"] }, { github: ghClient, linear: linClient });
296
+ expect(ghClient.listIssues).toHaveBeenCalledWith(expect.objectContaining({ labels: "urateam-quality-observer,bug" }));
297
+ });
298
+ it("processes multiple issues correctly", async () => {
299
+ const issues = [
300
+ makeGhIssue({ number: 10, title: "First issue" }),
301
+ makeGhIssue({ number: 11, title: "Second issue" }),
302
+ makeGhIssue({ number: 12, title: "Third issue (already synced)" }),
303
+ ];
304
+ const existingForIssue12 = makeLinearIssue({
305
+ identifier: "BEC-50",
306
+ title: "[GH#12] Third issue (already synced)",
307
+ });
308
+ const { client: ghClient } = makeMockGitHub(issues);
309
+ const { client: linClient, createIssue } = makeMockLinear([], [triageState]);
310
+ // Issues 10 and 11 have no match; issue 12 already exists.
311
+ linClient.issues
312
+ .mockResolvedValueOnce({ nodes: [] }) // GH#10
313
+ .mockResolvedValueOnce({ nodes: [] }) // GH#11
314
+ .mockResolvedValueOnce({ nodes: [existingForIssue12] }); // GH#12
315
+ const result = await runGhLinearSync(defaultConfig, {
316
+ github: ghClient,
317
+ linear: linClient,
318
+ });
319
+ expect(result.processed).toBe(3);
320
+ expect(result.created).toBe(2);
321
+ expect(result.skipped).toBe(1);
322
+ expect(createIssue).toHaveBeenCalledTimes(2);
323
+ });
324
+ });
325
+ //# sourceMappingURL=gh-linear-sync.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gh-linear-sync.test.js","sourceRoot":"","sources":["../../src/__tests__/gh-linear-sync.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=select-repo-config.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"select-repo-config.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/select-repo-config.test.ts"],"names":[],"mappings":""}