forge-cc 0.1.40 → 1.0.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.
- package/README.md +454 -338
- package/dist/cli.js +194 -906
- package/dist/cli.js.map +1 -1
- package/dist/config/loader.d.ts +1 -1
- package/dist/config/loader.js +49 -56
- package/dist/config/loader.js.map +1 -1
- package/dist/config/schema.d.ts +37 -125
- package/dist/config/schema.js +13 -28
- package/dist/config/schema.js.map +1 -1
- package/dist/doctor.d.ts +10 -0
- package/dist/doctor.js +148 -0
- package/dist/doctor.js.map +1 -0
- package/dist/gates/index.d.ts +14 -12
- package/dist/gates/index.js +53 -105
- package/dist/gates/index.js.map +1 -1
- package/dist/gates/lint-gate.d.ts +2 -2
- package/dist/gates/lint-gate.js +60 -66
- package/dist/gates/lint-gate.js.map +1 -1
- package/dist/gates/tests-gate.d.ts +2 -4
- package/dist/gates/tests-gate.js +75 -203
- package/dist/gates/tests-gate.js.map +1 -1
- package/dist/gates/types-gate.d.ts +2 -2
- package/dist/gates/types-gate.js +53 -59
- package/dist/gates/types-gate.js.map +1 -1
- package/dist/go/linear-sync-cli.js +13 -4
- package/dist/go/linear-sync-cli.js.map +1 -1
- package/dist/go/linear-sync.d.ts +1 -0
- package/dist/go/linear-sync.js +67 -4
- package/dist/go/linear-sync.js.map +1 -1
- package/dist/linear/client.d.ts +34 -105
- package/dist/linear/client.js +85 -365
- package/dist/linear/client.js.map +1 -1
- package/dist/linear/issues.d.ts +3 -1
- package/dist/linear/issues.js +14 -2
- package/dist/linear/issues.js.map +1 -1
- package/dist/linear/projects.js +3 -2
- package/dist/linear/projects.js.map +1 -1
- package/dist/linear/sync.d.ts +15 -0
- package/dist/linear/sync.js +102 -0
- package/dist/linear/sync.js.map +1 -0
- package/dist/runner/loop.d.ts +4 -0
- package/dist/runner/loop.js +168 -0
- package/dist/runner/loop.js.map +1 -0
- package/dist/runner/prompt.d.ts +14 -0
- package/dist/runner/prompt.js +59 -0
- package/dist/runner/prompt.js.map +1 -0
- package/dist/runner/update.d.ts +1 -0
- package/dist/runner/update.js +72 -0
- package/dist/runner/update.js.map +1 -0
- package/dist/server.d.ts +6 -2
- package/dist/server.js +43 -101
- package/dist/server.js.map +1 -1
- package/dist/setup.d.ts +5 -0
- package/dist/setup.js +208 -0
- package/dist/setup.js.map +1 -0
- package/dist/state/cache.d.ts +3 -0
- package/dist/state/cache.js +23 -0
- package/dist/state/cache.js.map +1 -0
- package/dist/state/status.d.ts +66 -0
- package/dist/state/status.js +96 -0
- package/dist/state/status.js.map +1 -0
- package/dist/types.d.ts +46 -114
- package/dist/worktree/manager.d.ts +6 -103
- package/dist/worktree/manager.js +25 -296
- package/dist/worktree/manager.js.map +1 -1
- package/hooks/pre-commit-verify.js +109 -109
- package/package.json +3 -2
- package/skills/forge-go.md +583 -575
- package/skills/forge-setup.md +149 -388
- package/skills/forge-spec.md +367 -342
- package/skills/forge-triage.md +179 -133
- package/skills/forge-update.md +87 -93
package/dist/linear/client.js
CHANGED
|
@@ -1,388 +1,108 @@
|
|
|
1
|
+
import { LinearClient } from "@linear/sdk";
|
|
1
2
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* and the execution engine for programmatic Linear management.
|
|
3
|
+
* Thin wrapper around @linear/sdk's LinearClient, scoped to a team.
|
|
4
|
+
* All public methods degrade gracefully on API errors (warn, don't crash).
|
|
5
5
|
*/
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
errors;
|
|
16
|
-
constructor(message, statusCode, errors) {
|
|
17
|
-
super(message);
|
|
18
|
-
this.statusCode = statusCode;
|
|
19
|
-
this.errors = errors;
|
|
20
|
-
this.name = "LinearClientError";
|
|
6
|
+
export class ForgeLinearClient {
|
|
7
|
+
client;
|
|
8
|
+
teamId;
|
|
9
|
+
constructor(opts) {
|
|
10
|
+
if (!opts.apiKey) {
|
|
11
|
+
throw new Error("LINEAR_API_KEY is required. Set it as an environment variable or pass it to ForgeLinearClient.");
|
|
12
|
+
}
|
|
13
|
+
this.client = new LinearClient({ apiKey: opts.apiKey });
|
|
14
|
+
this.teamId = opts.teamId;
|
|
21
15
|
}
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
}
|
|
35
|
-
// -------------------------------------------------------------------------
|
|
36
|
-
// Projects
|
|
37
|
-
// -------------------------------------------------------------------------
|
|
38
|
-
async listProjects(opts) {
|
|
39
|
-
const filter = {};
|
|
40
|
-
if (opts?.query) {
|
|
41
|
-
filter.name = { containsIgnoreCase: opts.query };
|
|
42
|
-
}
|
|
43
|
-
if (opts?.state) {
|
|
44
|
-
filter.state = { eq: opts.state };
|
|
45
|
-
}
|
|
46
|
-
const hasFilter = Object.keys(filter).length > 0;
|
|
47
|
-
const filterVar = hasFilter ? ", $filter: ProjectFilter" : "";
|
|
48
|
-
const filterArg = hasFilter ? ", filter: $filter" : "";
|
|
49
|
-
const query = `
|
|
50
|
-
query ListProjects($after: String${filterVar}) {
|
|
51
|
-
projects(first: 50, after: $after${filterArg}) {
|
|
52
|
-
pageInfo { hasNextPage endCursor }
|
|
53
|
-
nodes {
|
|
54
|
-
id name description state url
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
`;
|
|
59
|
-
return this.paginate(query, "projects", {
|
|
60
|
-
...(hasFilter ? { filter } : {}),
|
|
61
|
-
});
|
|
62
|
-
}
|
|
63
|
-
async createProject(input) {
|
|
64
|
-
const mutation = `
|
|
65
|
-
mutation CreateProject($input: ProjectCreateInput!) {
|
|
66
|
-
projectCreate(input: $input) {
|
|
67
|
-
success
|
|
68
|
-
project { id name description state url }
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
`;
|
|
72
|
-
const variables = {
|
|
73
|
-
input: {
|
|
74
|
-
name: input.name,
|
|
75
|
-
...(input.description != null && { description: input.description }),
|
|
76
|
-
teamIds: input.teamIds,
|
|
77
|
-
...(input.state != null && { state: input.state }),
|
|
78
|
-
},
|
|
79
|
-
};
|
|
80
|
-
const data = await this.request(mutation, variables);
|
|
81
|
-
const result = data.projectCreate;
|
|
82
|
-
if (!result?.success) {
|
|
83
|
-
throw new LinearClientError("Failed to create project");
|
|
84
|
-
}
|
|
85
|
-
return result.project;
|
|
86
|
-
}
|
|
87
|
-
async updateProject(id, input) {
|
|
88
|
-
const mutation = `
|
|
89
|
-
mutation UpdateProject($id: String!, $input: ProjectUpdateInput!) {
|
|
90
|
-
projectUpdate(id: $id, input: $input) {
|
|
91
|
-
success
|
|
92
|
-
project { id name description state url }
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
`;
|
|
96
|
-
const data = await this.request(mutation, { id, input });
|
|
97
|
-
const result = data.projectUpdate;
|
|
98
|
-
if (!result?.success) {
|
|
99
|
-
throw new LinearClientError(`Failed to update project ${id}`);
|
|
100
|
-
}
|
|
101
|
-
return result.project;
|
|
102
|
-
}
|
|
103
|
-
// -------------------------------------------------------------------------
|
|
104
|
-
// Milestones (Project Milestones)
|
|
105
|
-
// -------------------------------------------------------------------------
|
|
106
|
-
async listMilestones(projectId) {
|
|
107
|
-
const query = `
|
|
108
|
-
query ListMilestones($projectId: String!, $after: String) {
|
|
109
|
-
project(id: $projectId) {
|
|
110
|
-
projectMilestones(first: 50, after: $after) {
|
|
111
|
-
pageInfo { hasNextPage endCursor }
|
|
112
|
-
nodes {
|
|
113
|
-
id name description progress sortOrder
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
`;
|
|
119
|
-
// Custom pagination because the nodes are nested under project
|
|
120
|
-
const all = [];
|
|
121
|
-
let after = null;
|
|
122
|
-
for (;;) {
|
|
123
|
-
const data = await this.request(query, { projectId, after });
|
|
124
|
-
const connection = data.project?.projectMilestones;
|
|
125
|
-
if (!connection)
|
|
126
|
-
break;
|
|
127
|
-
all.push(...connection.nodes);
|
|
128
|
-
if (connection.pageInfo.hasNextPage) {
|
|
129
|
-
after = connection.pageInfo.endCursor;
|
|
130
|
-
}
|
|
131
|
-
else {
|
|
132
|
-
break;
|
|
16
|
+
/** Resolve a workflow state UUID by its display name for a given team. */
|
|
17
|
+
async resolveStateId(teamId, stateName) {
|
|
18
|
+
try {
|
|
19
|
+
const states = await this.client.workflowStates({
|
|
20
|
+
filter: {
|
|
21
|
+
team: { id: { eq: teamId } },
|
|
22
|
+
name: { eq: stateName },
|
|
23
|
+
},
|
|
24
|
+
});
|
|
25
|
+
const node = states.nodes[0];
|
|
26
|
+
if (!node) {
|
|
27
|
+
throw new Error(`Workflow state "${stateName}" not found for team ${teamId}`);
|
|
133
28
|
}
|
|
29
|
+
return node.id;
|
|
134
30
|
}
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
success
|
|
142
|
-
projectMilestone { id name description progress sortOrder }
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
`;
|
|
146
|
-
const variables = {
|
|
147
|
-
input: {
|
|
148
|
-
projectId: input.projectId,
|
|
149
|
-
name: input.name,
|
|
150
|
-
...(input.description != null && { description: input.description }),
|
|
151
|
-
...(input.targetDate != null && { targetDate: input.targetDate }),
|
|
152
|
-
},
|
|
153
|
-
};
|
|
154
|
-
const data = await this.request(mutation, variables);
|
|
155
|
-
const result = data.projectMilestoneCreate;
|
|
156
|
-
if (!result?.success) {
|
|
157
|
-
throw new LinearClientError("Failed to create milestone");
|
|
31
|
+
catch (err) {
|
|
32
|
+
if (err instanceof Error && err.message.includes("not found")) {
|
|
33
|
+
throw err;
|
|
34
|
+
}
|
|
35
|
+
console.warn(`[forge] Failed to resolve state "${stateName}":`, err);
|
|
36
|
+
throw err;
|
|
158
37
|
}
|
|
159
|
-
return result.projectMilestone;
|
|
160
38
|
}
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
const filter = {};
|
|
166
|
-
if (opts?.projectId) {
|
|
167
|
-
filter.project = { id: { eq: opts.projectId } };
|
|
168
|
-
}
|
|
169
|
-
if (opts?.milestoneId) {
|
|
170
|
-
filter.projectMilestone = { id: { eq: opts.milestoneId } };
|
|
39
|
+
/** Update an issue's workflow state. */
|
|
40
|
+
async updateIssueState(issueId, stateId) {
|
|
41
|
+
try {
|
|
42
|
+
await this.client.updateIssue(issueId, { stateId });
|
|
171
43
|
}
|
|
172
|
-
|
|
173
|
-
|
|
44
|
+
catch (err) {
|
|
45
|
+
console.warn(`[forge] Failed to update issue ${issueId}:`, err);
|
|
174
46
|
}
|
|
175
|
-
const hasFilter = Object.keys(filter).length > 0;
|
|
176
|
-
const filterVar = hasFilter ? ", $filter: IssueFilter" : "";
|
|
177
|
-
const filterArg = hasFilter ? ", filter: $filter" : "";
|
|
178
|
-
const query = `
|
|
179
|
-
query ListIssues($after: String${filterVar}) {
|
|
180
|
-
issues(first: 50, after: $after${filterArg}) {
|
|
181
|
-
pageInfo { hasNextPage endCursor }
|
|
182
|
-
nodes {
|
|
183
|
-
id identifier title description url
|
|
184
|
-
state { name }
|
|
185
|
-
project { id }
|
|
186
|
-
projectMilestone { id }
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
`;
|
|
191
|
-
const raw = await this.paginate(query, "issues", hasFilter ? { filter } : {});
|
|
192
|
-
return raw.map((node) => this.mapIssue(node));
|
|
193
47
|
}
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
success
|
|
199
|
-
issue {
|
|
200
|
-
id identifier title description url
|
|
201
|
-
state { name }
|
|
202
|
-
project { id }
|
|
203
|
-
projectMilestone { id }
|
|
204
|
-
}
|
|
205
|
-
}
|
|
206
|
-
}
|
|
207
|
-
`;
|
|
208
|
-
const issueInput = {
|
|
209
|
-
title: input.title,
|
|
210
|
-
teamId: input.teamId,
|
|
211
|
-
...(input.description != null && { description: input.description }),
|
|
212
|
-
...(input.projectId != null && { projectId: input.projectId }),
|
|
213
|
-
...(input.milestoneId != null && {
|
|
214
|
-
projectMilestoneId: input.milestoneId,
|
|
215
|
-
}),
|
|
216
|
-
...(input.priority != null && { priority: input.priority }),
|
|
217
|
-
};
|
|
218
|
-
// state is a name string; Linear expects stateId. The caller should resolve
|
|
219
|
-
// this upstream, but if provided we pass it as-is and let Linear resolve.
|
|
220
|
-
if (input.state != null) {
|
|
221
|
-
issueInput.stateId = input.state;
|
|
48
|
+
/** Update a project's status (state name in Linear projects). */
|
|
49
|
+
async updateProjectState(projectId, stateId) {
|
|
50
|
+
try {
|
|
51
|
+
await this.client.updateProject(projectId, { statusId: stateId });
|
|
222
52
|
}
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
if (!result?.success) {
|
|
226
|
-
throw new LinearClientError("Failed to create issue");
|
|
53
|
+
catch (err) {
|
|
54
|
+
console.warn(`[forge] Failed to update project ${projectId}:`, err);
|
|
227
55
|
}
|
|
228
|
-
return this.mapIssue(result.issue);
|
|
229
56
|
}
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
issue {
|
|
236
|
-
id identifier title description url
|
|
237
|
-
state { name }
|
|
238
|
-
project { id }
|
|
239
|
-
projectMilestone { id }
|
|
240
|
-
}
|
|
241
|
-
}
|
|
242
|
-
}
|
|
243
|
-
`;
|
|
244
|
-
const issueInput = {};
|
|
245
|
-
if (input.title != null)
|
|
246
|
-
issueInput.title = input.title;
|
|
247
|
-
if (input.description != null)
|
|
248
|
-
issueInput.description = input.description;
|
|
249
|
-
if (input.state != null)
|
|
250
|
-
issueInput.stateId = input.state;
|
|
251
|
-
if (input.milestoneId != null)
|
|
252
|
-
issueInput.projectMilestoneId = input.milestoneId;
|
|
253
|
-
if (input.priority != null)
|
|
254
|
-
issueInput.priority = input.priority;
|
|
255
|
-
const data = await this.request(mutation, { id, input: issueInput });
|
|
256
|
-
const result = data.issueUpdate;
|
|
257
|
-
if (!result?.success) {
|
|
258
|
-
throw new LinearClientError(`Failed to update issue ${id}`);
|
|
57
|
+
/** List all teams visible to the authenticated user. */
|
|
58
|
+
async listTeams() {
|
|
59
|
+
try {
|
|
60
|
+
const result = await this.client.teams();
|
|
61
|
+
return result.nodes.map((t) => ({ id: t.id, name: t.name, key: t.key }));
|
|
259
62
|
}
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
const mutation = `
|
|
264
|
-
mutation CreateComment($input: CommentCreateInput!) {
|
|
265
|
-
commentCreate(input: $input) {
|
|
266
|
-
success
|
|
267
|
-
}
|
|
268
|
-
}
|
|
269
|
-
`;
|
|
270
|
-
const data = await this.request(mutation, {
|
|
271
|
-
input: { issueId, body },
|
|
272
|
-
});
|
|
273
|
-
if (!data.commentCreate?.success) {
|
|
274
|
-
throw new LinearClientError(`Failed to create comment on issue ${issueId}`);
|
|
63
|
+
catch (err) {
|
|
64
|
+
console.warn("[forge] Failed to list teams:", err);
|
|
65
|
+
return [];
|
|
275
66
|
}
|
|
276
67
|
}
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
/**
|
|
295
|
-
* Execute a GraphQL request against the Linear API with retry + backoff.
|
|
296
|
-
*/
|
|
297
|
-
async request(query, variables = {}) {
|
|
298
|
-
let lastError;
|
|
299
|
-
for (let attempt = 0; attempt < MAX_RETRIES; attempt++) {
|
|
300
|
-
if (attempt > 0) {
|
|
301
|
-
const delay = INITIAL_BACKOFF_MS * 2 ** (attempt - 1);
|
|
302
|
-
await new Promise((resolve) => setTimeout(resolve, delay));
|
|
303
|
-
}
|
|
304
|
-
let res;
|
|
305
|
-
try {
|
|
306
|
-
const controller = new AbortController();
|
|
307
|
-
const timeoutId = globalThis.setTimeout(() => controller.abort(), REQUEST_TIMEOUT_MS);
|
|
308
|
-
try {
|
|
309
|
-
res = await fetch(LINEAR_API_URL, {
|
|
310
|
-
method: "POST",
|
|
311
|
-
headers: {
|
|
312
|
-
"Content-Type": "application/json",
|
|
313
|
-
Authorization: this.apiKey,
|
|
314
|
-
},
|
|
315
|
-
body: JSON.stringify({ query, variables }),
|
|
316
|
-
signal: controller.signal,
|
|
317
|
-
});
|
|
318
|
-
}
|
|
319
|
-
finally {
|
|
320
|
-
clearTimeout(timeoutId);
|
|
321
|
-
}
|
|
322
|
-
}
|
|
323
|
-
catch (err) {
|
|
324
|
-
if (err instanceof DOMException && err.name === "AbortError" || (err instanceof Error && err.name === "AbortError")) {
|
|
325
|
-
lastError = new LinearClientError(`Linear API request timed out after ${REQUEST_TIMEOUT_MS / 1000}s`);
|
|
326
|
-
}
|
|
327
|
-
else {
|
|
328
|
-
lastError =
|
|
329
|
-
err instanceof Error ? err : new Error(String(err));
|
|
330
|
-
}
|
|
331
|
-
continue;
|
|
332
|
-
}
|
|
333
|
-
if (res.status === 429 || res.status >= 500) {
|
|
334
|
-
lastError = new LinearClientError(`Linear API returned ${res.status}`, res.status);
|
|
335
|
-
continue;
|
|
336
|
-
}
|
|
337
|
-
if (!res.ok) {
|
|
338
|
-
const body = await res.text().catch(() => "");
|
|
339
|
-
throw new LinearClientError(`Linear API error ${res.status}: ${body}`, res.status);
|
|
340
|
-
}
|
|
341
|
-
const json = (await res.json());
|
|
342
|
-
if (json.errors?.length) {
|
|
343
|
-
throw new LinearClientError(`GraphQL errors: ${json.errors.map((e) => e.message).join("; ")}`, undefined, json.errors);
|
|
344
|
-
}
|
|
345
|
-
if (!json.data) {
|
|
346
|
-
throw new LinearClientError("No data in Linear API response");
|
|
347
|
-
}
|
|
348
|
-
return json.data;
|
|
68
|
+
/** List issues belonging to a project. Returns identifier (e.g. "MSIG-123") and title. */
|
|
69
|
+
async listIssuesByProject(projectId) {
|
|
70
|
+
try {
|
|
71
|
+
const result = await this.client.issues({
|
|
72
|
+
filter: {
|
|
73
|
+
project: { id: { eq: projectId } },
|
|
74
|
+
},
|
|
75
|
+
});
|
|
76
|
+
return result.nodes.map((i) => ({
|
|
77
|
+
id: i.id,
|
|
78
|
+
identifier: i.identifier,
|
|
79
|
+
title: i.title,
|
|
80
|
+
}));
|
|
81
|
+
}
|
|
82
|
+
catch (err) {
|
|
83
|
+
console.warn("[forge] Failed to list issues by project:", err);
|
|
84
|
+
return [];
|
|
349
85
|
}
|
|
350
|
-
throw lastError ?? new LinearClientError("Request failed after retries");
|
|
351
86
|
}
|
|
352
|
-
/**
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
const
|
|
361
|
-
const
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
all.push(...connection.nodes);
|
|
365
|
-
if (connection.pageInfo.hasNextPage) {
|
|
366
|
-
after = connection.pageInfo.endCursor;
|
|
367
|
-
}
|
|
368
|
-
else {
|
|
369
|
-
break;
|
|
87
|
+
/** List projects filtered by team. */
|
|
88
|
+
async listProjects(teamId) {
|
|
89
|
+
try {
|
|
90
|
+
const result = await this.client.projects({
|
|
91
|
+
filter: {
|
|
92
|
+
accessibleTeams: { some: { id: { eq: teamId } } },
|
|
93
|
+
},
|
|
94
|
+
});
|
|
95
|
+
const projects = [];
|
|
96
|
+
for (const p of result.nodes) {
|
|
97
|
+
const status = await p.status;
|
|
98
|
+
projects.push({ id: p.id, name: p.name, state: status?.name ?? "Unknown" });
|
|
370
99
|
}
|
|
100
|
+
return projects;
|
|
101
|
+
}
|
|
102
|
+
catch (err) {
|
|
103
|
+
console.warn("[forge] Failed to list projects:", err);
|
|
104
|
+
return [];
|
|
371
105
|
}
|
|
372
|
-
return all;
|
|
373
|
-
}
|
|
374
|
-
/** Normalize a raw issue node from GraphQL into our flat LinearIssue shape. */
|
|
375
|
-
mapIssue(node) {
|
|
376
|
-
return {
|
|
377
|
-
id: node.id,
|
|
378
|
-
identifier: node.identifier,
|
|
379
|
-
title: node.title,
|
|
380
|
-
description: node.description ?? undefined,
|
|
381
|
-
state: node.state?.name ?? "Unknown",
|
|
382
|
-
projectId: node.project?.id ?? undefined,
|
|
383
|
-
milestoneId: node.projectMilestone?.id ?? undefined,
|
|
384
|
-
url: node.url,
|
|
385
|
-
};
|
|
386
106
|
}
|
|
387
107
|
}
|
|
388
108
|
//# sourceMappingURL=client.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/linear/client.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/linear/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAO3C;;;GAGG;AACH,MAAM,OAAO,iBAAiB;IACX,MAAM,CAAe;IACrB,MAAM,CAAqB;IAE5C,YAAY,IAA8B;QACxC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CACb,gGAAgG,CACjG,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,MAAM,GAAG,IAAI,YAAY,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QACxD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;IAC5B,CAAC;IAED,0EAA0E;IAC1E,KAAK,CAAC,cAAc,CAAC,MAAc,EAAE,SAAiB;QACpD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC;gBAC9C,MAAM,EAAE;oBACN,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE;oBAC5B,IAAI,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE;iBACxB;aACF,CAAC,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC7B,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,MAAM,IAAI,KAAK,CACb,mBAAmB,SAAS,wBAAwB,MAAM,EAAE,CAC7D,CAAC;YACJ,CAAC;YACD,OAAO,IAAI,CAAC,EAAE,CAAC;QACjB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,KAAK,IAAI,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;gBAC9D,MAAM,GAAG,CAAC;YACZ,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,oCAAoC,SAAS,IAAI,EAAE,GAAG,CAAC,CAAC;YACrE,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;IAED,wCAAwC;IACxC,KAAK,CAAC,gBAAgB,CAAC,OAAe,EAAE,OAAe;QACrD,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;QACtD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,kCAAkC,OAAO,GAAG,EAAE,GAAG,CAAC,CAAC;QAClE,CAAC;IACH,CAAC;IAED,iEAAiE;IACjE,KAAK,CAAC,kBAAkB,CACtB,SAAiB,EACjB,OAAe;QAEf,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,SAAS,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;QACpE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,oCAAoC,SAAS,GAAG,EAAE,GAAG,CAAC,CAAC;QACtE,CAAC;IACH,CAAC;IAED,wDAAwD;IACxD,KAAK,CAAC,SAAS;QACb,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YACzC,OAAO,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QAC3E,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,+BAA+B,EAAE,GAAG,CAAC,CAAC;YACnD,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED,0FAA0F;IAC1F,KAAK,CAAC,mBAAmB,CACvB,SAAiB;QAEjB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;gBACtC,MAAM,EAAE;oBACN,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE;iBACnC;aACF,CAAC,CAAC;YACH,OAAO,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC9B,EAAE,EAAE,CAAC,CAAC,EAAE;gBACR,UAAU,EAAE,CAAC,CAAC,UAAU;gBACxB,KAAK,EAAE,CAAC,CAAC,KAAK;aACf,CAAC,CAAC,CAAC;QACN,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,2CAA2C,EAAE,GAAG,CAAC,CAAC;YAC/D,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED,sCAAsC;IACtC,KAAK,CAAC,YAAY,CAChB,MAAc;QAEd,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;gBACxC,MAAM,EAAE;oBACN,eAAe,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;iBAClD;aACF,CAAC,CAAC;YACH,MAAM,QAAQ,GAAuD,EAAE,CAAC;YACxE,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;gBAC7B,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,MAAM,CAAC;gBAC9B,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,IAAI,SAAS,EAAE,CAAC,CAAC;YAC9E,CAAC;YACD,OAAO,QAAQ,CAAC;QAClB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,kCAAkC,EAAE,GAAG,CAAC,CAAC;YACtD,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;CACF"}
|
package/dist/linear/issues.d.ts
CHANGED
|
@@ -11,8 +11,10 @@ export declare function createMilestoneIssue(client: LinearClient, input: {
|
|
|
11
11
|
milestoneId: string;
|
|
12
12
|
priority?: number;
|
|
13
13
|
}): Promise<LinearIssue>;
|
|
14
|
+
/** Resolve a state name to its UUID for a given team */
|
|
15
|
+
export declare function resolveStateId(client: LinearClient, teamId: string, stateName: string): Promise<string>;
|
|
14
16
|
/** Transition all issues in a milestone to a target state */
|
|
15
|
-
export declare function transitionMilestoneIssues(client: LinearClient, projectId: string, milestoneId: string, targetState: string): Promise<{
|
|
17
|
+
export declare function transitionMilestoneIssues(client: LinearClient, projectId: string, milestoneId: string, targetState: string, teamId: string): Promise<{
|
|
16
18
|
updated: number;
|
|
17
19
|
issues: LinearIssue[];
|
|
18
20
|
}>;
|
package/dist/linear/issues.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { LinearClientError } from "./client.js";
|
|
1
2
|
/** Valid issue states */
|
|
2
3
|
export const ISSUE_STATES = [
|
|
3
4
|
"Backlog",
|
|
@@ -18,14 +19,25 @@ export async function createMilestoneIssue(client, input) {
|
|
|
18
19
|
priority: input.priority,
|
|
19
20
|
});
|
|
20
21
|
}
|
|
22
|
+
/** Resolve a state name to its UUID for a given team */
|
|
23
|
+
export async function resolveStateId(client, teamId, stateName) {
|
|
24
|
+
const states = await client.listWorkflowStates(teamId);
|
|
25
|
+
const match = states.find((s) => s.name === stateName);
|
|
26
|
+
if (!match) {
|
|
27
|
+
throw new LinearClientError(`Workflow state "${stateName}" not found for team ${teamId}`);
|
|
28
|
+
}
|
|
29
|
+
return match.id;
|
|
30
|
+
}
|
|
21
31
|
/** Transition all issues in a milestone to a target state */
|
|
22
|
-
export async function transitionMilestoneIssues(client, projectId, milestoneId, targetState) {
|
|
32
|
+
export async function transitionMilestoneIssues(client, projectId, milestoneId, targetState, teamId) {
|
|
33
|
+
// Resolve state name to UUID
|
|
34
|
+
const stateId = await resolveStateId(client, teamId, targetState);
|
|
23
35
|
const issues = await client.listIssues({ projectId, milestoneId });
|
|
24
36
|
const updatedIssues = [];
|
|
25
37
|
for (const issue of issues) {
|
|
26
38
|
if (issue.state !== targetState) {
|
|
27
39
|
const updated = await client.updateIssue(issue.id, {
|
|
28
|
-
|
|
40
|
+
stateId,
|
|
29
41
|
});
|
|
30
42
|
updatedIssues.push(updated);
|
|
31
43
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"issues.js","sourceRoot":"","sources":["../../src/linear/issues.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"issues.js","sourceRoot":"","sources":["../../src/linear/issues.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,iBAAiB,EAAoB,MAAM,aAAa,CAAC;AAEhF,yBAAyB;AACzB,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,SAAS;IACT,MAAM;IACN,aAAa;IACb,WAAW;IACX,MAAM;IACN,UAAU;CACF,CAAC;AAGX,gDAAgD;AAChD,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,MAAoB,EACpB,KAOC;IAED,OAAO,MAAM,CAAC,WAAW,CAAC;QACxB,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,QAAQ,EAAE,KAAK,CAAC,QAAQ;KACzB,CAAC,CAAC;AACL,CAAC;AAED,wDAAwD;AACxD,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,MAAoB,EACpB,MAAc,EACd,SAAiB;IAEjB,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;IACvD,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;IACvD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,iBAAiB,CACzB,mBAAmB,SAAS,wBAAwB,MAAM,EAAE,CAC7D,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC,EAAE,CAAC;AAClB,CAAC;AAED,6DAA6D;AAC7D,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC7C,MAAoB,EACpB,SAAiB,EACjB,WAAmB,EACnB,WAAmB,EACnB,MAAc;IAEd,6BAA6B;IAC7B,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;IAElE,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC,CAAC;IAEnE,MAAM,aAAa,GAAkB,EAAE,CAAC;IACxC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,KAAK,CAAC,KAAK,KAAK,WAAW,EAAE,CAAC;YAChC,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,EAAE;gBACjD,OAAO;aACR,CAAC,CAAC;YACH,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC;AAClE,CAAC;AAED,yCAAyC;AACzC,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,MAAoB,EACpB,OAAe,EACf,OAAe;IAEf,MAAM,MAAM,CAAC,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AAC/C,CAAC"}
|
package/dist/linear/projects.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { LinearClientError } from "./client.js";
|
|
1
2
|
/** Valid project states in forward-only order */
|
|
2
3
|
export const PROJECT_STATES = [
|
|
3
4
|
"Backlog",
|
|
@@ -35,10 +36,10 @@ export async function transitionProject(client, projectId, targetState) {
|
|
|
35
36
|
const projects = await client.listProjects();
|
|
36
37
|
const project = projects.find((p) => p.id === projectId);
|
|
37
38
|
if (!project) {
|
|
38
|
-
throw new
|
|
39
|
+
throw new LinearClientError(`Project not found: ${projectId}`);
|
|
39
40
|
}
|
|
40
41
|
if (!isValidTransition(project.state, targetState)) {
|
|
41
|
-
throw new
|
|
42
|
+
throw new LinearClientError(`Invalid project transition: ${project.state} -> ${targetState}`);
|
|
42
43
|
}
|
|
43
44
|
return client.updateProject(projectId, { state: targetState });
|
|
44
45
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"projects.js","sourceRoot":"","sources":["../../src/linear/projects.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"projects.js","sourceRoot":"","sources":["../../src/linear/projects.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,iBAAiB,EAAsB,MAAM,aAAa,CAAC;AAElF,iDAAiD;AACjD,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,SAAS;IACT,SAAS;IACT,aAAa;IACb,WAAW;IACX,MAAM;CACE,CAAC;AAGX,gDAAgD;AAChD,MAAM,UAAU,GAAG,IAAI,GAAG,CACxB,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CACrC,CAAC;AAEF;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAY,EAAE,EAAU;IACxD,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACrC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACjC,IAAI,OAAO,KAAK,SAAS,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IAC/D,OAAO,KAAK,GAAG,OAAO,CAAC;AACzB,CAAC;AAED,iEAAiE;AACjE,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,MAAoB,EACpB,IAAY,EACZ,WAAmB,EACnB,OAAiB;IAEjB,OAAO,MAAM,CAAC,aAAa,CAAC;QAC1B,IAAI;QACJ,WAAW;QACX,OAAO;QACP,KAAK,EAAE,SAAS;KACjB,CAAC,CAAC;AACL,CAAC;AAED,0EAA0E;AAC1E,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,MAAoB,EACpB,SAAiB,EACjB,WAAmB;IAEnB,+CAA+C;IAC/C,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,YAAY,EAAE,CAAC;IAC7C,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,SAAS,CAAC,CAAC;IACzD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,iBAAiB,CAAC,sBAAsB,SAAS,EAAE,CAAC,CAAC;IACjE,CAAC;IACD,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,KAAK,EAAE,WAAW,CAAC,EAAE,CAAC;QACnD,MAAM,IAAI,iBAAiB,CACzB,+BAA+B,OAAO,CAAC,KAAK,OAAO,WAAW,EAAE,CACjE,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,CAAC,aAAa,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;AACjE,CAAC;AAED,uEAAuE;AACvE,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,MAAoB,EACpB,IAAY;IAEZ,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5D,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,IAAI,CAAC;AACvD,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { ForgeConfig, PRDStatus } from "../types.js";
|
|
2
|
+
import type { ForgeLinearClient } from "./client.js";
|
|
3
|
+
/**
|
|
4
|
+
* Transition milestone issues to inProgress and project to inProgress.
|
|
5
|
+
*/
|
|
6
|
+
export declare function syncMilestoneStart(client: ForgeLinearClient, config: ForgeConfig, status: PRDStatus, milestone: string): Promise<void>;
|
|
7
|
+
/**
|
|
8
|
+
* Transition milestone issues to done.
|
|
9
|
+
* If isLast, transition project to inReview.
|
|
10
|
+
*/
|
|
11
|
+
export declare function syncMilestoneComplete(client: ForgeLinearClient, config: ForgeConfig, status: PRDStatus, milestone: string, isLast: boolean): Promise<void>;
|
|
12
|
+
/**
|
|
13
|
+
* Transition all issues across all milestones to done and project to done.
|
|
14
|
+
*/
|
|
15
|
+
export declare function syncProjectDone(client: ForgeLinearClient, config: ForgeConfig, status: PRDStatus): Promise<void>;
|