From 8cf3ac502e4ae9e4a2e72cb2fcc86b71c699f136 Mon Sep 17 00:00:00 2001 From: Andrew Harris Date: Tue, 12 May 2026 15:33:15 +0100 Subject: [PATCH 01/16] Ensure Claude skill uses password field for api keys --- .claude/skills/build-plugin/SKILL.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.claude/skills/build-plugin/SKILL.md b/.claude/skills/build-plugin/SKILL.md index 48e0df7..18b93b1 100644 --- a/.claude/skills/build-plugin/SKILL.md +++ b/.claude/skills/build-plugin/SKILL.md @@ -254,7 +254,7 @@ Defines the config form shown when a user adds the plugin. One entry per config - `help` — tooltip text shown as a `(?)` icon - `defaultValue` — pre-populated value - `validation` — e.g. `{ "required": true }` -- `allowEncryption: true` — marks the field as a secret (encrypted at rest); use on any token, password, or key field +- `allowEncryption: true` — legacy way to mark a `text` field as a secret; **prefer `type: "password"` instead** for any token, password, or key field - `help` — tooltip text; **supports markdown** (links, bold, etc.) - `tileEditorStep` — controls which tile editor step the field appears in; defaults to `["Parameters"]`. Set to `["Timeframe"]` to place a field on the Timeframe step. **JSON-only** — cannot be set via the Save as data stream modal; must be added directly to the data stream JSON file after export. @@ -286,7 +286,7 @@ Defines the config form shown when a user adds the plugin. One entry per config { "type": "text", "name": "hostname", "label": "Hostname", "placeholder": "api.example.com" } ``` -**`password`** — masked text input (alternative to `text` + `allowEncryption`): +**`password`** — masked text input; **use this for any API key, token, secret, or password field** (preferred over `text` + `allowEncryption`): ```json { "type": "password", "name": "apiKey", "label": "API Key" } ``` From b4a25f42aa9db2674097a6ab82608e68b010bed7 Mon Sep 17 00:00:00 2001 From: Andrew Harris Date: Tue, 12 May 2026 15:35:06 +0100 Subject: [PATCH 02/16] Update importFrequencyMinutes to frequencyMinutes correct property name --- .claude/skills/build-plugin/SKILL.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.claude/skills/build-plugin/SKILL.md b/.claude/skills/build-plugin/SKILL.md index 18b93b1..a6a58ab 100644 --- a/.claude/skills/build-plugin/SKILL.md +++ b/.claude/skills/build-plugin/SKILL.md @@ -441,7 +441,7 @@ Defines what gets imported into the SquaredUp graph. - `properties` are extra fields stored on the graph node and accessible in data stream scripts as `object.propName`. - Use `{ "targetProp": "sourceProp" }` syntax when the column name differs from the property name you want. - The `sourceType` column value **must** match an entry in `objectTypes` — otherwise objects won't import. -- `importFrequencyMinutes` — controls how often SquaredUp re-runs the import. Defaults to `720` (12 hours). +- `frequencyMinutes` — controls how often SquaredUp re-runs the import. Defaults to `720` (12 hours). **Import data stream pattern** — the stream called by an import step must return one flat row per object with at least `sourceId`, `name`, `sourceType`: From a46c6cc8919e4e56b3ca79aca55a5ede01d2f12c Mon Sep 17 00:00:00 2001 From: Andrew Harris Date: Tue, 12 May 2026 16:01:11 +0100 Subject: [PATCH 03/16] deduplicate help property in skill for ui.json --- .claude/skills/build-plugin/SKILL.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.claude/skills/build-plugin/SKILL.md b/.claude/skills/build-plugin/SKILL.md index a6a58ab..ddd1daf 100644 --- a/.claude/skills/build-plugin/SKILL.md +++ b/.claude/skills/build-plugin/SKILL.md @@ -251,11 +251,10 @@ For Web API plugins, always use `"hybrid"` unless the user specifically requests Defines the config form shown when a user adds the plugin. One entry per config field. All field types share these common properties: - `name` — the field's key, referenced as `{{fieldName}}` in expressions - `label` — displayed in the form -- `help` — tooltip text shown as a `(?)` icon - `defaultValue` — pre-populated value - `validation` — e.g. `{ "required": true }` - `allowEncryption: true` — legacy way to mark a `text` field as a secret; **prefer `type: "password"` instead** for any token, password, or key field -- `help` — tooltip text; **supports markdown** (links, bold, etc.) +- `help` — tooltip text shown as a (?) icon; **supports markdown** (links, bold, etc.)) - `tileEditorStep` — controls which tile editor step the field appears in; defaults to `["Parameters"]`. Set to `["Timeframe"]` to place a field on the Timeframe step. **JSON-only** — cannot be set via the Save as data stream modal; must be added directly to the data stream JSON file after export. **Conditional visibility** — any field or fieldGroup can be conditionally shown using `visible`: From 69afcb5bc7f7300be11d204d9baafceea43318d8 Mon Sep 17 00:00:00 2001 From: Andrew Harris Date: Tue, 12 May 2026 16:07:05 +0100 Subject: [PATCH 04/16] Remove suffix as can cause Claude to update or create a new plugin --- .claude/skills/build-plugin/SKILL.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.claude/skills/build-plugin/SKILL.md b/.claude/skills/build-plugin/SKILL.md index ddd1daf..aaa4659 100644 --- a/.claude/skills/build-plugin/SKILL.md +++ b/.claude/skills/build-plugin/SKILL.md @@ -1258,9 +1258,8 @@ squaredup validate --watch # re-validate on every file change (useful durin squaredup validate --json # output JSON — use this flag when running validation as Claude/AI agent # Deploy -squaredup deploy --suffix # suffix namespaces your deployment (e.g. initials) -squaredup deploy --suffix --force # overwrite without confirmation prompt -squaredup deploy --watch # re-deploy automatically on file changes +squaredup deploy --force # overwrite without confirmation prompt +squaredup deploy --watch # re-deploy automatically on file changes # List and delete deployed plugins squaredup list # list all plugins deployed to your tenant From 0dbc190474dc732d556e2c0600da5b46289a4ecc Mon Sep 17 00:00:00 2001 From: Andrew Harris Date: Wed, 13 May 2026 07:53:31 +0100 Subject: [PATCH 05/16] move allowEncryption skill tip into key-value This is the only field that actually supports this property currently, the other fields have no UI to support encrypting values --- .claude/skills/build-plugin/SKILL.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.claude/skills/build-plugin/SKILL.md b/.claude/skills/build-plugin/SKILL.md index aaa4659..3f5e0aa 100644 --- a/.claude/skills/build-plugin/SKILL.md +++ b/.claude/skills/build-plugin/SKILL.md @@ -253,7 +253,6 @@ Defines the config form shown when a user adds the plugin. One entry per config - `label` — displayed in the form - `defaultValue` — pre-populated value - `validation` — e.g. `{ "required": true }` -- `allowEncryption: true` — legacy way to mark a `text` field as a secret; **prefer `type: "password"` instead** for any token, password, or key field - `help` — tooltip text shown as a (?) icon; **supports markdown** (links, bold, etc.)) - `tileEditorStep` — controls which tile editor step the field appears in; defaults to `["Parameters"]`. Set to `["Timeframe"]` to place a field on the Timeframe step. **JSON-only** — cannot be set via the Save as data stream modal; must be added directly to the data stream JSON file after export. @@ -347,9 +346,9 @@ Defines the config form shown when a user adds the plugin. One entry per config > ⚠️ When using a data stream as the autocomplete source, the backing stream must return rows with `label` (string) and `value` columns, and those columns must have `"role": "label"` and `"role": "value"` declared in the stream's metadata — otherwise the dropdown won't populate correctly. -**`key-value`** — list of key/value pairs (useful for custom headers, tags): +**`key-value`** — list of key/value pairs (useful for custom headers, tags). Set `allowEncryption: true` to let users mark individual values as encrypted — use this when the field may contain sensitive data such as secret environment variables: ```json -{ "type": "key-value", "name": "headers", "label": "Headers" } +{ "type": "key-value", "name": "headers", "label": "Headers", "allowEncryption": true } ``` **`expression`** — expression/template input: From f36246c6a1fd1daec06df19baff502f0c0a259e8 Mon Sep 17 00:00:00 2001 From: Andrew Harris Date: Wed, 13 May 2026 08:32:23 +0100 Subject: [PATCH 06/16] add version metadata to skill to track changes --- .claude/skills/build-plugin/SKILL.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.claude/skills/build-plugin/SKILL.md b/.claude/skills/build-plugin/SKILL.md index 3f5e0aa..f9e3bbe 100644 --- a/.claude/skills/build-plugin/SKILL.md +++ b/.claude/skills/build-plugin/SKILL.md @@ -1,6 +1,9 @@ --- name: build-plugin description: Build a SquaredUp low-code plugin for any HTTP/REST API — from exploring the API through writing data streams, dashboards, and deploying. Use when building or extending a SquaredUp plugin, data source, or integration. Trigger phrases include "build a plugin", "create a plugin", "new plugin", "add a data source", "integrate with", "build an integration", "connect to [service]", "I want to pull data from", "monitor [service] in SquaredUp". +metadata: + author: SquaredUp + version: "0.0.1" --- # Building a SquaredUp Low-Code Plugin From 2a7f06a87f68146e0d2dad5006d4ff86f8c1e00a Mon Sep 17 00:00:00 2001 From: Andrew Harris Date: Wed, 13 May 2026 08:35:30 +0100 Subject: [PATCH 07/16] Add editorconfig to preserve indentation from product --- .editorconfig | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 .editorconfig diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..7ffba45 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,14 @@ +root = true + +[*] +charset = utf-8 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true + +[*.{md,json,js}] +indent_style = space +indent_size = 4 + +[*.md] +trim_trailing_whitespace = false From d32594fef9cd983ff3bfd50d7db145e9438b5b61 Mon Sep 17 00:00:00 2001 From: Andrew Harris Date: Wed, 13 May 2026 09:28:59 +0100 Subject: [PATCH 08/16] Ask for author handle before writing metadata.json The skill previously used a placeholder @yourhandle in the metadata.json template without prompting Claude to collect this from the user, meaning plugins could be created with an unresolved placeholder. An explicit AskUserQuestion instruction now ensures the author name is always gathered at the point it is needed. The author type silently defaults to "community" to keep the interaction minimal. --- .claude/skills/build-plugin/SKILL.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.claude/skills/build-plugin/SKILL.md b/.claude/skills/build-plugin/SKILL.md index f9e3bbe..aa0a171 100644 --- a/.claude/skills/build-plugin/SKILL.md +++ b/.claude/skills/build-plugin/SKILL.md @@ -114,6 +114,8 @@ my-plugin/ ## Phase 4: metadata.json +**Before writing `metadata.json`, use `AskUserQuestion` to ask the user for their author name or GitHub handle.** Use `"community"` as the `author.type`. + ```json { "name": "my-plugin", From cd40e40dfceec9dc6c574df71696371fb2ef142f Mon Sep 17 00:00:00 2001 From: Andrew Harris Date: Wed, 13 May 2026 09:55:27 +0100 Subject: [PATCH 09/16] Always create docs/README.md when scaffolding MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The build-plugin skill mentioned that the documentation link in metadata.json should point to docs/README.md, but never explicitly instructed Claude to create the file. This made it easy to skip. The fix adds docs/README.md to the Phase 3 checklist entry, the folder structure diagram, and a new section explaining what the file should contain (prerequisites, config field descriptions, object types, known limitations). The section also explains why it matters — the file is surfaced directly in-product when users add the plugin, so it needs to work as a self-contained setup guide without relying on external links. --- .claude/skills/build-plugin/SKILL.md | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/.claude/skills/build-plugin/SKILL.md b/.claude/skills/build-plugin/SKILL.md index aa0a171..ee4b804 100644 --- a/.claude/skills/build-plugin/SKILL.md +++ b/.claude/skills/build-plugin/SKILL.md @@ -33,7 +33,7 @@ Create a TodoWrite task for each phase before starting: - [ ] **Phase 1** — Explore the API - [ ] **Phase 2** — Plan the plugin structure -- [ ] **Phase 3** — Scaffold files (`metadata.json`, `ui.json`, `icon.png`) +- [ ] **Phase 3** — Scaffold files (`metadata.json`, `ui.json`, `icon.png`, `docs/README.md`) - [ ] **Phase 4** — Write import definitions (`indexDefinitions/default.json`) - [ ] **Phase 5** — Write data streams - [ ] **Phase 6** — Write OOB default content (dashboards, scopes) @@ -93,6 +93,8 @@ my-plugin/ icon.svg # Square SVG — use official brand logo, ask user if unsure custom_types.json # Friendly names + FontAwesome icons per type configValidation.json # Preferred: validate config on setup + docs/ + README.md # REQUIRED: shown in-product when users add the plugin indexDefinitions/ default.json # Import steps dataStreams/ @@ -110,6 +112,20 @@ my-plugin/ dashboard2.dash.json ``` +### docs/README.md (required) + +This file is surfaced in-product when a user adds the plugin — it is the primary place to tell users how to configure it. Always create it as part of scaffolding, before moving to later phases. The `documentation` link in `metadata.json` must point to it (e.g. `https://github.com/squaredup/plugins/blob/main/plugins/MyPlugin/v1/docs/README.md`). + +The README should cover: + +1. **What the plugin monitors** — one short paragraph: what the service is, what objects are imported, and what the dashboards show. +2. **Prerequisites / getting credentials** — step-by-step instructions to obtain an API key, token, or OAuth credentials. Include any required scopes or permissions. Link to the service's own credential pages where helpful. +3. **Configuration fields** — a table or short list explaining every field in `ui.json`: what it is, where to find the value, and whether it's required. +4. **What gets imported** — list the object types and what they represent. +5. **Known limitations** — rate limits, permission requirements, or API behaviours the user should know about. + +Write this as if the user has never seen the API before. They're reading it inside SquaredUp, not on the vendor's site, so don't assume they'll follow external links for basic setup steps. + --- ## Phase 4: metadata.json From a847ab6895690cd017ff7b51b95982b5234ffa36 Mon Sep 17 00:00:00 2001 From: Andrew Harris Date: Wed, 13 May 2026 14:51:38 +0100 Subject: [PATCH 10/16] Ensure Claude uses id property for built in datastream Was using incorrect property name --- .claude/skills/build-plugin/SKILL.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.claude/skills/build-plugin/SKILL.md b/.claude/skills/build-plugin/SKILL.md index ee4b804..070ce62 100644 --- a/.claude/skills/build-plugin/SKILL.md +++ b/.claude/skills/build-plugin/SKILL.md @@ -1312,10 +1312,12 @@ SquaredUp includes a built-in `datastream-properties` data stream that automatic ```json "dataStream": { - "name": "datastream-properties" + "id": "datastream-properties" } ``` +> ⚠️ The built-in stream is referenced by `id`, not `name`. Using `"name": "datastream-properties"` will appear to validate but the tile won't resolve the stream at runtime. + ### Stream visibility ```json From 74243e4cdae97cdaa0b37be8465014199cc1b889 Mon Sep 17 00:00:00 2001 From: Andrew Harris Date: Wed, 13 May 2026 14:52:40 +0100 Subject: [PATCH 11/16] Ensure user is prompted for user handle --- .claude/skills/build-plugin/SKILL.md | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/.claude/skills/build-plugin/SKILL.md b/.claude/skills/build-plugin/SKILL.md index 070ce62..d180c75 100644 --- a/.claude/skills/build-plugin/SKILL.md +++ b/.claude/skills/build-plugin/SKILL.md @@ -16,6 +16,18 @@ This skill guides you through building a complete SquaredUp low-code plugin for --- +## Required user inputs (always ask) + +The following inputs **cannot be inferred from the environment** and must be collected via `AskUserQuestion` before the corresponding file is written. **Ask these even when the user has requested autonomous / "no clarifying questions" mode** — they are not clarifying questions, they are required data that ends up baked into the plugin (and into git history). + +| Input | When to ask | Why | +| --- | --- | --- | +| **Author handle** (GitHub handle or display name) | Before writing `metadata.json` (Phase 4) | Goes into `author.name` in `metadata.json` and shows in the UI. Guessing from git config or environment frequently picks the wrong identity (employer email vs personal handle, etc.). | + +If the user has already volunteered the answer earlier in the conversation, use that and skip the prompt. Otherwise, ask — even in autonomous mode. + +--- + ## When to Use - Building a new plugin for an HTTP/REST API @@ -130,7 +142,6 @@ Write this as if the user has never seen the API before. They're reading it insi ## Phase 4: metadata.json -**Before writing `metadata.json`, use `AskUserQuestion` to ask the user for their author name or GitHub handle.** Use `"community"` as the `author.type`. ```json { From 96bcfa99e5618c983d24de693579d2de92968868 Mon Sep 17 00:00:00 2001 From: Andrew Harris Date: Wed, 13 May 2026 14:54:27 +0100 Subject: [PATCH 12/16] remove built-in properties warning --- .claude/skills/build-plugin/SKILL.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/.claude/skills/build-plugin/SKILL.md b/.claude/skills/build-plugin/SKILL.md index d180c75..08f62d0 100644 --- a/.claude/skills/build-plugin/SKILL.md +++ b/.claude/skills/build-plugin/SKILL.md @@ -1327,8 +1327,6 @@ SquaredUp includes a built-in `datastream-properties` data stream that automatic } ``` -> ⚠️ The built-in stream is referenced by `id`, not `name`. Using `"name": "datastream-properties"` will appear to validate but the tile won't resolve the stream at runtime. - ### Stream visibility ```json From 7aa1968fcc3738c6eec5cce3eec8bb4358af8cea Mon Sep 17 00:00:00 2001 From: Andrew Harris Date: Wed, 13 May 2026 15:02:21 +0100 Subject: [PATCH 13/16] Ensure dashboard titles are unique Otherwise Claude can name each perspective the same i.e. Overview, which show next to each other in the UI --- .claude/skills/build-plugin/SKILL.md | 1 + 1 file changed, 1 insertion(+) diff --git a/.claude/skills/build-plugin/SKILL.md b/.claude/skills/build-plugin/SKILL.md index 08f62d0..28d9f2f 100644 --- a/.claude/skills/build-plugin/SKILL.md +++ b/.claude/skills/build-plugin/SKILL.md @@ -1075,6 +1075,7 @@ Single `.dash.json` files reference directly as `"type": "dashboard"`. Folders m **Dashboard rules:** - **Do not repeat the plugin name in dashboard names.** The name appears beneath the plugin name in the UI, so "Overview" reads as "MyPlugin / Overview" — adding the plugin name again produces "MyPlugin / MyPlugin Overview". +- **Give each dashboard a distinct, descriptive name.** Perspective tabs sit next to each other in the UI — identical names (e.g. every perspective called "Overview") are indistinguishable. - `"variables"` array supports **only one variable** per dashboard. Design each dashboard around a single object type. - Omit `"timeframe"` on tiles to inherit the dashboard timeframe — do not hardcode `"last24hours"` on tiles. - All tile IDs (`"i"`) must be **genuinely random UUIDs** — generate them with `uuidgen` (macOS/Linux) or `python3 -c "import uuid; print(uuid.uuid4())"`. Never invent fake patterned UUIDs like `a1111111-1111-1111-1111-111111111111`. From 78159e3c251e6b4b3b7d98e3fddc08c76cfda83a Mon Sep 17 00:00:00 2001 From: Andrew Harris Date: Wed, 13 May 2026 15:31:51 +0100 Subject: [PATCH 14/16] post process svg icons to provide contrast between application ui --- .claude/skills/build-plugin/SKILL.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/.claude/skills/build-plugin/SKILL.md b/.claude/skills/build-plugin/SKILL.md index 28d9f2f..76ba4a3 100644 --- a/.claude/skills/build-plugin/SKILL.md +++ b/.claude/skills/build-plugin/SKILL.md @@ -87,7 +87,13 @@ Decide before writing code. **Write this plan down and share it with the user be ## Phase 3: File Structure -**Icon:** Do not create or generate the icon yourself. Find the official brand/product logo online (SVG or PNG accepted by the validator), or ask the user to supply one. A square icon works best. Never auto-generate a generic icon. +**Icon:** Do not create or generate the icon yourself. Find the official brand/product logo online (SVG or PNG accepted by the validator), or ask the user to supply one. Never auto-generate a generic icon. + +**Post-process SVG icons only if needed.** SquaredUp displays icons on a dark background in dark mode and a white background in light mode. If the SVG lacks a background or is not square, fix it: + +1. **Make it square** — Set `width="512" height="512" viewBox="0 0 512 512"`. +2. **Add a background** — Insert `` as the first child. Pick a colour that contrasts with the logo paths. +3. **Add padding** — Wrap paths in `` targeting ~10% padding (inner area 409.6×409.6): `S = min(409.6/w, 409.6/h)`, `X = (512−w*S)/2`, `Y = (512−h*S)/2`. **configValidation.json:** Optional but strongly preferred. Wrap a simple API call (e.g. `/me`, `/user`, or any lightweight authenticated endpoint) to verify the config works on setup. For complex APIs with distinct permission scopes (e.g. AWS CloudWatch, Cost Explorer, EC2), include multiple validation steps — one per capability — so users know exactly what's working. From af88cf4d0d5abd30bc2bc2b2bdcd9afee4aa5bb6 Mon Sep 17 00:00:00 2001 From: Andrew Harris Date: Thu, 14 May 2026 08:34:16 +0100 Subject: [PATCH 15/16] Fix ui json in dataStreams using incorrect displayName property --- .claude/skills/build-plugin/SKILL.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.claude/skills/build-plugin/SKILL.md b/.claude/skills/build-plugin/SKILL.md index 76ba4a3..7319437 100644 --- a/.claude/skills/build-plugin/SKILL.md +++ b/.claude/skills/build-plugin/SKILL.md @@ -624,7 +624,7 @@ Expressions support **inline JavaScript**, so you can use any JS expression insi "name": "deviceMetric", "displayName": "Device Metric", "ui": [ - { "name": "metric", "displayName": "Metric Name", "type": "text" } + { "name": "metric", "label": "Metric Name", "type": "text" } ], "config": { "endpointPath": "devices/{{object.deviceId}}/metrics", From cf0f3f2d8cf0faafa4f82a87b5d193332a8d6c62 Mon Sep 17 00:00:00 2001 From: Dave Clarke Date: Thu, 14 May 2026 15:56:56 +0100 Subject: [PATCH 16/16] Apply suggestions from code review Co-authored-by: Dave Clarke <02DClarke@gmail.com> --- .claude/skills/build-plugin/SKILL.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.claude/skills/build-plugin/SKILL.md b/.claude/skills/build-plugin/SKILL.md index 7319437..9a03a1f 100644 --- a/.claude/skills/build-plugin/SKILL.md +++ b/.claude/skills/build-plugin/SKILL.md @@ -139,7 +139,7 @@ The README should cover: 1. **What the plugin monitors** — one short paragraph: what the service is, what objects are imported, and what the dashboards show. 2. **Prerequisites / getting credentials** — step-by-step instructions to obtain an API key, token, or OAuth credentials. Include any required scopes or permissions. Link to the service's own credential pages where helpful. 3. **Configuration fields** — a table or short list explaining every field in `ui.json`: what it is, where to find the value, and whether it's required. -4. **What gets imported** — list the object types and what they represent. +4. **What gets indexed** — list the object types and what they represent. 5. **Known limitations** — rate limits, permission requirements, or API behaviours the user should know about. Write this as if the user has never seen the API before. They're reading it inside SquaredUp, not on the vendor's site, so don't assume they'll follow external links for basic setup steps. @@ -384,7 +384,7 @@ Defines the config form shown when a user adds the plugin. One entry per config > ⚠️ When using a data stream as the autocomplete source, the backing stream must return rows with `label` (string) and `value` columns, and those columns must have `"role": "label"` and `"role": "value"` declared in the stream's metadata — otherwise the dropdown won't populate correctly. -**`key-value`** — list of key/value pairs (useful for custom headers, tags). Set `allowEncryption: true` to let users mark individual values as encrypted — use this when the field may contain sensitive data such as secret environment variables: +**`key-value`** — list of key/value pairs (useful for custom headers, tags). ```json { "type": "key-value", "name": "headers", "label": "Headers", "allowEncryption": true } ```