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
Copy file name to clipboardExpand all lines: .agents/skills/add-column-type/SKILL.md
+1-1Lines changed: 1 addition & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -8,7 +8,7 @@ argument-hint: <type-name>
8
8
9
9
A column type is **one file** in `apps/sim/lib/table/column-types/` plus a registry entry. Everything that varies per type — label, icon, storage cast, coercion, validation, conversion compatibility, formatting, editor, filter operators — lives on that one object, so no consumer needs editing.
10
10
11
-
A `case 'yourtype':` outside `column-types/` fails **silently** when missed (a wrong `jsonbCast` breaks every filter on the column). The registry exists to make that impossible, so the rule is absolute: **if you find yourself adding a `case 'yourtype':` anywhere outside `column-types/`, the registry is missing a field. Add the field instead.**
11
+
A `case 'yourtype':` outside `column-types/` fails **silently** when missed (a wrong `jsonbCast` breaks every filter on the column). The registry exists to make that impossible, so the rule is absolute with one documented exception (`import.ts`'s `coerceValue`, see "Traps" below): **if you find yourself adding a `case 'yourtype':` anywhere else outside `column-types/`, the registry is missing a field. Add the field instead.**
Copy file name to clipboardExpand all lines: .agents/skills/add-integration/SKILL.md
+1-1Lines changed: 1 addition & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -437,7 +437,7 @@ When your integration handles file uploads or downloads, follow these patterns t
437
437
438
438
### What is a UserFile?
439
439
440
-
`UserFile` (`apps/sim/executor/types.ts`) is the standard file representation in Sim — id, name, presigned `url`, size, MIME `type`, storage `key`, and optional inline `base64` / provider file handles. Read the interface rather than relying on a copy here.
440
+
`UserFile` (`apps/sim/executor/types.ts`) is the standard file representation in Sim — id, name, an access `url` (not guaranteed presigned — `remoteUrl` is the short-lived signed one, set only for providers that fetch by URL), size, MIME `type`, storage `key`, and optional inline `base64` / provider file handles. Read file bytes through the documented upload helpers, never by fetching `url` directly. Read the interface rather than relying on a copy here.
Copy file name to clipboardExpand all lines: .agents/skills/add-model/SKILL.md
+7-7Lines changed: 7 additions & 7 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -49,11 +49,11 @@ Use a precise WebFetch prompt: *"Extract for {model_id}: exact model id string,
49
49
|---|---|---|
50
50
|`temperature`| All providers (passed through if set) | Safe but inert on always-reasoning models that reject it |
51
51
|`toolUsageControl`| All providers (provider-level, not per-model) | n/a — set on `ProviderDefinition`, not models |
52
-
|`reasoningEffort`|`openai/core.ts`, `azure-openai`, `xai/index.ts`, `deepseek/index.ts`, `groq/index.ts`| Not read by anthropic/gemini (they use `thinking`) or by mistral, cerebras, openrouter, fireworks, vertex — re-grep before assuming |
52
+
|`reasoningEffort`|`openai/core.ts`, `azure-openai`, `xai`, `deepseek`, `groq`, `zai`, `meta`, `litellm` (each `index.ts`)| Not read by anthropic/gemini (they use `thinking`) or by mistral, cerebras, openrouter, fireworks, vertex — re-grep before assuming |
53
53
|`verbosity`|`openai/core.ts`, `azure-openai/index.ts` only | Dead elsewhere |
54
-
|`thinking`|`anthropic/core.ts`, `gemini/core.ts`; `deepseek/index.ts` and `groq/index.ts` read the resolved `thinkingLevel`| Dead elsewhere |
54
+
|`thinking`|`anthropic/core.ts`, `gemini/core.ts`; `deepseek`, `groq`, `zai`, `kimi` (each `index.ts`) read the resolved `thinkingLevel`| Dead elsewhere |
55
55
|`thinking.streamed`| Docs generator + `getThinkingStreamVisibility` (`models.ts`); `anthropic/core.ts` uses `'summary'` to request `display: 'summarized'` on agent-events runs |**Mandatory on Anthropic-family thinking models** (`agent-stream-docs:check` fails without it); other families fall back to provider defaults |
56
-
|`nativeStructuredOutputs`|`anthropic/core.ts`, `bedrock/index.ts`, `fireworks/index.ts`, `openrouter/index.ts`, `baseten/index.ts`, `together/index.ts` (via `supportsNativeStructuredOutputs`) | Dead on openai, xai, google, vertex, azure-openai, deepseek, mistral, groq, cerebras|
56
+
|`nativeStructuredOutputs`|`anthropic/core.ts`, `bedrock/index.ts` (via `models.ts``supportsNativeStructuredOutputs`, which reads the flag) | Dead elsewhere — fireworks/baseten/together/openrouter call their own provider-level `supportsNativeStructuredOutputs` that ignores the model flag (always on, always off, or OpenRouter API metadata)|
57
57
|`maxOutputTokens`| Read by UI + executor for token estimation | Always meaningful — set if provider documents a cap |
58
58
|`computerUse`|`providers/utils.ts` (`getComputerUseModels` → `computerUseModels` routing) | Set only on actual computer-use SKUs |
59
59
|`deepResearch`| UI flag for routing to deep-research SKUs | Set only on actual deep-research model IDs |
@@ -114,9 +114,9 @@ Adding the `models.ts` entry is most of the job because nearly every consumer is
114
114
115
115
### Hosted = auto-billed, by provider
116
116
117
-
`getHostedModels()` in `apps/sim/providers/models.ts`decides which providers are served with Sim's rotating hosted key and billed to the workspace via `shouldBillModelUsage()` (`providers/utils.ts`). Read the function before inserting — the list changes (it currently includes several non-big-three providers and a static Fireworks catalog). Before you insert:
117
+
`getHostedModels()` in `apps/sim/providers/models.ts`returns the model IDs served with Sim's rotating hosted key and billed to the workspace via `shouldBillModelUsage()` (`providers/utils.ts`). It builds that list by expanding whole providers (`getProviderModels('openai')`, `'anthropic'`, `'google'`, and others) plus the static Fireworks catalog, so any model added under one of those providers is hosted automatically. Read the function before inserting — the provider set changes. Before you insert:
118
118
119
-
-**If the model should be BYOK-only / never-billed**, do not add it under a provider listed in `getHostedModels()` — that silently enrolls it in hosted billing. Confirm hosting/billing intent with the user. (Ollama Cloud is a deliberately separate `isReseller` provider specifically to stay BYOK-only/never-billed.)
119
+
-**If the model should be BYOK-only / never-billed**, do not add it under a provider that `getHostedModels()`expands — that silently enrolls it in hosted billing. After inserting, verify with `getHostedModels().includes('<new-model-id>')` (a one-line `bun -e` or the assertion in `providers/utils.test.ts`). Confirm hosting/billing intent with the user. (Ollama Cloud is a deliberately separate `isReseller` provider specifically to stay BYOK-only/never-billed.)
120
120
-**If the model should be hosted**, the deployment must actually have a key for it — the provider's `{PREFIX}_COUNT` / `{PREFIX}_1..N` env vars must be set, or hosted runs fail at execution time.
121
121
- State the hosted/billing status explicitly in the verification report.
122
122
@@ -158,7 +158,7 @@ bun run lint
158
158
bun run agent-stream-docs:generate # only when the entry has thinking/reasoningEffort
159
159
```
160
160
161
-
Lint must pass before you report done.
161
+
Lint must pass before you report done — fix the entry you wrote, never delete it to make lint pass.
162
162
163
163
## Step 6: Verification report (mandatory format)
164
164
@@ -177,7 +177,7 @@ End with this exact structure:
Copy file name to clipboardExpand all lines: .agents/skills/add-permission-group-item/SKILL.md
+1-1Lines changed: 1 addition & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -215,7 +215,7 @@ cd apps/sim && bunx vitest run lib/permission-groups
215
215
216
216
Also `bun run check:api-validation` if you touched a contract or the group routes. `bun run check:audits` runs all of these; it derives its list from the `check:*` scripts in `package.json`, so a new audit is opted *out* deliberately rather than opted in.
217
217
218
-
Read the success lines, not the exit codes — the operationand capability counts should each have grown by one:
218
+
Read the success lines, not the exit codes — compare the counts against the previous run and check they grew by exactly what you added: an operation-declared capability adds one operation and one capability; a raw-route or parameterized capability adds one capability and no operation; an executor-gated or UI-only item adds neither:
219
219
220
220
```
221
221
✓ permission-group enforcement: <N> operations declare a capability, <M> capabilities all enforced
Copy file name to clipboardExpand all lines: .agents/skills/cleanup/SKILL.md
+1-1Lines changed: 1 addition & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -14,7 +14,7 @@ User arguments: $ARGUMENTS
14
14
15
15
## Step 1 — Parallel analysis (read-only)
16
16
17
-
Parse `$ARGUMENTS` into `scope` and `fix` (defaults: current changes, `true`). `fix` is consumed by Step 3 only — the passes below always run `fix=false`.
17
+
Parse `$ARGUMENTS` into `scope` and `fix`: extract the `fix=true|false` token wherever it appears in the string and strip it from `scope`; defaults are the current changes and `fix=true`. `fix` is consumed by Step 3 only — the passes below always run `fix=false`.
18
18
19
19
Spawn all eight passes concurrently as subagents in a **single message** (multiple Agent tool calls). Each runs its skill on the parsed `scope` with `fix=false` — analysis and proposals ONLY, no edits. Instruct each agent to return its findings as a structured list: for every proposed change, the file path, line range, a one-line description of the change, and the exact before/after so the orchestrator can apply it without re-deriving.
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.
5
5
---
6
6
7
-
> **In this repo:** Tailwind 3.4 (`apps/sim/tailwind.config.ts`), `framer-motion`, icons from `@sim/emcn/icons`, colors through the CSS-variable tokens in `.claude/rules/sim-styling.md` (no hardcoded `text-gray-*`/hex, no paired `dark:` utilities). Where Section 3 or 8 names a different stack, this note wins.
7
+
> **In this repo:** Tailwind 3.4 (`apps/sim/tailwind.config.ts`); animation via `import { motion } from 'framer-motion'` (not `motion/react` — rewrite every `motion/react` import in the samples below); icons from `@sim/emcn/icons`; colors through the CSS-variable tokens in `.claude/rules/sim-styling.md` (no hardcoded `text-gray-*`/hex/`zinc` utilities, no paired `dark:` utilities). This note overrides any conflicting guidance or code sample anywhere in this file.
8
8
9
9
# tasteskill: Anti-Slop Frontend Skill
10
10
@@ -132,7 +132,7 @@ Unless the design read picks a real design system (Section 2.A), these are the d
132
132
***INTERACTIVITY ISOLATION:** Any component using Motion, scroll listeners, or pointer physics MUST be an isolated leaf with `'use client'` at the top. Server Components render static layouts only.
133
133
***Styling:****Tailwind v4** (default). Tailwind v3 only if the existing project demands it.
134
134
* For v4: do NOT use `tailwindcss` plugin in `postcss.config.js`. Use `@tailwindcss/postcss` or the Vite plugin.
135
-
***Animation:****Motion** (the library formerly known as Framer Motion). Import from `motion/react` (`import { motion } from "motion/react"`). The `framer-motion`package still works as a legacy alias - prefer `motion/react` in new code.
135
+
***Animation:****Motion** (the library formerly known as Framer Motion). Outside this repo import from `motion/react`; in this repo import from `framer-motion`(see the note at the top).
136
136
***Fonts:** Always use `next/font` (Next.js) or self-host with `@font-face` + `font-display: swap`. Never link Google Fonts via `<link>` in production.
Copy file name to clipboardExpand all lines: .agents/skills/make-interfaces-feel-better/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
@@ -65,7 +65,7 @@ Add a subtle 1px low-opacity outline to images (`outline-black/10` light, `outli
65
65
66
66
### 12. Scale on Press
67
67
68
-
A subtle scale-down (about 0.96-0.97) on press gives tactile feedback. In this repo it lives in the emcn `Button`/`Chip` chrome, not consumer classes; add a `static` prop to opt out where motion distracts.
68
+
A subtle scale-down (about 0.96-0.97) on press gives tactile feedback. In this repo a press affordance belongs in the emcn `Button`/`Chip` chrome (`packages/emcn`), not in consumer classes — neither component implements one today, so propose it there rather than adding per-call-site transforms.
69
69
70
70
### 13. Skip Animation on Page Load
71
71
@@ -89,7 +89,7 @@ Interactive elements need at least 40×40px hit area. Extend with a pseudo-eleme
89
89
| --- | --- |
90
90
| Same border radius on parent and child | Calculate `outerRadius = innerRadius + padding`|
91
91
| Icons look off-center | Adjust optically with padding or fix SVG directly |
92
-
| Hard borders between sections |Use layered `box-shadow` with transparency |
92
+
| Hard borders between sections |In this repo, the `--border` hairline token; elsewhere, layered `box-shadow` with transparency |
Copy file name to clipboardExpand all lines: .agents/skills/react-query-best-practices/SKILL.md
+1-1Lines changed: 1 addition & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -27,7 +27,7 @@ Read these before analyzing:
27
27
28
28
### Query keys and hooks
29
29
Enforce CLAUDE.md "React Query" and `.claude/rules/sim-queries.md` (key factory with `all` + plural prefixes, `signal` forwarding, named `staleTime` constants reused by prefetches, `keepPreviousData` only on variable keys, `requestJson` boundary). Additionally:
30
-
- Key factories live next to their hooks — except a factory (or standalone fetcher/mapper) that a server module imports, which must live in `hooks/queries/utils/<entity>-keys.ts` / `fetch-*.ts` per `.claude/rules/sim-queries.md` (a `'use client'` export called from the server crashes SSR)
30
+
- Key factories live next to their hooks — except a factory, standalone fetcher/mapper, or `staleTime` constant that a server module (a `prefetch.ts`, route, block, trigger) imports, which must live in a non-`'use client'` module under `hooks/queries/utils/` per `.claude/rules/sim-queries.md` (a `'use client'` export called from the server crashes SSR)
31
31
- Use `enabled` to prevent queries from running without required params
32
32
- Warm data for hover/focus intent with `queryClient.prefetchQuery` and shared `queryOptions`; never temporarily enable a mounted hidden observer, which can remain active after focus restoration and refetch data for closed UI
33
33
- When gating a query by view or modal state, move every consumer to the active query too: imperative refresh/pagination, loading and error feedback, and data-derived controls must never read a disabled query or placeholder data from a previous key
Copy file name to clipboardExpand all lines: .agents/skills/v2-api-conventions/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
@@ -102,9 +102,9 @@ Three cursor schemes exist. Two are the shared codecs in `response.ts`, both opa
102
102
-**Keyset** (`readSortedCursor` in, `encodeSortedCursor` out) — the default. Requires the page to come from one ordered SQL read. The sort AND the filters are stamped into the cursor and re-checked on replay, so changing `sortBy` or any filter mid-pagination is a 400, not a silently skipped page.
103
103
-**Offset** (`decodeOffsetCursor` / `encodeOffsetCursor`) — only when a keyset is impossible. Two lists qualify: `GET /skills` merges a static in-code registry with DB rows and re-sorts in JS, and `GET /knowledge/{id}/documents` sits on a limit/offset query. A bare offset replayed against a re-sorted or re-filtered sequence names a different row, which skips or repeats results.
104
104
105
-
Both take the same two stamps: `cursorSortKey(sortBy, sortOrder)` for the ordering, and `cursorScopeKey({ ... })` for every param that filters the sequence. **`limit` is never a stamp** — it selects how much of the sequence to return, not what the sequence is, and binding it strands every cursor the moment a caller changes page size. Params that only shape the response body are out for the same reason.
105
+
Both take the same two stamps: `cursorSortKey(sortBy, sortOrder)` for the ordering, and `cursorScopeKey(cursorRoute(contract, pathParams), { ... })` for every param that filters the sequence — the route identity is the first argument, the filter parts the second. **`limit` is never a stamp** — it selects how much of the sequence to return, not what the sequence is, and binding it strands every cursor the moment a caller changes page size. Params that only shape the response body are out for the same reason.
106
106
107
-
The third is **per-domain**: a list whose read predates the shared codecs, or whose page boundary is not expressible as one, mints its own — a bare `encodeCursor({ version })` on `GET /workflows/{id}/versions` and `encodeCursor({ email })` on the workspace member list, the local codecs in `lib/audit-logs/query.ts`, `lib/logs/list-logs.ts`, and `lib/table/rows/cursor.ts`, and a usage-event id passed straight through by `GET /billing/logs`. Those tokens stay opaque and untouched, but a domain-minted cursor on a list a caller can re-filter is wrapped at the surface with `encodeScopedCursor(cursorScopeKey({...}), token)` and unwrapped with `readScopedCursor`, so it carries the same binding as the shared schemes. **A new list picks one of the two shared schemes.** Do not add a fourth.
107
+
The third is **per-domain**: a list whose read predates the shared codecs, or whose page boundary is not expressible as one, mints its own — a bare `encodeCursor({ version })` on `GET /workflows/{id}/versions` and `encodeCursor({ email })` on the workspace member list, the local codecs in `lib/audit-logs/query.ts`, `lib/logs/list-logs.ts`, and `lib/table/rows/cursor.ts`, and a usage-event id passed straight through by `GET /billing/logs`. Those tokens stay opaque and untouched, but a domain-minted cursor on a list a caller can re-filter is wrapped at the surface with `encodeScopedCursor(cursorScopeKey(cursorRoute(contract, pathParams), {...}), token)` and unwrapped with `readScopedCursor`, so it carries the same binding as the shared schemes. **A new list picks one of the two shared schemes.** Do not add a fourth.
108
108
109
109
Every paged list's binding is declared in `lib/api/contracts/v2/__tests__/list-pagination.test.ts` and checked against what the contract actually accepts, in both directions. A new list, or a new filter on an existing one, fails that test until its binding is declared or the param is explicitly recorded as unable to change the sequence.
0 commit comments