Skip to content

🤖 feat: add Claude Design (design-sync) integration#3621

Merged
ThomasK33 merged 1 commit into
mainfrom
design-sync
Jun 24, 2026
Merged

🤖 feat: add Claude Design (design-sync) integration#3621
ThomasK33 merged 1 commit into
mainfrom
design-sync

Conversation

@ThomasK33

Copy link
Copy Markdown
Member

Summary

Adds a .design-sync/ integration that syncs 25 curated Mux components to Claude Design (claude.ai/design), so the design agent builds real UIs out of Mux's actual compiled components. No production code changes — everything lives under .design-sync/ (outside the app's lint/typecheck/build scope).

Background

Claude Design renders designs from a customer's real component library. This wires Mux up as that library. Mux is genuinely off the beaten path for the design-sync tooling: it's an Electron app (no component-library dist/.d.ts), its full component graph is 28 MB (5.6× the hard 5 MB per-file upload cap), and its Storybook is integration-style — 62 of 73 stories render the entire app via AppWithMocks, so compiled-story previews would be ~17 MB each.

Implementation

  • Bundle: a generated barrel (gen-barrel.mjsds-barrel.ts) exposes the curated components + the providers the previews need on window.Mux; tsconfig.ds.json stubs two IIFE-incompatible deps (novnc top-level-await, katex .ttf). Real compiled CSS is scraped from a reference Storybook build.
  • Curation (largest fitting set): 48 of 73 titles excluded to fit the 5 MB cap — heavy-viz components (shiki/mermaid/recharts/d3/ghostty), oversized app-chrome (sidebars), full-app screens, and 5 that render blank without live store/async data. Bundle lands at 4.27 MB.
  • Isolated previews: since stories render the full app, each component gets a hand-authored preview (previews/<Name>.tsx) that renders it directly with mock data inside a lightweight provider harness (preview-harness.tsx), shimmed to window.Mux so previews stay ~3.3 MB and share React-context identity. Authored across 4 parallel agents.
  • All decisions, knobs, and re-sync risks are documented in .design-sync/NOTES.md; conventions.md is the design-agent README header.

Validation

  • Final driver receipt ok: true (build / diff / validate / capture all green); 25/25 previews render cleanly; bundle 4.27 MB and every preview <3.3 MB (both under the 5 MB cap); 0 pending grades.
  • Uploaded and verified live in the Mux Design System project (file listing confirmed).
  • Two accepted non-blocking validator warnings, triaged in NOTES: [TOKENS_MISSING] (Mux's own runtime/dangling CSS vars — components render correctly) and a [FONT_MISSING] for an unreached Ubuntu Mono font-stack fallback.

Risks

Minimal — no src/ changes; .design-sync/ is outside ESLint (src/**) and typecheck (tsconfig includes) scope, so the app's CI surface is untouched. The committed state is purely additive design-sync tooling that future re-syncs read.

Pains

The 5 MB cap vs Mux's app-scale graph, and the integration-style Storybook, forced two scope pivots (curate to fit; hand-author isolated previews) and a deep iteration loop to reconcile the compare oracle (which expects 1:1 story↔preview pairing) with single-variant isolated previews.


🤖 Generated with Claude Code

@ThomasK33

Copy link
Copy Markdown
Member Author

@codex review

@ThomasK33

Copy link
Copy Markdown
Member Author

@codex review

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: eac65de838

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread .design-sync/gen-barrel.mjs Outdated
@ThomasK33

Copy link
Copy Markdown
Member Author

@codex review

Addressed the P2: gen-barrel.mjs now mkdirSync(.design-sync/.cache, { recursive: true }) before writing titlemap.json, so the documented node .design-sync/gen-barrel.mjs re-sync flow no longer throws ENOENT on a fresh checkout (verified by running it with .cache/ removed — exits 0 and recreates the dir).

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 7fb534ec9b

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread .design-sync/gen-barrel.mjs Outdated
Sync 25 curated Mux components to claude.ai/design via a hand-authored
isolated-preview pipeline (bundle barrel + lightweight provider harness),
since Mux's integration-style Storybook can't be compiled into <5MB previews.
All config, the barrel generator, the harness, 25 previews, and NOTES live
under .design-sync/. See .design-sync/NOTES.md.

Change-Id: Iab32de1144fd13eb9ae53f3e0abc8f45f5662c8c
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Signed-off-by: Thomas Kosiewski <tk@coder.com>
@ThomasK33

Copy link
Copy Markdown
Member Author

@codex review

Addressed the second P2: gen-barrel.mjs now checks for .design-sync/sb-reference/index.json up front and, when absent (fresh checkout — it's gitignored), exits 1 with the explicit prerequisite (npx storybook build -c .storybook -o .design-sync/sb-reference) instead of an opaque ENOENT. NOTES.md "Barrel staleness" re-sync step now leads with that build command. Verified both paths (missing → clean error + exit 1; present → exit 0).

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Didn't find any major issues. Already looking forward to the next diff.

Reviewed commit: 3a1b16aa0f

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

@ThomasK33
ThomasK33 added this pull request to the merge queue Jun 24, 2026
Merged via the queue into main with commit 2ea3a29 Jun 24, 2026
22 checks passed
@ThomasK33
ThomasK33 deleted the design-sync branch June 24, 2026 07:31
@mux-bot mux-bot Bot mentioned this pull request Jun 24, 2026
LeonidasZhak pushed a commit to LeonidasZhak/mux that referenced this pull request Jun 30, 2026
## Summary

Long-lived auto-cleanup PR maintained by the **Auto-Cleanup Agent**.
Each pass lands at most one extremely low-risk, behavior-preserving
cleanup drawn from recently merged `main` activity, then advances the
checkpoint below.

Auto-cleanup checkpoint: 620c2a6

This PR currently contains six accumulated cleanups against `main`:

1. `src/node/services/taskService.ts` — dedupe queued-message foreground
backgrounding into a private helper.
2. `src/node/services/workflows/workflowScriptResolver.ts` — reuse the
`SKILL_SCRIPT_PATH_PREFIX` constant for canonical-path construction.
3. `src/node/services/workflows/WorkflowTaskServiceAdapter.ts` — extract
the duplicated agent-task creation arg shape into a shared
`WorkflowTaskCreateArgs` type.
4. `src/constants/workspaceTags.ts` (new) — centralize the
workspace-turn task tag keys, removing the cross-layer
`"mux.taskHandleId"` string duplication.
5. `src/node/services/tools/workflowProgress.ts` — extract the
duplicated "latest phase" lookup into a shared `getLatestPhaseEvent`
helper.
6. `src/browser/features/RightSidebar/Workflows/WorkflowBadges.tsx` —
map workflow run-status glyphs through an exhaustive
`Record<WorkflowRunStatus, LucideIcon>` instead of a repeated
`if`-chain.

## This pass

Rebased the branch onto the latest `origin/main` (clean) and considered
the three new commits since the prior checkpoint:

- coder#3624 (`feat: add Workflows right-sidebar tab with live run
streaming`)
- coder#3626 (`tests: add UI primitive stories and fix design-sync previews`)
- coder#3627 (`feat: return workflow plan agent results`)

coder#3624 added `WorkflowBadges.tsx`, whose `WorkflowStatusIcon` selected a
glyph through a four-branch `if`-chain that re-spelled the identical
`className="h-3 w-3 shrink-0"` + `style={{ color }}` props in every
branch and fell back to a default `<Circle>` for unmatched statuses.
Replaced that with a module-level `WORKFLOW_STATUS_ICON:
Record<WorkflowRunStatus, LucideIcon>` map (mirroring the existing
`WORKFLOW_STATUS_META` / `WORKFLOW_TONE_VAR` records in the same
feature) and render the looked-up icon once. Behavior-preserving: the
map reproduces the prior mapping exactly (`pending`/`running` →
`Circle`, `backgrounded`/`interrupted` → `Pause`, `completed` → `Check`,
`failed` → `X`), and using a `Record` makes the mapping exhaustive so a
newly added run status is a compile error here rather than a silent
fall-through. coder#3626 (Storybook/design-sync, test-only) and coder#3627
(already extracts its own `__muxAgentReturnValue` runtime helper)
offered no additional low-risk dedup.

<details>
<summary>Prior pass — workflowProgress getLatestPhaseEvent
helper</summary>

coder#3623 added `src/node/services/tools/workflowProgress.ts`, in which both
`buildWorkflowProgressSummary` and `formatWorkflowProgressNote`
independently re-spelled the same `run.events.findLast((event) =>
event.type === "phase")` expression to find the latest phase event.
Extracted that into a single private `getLatestPhaseEvent(run)` helper
and referenced it from both functions, giving the "latest phase"
definition one source of truth so the summary builder and the note
formatter can't drift. Behavior-preserving: the helper's body and
inferred return type are identical to the inline expression, so both
call sites compute exactly the same value.

</details>

<details>
<summary>Prior pass — checkpoint-only advance for coder#3621 (Claude Design
integration)</summary>

coder#3621 is purely additive and lives entirely under `.design-sync/` (plus
one `.gitignore` entry); it contains zero production (`src/`) code.
`.design-sync/**` is outside both the ESLint scope (`src/**`) and the
TypeScript `include`, so `make static-check` cannot validate the
behavior-preservation of any refactor there. That pass advanced the
checkpoint without a code change.

</details>

<details>
<summary>Prior pass — workspace-turn task tag keys
centralization</summary>

The workspace-turn task tag key `"mux.taskHandleId"` is **written** by
`TaskService.createWorkspaceTurn` (node, coder#3617/coder#3619) and **read** by
`findWorkspaceForTaskTarget` in `TaskToolCall.tsx` (browser, coder#3613) —
the same magic string duplicated across the node/browser boundary.
Extracted the three workspace-turn task tag keys (`handle`,
`ownerWorkspaceId`, `turn`) into a new `@/constants/workspaceTags`
module and referenced `WORKSPACE_TURN_TASK_TAGS` from both the node
write site and the browser read site. Behavior-preserving: the extracted
values are byte-identical to the previous literals, so the persisted tag
keys and all lookups are unchanged.

</details>

<details>
<summary>Prior pass — WorkflowTaskServiceAdapter WorkflowTaskCreateArgs
type</summary>

`WorkflowTaskServiceLike` (in `WorkflowTaskServiceAdapter.ts`) declared
the agent-task creation argument object **twice** — once inline in
`create(args: { ... })` and again inside `createMany?(args: Array<{ ...
}>)` — as byte-identical 10-field shapes. Extracted a named
`WorkflowTaskCreateArgs` interface and referenced it from both `create`
and `createMany`. Behavior-preserving: structurally identical interface,
signatures unchanged.

</details>

<details>
<summary>Prior pass — workflowScriptResolver SKILL_SCRIPT_PATH_PREFIX
reuse</summary>

In `workflowScriptResolver.ts`, the `skill://` prefix is named by the
module-level constant `SKILL_SCRIPT_PATH_PREFIX`, but the two
canonical-path builders re-spelled the literal `` `skill://${...}` ``
instead of reusing the constant. Both builders now interpolate
`${SKILL_SCRIPT_PATH_PREFIX}`. Behavior-preserving:
`SKILL_SCRIPT_PATH_PREFIX` is exactly `"skill://"`, so the interpolation
is byte-identical.

</details>

<details>
<summary>Prior pass — taskService queued-message dedup</summary>

Considered coder#3605 (`fix: background foreground waits for prequeued
messages`), which open-coded the same queued-message guard at two
`TaskService` wait-registration sites. Both sites now delegate to a
single private helper
`backgroundForegroundWaitIfQueued(shouldBackgroundOnQueuedMessage,
requestingWorkspaceId)`. Behavior-preserving: the helper folds in the
`requestingWorkspaceId` truthiness guard and the pushed call is
unchanged.

</details>

## Validation

- `make static-check` is green for the touched code (ESLint, `tsconfig`
+ `tsconfig.main.json`, Prettier). (`fmt-shell-check` is the only
non-passing step, solely because the `shfmt` binary is absent in this
environment; no shell files are touched.)
- Targeted tests pass: `bun test
src/browser/features/RightSidebar/Workflows/workflowDisplay.test.ts
src/browser/features/RightSidebar/Workflows/projectWorkflowRun.test.ts`
(32 tests) cover the same Workflows feature module the change lives in.

## Risks

Minimal. All accumulated changes are pure local extractions / constant
reuse; no logic, types, or call semantics change.

---

_Generated with `mux` • Model: `anthropic:claude-opus-4-8` • Thinking:
`xhigh`_

<!-- mux-attribution: model=anthropic:claude-opus-4-8 thinking=xhigh -->

---------

Co-authored-by: mux-bot[bot] <264182336+mux-bot[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant