@opentabs-dev/opentabs-plugin-netlify 0.0.76 → 0.0.78

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 CHANGED
@@ -1,159 +1,120 @@
1
- # opentabs-plugin-netlify
1
+ # Netlify
2
2
 
3
- OpenTabs plugin for Netlify
3
+ OpenTabs plugin for Netlify — gives AI agents access to Netlify through your authenticated browser session.
4
4
 
5
- ## Project Structure
5
+ ## Install
6
6
 
7
+ ```bash
8
+ opentabs plugin install netlify
7
9
  ```
8
- netlify/
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
10
 
23
- Plugin metadata is defined in `package.json` under the `opentabs` field:
11
+ Or install globally via npm:
24
12
 
25
- ```json
26
- {
27
- "name": "opentabs-plugin-netlify",
28
- "main": "dist/adapter.iife.js",
29
- "opentabs": {
30
- "displayName": "Netlify",
31
- "description": "OpenTabs plugin for Netlify",
32
- "urlPatterns": ["*://*.app.netlify.com/*"]
33
- }
34
- }
13
+ ```bash
14
+ npm install -g @opentabs-dev/opentabs-plugin-netlify
35
15
  ```
36
16
 
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
17
+ ## Setup
41
18
 
42
- ## Custom Icons
19
+ 1. Open [app.netlify.com](https://app.netlify.com) in Chrome and log in
20
+ 2. Open the OpenTabs side panel — the Netlify plugin should appear as **ready**
43
21
 
44
- By default, the side panel shows a colored letter avatar for your plugin. To use a custom icon, place an `icon.svg` file in the plugin root (next to `package.json`):
22
+ ## Tools (40)
45
23
 
46
- ```
47
- netlify/
48
- ├── package.json
49
- ├── icon.svg ← custom icon (optional)
50
- ├── icon-inactive.svg ← manual inactive override (optional, requires icon.svg)
51
- ├── src/
52
- │ └── ...
53
- ```
24
+ ### Account (4)
54
25
 
55
- **How it works:**
26
+ | Tool | Description | Type |
27
+ |---|---|---|
28
+ | `get_current_user` | Get authenticated user profile | Read |
29
+ | `list_accounts` | List all accounts | Read |
30
+ | `get_account` | Get account details by ID | Read |
31
+ | `list_audit_events` | List account audit log events | Read |
56
32
 
57
- - `opentabs-plugin build` reads `icon.svg`, validates it, auto-generates a grayscale inactive variant, and embeds both in `dist/tools.json`
58
- - To override the auto-generated inactive icon, provide `icon-inactive.svg` (must use only grayscale colors)
59
- - If no `icon.svg` is provided, the letter avatar is used automatically
33
+ ### Members (2)
60
34
 
61
- **Icon requirements:**
35
+ | Tool | Description | Type |
36
+ |---|---|---|
37
+ | `list_members` | List account team members | Read |
38
+ | `get_member` | Get member details by ID | Read |
62
39
 
63
- - Square SVG with a `viewBox` attribute (e.g., `viewBox="0 0 32 32"`)
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
40
+ ### Sites (5)
67
41
 
68
- ## Development
42
+ | Tool | Description | Type |
43
+ |---|---|---|
44
+ | `list_sites` | List sites in an account | Read |
45
+ | `get_site` | Get site details by ID | Read |
46
+ | `create_site` | Create a new site | Write |
47
+ | `update_site` | Update site settings | Write |
48
+ | `delete_site` | Delete a site permanently | Write |
69
49
 
70
- ```bash
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
- ```
50
+ ### Deploys (6)
77
51
 
78
- ## Adding Tools
79
-
80
- Create a new file in `src/tools/` using `defineTool`:
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
- ```
52
+ | Tool | Description | Type |
53
+ |---|---|---|
54
+ | `list_deploys` | List site deploys | Read |
55
+ | `get_deploy` | Get deploy details by ID | Read |
56
+ | `lock_deploy` | Lock a deploy to prevent auto-publish | Write |
57
+ | `unlock_deploy` | Unlock a deploy to re-enable auto-publish | Write |
58
+ | `restore_deploy` | Restore a previous deploy | Write |
59
+ | `rollback_deploy` | Rollback site to previous deploy | Write |
99
60
 
100
- Then register it in `src/index.ts` by adding it to the `tools` array.
61
+ ### Builds (2)
101
62
 
102
- ## Authentication
63
+ | Tool | Description | Type |
64
+ |---|---|---|
65
+ | `list_builds` | List site builds | Read |
66
+ | `create_build` | Trigger a new site build | Write |
103
67
 
104
- Plugin tools run in the browser tab context, so they can read auth tokens directly from the page. The SDK provides utilities for the most common patterns:
68
+ ### Environment (5)
105
69
 
106
- ```ts
107
- import { getLocalStorage, getCookie, getPageGlobal } from '@opentabs-dev/plugin-sdk';
70
+ | Tool | Description | Type |
71
+ |---|---|---|
72
+ | `list_env_vars` | List environment variables | Read |
73
+ | `get_env_var` | Get environment variable by key | Read |
74
+ | `create_env_vars` | Create environment variables | Write |
75
+ | `update_env_var` | Update an environment variable | Write |
76
+ | `delete_env_var` | Delete an environment variable | Write |
108
77
 
109
- // localStorage — most common
110
- const token = getLocalStorage('token');
78
+ ### DNS (6)
111
79
 
112
- // Cookies session tokens, JWTs
113
- const session = getCookie('session_id');
80
+ | Tool | Description | Type |
81
+ |---|---|---|
82
+ | `list_dns_zones` | List DNS zones | Read |
83
+ | `get_dns_zone` | Get DNS zone details by ID | Read |
84
+ | `create_dns_zone` | Create a new DNS zone | Write |
85
+ | `list_dns_records` | List DNS records in a zone | Read |
86
+ | `create_dns_record` | Create a DNS record | Write |
87
+ | `delete_dns_record` | Delete a DNS record | Write |
114
88
 
115
- // Page globals — SPA boot data (e.g., window.__APP_STATE__)
116
- const appState = getPageGlobal('__APP_STATE__');
117
- ```
89
+ ### Hooks (5)
118
90
 
119
- **Iframe fallback:** Some apps (e.g., Discord) delete `window.localStorage` after boot. `getLocalStorage` automatically tries a hidden same-origin iframe fallback before returning `null`, so you don't need to handle this case manually.
91
+ | Tool | Description | Type |
92
+ |---|---|---|
93
+ | `list_hooks` | List site notification hooks | Read |
94
+ | `delete_hook` | Delete a notification hook | Write |
95
+ | `list_build_hooks` | List site build hooks | Read |
96
+ | `create_build_hook` | Create a build hook | Write |
97
+ | `delete_build_hook` | Delete a build hook | Write |
120
98
 
121
- **SPA hydration:** Auth tokens may not be available immediately on page load. Implement polling in `isReady()` to wait until the app has hydrated before your tools run. See the comments in `src/index.ts` for an example polling pattern.
99
+ ### Deploy Keys (2)
122
100
 
123
- ## Shared Schemas
101
+ | Tool | Description | Type |
102
+ |---|---|---|
103
+ | `list_deploy_keys` | List deploy keys | Read |
104
+ | `create_deploy_key` | Create a new deploy key | Write |
124
105
 
125
- When 3 or more tools share the same input or output shape, extract common Zod schemas into a shared file to avoid duplication:
106
+ ### Forms (3)
126
107
 
127
- ```ts
128
- // src/schemas/channel.ts
129
- import { z } from 'zod';
108
+ | Tool | Description | Type |
109
+ |---|---|---|
110
+ | `list_forms` | List site forms | Read |
111
+ | `list_form_submissions` | List form submissions | Read |
112
+ | `delete_submission` | Delete a form submission | Write |
130
113
 
131
- export const channelSchema = z.object({
132
- id: z.string().describe('Channel ID'),
133
- name: z.string().describe('Channel name'),
134
- });
114
+ ## How It Works
135
115
 
136
- export type Channel = z.infer<typeof channelSchema>;
137
- ```
116
+ This plugin runs inside your Netlify 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.
138
117
 
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
- ```
118
+ ## License
158
119
 
159
- This keeps your tool schemas DRY and makes it easy to evolve shared types in one place.
120
+ MIT
@@ -383,6 +383,8 @@
383
383
  * (e.g., 'https://github.com'), not a match pattern.
384
384
  */
385
385
  homepage;
386
+ /** Typed configuration schema — declares settings that users provide via config.json or the side panel. */
387
+ configSchema;
386
388
  };
387
389
 
388
390
  // src/netlify-api.ts
@@ -15516,7 +15518,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
15516
15518
  };
15517
15519
  var src_default = new NetlifyPlugin();
15518
15520
 
15519
- // dist/_adapter_entry_efda9825-8d48-4f78-baf8-3d129ecc73f5.ts
15521
+ // dist/_adapter_entry_c64f60ed-1f7f-435c-ae5e-e38aab174c86.ts
15520
15522
  if (!globalThis.__openTabs) {
15521
15523
  globalThis.__openTabs = {};
15522
15524
  } else {
@@ -15732,5 +15734,5 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
15732
15734
  };
15733
15735
  delete src_default.onDeactivate;
15734
15736
  }
15735
- })();(function(){var o=(globalThis).__openTabs;if(o&&o.adapters&&o.adapters["netlify"]){var a=o.adapters["netlify"];a.__adapterHash="eb4882ee3b3be5ceb71012735d2bcdff77b1cfb04cca8da8d69f518fa0e006a3";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,"netlify",{value:a,writable:false,configurable:false,enumerable:true});Object.defineProperty(o,"adapters",{value:o.adapters,writable:false,configurable:false});}})();
15737
+ })();(function(){var o=(globalThis).__openTabs;if(o&&o.adapters&&o.adapters["netlify"]){var a=o.adapters["netlify"];a.__adapterHash="2cc85fda940cfec4b47ac299147cbf5c461c27c8b1152c93623d6f619ca2c12e";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,"netlify",{value:a,writable:false,configurable:false,enumerable:true});Object.defineProperty(o,"adapters",{value:o.adapters,writable:false,configurable:false});}})();
15736
15738
  //# sourceMappingURL=adapter.iife.js.map