@opentabs-dev/opentabs-plugin-linear 0.0.75 → 0.0.77

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/README.md ADDED
@@ -0,0 +1,81 @@
1
+ # Linear
2
+
3
+ OpenTabs plugin for Linear — gives AI agents access to Linear through your authenticated browser session.
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ opentabs plugin install linear
9
+ ```
10
+
11
+ Or install globally via npm:
12
+
13
+ ```bash
14
+ npm install -g @opentabs-dev/opentabs-plugin-linear
15
+ ```
16
+
17
+ ## Setup
18
+
19
+ 1. Open [linear.app](https://linear.app) in Chrome and log in
20
+ 2. Open the OpenTabs side panel — the Linear plugin should appear as **ready**
21
+
22
+ ## Tools (21)
23
+
24
+ ### Issues (7)
25
+
26
+ | Tool | Description | Type |
27
+ |---|---|---|
28
+ | `search_issues` | Search and filter issues | Read |
29
+ | `get_issue` | Get details of a single issue | Read |
30
+ | `create_issue` | Create a new issue in Linear | Write |
31
+ | `update_issue` | Update an existing issue | Write |
32
+ | `delete_issue` | Move an issue to the trash | Write |
33
+ | `archive_issue` | Archive an issue | Write |
34
+ | `list_issue_relations` | List issue dependencies and relations | Read |
35
+
36
+ ### Comments (3)
37
+
38
+ | Tool | Description | Type |
39
+ |---|---|---|
40
+ | `create_comment` | Add a comment to an issue | Write |
41
+ | `update_comment` | Update a comment | Write |
42
+ | `list_comments` | List comments on an issue | Read |
43
+
44
+ ### Projects (4)
45
+
46
+ | Tool | Description | Type |
47
+ |---|---|---|
48
+ | `list_projects` | List all projects | Read |
49
+ | `get_project` | Get details of a project | Read |
50
+ | `create_project` | Create a new project | Write |
51
+ | `update_project` | Update a project | Write |
52
+
53
+ ### Teams & Users (3)
54
+
55
+ | Tool | Description | Type |
56
+ |---|---|---|
57
+ | `list_teams` | List teams in the workspace | Read |
58
+ | `get_viewer` | Get the current user's profile | Read |
59
+ | `list_users` | List all users in the organization | Read |
60
+
61
+ ### Workflow (3)
62
+
63
+ | Tool | Description | Type |
64
+ |---|---|---|
65
+ | `list_workflow_states` | List workflow states for a team | Read |
66
+ | `list_labels` | List all issue labels | Read |
67
+ | `list_cycles` | List cycles for a team | Read |
68
+
69
+ ### Labels (1)
70
+
71
+ | Tool | Description | Type |
72
+ |---|---|---|
73
+ | `create_label` | Create a new label | Write |
74
+
75
+ ## How It Works
76
+
77
+ This plugin runs inside your Linear tab through the [OpenTabs](https://opentabs.dev) Chrome extension. It uses your existing browser session — no API tokens or OAuth apps required. All operations happen as you, with your permissions.
78
+
79
+ ## License
80
+
81
+ MIT
@@ -245,18 +245,18 @@
245
245
 
246
246
  // node_modules/@opentabs-dev/plugin-sdk/dist/storage.js
247
247
  var getLocalStorage = (key) => {
248
- try {
249
- return localStorage.getItem(key);
250
- } catch {
251
- }
252
248
  let storage;
253
249
  try {
254
- storage = localStorage;
250
+ storage = window.localStorage;
255
251
  } catch {
256
252
  return null;
257
253
  }
258
- if (storage !== void 0) {
259
- return null;
254
+ if (storage) {
255
+ try {
256
+ return storage.getItem(key);
257
+ } catch {
258
+ return null;
259
+ }
260
260
  }
261
261
  try {
262
262
  const iframe = document.createElement("iframe");
@@ -337,6 +337,8 @@
337
337
  * (e.g., 'https://github.com'), not a match pattern.
338
338
  */
339
339
  homepage;
340
+ /** Typed configuration schema — declares settings that users provide via config.json or the side panel. */
341
+ configSchema;
340
342
  };
341
343
 
342
344
  // src/linear-api.ts
@@ -15362,21 +15364,21 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
15362
15364
  };
15363
15365
  var src_default = new LinearPlugin();
15364
15366
 
15365
- // dist/_adapter_entry_e9556c9b-35c2-47a1-b36a-85025ecca7ba.ts
15367
+ // dist/_adapter_entry_4adfbfea-895d-48f9-b281-bc72737b59b2.ts
15366
15368
  if (!globalThis.__openTabs) {
15367
15369
  globalThis.__openTabs = {};
15368
15370
  } else {
15369
15371
  const desc = Object.getOwnPropertyDescriptor(globalThis.__openTabs, "adapters");
15370
15372
  if (desc && !desc.writable) {
15371
- const ot2 = globalThis.__openTabs;
15373
+ const ot3 = globalThis.__openTabs;
15372
15374
  const newAdaptersObj = {};
15373
- if (ot2.adapters) {
15374
- for (const key of Object.keys(ot2.adapters)) {
15375
- const d = Object.getOwnPropertyDescriptor(ot2.adapters, key);
15375
+ if (ot3.adapters) {
15376
+ for (const key of Object.keys(ot3.adapters)) {
15377
+ const d = Object.getOwnPropertyDescriptor(ot3.adapters, key);
15376
15378
  if (d) Object.defineProperty(newAdaptersObj, key, d);
15377
15379
  }
15378
15380
  }
15379
- globalThis.__openTabs = Object.assign({}, ot2, { adapters: newAdaptersObj });
15381
+ globalThis.__openTabs = Object.assign({}, ot3, { adapters: newAdaptersObj });
15380
15382
  }
15381
15383
  }
15382
15384
  if (!globalThis.__openTabs.adapters) {
@@ -15414,6 +15416,16 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
15414
15416
  }
15415
15417
  };
15416
15418
  var restoreTransport = setLogTransport ? setLogTransport(logTransport) : void 0;
15419
+ var ot2 = globalThis.__openTabs;
15420
+ ot2._notifyReadinessChanged = () => {
15421
+ try {
15422
+ const nonce = globalThis.__openTabs?._readinessNonce;
15423
+ if (nonce) {
15424
+ window.postMessage({ type: "opentabs:readiness-changed", plugin: "linear", nonce }, "*");
15425
+ }
15426
+ } catch {
15427
+ }
15428
+ };
15417
15429
  var existing = adapters["linear"];
15418
15430
  if (existing) {
15419
15431
  if (typeof existing.teardown === "function") {
@@ -15425,7 +15437,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
15425
15437
  }
15426
15438
  }
15427
15439
  if (!Reflect.deleteProperty(adapters, "linear")) {
15428
- const ot2 = globalThis.__openTabs;
15440
+ const ot3 = globalThis.__openTabs;
15429
15441
  const newAdapters = {};
15430
15442
  for (const key of Object.keys(adapters)) {
15431
15443
  if (key !== "linear") {
@@ -15433,7 +15445,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
15433
15445
  if (desc) Object.defineProperty(newAdapters, key, desc);
15434
15446
  }
15435
15447
  }
15436
- globalThis.__openTabs = Object.assign({}, ot2, { adapters: newAdapters });
15448
+ globalThis.__openTabs = Object.assign({}, ot3, { adapters: newAdapters });
15437
15449
  }
15438
15450
  var hasLifecycleHooks = typeof src_default.onToolInvocationStart === "function" || typeof src_default.onToolInvocationEnd === "function";
15439
15451
  for (const tool of src_default.tools) {
@@ -15494,12 +15506,12 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
15494
15506
  }
15495
15507
  }
15496
15508
  };
15497
- const ot2 = globalThis.__openTabs;
15498
- if (!ot2._navigationInterceptor) {
15509
+ const ot3 = globalThis.__openTabs;
15510
+ if (!ot3._navigationInterceptor) {
15499
15511
  const origPushState = history.pushState.bind(history);
15500
15512
  const origReplaceState = history.replaceState.bind(history);
15501
15513
  const callbacks = /* @__PURE__ */ new Map();
15502
- ot2._navigationInterceptor = { callbacks, origPushState, origReplaceState };
15514
+ ot3._navigationInterceptor = { callbacks, origPushState, origReplaceState };
15503
15515
  history.pushState = function(...args) {
15504
15516
  origPushState(...args);
15505
15517
  for (const cb of callbacks.values()) {
@@ -15513,7 +15525,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
15513
15525
  }
15514
15526
  };
15515
15527
  }
15516
- const interceptor = ot2._navigationInterceptor;
15528
+ const interceptor = ot3._navigationInterceptor;
15517
15529
  interceptor.callbacks.set("linear", checkUrl);
15518
15530
  window.addEventListener("popstate", checkUrl);
15519
15531
  window.addEventListener("hashchange", checkUrl);
@@ -15568,5 +15580,5 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
15568
15580
  };
15569
15581
  delete src_default.onDeactivate;
15570
15582
  }
15571
- })();(function(){var o=(globalThis).__openTabs;if(o&&o.adapters&&o.adapters["linear"]){var a=o.adapters["linear"];a.__adapterHash="50ed331b2cae64de6370a0c7b78af84923ed5b1ba78be6975e526afcdf5a55e4";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});}})();
15583
+ })();(function(){var o=(globalThis).__openTabs;if(o&&o.adapters&&o.adapters["linear"]){var a=o.adapters["linear"];a.__adapterHash="4bbb059dbbcbc68d32a2d3e185adfeaca569d7f141e6fdafd8520d4d31c52435";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});}})();
15572
15584
  //# sourceMappingURL=adapter.iife.js.map