@joe-broadhead/opencode-linear 0.0.1 → 0.0.3

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/tui.js CHANGED
@@ -5,8 +5,25 @@ import { createSignal } from "solid-js";
5
5
  // src/constants.ts
6
6
  var PLUGIN_ID = "linear.workspace";
7
7
  var SERVER_NAME = "linear";
8
+ var SUPPORTED_HOST = ">=2.2.3 <2.3.0";
9
+ var TESTED_HOSTS = ["2.2.3", "2.2.4", "2.2.5"];
8
10
  var errorText = (code, message, nextStep) => `${code}: ${message} Next step: ${nextStep}`;
9
11
 
12
+ // src/host-version.ts
13
+ var RELEASE = /^(\d+)\.(\d+)\.(\d+)$/;
14
+ var parse = (version) => RELEASE.exec(version)?.slice(1).map(Number);
15
+ var [LOWEST, ABOVE] = SUPPORTED_HOST.split(" ").map((bound) => parse(bound.replace(/^[<>]=?/, "")));
16
+ var compare = (a, b) => a[0] - b[0] || a[1] - b[1] || a[2] - b[2];
17
+ function isSupportedHost(version) {
18
+ const parts = parse(version);
19
+ return parts !== void 0 && compare(parts, LOWEST) >= 0 && compare(parts, ABOVE) < 0;
20
+ }
21
+
22
+ // src/issues.ts
23
+ var ISSUES_TOOL = "issues";
24
+ var ISSUES_ACTION = `${SERVER_NAME}_${ISSUES_TOOL}`;
25
+ var LIST = `${SERVER_NAME}_list_issues`;
26
+
10
27
  // src/linear-tools.ts
11
28
  var READ_TOOLS = [
12
29
  "extract_images",
@@ -49,15 +66,14 @@ var READ_TOOLS = [
49
66
  "list_teams",
50
67
  "list_templates",
51
68
  "list_users",
52
- "search_documentation",
53
- "whoami"
69
+ "search_documentation"
54
70
  ];
55
71
 
56
72
  // src/permissions.ts
57
73
  var actionOf = (tool) => `${SERVER_NAME}_${tool}`;
58
74
  var ASK_ALL = { action: actionOf("*"), resource: "*", effect: "ask" };
59
75
  var rule = (tool, effect) => ({ action: actionOf(tool), resource: "*", effect });
60
- var defaultRules = () => [{ ...ASK_ALL }, ...READ_TOOLS.map((tool) => rule(tool, "allow"))];
76
+ var defaultRules = () => [{ ...ASK_ALL }, ...[...READ_TOOLS, ISSUES_TOOL].map((tool) => rule(tool, "allow"))];
61
77
 
62
78
  // src/status.ts
63
79
  var SIGN_IN = `Run /connect and choose Linear, then press o or Enter to open the link (in a terminal, opencode mcp auth ${SERVER_NAME} opens it automatically).`;
@@ -65,13 +81,15 @@ var AGENTS_FIX = [
65
81
  `Put this block first in each listed agent's own "permissions" (agents.<id>.permissions in opencode.json, or the agent file's frontmatter), followed by your top-level "permissions" rules for linear_* tools:`,
66
82
  ...defaultRules().map((rule2, index, rules) => ` ${JSON.stringify(rule2)}${index < rules.length - 1 ? "," : ""}`)
67
83
  ].join("\n");
68
- var CONNECTION_TEXT = {
84
+ var TESTED_TEXT = `${TESTED_HOSTS.slice(0, -1).join(", ")} or ${TESTED_HOSTS.at(-1)}`;
85
+ var STATE_TEXT = {
69
86
  connected: "connected",
70
- pending: "connecting",
71
- needs_sign_in: "sign-in required",
87
+ connecting: "connecting",
88
+ sign_in_required: "sign-in required",
72
89
  failed: "failed",
73
90
  disabled: "disabled",
74
- not_configured: "not configured"
91
+ not_configured: "not configured",
92
+ conflict: "conflict"
75
93
  };
76
94
  var ACCESS_TEXT = {
77
95
  read: "read-only (Linear's read-only server; changes are not available)",
@@ -82,23 +100,37 @@ function serverText(source) {
82
100
  if (source.type === "adopted") return `${source.url}, your own mcp.servers.${SERVER_NAME}, used unchanged`;
83
101
  return `your mcp.servers.${SERVER_NAME} points at ${source.url}`;
84
102
  }
103
+ function toolsText({ tools, unknownCount, unknownTools }) {
104
+ if (unknownCount === 0) return `${tools} available, 0 unknown`;
105
+ const more = unknownCount - unknownTools.length;
106
+ const names = unknownTools.length ? `: ${unknownTools.join(", ")}${more > 0 ? ` and ${more} more` : ""}` : "";
107
+ return `${tools} available, ${unknownCount} unknown${names} (unknown tools ask before running)`;
108
+ }
109
+ function hostText({ host, problems }) {
110
+ const { version, range, tested } = host;
111
+ const outside = version === null || !isSupportedHost(version);
112
+ const notes = [
113
+ ...outside ? [`It is outside the supported range; the plugin runs because allowUntestedHost is true. If Linear misbehaves, use OpenCode ${TESTED_TEXT}.`] : [],
114
+ ...problems
115
+ ];
116
+ return `${version ?? "unknown version"} (${tested ? "tested" : "untested"}; supported range ${range})${notes.length ? `. ${notes.join(" ")}` : ""}`;
117
+ }
85
118
  function formatStatus(status) {
86
- const { source, host, unknownTools, agentsWithoutRules } = status;
87
- const state = source?.type === "conflict" ? "conflict" : CONNECTION_TEXT[status.connection];
119
+ const { source, unguardedAgents: agents } = status;
88
120
  const details = [status.error, source && serverText(source)].filter(Boolean).join("; ");
89
- const notes = [host.warning, ...status.problems].filter(Boolean);
90
121
  return [
91
122
  "Linear status",
92
- `- Connection: ${state}${details ? ` (${details})` : ""}`,
123
+ `- Connection: ${STATE_TEXT[status.state]}${details ? ` (${details})` : ""}`,
93
124
  `- Account: ${status.account ?? "account name not reported by Linear's MCP"}`,
94
125
  `- Access: ${ACCESS_TEXT[status.access]}`,
95
- `- Tools: ${status.tools} available, ${unknownTools.length}${unknownTools.length ? ` unknown: ${unknownTools.join(", ")} (unknown tools ask before running)` : " unknown"}`,
96
- `- Agents without default rules: ${agentsWithoutRules.length ? `${agentsWithoutRules.join(", ")}. Linear tools run there without asking. ${AGENTS_FIX}` : "none"}`,
97
- `- OpenCode: ${host.version} (${host.tested ? "tested" : "host untested"})${notes.length ? `. ${notes.join(" ")}` : ""}`,
126
+ `- Tools: ${toolsText(status)}`,
127
+ `- Agents without default rules: ${agents.length ? `${agents.join(", ")}. Linear tools run there without asking. ${AGENTS_FIX}` : "none"}`,
128
+ `- OpenCode: ${hostText(status)}`,
98
129
  `- Next step: ${status.nextStep}`
99
130
  ].join("\n");
100
131
  }
101
132
  var strings = { type: "array", items: { type: "string" } };
133
+ var count = { type: "integer", minimum: 0 };
102
134
  var StatusRpc = {
103
135
  id: PLUGIN_ID,
104
136
  methods: {
@@ -106,9 +138,10 @@ var StatusRpc = {
106
138
  input: { type: "object" },
107
139
  output: {
108
140
  type: "object",
109
- required: ["connection", "access", "tools", "unknownTools", "agentsWithoutRules", "host", "problems", "nextStep"],
141
+ required: ["version", "state", "access", "tools", "unknownCount", "unknownTools", "unguardedAgents", "host", "problems", "nextStep"],
110
142
  properties: {
111
- connection: { enum: ["connected", "pending", "needs_sign_in", "failed", "disabled", "not_configured"] },
143
+ version: { type: "string" },
144
+ state: { enum: ["connected", "sign_in_required", "connecting", "disabled", "failed", "not_configured", "conflict"] },
112
145
  error: { type: "string" },
113
146
  account: { type: "string" },
114
147
  access: { enum: ["read", "write"] },
@@ -117,14 +150,20 @@ var StatusRpc = {
117
150
  required: ["type", "url"],
118
151
  properties: { type: { enum: ["plugin", "adopted", "conflict"] }, url: { type: "string" }, expected: { type: "string" } }
119
152
  },
120
- tools: { type: "integer", minimum: 0 },
153
+ tools: count,
154
+ unknownCount: count,
121
155
  unknownTools: strings,
122
- agentsWithoutRules: strings,
123
- host: { type: "object", required: ["version", "tested"], properties: { version: { type: "string" }, tested: { type: "boolean" }, warning: { type: "string" } } },
156
+ unguardedAgents: strings,
157
+ host: {
158
+ type: "object",
159
+ required: ["version", "range", "tested"],
160
+ properties: { version: { type: ["string", "null"] }, range: { type: "string" }, tested: { type: "boolean" } }
161
+ },
124
162
  problems: strings,
125
163
  nextStep: { type: "string" }
126
164
  }
127
- }
165
+ },
166
+ errors: { unavailable: { type: "object", required: ["nextStep"], properties: { nextStep: { type: "string" } } } }
128
167
  }
129
168
  },
130
169
  events: {}
@@ -143,6 +182,10 @@ function reportOf(result) {
143
182
  if ("status" in result) return formatStatus(result.status).split("\n").slice(1).join("\n");
144
183
  const { error } = result;
145
184
  const type = typeof error === "object" && error !== null && "type" in error ? error.type : void 0;
185
+ if (type === "unavailable") {
186
+ const { message, data } = error;
187
+ if (typeof message === "string" && typeof data?.nextStep === "string") return `${message} Next step: ${data.nextStep}`;
188
+ }
146
189
  if (type === "rpc.unavailable" || type === "rpc.method_not_found") {
147
190
  return errorText("STATUS_UNAVAILABLE", "The Linear plugin is not running on this OpenCode server.", "Run /plugins to see why it did not start.");
148
191
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@joe-broadhead/opencode-linear",
3
- "version": "0.0.1",
3
+ "version": "0.0.3",
4
4
  "description": "Unofficial OpenCode plugin for Linear: find, read and cite issues, projects and documents through Linear's official MCP server",
5
5
  "keywords": [
6
6
  "opencode",
@@ -51,5 +51,532 @@
51
51
  "esbuild": "0.28.2",
52
52
  "solid-js": "1.9.17",
53
53
  "typescript": "5.9.3"
54
+ },
55
+ "jelly": {
56
+ "title": "Linear",
57
+ "tools": [
58
+ {
59
+ "name": "linear.issues",
60
+ "permission": "linear_issues",
61
+ "effect": "allow",
62
+ "readOnly": true
63
+ },
64
+ {
65
+ "name": "linear.extract_images",
66
+ "permission": "linear_extract_images",
67
+ "effect": "allow",
68
+ "readOnly": true
69
+ },
70
+ {
71
+ "name": "linear.get_agent_skill",
72
+ "permission": "linear_get_agent_skill",
73
+ "effect": "allow",
74
+ "readOnly": true
75
+ },
76
+ {
77
+ "name": "linear.get_attachment",
78
+ "permission": "linear_get_attachment",
79
+ "effect": "allow",
80
+ "readOnly": true
81
+ },
82
+ {
83
+ "name": "linear.get_diff",
84
+ "permission": "linear_get_diff",
85
+ "effect": "allow",
86
+ "readOnly": true
87
+ },
88
+ {
89
+ "name": "linear.get_diff_threads",
90
+ "permission": "linear_get_diff_threads",
91
+ "effect": "allow",
92
+ "readOnly": true
93
+ },
94
+ {
95
+ "name": "linear.get_document",
96
+ "permission": "linear_get_document",
97
+ "effect": "allow",
98
+ "readOnly": true
99
+ },
100
+ {
101
+ "name": "linear.get_initiative",
102
+ "permission": "linear_get_initiative",
103
+ "effect": "allow",
104
+ "readOnly": true
105
+ },
106
+ {
107
+ "name": "linear.get_issue",
108
+ "permission": "linear_get_issue",
109
+ "effect": "allow",
110
+ "readOnly": true
111
+ },
112
+ {
113
+ "name": "linear.get_issue_status",
114
+ "permission": "linear_get_issue_status",
115
+ "effect": "allow",
116
+ "readOnly": true
117
+ },
118
+ {
119
+ "name": "linear.get_milestone",
120
+ "permission": "linear_get_milestone",
121
+ "effect": "allow",
122
+ "readOnly": true
123
+ },
124
+ {
125
+ "name": "linear.get_notifications",
126
+ "permission": "linear_get_notifications",
127
+ "effect": "allow",
128
+ "readOnly": true
129
+ },
130
+ {
131
+ "name": "linear.get_project",
132
+ "permission": "linear_get_project",
133
+ "effect": "allow",
134
+ "readOnly": true
135
+ },
136
+ {
137
+ "name": "linear.get_release",
138
+ "permission": "linear_get_release",
139
+ "effect": "allow",
140
+ "readOnly": true
141
+ },
142
+ {
143
+ "name": "linear.get_release_note",
144
+ "permission": "linear_get_release_note",
145
+ "effect": "allow",
146
+ "readOnly": true
147
+ },
148
+ {
149
+ "name": "linear.get_status_updates",
150
+ "permission": "linear_get_status_updates",
151
+ "effect": "allow",
152
+ "readOnly": true
153
+ },
154
+ {
155
+ "name": "linear.get_team",
156
+ "permission": "linear_get_team",
157
+ "effect": "allow",
158
+ "readOnly": true
159
+ },
160
+ {
161
+ "name": "linear.get_template",
162
+ "permission": "linear_get_template",
163
+ "effect": "allow",
164
+ "readOnly": true
165
+ },
166
+ {
167
+ "name": "linear.get_triage_responsibility",
168
+ "permission": "linear_get_triage_responsibility",
169
+ "effect": "allow",
170
+ "readOnly": true
171
+ },
172
+ {
173
+ "name": "linear.get_user",
174
+ "permission": "linear_get_user",
175
+ "effect": "allow",
176
+ "readOnly": true
177
+ },
178
+ {
179
+ "name": "linear.get_workspace",
180
+ "permission": "linear_get_workspace",
181
+ "effect": "allow",
182
+ "readOnly": true
183
+ },
184
+ {
185
+ "name": "linear.list_agent_skills",
186
+ "permission": "linear_list_agent_skills",
187
+ "effect": "allow",
188
+ "readOnly": true
189
+ },
190
+ {
191
+ "name": "linear.list_comments",
192
+ "permission": "linear_list_comments",
193
+ "effect": "allow",
194
+ "readOnly": true
195
+ },
196
+ {
197
+ "name": "linear.list_custom_views",
198
+ "permission": "linear_list_custom_views",
199
+ "effect": "allow",
200
+ "readOnly": true
201
+ },
202
+ {
203
+ "name": "linear.list_cycles",
204
+ "permission": "linear_list_cycles",
205
+ "effect": "allow",
206
+ "readOnly": true
207
+ },
208
+ {
209
+ "name": "linear.list_diffs",
210
+ "permission": "linear_list_diffs",
211
+ "effect": "allow",
212
+ "readOnly": true
213
+ },
214
+ {
215
+ "name": "linear.list_documents",
216
+ "permission": "linear_list_documents",
217
+ "effect": "allow",
218
+ "readOnly": true
219
+ },
220
+ {
221
+ "name": "linear.list_initiative_labels",
222
+ "permission": "linear_list_initiative_labels",
223
+ "effect": "allow",
224
+ "readOnly": true
225
+ },
226
+ {
227
+ "name": "linear.list_initiatives",
228
+ "permission": "linear_list_initiatives",
229
+ "effect": "allow",
230
+ "readOnly": true
231
+ },
232
+ {
233
+ "name": "linear.list_issue_labels",
234
+ "permission": "linear_list_issue_labels",
235
+ "effect": "allow",
236
+ "readOnly": true
237
+ },
238
+ {
239
+ "name": "linear.list_issue_statuses",
240
+ "permission": "linear_list_issue_statuses",
241
+ "effect": "allow",
242
+ "readOnly": true
243
+ },
244
+ {
245
+ "name": "linear.list_issues",
246
+ "permission": "linear_list_issues",
247
+ "effect": "allow",
248
+ "readOnly": true
249
+ },
250
+ {
251
+ "name": "linear.list_milestones",
252
+ "permission": "linear_list_milestones",
253
+ "effect": "allow",
254
+ "readOnly": true
255
+ },
256
+ {
257
+ "name": "linear.list_project_labels",
258
+ "permission": "linear_list_project_labels",
259
+ "effect": "allow",
260
+ "readOnly": true
261
+ },
262
+ {
263
+ "name": "linear.list_projects",
264
+ "permission": "linear_list_projects",
265
+ "effect": "allow",
266
+ "readOnly": true
267
+ },
268
+ {
269
+ "name": "linear.list_release_notes",
270
+ "permission": "linear_list_release_notes",
271
+ "effect": "allow",
272
+ "readOnly": true
273
+ },
274
+ {
275
+ "name": "linear.list_release_pipelines",
276
+ "permission": "linear_list_release_pipelines",
277
+ "effect": "allow",
278
+ "readOnly": true
279
+ },
280
+ {
281
+ "name": "linear.list_releases",
282
+ "permission": "linear_list_releases",
283
+ "effect": "allow",
284
+ "readOnly": true
285
+ },
286
+ {
287
+ "name": "linear.list_teams",
288
+ "permission": "linear_list_teams",
289
+ "effect": "allow",
290
+ "readOnly": true
291
+ },
292
+ {
293
+ "name": "linear.list_templates",
294
+ "permission": "linear_list_templates",
295
+ "effect": "allow",
296
+ "readOnly": true
297
+ },
298
+ {
299
+ "name": "linear.list_users",
300
+ "permission": "linear_list_users",
301
+ "effect": "allow",
302
+ "readOnly": true
303
+ },
304
+ {
305
+ "name": "linear.search_documentation",
306
+ "permission": "linear_search_documentation",
307
+ "effect": "allow",
308
+ "readOnly": true
309
+ },
310
+ {
311
+ "name": "linear.create_attachment",
312
+ "permission": "linear_create_attachment",
313
+ "effect": "ask",
314
+ "readOnly": false
315
+ },
316
+ {
317
+ "name": "linear.create_attachment_from_upload",
318
+ "permission": "linear_create_attachment_from_upload",
319
+ "effect": "ask",
320
+ "readOnly": false
321
+ },
322
+ {
323
+ "name": "linear.create_initiative_label",
324
+ "permission": "linear_create_initiative_label",
325
+ "effect": "ask",
326
+ "readOnly": false
327
+ },
328
+ {
329
+ "name": "linear.create_issue_label",
330
+ "permission": "linear_create_issue_label",
331
+ "effect": "ask",
332
+ "readOnly": false
333
+ },
334
+ {
335
+ "name": "linear.delete_attachment",
336
+ "permission": "linear_delete_attachment",
337
+ "effect": "ask",
338
+ "readOnly": false
339
+ },
340
+ {
341
+ "name": "linear.delete_comment",
342
+ "permission": "linear_delete_comment",
343
+ "effect": "ask",
344
+ "readOnly": false
345
+ },
346
+ {
347
+ "name": "linear.delete_diff_comment",
348
+ "permission": "linear_delete_diff_comment",
349
+ "effect": "ask",
350
+ "readOnly": false
351
+ },
352
+ {
353
+ "name": "linear.delete_status_update",
354
+ "permission": "linear_delete_status_update",
355
+ "effect": "ask",
356
+ "readOnly": false
357
+ },
358
+ {
359
+ "name": "linear.mark_notification",
360
+ "permission": "linear_mark_notification",
361
+ "effect": "ask",
362
+ "readOnly": false
363
+ },
364
+ {
365
+ "name": "linear.merge_diff",
366
+ "permission": "linear_merge_diff",
367
+ "effect": "ask",
368
+ "readOnly": false
369
+ },
370
+ {
371
+ "name": "linear.prepare_attachment_upload",
372
+ "permission": "linear_prepare_attachment_upload",
373
+ "effect": "ask",
374
+ "readOnly": false
375
+ },
376
+ {
377
+ "name": "linear.prepare_file_upload",
378
+ "permission": "linear_prepare_file_upload",
379
+ "effect": "ask",
380
+ "readOnly": false
381
+ },
382
+ {
383
+ "name": "linear.resolve_diff_thread",
384
+ "permission": "linear_resolve_diff_thread",
385
+ "effect": "ask",
386
+ "readOnly": false
387
+ },
388
+ {
389
+ "name": "linear.restore_initiative_label",
390
+ "permission": "linear_restore_initiative_label",
391
+ "effect": "ask",
392
+ "readOnly": false
393
+ },
394
+ {
395
+ "name": "linear.restore_issue_label",
396
+ "permission": "linear_restore_issue_label",
397
+ "effect": "ask",
398
+ "readOnly": false
399
+ },
400
+ {
401
+ "name": "linear.restore_project_label",
402
+ "permission": "linear_restore_project_label",
403
+ "effect": "ask",
404
+ "readOnly": false
405
+ },
406
+ {
407
+ "name": "linear.retire_initiative_label",
408
+ "permission": "linear_retire_initiative_label",
409
+ "effect": "ask",
410
+ "readOnly": false
411
+ },
412
+ {
413
+ "name": "linear.retire_issue_label",
414
+ "permission": "linear_retire_issue_label",
415
+ "effect": "ask",
416
+ "readOnly": false
417
+ },
418
+ {
419
+ "name": "linear.retire_project_label",
420
+ "permission": "linear_retire_project_label",
421
+ "effect": "ask",
422
+ "readOnly": false
423
+ },
424
+ {
425
+ "name": "linear.save_comment",
426
+ "permission": "linear_save_comment",
427
+ "effect": "ask",
428
+ "readOnly": false
429
+ },
430
+ {
431
+ "name": "linear.save_diff_comment",
432
+ "permission": "linear_save_diff_comment",
433
+ "effect": "ask",
434
+ "readOnly": false
435
+ },
436
+ {
437
+ "name": "linear.save_document",
438
+ "permission": "linear_save_document",
439
+ "effect": "ask",
440
+ "readOnly": false
441
+ },
442
+ {
443
+ "name": "linear.save_initiative",
444
+ "permission": "linear_save_initiative",
445
+ "effect": "ask",
446
+ "readOnly": false
447
+ },
448
+ {
449
+ "name": "linear.save_initiative_label",
450
+ "permission": "linear_save_initiative_label",
451
+ "effect": "ask",
452
+ "readOnly": false
453
+ },
454
+ {
455
+ "name": "linear.save_issue",
456
+ "permission": "linear_save_issue",
457
+ "effect": "ask",
458
+ "readOnly": false
459
+ },
460
+ {
461
+ "name": "linear.save_issue_label",
462
+ "permission": "linear_save_issue_label",
463
+ "effect": "ask",
464
+ "readOnly": false
465
+ },
466
+ {
467
+ "name": "linear.save_milestone",
468
+ "permission": "linear_save_milestone",
469
+ "effect": "ask",
470
+ "readOnly": false
471
+ },
472
+ {
473
+ "name": "linear.save_project",
474
+ "permission": "linear_save_project",
475
+ "effect": "ask",
476
+ "readOnly": false
477
+ },
478
+ {
479
+ "name": "linear.save_project_label",
480
+ "permission": "linear_save_project_label",
481
+ "effect": "ask",
482
+ "readOnly": false
483
+ },
484
+ {
485
+ "name": "linear.save_release",
486
+ "permission": "linear_save_release",
487
+ "effect": "ask",
488
+ "readOnly": false
489
+ },
490
+ {
491
+ "name": "linear.save_release_note",
492
+ "permission": "linear_save_release_note",
493
+ "effect": "ask",
494
+ "readOnly": false
495
+ },
496
+ {
497
+ "name": "linear.save_status_update",
498
+ "permission": "linear_save_status_update",
499
+ "effect": "ask",
500
+ "readOnly": false
501
+ },
502
+ {
503
+ "name": "linear.share_issue",
504
+ "permission": "linear_share_issue",
505
+ "effect": "ask",
506
+ "readOnly": false
507
+ },
508
+ {
509
+ "name": "linear.submit_diff_review",
510
+ "permission": "linear_submit_diff_review",
511
+ "effect": "ask",
512
+ "readOnly": false
513
+ },
514
+ {
515
+ "name": "linear.unshare_issue",
516
+ "permission": "linear_unshare_issue",
517
+ "effect": "ask",
518
+ "readOnly": false
519
+ },
520
+ {
521
+ "name": "linear.update_diff",
522
+ "permission": "linear_update_diff",
523
+ "effect": "ask",
524
+ "readOnly": false
525
+ }
526
+ ],
527
+ "skills": [
528
+ "linear",
529
+ "linear-write"
530
+ ],
531
+ "rpc": [],
532
+ "views": [
533
+ {
534
+ "v": 1,
535
+ "id": "issues",
536
+ "place": "tool-result",
537
+ "tools": [
538
+ "linear_issues"
539
+ ],
540
+ "title": "Linear issues",
541
+ "card": {
542
+ "template": "table"
543
+ }
544
+ }
545
+ ],
546
+ "signIns": [
547
+ {
548
+ "id": "linear",
549
+ "label": "Linear",
550
+ "server": "linear"
551
+ }
552
+ ],
553
+ "contributes": {
554
+ "homeFeeds": [
555
+ {
556
+ "id": "linear.my-issues",
557
+ "label": "My Linear issues",
558
+ "description": "Your assigned Linear issues.",
559
+ "keywords": [
560
+ "linear",
561
+ "my linear issues"
562
+ ],
563
+ "feed": {
564
+ "title": "My Linear issues",
565
+ "size": "l",
566
+ "template": "list",
567
+ "cadence": 900,
568
+ "mode": "looking",
569
+ "preview": "desktop-only",
570
+ "tools": [
571
+ "linear.issues"
572
+ ],
573
+ "script": "const result = await tools.linear.issues({}); return {items: result.rows.map(row => ({id: row.identifier, text: (row.identifier + ': ' + row.title).slice(0, 200)})), editable: false};"
574
+ }
575
+ }
576
+ ],
577
+ "homeWidgets": [],
578
+ "workKinds": [],
579
+ "settings": []
580
+ }
54
581
  }
55
582
  }