@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.
- package/dist/__tests__/bec-183-pre-stream-stall.test.d.ts +2 -0
- package/dist/__tests__/bec-183-pre-stream-stall.test.d.ts.map +1 -0
- package/dist/__tests__/bec-183-pre-stream-stall.test.js +139 -0
- package/dist/__tests__/bec-183-pre-stream-stall.test.js.map +1 -0
- package/dist/__tests__/gh-linear-sync.test.d.ts +2 -0
- package/dist/__tests__/gh-linear-sync.test.d.ts.map +1 -0
- package/dist/__tests__/gh-linear-sync.test.js +325 -0
- package/dist/__tests__/gh-linear-sync.test.js.map +1 -0
- package/dist/__tests__/select-repo-config.test.d.ts +2 -0
- package/dist/__tests__/select-repo-config.test.d.ts.map +1 -0
- package/dist/__tests__/select-repo-config.test.js +132 -0
- package/dist/__tests__/select-repo-config.test.js.map +1 -0
- package/dist/__tests__/start-todo.test.js +124 -0
- package/dist/__tests__/start-todo.test.js.map +1 -1
- package/dist/executor/agent-stream.d.ts +29 -4
- package/dist/executor/agent-stream.d.ts.map +1 -1
- package/dist/executor/agent-stream.js +65 -17
- package/dist/executor/agent-stream.js.map +1 -1
- package/dist/executor/executor.d.ts.map +1 -1
- package/dist/executor/executor.js +71 -15
- package/dist/executor/executor.js.map +1 -1
- package/dist/executor/index.d.ts +1 -1
- package/dist/executor/index.d.ts.map +1 -1
- package/dist/executor/index.js +1 -1
- package/dist/executor/index.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/pm/actions/select-repo-config.d.ts +22 -0
- package/dist/pm/actions/select-repo-config.d.ts.map +1 -0
- package/dist/pm/actions/select-repo-config.js +38 -0
- package/dist/pm/actions/select-repo-config.js.map +1 -0
- package/dist/pm/actions/start-todo.d.ts.map +1 -1
- package/dist/pm/actions/start-todo.js +13 -8
- package/dist/pm/actions/start-todo.js.map +1 -1
- package/dist/sync/gh-linear-sync.d.ts +189 -0
- package/dist/sync/gh-linear-sync.d.ts.map +1 -0
- package/dist/sync/gh-linear-sync.js +279 -0
- package/dist/sync/gh-linear-sync.js.map +1 -0
- package/dist/sync/index.d.ts +2 -0
- package/dist/sync/index.d.ts.map +1 -0
- package/dist/sync/index.js +3 -0
- package/dist/sync/index.js.map +1 -0
- package/dist/types.d.ts +1 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +12 -0
- package/dist/types.js.map +1 -1
- package/dist/webhook/handler.d.ts.map +1 -1
- package/dist/webhook/handler.js +4 -2
- package/dist/webhook/handler.js.map +1 -1
- package/package.json +1 -1
|
@@ -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 @@
|
|
|
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 @@
|
|
|
1
|
+
{"version":3,"file":"select-repo-config.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/select-repo-config.test.ts"],"names":[],"mappings":""}
|