@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.
- package/dist/adapter.iife.js +1760 -76
- package/dist/adapter.iife.js.map +4 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +92 -2
- package/dist/index.js.map +1 -1
- package/dist/tools/add-issue-label.d.ts +28 -0
- package/dist/tools/add-issue-label.d.ts.map +1 -0
- package/dist/tools/add-issue-label.js +56 -0
- package/dist/tools/add-issue-label.js.map +1 -0
- package/dist/tools/add-issue-subscriber.d.ts +8 -0
- package/dist/tools/add-issue-subscriber.d.ts.map +1 -0
- package/dist/tools/add-issue-subscriber.js +29 -0
- package/dist/tools/add-issue-subscriber.js.map +1 -0
- package/dist/tools/batch-update-issues.d.ts +35 -0
- package/dist/tools/batch-update-issues.d.ts.map +1 -0
- package/dist/tools/batch-update-issues.js +80 -0
- package/dist/tools/batch-update-issues.js.map +1 -0
- package/dist/tools/create-attachment.d.ts +19 -0
- package/dist/tools/create-attachment.d.ts.map +1 -0
- package/dist/tools/create-attachment.js +45 -0
- package/dist/tools/create-attachment.js.map +1 -0
- package/dist/tools/create-document.d.ts +21 -0
- package/dist/tools/create-document.d.ts.map +1 -0
- package/dist/tools/create-document.js +46 -0
- package/dist/tools/create-document.js.map +1 -0
- package/dist/tools/create-initiative.d.ts +26 -0
- package/dist/tools/create-initiative.d.ts.map +1 -0
- package/dist/tools/create-initiative.js +50 -0
- package/dist/tools/create-initiative.js.map +1 -0
- package/dist/tools/create-issue-relation.d.ts +18 -0
- package/dist/tools/create-issue-relation.d.ts.map +1 -0
- package/dist/tools/create-issue-relation.js +53 -0
- package/dist/tools/create-issue-relation.js.map +1 -0
- package/dist/tools/create-milestone.d.ts +16 -0
- package/dist/tools/create-milestone.d.ts.map +1 -0
- package/dist/tools/create-milestone.js +45 -0
- package/dist/tools/create-milestone.js.map +1 -0
- package/dist/tools/create-project-update.d.ts +20 -0
- package/dist/tools/create-project-update.d.ts.map +1 -0
- package/dist/tools/create-project-update.js +37 -0
- package/dist/tools/create-project-update.js.map +1 -0
- package/dist/tools/delete-attachment.d.ts +7 -0
- package/dist/tools/delete-attachment.d.ts.map +1 -0
- package/dist/tools/delete-attachment.js +28 -0
- package/dist/tools/delete-attachment.js.map +1 -0
- package/dist/tools/delete-comment.d.ts +7 -0
- package/dist/tools/delete-comment.d.ts.map +1 -0
- package/dist/tools/delete-comment.js +28 -0
- package/dist/tools/delete-comment.js.map +1 -0
- package/dist/tools/delete-issue-relation.d.ts +7 -0
- package/dist/tools/delete-issue-relation.d.ts.map +1 -0
- package/dist/tools/delete-issue-relation.js +28 -0
- package/dist/tools/delete-issue-relation.js.map +1 -0
- package/dist/tools/delete-label.d.ts +7 -0
- package/dist/tools/delete-label.d.ts.map +1 -0
- package/dist/tools/delete-label.js +28 -0
- package/dist/tools/delete-label.js.map +1 -0
- package/dist/tools/delete-project-update.d.ts +7 -0
- package/dist/tools/delete-project-update.d.ts.map +1 -0
- package/dist/tools/delete-project-update.js +28 -0
- package/dist/tools/delete-project-update.js.map +1 -0
- package/dist/tools/get-attachment.d.ts +16 -0
- package/dist/tools/get-attachment.d.ts.map +1 -0
- package/dist/tools/get-attachment.js +30 -0
- package/dist/tools/get-attachment.js.map +1 -0
- package/dist/tools/get-cycle.d.ts +15 -0
- package/dist/tools/get-cycle.d.ts.map +1 -0
- package/dist/tools/get-cycle.js +29 -0
- package/dist/tools/get-cycle.js.map +1 -0
- package/dist/tools/get-document.d.ts +18 -0
- package/dist/tools/get-document.d.ts.map +1 -0
- package/dist/tools/get-document.js +31 -0
- package/dist/tools/get-document.js.map +1 -0
- package/dist/tools/get-initiative.d.ts +30 -0
- package/dist/tools/get-initiative.d.ts.map +1 -0
- package/dist/tools/get-initiative.js +42 -0
- package/dist/tools/get-initiative.js.map +1 -0
- package/dist/tools/get-milestone.d.ts +13 -0
- package/dist/tools/get-milestone.d.ts.map +1 -0
- package/dist/tools/get-milestone.js +29 -0
- package/dist/tools/get-milestone.js.map +1 -0
- package/dist/tools/get-team.d.ts +12 -0
- package/dist/tools/get-team.d.ts.map +1 -0
- package/dist/tools/get-team.js +29 -0
- package/dist/tools/get-team.js.map +1 -0
- package/dist/tools/get-user.d.ts +14 -0
- package/dist/tools/get-user.d.ts.map +1 -0
- package/dist/tools/get-user.js +29 -0
- package/dist/tools/get-user.js.map +1 -0
- package/dist/tools/list-attachments.d.ts +22 -0
- package/dist/tools/list-attachments.d.ts.map +1 -0
- package/dist/tools/list-attachments.js +46 -0
- package/dist/tools/list-attachments.js.map +1 -0
- package/dist/tools/list-documents.d.ts +24 -0
- package/dist/tools/list-documents.d.ts.map +1 -0
- package/dist/tools/list-documents.js +49 -0
- package/dist/tools/list-documents.js.map +1 -0
- package/dist/tools/list-initiatives.d.ts +28 -0
- package/dist/tools/list-initiatives.d.ts.map +1 -0
- package/dist/tools/list-initiatives.js +48 -0
- package/dist/tools/list-initiatives.js.map +1 -0
- package/dist/tools/list-issue-history.d.ts +23 -0
- package/dist/tools/list-issue-history.d.ts.map +1 -0
- package/dist/tools/list-issue-history.js +52 -0
- package/dist/tools/list-issue-history.js.map +1 -0
- package/dist/tools/list-milestones.d.ts +13 -0
- package/dist/tools/list-milestones.d.ts.map +1 -0
- package/dist/tools/list-milestones.js +35 -0
- package/dist/tools/list-milestones.js.map +1 -0
- package/dist/tools/list-project-labels.d.ts +14 -0
- package/dist/tools/list-project-labels.d.ts.map +1 -0
- package/dist/tools/list-project-labels.js +36 -0
- package/dist/tools/list-project-labels.js.map +1 -0
- package/dist/tools/list-project-updates.d.ts +20 -0
- package/dist/tools/list-project-updates.d.ts.map +1 -0
- package/dist/tools/list-project-updates.js +46 -0
- package/dist/tools/list-project-updates.js.map +1 -0
- package/dist/tools/list-sub-issues.d.ts +33 -0
- package/dist/tools/list-sub-issues.d.ts.map +1 -0
- package/dist/tools/list-sub-issues.js +53 -0
- package/dist/tools/list-sub-issues.js.map +1 -0
- package/dist/tools/list-team-members.d.ts +20 -0
- package/dist/tools/list-team-members.d.ts.map +1 -0
- package/dist/tools/list-team-members.js +45 -0
- package/dist/tools/list-team-members.js.map +1 -0
- package/dist/tools/move-issue-to-project.d.ts +28 -0
- package/dist/tools/move-issue-to-project.d.ts.map +1 -0
- package/dist/tools/move-issue-to-project.js +43 -0
- package/dist/tools/move-issue-to-project.js.map +1 -0
- package/dist/tools/remove-issue-label.d.ts +28 -0
- package/dist/tools/remove-issue-label.d.ts.map +1 -0
- package/dist/tools/remove-issue-label.js +56 -0
- package/dist/tools/remove-issue-label.js.map +1 -0
- package/dist/tools/remove-issue-subscriber.d.ts +8 -0
- package/dist/tools/remove-issue-subscriber.d.ts.map +1 -0
- package/dist/tools/remove-issue-subscriber.js +29 -0
- package/dist/tools/remove-issue-subscriber.js.map +1 -0
- package/dist/tools/schemas.d.ts +207 -0
- package/dist/tools/schemas.d.ts.map +1 -1
- package/dist/tools/schemas.js +120 -0
- package/dist/tools/schemas.js.map +1 -1
- package/dist/tools/set-issue-cycle.d.ts +28 -0
- package/dist/tools/set-issue-cycle.d.ts.map +1 -0
- package/dist/tools/set-issue-cycle.js +43 -0
- package/dist/tools/set-issue-cycle.js.map +1 -0
- package/dist/tools/update-document.d.ts +22 -0
- package/dist/tools/update-document.d.ts.map +1 -0
- package/dist/tools/update-document.js +47 -0
- package/dist/tools/update-document.js.map +1 -0
- package/dist/tools/update-initiative.d.ts +27 -0
- package/dist/tools/update-initiative.d.ts.map +1 -0
- package/dist/tools/update-initiative.js +51 -0
- package/dist/tools/update-initiative.js.map +1 -0
- package/dist/tools/update-label.d.ts +17 -0
- package/dist/tools/update-label.d.ts.map +1 -0
- package/dist/tools/update-label.js +43 -0
- package/dist/tools/update-label.js.map +1 -0
- package/dist/tools/update-milestone.d.ts +16 -0
- package/dist/tools/update-milestone.d.ts.map +1 -0
- package/dist/tools/update-milestone.js +44 -0
- package/dist/tools/update-milestone.js.map +1 -0
- package/dist/tools.json +4044 -577
- package/package.json +3 -3
package/dist/adapter.iife.js
CHANGED
|
@@ -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-
|
|
14563
|
-
var
|
|
14564
|
-
name: "
|
|
14565
|
-
displayName: "Create
|
|
14566
|
-
description: "Create a new
|
|
14567
|
-
summary: "Create a new project",
|
|
14568
|
-
icon: "
|
|
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
|
-
|
|
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
|
|
14939
|
-
|
|
14940
|
-
|
|
14941
|
-
|
|
14942
|
-
|
|
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
|
-
|
|
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-
|
|
14954
|
-
var
|
|
14955
|
-
name: "
|
|
14956
|
-
displayName: "List
|
|
14957
|
-
description: "List
|
|
14958
|
-
summary: "List
|
|
14959
|
-
icon: "
|
|
14960
|
-
group: "
|
|
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
|
-
|
|
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
|
-
|
|
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 ??
|
|
16264
|
+
const limit = Math.min(params.limit ?? 50, 100);
|
|
14971
16265
|
const data = await graphql(
|
|
14972
|
-
`query
|
|
14973
|
-
|
|
14974
|
-
|
|
14975
|
-
|
|
14976
|
-
|
|
14977
|
-
|
|
14978
|
-
|
|
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.
|
|
14986
|
-
const result = data.
|
|
16278
|
+
if (!data.team) throw ToolError.notFound("Team not found");
|
|
16279
|
+
const result = data.team.members;
|
|
14987
16280
|
return {
|
|
14988
|
-
|
|
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
|
|
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 { ${
|
|
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 { ${
|
|
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
|
-
|
|
15357
|
-
|
|
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/
|
|
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="
|
|
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
|