@opentabs-dev/opentabs-plugin-meticulous 0.0.76 → 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 +63 -131
- package/dist/adapter.iife.js +4 -2
- package/dist/adapter.iife.js.map +2 -2
- package/dist/tools.json +1 -1
- package/package.json +3 -3
package/README.md
CHANGED
|
@@ -1,159 +1,91 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Meticulous
|
|
2
2
|
|
|
3
|
-
OpenTabs plugin for Meticulous
|
|
3
|
+
OpenTabs plugin for Meticulous — gives AI agents access to Meticulous through your authenticated browser session.
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## Install
|
|
6
6
|
|
|
7
|
+
```bash
|
|
8
|
+
opentabs plugin install meticulous
|
|
7
9
|
```
|
|
8
|
-
meticulous/
|
|
9
|
-
├── package.json # Plugin metadata (name, opentabs field, dependencies)
|
|
10
|
-
├── icon.svg # Optional custom icon (square SVG, max 8KB)
|
|
11
|
-
├── icon-inactive.svg # Optional manual inactive icon override
|
|
12
|
-
├── src/
|
|
13
|
-
│ ├── index.ts # Plugin class (extends OpenTabsPlugin)
|
|
14
|
-
│ └── tools/ # One file per tool (using defineTool)
|
|
15
|
-
│ └── example.ts
|
|
16
|
-
└── dist/ # Build output (generated)
|
|
17
|
-
├── adapter.iife.js # Bundled adapter injected into matching tabs
|
|
18
|
-
└── tools.json # Tool schemas for MCP registration
|
|
19
|
-
```
|
|
20
|
-
|
|
21
|
-
## Configuration
|
|
22
|
-
|
|
23
|
-
Plugin metadata is defined in `package.json` under the `opentabs` field:
|
|
24
|
-
|
|
25
|
-
```json
|
|
26
|
-
{
|
|
27
|
-
"name": "opentabs-plugin-meticulous",
|
|
28
|
-
"main": "dist/adapter.iife.js",
|
|
29
|
-
"opentabs": {
|
|
30
|
-
"displayName": "Meticulous",
|
|
31
|
-
"description": "OpenTabs plugin for Meticulous",
|
|
32
|
-
"urlPatterns": ["*://*.app.meticulous.ai/*"]
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
```
|
|
36
|
-
|
|
37
|
-
- **`main`** — entry point for the bundled adapter IIFE
|
|
38
|
-
- **`opentabs.displayName`** — human-readable name shown in the side panel
|
|
39
|
-
- **`opentabs.description`** — short description of what the plugin does
|
|
40
|
-
- **`opentabs.urlPatterns`** — Chrome match patterns for tabs where the adapter is injected
|
|
41
10
|
|
|
42
|
-
|
|
11
|
+
Or install globally via npm:
|
|
43
12
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
```
|
|
47
|
-
meticulous/
|
|
48
|
-
├── package.json
|
|
49
|
-
├── icon.svg ← custom icon (optional)
|
|
50
|
-
├── icon-inactive.svg ← manual inactive override (optional, requires icon.svg)
|
|
51
|
-
├── src/
|
|
52
|
-
│ └── ...
|
|
13
|
+
```bash
|
|
14
|
+
npm install -g @opentabs-dev/opentabs-plugin-meticulous
|
|
53
15
|
```
|
|
54
16
|
|
|
55
|
-
|
|
17
|
+
## Setup
|
|
56
18
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
- If no `icon.svg` is provided, the letter avatar is used automatically
|
|
19
|
+
1. Open [app.meticulous.ai](https://app.meticulous.ai) in Chrome and log in
|
|
20
|
+
2. Open the OpenTabs side panel — the Meticulous plugin should appear as **ready**
|
|
60
21
|
|
|
61
|
-
|
|
22
|
+
## Tools (26)
|
|
62
23
|
|
|
63
|
-
|
|
64
|
-
- Maximum 8 KB file size
|
|
65
|
-
- No embedded `<image>`, `<script>`, or event handler attributes (`onclick`, etc.)
|
|
66
|
-
- Manual `icon-inactive.svg` must use only achromatic (grayscale) colors
|
|
24
|
+
### User (1)
|
|
67
25
|
|
|
68
|
-
|
|
26
|
+
| Tool | Description | Type |
|
|
27
|
+
|---|---|---|
|
|
28
|
+
| `get_current_user` | Get the current user profile | Read |
|
|
69
29
|
|
|
70
|
-
|
|
71
|
-
npm install
|
|
72
|
-
npm run build # tsc && opentabs-plugin build
|
|
73
|
-
npm run dev # watch mode (tsc --watch + opentabs-plugin build --watch)
|
|
74
|
-
npm run type-check # tsc --noEmit
|
|
75
|
-
npm run lint # biome
|
|
76
|
-
```
|
|
30
|
+
### Organizations (2)
|
|
77
31
|
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
```ts
|
|
83
|
-
import { z } from 'zod';
|
|
84
|
-
import { defineTool } from '@opentabs-dev/plugin-sdk';
|
|
85
|
-
|
|
86
|
-
export const myTool = defineTool({
|
|
87
|
-
name: 'my_tool',
|
|
88
|
-
displayName: 'My Tool',
|
|
89
|
-
description: 'What this tool does',
|
|
90
|
-
icon: 'wrench',
|
|
91
|
-
input: z.object({ /* ... */ }),
|
|
92
|
-
output: z.object({ /* ... */ }),
|
|
93
|
-
handle: async (params) => {
|
|
94
|
-
// Tool implementation runs in the browser tab context
|
|
95
|
-
return { /* ... */ };
|
|
96
|
-
},
|
|
97
|
-
});
|
|
98
|
-
```
|
|
32
|
+
| Tool | Description | Type |
|
|
33
|
+
|---|---|---|
|
|
34
|
+
| `list_organizations` | List organizations | Read |
|
|
35
|
+
| `list_organization_members` | List org members | Read |
|
|
99
36
|
|
|
100
|
-
|
|
37
|
+
### Projects (3)
|
|
101
38
|
|
|
102
|
-
|
|
39
|
+
| Tool | Description | Type |
|
|
40
|
+
|---|---|---|
|
|
41
|
+
| `list_projects` | List projects | Read |
|
|
42
|
+
| `get_project` | Get project details | Read |
|
|
43
|
+
| `get_project_pull_request` | Get PR test status | Read |
|
|
103
44
|
|
|
104
|
-
|
|
45
|
+
### Integrations (1)
|
|
105
46
|
|
|
106
|
-
|
|
107
|
-
|
|
47
|
+
| Tool | Description | Type |
|
|
48
|
+
|---|---|---|
|
|
49
|
+
| `list_github_repositories` | List connected GitHub repos | Read |
|
|
108
50
|
|
|
109
|
-
|
|
110
|
-
const token = getLocalStorage('token');
|
|
51
|
+
### Test Runs (11)
|
|
111
52
|
|
|
112
|
-
|
|
113
|
-
|
|
53
|
+
| Tool | Description | Type |
|
|
54
|
+
|---|---|---|
|
|
55
|
+
| `get_test_run` | Get test run details | Read |
|
|
56
|
+
| `get_test_run_screenshots` | Get test run screenshot diffs | Read |
|
|
57
|
+
| `get_test_run_diffs` | Get replay diffs for a test run | Read |
|
|
58
|
+
| `get_test_run_test_cases` | Get test case results | Read |
|
|
59
|
+
| `get_test_run_coverage` | Get test run coverage | Read |
|
|
60
|
+
| `get_test_run_source_code` | Get source code for a test run commit | Read |
|
|
61
|
+
| `get_test_run_pr_description` | Get PR description for a test run | Read |
|
|
62
|
+
| `accept_all_diffs` | Approve all diffs in a test run | Write |
|
|
63
|
+
| `check_for_flakes` | Check for flaky tests | Read |
|
|
64
|
+
| `create_label_action` | Label a screenshot diff | Write |
|
|
65
|
+
| `upsert_diff_approval` | Bulk approve/reject diffs | Write |
|
|
114
66
|
|
|
115
|
-
|
|
116
|
-
const appState = getPageGlobal('__APP_STATE__');
|
|
117
|
-
```
|
|
67
|
+
### Replays (4)
|
|
118
68
|
|
|
119
|
-
|
|
69
|
+
| Tool | Description | Type |
|
|
70
|
+
|---|---|---|
|
|
71
|
+
| `get_replay` | Get replay details | Read |
|
|
72
|
+
| `list_replays` | List replays for a project | Read |
|
|
73
|
+
| `get_replay_screenshots` | Get screenshots for a replay | Read |
|
|
74
|
+
| `compare_replays` | Compare replays in a test run | Write |
|
|
120
75
|
|
|
121
|
-
|
|
76
|
+
### Sessions (4)
|
|
122
77
|
|
|
123
|
-
|
|
78
|
+
| Tool | Description | Type |
|
|
79
|
+
|---|---|---|
|
|
80
|
+
| `list_sessions` | List sessions for a project | Read |
|
|
81
|
+
| `get_session` | Get session details | Read |
|
|
82
|
+
| `search_sessions` | Search sessions | Read |
|
|
83
|
+
| `get_session_events` | Get user events in a session | Read |
|
|
124
84
|
|
|
125
|
-
|
|
85
|
+
## How It Works
|
|
126
86
|
|
|
127
|
-
|
|
128
|
-
// src/schemas/channel.ts
|
|
129
|
-
import { z } from 'zod';
|
|
87
|
+
This plugin runs inside your Meticulous 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.
|
|
130
88
|
|
|
131
|
-
|
|
132
|
-
id: z.string().describe('Channel ID'),
|
|
133
|
-
name: z.string().describe('Channel name'),
|
|
134
|
-
});
|
|
135
|
-
|
|
136
|
-
export type Channel = z.infer<typeof channelSchema>;
|
|
137
|
-
```
|
|
138
|
-
|
|
139
|
-
Then import and reuse in your tools:
|
|
140
|
-
|
|
141
|
-
```ts
|
|
142
|
-
// src/tools/list-channels.ts
|
|
143
|
-
import { channelSchema } from '../schemas/channel.js';
|
|
144
|
-
|
|
145
|
-
export const listChannels = defineTool({
|
|
146
|
-
name: 'list_channels',
|
|
147
|
-
displayName: 'List Channels',
|
|
148
|
-
description: 'List all available channels',
|
|
149
|
-
icon: 'list',
|
|
150
|
-
input: z.object({}),
|
|
151
|
-
output: z.object({ channels: z.array(channelSchema) }),
|
|
152
|
-
handle: async () => {
|
|
153
|
-
// ...
|
|
154
|
-
return { channels: [] };
|
|
155
|
-
},
|
|
156
|
-
});
|
|
157
|
-
```
|
|
89
|
+
## License
|
|
158
90
|
|
|
159
|
-
|
|
91
|
+
MIT
|
package/dist/adapter.iife.js
CHANGED
|
@@ -386,6 +386,8 @@
|
|
|
386
386
|
* (e.g., 'https://github.com'), not a match pattern.
|
|
387
387
|
*/
|
|
388
388
|
homepage;
|
|
389
|
+
/** Typed configuration schema — declares settings that users provide via config.json or the side panel. */
|
|
390
|
+
configSchema;
|
|
389
391
|
};
|
|
390
392
|
|
|
391
393
|
// src/meticulous-api.ts
|
|
@@ -15725,7 +15727,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
15725
15727
|
};
|
|
15726
15728
|
var src_default = new MeticulousPlugin();
|
|
15727
15729
|
|
|
15728
|
-
// dist/
|
|
15730
|
+
// dist/_adapter_entry_587a9d02-5a93-40cd-8dee-40f9722039ea.ts
|
|
15729
15731
|
if (!globalThis.__openTabs) {
|
|
15730
15732
|
globalThis.__openTabs = {};
|
|
15731
15733
|
} else {
|
|
@@ -15941,5 +15943,5 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
15941
15943
|
};
|
|
15942
15944
|
delete src_default.onDeactivate;
|
|
15943
15945
|
}
|
|
15944
|
-
})();(function(){var o=(globalThis).__openTabs;if(o&&o.adapters&&o.adapters["meticulous"]){var a=o.adapters["meticulous"];a.__adapterHash="
|
|
15946
|
+
})();(function(){var o=(globalThis).__openTabs;if(o&&o.adapters&&o.adapters["meticulous"]){var a=o.adapters["meticulous"];a.__adapterHash="799e10870a01cabf9fa6cadaf205a6c5ba9ab90d8fcb1f4cc2128f5386909d86";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,"meticulous",{value:a,writable:false,configurable:false,enumerable:true});Object.defineProperty(o,"adapters",{value:o.adapters,writable:false,configurable:false});}})();
|
|
15945
15947
|
//# sourceMappingURL=adapter.iife.js.map
|