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.
Files changed (72) hide show
  1. package/README.md +454 -338
  2. package/dist/cli.js +194 -906
  3. package/dist/cli.js.map +1 -1
  4. package/dist/config/loader.d.ts +1 -1
  5. package/dist/config/loader.js +49 -56
  6. package/dist/config/loader.js.map +1 -1
  7. package/dist/config/schema.d.ts +37 -125
  8. package/dist/config/schema.js +13 -28
  9. package/dist/config/schema.js.map +1 -1
  10. package/dist/doctor.d.ts +10 -0
  11. package/dist/doctor.js +148 -0
  12. package/dist/doctor.js.map +1 -0
  13. package/dist/gates/index.d.ts +14 -12
  14. package/dist/gates/index.js +53 -105
  15. package/dist/gates/index.js.map +1 -1
  16. package/dist/gates/lint-gate.d.ts +2 -2
  17. package/dist/gates/lint-gate.js +60 -66
  18. package/dist/gates/lint-gate.js.map +1 -1
  19. package/dist/gates/tests-gate.d.ts +2 -4
  20. package/dist/gates/tests-gate.js +75 -203
  21. package/dist/gates/tests-gate.js.map +1 -1
  22. package/dist/gates/types-gate.d.ts +2 -2
  23. package/dist/gates/types-gate.js +53 -59
  24. package/dist/gates/types-gate.js.map +1 -1
  25. package/dist/go/linear-sync-cli.js +13 -4
  26. package/dist/go/linear-sync-cli.js.map +1 -1
  27. package/dist/go/linear-sync.d.ts +1 -0
  28. package/dist/go/linear-sync.js +67 -4
  29. package/dist/go/linear-sync.js.map +1 -1
  30. package/dist/linear/client.d.ts +34 -105
  31. package/dist/linear/client.js +85 -365
  32. package/dist/linear/client.js.map +1 -1
  33. package/dist/linear/issues.d.ts +3 -1
  34. package/dist/linear/issues.js +14 -2
  35. package/dist/linear/issues.js.map +1 -1
  36. package/dist/linear/projects.js +3 -2
  37. package/dist/linear/projects.js.map +1 -1
  38. package/dist/linear/sync.d.ts +15 -0
  39. package/dist/linear/sync.js +102 -0
  40. package/dist/linear/sync.js.map +1 -0
  41. package/dist/runner/loop.d.ts +4 -0
  42. package/dist/runner/loop.js +168 -0
  43. package/dist/runner/loop.js.map +1 -0
  44. package/dist/runner/prompt.d.ts +14 -0
  45. package/dist/runner/prompt.js +59 -0
  46. package/dist/runner/prompt.js.map +1 -0
  47. package/dist/runner/update.d.ts +1 -0
  48. package/dist/runner/update.js +72 -0
  49. package/dist/runner/update.js.map +1 -0
  50. package/dist/server.d.ts +6 -2
  51. package/dist/server.js +43 -101
  52. package/dist/server.js.map +1 -1
  53. package/dist/setup.d.ts +5 -0
  54. package/dist/setup.js +208 -0
  55. package/dist/setup.js.map +1 -0
  56. package/dist/state/cache.d.ts +3 -0
  57. package/dist/state/cache.js +23 -0
  58. package/dist/state/cache.js.map +1 -0
  59. package/dist/state/status.d.ts +66 -0
  60. package/dist/state/status.js +96 -0
  61. package/dist/state/status.js.map +1 -0
  62. package/dist/types.d.ts +46 -114
  63. package/dist/worktree/manager.d.ts +6 -103
  64. package/dist/worktree/manager.js +25 -296
  65. package/dist/worktree/manager.js.map +1 -1
  66. package/hooks/pre-commit-verify.js +109 -109
  67. package/package.json +3 -2
  68. package/skills/forge-go.md +583 -575
  69. package/skills/forge-setup.md +149 -388
  70. package/skills/forge-spec.md +367 -342
  71. package/skills/forge-triage.md +179 -133
  72. package/skills/forge-update.md +87 -93
@@ -1,388 +1,108 @@
1
+ import { LinearClient } from "@linear/sdk";
1
2
  /**
2
- * Typed wrapper around the Linear GraphQL API.
3
- * Used by lifecycle modules (projects.ts, milestones.ts, issues.ts)
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
- const LINEAR_API_URL = "https://api.linear.app/graphql";
7
- const MAX_RETRIES = 3;
8
- const INITIAL_BACKOFF_MS = 500;
9
- const REQUEST_TIMEOUT_MS = 30_000; // 30 seconds per request
10
- // ---------------------------------------------------------------------------
11
- // Error
12
- // ---------------------------------------------------------------------------
13
- export class LinearClientError extends Error {
14
- statusCode;
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
- // Client
25
- // ---------------------------------------------------------------------------
26
- export class LinearClient {
27
- apiKey;
28
- constructor(apiKey) {
29
- const key = apiKey ?? process.env.LINEAR_API_KEY;
30
- if (!key) {
31
- throw new LinearClientError("Linear API key not found. Set the LINEAR_API_KEY environment variable or pass it to the constructor.");
32
- }
33
- this.apiKey = key;
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
- return all;
136
- }
137
- async createMilestone(input) {
138
- const mutation = `
139
- mutation CreateMilestone($input: ProjectMilestoneCreateInput!) {
140
- projectMilestoneCreate(input: $input) {
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
- // Issues
163
- // -------------------------------------------------------------------------
164
- async listIssues(opts) {
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
- if (opts?.state) {
173
- filter.state = { name: { eqIgnoreCase: opts.state } };
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
- async createIssue(input) {
195
- const mutation = `
196
- mutation CreateIssue($input: IssueCreateInput!) {
197
- issueCreate(input: $input) {
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
- const data = await this.request(mutation, { input: issueInput });
224
- const result = data.issueCreate;
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
- async updateIssue(id, input) {
231
- const mutation = `
232
- mutation UpdateIssue($id: String!, $input: IssueUpdateInput!) {
233
- issueUpdate(id: $id, input: $input) {
234
- success
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
- return this.mapIssue(result.issue);
261
- }
262
- async createComment(issueId, body) {
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
- // Teams
279
- // -------------------------------------------------------------------------
280
- async listTeams() {
281
- const query = `
282
- query ListTeams($after: String) {
283
- teams(first: 50, after: $after) {
284
- pageInfo { hasNextPage endCursor }
285
- nodes { id name key }
286
- }
287
- }
288
- `;
289
- return this.paginate(query, "teams", {});
290
- }
291
- // -------------------------------------------------------------------------
292
- // Internals
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
- * Auto-paginate a connection query. The query MUST accept `$after: String`
354
- * and the root field must return `{ pageInfo { hasNextPage endCursor } nodes { ... } }`.
355
- */
356
- async paginate(query, rootField, variables) {
357
- const all = [];
358
- let after = null;
359
- for (;;) {
360
- const data = await this.request(query, { ...variables, after });
361
- const connection = data[rootField];
362
- if (!connection)
363
- break;
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":"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"}
@@ -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
  }>;
@@ -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
- state: targetState,
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":"AAEA,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,6DAA6D;AAC7D,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC7C,MAAoB,EACpB,SAAiB,EACjB,WAAmB,EACnB,WAAmB;IAEnB,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,KAAK,EAAE,WAAW;aACnB,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"}
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"}
@@ -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 Error(`Project not found: ${projectId}`);
39
+ throw new LinearClientError(`Project not found: ${projectId}`);
39
40
  }
40
41
  if (!isValidTransition(project.state, targetState)) {
41
- throw new Error(`Invalid project transition: ${project.state} -> ${targetState}`);
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":"AAEA,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,KAAK,CAAC,sBAAsB,SAAS,EAAE,CAAC,CAAC;IACrD,CAAC;IACD,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,KAAK,EAAE,WAAW,CAAC,EAAE,CAAC;QACnD,MAAM,IAAI,KAAK,CACb,+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"}
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>;