Skip to content

Commit 27efa0f

Browse files
committed
Merge remote-tracking branch 'origin/staging' into feat/func-cli-resolver
# Conflicts: # apps/sim/executor/handlers/agent/agent-handler.ts # apps/sim/lib/copilot/vfs/workspace-vfs.ts # apps/sim/tools/generated/tool-metadata.ts # apps/sim/tools/generated/tool-outputs.ts
2 parents a179093 + 6cc25f6 commit 27efa0f

98 files changed

Lines changed: 4801 additions & 678 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.claude/rules/sim-ui-copy.md

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
---
2+
paths:
3+
- "apps/sim/**/*.tsx"
4+
- "apps/sim/components/emcn/**"
5+
---
6+
7+
# UI Copy
8+
9+
**Do not add subtitles, helper text, or descriptive copy beneath headings, labels, cards, or settings by default.** Prefer one concise, self-explanatory heading or label. Only add supporting copy when the user explicitly asks for it, or when it is necessary to prevent misunderstanding or error — and never use it to restate the heading.
10+
11+
This applies to product surfaces: settings rows, modals, panels, cards, list rows, empty states, form fields, and section headers. Marketing surfaces (`app/(landing)`, docs) are governed by `constitution.md` instead.
12+
13+
**Carve-out — settings section metadata.** `SettingsNavigationItem.description` in `components/settings/navigation.ts` stays required, and `SettingsPanel` keeps rendering it as the page subtitle. Settings sections are reached through a nav list where the description is the only thing distinguishing adjacent sections, so it earns its place by the "prevents misunderstanding" test. Keep those descriptions verb-first and one line, per `sim-settings-pages.md`. Everything else on a settings page — inline `<p>` blurbs under section headings, field hints, modal bodies, row subtitles — follows the default rule above.
14+
15+
## The default is no description
16+
17+
```tsx
18+
// ✗ Bad — the subtitle restates the heading
19+
<h3>API Keys</h3>
20+
<p className='text-[var(--text-muted)] text-caption'>Manage your API keys.</p>
21+
22+
// ✗ Bad — decorative filler under a field label
23+
<ChipModalField title='Workspace name' hint='The name of your workspace.' />
24+
25+
// ✓ Good — the label carries the whole meaning
26+
<h3>API Keys</h3>
27+
<ChipModalField title='Workspace name' />
28+
```
29+
30+
If a heading needs a subtitle to be understood, the heading is wrong. Fix the heading — don't append a second line.
31+
32+
## When supporting copy earns its place
33+
34+
Keep (or add) a description only when it carries information the label cannot, and its absence would cause a mistake:
35+
36+
- **Irreversible or destructive consequences** — "Deleting this workspace removes every workflow and log. This cannot be undone."
37+
- **A non-obvious format, unit, or bound** — "Comma-separated. Max 50 domains.", "Cost per 1M input tokens."
38+
- **A security or access implication** — "This key is shown once and grants full workspace access."
39+
- **A state the user cannot otherwise see** — "Inherited from your organization's policy."
40+
- **Instructional copy that advances a flow** — "We sent a 6-digit code to you@example.com."
41+
42+
Everything else — restatements, "Manage your X", "Configure your Y", feature blurbs, encouragement — gets deleted.
43+
44+
## Component APIs
45+
46+
Description/hint slots on shared components are **optional**, never required, and must reserve no layout space when omitted. A component that forces every consumer to supply a subtitle forces every consumer to violate this rule. When adding a new shared component, ship it without a description slot and add one only once a real caller meets the bar above.

.cursor/rules/sim-ui-copy.mdc

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
---
2+
description: UI copy conventions — no default subtitles or helper text under headings, labels, cards, or settings
3+
globs: ["apps/sim/**/*.tsx"]
4+
---
5+
# UI Copy
6+
7+
**Do not add subtitles, helper text, or descriptive copy beneath headings, labels, cards, or settings by default.** Prefer one concise, self-explanatory heading or label. Only add supporting copy when the user explicitly asks for it, or when it is necessary to prevent misunderstanding or error — and never use it to restate the heading.
8+
9+
This applies to product surfaces: settings rows, modals, panels, cards, list rows, empty states, form fields, and section headers. Marketing surfaces (`app/(landing)`, docs) are governed by `constitution.mdc` instead.
10+
11+
**Carve-out — settings section metadata.** `SettingsNavigationItem.description` in `components/settings/navigation.ts` stays required, and `SettingsPanel` keeps rendering it as the page subtitle. Settings sections are reached through a nav list where the description is the only thing distinguishing adjacent sections. Everything else on a settings page — inline `<p>` blurbs under section headings, field hints, modal bodies, row subtitles — follows the default rule above.
12+
13+
## The default is no description
14+
15+
```tsx
16+
// ✗ Bad — the subtitle restates the heading
17+
<h3>API Keys</h3>
18+
<p className='text-[var(--text-muted)] text-caption'>Manage your API keys.</p>
19+
20+
// ✗ Bad — decorative filler under a field label
21+
<ChipModalField title='Workspace name' hint='The name of your workspace.' />
22+
23+
// ✓ Good — the label carries the whole meaning
24+
<h3>API Keys</h3>
25+
<ChipModalField title='Workspace name' />
26+
```
27+
28+
If a heading needs a subtitle to be understood, the heading is wrong. Fix the heading — don't append a second line.
29+
30+
## When supporting copy earns its place
31+
32+
Keep (or add) a description only when it carries information the label cannot, and its absence would cause a mistake:
33+
34+
- **Irreversible or destructive consequences** — "Deleting this workspace removes every workflow and log. This cannot be undone."
35+
- **A non-obvious format, unit, or bound** — "Comma-separated. Max 50 domains.", "Cost per 1M input tokens."
36+
- **A security or access implication** — "This key is shown once and grants full workspace access."
37+
- **A state the user cannot otherwise see** — "Inherited from your organization's policy."
38+
- **Instructional copy that advances a flow** — "We sent a 6-digit code to you@example.com."
39+
40+
Everything else — restatements, "Manage your X", "Configure your Y", feature blurbs, encouragement — gets deleted.
41+
42+
## Component APIs
43+
44+
Description/hint slots on shared components are **optional**, never required, and must reserve no layout space when omitted. A component that forces every consumer to supply a subtitle forces every consumer to violate this rule. When adding a new shared component, ship it without a description slot and add one only once a real caller meets the bar above.

.github/workflows/test-build.yml

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -178,8 +178,14 @@ jobs:
178178
fi
179179
bun run check:migrations "$BASE_REF"
180180
181-
- name: Type-check realtime server
182-
run: bunx turbo run type-check --filter=@sim/realtime
181+
# Every workspace, not just realtime. packages/emcn, packages/utils,
182+
# apps/desktop and apps/docs had no type check in CI at all; apps/sim's
183+
# source was covered only as a side effect of `next build` in the separate
184+
# Build App job. Note this does NOT cover apps/sim's tests — its tsconfig
185+
# excludes *.test.ts(x), and including them today surfaces ~2.2k errors,
186+
# so that is its own cleanup rather than a gate to switch on here.
187+
- name: Type-check all workspaces
188+
run: bunx turbo run type-check
183189

184190
# cloud-review-tools.test.ts runs the real helper on the runner, which shells
185191
# out to rg. Blacksmith's image ships it, GitHub's doesn't.

apps/docs/content/docs/en/integrations/airtable-service-account.mdx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -69,12 +69,12 @@ Enterprise organizations can enable "Block API access to organization-owned base
6969

7070
<Steps>
7171
<Step>
72-
Open your workspace **Settings** and go to the **Integrations** tab
72+
Open **Integrations** from your workspace sidebar
7373
</Step>
7474
<Step>
75-
Search for "Airtable Service Account" and click it, then click **Add to Sim** and choose **Add personal access token**
75+
Search for "Airtable" and open it, then click **Add to Sim** and choose **Add personal access token**
7676

77-
{/* TODO(screenshot): Integrations page with "Airtable Service Account" in the service list */}
77+
{/* TODO(screenshot): Airtable integration page with the service-account connect option */}
7878
</Step>
7979
<Step>
8080
Paste the **Personal access token**, and optionally set a display name and description

apps/docs/content/docs/en/integrations/asana-service-account.mdx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -73,12 +73,12 @@ If you're not on an Enterprise plan, a personal access token works identically o
7373

7474
<Steps>
7575
<Step>
76-
Open your workspace **Settings** and go to the **Integrations** tab
76+
Open **Integrations** from your workspace sidebar
7777
</Step>
7878
<Step>
79-
Search for "Asana Service Account" and click it, then click **Add to Sim** and choose **Add access token**
79+
Search for "Asana" and open it, then click **Add to Sim** and choose **Add access token**
8080

81-
{/* TODO(screenshot): Integrations page with "Asana Service Account" in the service list */}
81+
{/* TODO(screenshot): Asana integration page with the service-account connect option */}
8282
</Step>
8383
<Step>
8484
Paste the token — service account token or personal access token, both work in the same field — and optionally set a display name and description

apps/docs/content/docs/en/integrations/attio-service-account.mdx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -61,12 +61,12 @@ The API key is bearer credentials for your Attio workspace. Treat it like a pass
6161

6262
<Steps>
6363
<Step>
64-
Open your workspace **Settings** and go to the **Integrations** tab
64+
Open **Integrations** from your workspace sidebar
6565
</Step>
6666
<Step>
67-
Search for "Attio Service Account" and click it, then click **Add to Sim** and choose **Add API key**
67+
Search for "Attio" and open it, then click **Add to Sim** and choose **Add API key**
6868

69-
{/* TODO(screenshot): Integrations page with "Attio Service Account" in the service list */}
69+
{/* TODO(screenshot): Attio integration page with the service-account connect option */}
7070
</Step>
7171
<Step>
7272
Paste the API key and optionally set a display name and description

apps/docs/content/docs/en/integrations/calcom-service-account.mdx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,12 +45,12 @@ The API key carries the full privileges of the user who created it — there is
4545

4646
<Steps>
4747
<Step>
48-
Open your workspace **Settings** and go to the **Integrations** tab
48+
Open **Integrations** from your workspace sidebar
4949
</Step>
5050
<Step>
51-
Search for "Cal.com Service Account" and click it, then click **Add to Sim** and choose **Add API key**
51+
Search for "Cal.com" and open it, then click **Add to Sim** and choose **Add API key**
5252

53-
{/* TODO(screenshot): Integrations page with "Cal.com Service Account" in the service list */}
53+
{/* TODO(screenshot): Cal.com integration page with the service-account connect option */}
5454
</Step>
5555
<Step>
5656
Paste the API key, and optionally set a display name and description

apps/docs/content/docs/en/integrations/clickup-service-account.mdx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,12 +45,12 @@ The API token carries the creating user's full access to every workspace they be
4545

4646
<Steps>
4747
<Step>
48-
Open your workspace **Settings** and go to the **Integrations** tab
48+
Open **Integrations** from your workspace sidebar
4949
</Step>
5050
<Step>
51-
Search for "ClickUp Service Account" and click it, then click **Add to Sim** and choose **Add API token**
51+
Search for "ClickUp" and open it, then click **Add to Sim** and choose **Add API token**
5252

53-
{/* TODO(screenshot): Integrations page with "ClickUp Service Account" in the service list */}
53+
{/* TODO(screenshot): ClickUp integration page with the service-account connect option */}
5454
</Step>
5555
<Step>
5656
Paste the API token (`pk_...`) and optionally set a display name and description

apps/docs/content/docs/en/integrations/google-service-account.mdx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -140,15 +140,15 @@ Once Google Cloud and Workspace are configured, add the service account as a cre
140140

141141
<Steps>
142142
<Step>
143-
Open your workspace **Settings** and go to the **Integrations** tab
143+
Open **Integrations** from your workspace sidebar
144144
</Step>
145145
<Step>
146-
Search for "Google Service Account" and click **Connect**
146+
Search for "Google Drive" and open it — any Google integration works, since they share one service account — then click **Add to Sim** and choose **Add service account**
147147

148148
<div className="flex justify-center">
149149
<Image
150150
src="/static/credentials/integrations-service-account.png"
151-
alt="Integrations page showing Google Service Account"
151+
alt="Google Drive integration page with the service-account connect option"
152152
width={800}
153153
height={150}
154154
className="my-4"
@@ -171,7 +171,7 @@ Once Google Cloud and Workspace are configured, add the service account as a cre
171171
Give the credential a display name (the service account email is used by default)
172172
</Step>
173173
<Step>
174-
Click **Save**
174+
Click **Add service account**
175175
</Step>
176176
</Steps>
177177

apps/docs/content/docs/en/integrations/hubspot-service-account.mdx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -97,12 +97,12 @@ The access token is bearer credentials for your entire portal, limited only by i
9797

9898
<Steps>
9999
<Step>
100-
Open your workspace **Settings** and go to the **Integrations** tab
100+
Open **Integrations** from your workspace sidebar
101101
</Step>
102102
<Step>
103-
Search for "HubSpot Service Account" and click it, then click **Add to Sim** and choose **Add private app token**
103+
Search for "HubSpot" and open it, then click **Add to Sim** and choose **Add private app token**
104104

105-
{/* TODO(screenshot): Integrations page with "HubSpot Service Account" in the service list */}
105+
{/* TODO(screenshot): HubSpot integration page with the service-account connect option */}
106106
</Step>
107107
<Step>
108108
Paste the **Private app access token**, and optionally set a display name and description

0 commit comments

Comments
 (0)