@joe-broadhead/opencode-linear 0.0.3 → 0.0.4

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/CHANGELOG.md CHANGED
@@ -2,6 +2,14 @@
2
2
 
3
3
  All notable changes to this project are documented here. The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and versions follow [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
4
4
 
5
+ ## [0.0.4] - 2026-11-04
6
+
7
+ ### Added
8
+
9
+ - Jelly shows the plugin's one-line summary and icon. The package declares them in its `jelly` section and ships the
10
+ icon as `assets/icon.svg`: a neutral checklist mark, not Linear's logo or colours, because the plugin is
11
+ unofficial.
12
+
5
13
  ## [0.0.3] - 2026-11-04
6
14
 
7
15
  ### Added
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" width="32" height="32"><rect width="32" height="32" rx="7" fill="#4B5563"/><g fill="none" stroke="#FFFFFF" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round"><path d="M7 10.2l1.9 1.9L12.4 8.4"/><path d="M15.5 10.4h9.5"/><path d="M7 17.2l1.9 1.9 3.5-3.7"/><path d="M15.5 17.4h9.5"/><rect x="7.4" y="22.2" width="4.4" height="4.4" rx="1"/><path d="M15.5 24.4h9.5"/></g></svg>
package/dist/index.js CHANGED
@@ -180,6 +180,7 @@ var DESCRIBED = object(
180
180
  description: STRING,
181
181
  available: { type: "boolean" },
182
182
  reason: STRING,
183
+ detail: STRING,
183
184
  input: ANY_OBJECT,
184
185
  output: ANY_OBJECT
185
186
  },
@@ -313,12 +314,15 @@ async function registerToolsRpc(ctx, options) {
313
314
  const rules = [...agent.data.permissions, ...info.permissions ?? []];
314
315
  return { agent: info.agent, rules };
315
316
  };
317
+ const notRegistered = (server) => mcp?.notRegistered?.(server);
316
318
  const unavailable2 = async (server, tool, connected) => {
317
319
  const status = (await ctx.mcp.list()).data.find((entry) => entry.name === server)?.status.status;
318
320
  const code = connection(status) ?? connected;
319
321
  if (code === "TOOL_UNAVAILABLE") return fail(code, `OpenCode does not list ${tool} on the connected "${server}" server`);
320
322
  if (status === "connected") return fail(code, `the "${server}" server was reconnecting when ${tool} ran`);
321
- return fail(code, `the "${server}" server ${STATUS_TEXT[code] ?? "is unavailable"}`);
323
+ const what = `the "${server}" server ${STATUS_TEXT[code] ?? "is unavailable"}`;
324
+ const own = code === "NOT_REGISTERED" ? notRegistered(server) : void 0;
325
+ return own ? new ScriptError({ code: own.code, what, next: own.next }) : fail(code, what);
322
326
  };
323
327
  const denied = (action, error, asked = action) => {
324
328
  const reason = upstreamText(record(error) && typeof error["message"] === "string" ? error["message"] : String(error));
@@ -350,11 +354,15 @@ async function registerToolsRpc(ctx, options) {
350
354
  }
351
355
  };
352
356
  };
353
- const ownedTarget = (spec, envelope2) => ({
354
- action: spec.action,
355
- mcp: false,
356
- run: async (call) => await spec.run(envelope2.input, call) ?? null
357
- });
357
+ const ownedTarget = (spec, envelope2) => {
358
+ if (accounts) serverOf(envelope2.account);
359
+ const account = accounts && envelope2.account !== void 0 ? { account: envelope2.account } : {};
360
+ return {
361
+ action: spec.action,
362
+ mcp: false,
363
+ run: async (call) => await spec.run(envelope2.input, { ...call, ...account }) ?? null
364
+ };
365
+ };
358
366
  const invoke = async (target, raw, context) => {
359
367
  const envelope2 = raw;
360
368
  let method;
@@ -407,7 +415,9 @@ async function registerToolsRpc(ctx, options) {
407
415
  for (const name of KNOWN_READS) {
408
416
  const id = `${server}_${name}`;
409
417
  const tool = managed ? tools.find((entry) => entry.id === id) : void 0;
410
- const reason = !managed ? "SERVER_CONFLICT" : tool ? void 0 : connection(status) ?? "TOOL_UNAVAILABLE";
418
+ const code = !managed ? "SERVER_CONFLICT" : tool ? void 0 : connection(status) ?? "TOOL_UNAVAILABLE";
419
+ const reason = code === "NOT_REGISTERED" ? notRegistered(server)?.code ?? code : code;
420
+ const detail = code === void 0 ? void 0 : mcp.unavailableDetail?.(name, code);
411
421
  const input = jsonSchema(tool?.input) ?? ANY_OBJECT;
412
422
  const output = jsonSchema(tool?.output);
413
423
  methods.push({
@@ -418,6 +428,7 @@ async function registerToolsRpc(ctx, options) {
418
428
  description: tool?.description ?? "",
419
429
  available: reason === void 0,
420
430
  ...reason ? { reason } : {},
431
+ ...detail === void 0 ? {} : { detail },
421
432
  input,
422
433
  output: mcpOutput(output)
423
434
  });
@@ -755,7 +766,7 @@ function registerSkills(skill, skills) {
755
766
  }
756
767
 
757
768
  // src/version.ts
758
- var VERSION = "0.0.3";
769
+ var VERSION = "0.0.4";
759
770
 
760
771
  // src/status.ts
761
772
  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).`;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@joe-broadhead/opencode-linear",
3
- "version": "0.0.3",
3
+ "version": "0.0.4",
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",
@@ -23,6 +23,7 @@
23
23
  },
24
24
  "files": [
25
25
  "dist",
26
+ "assets/icon.svg",
26
27
  "skills",
27
28
  "README.md",
28
29
  "LICENSE",
@@ -54,6 +55,8 @@
54
55
  },
55
56
  "jelly": {
56
57
  "title": "Linear",
58
+ "summary": "Find and read Linear issues, projects and documents.",
59
+ "icon": "assets/icon.svg",
57
60
  "tools": [
58
61
  {
59
62
  "name": "linear.issues",