mirror of
https://github.com/nexu-io/open-design.git
synced 2026-06-01 03:14:35 +07:00
* refactor(web): rename Execution mode and tighten settings dialog UI - Rename "Settings → Execution & model" to "Settings → Execution mode" across the web UI, i18n keys, docs, and e2e selectors. - Redesign SettingsDialog: kicker + title row in the modal head, a flatMap-driven agent grid that renders the inline test-result row beside the selected card, compact unavailable cards with right-aligned install/docs links, and an install guide that only shows when the user has no working agent picked. - Trim verbose subtitle / hint copy across chat model, CLI proxy, media providers, custom instructions, and memory sections. - Add an `info` Icon variant for the redesigned settings hints. - Update e2e selectors and docs that referenced the old menu label. Co-authored-by: Cursor <cursoragent@cursor.com> * refactor(web): polish Settings dialog — media providers, skills, MCP Media providers - Hide internal Stub fixture provider (settingsVisible: false) - Split provider list into Available (integrated, editable) and Coming Soon (collapsed <details> drawer with name/hint/Docs link only) - Drop right-side Integrated/Configured badges from every row; all rows in the main list are integrated by definition; inline grey "Saved" chip next to the provider name is the only status indicator now - "Saved" badge moves inline to the right of the provider name and uses a neutral grey treatment (was a standalone green pill below the name) - "Reload from daemon" button shows a 2s green "✓ Reloaded" flash on success instead of leaving a permanent paragraph under the header; errors remain sticky Skills - Replace three pill-row filter banks (Source, Type, Category) with a compact single-row toolbar: search + three inline <select> dropdowns side by side; active filter highlighted with a stronger border MCP server - Shorten section hint to one line - Move WHAT YOUR AGENT CAN DO capabilities above the client dropdown (motivate before asking to act) - Move "Build the daemon first" warning below the code block where it contextually explains why the command might fail, not as a top-level error before the user has done anything - Downgrade "Restart your client" left-border from accent orange to border-strong grey — it is a next step, not a warning External MCP - Shorten section hint to one line Misc CSS - Add .sr-only utility for accessible off-screen live regions - Add button.ghost.is-success-flash for transient success feedback - Add .library-filter-selects / .library-filter-select for dropdown filter rows - Add .media-provider-coming-soon-* for the roadmap drawer Co-authored-by: Cursor <cursoragent@cursor.com> * [codex] Add Cursor Agent auth diagnostics (#1538) * Add Cursor Agent auth diagnostics * Handle Cursor not logged in auth status * Address Cursor auth review feedback * Classify Cursor stdout auth failures * test: expand Memory and Routines coverage (#1521) * test: expand settings and packaged coverage * test: extend memory settings coverage * test: cover routine settings failure states * test: cover routine operation failures * test: fix daemon test typing on CI * test: decouple packaged smoke from orbit bug * test: avoid live memory LLM calls in route tests * test: fix daemon fetch typing in CI * fix: restore preview comment and inspect toggles * test: align manual edit flow with current inspector UX * test: align comment attachment flow with current preview comments UI * fix: probe resolved Codex launch path during detection * fix: remove duplicate board activation helper after rebase * test: update ghost cli detection mock * test: align FileViewer toolbar expectation * ci: move full app tests to extended lane * ci: run app tests by changed scope * ci: cover shared app inputs in test scopes * ci: avoid setup-node cache in windows packaged smoke * test: align extended settings and manual edit flows * refactor(web): rename Execution mode and tighten settings dialog UI - Rename "Settings → Execution & model" to "Settings → Execution mode" across the web UI, i18n keys, docs, and e2e selectors. - Redesign SettingsDialog: kicker + title row in the modal head, a flatMap-driven agent grid that renders the inline test-result row beside the selected card, compact unavailable cards with right-aligned install/docs links, and an install guide that only shows when the user has no working agent picked. - Trim verbose subtitle / hint copy across chat model, CLI proxy, media providers, custom instructions, and memory sections. - Add an `info` Icon variant for the redesigned settings hints. - Update e2e selectors and docs that referenced the old menu label. Co-authored-by: Cursor <cursoragent@cursor.com> * refactor(web): settings dialog UX polish — layout, dedup, and interactions - Remove duplicate section headers from all settings sections (Notifications, Appearance, Privacy, About, Design Systems, Skills, MCP server, Connectors, Media providers, Routines) - Restructure Notifications cards: title + toggle on same row, hint below - Restructure Skills toolbar: search + New skill button in row 1, filter dropdowns in row 2 with left-aligned labels - Restructure Pet section: tabs and Wake button on same row - MCP server: group capabilities and setup into separate cards, remove nested double border on client picker - Connectors: show connect errors as toast instead of inline card text, position toast inside panel, hide single-provider tab - Media providers: move Reload button to left-aligned small ghost button - Memory: info icon shows path on hover, Path copied badge inline; Extraction history and MEMORY.md as standalone collapsible cards; group header hidden when only one type visible - Pet grid cards: Adopt button hidden until hover, icon-only when adopted, description truncated to 2 lines, text fills full width via abs positioning - Agent cards: selected state uses accent border only, no background change - Add sun/moon icons to Appearance theme buttons (Light/Dark) - Shorten several hint strings for clarity Co-authored-by: Cursor <cursoragent@cursor.com> * fix(web): resolve i18n review comments from PR #1568 - Update settings.title and settings.envConfigure to localized "Execution mode" in all 17 non-English locale files - Add settings.memoryFlashPathCopied to all locales and use t() in MemorySection instead of hardcoded English "Path copied" - Add settings.agentModelHead to all locales and use t() in SettingsDialog for "Model for:" agent model row header Co-authored-by: Cursor <cursoragent@cursor.com> * fix(web): update tests to match settings dialog redesign - Add role prop to Toast (alert/status) so error toasts from ConnectorsBrowser are announced immediately by screen readers - Clear connectErrorToast on successful connector retry - Update SettingsDialog.execution tests: - Remove heading assertions for About and MCP server (headers were intentionally removed as duplicate nav labels) - Rewrite CLI env test to use codex-only fields (per-agent filtering means only selected agent's fields are shown) - Update Composio key hint text assertion to match shortened copy - Replace filter button click with select change for Type filter - Replace Configured/Unsupported/Integrated badge checks with updated assertions matching the new media provider UI - Replace disabled BFL row test with coming-soon section check - Update SettingsDialog.media test: remove Fal.ai input assertions (non-integrated providers no longer have editable fields) Co-authored-by: Cursor <cursoragent@cursor.com> * fix(web): unblock CI for #1568 Three small fixes to get Playwright back to green on the settings dialog redesign: 1. `en.ts`: revert `settings.envConfigure` to "Configure execution mode". This PR collapsed both `settings.title` (header gear) and `settings.envConfigure` (entry-side foot pill) to the same string "Execution mode", so `getByRole('button', { name: 'Execution mode' })` resolved to two elements and tripped Playwright strict mode in the three Composio-flow tests (entry-configuration-flows.test.ts:174, 228, 285). Restoring the distinct label also gives screen readers a clearer hint for the pill, which doubles as a status display. Non-English locales still alias the two keys; happy to follow up on those, but they don't gate the (English-only) Playwright suite. 2. entry-configuration-flows.test.ts:167 — `Connectors` heading is now rendered at `<h2>` in the modal-head (SettingsDialog.tsx:1545), with the inner `<h3>` removed by design (see comment around line 1448). Updated the assertion from `level: 3` to `level: 2`. 3. project-management-flows.test.ts:360 — same change for the `Pets` heading. Verified locally with `pnpm --filter @open-design/web typecheck` and `pnpm --filter @open-design/e2e typecheck`. The actual Playwright specs need the dev server up; I didn't rerun them here, but the locator changes are mechanical and match the new DOM. * fix(web): use exact match for Execution mode button locator Playwright's `getByRole({ name })` defaults to substring matching, so `{ name: 'Execution mode' }` still resolved to both the header gear (aria-label "Execution mode") and the entry-side foot pill (aria-label "Configure execution mode" — substring contains "Execution mode"). Strict mode tripped in the three composio-flow tests at lines 202, 257, and 319. Adding `exact: true` makes each call resolve to just the header gear, which opens the same dialog the foot pill does — the test outcomes are unchanged. --------- Co-authored-by: chaoxiaoche <chaoxiaoche@chaoxiaochedeMacBook-Pro.local> Co-authored-by: Cursor <cursoragent@cursor.com> Co-authored-by: Caprika <56862773+alchemistklk@users.noreply.github.com> Co-authored-by: shangxinyu1 <shangxinyu@refly.ai> Co-authored-by: lefarcen <935902669@qq.com>
365 lines
18 KiB
Markdown
365 lines
18 KiB
Markdown
# Quickstart
|
||
|
||
<p align="center"><b>English</b> · <a href="QUICKSTART.pt-BR.md">Português (Brasil)</a> · <a href="QUICKSTART.de.md">Deutsch</a> · <a href="QUICKSTART.fr.md">Français</a> · <a href="QUICKSTART.ja-JP.md">日本語</a> · <a href="QUICKSTART.zh-CN.md">简体中文</a> · <a href="QUICKSTART.zh-TW.md">繁體中文</a></p>
|
||
|
||
Run the full product locally.
|
||
|
||
## Environment requirements
|
||
|
||
- **Node.js:** `~24` (Node 24.x). The repo enforces this through `package.json#engines`.
|
||
- **pnpm:** `10.33.x`. The repo pins `pnpm@10.33.2` through `packageManager`; use Corepack so the pinned version is selected automatically.
|
||
- **OS:** macOS, Linux, and WSL2 are the primary paths. Windows native is supported; see [`docs/windows-troubleshooting.md`](docs/windows-troubleshooting.md) for common setup gotchas.
|
||
- **Optional local agent CLI:** Claude Code, Codex, Devin for Terminal, Gemini CLI, OpenCode, Cursor Agent, Qwen, Qoder CLI, GitHub Copilot CLI, etc. If none are installed, use the BYOK API mode from Settings.
|
||
|
||
### Local agent CLI and PATH
|
||
|
||
The daemon scans your **`PATH`** (plus common user toolchain directories). If you install a CLI with **`npm install -g`** or **Homebrew** and Open Design still shows it as *not installed*, the GUI may be starting with a minimal `PATH` that does not include your global npm or Homebrew `bin` directory (common on macOS when the app is not launched from a full login shell). Ensure the executable’s directory is on `PATH` for the process that runs the daemon, then use **Rescan** in **Settings → Execution mode**.
|
||
|
||
`nvm` / `fnm` are optional convenience tools, not required project setup. If you use one, install/select Node 24 before running pnpm:
|
||
|
||
```bash
|
||
# nvm
|
||
nvm install 24
|
||
nvm use 24
|
||
|
||
# fnm
|
||
fnm install 24
|
||
fnm use 24
|
||
```
|
||
|
||
Then enable Corepack and let the repo select pnpm:
|
||
|
||
```bash
|
||
corepack enable
|
||
corepack pnpm --version # should print 10.33.2
|
||
```
|
||
|
||
## Docker Setup
|
||
|
||
Run Open Design in a fully containerised environment without installing Node.js or pnpm locally.
|
||
|
||
### Requirements
|
||
|
||
* Docker Desktop
|
||
* Docker Compose v2
|
||
|
||
Verify Docker is installed correctly:
|
||
|
||
```bash
|
||
docker compose version
|
||
```
|
||
|
||
---
|
||
|
||
## Start Open Design
|
||
|
||
From the repository root:
|
||
|
||
```bash
|
||
cd deploy
|
||
docker compose up -d
|
||
```
|
||
|
||
Open the app in your browser:
|
||
|
||
```text
|
||
http://localhost:7456
|
||
```
|
||
|
||
The first startup may take a few seconds while Docker pulls the latest image.
|
||
|
||
---
|
||
|
||
## Common Docker Commands
|
||
|
||
### View logs
|
||
|
||
```bash
|
||
docker compose logs -f
|
||
```
|
||
|
||
### Restart containers
|
||
|
||
```bash
|
||
docker compose restart
|
||
```
|
||
|
||
### Stop containers
|
||
|
||
```bash
|
||
docker compose down
|
||
```
|
||
|
||
### Pull the latest image
|
||
|
||
```bash
|
||
docker compose pull
|
||
docker compose up -d
|
||
```
|
||
|
||
### Remove all local app data
|
||
|
||
```bash
|
||
docker compose down -v
|
||
```
|
||
|
||
---
|
||
|
||
## Environment Configuration
|
||
|
||
Create a `deploy/.env` file to override the default configuration:
|
||
|
||
```env
|
||
# Port exposed on the host
|
||
OPEN_DESIGN_PORT=7456
|
||
|
||
# Container memory limit
|
||
OPEN_DESIGN_MEM_LIMIT=384m
|
||
|
||
# Allowed CORS origins
|
||
OPEN_DESIGN_ALLOWED_ORIGINS=https://yourdomain.com
|
||
|
||
# Docker image tag
|
||
OPEN_DESIGN_IMAGE=docker.io/vanjayak/open-design:latest
|
||
```
|
||
|
||
---
|
||
|
||
## Persistent Storage
|
||
|
||
Open Design stores projects and SQLite data inside a Docker volume:
|
||
|
||
```text
|
||
open_design_data
|
||
```
|
||
|
||
The volume is mounted to:
|
||
|
||
```text
|
||
/app/.od
|
||
```
|
||
|
||
Data persists across container restarts and image updates.
|
||
|
||
Inspect the volume:
|
||
|
||
```bash
|
||
docker volume inspect open-design_open_design_data
|
||
```
|
||
|
||
---
|
||
|
||
## Notes
|
||
|
||
* Docker mode is ideal for contributors who do not want a local Node.js or pnpm setup.
|
||
* The container exposes the production daemon build directly on port `7456`.
|
||
* For development workflows and advanced local setup, see the rest of this Quickstart guide.
|
||
|
||
---
|
||
|
||
## One-shot (dev mode)
|
||
|
||
```bash
|
||
corepack enable
|
||
pnpm install
|
||
pnpm tools-dev run web # starts daemon + web in the foreground
|
||
# open the web URL printed by tools-dev
|
||
```
|
||
|
||
For the desktop shell and all managed sidecars in the background:
|
||
|
||
```bash
|
||
pnpm tools-dev # starts daemon + web + desktop in the background
|
||
```
|
||
|
||
On first load, the app detects your installed code-agent CLI (Claude Code / Codex / Devin for Terminal / Gemini / OpenCode / Cursor Agent / Qwen / Qoder CLI), picks it automatically, and defaults to `web-prototype` skill + `Neutral Modern` design system. Type a prompt and hit **Send**. The agent streams into the left pane; the `<artifact>` tag is parsed out and the HTML renders live on the right. When it finishes, click **Save to disk** to persist the artifact under `./.od/artifacts/<timestamp>-<slug>/index.html`.
|
||
|
||
The **Design system** dropdown ships with 71 built-in systems — 2 hand-authored starters (Neutral Modern, Warm Editorial) and 69 product systems imported from [`awesome-design-md`](https://github.com/VoltAgent/awesome-design-md), grouped by category (AI & LLM, Developer Tools, Productivity, Backend, Design Tools, Fintech, E-Commerce, Media, Automotive). Pick one to skin every prototype in that brand's aesthetic, and another set of 57 design skills sourced from [`awesome-design-skills`](https://github.com/bergside/awesome-design-skills).
|
||
|
||
The **Skill** dropdown groups by mode (Prototype / Deck / Template / Design system) and shows the default skill per mode with a `· default` suffix. Bundled skills:
|
||
|
||
- **Prototype** — `web-prototype` (generic), `saas-landing`, `dashboard`, `pricing-page`, `docs-page`, `blog-post`, `mobile-app`.
|
||
- **Deck / PPT** — `simple-deck` (single-file horizontal swipe) and `magazine-web-ppt` (the `guizang-ppt` bundle from [`op7418/guizang-ppt-skill`](https://github.com/op7418/guizang-ppt-skill) — default for deck mode, ships its own assets/template + 4 references). Skills with side files get an automatic "Skill root (absolute)" preamble so the agent can resolve `assets/template.html` and `references/*.md` against the real on-disk path instead of its CWD.
|
||
|
||
Pair a skill with a design system and a single prompt produces a layout-appropriate prototype or deck in the chosen visual language.
|
||
|
||
## Other scripts
|
||
|
||
```bash
|
||
pnpm tools-dev # daemon + web + desktop in the background
|
||
pnpm tools-dev start web # daemon + web in the background
|
||
pnpm tools-dev run web # daemon + web in the foreground (e2e/dev server)
|
||
pnpm tools-dev restart # restart daemon + web + desktop
|
||
pnpm tools-dev restart --daemon-port 7457 --web-port 5175
|
||
pnpm tools-dev status # inspect managed runtimes
|
||
pnpm tools-dev logs # show daemon/web/desktop logs
|
||
pnpm tools-dev check # status + recent logs + common diagnostics
|
||
pnpm tools-dev stop # stop managed runtimes
|
||
pnpm --filter @open-design/daemon build # build apps/daemon/dist/cli.js for `od`
|
||
pnpm --filter @open-design/web build # build the web package when needed
|
||
pnpm typecheck # workspace typecheck
|
||
```
|
||
|
||
`pnpm tools-dev` is the only local lifecycle entry point. Do not use the removed legacy root aliases (`pnpm dev`, `pnpm dev:all`, `pnpm daemon`, `pnpm preview`, `pnpm start`).
|
||
|
||
During local development, `tools-dev` starts the daemon first, passes its port into `apps/web`, and `apps/web/next.config.ts` rewrites `/api/*`, `/artifacts/*`, and `/frames/*` to that daemon port so the App Router app can talk to the sibling Express process without CORS setup.
|
||
|
||
## Media generation / agent dispatcher checks
|
||
|
||
Image, video, audio, and HyperFrames skills call the local `od` CLI through environment variables injected by the daemon when it spawns an agent:
|
||
|
||
- `OD_BIN` — absolute path to `apps/daemon/dist/cli.js`.
|
||
- `OD_DAEMON_URL` — the running daemon URL.
|
||
- `OD_PROJECT_ID` — the active project id.
|
||
- `OD_PROJECT_DIR` — the active project's file directory.
|
||
|
||
If media generation fails with `OD_BIN: parameter not set`, `apps/daemon/dist/cli.js` missing, or `failed to reach daemon at http://127.0.0.1:0`, rebuild the daemon CLI and restart the managed runtime:
|
||
|
||
```bash
|
||
pnpm --filter @open-design/daemon build
|
||
pnpm tools-dev restart --daemon-port 7457 --web-port 5175
|
||
ls -la apps/daemon/dist/cli.js
|
||
curl -s http://127.0.0.1:7457/api/health
|
||
```
|
||
|
||
Then open the project from the Open Design app again instead of resuming an old terminal agent session. A daemon-spawned agent should see values like:
|
||
|
||
```bash
|
||
echo "OD_BIN=$OD_BIN"
|
||
echo "OD_PROJECT_ID=$OD_PROJECT_ID"
|
||
echo "OD_PROJECT_DIR=$OD_PROJECT_DIR"
|
||
echo "OD_DAEMON_URL=$OD_DAEMON_URL"
|
||
ls -la "$OD_BIN"
|
||
```
|
||
|
||
`OD_DAEMON_URL` must be a real daemon port such as `http://127.0.0.1:7457`, not `http://127.0.0.1:0`. The `:0` value is only an internal "pick a free port" launch hint and should not leak into agent sessions.
|
||
|
||
For the daemon-only production mode, the daemon serves the static Next.js export itself at `http://localhost:7456`, so no reverse proxy is involved.
|
||
|
||
If you place nginx in front of the daemon, keep SSE routes unbuffered and uncompressed. A common failure is the browser console showing `net::ERR_INCOMPLETE_CHUNKED_ENCODING 200 (OK)` after 80-90 seconds because nginx `gzip on` buffers chunked SSE responses even when the daemon sends `X-Accel-Buffering: no`.
|
||
|
||
```nginx
|
||
location /api/ {
|
||
proxy_pass http://127.0.0.1:7456;
|
||
|
||
proxy_buffering off;
|
||
gzip off;
|
||
|
||
proxy_read_timeout 86400s;
|
||
proxy_send_timeout 86400s;
|
||
proxy_http_version 1.1;
|
||
proxy_set_header Connection "";
|
||
|
||
proxy_set_header Host $host;
|
||
proxy_set_header X-Real-IP $remote_addr;
|
||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||
proxy_set_header X-Forwarded-Proto $scheme;
|
||
}
|
||
```
|
||
|
||
## Two execution modes
|
||
|
||
| Mode | Picker value | How a request flows |
|
||
|---|---|---|
|
||
| **Local CLI** (default when daemon detects an agent) | "Local CLI" | Frontend → daemon `/api/chat` → `spawn(<agent>, ...)` → stdout → SSE → artifact parser → preview |
|
||
| **API mode** (fallback / no CLI) | "Anthropic API" / "OpenAI API" / "Azure OpenAI" / "Google Gemini" | Frontend → daemon `/api/proxy/{provider}/stream` → provider SSE normalized to `delta/end/error` → artifact parser → preview |
|
||
|
||
Both modes feed the **same** `<artifact>` parser and the **same** sandboxed iframe. The only thing that differs is the transport and the system-prompt delivery (local CLIs have no separate system channel, so the composed prompt is folded into the user message).
|
||
|
||
## Prompt composition
|
||
|
||
For every send, the app builds a system prompt from three layers and sends it to the provider:
|
||
|
||
```
|
||
BASE_SYSTEM_PROMPT (output contract: wrap in <artifact>, no code fences)
|
||
+ active design system body (DESIGN.md — palette/type/layout)
|
||
+ active skill body (SKILL.md — workflow and output rules)
|
||
```
|
||
|
||
Swap the skill or the design system in the top bar and the next send uses the new stack. Bodies are cached in-memory per session so this is a single daemon fetch per pick.
|
||
|
||
## File map
|
||
|
||
```
|
||
open-design/
|
||
├── apps/
|
||
│ ├── daemon/ # Node/Express — spawns local agents + serves APIs
|
||
│ │ └── src/
|
||
│ │ ├── cli.ts # `od` bin entry
|
||
│ │ ├── server.ts # /api/* + static serving
|
||
│ │ ├── agents.ts # PATH scanner for claude/codex/devin/gemini/opencode/cursor-agent/qwen/qoder/copilot
|
||
│ │ ├── skills.ts # SKILL.md loader (frontmatter parser)
|
||
│ │ └── design-systems.ts # DESIGN.md loader
|
||
│ │ ├── sidecar/ # tools-dev daemon sidecar wrapper
|
||
│ │ └── tests/ # daemon package tests
|
||
│ ├── web/ # Next.js 16 App Router + React client
|
||
│ ├── app/ # App Router entrypoints
|
||
│ ├── src/ # React + TypeScript client/runtime modules
|
||
│ │ ├── App.tsx # orchestrates mode / skill / DS pickers + send
|
||
│ │ ├── providers/ # daemon + BYOK API transports
|
||
│ │ ├── prompts/ # system, discovery, directions, deck framework
|
||
│ │ ├── artifacts/ # streaming <artifact> parser + manifests
|
||
│ │ ├── runtime/ # iframe srcdoc, markdown, export helpers
|
||
│ │ └── state/ # localStorage + daemon-backed project state
|
||
│ ├── sidecar/ # tools-dev web sidecar wrapper
|
||
│ └── next.config.ts # tools-dev rewrites + prod apps/web/out export config
|
||
│ └── desktop/ # Electron runtime, launched/inspected by tools-dev
|
||
├── packages/
|
||
│ ├── contracts/ # shared web/daemon app contracts
|
||
│ ├── sidecar-proto/ # Open Design sidecar protocol contract
|
||
│ ├── sidecar/ # generic sidecar runtime primitives
|
||
│ └── platform/ # generic process/platform primitives
|
||
├── tools/dev/ # `pnpm tools-dev` lifecycle and inspect CLI
|
||
├── e2e/ # Playwright UI + external integration/Vitest harness
|
||
├── skills/ # SKILL.md — drops in from any Claude Code skill repo
|
||
│ ├── web-prototype/ # generic single-screen prototype (default for prototype mode)
|
||
│ ├── saas-landing/ # marketing page (hero / features / pricing / CTA)
|
||
│ ├── dashboard/ # admin / analytics dashboard
|
||
│ ├── pricing-page/ # standalone pricing + comparison
|
||
│ ├── docs-page/ # 3-column documentation layout
|
||
│ ├── blog-post/ # editorial long-form
|
||
│ ├── mobile-app/ # phone-frame single screen
|
||
│ ├── simple-deck/ # minimal horizontal-swipe deck
|
||
│ └── guizang-ppt/ # magazine-web-ppt — bundled deck/PPT default
|
||
│ ├── SKILL.md
|
||
│ ├── assets/template.html
|
||
│ └── references/{themes,layouts,components,checklist}.md
|
||
├── design-systems/ # DESIGN.md — 9-section schema (awesome-claude-design)
|
||
│ ├── default/ # Neutral Modern (starter)
|
||
│ ├── warm-editorial/ # Warm Editorial (starter)
|
||
│ ├── README.md # catalog overview
|
||
│ └── …129 systems # 2 starters · 70 product systems · 57 design skills
|
||
├── scripts/sync-design-systems.ts # re-import from upstream getdesign tarball
|
||
├── docs/ # product vision + spec
|
||
├── .od/ # runtime data (gitignored, auto-created)
|
||
│ ├── app.sqlite # projects / conversations / messages / tabs
|
||
│ ├── artifacts/ # one-off "Save to disk" renders
|
||
│ └── projects/<id>/ # per-project working dir + agent cwd
|
||
├── pnpm-workspace.yaml # apps/* + packages/* + tools/* + e2e
|
||
└── package.json # root quality scripts + `od` bin
|
||
```
|
||
|
||
## Troubleshooting
|
||
|
||
- **`better-sqlite3` fails to load / ABI mismatch after a Node.js version change** — `pnpm install` re-runs `postinstall` automatically and rebuilds the native addon for the current Node.js. To rebuild manually or verify the fix: `pnpm --filter @open-design/daemon rebuild better-sqlite3` then `pnpm --filter @open-design/daemon exec node -e "require('better-sqlite3')"`. Requires build tools: `python3`, `make`, `g++` (or `clang++`). If you have `ignore-scripts=true` in your `.npmrc`, run `node scripts/postinstall.mjs` after `pnpm install`.
|
||
- **"no agents found on PATH"** — install one of: `claude`, `codex`, `devin`, `gemini`, `opencode`, `cursor-agent`, `qwen`, `qodercli`, `copilot`. Or switch to API mode in Settings and paste a provider key.
|
||
- **Claude Code exits with code 1** — Open Design was able to start `claude`, but the spawned non-interactive run failed before producing a response. From the same shell or app environment that starts Open Design, check:
|
||
```bash
|
||
claude --version
|
||
claude auth status --text
|
||
printf 'hello' | claude -p --output-format stream-json --verbose --permission-mode bypassPermissions
|
||
```
|
||
If the smoke test reports `401`, `apiKeySource: "none"`, or another auth error without a custom endpoint, run `claude`, use `/login`, exit Claude, and retry Open Design. If you use multiple Claude profiles, set **Settings -> Execution mode -> Claude Code config directory** to the profile path such as `~/.claude-2`. If `ANTHROPIC_BASE_URL` or a proxy is set, check the endpoint URL, proxy credentials, endpoint auth environment, and model access; remove the custom endpoint only if you want to retry with standard Claude Code auth. On Windows, native PowerShell and WSL use separate Claude installs and credential stores; re-authenticate in the same environment Open Design uses, and check Windows Credential Manager if `/login` does not repair native Windows credentials.
|
||
- **daemon 500 on /api/chat** — check the daemon terminal for the stderr tail; usually the CLI rejected its args. Different CLIs take different argv shapes; see `apps/daemon/src/agents.ts` `buildArgs` if you need to tweak.
|
||
- **media generation says `OD_BIN` is missing or daemon URL is `:0`** — run the media dispatcher checks above. Do not resume the old CLI session; reopen the project from the Open Design app so the daemon can inject fresh `OD_*` variables.
|
||
- **Codex loads too much plugin context** — start Open Design with `OD_CODEX_DISABLE_PLUGINS=1 pnpm tools-dev` to make daemon-spawned Codex processes run with `--disable plugins`.
|
||
- **artifact never renders** — the model produced text without wrapping in `<artifact>`. Confirm the system prompt is going through (check daemon log) and consider switching to a more capable model or a stricter skill.
|
||
|
||
## Mapping back to the vision
|
||
|
||
This Quickstart is the runnable seed of the spec in [`docs/`](docs/). The spec describes where this grows (see [`docs/roadmap.md`](docs/roadmap.md)). Highlights:
|
||
|
||
- `docs/architecture.md` describes the shipped stack: Next.js 16 App Router in front, local daemon behind it, and `apps/web/next.config.ts` rewrites in dev to keep the browser talking to the same `/api` surface.
|
||
- `docs/skills-protocol.md` describes the full `od:` frontmatter (typed inputs, sliders, capability gating). This MVP reads `name` / `description` / `triggers` / `od.mode` / `od.design_system.requires` only — extend `apps/daemon/src/skills.ts` to add the rest.
|
||
- `docs/agent-adapters.md` foresees richer dispatch (capability detection, streaming tool-calls). Our `apps/daemon/src/agents.ts` is a minimal dispatcher — enough to prove the wiring.
|
||
- `docs/modes.md` lists four modes: prototype / deck / template / design-system. We ship skills for the first two; the picker already filters by `mode`.
|