Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
154 commits
Select commit Hold shift + click to select a range
f0a3432
test(files): prove files/ VFS path downloads over real HTTP instead o…
waleedlatif1 Nov 4, 2026
ef70aa7
fix(resume): carry the admitted resume run's ID on outer resume failu…
waleedlatif1 Nov 4, 2026
06ddf2f
fix(workflows): charge an operation whose new edge the final scope ch…
waleedlatif1 Nov 4, 2026
35ab8fe
fix(cli): match a dash-led id in linear time (#9668)
waleedlatif1 Nov 4, 2026
158f5fa
fix(file-search): claim a file write that lands on an owner the backf…
waleedlatif1 Nov 4, 2026
2d094ec
improvement(sim-links): drop the leftover fragment around the source …
waleedlatif1 Nov 4, 2026
30dc79e
fix(people): harden paused SCIM sync and directory inputs (#9670)
waleedlatif1 Nov 4, 2026
8ec7514
fix(media): preserve video settings and Google URI delivery (#9669)
waleedlatif1 Nov 4, 2026
5e57170
fix(extension): preserve capture focus and Sim Link routes (#9665)
waleedlatif1 Nov 4, 2026
f279d9e
fix(file-search): fill dispatch capacity in selection order and keep …
waleedlatif1 Nov 4, 2026
32cb270
fix(trigger): keep secret text out of env sync errors and refuse an u…
waleedlatif1 Nov 4, 2026
b8b7201
fix(billing): bound the enterprise preflight's workflow run count to …
waleedlatif1 Nov 4, 2026
f46cc34
docs(library): update best-gumloop-alternatives-in-2026 (#9674)
waleedlatif1 Nov 4, 2026
b59fbdf
docs(library): update best-marketing-automation-platforms-ai-workflow…
waleedlatif1 Nov 4, 2026
af5eb35
docs(library): update best-ai-agent-builders-with-mcp-support (#9676)
waleedlatif1 Nov 4, 2026
686737f
feat(library): How Do You Build an Airtable AI Agent for Data Entry a…
waleedlatif1 Nov 4, 2026
2541e8b
feat(library): How Do You Build a Notion AI Agent for Pages and Datab…
waleedlatif1 Nov 4, 2026
3d5b37f
feat(library): How Do You Build a QuickBooks AI Agent for Month End C…
waleedlatif1 Nov 4, 2026
f9939fc
improvement(ci): avoid redundant browser dependency updates (#9680)
waleedlatif1 Nov 4, 2026
80795b1
improvement(ci): parallelize desktop release verification and packagi…
waleedlatif1 Nov 4, 2026
f0cfdfa
fix(ci): distinguish handled search redirects from runtime errors (#9…
waleedlatif1 Nov 4, 2026
e5b4e3f
fix(logs): keep checked trace content when the display projection bud…
waleedlatif1 Nov 4, 2026
c4ccdde
fix(files): let Mothership tool runs write workspace files (#9685)
waleedlatif1 Nov 4, 2026
ffa0225
improvement(links): open go/ links alongside sim/ and call the page L…
waleedlatif1 Nov 4, 2026
e89400f
improvement(extension): simplify page access and enable voice input (…
waleedlatif1 Nov 5, 2026
8f55771
improvement(comparisons): answer Copilot Studio buyer questions in pl…
waleedlatif1 Nov 5, 2026
17b5a70
improvement(extension): allow more pages within a shared content budg…
waleedlatif1 Nov 5, 2026
550fe32
fix(logs): name display fields and real span counts in trace projecti…
waleedlatif1 Nov 5, 2026
85e2fd8
fix(logs): keep retryable resume refusals internal and log deploy-pat…
waleedlatif1 Nov 5, 2026
ad5ed28
improvement(comparisons): render every comparison question section th…
waleedlatif1 Nov 5, 2026
de3ad2f
fix(ci): pause search clock without wall-time races (#9695)
waleedlatif1 Nov 5, 2026
ff5744c
fix(voice): stop microphone capture during startup (#9696)
waleedlatif1 Nov 5, 2026
10a9d8a
fix(search): keep Confluence searchable for colon queries and say whe…
waleedlatif1 Nov 5, 2026
5cda510
fix(logs): keep checked trace content at every depth and label live p…
waleedlatif1 Nov 5, 2026
6eaca1c
fix(search): describe connection availability accurately (#9699)
waleedlatif1 Nov 5, 2026
45e36ff
improvement(links): make go/ and sim/ work with no setup (#9698)
waleedlatif1 Nov 5, 2026
6acfeb3
fix(desktop): keep signed release builds off shared caches (#9701)
waleedlatif1 Nov 5, 2026
1c150df
fix(links): keep long searches within the list limit (#9702)
waleedlatif1 Nov 5, 2026
e5cdbcf
fix(desktop): download Bun fresh in the signed release build (#9703)
waleedlatif1 Nov 5, 2026
6c21f82
fix(extension): keep sign-in recovery available (#9704)
waleedlatif1 Nov 5, 2026
4e4865c
feat(platform): add the Paper design system and isolated workbench
emir-karabeg Nov 4, 2026
2525167
fix(platform): make Paper components respond to data, focus, and avai…
emir-karabeg Nov 4, 2026
70903f6
fix(platform): use Paper’s strong text role for dashboard headings an…
emir-karabeg Nov 4, 2026
eb11d6c
fix(platform): unify dropdowns and remove focus paint
emir-karabeg Nov 4, 2026
bdbd462
test(platform): budget the design audit integration test for CI
emir-karabeg Nov 4, 2026
886d888
feat(platform): build Core and Chat for web and desktop
emir-karabeg Nov 4, 2026
c32f310
fix(platform): keep anchored popover presentation in its CSS recipe
emir-karabeg Nov 4, 2026
9048eb3
fix(platform): reserve shell controls when a panel takes over
emir-karabeg Nov 4, 2026
15f3407
fix(platform): align tablet panel controls with the shell inset
emir-karabeg Nov 4, 2026
413694c
fix(platform): keep drafts and interface edits across navigation
emir-karabeg Nov 4, 2026
ac77cb8
fix(platform): apply system appearance before hydration
emir-karabeg Nov 4, 2026
c8b9119
Colocate Platform product UI and unify control geometry and states
emir-karabeg Nov 5, 2026
4417bc9
Move keyboard focus into the chat panel when it opens
emir-karabeg Nov 5, 2026
2e1cb60
Guard interface icon ownership and exercise both native tab layouts
emir-karabeg Nov 5, 2026
58f3dd9
Generate and check Platform route types independently
emir-karabeg Nov 5, 2026
b5ddb50
Keep Platform browser tests in their own TypeScript project
emir-karabeg Nov 5, 2026
115bee7
Unify Platform modal actions, control geometry and overflow
emir-karabeg Nov 5, 2026
354f3ef
Compare responsive layout in a single browser frame
emir-karabeg Nov 5, 2026
2f1bf5a
Consolidate Platform controls and align Home and Chat
emir-karabeg Nov 5, 2026
d82881d
Align Platform shell and conversation spacing and unify action feedback
emir-karabeg Nov 5, 2026
56e948b
Align sidebar toggles, message hover and workspace controls
emir-karabeg Nov 5, 2026
8898543
Use text-only Workspaces launcher and tab
emir-karabeg Nov 5, 2026
aa9f29f
Align notification surfaces and share dated activity across the Platform
emir-karabeg Nov 5, 2026
e06d28e
Keep Platform preferences and design review aligned across sessions
emir-karabeg Nov 5, 2026
01f2630
Keep platform navigation in place and unify Home and invite interactions
emir-karabeg Nov 5, 2026
99ed89a
Respect modal keyboard focus and show Now after a calendar scroll
emir-karabeg Nov 5, 2026
d1c0720
Keep the remove button inside compact invite tags
emir-karabeg Nov 5, 2026
c2a043e
Center the close glyph within recipient tags
emir-karabeg Nov 5, 2026
f17fbcf
Use the shared spacing token for inline button glyphs
emir-karabeg Nov 5, 2026
2ae7cef
Align Command K with Platform menu spacing
emir-karabeg Nov 5, 2026
ca39103
Build organization integrations in the Platform
emir-karabeg Nov 5, 2026
4c967de
Preserve integration navigation with desktop search and larger text
emir-karabeg Nov 5, 2026
5bbcb83
Serve the Platform as a zone under /platform
waleedlatif1 Nov 5, 2026
77406dd
Hand flagged organizations off to the Platform from the legacy layout
waleedlatif1 Nov 5, 2026
b523f91
Add GET /api/organizations/surface
waleedlatif1 Nov 5, 2026
b442b78
Open a narrow data seam into the Platform
waleedlatif1 Nov 5, 2026
0d4758a
Let EMCN modals wait on async confirms and inputs take controlled values
waleedlatif1 Nov 5, 2026
564039b
Add a Settings section registry with one lazy folder per section
waleedlatif1 Nov 5, 2026
652c451
Feed PlatformShell live data through its existing prop
waleedlatif1 Nov 5, 2026
6ad6575
Add the Platform's live runtime behind a resolved mode
waleedlatif1 Nov 5, 2026
3b69b67
Add live Platform checks, the parity ledger and the data seam contract
waleedlatif1 Nov 5, 2026
dc4f41b
Tighten the Platform wiring after review
waleedlatif1 Nov 5, 2026
23b5e16
Narrow the contract response mode where it is read
waleedlatif1 Nov 5, 2026
b74d7bc
Scope Integrations to the signed-in member and their credentials
emir-karabeg Nov 5, 2026
1f8c01d
Trace the existing member route before designing its replacement
emir-karabeg Nov 5, 2026
ffabae1
Connect member accounts inline with canonical provider descriptions
emir-karabeg Nov 5, 2026
0f3c413
Simplify integration headers and group member permissions
emir-karabeg Nov 5, 2026
8b65e98
Resolve the Platform's type errors against the shared data layer
waleedlatif1 Nov 5, 2026
2e34aa5
Keep the Platform client build free of Node modules and refresh audit…
waleedlatif1 Nov 5, 2026
d832b9d
Add the design-system controls the organization surface needs
waleedlatif1 Nov 5, 2026
2b2b7be
Merge branch 'wip/org-ds' into wip/platform-org-wiring
waleedlatif1 Nov 5, 2026
9a30f34
Show catalog descriptions, a single credential, and actual Search access
emir-karabeg Nov 5, 2026
8d35586
Clarify credentials, permissions and setup on integration details
emir-karabeg Nov 5, 2026
8b719d2
Keep setup guides available for organization-managed integrations
emir-karabeg Nov 5, 2026
6de9440
Wire the Platform shell to the viewer's real organization, workspaces…
waleedlatif1 Nov 5, 2026
99fa75c
Extract governance settings logic into pure modules legacy re-imports
waleedlatif1 Nov 5, 2026
f0d2039
Bring Members, Requests and People to the Platform on live data
waleedlatif1 Nov 5, 2026
12f6fc5
Share the People loading status and drop callbacks nothing observes
waleedlatif1 Nov 5, 2026
c6580ff
Apply the cleanup review to the Platform shell
waleedlatif1 Nov 5, 2026
c21c938
Port personal, billing, usage, links and white-labeling settings to t…
waleedlatif1 Nov 5, 2026
2c73588
State the removal dialog's copy in one place
waleedlatif1 Nov 5, 2026
d7e26a1
Merge branch 'wip/org-people' into wip/platform-org-wiring
waleedlatif1 Nov 5, 2026
b5890cf
Merge commit '8b719d2c430d7634e00abb694951dcd4950f777e' into wip/plat…
waleedlatif1 Nov 5, 2026
4090d65
Tighten the Platform settings sections after review
waleedlatif1 Nov 5, 2026
49d0e07
Simplify the Platform shell's links, help and sign-out against what a…
waleedlatif1 Nov 5, 2026
dae906a
Merge the shell lane
waleedlatif1 Nov 5, 2026
248d7b8
Populate Home's widgets from the member's own connected accounts
waleedlatif1 Nov 5, 2026
80c8a7c
Keep the full sidebar width available for navigation
emir-karabeg Nov 5, 2026
f5128ff
Anchor the sidebar opener outside scrolling pages
emir-karabeg Nov 5, 2026
b2cdc3a
Port governance settings onto the Platform
waleedlatif1 Nov 5, 2026
11b0411
Simplify the Platform settings sections
waleedlatif1 Nov 5, 2026
23c85ab
Merge the personal, billing and links settings lane
waleedlatif1 Nov 5, 2026
2074e41
Merge commit 'f5128ff3fb946eec25a4b04ab19b9a1aed5f8593' into wip/plat…
waleedlatif1 Nov 5, 2026
3d60d3f
Tighten governance settings after review
waleedlatif1 Nov 5, 2026
080a7ed
Cut the chat hook's closure with behavior-preserving extractions
waleedlatif1 Nov 5, 2026
eff3a7c
Run live chat and Search on the Platform
waleedlatif1 Nov 5, 2026
de1903d
Tighten Home's reads, states and shared rules after review
waleedlatif1 Nov 5, 2026
538d8eb
Merge the Home lane
waleedlatif1 Nov 5, 2026
fcd1751
Share the audit, link and retention rules the review found duplicated
waleedlatif1 Nov 5, 2026
8d1b28a
Import the segmented control the sign-in tabs now render
waleedlatif1 Nov 5, 2026
b919c53
Merge the governance settings lane
waleedlatif1 Nov 5, 2026
f248698
Simplify the Platform chat seam and its per-chunk work
waleedlatif1 Nov 5, 2026
73fd7c3
Tighten live chat and Search after the cleanup passes
waleedlatif1 Nov 5, 2026
88f58ec
Merge the chat and search lane
waleedlatif1 Nov 5, 2026
fb8d97f
Send Search-only members to the Platform's Search from Home
waleedlatif1 Nov 5, 2026
724ff00
Add the live Platform suite against the real stack
waleedlatif1 Nov 5, 2026
af95eac
Give Settings one guard and one set of section parts
waleedlatif1 Nov 5, 2026
b144072
Give the live seed the app URL its OAuth policies read
waleedlatif1 Nov 5, 2026
586e0f1
Share what the lanes each wrote for themselves
waleedlatif1 Nov 5, 2026
76916e2
Give each route its loading geometry and stop a chunk re-rendering th…
waleedlatif1 Nov 5, 2026
9b4e3a8
Format dates that can render on the server in one zone and record the…
waleedlatif1 Nov 5, 2026
60c9ea3
Mount the Platform zone at /org so the marketing page keeps its route…
waleedlatif1 Nov 5, 2026
0463830
Merge remote-tracking branch 'origin/wip/platform-org-wiring' into wi…
waleedlatif1 Nov 5, 2026
4a79afa
Start the Platform with its base path, which next start re-reads
waleedlatif1 Nov 5, 2026
f1498f5
Apply the review: settled turns keep their identity, and the seam's e…
waleedlatif1 Nov 5, 2026
773eb46
Apply the cleanup passes: step-back focus, one failure notice, fewer …
waleedlatif1 Nov 5, 2026
a8da574
Merge wip/platform-org-wiring into the architecture pass
waleedlatif1 Nov 5, 2026
87a611a
Merge remote-tracking branch 'origin/wip/platform-org-wiring' into wi…
waleedlatif1 Nov 5, 2026
f492734
Set the zone's security headers on the Platform itself
waleedlatif1 Nov 5, 2026
00c5880
Correct the live specs against what the stack actually does
waleedlatif1 Nov 5, 2026
4a15f13
Fix the live specs' selectors for retry, discard, profile back and th…
waleedlatif1 Nov 5, 2026
1241c81
Keep the Platform zone absent for an organization the flag has not re…
waleedlatif1 Nov 5, 2026
21f0031
Clear the sidebar opener above People pages
waleedlatif1 Nov 5, 2026
84d38c0
Fit a property label's longest live value
waleedlatif1 Nov 5, 2026
375b538
Draw row action menus as the options icon
waleedlatif1 Nov 5, 2026
f3e225d
Keep the feedback draft resettable and let the seam audit run without…
waleedlatif1 Nov 5, 2026
0a1608d
Let the seam closure audit skip a tree with no data seam
waleedlatif1 Nov 5, 2026
8156aa1
Hold the parity ledger to real tests, and cover more daily flows
waleedlatif1 Nov 5, 2026
1c54533
Rebuild organization Settings with native Platform pages and gated pr…
emir-karabeg Nov 5, 2026
07c80cf
Correct the flows spec's palette and group selectors, and credit the …
waleedlatif1 Nov 5, 2026
521e8f5
Apply the review of the live suite
waleedlatif1 Nov 5, 2026
dbcb048
Let the form reset clear chat feedback details
waleedlatif1 Nov 5, 2026
78131f4
Merge the live verification suite
waleedlatif1 Nov 5, 2026
4b9ab5e
Reconcile the new Settings pages with the merged surface and menu con…
waleedlatif1 Nov 5, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
12 changes: 7 additions & 5 deletions .agents/skills/add-settings-page/SKILL.md
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
---
name: add-settings-page
description: Add a new Sim settings page, or audit existing settings pages for design-system compliance with the shared SettingsPanel layout. Use when creating a settings tab, or when asked to check/clean up settings pages so they match the design system (consistent title, header, search, spacing).
description: Add or audit settings pages that use SettingsPanel in the existing Sim app. Use implement-platform for isolated Platform settings.
---

# Settings Page (add / audit)

For `apps/sim/platform/**`, use [implement-platform](../implement-platform/SKILL.md). In a mixed request, apply the steps below only to the existing app's settings.

Settings page chrome (header bar, scroll region, content column, nav-driven
title + description) is owned by the `settings/[section]/layout.tsx` shell. Each
page renders through **`SettingsPanel`**, which registers the page's header data
Expand Down Expand Up @@ -45,28 +47,28 @@ For each page component, confirm the checklist in `.claude/rules/sim-settings-pa
Each grep lists candidates; review every match against the expected ones named below.

1. Find hand-rolled shells that should be `SettingsPanel`:
`git grep -n "flex h-full flex-col bg-\[var(--bg)\]" -- 'apps/sim/**/settings/**' 'apps/sim/ee/'`
`git grep -n "flex h-full flex-col bg-\[var(--bg)\]" -- 'apps/sim/**/settings/**' 'apps/sim/ee/' ':(exclude)apps/sim/platform/**'`
— expected matches: the workspace and organization `settings/layout.tsx` shells and the
shared header shell (`components/settings/settings-header.tsx`); an entitlement/loading gate
is also fine. `CredentialDetailLayout` (the `settings/secrets/[credentialId]` exception) is
an exempt hand-rolled shell outside these pathspecs. A detail sub-view is never a match: it
passes `back={{ text, icon: ArrowLeft, onSelect }}` to `SettingsPanel`. Anything else is a
violation: render it through `SettingsPanel`.
2. Find hand-rolled title blocks:
`git grep -n "text-\[var(--text-body)\] text-lg" -- 'apps/sim/**/settings/**' 'apps/sim/ee/'`
`git grep -n "text-\[var(--text-body)\] text-lg" -- 'apps/sim/**/settings/**' 'apps/sim/ee/' ':(exclude)apps/sim/platform/**'`
— the only title is the `<h1>` in `settings-header.tsx`; a non-heading value at that size
(e.g. the credit balance in `ee/organization-usage/components/usage-credits.tsx`) is fine.
3. Find literal pixel text sizes (should be 0 — see "Text Scale" in
`.claude/rules/sim-styling.md`):
`git grep -nE "text-\[1[0-8]px\]" -- 'apps/sim/**/settings/**' 'apps/sim/ee/'`.
`git grep -nE "text-\[1[0-8]px\]" -- 'apps/sim/**/settings/**' 'apps/sim/ee/' ':(exclude)apps/sim/platform/**'`.
Display type above the scale (`text-[40px]` hero headings) is deliberate and out of
scope.
4. Confirm each page imports `SettingsPanel` and that its registry entry has an
accurate `description` of consistent length with its peers.
- Editable pages: confirm Save/Discard go through `saveDiscardActions()` and
dirty is wired via `useSettingsUnsavedGuard` (called before early-return
gates) — flag any hand-rolled Save button, `beforeunload`, or unsaved modal.
`git grep -n "beforeunload" -- 'apps/sim/**/settings/**' 'apps/sim/ee/' 'apps/sim/components/settings/' ':(exclude,glob)**/*.test.*'`
`git grep -n "beforeunload" -- 'apps/sim/**/settings/**' 'apps/sim/ee/' 'apps/sim/components/settings/' ':(exclude)apps/sim/platform/**' 'apps/sim/hooks/use-settings-browser-navigation.ts' ':(exclude,glob)**/*.test.*'`
should only hit the centralized `use-settings-browser-navigation.ts`.
5. Fix each finding with the smallest structural change that satisfies the checklist;
do not touch handlers, state, queries, or gate returns. A pixel-size fix swaps
Expand Down
2 changes: 1 addition & 1 deletion .agents/skills/cleanup/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ Run these in parallel on the parsed `scope`:
3. `/you-might-not-need-a-callback <scope> fix=false`
4. `/you-might-not-need-state <scope> fix=false`
5. `/react-query-best-practices <scope> fix=false`
6. `/emcn-design-review <scope> fix=false`
6. Design review: route `apps/sim/platform/**` to [implement-platform](../implement-platform/SKILL.md) and existing app EMCN paths to [emcn-design-review](../emcn-design-review/SKILL.md). For a mixed diff, the same pass reviews each subset with its own contract. Both reviews are read-only and return proposals for Step 2.
7. `/you-might-not-need-url-state <scope> fix=false`
8. `/you-might-not-need-a-comment <scope> fix=false`
9. `/test-audit audit <test paths>` — read-only; only when the scope adds or changes test files (`*.test.ts(x)`, `*.integration.ts`, `**/e2e/**`, `apps/sim/scripts/test-*-e2e.ts`). First resolve a free-form scope to the concrete list of added or changed test paths (`git diff --name-only` against the scope's base) and pass those paths. It applies the authoring gate to every new or changed test and proposes deleting the ones that fail it.
Expand Down
4 changes: 2 additions & 2 deletions .agents/skills/emcn-design-review/SKILL.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
---
name: emcn-design-review
description: Review UI code for alignment with the emcn design system — components, tokens, patterns, and conventions
description: Review the existing Sim app against packages/emcn. Route isolated Platform UI in apps/sim/platform to implement-platform.
argument-hint: "[scope] [fix=true|false]"
---

Expand All @@ -14,7 +14,7 @@ User arguments: $ARGUMENTS

## Context

This codebase uses **emcn**, a custom component library built on Radix UI primitives with CVA variants and CSS variable design tokens. All UI must use emcn components and tokens.
The existing Sim app uses `packages/emcn`, its Radix primitives, CVA variants, and CSS tokens. For `apps/sim/platform/**`, use [implement-platform](../implement-platform/SKILL.md). For mixed scopes, review each file under its owning system and preserve the requested `fix` mode for both.

## Steps

Expand Down
16 changes: 16 additions & 0 deletions .agents/skills/implement-platform/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
---
name: implement-platform
description: Build, change, consolidate, remove, or review Sim Platform UI in apps/sim/platform. Use for code-first product routes, EMCN components, Paper handoff and design drift in the isolated Next app.
---

# Implement Sim Platform

Start in the Sim checkout containing the requested product work. Read the [Platform contract](../../../apps/sim/platform/AGENTS.md) and [component ownership map](../../../apps/sim/platform/docs/component-ownership.md). These versioned files carry the current rules into a fresh chat. Use the [Platform README](../../../apps/sim/platform/README.md) for the local routes, fixture states, generators, and verification commands.

1. **Establish scope on the real route.** Identify the product entry, interaction, phase, and affected consumers. When rebuilding an existing workflow, trace the old navigation target, its access gate, and the actions reachable by that viewer. Use that evidence to decide which controls belong on the new page before consulting the broader API or provider catalog. Phase 1 owns foundations and the library. Phase 2 owns working UI and transient interaction state, with examples supplied through the server fixture flag. Phase 3 connects real data and operations. Reuse the same renderer in the browser and Sim Desktop. Read the installed Next guides for the file structure or framework behavior you are changing.
For organization Settings, inventory the old sidebar in order, its viewer/deployment gates and every action reachable from each section. Map old header buttons to the row or section they act on. Verify the same destination and drilldown on the fixture and authenticated routes; keep real writes outside fixture sessions.
2. **Resolve design intent.** For Paper-backed work, use `$sim-paper-design` to locate the live Shared or Platform master and the product states that use it. Exclude Marcus. Preserve the key and theme roles. Treat artboard sizes as reference measurements. For code-first changes, follow the latest explicit product direction and inspect the rendered route. Identify any source you could not verify. Update the Paper canvas when the request includes Paper changes.
3. **Choose or change the owner.** Start with the behavior. An action, navigation row, value picker, or disclosure has an existing keyboard and pointer contract. Different interactions may share visual roles while retaining different semantics. Use the existing family and named props for a change in size, intent, icon, or content. Put unique anatomy and its CSS beside the route component. Keep page files free of styling. Only EMCN owns the appearance of its controls. Use Base UI there for complex keyboard, floating, and dismissal behavior.
4. **Trace the full change.** On a second independent feature use, promote the original implementation and migrate both callers. For consolidation, compare semantics, map every consumer to its replacement, then remove the obsolete implementation, export, variant styles, and unused registrations. For deletion, also check menus, preferences, fixture data, workbench references, and tests that existed only for the removed feature. Preserve unrelated consumers and historical Paper evidence. A new variant needs a reachable product use. Edit the source or compiler for generated foundations and recipes.
5. **Verify where people use it.** Run the design audit and applicable checks from the README. Render the changed product route with empty, full, stress, and fixture-off data as relevant. Check both themes, widths between artboards, long content, text scaling, keyboard, and pointer states. Compare shared controls in their actual consumers. Check the actual scroll edge and the open popup when space is tight. For shell, panel, or desktop work, exercise the real Electron renderer. For substantial implementations and consolidations, use an independent agent during design or implementation and for a final review of the changed owners and routes. Provide the working localhost route for visual review.
6. **Keep decisions durable.** Follow the contract’s maintenance guidance when an approved correction changes a shared rule. Record feature-specific decisions with their feature. For sustained work, keep a task checkpoint with the code revision, verified states, evidence, and outstanding work. Include the branch or PR, checkpoint path, and localhost route in a handoff. On resumption, compare the checkpoint with the current branch, working tree, and relevant live sources before acting.
4 changes: 4 additions & 0 deletions .agents/skills/implement-platform/agents/openai.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
interface:
display_name: "Implement Sim Platform"
short_description: "Build and review the code-first Sim Platform"
default_prompt: "Use $implement-platform to implement the next Platform product change in Sim."
2 changes: 2 additions & 0 deletions .claude/rules/emcn-components.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ paths:

# EMCN Components

This guide applies to the existing app. For `apps/sim/platform/**`, use `apps/sim/platform/AGENTS.md`.

Import components, `cn`, and tokens from the `@sim/emcn` barrel; icons come from the `@sim/emcn/icons` subpath, and CSS modules from their file path. Never deep-import other component subpaths. The **chip family** is the platform's primary chrome — always reach for it over the legacy primitives it is progressively replacing (`Input`→`ChipInput`, `Textarea`→`ChipTextarea`, `Modal`→`ChipModal`, `Select`/`Combobox`→`ChipSelect`/`ChipCombobox`/`ChipDropdown`, date field→`ChipDatePicker`). `ChipSwitch` is a segmented choice between options, not a replacement for `Switch`: a boolean on/off toggle stays `Switch`. For context/action menus the canonical control is `DropdownMenu` — the standard menu (not a chip, and never a hand-rolled popover).

## Chip chrome — single source of truth
Expand Down
7 changes: 7 additions & 0 deletions .claude/rules/platform-design.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
description: Sim Platform implementation from Paper
paths:
- "apps/sim/platform/**"
---

Use the canonical contract in `apps/sim/platform/AGENTS.md` and the `implement-platform` skill. Legacy EMCN and app styling rules do not govern this separate project.
2 changes: 2 additions & 0 deletions .claude/rules/sim-architecture.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ paths:

# Sim App Architecture

This guide applies to the existing app. For `apps/sim/platform/**`, use `apps/sim/platform/AGENTS.md`.

Repository layout, package boundaries, the application operation boundary, naming, and utils placement are in the root `CLAUDE.md`. This file holds the app-internal boundaries.

## The `'use client'` server boundary
Expand Down
2 changes: 1 addition & 1 deletion .claude/rules/sim-settings-pages.md
Original file line number Diff line number Diff line change
Expand Up @@ -344,7 +344,7 @@ rendered through `<SettingsActionChips actions={…} />` from
is what keeps tone/icon/variant/tooltip handling from drifting between the two
shells. Reach for it before hand-rolling a `Chip`.
- **`useSettingsUnsavedGuard({ isDirty, navigationBlocked, onDiscard })`** from
`@/components/settings/use-settings-unsaved-guard` registers one editor with the
`@/hooks/use-settings-unsaved-guard` registers one editor with the
shared settings store. Register every full-page draft, including inline creation
forms. Dirty computation stays local and derived; fetched defaults stay clean.
- **`onDiscard` resets the registered draft.** The root `SettingsNavigationGuard`
Expand Down
2 changes: 2 additions & 0 deletions .claude/rules/sim-styling.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ paths:

# Styling Rules

This guide applies to the existing app. For `apps/sim/platform/**`, use `apps/sim/platform/AGENTS.md`.

## Tailwind

1. **No inline styles** - Use Tailwind classes. Exception: a genuinely dynamic
Expand Down
2 changes: 1 addition & 1 deletion .claude/rules/sim-url-state.md
Original file line number Diff line number Diff line change
Expand Up @@ -179,7 +179,7 @@ const setSearch = useDebouncedSearchSetter(write, { debounceMs: 200 })

- **Never write a trimmed value to a param that controls the input** — trimming on write eats the user's trailing space mid-typing and makes multi-word queries untypable. The hook writes the raw value; trim only for the empty-check (the hook does this) and on *read* where the value feeds a query or filter.
- **Keep fetches/filtering debounced.** Where the search value feeds a React Query key or an expensive in-memory filter, derive a debounced value off the instant nuqs value (`const debounced = useDebounce(urlSearch, SEARCH_DEBOUNCE_MS)` with `SEARCH_DEBOUNCE_MS` from `@/lib/url-state`) and feed *that* to the query — the instant value is only for the input box. Cheap in-memory filtering over a small static list may read the instant value directly.
- Settings list search boxes use `useSettingsSearch()` from `settings/components/use-settings-search` — the shared `?search=` binding for that surface.
- Settings list search boxes use `useSettingsSearch()` from `@/hooks/use-settings-search` — the shared `?search=` binding for that surface.
- Preserve `clearOnDefault` (empty clears the param), the existing default, and `history: 'replace'`. See logs (`use-log-filters.ts` grouped, query stays debounced), integrations (cheap in-memory filter, instant value), and tables (filter stays debounced).

## Sort convention (`sort` + `dir`)
Expand Down
1 change: 1 addition & 0 deletions .claude/skills/implement-platform
2 changes: 2 additions & 0 deletions .cursor/rules/emcn-components.mdc
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ globs: ["packages/emcn/**"]

# EMCN Components

This guide applies to the existing app. For `apps/sim/platform/**`, use `apps/sim/platform/AGENTS.md`.

Import components, `cn`, and tokens from the `@sim/emcn` barrel; icons come from the `@sim/emcn/icons` subpath, and CSS modules from their file path. Never deep-import other component subpaths. The **chip family** is the platform's primary chrome — always reach for it over the legacy primitives it is progressively replacing (`Input`→`ChipInput`, `Textarea`→`ChipTextarea`, `Modal`→`ChipModal`, `Select`/`Combobox`→`ChipSelect`/`ChipCombobox`/`ChipDropdown`, date field→`ChipDatePicker`). `ChipSwitch` is a segmented choice between options, not a replacement for `Switch`: a boolean on/off toggle stays `Switch`. For context/action menus the canonical control is `DropdownMenu` — the standard menu (not a chip, and never a hand-rolled popover).

## Chip chrome — single source of truth
Expand Down
8 changes: 8 additions & 0 deletions .cursor/rules/platform-design.mdc
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
---
description: "Sim Platform implementation from Paper"
globs: ["apps/sim/platform/**"]
---

<!-- Generated from .claude/rules/platform-design.md by `bun run skills:sync`. Edit the source, not this file. -->

Use the canonical contract in `apps/sim/platform/AGENTS.md` and the `implement-platform` skill. Legacy EMCN and app styling rules do not govern this separate project.
2 changes: 2 additions & 0 deletions .cursor/rules/sim-architecture.mdc
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ globs: ["apps/sim/**"]

# Sim App Architecture

This guide applies to the existing app. For `apps/sim/platform/**`, use `apps/sim/platform/AGENTS.md`.

Repository layout, package boundaries, the application operation boundary, naming, and utils placement are in the root `CLAUDE.md`. This file holds the app-internal boundaries.

## The `'use client'` server boundary
Expand Down
2 changes: 1 addition & 1 deletion .cursor/rules/sim-settings-pages.mdc
Original file line number Diff line number Diff line change
Expand Up @@ -340,7 +340,7 @@ rendered through `<SettingsActionChips actions={…} />` from
is what keeps tone/icon/variant/tooltip handling from drifting between the two
shells. Reach for it before hand-rolling a `Chip`.
- **`useSettingsUnsavedGuard({ isDirty, navigationBlocked, onDiscard })`** from
`@/components/settings/use-settings-unsaved-guard` registers one editor with the
`@/hooks/use-settings-unsaved-guard` registers one editor with the
shared settings store. Register every full-page draft, including inline creation
forms. Dirty computation stays local and derived; fetched defaults stay clean.
- **`onDiscard` resets the registered draft.** The root `SettingsNavigationGuard`
Expand Down
2 changes: 2 additions & 0 deletions .cursor/rules/sim-styling.mdc
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ globs: ["apps/sim/**/*.tsx","apps/sim/**/*.css"]

# Styling Rules

This guide applies to the existing app. For `apps/sim/platform/**`, use `apps/sim/platform/AGENTS.md`.

## Tailwind

1. **No inline styles** - Use Tailwind classes. Exception: a genuinely dynamic
Expand Down
2 changes: 1 addition & 1 deletion .cursor/rules/sim-url-state.mdc
Original file line number Diff line number Diff line change
Expand Up @@ -172,7 +172,7 @@ const setSearch = useDebouncedSearchSetter(write, { debounceMs: 200 })

- **Never write a trimmed value to a param that controls the input** — trimming on write eats the user's trailing space mid-typing and makes multi-word queries untypable. The hook writes the raw value; trim only for the empty-check (the hook does this) and on *read* where the value feeds a query or filter.
- **Keep fetches/filtering debounced.** Where the search value feeds a React Query key or an expensive in-memory filter, derive a debounced value off the instant nuqs value (`const debounced = useDebounce(urlSearch, SEARCH_DEBOUNCE_MS)` with `SEARCH_DEBOUNCE_MS` from `@/lib/url-state`) and feed *that* to the query — the instant value is only for the input box. Cheap in-memory filtering over a small static list may read the instant value directly.
- Settings list search boxes use `useSettingsSearch()` from `settings/components/use-settings-search` — the shared `?search=` binding for that surface.
- Settings list search boxes use `useSettingsSearch()` from `@/hooks/use-settings-search` — the shared `?search=` binding for that surface.
- Preserve `clearOnDefault` (empty clears the param), the existing default, and `history: 'replace'`. See logs (`use-log-filters.ts` grouped, query stays debounced), integrations (cheap in-memory filter, instant value), and tables (filter stays debounced).

## Sort convention (`sort` + `dir`)
Expand Down
Loading
Loading