skills/od-workflow/SKILL.md
Use this skill whenever a user wants the **full Open Design experience** — discovery questions asked first, brand-spec extraction from URLs/files, TodoWrite planning with live updates, 5-dimensional self-critique, polished artifact at the end. Trigger phrases include "design with questions first", "OD-style workflow", "full interactive design brief", "make me a complete landing page" (when the user wants quality over speed), "design my pitch deck", "brand-aware multi-page site", "follow the Open Design playbook", or any request where the user is starting a new design project rather than tweaking an existing artifact. Also trigger on any request that mentions wanting brand consistency across multiple pages or that provides a brand URL/spec. Pair with the `open-design-mcp` tool-reference skill — both loaded together give an LLM the full picture (this skill = workflow choreography; that skill = tool catalog + errors). This skill explicitly does NOT trigger for one-off tweaks ("make the nav stickier", "swap slide 3 image") — use od_generate_design directly for those.
npx skillsauth add nano-step/skill-manager od-workflowInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
A turn-by-turn Open Design playbook for OpenCode subagents. Transcribed from nexu-io/open-design (Apache 2.0; see ATTRIBUTION.md) and adapted to use this repo's od_* MCP tools.
open-design-mcp ships 10 stateless MCP tools. They're hands, not a brain. This skill is the brain: a multi-turn workflow that drives an LLM through OD's full design arc using a combination of OpenCode's native tools (TodoWrite / Read / Write / Bash / WebFetch / Glob / Grep) and our od_* MCP tools.
The architecture:
User: "Make me a SaaS landing page"
↓
OpenCode loads this skill (trigger keywords match)
↓
LLM follows the 3-rule playbook below
↓
Turn 1: ask discovery questions, stop
Turn 2: extract brand spec OR pick a direction
Turn 3+: TodoWrite plan → build → checklist → critique → emit artifact
↓
Result: a polished, consistent, briefed design
The MCP tools (od_create_project, od_generate_design, od_save_artifact, etc.) are primitives the LLM calls during turn 3+. This skill teaches the LLM when to call them and what to pass — not how the daemon works.
| Trigger | Examples | |---|---| | User starts a new design project | "make me a landing page", "design a pitch deck", "build a SaaS prototype" | | User mentions brand consistency | "match my brand", "all pages should look like one product" | | User provides brand context | "here's our brand URL", "match this screenshot" | | User wants full quality flow | "be thorough", "ask me questions", "do it properly" |
| Anti-trigger (use od_generate_design directly instead) | Examples |
|---|---|
| Tweaking an existing artifact | "make the nav stickier", "change the copy in section 2" |
| Single trivial section | "give me a 200-word hero copy block" |
| Pure render request | "generate the HTML for this exact spec" (no design decisions needed) |
These are the hard rules. They are not optional. The user is paying attention to speed of feedback; obeying these rules is what makes the workflow feel responsive instead of stuck.
Transcribed from upstream
discovery.ts:33-119(Apache 2.0). Full text in references/discovery-form.md.
When the user opens a new project or sends a fresh design brief, the very first output is one short prose line + a <question-form> block. Nothing else. No file reads. No Bash. No od_generate_design. No extended thinking. The form is the time-to-first-byte.
The form has 7 standard questions: output, platform, audience, tone, brand, scale, constraints. Exact JSON schema in references/discovery-form.md. Tailor the questions to the brief — drop defaults the user already answered, add fields the brief uniquely needs.
After </question-form>, stop the turn. Wait for [form answers — discovery] on the next user message.
Skip the form only in these narrow cases:
[form answers — ...] (already have answers)In OpenCode (no form-rendering UI): if the host environment does not render <question-form> markup as interactive UI, ask the same questions conversationally. The 7 questions are the same; the wire format is just chat text. See references/discovery-form.md §"How to ask these questions in an LLM-driven flow".
brand answerTranscribed from upstream
discovery.ts:121-151(Apache 2.0). Full text in references/brand-extraction.md.
Once the user submits the form (or the initial brief already answered the brand question), resolve the branch:
| Brand answer | Action |
|---|---|
| "brand_spec" or "reference_match" + a source URL/file provided | Branch A: run brand-spec extraction (5 steps below) |
| "brand_spec" or "reference_match" but no source provided | Ask the user to paste/upload the spec, then stop. Do NOT guess. |
| "pick_direction" or no brand answer | Branch B: pick the best-matching direction from references/direction-library.md. Do NOT emit a second direction-picking form. |
Branch A — 5-step brand extraction (each step is its own tool call):
WebFetch brand URLs (<brand>.com/brand, /press, /about).Bash grep -E '#[0-9a-fA-F]{3,8}' on CSS for hex colors. Eyeball screenshots for typography. Never guess colors from memory.Write brand-spec.md to the project root with 6 OKLch color tokens + display/body/mono font stacks + 3-5 layout posture rules. Template in references/brand-extraction.md.Then proceed to RULE 3.
Transcribed from upstream
discovery.ts:155-195(Apache 2.0). Full text in references/plan-and-critique.md.
Once the brand/direction is locked, the first tool call is TodoWrite with 5–10 short imperative items in the order to execute. The chat renders this as a live "Todos" card — it is the user's primary way to see the plan and redirect cheaply.
Standard plan template:
1. Read active DESIGN.md + skill assets (template.html, layouts.md, checklist.md)
2. (Branch A) Confirm brand-spec.md + bind to :root
(Active DESIGN.md) Bind active design-system tokens to :root
(Branch B) Pick a direction from the library, bind to :root
3. Plan section/slide/screen list with platform variants and rhythm
4. od_create_project { id: "<short-slug>", name, customInstructions: <brand spec> } (if no projectId yet — `id` is REQUIRED, regex `/^[A-Za-z0-9._-]{1,128}$/`)
5. For each section/screen: od_generate_design { projectId, prompt, maxTokens? }
6. Replace any [REPLACE] placeholders with real, specific copy from the brief
7. Self-check: run the P0 anti-AI-slop checklist (every P0 must pass)
8. 5-dim critique: philosophy / hierarchy / execution / specificity / restraint; fix any dimension < 3/5
9. od_lint_artifact { html: <full HTML> } + od_save_artifact { identifier, title, html } for each section
9b. (optional) od_save_project_file { projectId, name: "index.html", content: <html> } to save the file inside the project so it renders in the daemon UI (use instead of or in addition to od_save_artifact; see "od_save_project_file vs od_save_artifact" below)
After TodoWrite, immediately mark step 1 in_progress. As each step completes, update — do NOT batch updates at the end of the turn; the live progress is the point.
Step 7 (checklist) and Step 8 (critique) are non-negotiable. Full guidance in references/plan-and-critique.md.
| OD upstream tool | What it does | OpenCode equivalent | Our MCP equivalent |
|---|---|---|---|
| TodoWrite | Live planning UI | OpenCode's todowrite tool | — |
| Read | Read filesystem | OpenCode's read tool | — |
| Write | Create file | OpenCode's write tool | — |
| Edit | Modify file | OpenCode's edit tool | — |
| Bash | Shell exec | OpenCode's bash (prefix rtk for read/git) | — |
| WebFetch | Fetch URL | OpenCode's webfetch | — |
| Glob / Grep | File / content search | OpenCode's glob / grep | — |
| prompt_formatter_compose_brief | Format Turn 3 prompt | — | od_compose_brief |
| live_artifacts_create | Create artifact | — | od_generate_design → od_save_artifact { identifier, title, html } (global store, NOT project-scoped) |
| live_artifacts_update | Update artifact | — | od_save_artifact (same identifier → new timestamped dir) |
| live_artifacts_list | List artifacts | — | od_get_project (note: returns project's files, NOT global artifacts saved via od_save_artifact) |
| — | Save file inside project | — | od_save_project_file { projectId, name, content } (project-scoped; appears in od_get_project.files[]) |
| connectors_list / connectors_execute | OAuth data extraction | NOT AVAILABLE — ask user for data manually | — |
After issue #37 (PR #40) shipped, od_generate_design accepts an optional projectId. When provided, it auto-fetches the project's stored customInstructions and merges them into the system prompt. Pair this with the playbook:
od_create_project { id: "<short-slug>", name, customInstructions: <brand spec from step 2> } → returns projectId (the id you supplied)od_generate_design { projectId, prompt: "...page brief..." } — brand auto-inheritedod_generate_design accepts optional maxTokens (default 64000) — increase for very long pages, decrease for short snippets.See references/workflow-examples.md for a fully-worked multi-page transcript.
Note: customInstructions is stashed in metadata.customInstructions on create/update and read from there first on generate (daemon compat, #43). This is transparent to callers.
Transcribed from upstream
discovery.ts:221-232(Apache 2.0).
Audit before emitting any artifact. Any ❌ found → fix before od_save_artifact.
When you don't have a real value, leave a short honest placeholder (—, a grey block, a labelled stub). An honest placeholder beats a fake stat. Full slop checklist + the 8 other design philosophy principles in references/design-philosophy.md.
Invoking from a parent OpenCode session. When the parent LLM detects this skill's trigger, it has two paths:
Option A — Inline execution (single-LLM, multi-turn chat):
Option B — Subagent delegation (recommended for full quality flows):
task(
subagent_type="deep",
load_skills=["od-workflow", "open-design-mcp"],
prompt="<user's original design brief>",
run_in_background=false,
)
open-design-mcp — the tool-reference skill. Catalog of 10 tools, env-var setup, error diagnosis, individual workflows (list / get / create / update / delete / compose-brief / generate / lint / save-artifact / save-project-file). Load this together with od-workflow for the full picture.README.md — human-facing tool list + installationdocs/architecture/generate-design-flow.md — deep technical reference for od_generate_design internalstools
Humanization layer for LLM conversation — makes the model sound and respond like a real, thoughtful, embodied human rather than an assistant or chatbot. Use whenever the reply will be read by a human and warmth, presence, or texture matter more than machine-readability. Triggers on any of: "human", "humans", "humanize", "humanization", "be human", "more human", "feel human", "people", "person", "real person", "real human", "friend", "friendly", "like a friend", "respond like a friend", "buddy", "talk", "talking", "talk to me", "talk like a person", "chat", "chatting", "conversation", "converse", "discuss", "discussion", "communication", "communicate", "listen", "just listen", "sit with me", "vent", "venting", "I just want to vent", "company", "presence", "stop being an AI", "stop sounding like a bot", "less corporate", "less robotic", "less formal", "warmer", "warm tone", "empathy", "empathetic", "comfort", "support me", "emotional support", "be honest with me", "be real with me", "real talk", "heart-to-heart", "deep conversation", "casual", "casual chat", "small talk", "chitchat", "say something", "tell me something", and on any emotional / relational / personal-decision / interpersonal context — grief, joy, anger, fear, shame, doubt, loneliness, dating, breakup, conflict, family, parents, sibling, friendship, marriage, divorce, in-laws, kids, parenting, work stress, burnout, career decision, quitting, firing, layoff, anxiety, depression, panic, sleep, dreams, identity, faith, doubt, meaning, mortality, celebration, milestone, achievement, gratitude, apology, forgiveness. Also loads when the user writes in non-English (any language) with emotional weight, when the user's message is shorter than 8 words and affect-laden, when the user types in lowercase fragments, when the user types in ALL CAPS with excitement, or when the user explicitly asks for a friend / mentor / older-sibling / wise-listener voice. Do NOT use for code generation, tool calls, structured data output, SQL, API contracts, or any task where machine-readability matters more than human warmth.
tools
Use this skill whenever the user mentions open-design, od_generate_design, OD daemon, BYOK design generation, generating HTML mockups from a PRD, creating or managing Open Design projects, saving design artifacts, linting generated HTML, or any of the 10 `od_*` MCP tools (od_list_projects, od_get_project, od_create_project, od_update_project, od_delete_project, od_save_artifact, od_save_project_file, od_lint_artifact, od_compose_brief, od_generate_design). Also trigger on phrases like "generate a design", "create a mockup", "make a landing page", "list my OD projects", "the design daemon", "the streaming design tool", and on any 401/404/422 error coming from an `od_*` tool call. Covers env-var setup (`OD_DAEMON_URL`, auth modes, BYOK), the full PRD → generate → save → lint workflow, error diagnosis, and the safety rails (lint before save, never commit BYOK keys). Triggers even if the user doesn't explicitly say "open-design-mcp" — keyword matches on `od_*` tool names or "design generation" workflows are enough.
development
Sync a locally-developed OpenCode skill to the skill-manager npm package and (if private) the private-skills GitHub repo. Handles per-skill version bumps, public/private classification, build verification, and conventional-commit-style git push. Auto-publish to npm is handled downstream by nano-step/shared-workflows@v1 when the push to master lands. Use this skill whenever the user says 'sync skill', 'publish skill', 'push skill to manager', '/sync-skill-to-manager <name>', or asks to release/distribute a skill they just edited.
testing
--- name: rri-t-testing description: RRI-T QA methodology skill. Execute 5-phase testing: PREPARE, DISCOVER, STRUCTURE, EXECUTE, ANALYZE. Use before release, creating test cases, QA review, or when asked to 'test this feature', 'create test cases for', 'run QA on', 'check coverage for', 'find edge cases in', or 'does this feature work correctly'. Covers 7 dimensions and 5 personas with Vietnamese-specific locale testing built in. --- # RRI-T Testing Skill Execute comprehensive QA testing using