You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Two rules that are easy to get wrong when copying from existing blocks:
126
+
Three rules that are easy to get wrong when copying from existing blocks:
127
127
128
128
- Every remote `selectorKey` must use the unified server selector path. Apply the `add-selector` skill:
129
129
add browser-safe metadata to `apps/sim/lib/selectors/manifest.ts`, reuse or extract a server-only
@@ -135,6 +135,12 @@ Two rules that are easy to get wrong when copying from existing blocks:
135
135
(e.g. `channelSelector` + `channelId` → `canonicalParamId: 'channel'`). It is the only key that
136
136
survives serialization, so `inputs` and `tools.config.params` reference the canonical id, never the
137
137
subblock ids. It is unique block-wide, and every member of a group shares the same `required` value.
138
+
- Every text-entry subBlock (`short-input`, `long-input`, `code`) and every selector declares a
139
+
`placeholder`; an empty box tells the user nothing. Secrets read `Enter your {thing}` (e.g.
140
+
`Enter your API key`), free text names what to type (`Enter branch name`), and formatted values
141
+
show the shape (`2023-01-01T00:00:00Z`, `1 to 1000`). An optional field with a server-side default
142
+
names that default (`Defaults to the database region`). Dropdowns, switches, and `oauth-input` do
143
+
not need one.
138
144
139
145
## Step 4: Add Icon
140
146
@@ -309,6 +315,28 @@ bun run docs:check
309
315
310
316
This creates `apps/docs/content/docs/integrations/{service}.mdx` — one page per service carrying the block's Actions and, if it has one, its Triggers section. Never hand-edit generated pages; the only editable region is the `{/* MANUAL-CONTENT */}` block (see `scripts/README.md`).
311
317
318
+
Every generated integration page carries a hand-written intro directly under `<BlockInfoCard />`. The
319
+
generator preserves it across regenerations, so write it once after the first generate:
320
+
321
+
```mdx
322
+
{/* MANUAL-CONTENT-START:intro */}
323
+
[{Service}](https://service.com/) is {onesentenceonwhattheserviceis}.
Copy file name to clipboardExpand all lines: .agents/skills/validate-integration/SKILL.md
+9Lines changed: 9 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -218,6 +218,9 @@ For **each tool** in `tools.access`:
218
218
- True/false → `switch` (a Yes/No `dropdown` only when the tool needs a third "unset" state)
219
219
- Credentials → `oauth-input` with correct `serviceId`
220
220
-[ ] Dropdown `value: () => 'default'` is set for dropdowns with a sensible default
221
+
-[ ] Every `short-input`, `long-input`, `code`, and selector subBlock has a `placeholder` — including
222
+
password fields (`Enter your API key`). Formatted values show the shape
223
+
(`2023-01-01T00:00:00Z`); optional fields with a server default name it. See add-integration → Step 3
221
224
222
225
### Advanced Mode
223
226
-[ ] Optional, rarely-used fields are set to `mode: 'advanced'`:
@@ -450,6 +453,10 @@ upstream PR that skipped regeneration), and investigate anything that looks like
450
453
page losing a section usually means its source block moved or a generator input broke, not that the
451
454
hunk should be reverted.
452
455
456
+
The integration's page must carry a `{/* MANUAL-CONTENT-START:intro */}` section directly under
457
+
`<BlockInfoCard />`. If it is missing, write one using the template in add-integration → Step 8, and
458
+
check an existing intro against what the block actually ships (no removed or unshipped operations).
459
+
453
460
If an icon changed, `apps/sim/components/icons.tsx` is the source of truth and `apps/docs/components/icons.tsx` is its generated mirror — they must end up byte-identical for that component.
454
461
455
462
### Validation Output
@@ -473,6 +480,7 @@ After fixing, confirm:
473
480
-[ ] Validated every tool's ID, params, request, response, outputs, and types against API docs
474
481
-[ ] Validated block ↔ tool alignment (every tool param has a subBlock, every condition is correct)
475
482
-[ ] Validated advanced mode on optional/rarely-used fields
483
+
-[ ] Validated every text-entry and selector subBlock has a `placeholder`
476
484
-[ ] Validated wandConfig on timestamps and complex inputs
477
485
-[ ] Validated tools.config mapping, tool selector, and type coercions
478
486
-[ ] Validated block outputs match what tools return, with typed JSON where possible
@@ -496,6 +504,7 @@ After fixing, confirm:
496
504
-[ ] Fixed all critical and warning issues
497
505
-[ ] Ran `bun run tool-metadata:generate` if any tool outputs/params changed, and confirmed `bun run tool-metadata:check` passes
498
506
-[ ] Ran `bun run scripts/generate-docs.ts` if any block metadata changed, and committed the full generated diff — including stale-page catch-up for other integrations (`bun run docs:check` fails CI on reverted generator output)
507
+
-[ ] Validated the docs page has an accurate `MANUAL-CONTENT-START:intro` section
0 commit comments