@opentabs-dev/opentabs-plugin-linear 0.0.82 → 0.0.84

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 (163) hide show
  1. package/dist/adapter.iife.js +1766 -77
  2. package/dist/adapter.iife.js.map +4 -4
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +92 -2
  5. package/dist/index.js.map +1 -1
  6. package/dist/tools/add-issue-label.d.ts +28 -0
  7. package/dist/tools/add-issue-label.d.ts.map +1 -0
  8. package/dist/tools/add-issue-label.js +56 -0
  9. package/dist/tools/add-issue-label.js.map +1 -0
  10. package/dist/tools/add-issue-subscriber.d.ts +8 -0
  11. package/dist/tools/add-issue-subscriber.d.ts.map +1 -0
  12. package/dist/tools/add-issue-subscriber.js +29 -0
  13. package/dist/tools/add-issue-subscriber.js.map +1 -0
  14. package/dist/tools/batch-update-issues.d.ts +35 -0
  15. package/dist/tools/batch-update-issues.d.ts.map +1 -0
  16. package/dist/tools/batch-update-issues.js +86 -0
  17. package/dist/tools/batch-update-issues.js.map +1 -0
  18. package/dist/tools/create-attachment.d.ts +19 -0
  19. package/dist/tools/create-attachment.d.ts.map +1 -0
  20. package/dist/tools/create-attachment.js +45 -0
  21. package/dist/tools/create-attachment.js.map +1 -0
  22. package/dist/tools/create-document.d.ts +21 -0
  23. package/dist/tools/create-document.d.ts.map +1 -0
  24. package/dist/tools/create-document.js +46 -0
  25. package/dist/tools/create-document.js.map +1 -0
  26. package/dist/tools/create-initiative.d.ts +26 -0
  27. package/dist/tools/create-initiative.d.ts.map +1 -0
  28. package/dist/tools/create-initiative.js +50 -0
  29. package/dist/tools/create-initiative.js.map +1 -0
  30. package/dist/tools/create-issue-relation.d.ts +18 -0
  31. package/dist/tools/create-issue-relation.d.ts.map +1 -0
  32. package/dist/tools/create-issue-relation.js +53 -0
  33. package/dist/tools/create-issue-relation.js.map +1 -0
  34. package/dist/tools/create-milestone.d.ts +16 -0
  35. package/dist/tools/create-milestone.d.ts.map +1 -0
  36. package/dist/tools/create-milestone.js +45 -0
  37. package/dist/tools/create-milestone.js.map +1 -0
  38. package/dist/tools/create-project-update.d.ts +20 -0
  39. package/dist/tools/create-project-update.d.ts.map +1 -0
  40. package/dist/tools/create-project-update.js +37 -0
  41. package/dist/tools/create-project-update.js.map +1 -0
  42. package/dist/tools/delete-attachment.d.ts +7 -0
  43. package/dist/tools/delete-attachment.d.ts.map +1 -0
  44. package/dist/tools/delete-attachment.js +28 -0
  45. package/dist/tools/delete-attachment.js.map +1 -0
  46. package/dist/tools/delete-comment.d.ts +7 -0
  47. package/dist/tools/delete-comment.d.ts.map +1 -0
  48. package/dist/tools/delete-comment.js +28 -0
  49. package/dist/tools/delete-comment.js.map +1 -0
  50. package/dist/tools/delete-issue-relation.d.ts +7 -0
  51. package/dist/tools/delete-issue-relation.d.ts.map +1 -0
  52. package/dist/tools/delete-issue-relation.js +28 -0
  53. package/dist/tools/delete-issue-relation.js.map +1 -0
  54. package/dist/tools/delete-label.d.ts +7 -0
  55. package/dist/tools/delete-label.d.ts.map +1 -0
  56. package/dist/tools/delete-label.js +28 -0
  57. package/dist/tools/delete-label.js.map +1 -0
  58. package/dist/tools/delete-project-update.d.ts +7 -0
  59. package/dist/tools/delete-project-update.d.ts.map +1 -0
  60. package/dist/tools/delete-project-update.js +28 -0
  61. package/dist/tools/delete-project-update.js.map +1 -0
  62. package/dist/tools/get-attachment.d.ts +16 -0
  63. package/dist/tools/get-attachment.d.ts.map +1 -0
  64. package/dist/tools/get-attachment.js +30 -0
  65. package/dist/tools/get-attachment.js.map +1 -0
  66. package/dist/tools/get-cycle.d.ts +15 -0
  67. package/dist/tools/get-cycle.d.ts.map +1 -0
  68. package/dist/tools/get-cycle.js +29 -0
  69. package/dist/tools/get-cycle.js.map +1 -0
  70. package/dist/tools/get-document.d.ts +18 -0
  71. package/dist/tools/get-document.d.ts.map +1 -0
  72. package/dist/tools/get-document.js +31 -0
  73. package/dist/tools/get-document.js.map +1 -0
  74. package/dist/tools/get-initiative.d.ts +30 -0
  75. package/dist/tools/get-initiative.d.ts.map +1 -0
  76. package/dist/tools/get-initiative.js +42 -0
  77. package/dist/tools/get-initiative.js.map +1 -0
  78. package/dist/tools/get-milestone.d.ts +13 -0
  79. package/dist/tools/get-milestone.d.ts.map +1 -0
  80. package/dist/tools/get-milestone.js +29 -0
  81. package/dist/tools/get-milestone.js.map +1 -0
  82. package/dist/tools/get-team.d.ts +12 -0
  83. package/dist/tools/get-team.d.ts.map +1 -0
  84. package/dist/tools/get-team.js +29 -0
  85. package/dist/tools/get-team.js.map +1 -0
  86. package/dist/tools/get-user.d.ts +14 -0
  87. package/dist/tools/get-user.d.ts.map +1 -0
  88. package/dist/tools/get-user.js +29 -0
  89. package/dist/tools/get-user.js.map +1 -0
  90. package/dist/tools/list-attachments.d.ts +22 -0
  91. package/dist/tools/list-attachments.d.ts.map +1 -0
  92. package/dist/tools/list-attachments.js +46 -0
  93. package/dist/tools/list-attachments.js.map +1 -0
  94. package/dist/tools/list-documents.d.ts +24 -0
  95. package/dist/tools/list-documents.d.ts.map +1 -0
  96. package/dist/tools/list-documents.js +49 -0
  97. package/dist/tools/list-documents.js.map +1 -0
  98. package/dist/tools/list-initiatives.d.ts +28 -0
  99. package/dist/tools/list-initiatives.d.ts.map +1 -0
  100. package/dist/tools/list-initiatives.js +48 -0
  101. package/dist/tools/list-initiatives.js.map +1 -0
  102. package/dist/tools/list-issue-history.d.ts +23 -0
  103. package/dist/tools/list-issue-history.d.ts.map +1 -0
  104. package/dist/tools/list-issue-history.js +52 -0
  105. package/dist/tools/list-issue-history.js.map +1 -0
  106. package/dist/tools/list-milestones.d.ts +13 -0
  107. package/dist/tools/list-milestones.d.ts.map +1 -0
  108. package/dist/tools/list-milestones.js +35 -0
  109. package/dist/tools/list-milestones.js.map +1 -0
  110. package/dist/tools/list-project-labels.d.ts +14 -0
  111. package/dist/tools/list-project-labels.d.ts.map +1 -0
  112. package/dist/tools/list-project-labels.js +36 -0
  113. package/dist/tools/list-project-labels.js.map +1 -0
  114. package/dist/tools/list-project-updates.d.ts +20 -0
  115. package/dist/tools/list-project-updates.d.ts.map +1 -0
  116. package/dist/tools/list-project-updates.js +46 -0
  117. package/dist/tools/list-project-updates.js.map +1 -0
  118. package/dist/tools/list-sub-issues.d.ts +33 -0
  119. package/dist/tools/list-sub-issues.d.ts.map +1 -0
  120. package/dist/tools/list-sub-issues.js +53 -0
  121. package/dist/tools/list-sub-issues.js.map +1 -0
  122. package/dist/tools/list-team-members.d.ts +20 -0
  123. package/dist/tools/list-team-members.d.ts.map +1 -0
  124. package/dist/tools/list-team-members.js +45 -0
  125. package/dist/tools/list-team-members.js.map +1 -0
  126. package/dist/tools/move-issue-to-project.d.ts +28 -0
  127. package/dist/tools/move-issue-to-project.d.ts.map +1 -0
  128. package/dist/tools/move-issue-to-project.js +43 -0
  129. package/dist/tools/move-issue-to-project.js.map +1 -0
  130. package/dist/tools/remove-issue-label.d.ts +28 -0
  131. package/dist/tools/remove-issue-label.d.ts.map +1 -0
  132. package/dist/tools/remove-issue-label.js +56 -0
  133. package/dist/tools/remove-issue-label.js.map +1 -0
  134. package/dist/tools/remove-issue-subscriber.d.ts +8 -0
  135. package/dist/tools/remove-issue-subscriber.d.ts.map +1 -0
  136. package/dist/tools/remove-issue-subscriber.js +29 -0
  137. package/dist/tools/remove-issue-subscriber.js.map +1 -0
  138. package/dist/tools/schemas.d.ts +207 -0
  139. package/dist/tools/schemas.d.ts.map +1 -1
  140. package/dist/tools/schemas.js +120 -0
  141. package/dist/tools/schemas.js.map +1 -1
  142. package/dist/tools/set-issue-cycle.d.ts +28 -0
  143. package/dist/tools/set-issue-cycle.d.ts.map +1 -0
  144. package/dist/tools/set-issue-cycle.js +43 -0
  145. package/dist/tools/set-issue-cycle.js.map +1 -0
  146. package/dist/tools/update-document.d.ts +22 -0
  147. package/dist/tools/update-document.d.ts.map +1 -0
  148. package/dist/tools/update-document.js +47 -0
  149. package/dist/tools/update-document.js.map +1 -0
  150. package/dist/tools/update-initiative.d.ts +27 -0
  151. package/dist/tools/update-initiative.d.ts.map +1 -0
  152. package/dist/tools/update-initiative.js +51 -0
  153. package/dist/tools/update-initiative.js.map +1 -0
  154. package/dist/tools/update-label.d.ts +17 -0
  155. package/dist/tools/update-label.d.ts.map +1 -0
  156. package/dist/tools/update-label.js +43 -0
  157. package/dist/tools/update-label.js.map +1 -0
  158. package/dist/tools/update-milestone.d.ts +16 -0
  159. package/dist/tools/update-milestone.d.ts.map +1 -0
  160. package/dist/tools/update-milestone.js +44 -0
  161. package/dist/tools/update-milestone.js.map +1 -0
  162. package/dist/tools.json +4044 -577
  163. package/package.json +3 -3
@@ -14229,34 +14229,6 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
14229
14229
  // node_modules/zod/v4/classic/external.js
14230
14230
  config(en_default());
14231
14231
 
14232
- // src/tools/archive-issue.ts
14233
- var archiveIssue = defineTool({
14234
- name: "archive_issue",
14235
- displayName: "Archive Issue",
14236
- description: "Archive a Linear issue. Archived issues are hidden from default views but can be restored.",
14237
- summary: "Archive an issue",
14238
- icon: "archive",
14239
- group: "Issues",
14240
- input: external_exports.object({
14241
- issue_id: external_exports.string().describe("Issue UUID to archive")
14242
- }),
14243
- output: external_exports.object({
14244
- success: external_exports.boolean().describe("Whether the issue was successfully archived")
14245
- }),
14246
- handle: async (params) => {
14247
- const data = await graphql(
14248
- `mutation ArchiveIssue($id: String!) {
14249
- issueArchive(id: $id) {
14250
- success
14251
- }
14252
- }`,
14253
- { id: params.issue_id }
14254
- );
14255
- if (!data.issueArchive) throw ToolError.internal("Issue archive failed \u2014 no response");
14256
- return { success: data.issueArchive.success };
14257
- }
14258
- });
14259
-
14260
14232
  // src/tools/schemas.ts
14261
14233
  var issueSchema = external_exports.object({
14262
14234
  id: external_exports.string().describe("Issue UUID"),
@@ -14341,6 +14313,66 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
14341
14313
  has_next_page: external_exports.boolean().describe("Whether there are more results after this page"),
14342
14314
  end_cursor: external_exports.string().describe("Cursor for fetching the next page, or empty")
14343
14315
  });
14316
+ var attachmentSchema = external_exports.object({
14317
+ id: external_exports.string().describe("Attachment UUID"),
14318
+ title: external_exports.string().describe("Attachment title"),
14319
+ subtitle: external_exports.string().describe("Attachment subtitle"),
14320
+ url: external_exports.string().describe("Attachment URL"),
14321
+ source_type: external_exports.string().describe("Source type (e.g. github, slack, figma)"),
14322
+ creator_name: external_exports.string().describe("Creator display name"),
14323
+ created_at: external_exports.string().describe("ISO 8601 creation timestamp"),
14324
+ updated_at: external_exports.string().describe("ISO 8601 last update timestamp")
14325
+ });
14326
+ var initiativeSchema = external_exports.object({
14327
+ id: external_exports.string().describe("Initiative UUID"),
14328
+ name: external_exports.string().describe("Initiative name"),
14329
+ description: external_exports.string().describe("Initiative description in markdown"),
14330
+ status: external_exports.string().describe("Initiative status (Planned, Active, Completed)"),
14331
+ color: external_exports.string().describe("Initiative color hex code"),
14332
+ icon: external_exports.string().describe("Initiative icon emoji"),
14333
+ owner_name: external_exports.string().describe("Initiative owner display name, or empty if none"),
14334
+ url: external_exports.string().describe("URL to the initiative in Linear"),
14335
+ created_at: external_exports.string().describe("ISO 8601 creation timestamp"),
14336
+ updated_at: external_exports.string().describe("ISO 8601 last update timestamp")
14337
+ });
14338
+ var documentSchema = external_exports.object({
14339
+ id: external_exports.string().describe("Document UUID"),
14340
+ title: external_exports.string().describe("Document title"),
14341
+ content: external_exports.string().describe("Document content in markdown"),
14342
+ slug_id: external_exports.string().describe("Document slug ID for URL construction"),
14343
+ icon: external_exports.string().describe("Document icon emoji"),
14344
+ creator_name: external_exports.string().describe("Creator display name"),
14345
+ project_name: external_exports.string().describe("Associated project name, or empty"),
14346
+ url: external_exports.string().describe("URL to the document in Linear"),
14347
+ created_at: external_exports.string().describe("ISO 8601 creation timestamp"),
14348
+ updated_at: external_exports.string().describe("ISO 8601 last update timestamp")
14349
+ });
14350
+ var milestoneSchema = external_exports.object({
14351
+ id: external_exports.string().describe("Milestone UUID"),
14352
+ name: external_exports.string().describe("Milestone name"),
14353
+ description: external_exports.string().describe("Milestone description"),
14354
+ target_date: external_exports.string().describe("Target date (YYYY-MM-DD), or empty if none"),
14355
+ sort_order: external_exports.number().describe("Sort order within the project")
14356
+ });
14357
+ var statusUpdateSchema = external_exports.object({
14358
+ id: external_exports.string().describe("Status update UUID"),
14359
+ body: external_exports.string().describe("Status update body in markdown"),
14360
+ health: external_exports.string().describe("Health status (onTrack, atRisk, offTrack)"),
14361
+ user_name: external_exports.string().describe("Author display name"),
14362
+ created_at: external_exports.string().describe("ISO 8601 creation timestamp"),
14363
+ updated_at: external_exports.string().describe("ISO 8601 last update timestamp")
14364
+ });
14365
+ var issueHistorySchema = external_exports.object({
14366
+ id: external_exports.string().describe("History entry UUID"),
14367
+ actor_name: external_exports.string().describe("User who made the change"),
14368
+ from_state_name: external_exports.string().describe("Previous state name, or empty"),
14369
+ to_state_name: external_exports.string().describe("New state name, or empty"),
14370
+ from_assignee_name: external_exports.string().describe("Previous assignee, or empty"),
14371
+ to_assignee_name: external_exports.string().describe("New assignee, or empty"),
14372
+ from_priority: external_exports.number().describe("Previous priority, or 0"),
14373
+ to_priority: external_exports.number().describe("New priority, or 0"),
14374
+ created_at: external_exports.string().describe("ISO 8601 timestamp of the change")
14375
+ });
14344
14376
  var mapIssue = (i) => ({
14345
14377
  id: i?.id ?? "",
14346
14378
  identifier: i?.identifier ?? "",
@@ -14420,6 +14452,299 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
14420
14452
  is_active: c?.isActive ?? false,
14421
14453
  completed_at: c?.completedAt ?? ""
14422
14454
  });
14455
+ var mapAttachment = (a) => ({
14456
+ id: a?.id ?? "",
14457
+ title: a?.title ?? "",
14458
+ subtitle: a?.subtitle ?? "",
14459
+ url: a?.url ?? "",
14460
+ source_type: a?.sourceType ?? "",
14461
+ creator_name: a?.creator?.displayName ?? a?.creator?.name ?? "",
14462
+ created_at: a?.createdAt ?? "",
14463
+ updated_at: a?.updatedAt ?? ""
14464
+ });
14465
+ var mapInitiative = (i) => ({
14466
+ id: i?.id ?? "",
14467
+ name: i?.name ?? "",
14468
+ description: i?.description ?? "",
14469
+ status: i?.status ?? "",
14470
+ color: i?.color ?? "",
14471
+ icon: i?.icon ?? "",
14472
+ owner_name: i?.owner?.displayName ?? i?.owner?.name ?? "",
14473
+ url: i?.url ?? "",
14474
+ created_at: i?.createdAt ?? "",
14475
+ updated_at: i?.updatedAt ?? ""
14476
+ });
14477
+ var mapDocument = (d) => ({
14478
+ id: d?.id ?? "",
14479
+ title: d?.title ?? "",
14480
+ content: d?.content ?? "",
14481
+ slug_id: d?.slugId ?? "",
14482
+ icon: d?.icon ?? "",
14483
+ creator_name: d?.creator?.displayName ?? d?.creator?.name ?? "",
14484
+ project_name: d?.project?.name ?? "",
14485
+ url: d?.url ?? "",
14486
+ created_at: d?.createdAt ?? "",
14487
+ updated_at: d?.updatedAt ?? ""
14488
+ });
14489
+ var mapMilestone = (m) => ({
14490
+ id: m?.id ?? "",
14491
+ name: m?.name ?? "",
14492
+ description: m?.description ?? "",
14493
+ target_date: m?.targetDate ?? "",
14494
+ sort_order: m?.sortOrder ?? 0
14495
+ });
14496
+ var mapStatusUpdate = (s) => ({
14497
+ id: s?.id ?? "",
14498
+ body: s?.body ?? "",
14499
+ health: s?.health ?? "",
14500
+ user_name: s?.user?.displayName ?? s?.user?.name ?? "",
14501
+ created_at: s?.createdAt ?? "",
14502
+ updated_at: s?.updatedAt ?? ""
14503
+ });
14504
+ var mapIssueHistory = (h) => ({
14505
+ id: h?.id ?? "",
14506
+ actor_name: h?.actor?.displayName ?? h?.actor?.name ?? "",
14507
+ from_state_name: h?.fromState?.name ?? "",
14508
+ to_state_name: h?.toState?.name ?? "",
14509
+ from_assignee_name: h?.fromAssignee?.displayName ?? h?.fromAssignee?.name ?? "",
14510
+ to_assignee_name: h?.toAssignee?.displayName ?? h?.toAssignee?.name ?? "",
14511
+ from_priority: h?.fromPriority ?? 0,
14512
+ to_priority: h?.toPriority ?? 0,
14513
+ created_at: h?.createdAt ?? ""
14514
+ });
14515
+
14516
+ // src/tools/add-issue-label.ts
14517
+ var ISSUE_FIELDS = `
14518
+ id identifier title description priority priorityLabel url
14519
+ createdAt updatedAt dueDate estimate
14520
+ state { name type }
14521
+ assignee { name displayName }
14522
+ team { key name }
14523
+ labels { nodes { id name } }
14524
+ project { name }
14525
+ cycle { number }
14526
+ `;
14527
+ var addIssueLabel = defineTool({
14528
+ name: "add_issue_label",
14529
+ displayName: "Add Issue Label",
14530
+ description: "Add a label to an issue without removing existing labels. Unlike update_issue which replaces all labels, this appends.",
14531
+ summary: "Add a label to an issue",
14532
+ icon: "tag",
14533
+ group: "Issues",
14534
+ input: external_exports.object({
14535
+ issue_id: external_exports.string().describe("Issue UUID to add the label to"),
14536
+ label_id: external_exports.string().describe("Label UUID to add (use list_labels to find label IDs)")
14537
+ }),
14538
+ output: external_exports.object({
14539
+ issue: issueSchema.describe("The updated issue with the new label")
14540
+ }),
14541
+ handle: async (params) => {
14542
+ const current = await graphql(
14543
+ `query GetIssueLabels($id: String!) {
14544
+ issue(id: $id) {
14545
+ labels { nodes { id } }
14546
+ }
14547
+ }`,
14548
+ { id: params.issue_id }
14549
+ );
14550
+ if (!current.issue) throw ToolError.notFound("Issue not found");
14551
+ const existingIds = (current.issue.labels?.nodes ?? []).map((l) => l.id);
14552
+ if (existingIds.includes(params.label_id)) {
14553
+ const data2 = await graphql(
14554
+ `query GetIssue($id: String!) { issue(id: $id) { ${ISSUE_FIELDS} } }`,
14555
+ { id: params.issue_id }
14556
+ );
14557
+ return { issue: mapIssue(data2.issue) };
14558
+ }
14559
+ const labelIds = [...existingIds, params.label_id];
14560
+ const data = await graphql(
14561
+ `mutation AddIssueLabel($id: String!, $input: IssueUpdateInput!) {
14562
+ issueUpdate(id: $id, input: $input) {
14563
+ success
14564
+ issue { ${ISSUE_FIELDS} }
14565
+ }
14566
+ }`,
14567
+ { id: params.issue_id, input: { labelIds } }
14568
+ );
14569
+ if (!data.issueUpdate?.issue) throw ToolError.internal("Failed to add label \u2014 no issue returned");
14570
+ return { issue: mapIssue(data.issueUpdate.issue) };
14571
+ }
14572
+ });
14573
+
14574
+ // src/tools/add-issue-subscriber.ts
14575
+ var addIssueSubscriber = defineTool({
14576
+ name: "add_issue_subscriber",
14577
+ displayName: "Add Issue Subscriber",
14578
+ description: "Subscribe a user to receive notifications for a Linear issue.",
14579
+ summary: "Subscribe a user to an issue",
14580
+ icon: "bell-plus",
14581
+ group: "Issues",
14582
+ input: external_exports.object({
14583
+ issue_id: external_exports.string().describe("Issue UUID to subscribe to"),
14584
+ subscriber_id: external_exports.string().describe("User UUID to subscribe (use list_users to find user IDs)")
14585
+ }),
14586
+ output: external_exports.object({
14587
+ success: external_exports.boolean().describe("Whether the subscription was successfully created")
14588
+ }),
14589
+ handle: async (params) => {
14590
+ const data = await graphql(
14591
+ `mutation AddIssueSubscriber($id: String!, $userId: String!) {
14592
+ issueSubscribe(id: $id, userId: $userId) {
14593
+ success
14594
+ }
14595
+ }`,
14596
+ { id: params.issue_id, userId: params.subscriber_id }
14597
+ );
14598
+ if (!data.issueSubscribe) throw ToolError.internal("Failed to subscribe \u2014 no response");
14599
+ return { success: data.issueSubscribe.success };
14600
+ }
14601
+ });
14602
+
14603
+ // src/tools/archive-issue.ts
14604
+ var archiveIssue = defineTool({
14605
+ name: "archive_issue",
14606
+ displayName: "Archive Issue",
14607
+ description: "Archive a Linear issue. Archived issues are hidden from default views but can be restored.",
14608
+ summary: "Archive an issue",
14609
+ icon: "archive",
14610
+ group: "Issues",
14611
+ input: external_exports.object({
14612
+ issue_id: external_exports.string().describe("Issue UUID to archive")
14613
+ }),
14614
+ output: external_exports.object({
14615
+ success: external_exports.boolean().describe("Whether the issue was successfully archived")
14616
+ }),
14617
+ handle: async (params) => {
14618
+ const data = await graphql(
14619
+ `mutation ArchiveIssue($id: String!) {
14620
+ issueArchive(id: $id) {
14621
+ success
14622
+ }
14623
+ }`,
14624
+ { id: params.issue_id }
14625
+ );
14626
+ if (!data.issueArchive) throw ToolError.internal("Issue archive failed \u2014 no response");
14627
+ return { success: data.issueArchive.success };
14628
+ }
14629
+ });
14630
+
14631
+ // src/tools/batch-update-issues.ts
14632
+ var ISSUE_FIELDS2 = `
14633
+ id identifier title description priority priorityLabel url
14634
+ createdAt updatedAt dueDate estimate
14635
+ state { name type }
14636
+ assignee { name displayName }
14637
+ team { key name }
14638
+ labels { nodes { name } }
14639
+ project { name }
14640
+ cycle { number }
14641
+ `;
14642
+ var batchUpdateIssues = defineTool({
14643
+ name: "batch_update_issues",
14644
+ displayName: "Batch Update Issues",
14645
+ description: "Apply the same update to multiple issues at once. All specified fields are applied to every issue in the batch. Maximum 25 issues per call.",
14646
+ summary: "Update multiple issues at once",
14647
+ icon: "layers",
14648
+ group: "Issues",
14649
+ input: external_exports.object({
14650
+ issue_ids: external_exports.array(external_exports.string()).min(1).max(25).describe("Array of issue UUIDs to update (1\u201325)"),
14651
+ state_id: external_exports.string().optional().describe("New workflow state UUID"),
14652
+ assignee_id: external_exports.string().optional().describe("New assignee UUID"),
14653
+ priority: external_exports.number().optional().describe("New priority (0=none, 1=urgent, 2=high, 3=medium, 4=low)"),
14654
+ project_id: external_exports.string().optional().describe("Move to this project UUID"),
14655
+ cycle_id: external_exports.string().optional().describe("Assign to this cycle UUID"),
14656
+ label_ids: external_exports.array(external_exports.string()).optional().describe("Replace labels with these label UUIDs"),
14657
+ due_date: external_exports.string().optional().describe("New due date in YYYY-MM-DD format")
14658
+ }),
14659
+ output: external_exports.object({
14660
+ issues: external_exports.array(issueSchema).describe("The updated issues"),
14661
+ failed: external_exports.array(external_exports.string()).describe("Issue UUIDs that failed to update")
14662
+ }),
14663
+ handle: async (params) => {
14664
+ const input = {};
14665
+ if (params.state_id !== void 0) input.stateId = params.state_id;
14666
+ if (params.assignee_id !== void 0) input.assigneeId = params.assignee_id;
14667
+ if (params.priority !== void 0) input.priority = params.priority;
14668
+ if (params.project_id !== void 0) input.projectId = params.project_id;
14669
+ if (params.cycle_id !== void 0) input.cycleId = params.cycle_id;
14670
+ if (params.label_ids !== void 0) input.labelIds = params.label_ids;
14671
+ if (params.due_date !== void 0) input.dueDate = params.due_date;
14672
+ if (Object.keys(input).length === 0) {
14673
+ throw ToolError.validation("No update fields specified \u2014 provide at least one field to update");
14674
+ }
14675
+ const varDefs = params.issue_ids.map((_, i) => `$id${i}: String!`).join(", ");
14676
+ const aliases = params.issue_ids.map(
14677
+ (_, i) => `issue${i}: issueUpdate(id: $id${i}, input: $input) {
14678
+ success
14679
+ issue { ${ISSUE_FIELDS2} }
14680
+ }`
14681
+ );
14682
+ const query = `mutation BatchUpdateIssues($input: IssueUpdateInput!, ${varDefs}) {
14683
+ ${aliases.join("\n")}
14684
+ }`;
14685
+ const vars = { input };
14686
+ for (let i = 0; i < params.issue_ids.length; i++) {
14687
+ vars[`id${i}`] = params.issue_ids[i];
14688
+ }
14689
+ const data = await graphql(query, vars);
14690
+ const issues = [];
14691
+ const failed = [];
14692
+ for (let i = 0; i < params.issue_ids.length; i++) {
14693
+ const result = data[`issue${i}`];
14694
+ if (result?.success && result.issue) {
14695
+ issues.push(mapIssue(result.issue));
14696
+ } else {
14697
+ const issueId = params.issue_ids[i];
14698
+ if (issueId) failed.push(issueId);
14699
+ }
14700
+ }
14701
+ return { issues, failed };
14702
+ }
14703
+ });
14704
+
14705
+ // src/tools/create-attachment.ts
14706
+ var createAttachment = defineTool({
14707
+ name: "create_attachment",
14708
+ displayName: "Create Attachment",
14709
+ description: "Link a URL (PR, document, design file, etc.) to a Linear issue as an attachment.",
14710
+ summary: "Link a URL to an issue",
14711
+ icon: "paperclip",
14712
+ group: "Issues",
14713
+ input: external_exports.object({
14714
+ issue_id: external_exports.string().describe("Issue UUID to attach to"),
14715
+ url: external_exports.string().describe("URL to attach (e.g. GitHub PR, Figma file, Google Doc)"),
14716
+ title: external_exports.string().describe("Attachment title"),
14717
+ subtitle: external_exports.string().optional().describe("Attachment subtitle or description")
14718
+ }),
14719
+ output: external_exports.object({
14720
+ attachment: attachmentSchema.describe("The newly created attachment")
14721
+ }),
14722
+ handle: async (params) => {
14723
+ const input = {
14724
+ issueId: params.issue_id,
14725
+ url: params.url,
14726
+ title: params.title
14727
+ };
14728
+ if (params.subtitle !== void 0) input.subtitle = params.subtitle;
14729
+ const data = await graphql(
14730
+ `mutation CreateAttachment($input: AttachmentCreateInput!) {
14731
+ attachmentCreate(input: $input) {
14732
+ success
14733
+ attachment {
14734
+ id title subtitle url sourceType createdAt updatedAt
14735
+ creator { name displayName }
14736
+ }
14737
+ }
14738
+ }`,
14739
+ { input }
14740
+ );
14741
+ if (!data.attachmentCreate?.attachment)
14742
+ throw ToolError.internal("Attachment creation failed \u2014 no attachment returned");
14743
+ return {
14744
+ attachment: mapAttachment(data.attachmentCreate.attachment)
14745
+ };
14746
+ }
14747
+ });
14423
14748
 
14424
14749
  // src/tools/create-comment.ts
14425
14750
  var createComment = defineTool({
@@ -14454,6 +14779,94 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
14454
14779
  }
14455
14780
  });
14456
14781
 
14782
+ // src/tools/create-document.ts
14783
+ var createDocument = defineTool({
14784
+ name: "create_document",
14785
+ displayName: "Create Document",
14786
+ description: "Create a new document in Linear, optionally associated with a project.",
14787
+ summary: "Create a new document",
14788
+ icon: "file-plus",
14789
+ group: "Documents",
14790
+ input: external_exports.object({
14791
+ title: external_exports.string().describe("Document title"),
14792
+ content: external_exports.string().optional().describe("Document content in markdown"),
14793
+ project_id: external_exports.string().optional().describe("Project UUID to associate the document with"),
14794
+ icon: external_exports.string().optional().describe("Icon emoji for the document")
14795
+ }),
14796
+ output: external_exports.object({
14797
+ document: documentSchema.describe("The newly created document")
14798
+ }),
14799
+ handle: async (params) => {
14800
+ const input = {
14801
+ title: params.title
14802
+ };
14803
+ if (params.content !== void 0) input.content = params.content;
14804
+ if (params.project_id) input.projectId = params.project_id;
14805
+ if (params.icon) input.icon = params.icon;
14806
+ const data = await graphql(
14807
+ `mutation CreateDocument($input: DocumentCreateInput!) {
14808
+ documentCreate(input: $input) {
14809
+ success
14810
+ document {
14811
+ id title content slugId icon url createdAt updatedAt
14812
+ creator { name displayName }
14813
+ project { name }
14814
+ }
14815
+ }
14816
+ }`,
14817
+ { input }
14818
+ );
14819
+ if (!data.documentCreate?.document) throw ToolError.internal("Document creation failed \u2014 no document returned");
14820
+ return { document: mapDocument(data.documentCreate.document) };
14821
+ }
14822
+ });
14823
+
14824
+ // src/tools/create-initiative.ts
14825
+ var createInitiative = defineTool({
14826
+ name: "create_initiative",
14827
+ displayName: "Create Initiative",
14828
+ description: "Create a new initiative in Linear.",
14829
+ summary: "Create a new initiative",
14830
+ icon: "target",
14831
+ group: "Initiatives",
14832
+ input: external_exports.object({
14833
+ name: external_exports.string().describe("Initiative name"),
14834
+ description: external_exports.string().optional().describe("Initiative description in markdown"),
14835
+ status: external_exports.enum(["Planned", "Active", "Completed"]).optional().describe("Initiative status"),
14836
+ color: external_exports.string().optional().describe("Color hex code (e.g. #FF0000)"),
14837
+ owner_id: external_exports.string().optional().describe("Owner user UUID")
14838
+ }),
14839
+ output: external_exports.object({
14840
+ initiative: initiativeSchema.describe("The newly created initiative")
14841
+ }),
14842
+ handle: async (params) => {
14843
+ const input = {
14844
+ name: params.name
14845
+ };
14846
+ if (params.description !== void 0) input.description = params.description;
14847
+ if (params.status) input.status = params.status;
14848
+ if (params.color) input.color = params.color;
14849
+ if (params.owner_id) input.ownerId = params.owner_id;
14850
+ const data = await graphql(
14851
+ `mutation CreateInitiative($input: InitiativeCreateInput!) {
14852
+ initiativeCreate(input: $input) {
14853
+ success
14854
+ initiative {
14855
+ id name description status color icon url createdAt updatedAt
14856
+ owner { name displayName }
14857
+ }
14858
+ }
14859
+ }`,
14860
+ { input }
14861
+ );
14862
+ if (!data.initiativeCreate?.initiative)
14863
+ throw ToolError.internal("Initiative creation failed \u2014 no initiative returned");
14864
+ return {
14865
+ initiative: mapInitiative(data.initiativeCreate.initiative)
14866
+ };
14867
+ }
14868
+ });
14869
+
14457
14870
  // src/tools/create-issue.ts
14458
14871
  var createIssue = defineTool({
14459
14872
  name: "create_issue",
@@ -14517,6 +14930,58 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
14517
14930
  }
14518
14931
  });
14519
14932
 
14933
+ // src/tools/create-issue-relation.ts
14934
+ var createIssueRelation = defineTool({
14935
+ name: "create_issue_relation",
14936
+ displayName: "Create Issue Relation",
14937
+ description: "Create a relation between two Linear issues (blocks, is blocked by, relates to, or duplicate of).",
14938
+ summary: "Create a relation between two issues",
14939
+ icon: "link",
14940
+ group: "Issues",
14941
+ input: external_exports.object({
14942
+ issue_id: external_exports.string().describe("UUID of the source issue"),
14943
+ related_issue_id: external_exports.string().describe("UUID of the target issue to relate to"),
14944
+ type: external_exports.enum(["blocks", "blockedBy", "related", "duplicate"]).describe("Relation type: blocks, blockedBy, related, or duplicate")
14945
+ }),
14946
+ output: external_exports.object({
14947
+ relation: external_exports.object({
14948
+ id: external_exports.string().describe("Relation UUID"),
14949
+ type: external_exports.string().describe("Relation type"),
14950
+ related_issue_identifier: external_exports.string().describe("Related issue identifier (e.g. ENG-123)")
14951
+ })
14952
+ }),
14953
+ handle: async (params) => {
14954
+ const data = await graphql(
14955
+ `mutation CreateIssueRelation($input: IssueRelationCreateInput!) {
14956
+ issueRelationCreate(input: $input) {
14957
+ success
14958
+ issueRelation {
14959
+ id type
14960
+ relatedIssue { identifier }
14961
+ }
14962
+ }
14963
+ }`,
14964
+ {
14965
+ input: {
14966
+ issueId: params.issue_id,
14967
+ relatedIssueId: params.related_issue_id,
14968
+ type: params.type
14969
+ }
14970
+ }
14971
+ );
14972
+ if (!data.issueRelationCreate?.issueRelation)
14973
+ throw ToolError.internal("Issue relation creation failed \u2014 no relation returned");
14974
+ const rel = data.issueRelationCreate.issueRelation;
14975
+ return {
14976
+ relation: {
14977
+ id: rel.id ?? "",
14978
+ type: rel.type ?? "",
14979
+ related_issue_identifier: rel.relatedIssue?.identifier ?? ""
14980
+ }
14981
+ };
14982
+ }
14983
+ });
14984
+
14520
14985
  // src/tools/create-label.ts
14521
14986
  var createLabel = defineTool({
14522
14987
  name: "create_label",
@@ -14559,17 +15024,60 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
14559
15024
  }
14560
15025
  });
14561
15026
 
14562
- // src/tools/create-project.ts
14563
- var createProject = defineTool({
14564
- name: "create_project",
14565
- displayName: "Create Project",
14566
- description: "Create a new project in Linear.",
14567
- summary: "Create a new project",
14568
- icon: "folder-plus",
15027
+ // src/tools/create-milestone.ts
15028
+ var createMilestone = defineTool({
15029
+ name: "create_milestone",
15030
+ displayName: "Create Milestone",
15031
+ description: "Create a new milestone in a Linear project.",
15032
+ summary: "Create a new project milestone",
15033
+ icon: "milestone",
14569
15034
  group: "Projects",
14570
15035
  input: external_exports.object({
14571
- name: external_exports.string().describe("Project name"),
14572
- description: external_exports.string().optional().describe("Project description"),
15036
+ project_id: external_exports.string().describe("Project UUID to create the milestone in"),
15037
+ name: external_exports.string().describe("Milestone name"),
15038
+ description: external_exports.string().optional().describe("Milestone description"),
15039
+ target_date: external_exports.string().optional().describe("Target date in YYYY-MM-DD format")
15040
+ }),
15041
+ output: external_exports.object({
15042
+ milestone: milestoneSchema.describe("The newly created milestone")
15043
+ }),
15044
+ handle: async (params) => {
15045
+ const input = {
15046
+ projectId: params.project_id,
15047
+ name: params.name
15048
+ };
15049
+ if (params.description !== void 0) input.description = params.description;
15050
+ if (params.target_date) input.targetDate = params.target_date;
15051
+ const data = await graphql(
15052
+ `mutation CreateMilestone($input: ProjectMilestoneCreateInput!) {
15053
+ projectMilestoneCreate(input: $input) {
15054
+ success
15055
+ projectMilestone {
15056
+ id name description targetDate sortOrder
15057
+ }
15058
+ }
15059
+ }`,
15060
+ { input }
15061
+ );
15062
+ if (!data.projectMilestoneCreate?.projectMilestone)
15063
+ throw ToolError.internal("Milestone creation failed \u2014 no milestone returned");
15064
+ return {
15065
+ milestone: mapMilestone(data.projectMilestoneCreate.projectMilestone)
15066
+ };
15067
+ }
15068
+ });
15069
+
15070
+ // src/tools/create-project.ts
15071
+ var createProject = defineTool({
15072
+ name: "create_project",
15073
+ displayName: "Create Project",
15074
+ description: "Create a new project in Linear.",
15075
+ summary: "Create a new project",
15076
+ icon: "folder-plus",
15077
+ group: "Projects",
15078
+ input: external_exports.object({
15079
+ name: external_exports.string().describe("Project name"),
15080
+ description: external_exports.string().optional().describe("Project description"),
14573
15081
  team_ids: external_exports.array(external_exports.string()).optional().describe("Array of team UUIDs to associate with the project"),
14574
15082
  state: external_exports.string().optional().describe("Project state (planned, started, paused, completed, canceled)"),
14575
15083
  target_date: external_exports.string().optional().describe("Target completion date in YYYY-MM-DD format")
@@ -14605,6 +15113,99 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
14605
15113
  }
14606
15114
  });
14607
15115
 
15116
+ // src/tools/create-project-update.ts
15117
+ var createProjectUpdate = defineTool({
15118
+ name: "create_project_update",
15119
+ displayName: "Create Project Update",
15120
+ description: "Post a status update (health report) on a Linear project.",
15121
+ summary: "Post a project status update",
15122
+ icon: "activity",
15123
+ group: "Projects",
15124
+ input: external_exports.object({
15125
+ project_id: external_exports.string().describe("Project UUID to post the update on"),
15126
+ body: external_exports.string().describe("Status update body in markdown"),
15127
+ health: external_exports.enum(["onTrack", "atRisk", "offTrack"]).describe("Project health status")
15128
+ }),
15129
+ output: external_exports.object({
15130
+ update: statusUpdateSchema.describe("The newly created status update")
15131
+ }),
15132
+ handle: async (params) => {
15133
+ const data = await graphql(
15134
+ `mutation CreateProjectUpdate($input: ProjectUpdateCreateInput!) {
15135
+ projectUpdateCreate(input: $input) {
15136
+ success
15137
+ projectUpdate {
15138
+ id body health createdAt updatedAt
15139
+ user { name displayName }
15140
+ }
15141
+ }
15142
+ }`,
15143
+ { input: { projectId: params.project_id, body: params.body, health: params.health } }
15144
+ );
15145
+ if (!data.projectUpdateCreate?.projectUpdate)
15146
+ throw ToolError.internal("Project update creation failed \u2014 no update returned");
15147
+ return {
15148
+ update: mapStatusUpdate(data.projectUpdateCreate.projectUpdate)
15149
+ };
15150
+ }
15151
+ });
15152
+
15153
+ // src/tools/delete-attachment.ts
15154
+ var deleteAttachment = defineTool({
15155
+ name: "delete_attachment",
15156
+ displayName: "Delete Attachment",
15157
+ description: "Delete an attachment from a Linear issue.",
15158
+ summary: "Delete an attachment",
15159
+ icon: "paperclip",
15160
+ group: "Issues",
15161
+ input: external_exports.object({
15162
+ attachment_id: external_exports.string().describe("Attachment UUID to delete")
15163
+ }),
15164
+ output: external_exports.object({
15165
+ success: external_exports.boolean().describe("Whether the attachment was successfully deleted")
15166
+ }),
15167
+ handle: async (params) => {
15168
+ const data = await graphql(
15169
+ `mutation DeleteAttachment($id: String!) {
15170
+ attachmentDelete(id: $id) {
15171
+ success
15172
+ }
15173
+ }`,
15174
+ { id: params.attachment_id }
15175
+ );
15176
+ if (!data.attachmentDelete) throw ToolError.internal("Attachment deletion failed \u2014 no response");
15177
+ return { success: data.attachmentDelete.success };
15178
+ }
15179
+ });
15180
+
15181
+ // src/tools/delete-comment.ts
15182
+ var deleteComment = defineTool({
15183
+ name: "delete_comment",
15184
+ displayName: "Delete Comment",
15185
+ description: "Delete a comment from a Linear issue.",
15186
+ summary: "Delete a comment",
15187
+ icon: "message-square-x",
15188
+ group: "Comments",
15189
+ input: external_exports.object({
15190
+ comment_id: external_exports.string().describe("Comment UUID to delete")
15191
+ }),
15192
+ output: external_exports.object({
15193
+ success: external_exports.boolean().describe("Whether the comment was successfully deleted")
15194
+ }),
15195
+ handle: async (params) => {
15196
+ const data = await graphql(
15197
+ `mutation DeleteComment($id: String!) {
15198
+ commentDelete(id: $id) {
15199
+ success
15200
+ }
15201
+ }`,
15202
+ { id: params.comment_id }
15203
+ );
15204
+ if (!data.commentDelete) throw ToolError.internal("Comment deletion failed \u2014 no response");
15205
+ return { success: data.commentDelete.success };
15206
+ }
15207
+ });
15208
+
14608
15209
  // src/tools/delete-issue.ts
14609
15210
  var deleteIssue = defineTool({
14610
15211
  name: "delete_issue",
@@ -14633,6 +15234,218 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
14633
15234
  }
14634
15235
  });
14635
15236
 
15237
+ // src/tools/delete-issue-relation.ts
15238
+ var deleteIssueRelation = defineTool({
15239
+ name: "delete_issue_relation",
15240
+ displayName: "Delete Issue Relation",
15241
+ description: "Delete a relation between two Linear issues. Use list_issue_relations to find relation IDs.",
15242
+ summary: "Delete a relation between two issues",
15243
+ icon: "unlink",
15244
+ group: "Issues",
15245
+ input: external_exports.object({
15246
+ relation_id: external_exports.string().describe("Relation UUID to delete (from list_issue_relations)")
15247
+ }),
15248
+ output: external_exports.object({
15249
+ success: external_exports.boolean().describe("Whether the relation was successfully deleted")
15250
+ }),
15251
+ handle: async (params) => {
15252
+ const data = await graphql(
15253
+ `mutation DeleteIssueRelation($id: String!) {
15254
+ issueRelationDelete(id: $id) {
15255
+ success
15256
+ }
15257
+ }`,
15258
+ { id: params.relation_id }
15259
+ );
15260
+ if (!data.issueRelationDelete) throw ToolError.internal("Issue relation deletion failed \u2014 no response");
15261
+ return { success: data.issueRelationDelete.success };
15262
+ }
15263
+ });
15264
+
15265
+ // src/tools/delete-label.ts
15266
+ var deleteLabel = defineTool({
15267
+ name: "delete_label",
15268
+ displayName: "Delete Label",
15269
+ description: "Delete a Linear issue label. Labels will be removed from all issues that use them.",
15270
+ summary: "Delete a label",
15271
+ icon: "tag",
15272
+ group: "Workflow",
15273
+ input: external_exports.object({
15274
+ label_id: external_exports.string().describe("Label UUID to delete")
15275
+ }),
15276
+ output: external_exports.object({
15277
+ success: external_exports.boolean().describe("Whether the label was successfully deleted")
15278
+ }),
15279
+ handle: async (params) => {
15280
+ const data = await graphql(
15281
+ `mutation DeleteLabel($id: String!) {
15282
+ issueLabelDelete(id: $id) {
15283
+ success
15284
+ }
15285
+ }`,
15286
+ { id: params.label_id }
15287
+ );
15288
+ if (!data.issueLabelDelete) throw ToolError.internal("Label deletion failed \u2014 no response");
15289
+ return { success: data.issueLabelDelete.success };
15290
+ }
15291
+ });
15292
+
15293
+ // src/tools/delete-project-update.ts
15294
+ var deleteProjectUpdate = defineTool({
15295
+ name: "delete_project_update",
15296
+ displayName: "Delete Project Update",
15297
+ description: "Delete a status update from a Linear project.",
15298
+ summary: "Delete a project status update",
15299
+ icon: "activity",
15300
+ group: "Projects",
15301
+ input: external_exports.object({
15302
+ update_id: external_exports.string().describe("Project update UUID to delete")
15303
+ }),
15304
+ output: external_exports.object({
15305
+ success: external_exports.boolean().describe("Whether the update was successfully deleted")
15306
+ }),
15307
+ handle: async (params) => {
15308
+ const data = await graphql(
15309
+ `mutation DeleteProjectUpdate($id: String!) {
15310
+ projectUpdateDelete(id: $id) {
15311
+ success
15312
+ }
15313
+ }`,
15314
+ { id: params.update_id }
15315
+ );
15316
+ if (!data.projectUpdateDelete) throw ToolError.internal("Project update deletion failed \u2014 no response");
15317
+ return { success: data.projectUpdateDelete.success };
15318
+ }
15319
+ });
15320
+
15321
+ // src/tools/get-attachment.ts
15322
+ var getAttachment = defineTool({
15323
+ name: "get_attachment",
15324
+ displayName: "Get Attachment",
15325
+ description: "Get detailed information about a single attachment by its UUID.",
15326
+ summary: "Get details of a single attachment",
15327
+ icon: "paperclip",
15328
+ group: "Issues",
15329
+ input: external_exports.object({
15330
+ attachment_id: external_exports.string().describe("Attachment UUID")
15331
+ }),
15332
+ output: external_exports.object({
15333
+ attachment: attachmentSchema.describe("The requested attachment")
15334
+ }),
15335
+ handle: async (params) => {
15336
+ const data = await graphql(
15337
+ `query GetAttachment($id: String!) {
15338
+ attachment(id: $id) {
15339
+ id title subtitle url sourceType createdAt updatedAt
15340
+ creator { name displayName }
15341
+ }
15342
+ }`,
15343
+ { id: params.attachment_id }
15344
+ );
15345
+ if (!data.attachment) throw ToolError.notFound("Attachment not found");
15346
+ return { attachment: mapAttachment(data.attachment) };
15347
+ }
15348
+ });
15349
+
15350
+ // src/tools/get-cycle.ts
15351
+ var getCycle = defineTool({
15352
+ name: "get_cycle",
15353
+ displayName: "Get Cycle",
15354
+ description: "Get detailed information about a single cycle (sprint) by its UUID.",
15355
+ summary: "Get details of a single cycle",
15356
+ icon: "refresh-cw",
15357
+ group: "Workflow",
15358
+ input: external_exports.object({
15359
+ cycle_id: external_exports.string().describe("Cycle UUID")
15360
+ }),
15361
+ output: external_exports.object({
15362
+ cycle: cycleSchema.describe("The requested cycle")
15363
+ }),
15364
+ handle: async (params) => {
15365
+ const data = await graphql(
15366
+ `query GetCycle($id: String!) {
15367
+ cycle(id: $id) {
15368
+ id number name startsAt endsAt completedAt
15369
+ }
15370
+ }`,
15371
+ { id: params.cycle_id }
15372
+ );
15373
+ if (!data.cycle) throw ToolError.notFound("Cycle not found");
15374
+ return { cycle: mapCycle(data.cycle) };
15375
+ }
15376
+ });
15377
+
15378
+ // src/tools/get-document.ts
15379
+ var getDocument = defineTool({
15380
+ name: "get_document",
15381
+ displayName: "Get Document",
15382
+ description: "Get detailed information about a single Linear document by its UUID.",
15383
+ summary: "Get details of a single document",
15384
+ icon: "file-text",
15385
+ group: "Documents",
15386
+ input: external_exports.object({
15387
+ document_id: external_exports.string().describe("Document UUID")
15388
+ }),
15389
+ output: external_exports.object({
15390
+ document: documentSchema.describe("The requested document")
15391
+ }),
15392
+ handle: async (params) => {
15393
+ const data = await graphql(
15394
+ `query GetDocument($id: String!) {
15395
+ document(id: $id) {
15396
+ id title content slugId icon url createdAt updatedAt
15397
+ creator { name displayName }
15398
+ project { name }
15399
+ }
15400
+ }`,
15401
+ { id: params.document_id }
15402
+ );
15403
+ if (!data.document) throw ToolError.notFound("Document not found");
15404
+ return { document: mapDocument(data.document) };
15405
+ }
15406
+ });
15407
+
15408
+ // src/tools/get-initiative.ts
15409
+ var getInitiative = defineTool({
15410
+ name: "get_initiative",
15411
+ displayName: "Get Initiative",
15412
+ description: "Get detailed information about a single Linear initiative by its UUID.",
15413
+ summary: "Get details of a single initiative",
15414
+ icon: "target",
15415
+ group: "Initiatives",
15416
+ input: external_exports.object({
15417
+ initiative_id: external_exports.string().describe("Initiative UUID")
15418
+ }),
15419
+ output: external_exports.object({
15420
+ initiative: initiativeSchema.describe("The requested initiative"),
15421
+ projects: external_exports.array(projectSchema).describe("Projects associated with this initiative")
15422
+ }),
15423
+ handle: async (params) => {
15424
+ const data = await graphql(
15425
+ `query GetInitiative($id: String!) {
15426
+ initiative(id: $id) {
15427
+ id name description status color icon url createdAt updatedAt
15428
+ owner { name displayName }
15429
+ projects {
15430
+ nodes {
15431
+ id name description url createdAt updatedAt
15432
+ status { name }
15433
+ lead { name displayName }
15434
+ targetDate startDate
15435
+ }
15436
+ }
15437
+ }
15438
+ }`,
15439
+ { id: params.initiative_id }
15440
+ );
15441
+ if (!data.initiative) throw ToolError.notFound("Initiative not found");
15442
+ return {
15443
+ initiative: mapInitiative(data.initiative),
15444
+ projects: (data.initiative.projects?.nodes ?? []).map((p) => mapProject(p))
15445
+ };
15446
+ }
15447
+ });
15448
+
14636
15449
  // src/tools/get-issue.ts
14637
15450
  var getIssue = defineTool({
14638
15451
  name: "get_issue",
@@ -14692,6 +15505,34 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
14692
15505
  }
14693
15506
  });
14694
15507
 
15508
+ // src/tools/get-milestone.ts
15509
+ var getMilestone = defineTool({
15510
+ name: "get_milestone",
15511
+ displayName: "Get Milestone",
15512
+ description: "Get detailed information about a single project milestone by its UUID.",
15513
+ summary: "Get details of a single milestone",
15514
+ icon: "milestone",
15515
+ group: "Projects",
15516
+ input: external_exports.object({
15517
+ milestone_id: external_exports.string().describe("Milestone UUID")
15518
+ }),
15519
+ output: external_exports.object({
15520
+ milestone: milestoneSchema.describe("The requested milestone")
15521
+ }),
15522
+ handle: async (params) => {
15523
+ const data = await graphql(
15524
+ `query GetMilestone($id: String!) {
15525
+ projectMilestone(id: $id) {
15526
+ id name description targetDate sortOrder
15527
+ }
15528
+ }`,
15529
+ { id: params.milestone_id }
15530
+ );
15531
+ if (!data.projectMilestone) throw ToolError.notFound("Milestone not found");
15532
+ return { milestone: mapMilestone(data.projectMilestone) };
15533
+ }
15534
+ });
15535
+
14695
15536
  // src/tools/get-project.ts
14696
15537
  var getProject = defineTool({
14697
15538
  name: "get_project",
@@ -14722,6 +15563,62 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
14722
15563
  }
14723
15564
  });
14724
15565
 
15566
+ // src/tools/get-team.ts
15567
+ var getTeam = defineTool({
15568
+ name: "get_team",
15569
+ displayName: "Get Team",
15570
+ description: "Get detailed information about a single Linear team by its UUID.",
15571
+ summary: "Get details of a single team",
15572
+ icon: "users",
15573
+ group: "Teams & Users",
15574
+ input: external_exports.object({
15575
+ team_id: external_exports.string().describe("Team UUID")
15576
+ }),
15577
+ output: external_exports.object({
15578
+ team: teamSchema.describe("The requested team")
15579
+ }),
15580
+ handle: async (params) => {
15581
+ const data = await graphql(
15582
+ `query GetTeam($id: String!) {
15583
+ team(id: $id) {
15584
+ id key name description
15585
+ }
15586
+ }`,
15587
+ { id: params.team_id }
15588
+ );
15589
+ if (!data.team) throw ToolError.notFound("Team not found");
15590
+ return { team: mapTeam(data.team) };
15591
+ }
15592
+ });
15593
+
15594
+ // src/tools/get-user.ts
15595
+ var getUser = defineTool({
15596
+ name: "get_user",
15597
+ displayName: "Get User",
15598
+ description: "Get detailed information about a single Linear user by their UUID.",
15599
+ summary: "Get details of a single user",
15600
+ icon: "user",
15601
+ group: "Teams & Users",
15602
+ input: external_exports.object({
15603
+ user_id: external_exports.string().describe("User UUID")
15604
+ }),
15605
+ output: external_exports.object({
15606
+ user: userSchema.describe("The requested user")
15607
+ }),
15608
+ handle: async (params) => {
15609
+ const data = await graphql(
15610
+ `query GetUser($id: String!) {
15611
+ user(id: $id) {
15612
+ id name email displayName active admin
15613
+ }
15614
+ }`,
15615
+ { id: params.user_id }
15616
+ );
15617
+ if (!data.user) throw ToolError.notFound("User not found");
15618
+ return { user: mapUser(data.user) };
15619
+ }
15620
+ });
15621
+
14725
15622
  // src/tools/get-viewer.ts
14726
15623
  var getViewer = defineTool({
14727
15624
  name: "get_viewer",
@@ -14753,6 +15650,51 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
14753
15650
  }
14754
15651
  });
14755
15652
 
15653
+ // src/tools/list-attachments.ts
15654
+ var listAttachments = defineTool({
15655
+ name: "list_attachments",
15656
+ displayName: "List Attachments",
15657
+ description: "List attachments (linked PRs, documents, URLs) on a Linear issue.",
15658
+ summary: "List attachments on an issue",
15659
+ icon: "paperclip",
15660
+ group: "Issues",
15661
+ input: external_exports.object({
15662
+ issue_id: external_exports.string().describe("Issue UUID to list attachments for"),
15663
+ limit: external_exports.number().optional().describe("Maximum number of attachments to return (default 25, max 50)"),
15664
+ after: external_exports.string().optional().describe("Pagination cursor from a previous response")
15665
+ }),
15666
+ output: external_exports.object({
15667
+ attachments: external_exports.array(attachmentSchema).describe("List of attachments on the issue"),
15668
+ pagination: paginationSchema.describe("Pagination info for fetching more results")
15669
+ }),
15670
+ handle: async (params) => {
15671
+ const limit = Math.min(params.limit ?? 25, 50);
15672
+ const data = await graphql(
15673
+ `query ListAttachments($id: String!, $first: Int, $after: String) {
15674
+ issue(id: $id) {
15675
+ attachments(first: $first, after: $after) {
15676
+ nodes {
15677
+ id title subtitle url sourceType createdAt updatedAt
15678
+ creator { name displayName }
15679
+ }
15680
+ pageInfo { hasNextPage endCursor }
15681
+ }
15682
+ }
15683
+ }`,
15684
+ { id: params.issue_id, first: limit, after: params.after }
15685
+ );
15686
+ if (!data.issue) throw ToolError.notFound("Issue not found");
15687
+ const result = data.issue.attachments;
15688
+ return {
15689
+ attachments: result.nodes.map((n) => mapAttachment(n)),
15690
+ pagination: {
15691
+ has_next_page: result.pageInfo?.hasNextPage ?? false,
15692
+ end_cursor: result.pageInfo?.endCursor ?? ""
15693
+ }
15694
+ };
15695
+ }
15696
+ });
15697
+
14756
15698
  // src/tools/list-comments.ts
14757
15699
  var listComments = defineTool({
14758
15700
  name: "list_comments",
@@ -14842,6 +15784,150 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
14842
15784
  }
14843
15785
  });
14844
15786
 
15787
+ // src/tools/list-documents.ts
15788
+ var listDocuments = defineTool({
15789
+ name: "list_documents",
15790
+ displayName: "List Documents",
15791
+ description: "List documents in the Linear workspace, optionally filtered by project.",
15792
+ summary: "List documents",
15793
+ icon: "file-text",
15794
+ group: "Documents",
15795
+ input: external_exports.object({
15796
+ project_id: external_exports.string().optional().describe("Filter by project UUID"),
15797
+ limit: external_exports.number().optional().describe("Maximum number of results to return (default 25, max 50)"),
15798
+ after: external_exports.string().optional().describe("Pagination cursor from a previous response")
15799
+ }),
15800
+ output: external_exports.object({
15801
+ documents: external_exports.array(documentSchema).describe("List of documents"),
15802
+ pagination: paginationSchema.describe("Pagination info for fetching more results")
15803
+ }),
15804
+ handle: async (params) => {
15805
+ const limit = Math.min(params.limit ?? 25, 50);
15806
+ const filter = {};
15807
+ if (params.project_id) filter.project = { id: { eq: params.project_id } };
15808
+ const filterArg = Object.keys(filter).length > 0 ? filter : void 0;
15809
+ const data = await graphql(
15810
+ `query ListDocuments($first: Int, $after: String, $filter: DocumentFilter) {
15811
+ documents(first: $first, after: $after, filter: $filter) {
15812
+ nodes {
15813
+ id title content slugId icon url createdAt updatedAt
15814
+ creator { name displayName }
15815
+ project { name }
15816
+ }
15817
+ pageInfo { hasNextPage endCursor }
15818
+ }
15819
+ }`,
15820
+ { first: limit, after: params.after, filter: filterArg }
15821
+ );
15822
+ if (!data.documents) throw ToolError.internal("Failed to list documents");
15823
+ const result = data.documents;
15824
+ return {
15825
+ documents: result.nodes.map((n) => mapDocument(n)),
15826
+ pagination: {
15827
+ has_next_page: result.pageInfo?.hasNextPage ?? false,
15828
+ end_cursor: result.pageInfo?.endCursor ?? ""
15829
+ }
15830
+ };
15831
+ }
15832
+ });
15833
+
15834
+ // src/tools/list-initiatives.ts
15835
+ var listInitiatives = defineTool({
15836
+ name: "list_initiatives",
15837
+ displayName: "List Initiatives",
15838
+ description: "List initiatives in the Linear workspace, optionally filtered by status.",
15839
+ summary: "List initiatives",
15840
+ icon: "target",
15841
+ group: "Initiatives",
15842
+ input: external_exports.object({
15843
+ status: external_exports.enum(["Planned", "Active", "Completed"]).optional().describe("Filter by initiative status"),
15844
+ limit: external_exports.number().optional().describe("Maximum number of results to return (default 25, max 50)"),
15845
+ after: external_exports.string().optional().describe("Pagination cursor from a previous response")
15846
+ }),
15847
+ output: external_exports.object({
15848
+ initiatives: external_exports.array(initiativeSchema).describe("List of initiatives"),
15849
+ pagination: paginationSchema.describe("Pagination info for fetching more results")
15850
+ }),
15851
+ handle: async (params) => {
15852
+ const limit = Math.min(params.limit ?? 25, 50);
15853
+ const filter = {};
15854
+ if (params.status) filter.status = { eq: params.status };
15855
+ const filterArg = Object.keys(filter).length > 0 ? filter : void 0;
15856
+ const data = await graphql(
15857
+ `query ListInitiatives($first: Int, $after: String, $filter: InitiativeFilter) {
15858
+ initiatives(first: $first, after: $after, filter: $filter) {
15859
+ nodes {
15860
+ id name description status color icon url createdAt updatedAt
15861
+ owner { name displayName }
15862
+ }
15863
+ pageInfo { hasNextPage endCursor }
15864
+ }
15865
+ }`,
15866
+ { first: limit, after: params.after, filter: filterArg }
15867
+ );
15868
+ if (!data.initiatives) throw ToolError.internal("Failed to list initiatives");
15869
+ const result = data.initiatives;
15870
+ return {
15871
+ initiatives: result.nodes.map((n) => mapInitiative(n)),
15872
+ pagination: {
15873
+ has_next_page: result.pageInfo?.hasNextPage ?? false,
15874
+ end_cursor: result.pageInfo?.endCursor ?? ""
15875
+ }
15876
+ };
15877
+ }
15878
+ });
15879
+
15880
+ // src/tools/list-issue-history.ts
15881
+ var listIssueHistory = defineTool({
15882
+ name: "list_issue_history",
15883
+ displayName: "List Issue History",
15884
+ description: "List the change history (state changes, assignee changes, priority changes) for a Linear issue.",
15885
+ summary: "List issue change history",
15886
+ icon: "history",
15887
+ group: "Issues",
15888
+ input: external_exports.object({
15889
+ issue_id: external_exports.string().describe("Issue UUID to list history for"),
15890
+ limit: external_exports.number().optional().describe("Maximum number of entries to return (default 25, max 50)"),
15891
+ after: external_exports.string().optional().describe("Pagination cursor from a previous response")
15892
+ }),
15893
+ output: external_exports.object({
15894
+ history: external_exports.array(issueHistorySchema).describe("List of history entries"),
15895
+ pagination: paginationSchema.describe("Pagination info for fetching more results")
15896
+ }),
15897
+ handle: async (params) => {
15898
+ const limit = Math.min(params.limit ?? 25, 50);
15899
+ const data = await graphql(
15900
+ `query ListIssueHistory($id: String!, $first: Int, $after: String) {
15901
+ issue(id: $id) {
15902
+ history(first: $first, after: $after) {
15903
+ nodes {
15904
+ id createdAt
15905
+ actor { name displayName }
15906
+ fromState { name }
15907
+ toState { name }
15908
+ fromAssignee { name displayName }
15909
+ toAssignee { name displayName }
15910
+ fromPriority
15911
+ toPriority
15912
+ }
15913
+ pageInfo { hasNextPage endCursor }
15914
+ }
15915
+ }
15916
+ }`,
15917
+ { id: params.issue_id, first: limit, after: params.after }
15918
+ );
15919
+ if (!data.issue) throw ToolError.notFound("Issue not found");
15920
+ const result = data.issue.history;
15921
+ return {
15922
+ history: result.nodes.map((n) => mapIssueHistory(n)),
15923
+ pagination: {
15924
+ has_next_page: result.pageInfo?.hasNextPage ?? false,
15925
+ end_cursor: result.pageInfo?.endCursor ?? ""
15926
+ }
15927
+ };
15928
+ }
15929
+ });
15930
+
14845
15931
  // src/tools/list-issue-relations.ts
14846
15932
  var relationSchema = external_exports.object({
14847
15933
  id: external_exports.string().describe("Relation UUID"),
@@ -14931,61 +16017,273 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
14931
16017
  group: "Workflow",
14932
16018
  input: external_exports.object({}),
14933
16019
  output: external_exports.object({
14934
- labels: external_exports.array(labelSchema).describe("List of issue labels")
16020
+ labels: external_exports.array(labelSchema).describe("List of issue labels")
16021
+ }),
16022
+ handle: async () => {
16023
+ const data = await graphql(
16024
+ `query ListLabels {
16025
+ issueLabels {
16026
+ nodes {
16027
+ id name color description isGroup
16028
+ parent { name }
16029
+ }
16030
+ }
16031
+ }`
16032
+ );
16033
+ return {
16034
+ labels: data.issueLabels.nodes.map((n) => mapLabel(n))
16035
+ };
16036
+ }
16037
+ });
16038
+
16039
+ // src/tools/list-milestones.ts
16040
+ var listMilestones = defineTool({
16041
+ name: "list_milestones",
16042
+ displayName: "List Milestones",
16043
+ description: "List milestones for a Linear project.",
16044
+ summary: "List project milestones",
16045
+ icon: "milestone",
16046
+ group: "Projects",
16047
+ input: external_exports.object({
16048
+ project_id: external_exports.string().describe("Project UUID to list milestones for")
16049
+ }),
16050
+ output: external_exports.object({
16051
+ milestones: external_exports.array(milestoneSchema).describe("List of milestones in the project")
16052
+ }),
16053
+ handle: async (params) => {
16054
+ const data = await graphql(
16055
+ `query ListMilestones($id: String!) {
16056
+ project(id: $id) {
16057
+ projectMilestones {
16058
+ nodes {
16059
+ id name description targetDate sortOrder
16060
+ }
16061
+ }
16062
+ }
16063
+ }`,
16064
+ { id: params.project_id }
16065
+ );
16066
+ if (!data.project) throw ToolError.notFound("Project not found");
16067
+ return {
16068
+ milestones: (data.project.projectMilestones?.nodes ?? []).map(
16069
+ (n) => mapMilestone(n)
16070
+ )
16071
+ };
16072
+ }
16073
+ });
16074
+
16075
+ // src/tools/list-project-labels.ts
16076
+ var listProjectLabels = defineTool({
16077
+ name: "list_project_labels",
16078
+ displayName: "List Project Labels",
16079
+ description: "List labels applied to a specific Linear project.",
16080
+ summary: "List labels on a project",
16081
+ icon: "tag",
16082
+ group: "Projects",
16083
+ input: external_exports.object({
16084
+ project_id: external_exports.string().describe("Project UUID to list labels for")
16085
+ }),
16086
+ output: external_exports.object({
16087
+ labels: external_exports.array(labelSchema).describe("List of labels on the project")
16088
+ }),
16089
+ handle: async (params) => {
16090
+ const data = await graphql(
16091
+ `query ListProjectLabels($id: String!) {
16092
+ project(id: $id) {
16093
+ labels {
16094
+ nodes {
16095
+ id name color description isGroup
16096
+ parent { name }
16097
+ }
16098
+ }
16099
+ }
16100
+ }`,
16101
+ { id: params.project_id }
16102
+ );
16103
+ if (!data.project) throw ToolError.notFound("Project not found");
16104
+ return {
16105
+ labels: (data.project.labels?.nodes ?? []).map((n) => mapLabel(n))
16106
+ };
16107
+ }
16108
+ });
16109
+
16110
+ // src/tools/list-project-updates.ts
16111
+ var listProjectUpdates = defineTool({
16112
+ name: "list_project_updates",
16113
+ displayName: "List Project Updates",
16114
+ description: "List status updates (health reports) for a Linear project.",
16115
+ summary: "List project status updates",
16116
+ icon: "activity",
16117
+ group: "Projects",
16118
+ input: external_exports.object({
16119
+ project_id: external_exports.string().describe("Project UUID to list updates for"),
16120
+ limit: external_exports.number().optional().describe("Maximum number of results to return (default 25, max 50)"),
16121
+ after: external_exports.string().optional().describe("Pagination cursor from a previous response")
16122
+ }),
16123
+ output: external_exports.object({
16124
+ updates: external_exports.array(statusUpdateSchema).describe("List of status updates"),
16125
+ pagination: paginationSchema.describe("Pagination info for fetching more results")
16126
+ }),
16127
+ handle: async (params) => {
16128
+ const limit = Math.min(params.limit ?? 25, 50);
16129
+ const data = await graphql(
16130
+ `query ListProjectUpdates($id: String!, $first: Int, $after: String) {
16131
+ project(id: $id) {
16132
+ projectUpdates(first: $first, after: $after) {
16133
+ nodes {
16134
+ id body health createdAt updatedAt
16135
+ user { name displayName }
16136
+ }
16137
+ pageInfo { hasNextPage endCursor }
16138
+ }
16139
+ }
16140
+ }`,
16141
+ { id: params.project_id, first: limit, after: params.after }
16142
+ );
16143
+ if (!data.project) throw ToolError.notFound("Project not found");
16144
+ const result = data.project.projectUpdates;
16145
+ return {
16146
+ updates: result.nodes.map((n) => mapStatusUpdate(n)),
16147
+ pagination: {
16148
+ has_next_page: result.pageInfo?.hasNextPage ?? false,
16149
+ end_cursor: result.pageInfo?.endCursor ?? ""
16150
+ }
16151
+ };
16152
+ }
16153
+ });
16154
+
16155
+ // src/tools/list-projects.ts
16156
+ var listProjects = defineTool({
16157
+ name: "list_projects",
16158
+ displayName: "List Projects",
16159
+ description: "List all projects in the Linear workspace. Supports pagination.",
16160
+ summary: "List all projects",
16161
+ icon: "folder",
16162
+ group: "Projects",
16163
+ input: external_exports.object({
16164
+ limit: external_exports.number().optional().describe("Maximum number of projects to return (default 25, max 50)"),
16165
+ after: external_exports.string().optional().describe("Pagination cursor from a previous response")
16166
+ }),
16167
+ output: external_exports.object({
16168
+ projects: external_exports.array(projectSchema).describe("List of projects"),
16169
+ pagination: paginationSchema.describe("Pagination info for fetching more results")
16170
+ }),
16171
+ handle: async (params) => {
16172
+ const limit = Math.min(params.limit ?? 25, 50);
16173
+ const data = await graphql(
16174
+ `query ListProjects($first: Int, $after: String) {
16175
+ projects(first: $first, after: $after, orderBy: updatedAt) {
16176
+ nodes {
16177
+ id name description url createdAt updatedAt
16178
+ targetDate startDate
16179
+ status { name }
16180
+ lead { name displayName }
16181
+ }
16182
+ pageInfo { hasNextPage endCursor }
16183
+ }
16184
+ }`,
16185
+ { first: limit, after: params.after }
16186
+ );
16187
+ if (!data.projects) throw ToolError.internal("Projects query returned no results object");
16188
+ const result = data.projects;
16189
+ return {
16190
+ projects: result.nodes.map((n) => mapProject(n)),
16191
+ pagination: {
16192
+ has_next_page: result.pageInfo?.hasNextPage ?? false,
16193
+ end_cursor: result.pageInfo?.endCursor ?? ""
16194
+ }
16195
+ };
16196
+ }
16197
+ });
16198
+
16199
+ // src/tools/list-sub-issues.ts
16200
+ var ISSUE_FIELDS3 = `
16201
+ id identifier title description priority priorityLabel url
16202
+ createdAt updatedAt dueDate estimate
16203
+ state { name type }
16204
+ assignee { name displayName }
16205
+ team { key name }
16206
+ labels { nodes { name } }
16207
+ project { name }
16208
+ cycle { number }
16209
+ `;
16210
+ var listSubIssues = defineTool({
16211
+ name: "list_sub_issues",
16212
+ displayName: "List Sub-Issues",
16213
+ description: "List child/sub-issues of a parent Linear issue.",
16214
+ summary: "List sub-issues of an issue",
16215
+ icon: "list-tree",
16216
+ group: "Issues",
16217
+ input: external_exports.object({
16218
+ issue_id: external_exports.string().describe("Parent issue UUID to list sub-issues for"),
16219
+ limit: external_exports.number().optional().describe("Maximum number of results to return (default 25, max 50)"),
16220
+ after: external_exports.string().optional().describe("Pagination cursor from a previous response")
16221
+ }),
16222
+ output: external_exports.object({
16223
+ sub_issues: external_exports.array(issueSchema).describe("List of sub-issues"),
16224
+ pagination: paginationSchema.describe("Pagination info for fetching more results")
14935
16225
  }),
14936
- handle: async () => {
16226
+ handle: async (params) => {
16227
+ const limit = Math.min(params.limit ?? 25, 50);
14937
16228
  const data = await graphql(
14938
- `query ListLabels {
14939
- issueLabels {
14940
- nodes {
14941
- id name color description isGroup
14942
- parent { name }
16229
+ `query ListSubIssues($id: String!, $first: Int, $after: String) {
16230
+ issue(id: $id) {
16231
+ children(first: $first, after: $after) {
16232
+ nodes { ${ISSUE_FIELDS3} }
16233
+ pageInfo { hasNextPage endCursor }
14943
16234
  }
14944
16235
  }
14945
- }`
16236
+ }`,
16237
+ { id: params.issue_id, first: limit, after: params.after }
14946
16238
  );
16239
+ if (!data.issue) throw ToolError.notFound("Issue not found");
16240
+ const result = data.issue.children;
14947
16241
  return {
14948
- labels: data.issueLabels.nodes.map((n) => mapLabel(n))
16242
+ sub_issues: result.nodes.map((n) => mapIssue(n)),
16243
+ pagination: {
16244
+ has_next_page: result.pageInfo?.hasNextPage ?? false,
16245
+ end_cursor: result.pageInfo?.endCursor ?? ""
16246
+ }
14949
16247
  };
14950
16248
  }
14951
16249
  });
14952
16250
 
14953
- // src/tools/list-projects.ts
14954
- var listProjects = defineTool({
14955
- name: "list_projects",
14956
- displayName: "List Projects",
14957
- description: "List all projects in the Linear workspace. Supports pagination.",
14958
- summary: "List all projects",
14959
- icon: "folder",
14960
- group: "Projects",
16251
+ // src/tools/list-team-members.ts
16252
+ var listTeamMembers = defineTool({
16253
+ name: "list_team_members",
16254
+ displayName: "List Team Members",
16255
+ description: "List members of a specific Linear team.",
16256
+ summary: "List members of a team",
16257
+ icon: "users",
16258
+ group: "Teams & Users",
14961
16259
  input: external_exports.object({
14962
- limit: external_exports.number().optional().describe("Maximum number of projects to return (default 25, max 50)"),
16260
+ team_id: external_exports.string().describe("Team UUID to list members for"),
16261
+ limit: external_exports.number().optional().describe("Maximum number of results to return (default 50, max 100)"),
14963
16262
  after: external_exports.string().optional().describe("Pagination cursor from a previous response")
14964
16263
  }),
14965
16264
  output: external_exports.object({
14966
- projects: external_exports.array(projectSchema).describe("List of projects"),
16265
+ members: external_exports.array(userSchema).describe("List of team members"),
14967
16266
  pagination: paginationSchema.describe("Pagination info for fetching more results")
14968
16267
  }),
14969
16268
  handle: async (params) => {
14970
- const limit = Math.min(params.limit ?? 25, 50);
16269
+ const limit = Math.min(params.limit ?? 50, 100);
14971
16270
  const data = await graphql(
14972
- `query ListProjects($first: Int, $after: String) {
14973
- projects(first: $first, after: $after, orderBy: updatedAt) {
14974
- nodes {
14975
- id name description url createdAt updatedAt
14976
- targetDate startDate
14977
- status { name }
14978
- lead { name displayName }
16271
+ `query ListTeamMembers($id: String!, $first: Int, $after: String) {
16272
+ team(id: $id) {
16273
+ members(first: $first, after: $after) {
16274
+ nodes {
16275
+ id name email displayName active admin
16276
+ }
16277
+ pageInfo { hasNextPage endCursor }
14979
16278
  }
14980
- pageInfo { hasNextPage endCursor }
14981
16279
  }
14982
16280
  }`,
14983
- { first: limit, after: params.after }
16281
+ { id: params.team_id, first: limit, after: params.after }
14984
16282
  );
14985
- if (!data.projects) throw ToolError.internal("Projects query returned no results object");
14986
- const result = data.projects;
16283
+ if (!data.team) throw ToolError.notFound("Team not found");
16284
+ const result = data.team.members;
14987
16285
  return {
14988
- projects: result.nodes.map((n) => mapProject(n)),
16286
+ members: result.nodes.map((n) => mapUser(n)),
14989
16287
  pagination: {
14990
16288
  has_next_page: result.pageInfo?.hasNextPage ?? false,
14991
16289
  end_cursor: result.pageInfo?.endCursor ?? ""
@@ -15096,8 +16394,137 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
15096
16394
  }
15097
16395
  });
15098
16396
 
16397
+ // src/tools/move-issue-to-project.ts
16398
+ var moveIssueToProject = defineTool({
16399
+ name: "move_issue_to_project",
16400
+ displayName: "Move Issue to Project",
16401
+ description: "Move an issue to a different project. Use list_projects to find project IDs. Pass an empty string to remove from the current project.",
16402
+ summary: "Move an issue between projects",
16403
+ icon: "folder-input",
16404
+ group: "Issues",
16405
+ input: external_exports.object({
16406
+ issue_id: external_exports.string().describe("Issue UUID to move"),
16407
+ project_id: external_exports.string().describe("Target project UUID, or empty string to remove from project")
16408
+ }),
16409
+ output: external_exports.object({
16410
+ issue: issueSchema.describe("The updated issue")
16411
+ }),
16412
+ handle: async (params) => {
16413
+ const input = {
16414
+ projectId: params.project_id || null
16415
+ };
16416
+ const data = await graphql(
16417
+ `mutation MoveIssueToProject($id: String!, $input: IssueUpdateInput!) {
16418
+ issueUpdate(id: $id, input: $input) {
16419
+ success
16420
+ issue {
16421
+ id identifier title description priority priorityLabel url
16422
+ createdAt updatedAt dueDate estimate
16423
+ state { name type }
16424
+ assignee { name displayName }
16425
+ team { key name }
16426
+ labels { nodes { name } }
16427
+ project { name }
16428
+ cycle { number }
16429
+ }
16430
+ }
16431
+ }`,
16432
+ { id: params.issue_id, input }
16433
+ );
16434
+ if (!data.issueUpdate?.issue) throw ToolError.internal("Failed to move issue \u2014 no issue returned");
16435
+ return { issue: mapIssue(data.issueUpdate.issue) };
16436
+ }
16437
+ });
16438
+
16439
+ // src/tools/remove-issue-label.ts
16440
+ var ISSUE_FIELDS4 = `
16441
+ id identifier title description priority priorityLabel url
16442
+ createdAt updatedAt dueDate estimate
16443
+ state { name type }
16444
+ assignee { name displayName }
16445
+ team { key name }
16446
+ labels { nodes { id name } }
16447
+ project { name }
16448
+ cycle { number }
16449
+ `;
16450
+ var removeIssueLabel = defineTool({
16451
+ name: "remove_issue_label",
16452
+ displayName: "Remove Issue Label",
16453
+ description: "Remove a label from an issue without affecting other labels. Unlike update_issue which replaces all labels, this removes only the specified one.",
16454
+ summary: "Remove a label from an issue",
16455
+ icon: "tag",
16456
+ group: "Issues",
16457
+ input: external_exports.object({
16458
+ issue_id: external_exports.string().describe("Issue UUID to remove the label from"),
16459
+ label_id: external_exports.string().describe("Label UUID to remove (use list_labels to find label IDs)")
16460
+ }),
16461
+ output: external_exports.object({
16462
+ issue: issueSchema.describe("The updated issue with the label removed")
16463
+ }),
16464
+ handle: async (params) => {
16465
+ const current = await graphql(
16466
+ `query GetIssueLabels($id: String!) {
16467
+ issue(id: $id) {
16468
+ labels { nodes { id } }
16469
+ }
16470
+ }`,
16471
+ { id: params.issue_id }
16472
+ );
16473
+ if (!current.issue) throw ToolError.notFound("Issue not found");
16474
+ const existingIds = (current.issue.labels?.nodes ?? []).map((l) => l.id);
16475
+ const labelIds = existingIds.filter((id) => id !== params.label_id);
16476
+ if (labelIds.length === existingIds.length) {
16477
+ const data2 = await graphql(
16478
+ `query GetIssue($id: String!) { issue(id: $id) { ${ISSUE_FIELDS4} } }`,
16479
+ { id: params.issue_id }
16480
+ );
16481
+ return { issue: mapIssue(data2.issue) };
16482
+ }
16483
+ const data = await graphql(
16484
+ `mutation RemoveIssueLabel($id: String!, $input: IssueUpdateInput!) {
16485
+ issueUpdate(id: $id, input: $input) {
16486
+ success
16487
+ issue { ${ISSUE_FIELDS4} }
16488
+ }
16489
+ }`,
16490
+ { id: params.issue_id, input: { labelIds } }
16491
+ );
16492
+ if (!data.issueUpdate?.issue) throw ToolError.internal("Failed to remove label \u2014 no issue returned");
16493
+ return { issue: mapIssue(data.issueUpdate.issue) };
16494
+ }
16495
+ });
16496
+
16497
+ // src/tools/remove-issue-subscriber.ts
16498
+ var removeIssueSubscriber = defineTool({
16499
+ name: "remove_issue_subscriber",
16500
+ displayName: "Remove Issue Subscriber",
16501
+ description: "Unsubscribe a user from notifications for a Linear issue.",
16502
+ summary: "Unsubscribe a user from an issue",
16503
+ icon: "bell-minus",
16504
+ group: "Issues",
16505
+ input: external_exports.object({
16506
+ issue_id: external_exports.string().describe("Issue UUID to unsubscribe from"),
16507
+ subscriber_id: external_exports.string().describe("User UUID to unsubscribe")
16508
+ }),
16509
+ output: external_exports.object({
16510
+ success: external_exports.boolean().describe("Whether the unsubscription was successful")
16511
+ }),
16512
+ handle: async (params) => {
16513
+ const data = await graphql(
16514
+ `mutation RemoveIssueSubscriber($id: String!, $userId: String!) {
16515
+ issueUnsubscribe(id: $id, userId: $userId) {
16516
+ success
16517
+ }
16518
+ }`,
16519
+ { id: params.issue_id, userId: params.subscriber_id }
16520
+ );
16521
+ if (!data.issueUnsubscribe) throw ToolError.internal("Failed to unsubscribe \u2014 no response");
16522
+ return { success: data.issueUnsubscribe.success };
16523
+ }
16524
+ });
16525
+
15099
16526
  // src/tools/search-issues.ts
15100
- var ISSUE_FIELDS = `
16527
+ var ISSUE_FIELDS5 = `
15101
16528
  id identifier title description priority priorityLabel url
15102
16529
  createdAt updatedAt dueDate estimate
15103
16530
  state { name type }
@@ -15144,7 +16571,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
15144
16571
  const data2 = await graphql(
15145
16572
  `query SearchIssues($query: String!, $first: Int, $after: String, $filter: IssueFilter) {
15146
16573
  searchIssues(term: $query, first: $first, after: $after, filter: $filter) {
15147
- nodes { ${ISSUE_FIELDS} }
16574
+ nodes { ${ISSUE_FIELDS5} }
15148
16575
  pageInfo { hasNextPage endCursor }
15149
16576
  totalCount
15150
16577
  }
@@ -15165,7 +16592,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
15165
16592
  const data = await graphql(
15166
16593
  `query ListIssues($first: Int, $after: String, $filter: IssueFilter) {
15167
16594
  issues(first: $first, after: $after, filter: $filter, orderBy: updatedAt) {
15168
- nodes { ${ISSUE_FIELDS} }
16595
+ nodes { ${ISSUE_FIELDS5} }
15169
16596
  pageInfo { hasNextPage endCursor }
15170
16597
  }
15171
16598
  }`,
@@ -15184,6 +16611,48 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
15184
16611
  }
15185
16612
  });
15186
16613
 
16614
+ // src/tools/set-issue-cycle.ts
16615
+ var setIssueCycle = defineTool({
16616
+ name: "set_issue_cycle",
16617
+ displayName: "Set Issue Cycle",
16618
+ description: "Assign an issue to a cycle (sprint). Use list_cycles to find cycle IDs. Pass an empty string to remove from the current cycle.",
16619
+ summary: "Assign an issue to a cycle/sprint",
16620
+ icon: "refresh-cw",
16621
+ group: "Issues",
16622
+ input: external_exports.object({
16623
+ issue_id: external_exports.string().describe("Issue UUID to update"),
16624
+ cycle_id: external_exports.string().describe("Cycle UUID to assign to, or empty string to remove from cycle")
16625
+ }),
16626
+ output: external_exports.object({
16627
+ issue: issueSchema.describe("The updated issue")
16628
+ }),
16629
+ handle: async (params) => {
16630
+ const input = {
16631
+ cycleId: params.cycle_id || null
16632
+ };
16633
+ const data = await graphql(
16634
+ `mutation SetIssueCycle($id: String!, $input: IssueUpdateInput!) {
16635
+ issueUpdate(id: $id, input: $input) {
16636
+ success
16637
+ issue {
16638
+ id identifier title description priority priorityLabel url
16639
+ createdAt updatedAt dueDate estimate
16640
+ state { name type }
16641
+ assignee { name displayName }
16642
+ team { key name }
16643
+ labels { nodes { name } }
16644
+ project { name }
16645
+ cycle { number }
16646
+ }
16647
+ }
16648
+ }`,
16649
+ { id: params.issue_id, input }
16650
+ );
16651
+ if (!data.issueUpdate?.issue) throw ToolError.internal("Failed to set cycle \u2014 no issue returned");
16652
+ return { issue: mapIssue(data.issueUpdate.issue) };
16653
+ }
16654
+ });
16655
+
15187
16656
  // src/tools/update-comment.ts
15188
16657
  var updateComment = defineTool({
15189
16658
  name: "update_comment",
@@ -15218,6 +16687,94 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
15218
16687
  }
15219
16688
  });
15220
16689
 
16690
+ // src/tools/update-document.ts
16691
+ var updateDocument = defineTool({
16692
+ name: "update_document",
16693
+ displayName: "Update Document",
16694
+ description: "Update an existing Linear document. Only specified fields are changed.",
16695
+ summary: "Update an existing document",
16696
+ icon: "file-edit",
16697
+ group: "Documents",
16698
+ input: external_exports.object({
16699
+ document_id: external_exports.string().describe("Document UUID to update"),
16700
+ title: external_exports.string().optional().describe("New document title"),
16701
+ content: external_exports.string().optional().describe("New document content in markdown"),
16702
+ project_id: external_exports.string().optional().describe("Move to this project UUID"),
16703
+ icon: external_exports.string().optional().describe("New icon emoji")
16704
+ }),
16705
+ output: external_exports.object({
16706
+ document: documentSchema.describe("The updated document")
16707
+ }),
16708
+ handle: async (params) => {
16709
+ const input = {};
16710
+ if (params.title !== void 0) input.title = params.title;
16711
+ if (params.content !== void 0) input.content = params.content;
16712
+ if (params.project_id !== void 0) input.projectId = params.project_id;
16713
+ if (params.icon !== void 0) input.icon = params.icon;
16714
+ const data = await graphql(
16715
+ `mutation UpdateDocument($id: String!, $input: DocumentUpdateInput!) {
16716
+ documentUpdate(id: $id, input: $input) {
16717
+ success
16718
+ document {
16719
+ id title content slugId icon url createdAt updatedAt
16720
+ creator { name displayName }
16721
+ project { name }
16722
+ }
16723
+ }
16724
+ }`,
16725
+ { id: params.document_id, input }
16726
+ );
16727
+ if (!data.documentUpdate?.document) throw ToolError.internal("Document update failed \u2014 no document returned");
16728
+ return { document: mapDocument(data.documentUpdate.document) };
16729
+ }
16730
+ });
16731
+
16732
+ // src/tools/update-initiative.ts
16733
+ var updateInitiative = defineTool({
16734
+ name: "update_initiative",
16735
+ displayName: "Update Initiative",
16736
+ description: "Update an existing Linear initiative. Only specified fields are changed.",
16737
+ summary: "Update an existing initiative",
16738
+ icon: "target",
16739
+ group: "Initiatives",
16740
+ input: external_exports.object({
16741
+ initiative_id: external_exports.string().describe("Initiative UUID to update"),
16742
+ name: external_exports.string().optional().describe("New initiative name"),
16743
+ description: external_exports.string().optional().describe("New initiative description in markdown"),
16744
+ status: external_exports.enum(["Planned", "Active", "Completed"]).optional().describe("New initiative status"),
16745
+ color: external_exports.string().optional().describe("New color hex code"),
16746
+ owner_id: external_exports.string().optional().describe("New owner user UUID")
16747
+ }),
16748
+ output: external_exports.object({
16749
+ initiative: initiativeSchema.describe("The updated initiative")
16750
+ }),
16751
+ handle: async (params) => {
16752
+ const input = {};
16753
+ if (params.name !== void 0) input.name = params.name;
16754
+ if (params.description !== void 0) input.description = params.description;
16755
+ if (params.status !== void 0) input.status = params.status;
16756
+ if (params.color !== void 0) input.color = params.color;
16757
+ if (params.owner_id !== void 0) input.ownerId = params.owner_id;
16758
+ const data = await graphql(
16759
+ `mutation UpdateInitiative($id: String!, $input: InitiativeUpdateInput!) {
16760
+ initiativeUpdate(id: $id, input: $input) {
16761
+ success
16762
+ initiative {
16763
+ id name description status color icon url createdAt updatedAt
16764
+ owner { name displayName }
16765
+ }
16766
+ }
16767
+ }`,
16768
+ { id: params.initiative_id, input }
16769
+ );
16770
+ if (!data.initiativeUpdate?.initiative)
16771
+ throw ToolError.internal("Initiative update failed \u2014 no initiative returned");
16772
+ return {
16773
+ initiative: mapInitiative(data.initiativeUpdate.initiative)
16774
+ };
16775
+ }
16776
+ });
16777
+
15221
16778
  // src/tools/update-issue.ts
15222
16779
  var updateIssue = defineTool({
15223
16780
  name: "update_issue",
@@ -15281,6 +16838,86 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
15281
16838
  }
15282
16839
  });
15283
16840
 
16841
+ // src/tools/update-label.ts
16842
+ var updateLabel = defineTool({
16843
+ name: "update_label",
16844
+ displayName: "Update Label",
16845
+ description: "Update an existing Linear issue label. Only specified fields are changed.",
16846
+ summary: "Update a label",
16847
+ icon: "tag",
16848
+ group: "Workflow",
16849
+ input: external_exports.object({
16850
+ label_id: external_exports.string().describe("Label UUID to update"),
16851
+ name: external_exports.string().optional().describe("New label name"),
16852
+ color: external_exports.string().optional().describe("New color hex code"),
16853
+ description: external_exports.string().optional().describe("New label description")
16854
+ }),
16855
+ output: external_exports.object({
16856
+ label: labelSchema.describe("The updated label")
16857
+ }),
16858
+ handle: async (params) => {
16859
+ const input = {};
16860
+ if (params.name !== void 0) input.name = params.name;
16861
+ if (params.color !== void 0) input.color = params.color;
16862
+ if (params.description !== void 0) input.description = params.description;
16863
+ const data = await graphql(
16864
+ `mutation UpdateLabel($id: String!, $input: IssueLabelUpdateInput!) {
16865
+ issueLabelUpdate(id: $id, input: $input) {
16866
+ success
16867
+ issueLabel {
16868
+ id name color description isGroup
16869
+ parent { name }
16870
+ }
16871
+ }
16872
+ }`,
16873
+ { id: params.label_id, input }
16874
+ );
16875
+ if (!data.issueLabelUpdate?.issueLabel) throw ToolError.internal("Label update failed \u2014 no label returned");
16876
+ return { label: mapLabel(data.issueLabelUpdate.issueLabel) };
16877
+ }
16878
+ });
16879
+
16880
+ // src/tools/update-milestone.ts
16881
+ var updateMilestone = defineTool({
16882
+ name: "update_milestone",
16883
+ displayName: "Update Milestone",
16884
+ description: "Update an existing milestone in a Linear project. Only specified fields are changed.",
16885
+ summary: "Update a project milestone",
16886
+ icon: "milestone",
16887
+ group: "Projects",
16888
+ input: external_exports.object({
16889
+ milestone_id: external_exports.string().describe("Milestone UUID to update"),
16890
+ name: external_exports.string().optional().describe("New milestone name"),
16891
+ description: external_exports.string().optional().describe("New milestone description"),
16892
+ target_date: external_exports.string().optional().describe("New target date in YYYY-MM-DD format")
16893
+ }),
16894
+ output: external_exports.object({
16895
+ milestone: milestoneSchema.describe("The updated milestone")
16896
+ }),
16897
+ handle: async (params) => {
16898
+ const input = {};
16899
+ if (params.name !== void 0) input.name = params.name;
16900
+ if (params.description !== void 0) input.description = params.description;
16901
+ if (params.target_date !== void 0) input.targetDate = params.target_date;
16902
+ const data = await graphql(
16903
+ `mutation UpdateMilestone($id: String!, $input: ProjectMilestoneUpdateInput!) {
16904
+ projectMilestoneUpdate(id: $id, input: $input) {
16905
+ success
16906
+ projectMilestone {
16907
+ id name description targetDate sortOrder
16908
+ }
16909
+ }
16910
+ }`,
16911
+ { id: params.milestone_id, input }
16912
+ );
16913
+ if (!data.projectMilestoneUpdate?.projectMilestone)
16914
+ throw ToolError.internal("Milestone update failed \u2014 no milestone returned");
16915
+ return {
16916
+ milestone: mapMilestone(data.projectMilestoneUpdate.projectMilestone)
16917
+ };
16918
+ }
16919
+ });
16920
+
15284
16921
  // src/tools/update-project.ts
15285
16922
  var updateProject = defineTool({
15286
16923
  name: "update_project",
@@ -15335,27 +16972,79 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
15335
16972
  urlPatterns = ["*://linear.app/*"];
15336
16973
  homepage = "https://linear.app";
15337
16974
  tools = [
16975
+ // Issues
15338
16976
  searchIssues,
15339
16977
  getIssue,
15340
16978
  createIssue,
15341
16979
  updateIssue,
15342
16980
  deleteIssue,
15343
16981
  archiveIssue,
16982
+ batchUpdateIssues,
16983
+ listSubIssues,
16984
+ listIssueHistory,
16985
+ // Issue relations
15344
16986
  listIssueRelations,
16987
+ createIssueRelation,
16988
+ deleteIssueRelation,
16989
+ // Issue labels (additive/subtractive)
16990
+ addIssueLabel,
16991
+ removeIssueLabel,
16992
+ // Issue subscribers
16993
+ addIssueSubscriber,
16994
+ removeIssueSubscriber,
16995
+ // Issue assignment
16996
+ setIssueCycle,
16997
+ moveIssueToProject,
16998
+ // Attachments
16999
+ listAttachments,
17000
+ getAttachment,
17001
+ createAttachment,
17002
+ deleteAttachment,
17003
+ // Comments
15345
17004
  createComment,
15346
17005
  updateComment,
17006
+ deleteComment,
15347
17007
  listComments,
17008
+ // Projects
15348
17009
  listProjects,
15349
17010
  getProject,
15350
17011
  createProject,
15351
17012
  updateProject,
17013
+ listProjectLabels,
17014
+ // Project updates (health reports)
17015
+ listProjectUpdates,
17016
+ createProjectUpdate,
17017
+ deleteProjectUpdate,
17018
+ // Milestones
17019
+ listMilestones,
17020
+ getMilestone,
17021
+ createMilestone,
17022
+ updateMilestone,
17023
+ // Initiatives
17024
+ listInitiatives,
17025
+ getInitiative,
17026
+ createInitiative,
17027
+ updateInitiative,
17028
+ // Documents
17029
+ listDocuments,
17030
+ getDocument,
17031
+ createDocument,
17032
+ updateDocument,
17033
+ // Teams & Users
15352
17034
  listTeams,
17035
+ getTeam,
17036
+ listTeamMembers,
17037
+ listUsers,
17038
+ getUser,
17039
+ getViewer,
17040
+ // Workflow
15353
17041
  listWorkflowStates,
15354
17042
  listLabels,
15355
17043
  createLabel,
15356
- getViewer,
15357
- listUsers,
15358
- listCycles
17044
+ updateLabel,
17045
+ deleteLabel,
17046
+ listCycles,
17047
+ getCycle
15359
17048
  ];
15360
17049
  async isReady() {
15361
17050
  if (isLinearAuthenticated()) return true;
@@ -15364,7 +17053,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
15364
17053
  };
15365
17054
  var src_default = new LinearPlugin();
15366
17055
 
15367
- // dist/_adapter_entry_bf052904-bd6d-4484-891c-f81c747d48ab.ts
17056
+ // dist/_adapter_entry_1977870b-d8e8-49be-bdc6-59997dce32ca.ts
15368
17057
  if (!globalThis.__openTabs) {
15369
17058
  globalThis.__openTabs = {};
15370
17059
  } else {
@@ -15580,5 +17269,5 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
15580
17269
  };
15581
17270
  delete src_default.onDeactivate;
15582
17271
  }
15583
- })();(function(){var o=(globalThis).__openTabs;if(o&&o.adapters&&o.adapters["linear"]){var a=o.adapters["linear"];a.__adapterHash="2219e2f3ff8305ea92e9db7b6c5652c1f138150263d35c0741cb2a82708c8dfd";if(a.tools&&Array.isArray(a.tools)){for(var i=0;i<a.tools.length;i++){Object.freeze(a.tools[i]);}Object.freeze(a.tools);}Object.freeze(a);Object.defineProperty(o.adapters,"linear",{value:a,writable:false,configurable:false,enumerable:true});Object.defineProperty(o,"adapters",{value:o.adapters,writable:false,configurable:false});}})();
17272
+ })();(function(){var o=(globalThis).__openTabs;if(o&&o.adapters&&o.adapters["linear"]){var a=o.adapters["linear"];a.__adapterHash="62341ed930892cdfafd0ab4b362e610ac36a92d961f9f52baa5348cde3f1b5d1";if(a.tools&&Array.isArray(a.tools)){for(var i=0;i<a.tools.length;i++){Object.freeze(a.tools[i]);}Object.freeze(a.tools);}Object.freeze(a);Object.defineProperty(o.adapters,"linear",{value:a,writable:false,configurable:false,enumerable:true});Object.defineProperty(o,"adapters",{value:o.adapters,writable:false,configurable:false});}})();
15584
17273
  //# sourceMappingURL=adapter.iife.js.map