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

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 +1760 -76
  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 +80 -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,294 @@ 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 aliases = params.issue_ids.map(
14676
+ (id, i) => `issue${i}: issueUpdate(id: "${id}", input: $input) {
14677
+ success
14678
+ issue { ${ISSUE_FIELDS2} }
14679
+ }`
14680
+ );
14681
+ const query = `mutation BatchUpdateIssues($input: IssueUpdateInput!) {
14682
+ ${aliases.join("\n")}
14683
+ }`;
14684
+ const data = await graphql(query, { input });
14685
+ const issues = [];
14686
+ const failed = [];
14687
+ for (let i = 0; i < params.issue_ids.length; i++) {
14688
+ const result = data[`issue${i}`];
14689
+ if (result?.success && result.issue) {
14690
+ issues.push(mapIssue(result.issue));
14691
+ } else {
14692
+ const issueId = params.issue_ids[i];
14693
+ if (issueId) failed.push(issueId);
14694
+ }
14695
+ }
14696
+ return { issues, failed };
14697
+ }
14698
+ });
14699
+
14700
+ // src/tools/create-attachment.ts
14701
+ var createAttachment = defineTool({
14702
+ name: "create_attachment",
14703
+ displayName: "Create Attachment",
14704
+ description: "Link a URL (PR, document, design file, etc.) to a Linear issue as an attachment.",
14705
+ summary: "Link a URL to an issue",
14706
+ icon: "paperclip",
14707
+ group: "Issues",
14708
+ input: external_exports.object({
14709
+ issue_id: external_exports.string().describe("Issue UUID to attach to"),
14710
+ url: external_exports.string().describe("URL to attach (e.g. GitHub PR, Figma file, Google Doc)"),
14711
+ title: external_exports.string().describe("Attachment title"),
14712
+ subtitle: external_exports.string().optional().describe("Attachment subtitle or description")
14713
+ }),
14714
+ output: external_exports.object({
14715
+ attachment: attachmentSchema.describe("The newly created attachment")
14716
+ }),
14717
+ handle: async (params) => {
14718
+ const input = {
14719
+ issueId: params.issue_id,
14720
+ url: params.url,
14721
+ title: params.title
14722
+ };
14723
+ if (params.subtitle !== void 0) input.subtitle = params.subtitle;
14724
+ const data = await graphql(
14725
+ `mutation CreateAttachment($input: AttachmentCreateInput!) {
14726
+ attachmentCreate(input: $input) {
14727
+ success
14728
+ attachment {
14729
+ id title subtitle url sourceType createdAt updatedAt
14730
+ creator { name displayName }
14731
+ }
14732
+ }
14733
+ }`,
14734
+ { input }
14735
+ );
14736
+ if (!data.attachmentCreate?.attachment)
14737
+ throw ToolError.internal("Attachment creation failed \u2014 no attachment returned");
14738
+ return {
14739
+ attachment: mapAttachment(data.attachmentCreate.attachment)
14740
+ };
14741
+ }
14742
+ });
14423
14743
 
14424
14744
  // src/tools/create-comment.ts
14425
14745
  var createComment = defineTool({
@@ -14454,6 +14774,94 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
14454
14774
  }
14455
14775
  });
14456
14776
 
14777
+ // src/tools/create-document.ts
14778
+ var createDocument = defineTool({
14779
+ name: "create_document",
14780
+ displayName: "Create Document",
14781
+ description: "Create a new document in Linear, optionally associated with a project.",
14782
+ summary: "Create a new document",
14783
+ icon: "file-plus",
14784
+ group: "Documents",
14785
+ input: external_exports.object({
14786
+ title: external_exports.string().describe("Document title"),
14787
+ content: external_exports.string().optional().describe("Document content in markdown"),
14788
+ project_id: external_exports.string().optional().describe("Project UUID to associate the document with"),
14789
+ icon: external_exports.string().optional().describe("Icon emoji for the document")
14790
+ }),
14791
+ output: external_exports.object({
14792
+ document: documentSchema.describe("The newly created document")
14793
+ }),
14794
+ handle: async (params) => {
14795
+ const input = {
14796
+ title: params.title
14797
+ };
14798
+ if (params.content !== void 0) input.content = params.content;
14799
+ if (params.project_id) input.projectId = params.project_id;
14800
+ if (params.icon) input.icon = params.icon;
14801
+ const data = await graphql(
14802
+ `mutation CreateDocument($input: DocumentCreateInput!) {
14803
+ documentCreate(input: $input) {
14804
+ success
14805
+ document {
14806
+ id title content slugId icon url createdAt updatedAt
14807
+ creator { name displayName }
14808
+ project { name }
14809
+ }
14810
+ }
14811
+ }`,
14812
+ { input }
14813
+ );
14814
+ if (!data.documentCreate?.document) throw ToolError.internal("Document creation failed \u2014 no document returned");
14815
+ return { document: mapDocument(data.documentCreate.document) };
14816
+ }
14817
+ });
14818
+
14819
+ // src/tools/create-initiative.ts
14820
+ var createInitiative = defineTool({
14821
+ name: "create_initiative",
14822
+ displayName: "Create Initiative",
14823
+ description: "Create a new initiative in Linear.",
14824
+ summary: "Create a new initiative",
14825
+ icon: "target",
14826
+ group: "Initiatives",
14827
+ input: external_exports.object({
14828
+ name: external_exports.string().describe("Initiative name"),
14829
+ description: external_exports.string().optional().describe("Initiative description in markdown"),
14830
+ status: external_exports.enum(["Planned", "Active", "Completed"]).optional().describe("Initiative status"),
14831
+ color: external_exports.string().optional().describe("Color hex code (e.g. #FF0000)"),
14832
+ owner_id: external_exports.string().optional().describe("Owner user UUID")
14833
+ }),
14834
+ output: external_exports.object({
14835
+ initiative: initiativeSchema.describe("The newly created initiative")
14836
+ }),
14837
+ handle: async (params) => {
14838
+ const input = {
14839
+ name: params.name
14840
+ };
14841
+ if (params.description !== void 0) input.description = params.description;
14842
+ if (params.status) input.status = params.status;
14843
+ if (params.color) input.color = params.color;
14844
+ if (params.owner_id) input.ownerId = params.owner_id;
14845
+ const data = await graphql(
14846
+ `mutation CreateInitiative($input: InitiativeCreateInput!) {
14847
+ initiativeCreate(input: $input) {
14848
+ success
14849
+ initiative {
14850
+ id name description status color icon url createdAt updatedAt
14851
+ owner { name displayName }
14852
+ }
14853
+ }
14854
+ }`,
14855
+ { input }
14856
+ );
14857
+ if (!data.initiativeCreate?.initiative)
14858
+ throw ToolError.internal("Initiative creation failed \u2014 no initiative returned");
14859
+ return {
14860
+ initiative: mapInitiative(data.initiativeCreate.initiative)
14861
+ };
14862
+ }
14863
+ });
14864
+
14457
14865
  // src/tools/create-issue.ts
14458
14866
  var createIssue = defineTool({
14459
14867
  name: "create_issue",
@@ -14517,6 +14925,58 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
14517
14925
  }
14518
14926
  });
14519
14927
 
14928
+ // src/tools/create-issue-relation.ts
14929
+ var createIssueRelation = defineTool({
14930
+ name: "create_issue_relation",
14931
+ displayName: "Create Issue Relation",
14932
+ description: "Create a relation between two Linear issues (blocks, is blocked by, relates to, or duplicate of).",
14933
+ summary: "Create a relation between two issues",
14934
+ icon: "link",
14935
+ group: "Issues",
14936
+ input: external_exports.object({
14937
+ issue_id: external_exports.string().describe("UUID of the source issue"),
14938
+ related_issue_id: external_exports.string().describe("UUID of the target issue to relate to"),
14939
+ type: external_exports.enum(["blocks", "blockedBy", "related", "duplicate"]).describe("Relation type: blocks, blockedBy, related, or duplicate")
14940
+ }),
14941
+ output: external_exports.object({
14942
+ relation: external_exports.object({
14943
+ id: external_exports.string().describe("Relation UUID"),
14944
+ type: external_exports.string().describe("Relation type"),
14945
+ related_issue_identifier: external_exports.string().describe("Related issue identifier (e.g. ENG-123)")
14946
+ })
14947
+ }),
14948
+ handle: async (params) => {
14949
+ const data = await graphql(
14950
+ `mutation CreateIssueRelation($input: IssueRelationCreateInput!) {
14951
+ issueRelationCreate(input: $input) {
14952
+ success
14953
+ issueRelation {
14954
+ id type
14955
+ relatedIssue { identifier }
14956
+ }
14957
+ }
14958
+ }`,
14959
+ {
14960
+ input: {
14961
+ issueId: params.issue_id,
14962
+ relatedIssueId: params.related_issue_id,
14963
+ type: params.type
14964
+ }
14965
+ }
14966
+ );
14967
+ if (!data.issueRelationCreate?.issueRelation)
14968
+ throw ToolError.internal("Issue relation creation failed \u2014 no relation returned");
14969
+ const rel = data.issueRelationCreate.issueRelation;
14970
+ return {
14971
+ relation: {
14972
+ id: rel.id ?? "",
14973
+ type: rel.type ?? "",
14974
+ related_issue_identifier: rel.relatedIssue?.identifier ?? ""
14975
+ }
14976
+ };
14977
+ }
14978
+ });
14979
+
14520
14980
  // src/tools/create-label.ts
14521
14981
  var createLabel = defineTool({
14522
14982
  name: "create_label",
@@ -14559,16 +15019,59 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
14559
15019
  }
14560
15020
  });
14561
15021
 
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",
15022
+ // src/tools/create-milestone.ts
15023
+ var createMilestone = defineTool({
15024
+ name: "create_milestone",
15025
+ displayName: "Create Milestone",
15026
+ description: "Create a new milestone in a Linear project.",
15027
+ summary: "Create a new project milestone",
15028
+ icon: "milestone",
14569
15029
  group: "Projects",
14570
15030
  input: external_exports.object({
14571
- name: external_exports.string().describe("Project name"),
15031
+ project_id: external_exports.string().describe("Project UUID to create the milestone in"),
15032
+ name: external_exports.string().describe("Milestone name"),
15033
+ description: external_exports.string().optional().describe("Milestone description"),
15034
+ target_date: external_exports.string().optional().describe("Target date in YYYY-MM-DD format")
15035
+ }),
15036
+ output: external_exports.object({
15037
+ milestone: milestoneSchema.describe("The newly created milestone")
15038
+ }),
15039
+ handle: async (params) => {
15040
+ const input = {
15041
+ projectId: params.project_id,
15042
+ name: params.name
15043
+ };
15044
+ if (params.description !== void 0) input.description = params.description;
15045
+ if (params.target_date) input.targetDate = params.target_date;
15046
+ const data = await graphql(
15047
+ `mutation CreateMilestone($input: ProjectMilestoneCreateInput!) {
15048
+ projectMilestoneCreate(input: $input) {
15049
+ success
15050
+ projectMilestone {
15051
+ id name description targetDate sortOrder
15052
+ }
15053
+ }
15054
+ }`,
15055
+ { input }
15056
+ );
15057
+ if (!data.projectMilestoneCreate?.projectMilestone)
15058
+ throw ToolError.internal("Milestone creation failed \u2014 no milestone returned");
15059
+ return {
15060
+ milestone: mapMilestone(data.projectMilestoneCreate.projectMilestone)
15061
+ };
15062
+ }
15063
+ });
15064
+
15065
+ // src/tools/create-project.ts
15066
+ var createProject = defineTool({
15067
+ name: "create_project",
15068
+ displayName: "Create Project",
15069
+ description: "Create a new project in Linear.",
15070
+ summary: "Create a new project",
15071
+ icon: "folder-plus",
15072
+ group: "Projects",
15073
+ input: external_exports.object({
15074
+ name: external_exports.string().describe("Project name"),
14572
15075
  description: external_exports.string().optional().describe("Project description"),
14573
15076
  team_ids: external_exports.array(external_exports.string()).optional().describe("Array of team UUIDs to associate with the project"),
14574
15077
  state: external_exports.string().optional().describe("Project state (planned, started, paused, completed, canceled)"),
@@ -14605,6 +15108,99 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
14605
15108
  }
14606
15109
  });
14607
15110
 
15111
+ // src/tools/create-project-update.ts
15112
+ var createProjectUpdate = defineTool({
15113
+ name: "create_project_update",
15114
+ displayName: "Create Project Update",
15115
+ description: "Post a status update (health report) on a Linear project.",
15116
+ summary: "Post a project status update",
15117
+ icon: "activity",
15118
+ group: "Projects",
15119
+ input: external_exports.object({
15120
+ project_id: external_exports.string().describe("Project UUID to post the update on"),
15121
+ body: external_exports.string().describe("Status update body in markdown"),
15122
+ health: external_exports.enum(["onTrack", "atRisk", "offTrack"]).describe("Project health status")
15123
+ }),
15124
+ output: external_exports.object({
15125
+ update: statusUpdateSchema.describe("The newly created status update")
15126
+ }),
15127
+ handle: async (params) => {
15128
+ const data = await graphql(
15129
+ `mutation CreateProjectUpdate($input: ProjectUpdateCreateInput!) {
15130
+ projectUpdateCreate(input: $input) {
15131
+ success
15132
+ projectUpdate {
15133
+ id body health createdAt updatedAt
15134
+ user { name displayName }
15135
+ }
15136
+ }
15137
+ }`,
15138
+ { input: { projectId: params.project_id, body: params.body, health: params.health } }
15139
+ );
15140
+ if (!data.projectUpdateCreate?.projectUpdate)
15141
+ throw ToolError.internal("Project update creation failed \u2014 no update returned");
15142
+ return {
15143
+ update: mapStatusUpdate(data.projectUpdateCreate.projectUpdate)
15144
+ };
15145
+ }
15146
+ });
15147
+
15148
+ // src/tools/delete-attachment.ts
15149
+ var deleteAttachment = defineTool({
15150
+ name: "delete_attachment",
15151
+ displayName: "Delete Attachment",
15152
+ description: "Delete an attachment from a Linear issue.",
15153
+ summary: "Delete an attachment",
15154
+ icon: "paperclip",
15155
+ group: "Issues",
15156
+ input: external_exports.object({
15157
+ attachment_id: external_exports.string().describe("Attachment UUID to delete")
15158
+ }),
15159
+ output: external_exports.object({
15160
+ success: external_exports.boolean().describe("Whether the attachment was successfully deleted")
15161
+ }),
15162
+ handle: async (params) => {
15163
+ const data = await graphql(
15164
+ `mutation DeleteAttachment($id: String!) {
15165
+ attachmentDelete(id: $id) {
15166
+ success
15167
+ }
15168
+ }`,
15169
+ { id: params.attachment_id }
15170
+ );
15171
+ if (!data.attachmentDelete) throw ToolError.internal("Attachment deletion failed \u2014 no response");
15172
+ return { success: data.attachmentDelete.success };
15173
+ }
15174
+ });
15175
+
15176
+ // src/tools/delete-comment.ts
15177
+ var deleteComment = defineTool({
15178
+ name: "delete_comment",
15179
+ displayName: "Delete Comment",
15180
+ description: "Delete a comment from a Linear issue.",
15181
+ summary: "Delete a comment",
15182
+ icon: "message-square-x",
15183
+ group: "Comments",
15184
+ input: external_exports.object({
15185
+ comment_id: external_exports.string().describe("Comment UUID to delete")
15186
+ }),
15187
+ output: external_exports.object({
15188
+ success: external_exports.boolean().describe("Whether the comment was successfully deleted")
15189
+ }),
15190
+ handle: async (params) => {
15191
+ const data = await graphql(
15192
+ `mutation DeleteComment($id: String!) {
15193
+ commentDelete(id: $id) {
15194
+ success
15195
+ }
15196
+ }`,
15197
+ { id: params.comment_id }
15198
+ );
15199
+ if (!data.commentDelete) throw ToolError.internal("Comment deletion failed \u2014 no response");
15200
+ return { success: data.commentDelete.success };
15201
+ }
15202
+ });
15203
+
14608
15204
  // src/tools/delete-issue.ts
14609
15205
  var deleteIssue = defineTool({
14610
15206
  name: "delete_issue",
@@ -14633,6 +15229,218 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
14633
15229
  }
14634
15230
  });
14635
15231
 
15232
+ // src/tools/delete-issue-relation.ts
15233
+ var deleteIssueRelation = defineTool({
15234
+ name: "delete_issue_relation",
15235
+ displayName: "Delete Issue Relation",
15236
+ description: "Delete a relation between two Linear issues. Use list_issue_relations to find relation IDs.",
15237
+ summary: "Delete a relation between two issues",
15238
+ icon: "unlink",
15239
+ group: "Issues",
15240
+ input: external_exports.object({
15241
+ relation_id: external_exports.string().describe("Relation UUID to delete (from list_issue_relations)")
15242
+ }),
15243
+ output: external_exports.object({
15244
+ success: external_exports.boolean().describe("Whether the relation was successfully deleted")
15245
+ }),
15246
+ handle: async (params) => {
15247
+ const data = await graphql(
15248
+ `mutation DeleteIssueRelation($id: String!) {
15249
+ issueRelationDelete(id: $id) {
15250
+ success
15251
+ }
15252
+ }`,
15253
+ { id: params.relation_id }
15254
+ );
15255
+ if (!data.issueRelationDelete) throw ToolError.internal("Issue relation deletion failed \u2014 no response");
15256
+ return { success: data.issueRelationDelete.success };
15257
+ }
15258
+ });
15259
+
15260
+ // src/tools/delete-label.ts
15261
+ var deleteLabel = defineTool({
15262
+ name: "delete_label",
15263
+ displayName: "Delete Label",
15264
+ description: "Delete a Linear issue label. Labels will be removed from all issues that use them.",
15265
+ summary: "Delete a label",
15266
+ icon: "tag",
15267
+ group: "Workflow",
15268
+ input: external_exports.object({
15269
+ label_id: external_exports.string().describe("Label UUID to delete")
15270
+ }),
15271
+ output: external_exports.object({
15272
+ success: external_exports.boolean().describe("Whether the label was successfully deleted")
15273
+ }),
15274
+ handle: async (params) => {
15275
+ const data = await graphql(
15276
+ `mutation DeleteLabel($id: String!) {
15277
+ issueLabelDelete(id: $id) {
15278
+ success
15279
+ }
15280
+ }`,
15281
+ { id: params.label_id }
15282
+ );
15283
+ if (!data.issueLabelDelete) throw ToolError.internal("Label deletion failed \u2014 no response");
15284
+ return { success: data.issueLabelDelete.success };
15285
+ }
15286
+ });
15287
+
15288
+ // src/tools/delete-project-update.ts
15289
+ var deleteProjectUpdate = defineTool({
15290
+ name: "delete_project_update",
15291
+ displayName: "Delete Project Update",
15292
+ description: "Delete a status update from a Linear project.",
15293
+ summary: "Delete a project status update",
15294
+ icon: "activity",
15295
+ group: "Projects",
15296
+ input: external_exports.object({
15297
+ update_id: external_exports.string().describe("Project update UUID to delete")
15298
+ }),
15299
+ output: external_exports.object({
15300
+ success: external_exports.boolean().describe("Whether the update was successfully deleted")
15301
+ }),
15302
+ handle: async (params) => {
15303
+ const data = await graphql(
15304
+ `mutation DeleteProjectUpdate($id: String!) {
15305
+ projectUpdateDelete(id: $id) {
15306
+ success
15307
+ }
15308
+ }`,
15309
+ { id: params.update_id }
15310
+ );
15311
+ if (!data.projectUpdateDelete) throw ToolError.internal("Project update deletion failed \u2014 no response");
15312
+ return { success: data.projectUpdateDelete.success };
15313
+ }
15314
+ });
15315
+
15316
+ // src/tools/get-attachment.ts
15317
+ var getAttachment = defineTool({
15318
+ name: "get_attachment",
15319
+ displayName: "Get Attachment",
15320
+ description: "Get detailed information about a single attachment by its UUID.",
15321
+ summary: "Get details of a single attachment",
15322
+ icon: "paperclip",
15323
+ group: "Issues",
15324
+ input: external_exports.object({
15325
+ attachment_id: external_exports.string().describe("Attachment UUID")
15326
+ }),
15327
+ output: external_exports.object({
15328
+ attachment: attachmentSchema.describe("The requested attachment")
15329
+ }),
15330
+ handle: async (params) => {
15331
+ const data = await graphql(
15332
+ `query GetAttachment($id: String!) {
15333
+ attachment(id: $id) {
15334
+ id title subtitle url sourceType createdAt updatedAt
15335
+ creator { name displayName }
15336
+ }
15337
+ }`,
15338
+ { id: params.attachment_id }
15339
+ );
15340
+ if (!data.attachment) throw ToolError.notFound("Attachment not found");
15341
+ return { attachment: mapAttachment(data.attachment) };
15342
+ }
15343
+ });
15344
+
15345
+ // src/tools/get-cycle.ts
15346
+ var getCycle = defineTool({
15347
+ name: "get_cycle",
15348
+ displayName: "Get Cycle",
15349
+ description: "Get detailed information about a single cycle (sprint) by its UUID.",
15350
+ summary: "Get details of a single cycle",
15351
+ icon: "refresh-cw",
15352
+ group: "Workflow",
15353
+ input: external_exports.object({
15354
+ cycle_id: external_exports.string().describe("Cycle UUID")
15355
+ }),
15356
+ output: external_exports.object({
15357
+ cycle: cycleSchema.describe("The requested cycle")
15358
+ }),
15359
+ handle: async (params) => {
15360
+ const data = await graphql(
15361
+ `query GetCycle($id: String!) {
15362
+ cycle(id: $id) {
15363
+ id number name startsAt endsAt completedAt
15364
+ }
15365
+ }`,
15366
+ { id: params.cycle_id }
15367
+ );
15368
+ if (!data.cycle) throw ToolError.notFound("Cycle not found");
15369
+ return { cycle: mapCycle(data.cycle) };
15370
+ }
15371
+ });
15372
+
15373
+ // src/tools/get-document.ts
15374
+ var getDocument = defineTool({
15375
+ name: "get_document",
15376
+ displayName: "Get Document",
15377
+ description: "Get detailed information about a single Linear document by its UUID.",
15378
+ summary: "Get details of a single document",
15379
+ icon: "file-text",
15380
+ group: "Documents",
15381
+ input: external_exports.object({
15382
+ document_id: external_exports.string().describe("Document UUID")
15383
+ }),
15384
+ output: external_exports.object({
15385
+ document: documentSchema.describe("The requested document")
15386
+ }),
15387
+ handle: async (params) => {
15388
+ const data = await graphql(
15389
+ `query GetDocument($id: String!) {
15390
+ document(id: $id) {
15391
+ id title content slugId icon url createdAt updatedAt
15392
+ creator { name displayName }
15393
+ project { name }
15394
+ }
15395
+ }`,
15396
+ { id: params.document_id }
15397
+ );
15398
+ if (!data.document) throw ToolError.notFound("Document not found");
15399
+ return { document: mapDocument(data.document) };
15400
+ }
15401
+ });
15402
+
15403
+ // src/tools/get-initiative.ts
15404
+ var getInitiative = defineTool({
15405
+ name: "get_initiative",
15406
+ displayName: "Get Initiative",
15407
+ description: "Get detailed information about a single Linear initiative by its UUID.",
15408
+ summary: "Get details of a single initiative",
15409
+ icon: "target",
15410
+ group: "Initiatives",
15411
+ input: external_exports.object({
15412
+ initiative_id: external_exports.string().describe("Initiative UUID")
15413
+ }),
15414
+ output: external_exports.object({
15415
+ initiative: initiativeSchema.describe("The requested initiative"),
15416
+ projects: external_exports.array(projectSchema).describe("Projects associated with this initiative")
15417
+ }),
15418
+ handle: async (params) => {
15419
+ const data = await graphql(
15420
+ `query GetInitiative($id: String!) {
15421
+ initiative(id: $id) {
15422
+ id name description status color icon url createdAt updatedAt
15423
+ owner { name displayName }
15424
+ projects {
15425
+ nodes {
15426
+ id name description url createdAt updatedAt
15427
+ status { name }
15428
+ lead { name displayName }
15429
+ targetDate startDate
15430
+ }
15431
+ }
15432
+ }
15433
+ }`,
15434
+ { id: params.initiative_id }
15435
+ );
15436
+ if (!data.initiative) throw ToolError.notFound("Initiative not found");
15437
+ return {
15438
+ initiative: mapInitiative(data.initiative),
15439
+ projects: (data.initiative.projects?.nodes ?? []).map((p) => mapProject(p))
15440
+ };
15441
+ }
15442
+ });
15443
+
14636
15444
  // src/tools/get-issue.ts
14637
15445
  var getIssue = defineTool({
14638
15446
  name: "get_issue",
@@ -14692,6 +15500,34 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
14692
15500
  }
14693
15501
  });
14694
15502
 
15503
+ // src/tools/get-milestone.ts
15504
+ var getMilestone = defineTool({
15505
+ name: "get_milestone",
15506
+ displayName: "Get Milestone",
15507
+ description: "Get detailed information about a single project milestone by its UUID.",
15508
+ summary: "Get details of a single milestone",
15509
+ icon: "milestone",
15510
+ group: "Projects",
15511
+ input: external_exports.object({
15512
+ milestone_id: external_exports.string().describe("Milestone UUID")
15513
+ }),
15514
+ output: external_exports.object({
15515
+ milestone: milestoneSchema.describe("The requested milestone")
15516
+ }),
15517
+ handle: async (params) => {
15518
+ const data = await graphql(
15519
+ `query GetMilestone($id: String!) {
15520
+ projectMilestone(id: $id) {
15521
+ id name description targetDate sortOrder
15522
+ }
15523
+ }`,
15524
+ { id: params.milestone_id }
15525
+ );
15526
+ if (!data.projectMilestone) throw ToolError.notFound("Milestone not found");
15527
+ return { milestone: mapMilestone(data.projectMilestone) };
15528
+ }
15529
+ });
15530
+
14695
15531
  // src/tools/get-project.ts
14696
15532
  var getProject = defineTool({
14697
15533
  name: "get_project",
@@ -14722,6 +15558,62 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
14722
15558
  }
14723
15559
  });
14724
15560
 
15561
+ // src/tools/get-team.ts
15562
+ var getTeam = defineTool({
15563
+ name: "get_team",
15564
+ displayName: "Get Team",
15565
+ description: "Get detailed information about a single Linear team by its UUID.",
15566
+ summary: "Get details of a single team",
15567
+ icon: "users",
15568
+ group: "Teams & Users",
15569
+ input: external_exports.object({
15570
+ team_id: external_exports.string().describe("Team UUID")
15571
+ }),
15572
+ output: external_exports.object({
15573
+ team: teamSchema.describe("The requested team")
15574
+ }),
15575
+ handle: async (params) => {
15576
+ const data = await graphql(
15577
+ `query GetTeam($id: String!) {
15578
+ team(id: $id) {
15579
+ id key name description
15580
+ }
15581
+ }`,
15582
+ { id: params.team_id }
15583
+ );
15584
+ if (!data.team) throw ToolError.notFound("Team not found");
15585
+ return { team: mapTeam(data.team) };
15586
+ }
15587
+ });
15588
+
15589
+ // src/tools/get-user.ts
15590
+ var getUser = defineTool({
15591
+ name: "get_user",
15592
+ displayName: "Get User",
15593
+ description: "Get detailed information about a single Linear user by their UUID.",
15594
+ summary: "Get details of a single user",
15595
+ icon: "user",
15596
+ group: "Teams & Users",
15597
+ input: external_exports.object({
15598
+ user_id: external_exports.string().describe("User UUID")
15599
+ }),
15600
+ output: external_exports.object({
15601
+ user: userSchema.describe("The requested user")
15602
+ }),
15603
+ handle: async (params) => {
15604
+ const data = await graphql(
15605
+ `query GetUser($id: String!) {
15606
+ user(id: $id) {
15607
+ id name email displayName active admin
15608
+ }
15609
+ }`,
15610
+ { id: params.user_id }
15611
+ );
15612
+ if (!data.user) throw ToolError.notFound("User not found");
15613
+ return { user: mapUser(data.user) };
15614
+ }
15615
+ });
15616
+
14725
15617
  // src/tools/get-viewer.ts
14726
15618
  var getViewer = defineTool({
14727
15619
  name: "get_viewer",
@@ -14753,6 +15645,51 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
14753
15645
  }
14754
15646
  });
14755
15647
 
15648
+ // src/tools/list-attachments.ts
15649
+ var listAttachments = defineTool({
15650
+ name: "list_attachments",
15651
+ displayName: "List Attachments",
15652
+ description: "List attachments (linked PRs, documents, URLs) on a Linear issue.",
15653
+ summary: "List attachments on an issue",
15654
+ icon: "paperclip",
15655
+ group: "Issues",
15656
+ input: external_exports.object({
15657
+ issue_id: external_exports.string().describe("Issue UUID to list attachments for"),
15658
+ limit: external_exports.number().optional().describe("Maximum number of attachments to return (default 25, max 50)"),
15659
+ after: external_exports.string().optional().describe("Pagination cursor from a previous response")
15660
+ }),
15661
+ output: external_exports.object({
15662
+ attachments: external_exports.array(attachmentSchema).describe("List of attachments on the issue"),
15663
+ pagination: paginationSchema.describe("Pagination info for fetching more results")
15664
+ }),
15665
+ handle: async (params) => {
15666
+ const limit = Math.min(params.limit ?? 25, 50);
15667
+ const data = await graphql(
15668
+ `query ListAttachments($id: String!, $first: Int, $after: String) {
15669
+ issue(id: $id) {
15670
+ attachments(first: $first, after: $after) {
15671
+ nodes {
15672
+ id title subtitle url sourceType createdAt updatedAt
15673
+ creator { name displayName }
15674
+ }
15675
+ pageInfo { hasNextPage endCursor }
15676
+ }
15677
+ }
15678
+ }`,
15679
+ { id: params.issue_id, first: limit, after: params.after }
15680
+ );
15681
+ if (!data.issue) throw ToolError.notFound("Issue not found");
15682
+ const result = data.issue.attachments;
15683
+ return {
15684
+ attachments: result.nodes.map((n) => mapAttachment(n)),
15685
+ pagination: {
15686
+ has_next_page: result.pageInfo?.hasNextPage ?? false,
15687
+ end_cursor: result.pageInfo?.endCursor ?? ""
15688
+ }
15689
+ };
15690
+ }
15691
+ });
15692
+
14756
15693
  // src/tools/list-comments.ts
14757
15694
  var listComments = defineTool({
14758
15695
  name: "list_comments",
@@ -14842,6 +15779,150 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
14842
15779
  }
14843
15780
  });
14844
15781
 
15782
+ // src/tools/list-documents.ts
15783
+ var listDocuments = defineTool({
15784
+ name: "list_documents",
15785
+ displayName: "List Documents",
15786
+ description: "List documents in the Linear workspace, optionally filtered by project.",
15787
+ summary: "List documents",
15788
+ icon: "file-text",
15789
+ group: "Documents",
15790
+ input: external_exports.object({
15791
+ project_id: external_exports.string().optional().describe("Filter by project UUID"),
15792
+ limit: external_exports.number().optional().describe("Maximum number of results to return (default 25, max 50)"),
15793
+ after: external_exports.string().optional().describe("Pagination cursor from a previous response")
15794
+ }),
15795
+ output: external_exports.object({
15796
+ documents: external_exports.array(documentSchema).describe("List of documents"),
15797
+ pagination: paginationSchema.describe("Pagination info for fetching more results")
15798
+ }),
15799
+ handle: async (params) => {
15800
+ const limit = Math.min(params.limit ?? 25, 50);
15801
+ const filter = {};
15802
+ if (params.project_id) filter.project = { id: { eq: params.project_id } };
15803
+ const filterArg = Object.keys(filter).length > 0 ? filter : void 0;
15804
+ const data = await graphql(
15805
+ `query ListDocuments($first: Int, $after: String, $filter: DocumentFilter) {
15806
+ documents(first: $first, after: $after, filter: $filter) {
15807
+ nodes {
15808
+ id title content slugId icon url createdAt updatedAt
15809
+ creator { name displayName }
15810
+ project { name }
15811
+ }
15812
+ pageInfo { hasNextPage endCursor }
15813
+ }
15814
+ }`,
15815
+ { first: limit, after: params.after, filter: filterArg }
15816
+ );
15817
+ if (!data.documents) throw ToolError.internal("Failed to list documents");
15818
+ const result = data.documents;
15819
+ return {
15820
+ documents: result.nodes.map((n) => mapDocument(n)),
15821
+ pagination: {
15822
+ has_next_page: result.pageInfo?.hasNextPage ?? false,
15823
+ end_cursor: result.pageInfo?.endCursor ?? ""
15824
+ }
15825
+ };
15826
+ }
15827
+ });
15828
+
15829
+ // src/tools/list-initiatives.ts
15830
+ var listInitiatives = defineTool({
15831
+ name: "list_initiatives",
15832
+ displayName: "List Initiatives",
15833
+ description: "List initiatives in the Linear workspace, optionally filtered by status.",
15834
+ summary: "List initiatives",
15835
+ icon: "target",
15836
+ group: "Initiatives",
15837
+ input: external_exports.object({
15838
+ status: external_exports.enum(["Planned", "Active", "Completed"]).optional().describe("Filter by initiative status"),
15839
+ limit: external_exports.number().optional().describe("Maximum number of results to return (default 25, max 50)"),
15840
+ after: external_exports.string().optional().describe("Pagination cursor from a previous response")
15841
+ }),
15842
+ output: external_exports.object({
15843
+ initiatives: external_exports.array(initiativeSchema).describe("List of initiatives"),
15844
+ pagination: paginationSchema.describe("Pagination info for fetching more results")
15845
+ }),
15846
+ handle: async (params) => {
15847
+ const limit = Math.min(params.limit ?? 25, 50);
15848
+ const filter = {};
15849
+ if (params.status) filter.status = { eq: params.status };
15850
+ const filterArg = Object.keys(filter).length > 0 ? filter : void 0;
15851
+ const data = await graphql(
15852
+ `query ListInitiatives($first: Int, $after: String, $filter: InitiativeFilter) {
15853
+ initiatives(first: $first, after: $after, filter: $filter) {
15854
+ nodes {
15855
+ id name description status color icon url createdAt updatedAt
15856
+ owner { name displayName }
15857
+ }
15858
+ pageInfo { hasNextPage endCursor }
15859
+ }
15860
+ }`,
15861
+ { first: limit, after: params.after, filter: filterArg }
15862
+ );
15863
+ if (!data.initiatives) throw ToolError.internal("Failed to list initiatives");
15864
+ const result = data.initiatives;
15865
+ return {
15866
+ initiatives: result.nodes.map((n) => mapInitiative(n)),
15867
+ pagination: {
15868
+ has_next_page: result.pageInfo?.hasNextPage ?? false,
15869
+ end_cursor: result.pageInfo?.endCursor ?? ""
15870
+ }
15871
+ };
15872
+ }
15873
+ });
15874
+
15875
+ // src/tools/list-issue-history.ts
15876
+ var listIssueHistory = defineTool({
15877
+ name: "list_issue_history",
15878
+ displayName: "List Issue History",
15879
+ description: "List the change history (state changes, assignee changes, priority changes) for a Linear issue.",
15880
+ summary: "List issue change history",
15881
+ icon: "history",
15882
+ group: "Issues",
15883
+ input: external_exports.object({
15884
+ issue_id: external_exports.string().describe("Issue UUID to list history for"),
15885
+ limit: external_exports.number().optional().describe("Maximum number of entries to return (default 25, max 50)"),
15886
+ after: external_exports.string().optional().describe("Pagination cursor from a previous response")
15887
+ }),
15888
+ output: external_exports.object({
15889
+ history: external_exports.array(issueHistorySchema).describe("List of history entries"),
15890
+ pagination: paginationSchema.describe("Pagination info for fetching more results")
15891
+ }),
15892
+ handle: async (params) => {
15893
+ const limit = Math.min(params.limit ?? 25, 50);
15894
+ const data = await graphql(
15895
+ `query ListIssueHistory($id: String!, $first: Int, $after: String) {
15896
+ issue(id: $id) {
15897
+ history(first: $first, after: $after) {
15898
+ nodes {
15899
+ id createdAt
15900
+ actor { name displayName }
15901
+ fromState { name }
15902
+ toState { name }
15903
+ fromAssignee { name displayName }
15904
+ toAssignee { name displayName }
15905
+ fromPriority
15906
+ toPriority
15907
+ }
15908
+ pageInfo { hasNextPage endCursor }
15909
+ }
15910
+ }
15911
+ }`,
15912
+ { id: params.issue_id, first: limit, after: params.after }
15913
+ );
15914
+ if (!data.issue) throw ToolError.notFound("Issue not found");
15915
+ const result = data.issue.history;
15916
+ return {
15917
+ history: result.nodes.map((n) => mapIssueHistory(n)),
15918
+ pagination: {
15919
+ has_next_page: result.pageInfo?.hasNextPage ?? false,
15920
+ end_cursor: result.pageInfo?.endCursor ?? ""
15921
+ }
15922
+ };
15923
+ }
15924
+ });
15925
+
14845
15926
  // src/tools/list-issue-relations.ts
14846
15927
  var relationSchema = external_exports.object({
14847
15928
  id: external_exports.string().describe("Relation UUID"),
@@ -14931,61 +16012,273 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
14931
16012
  group: "Workflow",
14932
16013
  input: external_exports.object({}),
14933
16014
  output: external_exports.object({
14934
- labels: external_exports.array(labelSchema).describe("List of issue labels")
16015
+ labels: external_exports.array(labelSchema).describe("List of issue labels")
16016
+ }),
16017
+ handle: async () => {
16018
+ const data = await graphql(
16019
+ `query ListLabels {
16020
+ issueLabels {
16021
+ nodes {
16022
+ id name color description isGroup
16023
+ parent { name }
16024
+ }
16025
+ }
16026
+ }`
16027
+ );
16028
+ return {
16029
+ labels: data.issueLabels.nodes.map((n) => mapLabel(n))
16030
+ };
16031
+ }
16032
+ });
16033
+
16034
+ // src/tools/list-milestones.ts
16035
+ var listMilestones = defineTool({
16036
+ name: "list_milestones",
16037
+ displayName: "List Milestones",
16038
+ description: "List milestones for a Linear project.",
16039
+ summary: "List project milestones",
16040
+ icon: "milestone",
16041
+ group: "Projects",
16042
+ input: external_exports.object({
16043
+ project_id: external_exports.string().describe("Project UUID to list milestones for")
16044
+ }),
16045
+ output: external_exports.object({
16046
+ milestones: external_exports.array(milestoneSchema).describe("List of milestones in the project")
16047
+ }),
16048
+ handle: async (params) => {
16049
+ const data = await graphql(
16050
+ `query ListMilestones($id: String!) {
16051
+ project(id: $id) {
16052
+ projectMilestones {
16053
+ nodes {
16054
+ id name description targetDate sortOrder
16055
+ }
16056
+ }
16057
+ }
16058
+ }`,
16059
+ { id: params.project_id }
16060
+ );
16061
+ if (!data.project) throw ToolError.notFound("Project not found");
16062
+ return {
16063
+ milestones: (data.project.projectMilestones?.nodes ?? []).map(
16064
+ (n) => mapMilestone(n)
16065
+ )
16066
+ };
16067
+ }
16068
+ });
16069
+
16070
+ // src/tools/list-project-labels.ts
16071
+ var listProjectLabels = defineTool({
16072
+ name: "list_project_labels",
16073
+ displayName: "List Project Labels",
16074
+ description: "List labels applied to a specific Linear project.",
16075
+ summary: "List labels on a project",
16076
+ icon: "tag",
16077
+ group: "Projects",
16078
+ input: external_exports.object({
16079
+ project_id: external_exports.string().describe("Project UUID to list labels for")
16080
+ }),
16081
+ output: external_exports.object({
16082
+ labels: external_exports.array(labelSchema).describe("List of labels on the project")
16083
+ }),
16084
+ handle: async (params) => {
16085
+ const data = await graphql(
16086
+ `query ListProjectLabels($id: String!) {
16087
+ project(id: $id) {
16088
+ labels {
16089
+ nodes {
16090
+ id name color description isGroup
16091
+ parent { name }
16092
+ }
16093
+ }
16094
+ }
16095
+ }`,
16096
+ { id: params.project_id }
16097
+ );
16098
+ if (!data.project) throw ToolError.notFound("Project not found");
16099
+ return {
16100
+ labels: (data.project.labels?.nodes ?? []).map((n) => mapLabel(n))
16101
+ };
16102
+ }
16103
+ });
16104
+
16105
+ // src/tools/list-project-updates.ts
16106
+ var listProjectUpdates = defineTool({
16107
+ name: "list_project_updates",
16108
+ displayName: "List Project Updates",
16109
+ description: "List status updates (health reports) for a Linear project.",
16110
+ summary: "List project status updates",
16111
+ icon: "activity",
16112
+ group: "Projects",
16113
+ input: external_exports.object({
16114
+ project_id: external_exports.string().describe("Project UUID to list updates for"),
16115
+ limit: external_exports.number().optional().describe("Maximum number of results to return (default 25, max 50)"),
16116
+ after: external_exports.string().optional().describe("Pagination cursor from a previous response")
16117
+ }),
16118
+ output: external_exports.object({
16119
+ updates: external_exports.array(statusUpdateSchema).describe("List of status updates"),
16120
+ pagination: paginationSchema.describe("Pagination info for fetching more results")
16121
+ }),
16122
+ handle: async (params) => {
16123
+ const limit = Math.min(params.limit ?? 25, 50);
16124
+ const data = await graphql(
16125
+ `query ListProjectUpdates($id: String!, $first: Int, $after: String) {
16126
+ project(id: $id) {
16127
+ projectUpdates(first: $first, after: $after) {
16128
+ nodes {
16129
+ id body health createdAt updatedAt
16130
+ user { name displayName }
16131
+ }
16132
+ pageInfo { hasNextPage endCursor }
16133
+ }
16134
+ }
16135
+ }`,
16136
+ { id: params.project_id, first: limit, after: params.after }
16137
+ );
16138
+ if (!data.project) throw ToolError.notFound("Project not found");
16139
+ const result = data.project.projectUpdates;
16140
+ return {
16141
+ updates: result.nodes.map((n) => mapStatusUpdate(n)),
16142
+ pagination: {
16143
+ has_next_page: result.pageInfo?.hasNextPage ?? false,
16144
+ end_cursor: result.pageInfo?.endCursor ?? ""
16145
+ }
16146
+ };
16147
+ }
16148
+ });
16149
+
16150
+ // src/tools/list-projects.ts
16151
+ var listProjects = defineTool({
16152
+ name: "list_projects",
16153
+ displayName: "List Projects",
16154
+ description: "List all projects in the Linear workspace. Supports pagination.",
16155
+ summary: "List all projects",
16156
+ icon: "folder",
16157
+ group: "Projects",
16158
+ input: external_exports.object({
16159
+ limit: external_exports.number().optional().describe("Maximum number of projects to return (default 25, max 50)"),
16160
+ after: external_exports.string().optional().describe("Pagination cursor from a previous response")
16161
+ }),
16162
+ output: external_exports.object({
16163
+ projects: external_exports.array(projectSchema).describe("List of projects"),
16164
+ pagination: paginationSchema.describe("Pagination info for fetching more results")
16165
+ }),
16166
+ handle: async (params) => {
16167
+ const limit = Math.min(params.limit ?? 25, 50);
16168
+ const data = await graphql(
16169
+ `query ListProjects($first: Int, $after: String) {
16170
+ projects(first: $first, after: $after, orderBy: updatedAt) {
16171
+ nodes {
16172
+ id name description url createdAt updatedAt
16173
+ targetDate startDate
16174
+ status { name }
16175
+ lead { name displayName }
16176
+ }
16177
+ pageInfo { hasNextPage endCursor }
16178
+ }
16179
+ }`,
16180
+ { first: limit, after: params.after }
16181
+ );
16182
+ if (!data.projects) throw ToolError.internal("Projects query returned no results object");
16183
+ const result = data.projects;
16184
+ return {
16185
+ projects: result.nodes.map((n) => mapProject(n)),
16186
+ pagination: {
16187
+ has_next_page: result.pageInfo?.hasNextPage ?? false,
16188
+ end_cursor: result.pageInfo?.endCursor ?? ""
16189
+ }
16190
+ };
16191
+ }
16192
+ });
16193
+
16194
+ // src/tools/list-sub-issues.ts
16195
+ var ISSUE_FIELDS3 = `
16196
+ id identifier title description priority priorityLabel url
16197
+ createdAt updatedAt dueDate estimate
16198
+ state { name type }
16199
+ assignee { name displayName }
16200
+ team { key name }
16201
+ labels { nodes { name } }
16202
+ project { name }
16203
+ cycle { number }
16204
+ `;
16205
+ var listSubIssues = defineTool({
16206
+ name: "list_sub_issues",
16207
+ displayName: "List Sub-Issues",
16208
+ description: "List child/sub-issues of a parent Linear issue.",
16209
+ summary: "List sub-issues of an issue",
16210
+ icon: "list-tree",
16211
+ group: "Issues",
16212
+ input: external_exports.object({
16213
+ issue_id: external_exports.string().describe("Parent issue UUID to list sub-issues for"),
16214
+ limit: external_exports.number().optional().describe("Maximum number of results to return (default 25, max 50)"),
16215
+ after: external_exports.string().optional().describe("Pagination cursor from a previous response")
16216
+ }),
16217
+ output: external_exports.object({
16218
+ sub_issues: external_exports.array(issueSchema).describe("List of sub-issues"),
16219
+ pagination: paginationSchema.describe("Pagination info for fetching more results")
14935
16220
  }),
14936
- handle: async () => {
16221
+ handle: async (params) => {
16222
+ const limit = Math.min(params.limit ?? 25, 50);
14937
16223
  const data = await graphql(
14938
- `query ListLabels {
14939
- issueLabels {
14940
- nodes {
14941
- id name color description isGroup
14942
- parent { name }
16224
+ `query ListSubIssues($id: String!, $first: Int, $after: String) {
16225
+ issue(id: $id) {
16226
+ children(first: $first, after: $after) {
16227
+ nodes { ${ISSUE_FIELDS3} }
16228
+ pageInfo { hasNextPage endCursor }
14943
16229
  }
14944
16230
  }
14945
- }`
16231
+ }`,
16232
+ { id: params.issue_id, first: limit, after: params.after }
14946
16233
  );
16234
+ if (!data.issue) throw ToolError.notFound("Issue not found");
16235
+ const result = data.issue.children;
14947
16236
  return {
14948
- labels: data.issueLabels.nodes.map((n) => mapLabel(n))
16237
+ sub_issues: result.nodes.map((n) => mapIssue(n)),
16238
+ pagination: {
16239
+ has_next_page: result.pageInfo?.hasNextPage ?? false,
16240
+ end_cursor: result.pageInfo?.endCursor ?? ""
16241
+ }
14949
16242
  };
14950
16243
  }
14951
16244
  });
14952
16245
 
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",
16246
+ // src/tools/list-team-members.ts
16247
+ var listTeamMembers = defineTool({
16248
+ name: "list_team_members",
16249
+ displayName: "List Team Members",
16250
+ description: "List members of a specific Linear team.",
16251
+ summary: "List members of a team",
16252
+ icon: "users",
16253
+ group: "Teams & Users",
14961
16254
  input: external_exports.object({
14962
- limit: external_exports.number().optional().describe("Maximum number of projects to return (default 25, max 50)"),
16255
+ team_id: external_exports.string().describe("Team UUID to list members for"),
16256
+ limit: external_exports.number().optional().describe("Maximum number of results to return (default 50, max 100)"),
14963
16257
  after: external_exports.string().optional().describe("Pagination cursor from a previous response")
14964
16258
  }),
14965
16259
  output: external_exports.object({
14966
- projects: external_exports.array(projectSchema).describe("List of projects"),
16260
+ members: external_exports.array(userSchema).describe("List of team members"),
14967
16261
  pagination: paginationSchema.describe("Pagination info for fetching more results")
14968
16262
  }),
14969
16263
  handle: async (params) => {
14970
- const limit = Math.min(params.limit ?? 25, 50);
16264
+ const limit = Math.min(params.limit ?? 50, 100);
14971
16265
  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 }
16266
+ `query ListTeamMembers($id: String!, $first: Int, $after: String) {
16267
+ team(id: $id) {
16268
+ members(first: $first, after: $after) {
16269
+ nodes {
16270
+ id name email displayName active admin
16271
+ }
16272
+ pageInfo { hasNextPage endCursor }
14979
16273
  }
14980
- pageInfo { hasNextPage endCursor }
14981
16274
  }
14982
16275
  }`,
14983
- { first: limit, after: params.after }
16276
+ { id: params.team_id, first: limit, after: params.after }
14984
16277
  );
14985
- if (!data.projects) throw ToolError.internal("Projects query returned no results object");
14986
- const result = data.projects;
16278
+ if (!data.team) throw ToolError.notFound("Team not found");
16279
+ const result = data.team.members;
14987
16280
  return {
14988
- projects: result.nodes.map((n) => mapProject(n)),
16281
+ members: result.nodes.map((n) => mapUser(n)),
14989
16282
  pagination: {
14990
16283
  has_next_page: result.pageInfo?.hasNextPage ?? false,
14991
16284
  end_cursor: result.pageInfo?.endCursor ?? ""
@@ -15096,8 +16389,137 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
15096
16389
  }
15097
16390
  });
15098
16391
 
16392
+ // src/tools/move-issue-to-project.ts
16393
+ var moveIssueToProject = defineTool({
16394
+ name: "move_issue_to_project",
16395
+ displayName: "Move Issue to Project",
16396
+ 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.",
16397
+ summary: "Move an issue between projects",
16398
+ icon: "folder-input",
16399
+ group: "Issues",
16400
+ input: external_exports.object({
16401
+ issue_id: external_exports.string().describe("Issue UUID to move"),
16402
+ project_id: external_exports.string().describe("Target project UUID, or empty string to remove from project")
16403
+ }),
16404
+ output: external_exports.object({
16405
+ issue: issueSchema.describe("The updated issue")
16406
+ }),
16407
+ handle: async (params) => {
16408
+ const input = {
16409
+ projectId: params.project_id || null
16410
+ };
16411
+ const data = await graphql(
16412
+ `mutation MoveIssueToProject($id: String!, $input: IssueUpdateInput!) {
16413
+ issueUpdate(id: $id, input: $input) {
16414
+ success
16415
+ issue {
16416
+ id identifier title description priority priorityLabel url
16417
+ createdAt updatedAt dueDate estimate
16418
+ state { name type }
16419
+ assignee { name displayName }
16420
+ team { key name }
16421
+ labels { nodes { name } }
16422
+ project { name }
16423
+ cycle { number }
16424
+ }
16425
+ }
16426
+ }`,
16427
+ { id: params.issue_id, input }
16428
+ );
16429
+ if (!data.issueUpdate?.issue) throw ToolError.internal("Failed to move issue \u2014 no issue returned");
16430
+ return { issue: mapIssue(data.issueUpdate.issue) };
16431
+ }
16432
+ });
16433
+
16434
+ // src/tools/remove-issue-label.ts
16435
+ var ISSUE_FIELDS4 = `
16436
+ id identifier title description priority priorityLabel url
16437
+ createdAt updatedAt dueDate estimate
16438
+ state { name type }
16439
+ assignee { name displayName }
16440
+ team { key name }
16441
+ labels { nodes { id name } }
16442
+ project { name }
16443
+ cycle { number }
16444
+ `;
16445
+ var removeIssueLabel = defineTool({
16446
+ name: "remove_issue_label",
16447
+ displayName: "Remove Issue Label",
16448
+ description: "Remove a label from an issue without affecting other labels. Unlike update_issue which replaces all labels, this removes only the specified one.",
16449
+ summary: "Remove a label from an issue",
16450
+ icon: "tag",
16451
+ group: "Issues",
16452
+ input: external_exports.object({
16453
+ issue_id: external_exports.string().describe("Issue UUID to remove the label from"),
16454
+ label_id: external_exports.string().describe("Label UUID to remove (use list_labels to find label IDs)")
16455
+ }),
16456
+ output: external_exports.object({
16457
+ issue: issueSchema.describe("The updated issue with the label removed")
16458
+ }),
16459
+ handle: async (params) => {
16460
+ const current = await graphql(
16461
+ `query GetIssueLabels($id: String!) {
16462
+ issue(id: $id) {
16463
+ labels { nodes { id } }
16464
+ }
16465
+ }`,
16466
+ { id: params.issue_id }
16467
+ );
16468
+ if (!current.issue) throw ToolError.notFound("Issue not found");
16469
+ const existingIds = (current.issue.labels?.nodes ?? []).map((l) => l.id);
16470
+ const labelIds = existingIds.filter((id) => id !== params.label_id);
16471
+ if (labelIds.length === existingIds.length) {
16472
+ const data2 = await graphql(
16473
+ `query GetIssue($id: String!) { issue(id: $id) { ${ISSUE_FIELDS4} } }`,
16474
+ { id: params.issue_id }
16475
+ );
16476
+ return { issue: mapIssue(data2.issue) };
16477
+ }
16478
+ const data = await graphql(
16479
+ `mutation RemoveIssueLabel($id: String!, $input: IssueUpdateInput!) {
16480
+ issueUpdate(id: $id, input: $input) {
16481
+ success
16482
+ issue { ${ISSUE_FIELDS4} }
16483
+ }
16484
+ }`,
16485
+ { id: params.issue_id, input: { labelIds } }
16486
+ );
16487
+ if (!data.issueUpdate?.issue) throw ToolError.internal("Failed to remove label \u2014 no issue returned");
16488
+ return { issue: mapIssue(data.issueUpdate.issue) };
16489
+ }
16490
+ });
16491
+
16492
+ // src/tools/remove-issue-subscriber.ts
16493
+ var removeIssueSubscriber = defineTool({
16494
+ name: "remove_issue_subscriber",
16495
+ displayName: "Remove Issue Subscriber",
16496
+ description: "Unsubscribe a user from notifications for a Linear issue.",
16497
+ summary: "Unsubscribe a user from an issue",
16498
+ icon: "bell-minus",
16499
+ group: "Issues",
16500
+ input: external_exports.object({
16501
+ issue_id: external_exports.string().describe("Issue UUID to unsubscribe from"),
16502
+ subscriber_id: external_exports.string().describe("User UUID to unsubscribe")
16503
+ }),
16504
+ output: external_exports.object({
16505
+ success: external_exports.boolean().describe("Whether the unsubscription was successful")
16506
+ }),
16507
+ handle: async (params) => {
16508
+ const data = await graphql(
16509
+ `mutation RemoveIssueSubscriber($id: String!, $userId: String!) {
16510
+ issueUnsubscribe(id: $id, userId: $userId) {
16511
+ success
16512
+ }
16513
+ }`,
16514
+ { id: params.issue_id, userId: params.subscriber_id }
16515
+ );
16516
+ if (!data.issueUnsubscribe) throw ToolError.internal("Failed to unsubscribe \u2014 no response");
16517
+ return { success: data.issueUnsubscribe.success };
16518
+ }
16519
+ });
16520
+
15099
16521
  // src/tools/search-issues.ts
15100
- var ISSUE_FIELDS = `
16522
+ var ISSUE_FIELDS5 = `
15101
16523
  id identifier title description priority priorityLabel url
15102
16524
  createdAt updatedAt dueDate estimate
15103
16525
  state { name type }
@@ -15144,7 +16566,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
15144
16566
  const data2 = await graphql(
15145
16567
  `query SearchIssues($query: String!, $first: Int, $after: String, $filter: IssueFilter) {
15146
16568
  searchIssues(term: $query, first: $first, after: $after, filter: $filter) {
15147
- nodes { ${ISSUE_FIELDS} }
16569
+ nodes { ${ISSUE_FIELDS5} }
15148
16570
  pageInfo { hasNextPage endCursor }
15149
16571
  totalCount
15150
16572
  }
@@ -15165,7 +16587,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
15165
16587
  const data = await graphql(
15166
16588
  `query ListIssues($first: Int, $after: String, $filter: IssueFilter) {
15167
16589
  issues(first: $first, after: $after, filter: $filter, orderBy: updatedAt) {
15168
- nodes { ${ISSUE_FIELDS} }
16590
+ nodes { ${ISSUE_FIELDS5} }
15169
16591
  pageInfo { hasNextPage endCursor }
15170
16592
  }
15171
16593
  }`,
@@ -15184,6 +16606,48 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
15184
16606
  }
15185
16607
  });
15186
16608
 
16609
+ // src/tools/set-issue-cycle.ts
16610
+ var setIssueCycle = defineTool({
16611
+ name: "set_issue_cycle",
16612
+ displayName: "Set Issue Cycle",
16613
+ 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.",
16614
+ summary: "Assign an issue to a cycle/sprint",
16615
+ icon: "refresh-cw",
16616
+ group: "Issues",
16617
+ input: external_exports.object({
16618
+ issue_id: external_exports.string().describe("Issue UUID to update"),
16619
+ cycle_id: external_exports.string().describe("Cycle UUID to assign to, or empty string to remove from cycle")
16620
+ }),
16621
+ output: external_exports.object({
16622
+ issue: issueSchema.describe("The updated issue")
16623
+ }),
16624
+ handle: async (params) => {
16625
+ const input = {
16626
+ cycleId: params.cycle_id || null
16627
+ };
16628
+ const data = await graphql(
16629
+ `mutation SetIssueCycle($id: String!, $input: IssueUpdateInput!) {
16630
+ issueUpdate(id: $id, input: $input) {
16631
+ success
16632
+ issue {
16633
+ id identifier title description priority priorityLabel url
16634
+ createdAt updatedAt dueDate estimate
16635
+ state { name type }
16636
+ assignee { name displayName }
16637
+ team { key name }
16638
+ labels { nodes { name } }
16639
+ project { name }
16640
+ cycle { number }
16641
+ }
16642
+ }
16643
+ }`,
16644
+ { id: params.issue_id, input }
16645
+ );
16646
+ if (!data.issueUpdate?.issue) throw ToolError.internal("Failed to set cycle \u2014 no issue returned");
16647
+ return { issue: mapIssue(data.issueUpdate.issue) };
16648
+ }
16649
+ });
16650
+
15187
16651
  // src/tools/update-comment.ts
15188
16652
  var updateComment = defineTool({
15189
16653
  name: "update_comment",
@@ -15218,6 +16682,94 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
15218
16682
  }
15219
16683
  });
15220
16684
 
16685
+ // src/tools/update-document.ts
16686
+ var updateDocument = defineTool({
16687
+ name: "update_document",
16688
+ displayName: "Update Document",
16689
+ description: "Update an existing Linear document. Only specified fields are changed.",
16690
+ summary: "Update an existing document",
16691
+ icon: "file-edit",
16692
+ group: "Documents",
16693
+ input: external_exports.object({
16694
+ document_id: external_exports.string().describe("Document UUID to update"),
16695
+ title: external_exports.string().optional().describe("New document title"),
16696
+ content: external_exports.string().optional().describe("New document content in markdown"),
16697
+ project_id: external_exports.string().optional().describe("Move to this project UUID"),
16698
+ icon: external_exports.string().optional().describe("New icon emoji")
16699
+ }),
16700
+ output: external_exports.object({
16701
+ document: documentSchema.describe("The updated document")
16702
+ }),
16703
+ handle: async (params) => {
16704
+ const input = {};
16705
+ if (params.title !== void 0) input.title = params.title;
16706
+ if (params.content !== void 0) input.content = params.content;
16707
+ if (params.project_id !== void 0) input.projectId = params.project_id;
16708
+ if (params.icon !== void 0) input.icon = params.icon;
16709
+ const data = await graphql(
16710
+ `mutation UpdateDocument($id: String!, $input: DocumentUpdateInput!) {
16711
+ documentUpdate(id: $id, input: $input) {
16712
+ success
16713
+ document {
16714
+ id title content slugId icon url createdAt updatedAt
16715
+ creator { name displayName }
16716
+ project { name }
16717
+ }
16718
+ }
16719
+ }`,
16720
+ { id: params.document_id, input }
16721
+ );
16722
+ if (!data.documentUpdate?.document) throw ToolError.internal("Document update failed \u2014 no document returned");
16723
+ return { document: mapDocument(data.documentUpdate.document) };
16724
+ }
16725
+ });
16726
+
16727
+ // src/tools/update-initiative.ts
16728
+ var updateInitiative = defineTool({
16729
+ name: "update_initiative",
16730
+ displayName: "Update Initiative",
16731
+ description: "Update an existing Linear initiative. Only specified fields are changed.",
16732
+ summary: "Update an existing initiative",
16733
+ icon: "target",
16734
+ group: "Initiatives",
16735
+ input: external_exports.object({
16736
+ initiative_id: external_exports.string().describe("Initiative UUID to update"),
16737
+ name: external_exports.string().optional().describe("New initiative name"),
16738
+ description: external_exports.string().optional().describe("New initiative description in markdown"),
16739
+ status: external_exports.enum(["Planned", "Active", "Completed"]).optional().describe("New initiative status"),
16740
+ color: external_exports.string().optional().describe("New color hex code"),
16741
+ owner_id: external_exports.string().optional().describe("New owner user UUID")
16742
+ }),
16743
+ output: external_exports.object({
16744
+ initiative: initiativeSchema.describe("The updated initiative")
16745
+ }),
16746
+ handle: async (params) => {
16747
+ const input = {};
16748
+ if (params.name !== void 0) input.name = params.name;
16749
+ if (params.description !== void 0) input.description = params.description;
16750
+ if (params.status !== void 0) input.status = params.status;
16751
+ if (params.color !== void 0) input.color = params.color;
16752
+ if (params.owner_id !== void 0) input.ownerId = params.owner_id;
16753
+ const data = await graphql(
16754
+ `mutation UpdateInitiative($id: String!, $input: InitiativeUpdateInput!) {
16755
+ initiativeUpdate(id: $id, input: $input) {
16756
+ success
16757
+ initiative {
16758
+ id name description status color icon url createdAt updatedAt
16759
+ owner { name displayName }
16760
+ }
16761
+ }
16762
+ }`,
16763
+ { id: params.initiative_id, input }
16764
+ );
16765
+ if (!data.initiativeUpdate?.initiative)
16766
+ throw ToolError.internal("Initiative update failed \u2014 no initiative returned");
16767
+ return {
16768
+ initiative: mapInitiative(data.initiativeUpdate.initiative)
16769
+ };
16770
+ }
16771
+ });
16772
+
15221
16773
  // src/tools/update-issue.ts
15222
16774
  var updateIssue = defineTool({
15223
16775
  name: "update_issue",
@@ -15281,6 +16833,86 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
15281
16833
  }
15282
16834
  });
15283
16835
 
16836
+ // src/tools/update-label.ts
16837
+ var updateLabel = defineTool({
16838
+ name: "update_label",
16839
+ displayName: "Update Label",
16840
+ description: "Update an existing Linear issue label. Only specified fields are changed.",
16841
+ summary: "Update a label",
16842
+ icon: "tag",
16843
+ group: "Workflow",
16844
+ input: external_exports.object({
16845
+ label_id: external_exports.string().describe("Label UUID to update"),
16846
+ name: external_exports.string().optional().describe("New label name"),
16847
+ color: external_exports.string().optional().describe("New color hex code"),
16848
+ description: external_exports.string().optional().describe("New label description")
16849
+ }),
16850
+ output: external_exports.object({
16851
+ label: labelSchema.describe("The updated label")
16852
+ }),
16853
+ handle: async (params) => {
16854
+ const input = {};
16855
+ if (params.name !== void 0) input.name = params.name;
16856
+ if (params.color !== void 0) input.color = params.color;
16857
+ if (params.description !== void 0) input.description = params.description;
16858
+ const data = await graphql(
16859
+ `mutation UpdateLabel($id: String!, $input: IssueLabelUpdateInput!) {
16860
+ issueLabelUpdate(id: $id, input: $input) {
16861
+ success
16862
+ issueLabel {
16863
+ id name color description isGroup
16864
+ parent { name }
16865
+ }
16866
+ }
16867
+ }`,
16868
+ { id: params.label_id, input }
16869
+ );
16870
+ if (!data.issueLabelUpdate?.issueLabel) throw ToolError.internal("Label update failed \u2014 no label returned");
16871
+ return { label: mapLabel(data.issueLabelUpdate.issueLabel) };
16872
+ }
16873
+ });
16874
+
16875
+ // src/tools/update-milestone.ts
16876
+ var updateMilestone = defineTool({
16877
+ name: "update_milestone",
16878
+ displayName: "Update Milestone",
16879
+ description: "Update an existing milestone in a Linear project. Only specified fields are changed.",
16880
+ summary: "Update a project milestone",
16881
+ icon: "milestone",
16882
+ group: "Projects",
16883
+ input: external_exports.object({
16884
+ milestone_id: external_exports.string().describe("Milestone UUID to update"),
16885
+ name: external_exports.string().optional().describe("New milestone name"),
16886
+ description: external_exports.string().optional().describe("New milestone description"),
16887
+ target_date: external_exports.string().optional().describe("New target date in YYYY-MM-DD format")
16888
+ }),
16889
+ output: external_exports.object({
16890
+ milestone: milestoneSchema.describe("The updated milestone")
16891
+ }),
16892
+ handle: async (params) => {
16893
+ const input = {};
16894
+ if (params.name !== void 0) input.name = params.name;
16895
+ if (params.description !== void 0) input.description = params.description;
16896
+ if (params.target_date !== void 0) input.targetDate = params.target_date;
16897
+ const data = await graphql(
16898
+ `mutation UpdateMilestone($id: String!, $input: ProjectMilestoneUpdateInput!) {
16899
+ projectMilestoneUpdate(id: $id, input: $input) {
16900
+ success
16901
+ projectMilestone {
16902
+ id name description targetDate sortOrder
16903
+ }
16904
+ }
16905
+ }`,
16906
+ { id: params.milestone_id, input }
16907
+ );
16908
+ if (!data.projectMilestoneUpdate?.projectMilestone)
16909
+ throw ToolError.internal("Milestone update failed \u2014 no milestone returned");
16910
+ return {
16911
+ milestone: mapMilestone(data.projectMilestoneUpdate.projectMilestone)
16912
+ };
16913
+ }
16914
+ });
16915
+
15284
16916
  // src/tools/update-project.ts
15285
16917
  var updateProject = defineTool({
15286
16918
  name: "update_project",
@@ -15335,27 +16967,79 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
15335
16967
  urlPatterns = ["*://linear.app/*"];
15336
16968
  homepage = "https://linear.app";
15337
16969
  tools = [
16970
+ // Issues
15338
16971
  searchIssues,
15339
16972
  getIssue,
15340
16973
  createIssue,
15341
16974
  updateIssue,
15342
16975
  deleteIssue,
15343
16976
  archiveIssue,
16977
+ batchUpdateIssues,
16978
+ listSubIssues,
16979
+ listIssueHistory,
16980
+ // Issue relations
15344
16981
  listIssueRelations,
16982
+ createIssueRelation,
16983
+ deleteIssueRelation,
16984
+ // Issue labels (additive/subtractive)
16985
+ addIssueLabel,
16986
+ removeIssueLabel,
16987
+ // Issue subscribers
16988
+ addIssueSubscriber,
16989
+ removeIssueSubscriber,
16990
+ // Issue assignment
16991
+ setIssueCycle,
16992
+ moveIssueToProject,
16993
+ // Attachments
16994
+ listAttachments,
16995
+ getAttachment,
16996
+ createAttachment,
16997
+ deleteAttachment,
16998
+ // Comments
15345
16999
  createComment,
15346
17000
  updateComment,
17001
+ deleteComment,
15347
17002
  listComments,
17003
+ // Projects
15348
17004
  listProjects,
15349
17005
  getProject,
15350
17006
  createProject,
15351
17007
  updateProject,
17008
+ listProjectLabels,
17009
+ // Project updates (health reports)
17010
+ listProjectUpdates,
17011
+ createProjectUpdate,
17012
+ deleteProjectUpdate,
17013
+ // Milestones
17014
+ listMilestones,
17015
+ getMilestone,
17016
+ createMilestone,
17017
+ updateMilestone,
17018
+ // Initiatives
17019
+ listInitiatives,
17020
+ getInitiative,
17021
+ createInitiative,
17022
+ updateInitiative,
17023
+ // Documents
17024
+ listDocuments,
17025
+ getDocument,
17026
+ createDocument,
17027
+ updateDocument,
17028
+ // Teams & Users
15352
17029
  listTeams,
17030
+ getTeam,
17031
+ listTeamMembers,
17032
+ listUsers,
17033
+ getUser,
17034
+ getViewer,
17035
+ // Workflow
15353
17036
  listWorkflowStates,
15354
17037
  listLabels,
15355
17038
  createLabel,
15356
- getViewer,
15357
- listUsers,
15358
- listCycles
17039
+ updateLabel,
17040
+ deleteLabel,
17041
+ listCycles,
17042
+ getCycle
15359
17043
  ];
15360
17044
  async isReady() {
15361
17045
  if (isLinearAuthenticated()) return true;
@@ -15364,7 +17048,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
15364
17048
  };
15365
17049
  var src_default = new LinearPlugin();
15366
17050
 
15367
- // dist/_adapter_entry_bf052904-bd6d-4484-891c-f81c747d48ab.ts
17051
+ // dist/_adapter_entry_dcb85e9b-fdf7-4dad-9568-41e7af1674f2.ts
15368
17052
  if (!globalThis.__openTabs) {
15369
17053
  globalThis.__openTabs = {};
15370
17054
  } else {
@@ -15580,5 +17264,5 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
15580
17264
  };
15581
17265
  delete src_default.onDeactivate;
15582
17266
  }
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});}})();
17267
+ })();(function(){var o=(globalThis).__openTabs;if(o&&o.adapters&&o.adapters["linear"]){var a=o.adapters["linear"];a.__adapterHash="eec44bcdd28123ddb8ee0e65e4b52794b0fb6c3d706da5158bc808a9f4615bcd";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
17268
  //# sourceMappingURL=adapter.iife.js.map