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
Staging is authoritative for the app: all 538 conflicts (344 add/add, 193
content, 1 modify/delete) resolved to staging's side. The CLI is adapted to
staging's v2 shapes rather than the reverse.
CLI refactor for the new v2 surface:
- describeFile -> getFile (/files/[fileId]/metadata, json)
- getFileContent -> downloadFile (/files/[fileId], binary)
- shareFile/unshareFile -> getFileShare + upsertFileShare, exposed as
`files share get` / `files share set`; v2 folds unshare into the same
PATCH via --is-active false, so there is no separate operation
Generator fixes (scripts/generate-v2-cli-api.ts):
- resolve $ref against $defs when classifying a request field. Staging's
`.meta({ id })` schemas are lifted into $defs, so every folder-path field
read as `unknown` and the CLI demanded JSON for a plain string flag
- treat an annotation-only schema as `unknown` instead of throwing
Merge artifacts repaired (auto-merged clean, semantically wrong):
- primitives.ts: duplicate workspaceFileNameSchema
- blob/client.ts: duplicate getBlobPresignedUploadUrl. The two copies
differed -- ours signed with SAS permission 'w' (authorizes overwriting an
existing blob), staging with 'c' (create-only). Kept staging's
- lifecycle.ts, workflow-utils.ts, persisted-message.test.ts,
edit-workflow/index.ts: our call sites left against staging's signatures
- dropped credential-extractor.secretless.test.ts and the
preserveWorkspaceReferences option it covers; staging's sanitizer has no
such option, so the secretless copilot projection now follows staging and
no longer preserves workspace resource ids
turn-persistence.ts removed: staging carries that logic inline in post.ts, so
nothing imported it after the merge.
Verified: apps/sim and packages/sim-cli type-check; 212 CLI tests pass;
check:api-validation passes at staging's 1107-route baseline (the stripped
chat routes never existed on staging); lint:check green.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JNFjchn6dcM7xevh34PKHE
// Card summary sentences — see "Canvas Sentences" below
56
+
canvasPresentation: {
57
+
defaultTitle: '{Default Operation}',
58
+
sentences: { byOperation: { /* one per operation dropdown option id */ } },
59
+
},
60
+
55
61
subBlocks: [
56
62
// Define all UI fields here
57
63
],
@@ -945,6 +951,35 @@ Derive templates from the service's real use cases. Each prompt should name a co
945
951
-**Ground every skill in operations the block actually exposes** — cross-check each skill's steps against `tools.access`. Never describe an action the integration cannot perform.
946
952
-**Derive skills from real, popular use cases found online — never invent them.** Web-search the service's documented use cases (vendor use-case/solutions pages, official docs describing the workflow, reputable "top automations for X" articles) and only add a skill you can source as something people genuinely do with the service. Do not hallucinate skills.
947
953
954
+
## Canvas Sentences
955
+
956
+
Every block declares a one-line prose summary that replaces its card's field rows:
957
+
958
+
```
959
+
Slack ← header (already names the block)
960
+
Posts ⟨Ship it 🚀⟩ to ⟨#eng⟩ ← the sentence; ⟨…⟩ are live value chips
961
+
```
962
+
963
+
Write one `byOperation` entry per operation dropdown option (or a single `default`
964
+
when the block has no operation dropdown).
965
+
966
+
**The full authoring contract — voice, structure, and the two mistakes that break
967
+
cards silently — is `apps/sim/blocks/AGENTS.md` → "Canvas sentences". Read it
968
+
before writing any.** The two failures worth repeating here, because both are
969
+
invisible at runtime:
970
+
971
+
1. A clause naming only one member of a `canonicalParamId` pair drops the sentence
972
+
for every advanced-mode user. List all members:
973
+
`field: ['channelSelector', 'manualChannel']`.
974
+
2. A clause referencing a subblock whose `condition` excludes that operation can
975
+
never render.
976
+
977
+
Validate before finishing:
978
+
979
+
```bash
980
+
bun run apps/sim/scripts/check-canvas-sentences.ts --block={service}
981
+
```
982
+
948
983
## Generated artifacts
949
984
950
985
Adding a block on its own needs no **tool metadata** regeneration — a block references existing
@@ -963,7 +998,6 @@ bun run integration-catalog:check
963
998
The catalog check independently derives deployment metadata from the executable block registry and
964
999
compares it with the committed `apps/sim/lib/integrations/integrations.json`. Review the generated
965
1000
diff and keep only intentional changes.
966
-
967
1001
## Checklist Before Finishing
968
1002
969
1003
-[ ]`integrationType` is set to the correct `IntegrationType` enum value
@@ -991,6 +1025,7 @@ diff and keep only intentional changes.
991
1025
-[ ] Exported `{Service}BlockMeta` with at least 7 templates
992
1026
-[ ]`url` set on `{Service}BlockMeta` to the external service's verified homepage (omit only for first-party blocks with no external service)
993
1027
-[ ]`skills` added to `{Service}BlockMeta`, each grounded in `tools.access` and sourced from a real online use case (not invented)
1028
+
-[ ]`canvasPresentation.sentences` covers every operation, and `bun run apps/sim/scripts/check-canvas-sentences.ts --block={service}` passes with 100% coverage
Copy file name to clipboardExpand all lines: .agents/skills/add-column-type/SKILL.md
+2-2Lines changed: 2 additions & 2 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -15,7 +15,7 @@ This was not always true: adding `currency` originally took ~40 edits across 32
15
15
Do **not** hunt for places to edit. Add your type to the `ColumnType` union first and let `tsc` produce the list:
16
16
17
17
```bash
18
-
cd apps/sim &&bunx tsc --noEmit -p tsconfig.json
18
+
cd apps/sim &&bun run type-check
19
19
```
20
20
21
21
You will get two errors, naming `column-types/registry.ts` and `column-types/registry.server.ts`. Register in both.
@@ -153,7 +153,7 @@ Registering the *type* is compiler-enforced. Registering its *metadata* is not,
153
153
154
154
## Final Validation (Required)
155
155
156
-
1.**`cd apps/sim && bunx tsc --noEmit -p tsconfig.json`** — must be clean. If any file *outside*`column-types/` errors, that file has a hardcoded type list; fix it to read the registry.
156
+
1.**`cd apps/sim && bun run type-check`** — must be clean. If any file *outside*`column-types/` errors, that file has a hardcoded type list; fix it to read the registry.
157
157
2.**Grep for leaks** — `grep -rnE "(===|!==) '{id}'|case '{id}':" apps/sim --include='*.ts' --include='*.tsx' | grep -v column-types/`. (All three forms: a plain `!==` and a `case` are how half of `currency`'s real branches are written.) Hits are expected; judge each. A hit is fine when it mounts a specific React component or encodes a genuinely one-off behavior (`json`'s mono textarea, `date`'s timezone-aware parsing). A hit is a **leak** when it restates something the registry could answer — an icon, a label, a colour, an operator set, a cast, a coercion. Leaks get a registry field, not a new branch.
158
158
3.**Run the suite** — `bunx vitest run lib/table 'app/workspace/[workspaceId]/tables' lib/api app/api/table app/api/v1 lib/copilot/tools/server/table`. Existing tests must pass **unchanged**; needing to edit one means you changed behavior for the other types.
159
159
4.**`bun run lint:check`, `bun run check:api-validation`, `bun run check:client-boundary`** from the repo root.
1.`bunx tsc --noEmit` (from `apps/sim`, `NODE_OPTIONS=--max-old-space-size=8192`) and `bunx biome check` on the changed files.
131
+
1.`bun run type-check` (from `apps/sim`) and `bunx biome check` on the changed files.
132
132
2. In a table → **+ New column → Enrichments** → pick the new enrichment, map its inputs to columns, name the output column(s), Save. Confirm it appears in the catalog with its icon/description.
133
133
3. With hosted keys (or a workspace BYOK key) configured for each provider's service, run a row and confirm the cell fills; the dev-server log shows `Enrichment hit { provider }`. A row whose providers all miss completes blank; a row where every provider errored shows an error cell.
failing closed, headerless legacy requests, and absence of private metadata in the public tool result.
183
+
For durable sinks, also cover legacy `NULL` markers, exact-empty new writes, tracked secret writes,
184
+
stale/missing sidecars, and scope isolation.
182
185
183
186
## Step 3: Create Block
184
187
@@ -594,8 +597,8 @@ If creating V2 versions (API-aligned outputs):
594
597
-[ ] Registered all tools in `tools/registry.ts`
595
598
-[ ] Ran `bun run tool-metadata:generate` and committed the regenerated artifacts
596
599
-[ ] Classified every model-visible, opaque, Sim-durable, and internal-execution request field
597
-
-[ ] Added shared model-input projection, centralized opaque rejection, or private provenance only
598
-
where required
600
+
-[ ] Added shared model-input projectionor private provenance only where required; ordinary
601
+
external resource locators and control inputs retain their request semantics
599
602
-[ ] Confirmed ordinary third-party tool results are not generically sanitized
600
603
-[ ] Added provenance compatibility and fail-closed boundary tests where applicable
601
604
@@ -765,9 +768,11 @@ tools: {
765
768
}
766
769
```
767
770
768
-
#### 3. Create Internal API Route
771
+
#### 3. Create Special Internal Tool Execution Route
769
772
770
-
Create `apps/sim/app/api/tools/{service}/{action}/route.ts`. Internal tool routes are HTTP boundaries and follow the same contract policy as public routes — define the request/response shape in `apps/sim/lib/api/contracts/tools/{service}.ts` (or an existing aggregate) and validate with canonical helpers from `@/lib/api/server`. Never write a route-local Zod schema.
773
+
Create `apps/sim/app/api/tools/{service}/{action}/route.ts`. This raw route pattern is only for an integration's provider-execution boundary when it needs special file normalization, large-body handling, or protocol behavior. It is not the pattern for CRUD or other operations on protected Sim resources. For those, use the `migrate-application-operation` skill and an authorized application use case with the ordinary internal/v2 route builders.
774
+
775
+
Internal tool routes are HTTP boundaries and follow the same contract policy as public routes — define the request/response shape in `apps/sim/lib/api/contracts/tools/{service}.ts` (or an existing aggregate) and validate with canonical helpers from `@/lib/api/server`. Never write a route-local Zod schema. Authenticate and perform cheap admission before parsing or downloading files.
description: Anti-slop frontend skill for landing pages, portfolios, and redesigns. The agent reads the brief, infers the right design direction, and ships interfaces that do not look templated. Real design systems when applicable, audit-first on redesigns, strict pre-flight check.
description: This skill encodes Emil Kowalski's philosophy on UI polish, component design, animation decisions, and the invisible details that make software feel great.
0 commit comments