AutoGineer summary
Written by AutoGineer from the skill’s own files, not by the author
Visual-plan is a structured planning framework for coding agents that moves beyond simple chat-based text. It enables the creation of rich, reviewable documents that include inline diagrams, file maps, annotated code, and interactive UI surfaces. By using a dedicated Plan MCP connector, it provides a persistent, shareable, and annotatable workspace for complex tasks, ensuring that architecture, UI, and product decisions are clearly communicated and approved before implementation begins.
What it does
- Converts text-based plans into interactive visual documents.
- Supports multiple review modes including UI-first, prototype-first, and design-first.
- Integrates wireframes, diagrams, and code snippets directly into the plan.
- Provides a structured format for open questions and decision tracking.
- Enables collaborative feedback loops via a hosted Plan surface.
- Maintains a clear separation between planning and implementation phases.
When to use it
- For non-trivial tasks requiring alignment on architecture, data flow, or UI direction.
- When a plan needs to be shared, reviewed, or approved by stakeholders.
- For UI-heavy work where visual wireframes or prototypes clarify the user experience.
- When an existing text plan needs to be elevated into a richer, more structured artifact.
- For complex, multi-file, or risky projects that benefit from visual documentation.
Advantages
- Creates a single, persistent source of truth for project direction.
- Reduces ambiguity by providing visual context for abstract concepts.
- Facilitates structured feedback and approval before writing code.
- Improves clarity for complex architecture and data-model decisions.
- Keeps documentation and visual mockups tightly coupled with the plan.
Usage examples
- “Create a visual plan for the new user onboarding flow.”
- The agent generates a structured plan with a top-level canvas showing wireframes for each onboarding step, followed by a document detailing the implementation logic.
- “I have a text plan for the backend API refactor, can you turn it into a visual plan?”
- The agent imports the existing text, structures it into a formal plan with diagrams and API-endpoint blocks, and publishes it to the Plan surface for review.
Install
Download the skill as a ZIP:
https://autogineer.com/agent-skills/builderio/visual-plan/downloadUnzip it into the cross-client skills folder of your project:
mkdir -p .agents/skills && unzip visual-plan.zip -d .agents/skills
Documentation by Builder.io
Agent-Native Plans
Agent-Native Plans is structured visual planning mode for coding agents. Build the plan you would normally write in Markdown, but as a scannable document with editable blocks mixed in: inline diagrams, code snippets, open questions, and an optional top visual review area (wireframe canvas, live prototype, or both in tabs). Architecture and backend plans stay document-only; UI and product plans start with the top canvas/prototype (the Visual Surface Choice section owns that rule).
/visual-plan is the packaged command and main entry point. Choose the review
mode from the task: UI-first when the work is primarily product UI and review
should start with screens, prototype-first when review should start with a
functional live prototype, design-first when review needs full-fidelity branded
screens, or visual-intake when the user explicitly wants a questionnaire before
planning. When a Codex, Claude Code, Markdown, or pasted plan already exists,
/visual-plan uses that source plan as the starting point and builds the review
surface from it instead of starting over.
When To Use
Create or adapt a visual plan whenever the plan would be better as a reviewable artifact than a chat paragraph. This includes modest work such as a single UI surface with states, a small workflow, a before/after product change, or a component/API/data-shape decision that needs alignment, plus larger multi-file, ambiguous, long-running, risky, or UI-heavy work. Use it when architecture / data flow / UI direction / options / open questions would benefit from inline diagrams or structured blocks, when the user needs to react to a direction before you implement, or when an existing text plan needs a richer review surface.
Plan Discipline
Gate thoughtfully. A visual plan is a richer review surface, not only a tool for giant projects. Use it when the user needs to see, compare, comment on, or approve a direction before code, even for a modest UI/state/workflow change. Skip it for truly trivial, unambiguous work — typos, one-line fixes, a single well-specified function, anything whose diff you could describe in one sentence — and just make the change. Never pad a plan with filler and never ship a single-step plan.
Research before you draft. Read the real files, actions, schema, and patterns first; name actual files, symbols, and data shapes instead of inventing them. Check existing
actions/before proposing endpoints and prefer named client helpers over raw fetch. Delegate wide exploration to a sub-agent. Lead with reuse: for each step, name what it reuses — existing actions, schema, components, helpers — before what it adds, so the plan explains the genuinely new delta instead of redescribing what already exists.Decide the hard-to-reverse bets first. For non-trivial backend, data, or API work, sketch where the feature is headed, then call out the decisions that are expensive to undo once data or callers depend on them — wire format, public ids, data-model shape, auth and ownership boundaries — and get those right in the plan even if most of the feature ships later. Then scope to the smallest first cut that proves the approach without foreclosing it, stating both what is in and what is explicitly deferred.
Keep examples at the right altitude. When the user's idea is a broad framework, product, or operating-model change, do not collapse it into the first concrete example, provider, or sync path they mention. Separate the core abstraction from motivating examples and app/provider adapters. Use examples to make the plan legible, but label them as examples unless they are the whole requested scope.
Publish standalone plans. If the user pasted, referenced, or already has a Codex / Claude Code / Markdown plan, treat it as source material, but rewrite the published plan as a clean standalone proposal. Preserve the source plan's useful intent and codebase facts, label inferred visuals as inferred, and avoid revision language such as "preserve the prior plan", "do not drop the old idea", "unlike the previous version", or "this revision changes...". A reader who never saw the chat or earlier drafts should understand the plan.
Make the first read concrete. If the plan is meant to be shared with someone outside the chat, or if the concept is abstract, lead near the top with one concrete product example before mode tables, architecture, or roadmaps. For UI-capable concepts, that usually means a top-canvas app state that shows the real user workflow in product terms. Do not rely on phrases that only make sense in conversation, and do not frame the plan as "not the old idea"; state the positive model directly.
Planning is read-only. Make no source edits while building or reviewing the plan. Start editing only after the user approves the direction.
Clarify vs. assume. Do not ask how to build it — explore and present the approach and options in the plan. Ask a clarifying question only when an ambiguity would change the design and you cannot resolve it from the code; use the host agent's normal ask-user-question flow and batch 2-4 high-leverage questions before finalizing. Do not call
create-visual-questionsfor ordinary clarification or preflight; reserve it for the visual-intake mode when the user explicitly asks for a visual intake questionnaire. Otherwise state the assumption explicitly and proceed, and keep anything unresolved in the plan's single bottomquestion-formOpen Questions block. For complex plans, do a final open-question pass before handoff: if a decision would affect architecture, scope, UX, data shape, or rollout, either decide it in the plan with rationale or put it in that bottom form with a recommended default.The plan is the approval gate. After surfacing it, ask the user to review and approve before you write code, and name which files/areas the work touches. Presenting the plan and requesting sign-off is the approval step — do not ask a separate "does this look good?" question.
The document is the source of truth, not the chat. When scope shifts, update the plan with
update-visual-planrather than only changing course in chat, and make the updated document stand alone. Do not describe the update as a correction to an earlier draft inside the plan itself. Re-read the approved plan before major steps.
Create A Structured Agent-Native Plan — Never Inline
The deliverable is ALWAYS a structured Agent-Native Plan, not a chat-only plan.
The hosted Plan MCP connector (plan server, or legacy agent-native-plans) is
the default collaboration and commenting surface; it is not a reason to reject
the planning pattern as an external dependency or rented layer. Plans are
portable source artifacts (plan.mdx, optional canvas.mdx /
prototype.mdx, JSON, and HTML export), and ownership-sensitive workflows can
use local-files mode or a self-hosted/custom Plan app URL without abandoning the
skill's review discipline. Do not advise the user to skip /visual-plan because
the default surface is hosted; choose the right Plan mode for the user's
ownership, privacy, sharing, and branding needs.
By default, create the plan via the Plan MCP connector and NEVER hand it over as
inline chat content — no Markdown prose, ASCII sketch, table, or fenced
wireframe. If the plan (or legacy agent-native-plans) tools are not visible,
discover them through the host's tool_search first; if they are still missing,
STOP and give the user the client-specific reconnect step rather than improvising
an inline plan. Before publishing, or whenever a connector or auth error appears,
READ references/connection.md in this skill directory — it is the single source
of truth for the never-inline rule, connector discovery, and the per-client
reconnect steps. Local-files privacy mode (after Tool Guidance) is the exception.
Core Workflow
This section describes the default hosted Plan MCP workflow. If
AGENT_NATIVE_PLANS_MODE=local-files is set, or the user asks for fully local
files/no hosted Plan writes, use Local-Files Privacy Mode instead; carry
forward only the code-research and plan-composition guidance here.
Follow the host agent's normal planning flow: inspect the codebase, delegate wide exploration when useful, gather the info needed, and ask native clarifying questions as needed before generating the plan. If a source plan already exists, gather its exact text from the user's paste, a referenced file, or recent visible agent context; do not invent source text.
Call
get-plan-blocksfor the authoritative block catalog — do not author from memorized tags. Then call the mode-matched create tool:create-visual-planfor document-first plans (architecture, backend, data, refactor, API),create-ui-planfor UI-first plans,create-prototype-planfor prototype-first plans,create-plan-designfor design-first plans,create-visual-questionsonly when the user explicitly asks for a visual intake questionnaire. When a source plan already exists, pass it asplanTextand preserve the original plan's useful intent while producing a standalone plan document, not a revision memo.For UI/product plans, compose the top canvas first with the primary wireframes and annotated states, then write the document with native blocks (see
references/canvas.mdandreferences/document-quality.md). For broad product architecture plans with a user-facing implication, add a concrete "what this looks like in the app" visual before the abstract architecture or mode tables. Keep the document close to the standalone Markdown plan the agent would normally output. If an existing plan was provided, carry forward the right facts and decisions without referring to the previous draft or explaining how this version differs. For non-visual plans, skip the top visual surface (Visual Surface Choice below owns the rule) and putdiagram,data-model,api-endpoint,diff,file-tree,code, andannotated-codeblocks directly next to the relevant prose. Wide document layout is renderer-owned and intentionally allowlisted: only literal code-review surfaces (diff,annotated-code) andtabsblocks with vertical orientation or diff-like children break out wider than prose. Keepapi-endpoint,openapi-spec,data-model,json-explorer,wireframe, question, andcustom-htmlblocks in normal document flow unless their own renderer says otherwise.Surface the returned Plans link or inline MCP App and ask the user to review. Always include the actual URL in chat so the next step is a click in CLI or other text-only hosts. When the host exposes an embedded browser/preview panel and a tool can open arbitrary URLs there, open the returned plan URL automatically for convenient review — a convenience and smoke test, never the only handoff or the access model. Plans should load out of the box for the local agent and local browser session; if a signed-in embedded browser cannot read a local plan that an anonymous/tool check can read, fix the app/action ownership or access path rather than patching one plan by hand. For high-stakes plans (architecture, backend, data, multi-file, or risky), also kick off the self-review pass in Self-Review Before Handoff while the user reads, instead of blocking the handoff on it.
For hosted plans, call
get-plan-feedbackbefore editing, after review, after any long pause, and before the final response. TreatanchorDetails, resolver intent, recent review events, and any focused screenshots from browser handoff as the source of truth for exactly what changed and exactly what each comment points at.For hosted plans, apply changes with
update-visual-plan, preferring targetedcontentPatches. Treat the top-levelcontentpayload as a full replacement, not a merge; do not send a partialcontentobject to add a canvas or one block. If a full replacement orreplace-blocksis unavoidable, callget-visual-planimmediately before the write, pass itsplan.updatedAtasexpectedUpdatedAt, and carry forward every existing block and visual surface. Never reuse a revision from an earlier read or feedback payload. For source-control friendly edits, use granularpatch-visual-plan-sourceoperations against the MDX files instead of regenerating the plan;replace-fileis also destructive and requires the same freshexpectedUpdatedAtfence.After every hosted-plan write, call
get-visual-planagain and compare the persisted text, block IDs/counts, canvas frames, and prototype with the intended result. A successful mutation response is not proof that unrelated content survived. If the edit addressed agent-targeted feedback, only after this verification callresolve-plan-commentfor the thread andconsume-plan-feedbackfor its comments; do both so addressed feedback is neither visibly open nor returned as pending work.For hosted plans, export with
export-visual-planonly when the user wants a shareable receipt or repo-check-in artifacts.
Self-Review Before Handoff
This adversarial self-review pass is opt-in, not default: run it only for high-stakes plans — irreversible migrations, security-sensitive work, or when the user explicitly asks for extra rigor — and skip it otherwise. It roughly doubles the cost of plan generation, so the default for small, UI-only, single-decision, or ordinary plans is to skip it, not to run it. Keep the pass cheap and non-blocking when it does run:
Surface the plan first, review concurrently. Post the link and let the user start reading, then run the review in parallel — never make the user wait on it.
Review the written plan; do not re-research. Critique the plan text and its own blocks. The grounding was already done while drafting, so the review checks the output instead of re-exploring the repo.
Spawn one skeptical reviewer whose only job is to find what is weak, missing, or wrong — not to praise. Point it at: hard-to-reverse decisions made implicitly or not at all (wire format, public ids, data-model shape, auth, ownership); steps not anchored in real files or symbols; a menu of options where the plan should commit to one; obvious missing decisions ("what happens when X?", "why not Y?"); and padding or single-step filler.
Fix vs. ask. Apply clear-cut fixes yourself with
update-visual-plancontentPatches— vague non-goals, unanchored claims, an obvious missing decision. Route genuine judgment calls back to the user instead: add them to the bottomquestion-formOpen Questions block or batch them into the normal ask-user-question flow. Do not silently decide them.Do not surprise the user mid-read. On a large plan, apply the patches before the editor loads; otherwise note briefly that a self-review is running so the plan changing under them is expected. When you next respond, summarize what the review changed and what it surfaced for the user to decide.
Visual Surface Choice
Choose the surface before creating the plan or after reading the source plan. Do not add visual chrome by default:
For UI/product plans, the top canvas is usually the primary review surface. Put
the first meaningful wireframes there, not buried as document-body blocks. Use
multiple canvas artboards when states matter, such as the default view, an
overflow menu or popover, a side panel, loading, or error. Put short annotations
beside frames with targetId plus placement; keep implementation details,
tradeoffs, file maps, data contracts, risks, and verification in the document
body below the canvas.
When the user asks for a flow, storyboard, journey, wireframe, canvas, or "what
this looks like", treat that as a canvas-first request. Make one artboard per
user-visible state, connect only adjacent transitions, and use short canvas
annotations for the product notes. Do not substitute a document-body diagram
block for the requested storyboard just because HTML diagrams are faster to
write; diagrams belong below the canvas for backend mechanics, architecture, or
data-flow explanation.
Keep product wireframes and explanatory/meta diagrams separate. Start with pure screens that look like the app state under discussion, without callout prose or architecture notes embedded inside the UI. Put arrows, labels, contracts, data flow, and mode explanations in separate annotations, separate canvas diagrams, or the document body.
When the plan touches an existing app, inspect the current shell/components before drawing. The first artboard should look like the real app at the same density: existing sidebars, toolbar placement, overflow menus, app chrome, and framework agent chrome stay in their real places. Model secondary surfaces as separate states, such as a top-right overflow popover, sheet, panel, loading state, or separate AgentSidebar, rather than inventing a permanent inspector or folding framework chrome into the product UI.
No visual surface for architecture-only, backend-only, data migration, copy-only, or otherwise non-visual plans. Do not use the top canvas for architecture diagrams, dependency maps, file plans, API contracts, or data-flow-only reviews. Use a strong document with local inline diagrams only when relationships need a visual explanation, usually one spatial diagram per recommendation or decision. Prefer grouped regions, layers, quadrants, matrices, or before/after panels over a single-axis chain unless the relationship is truly sequential.
Canvas only for one static screen, a before/after comparison, a component state, a small popover, or a visual direction that does not require clicking. Put those wireframes in
content.canvasand omitcontent.prototype.Canvas + prototype for multi-step UI flows, onboarding, wizards, review/approval flows, navigation changes, or anything where the reviewer needs to operate the behavior. Keep the static wireframes in
content.canvas, add the aligned functional prototype incontent.prototype, and rely on the top visual tabs to switch between them. When both surfaces are present, open the Wireframes tab by default; the prototype remains available as the interactive follow-up view.Default to wireframes. A clean, minimal UI, a high UX bar, or references to Linear/Vercel describe the content and density bar; they do not request full-fidelity design mode. Use renderer-owned wireframes unless the user explicitly asks for branded, pixel-accurate, production-like, or full visual design. This keeps every canvas screen inspectable and its full content visible.
Prototype-first when the user asks to operate the UI or when interaction is the main question. Use
create-prototype-plan, which still preserves static mocks where useful.
For mixed canvas + prototype plans, reuse labels and IDs; patch surfaces together unless explicitly single-surface. For output audits, read the observability skill: support single-app and workspace tables, preserve app previews, and keep audit, synthesis, diffs, and applying changes admin-gated.
Treat “higher fidelity,” “pixel-accurate,” “polished mockup,” “production-like,”
“real design,” and “not a sketch/wireframe” as design-first language even when
the request also says “mockup.” For a new plan, use create-plan-design. For
an existing plan, keep the same plan id and call update-visual-plan with a
set-visual-render-mode patch using renderMode: "design" plus the upgraded
screen HTML/CSS in the same update. Ground the result in the real app shell,
tokens, typography, spacing, and states, and add stable data-design-id
targets. Put scoped styles in each screen's css field, never in a <style>
tag. The viewer-local Clean toggle only changes one browser's wireframe
preference; it is not a fidelity upgrade. Do not create a duplicate plan to
handle a fidelity follow-up.
Wireframe quality — read references/wireframe.md
UI recap/plan wireframes must meet a strict quality bar — full-width chrome,
pinned bottom bars, real product content, before/after comparability, the right
surface preset, --wf-* tokens instead of hex, and no <html>/<style>/font
tags. Before authoring ANY wireframe / <Screen> / WireframeBlock, READ
references/wireframe.md in this skill directory — it is the single source of
truth for HTML wireframe quality, shared word for word with /visual-plan
and /visual-recap. Do not author wireframes from memory.
Canvas — read references/canvas.md
The canvas is the single source of truth for static UI mockups: the surface
locks each artboard's footprint, mixed surfaces lay out
in lanes, annotations are plain-text designer notes anchored by
targetId/placement, and edits are surgical contentPatches. Before
authoring or editing ANY canvas, artboard, or annotation, READ
references/canvas.md in this skill directory — it is the single source of truth
for canvas/artboard mechanics. Do not author canvas layouts from memory.
Canvas artboards use the same HTML wireframe path as document-body
WireframeBlock screens: author <Screen surface="..." html={...} /> with a
semantic HTML fragment. Do not author fresh kit-tree children such as
<FrameScreen>, <Card>, <Row>, or <Btn> inside canvas <Screen> tags;
those are legacy compatibility markup for old plans and produce brittle canvas
layouts.
Document quality — read references/document-quality.md
The document is a serious technical plan, not marketing: outcome-first,
prose-first, self-contained, built from the right native blocks, with open
questions in a single bottom question-form and a pre-handoff visual check.
Before authoring the plan document, READ references/document-quality.md in this
skill directory — it is the single source of truth for the document quality bar.
Do not write the document from memory.
Good vs. bad exemplar — read references/exemplar.md
For a worked example of the bar — a great UI-first plan and /visual-plan, plus
the anti-patterns to avoid — READ references/exemplar.md in this skill
directory before authoring a plan.
Authoring invariants
Treat these as data-integrity checks, not optional polish:
contentis a complete replacement. Pass eithercontentor the mode's convenience arrays (screens/transitionsorstates/components), never both. The create actions reject mixed sources so a second payload cannot silently discard CSS, frames, or document blocks.A design screen's scoped
cssis part of the artifact. Keep it on both the prototype screen and its matching canvas frame, and use renderer-owned--wf-*tokens for portable color and typography.Rich-text
data.markdownmust contain actual runtime line breaks. Do not hand a plan a one-line Markdown value containing literal\nescape text, which renders the whole section as one heading. Escaped newlines are fine in code examples when the surrounding Markdown still has real line breaks.Canvas artboards do not scroll. Keep wireframe HTML in natural flow and set a larger frame
heightwhen a screen exceeds the surface preset; preserve the surface width and inspect the bottom edge at default zoom before handoff.After every hosted write, re-read the structured content and inspect the live Plan surface. A valid JSON payload is not proof that CSS loaded or Markdown rendered into the intended heading, paragraph, and list structure.
Tool Guidance
create-visual-plan: start one structured visual plan per agent task/run, or import an existing text plan by passingplanText;contentmay include no visual surface, canvas only, or canvas + prototype.create-ui-plan: start a UI-first plan when the work is primarily product UI.create-prototype-plan: start a prototype-first plan with a functional top review surface. If the interaction itself must also be high fidelity, set each screen'srenderModetodesignand pass scoped styles throughcss; otherwise usecreate-plan-designfor design-first review.create-plan-design: start a full-fidelity branded Design-tab plan with an optional matching Prototype tab.convert-visual-plan-to-prototype: convert an existing HTML wireframe canvas into a prototype plan.create-visual-questions: use only when the user explicitly asks for a visual intake questionnaire, not as/visual-planpreflight.update-visual-plan: revise content, status, or comments with targetedcontentPatches(see Core Workflow steps 6-7). Useset-visual-render-modewithrenderMode: "design"when promoting an existing plan to high fidelity, together with deliberate screen HTML/CSS; render mode alone only removes sketch treatment.replace-blocksand fullcontentreplacement requireexpectedUpdatedAtfrom a freshget-visual-plancall.read-visual-plan-source: read the normalized plan asplan.mdx, optionalcanvas.mdx, optional.plan-state.json, and JSON.patch-visual-plan-source: apply granular MDX AST patches by stable block, artboard, annotation, component, or wireframe-node id. Prefer those targeted operations;replace-filerequiresexpectedUpdatedAtfrom a freshget-visual-plancall.import-visual-plan-source: create or replace a plan from an MDX folder.get-visual-plan: read the current structured plan, exported HTML, annotations, andplan.updatedAt; it also returns the MDX folder for source workflows. Re-read immediately before a destructive write for its concurrency fence and again after every write to verify persisted state.get-plan-feedback: read unconsumed human feedback. Use it frequently; it returns grouped threads, exact anchor details, expected resolver, and recent review-event payloads so agents can act only on the comments meant for them.get-plan-blocks: resolve block tags before authoring — do not memorize tags; call this first to get the authoritative tag names, required fields, and prop shapes from the live block registry.export-visual-plan: export HTML, Markdown fallback, structured JSON, and MDX files for repo check-in.
When the user critiques a plan's look or structure, fix the renderer or this skill — never hand-edit one stored plan. Turn feedback into better guidance.
Local-Files Privacy Mode — read references/local-files.md
When the user wants no hosted Plan database writes — no DB writes, no Plan MCP
publish, fully local/offline/private planning, repo-owned source-controlled
artifacts, or AGENT_NATIVE_PLANS_MODE=local-files — do not call any hosted Plan
tool except the schema-only get-plan-blocks catalog lookup. Author a local MDX
folder and
preview it with plan local check / plan local serve / plan local verify.
Before using local-files mode, READ references/local-files.md in this skill
directory — it is the single source of truth for the full contract (catalog
lookup, MDX folder layout, the local bridge commands, and the hosted tools you
must not call). Carry forward only the code-research and plan-composition
guidance from Core Workflow; everything hosted is replaced by the local bridge.
Interpreting comment anchors
This section applies to hosted plans with get-plan-feedback /
update-visual-plan. In local-files mode, do not call hosted feedback or update
tools; interpret file/chat feedback directly, edit the MDX files, rerun the
local bridge check/serve/verify command, and report the new local URL.
get-plan-feedback returns rich anchors — read them before acting on any comment.
Coordinate frames.
targetX/targetYare percentages within the element named bytargetSelector/targetKind. Barex/yare percentages of the whole plan document.canvasX/canvasYare raw board-world pixels on the design canvas (board size given when available).Wireframe pins. Anchors on wireframes include
targetNodeIdandtargetNodePath(e.g.card > list > listItem "Acme Inc") identifying the exact kit node. UsetargetNodeIddirectly with wireframe node patch ops; usedata-design-idvalues from design artboards withupdate-design-element-style. Prefer the node id/path over raw coordinates; fall back to coordinates plus the focused screenshot (red ring marks the exact point) only when no node id is present.Text quotes. Resolve
textQuoteagainst current prose usingcontextBefore/contextAfterfor disambiguation. Ifambiguous: true, ask the user — do not guess which occurrence is meant.Detached comments.
get-plan-feedbackflags threads whose quoted text no longer exists asdetached(indetachedThreads). Reconcile these against rewritten content — never silently drop them.Routing.
resolutionTargetis the only routing signal: act onagent, treathumanas context only.@mentionsare people to notify, never a routing signal.Two-axis state. Mark every ingested comment as consumed (
consumedCommentIdsonupdate-visual-plan). Setstatus=resolvedonly on agent-targeted comments you actually addressed; leave human-targeted comments open. When an edit addresses feedback, first re-read the persisted plan and verify the requested change. Only then callresolve-plan-commentfor the addressed thread andconsume-plan-feedbackfor its comments; never mark addressed feedback along only one axis.
Visibility & Sharing
Use set-resource-visibility to change who can see a plan (e.g. public, login,
or org-scoped). Use share-resource to grant specific users or roles access
by email or role. Gate visibility before sharing any plan that covers
unreleased or private work — default to the narrowest scope that meets the
review need.
Setup & Authentication
There are two ways into Plans.
Coding agent (CLI). Install once with the Agent-Native CLI. The command installs the Plans skills, registers the hosted Plans MCP connector, and runs auth/setup for the selected local client(s) in the same step (a one-time browser sign-in at setup — this is intended), so the first tool call in that client does not hit an OAuth wall:
npx @agent-native/core@latest skills add visual-plansAfter that, /visual-plan, /visual-recap, and /visualize-repo are the
installed slash commands. If you only need one command, use
skills add visual-plan, skills add visual-recap, or
skills add visualize-repo instead. The other planning modes
(create-ui-plan, create-prototype-plan, create-plan-design,
create-visual-questions) are MCP tools reachable from /visual-plan, not
separate slash commands. Pass --no-connect to register the connector without
authenticating, then run
npx @agent-native/core@latest connect https://plan.agent-native.com --client all
whenever you are ready, or choose a narrower --client. Auth and MCP tool
loading are per client config/session.
Browser (people you share with). Open the Plans editor and create & edit with no sign-up — you work as a guest. Sign in only when you want to save or share; signing in claims the plans you made as a guest into your account.
Sharing and commenting require an account: public/shared plans are viewable by anyone with the link, but commenting on them needs an agent-native account.
For fully offline, no-account use, run the Plans app locally and sync plans to your repo as MDX. This local mode is a separate advanced path, not the default hosted flow.
For repo-wide visual docs, run
npx @agent-native/core@latest visualize-repo --open to create/update
agent-native.json, seed .agent-native/visual-docs/repo-overview, and open
the local bridge.
If a Plans tool returns needs auth, Unauthorized, or Session terminated, do
not keep retrying it — stop and give the user the per-client reconnect step from
references/connection.md, then continue once the connector is available.
Hosted default: connect https://plan.agent-native.com/mcp. Do
not put shared secrets in skill files.
Files
- ATTRIBUTION.mdAdded by AutoGineer847 B
- LICENSELicence file added by AutoGineer1.0 KiB
- README.md3.9 KiB
- SKILL.md32.0 KiB
- references/canvas.md9.2 KiB
- references/connection.md2.9 KiB
- references/document-quality.md12.3 KiB
- references/exemplar.md3.9 KiB
- references/local-files.md6.4 KiB
- references/wireframe.md19.0 KiB
references/wireframe.md
HTML wireframe quality — single source of truth
This file is the canonical quality bar for HTML wireframes / <Screen> /
WireframeBlock content, shared word for word by /visual-plan and
/visual-recap. Read it in full before authoring ANY wireframe; do not
author wireframes from memory or paraphrase these rules per command.
<!-- SHARED-CORE:wireframe-quality START -->
A wireframe is an HTML mockup. The renderer owns the look; you write the
content. Set data.html to a self-contained, semantic HTML fragment of the
screen and set data.surface. The renderer owns the surface footprint/aspect,
the dark/light theme, the hand-drawn font, and the rough.js sketch overlay — you
never write <html>/<body>/<script>/<style> tags or any
width/height/coordinates. You write real HTML layout and real product
content; the renderer styles and roughens it.
A wireframe block's data is an HTML screen plus a surface:
{
"surface": "browser",
"html": "<div style=\"display:flex;flex-direction:column;gap:10px;padding:16px;height:100%\"><h1>Sign in</h1><p class=\"wf-muted\">Use your work email to continue.</p><div class=\"wf-card\" style=\"display:flex;flex-direction:column;gap:10px\"><label>Email<input value=\"[email protected]\" /></label><label>Password<input value=\"••••••••\" /></label><label style=\"display:flex;align-items:center;gap:8px\"><input type=\"checkbox\" checked /> Remember me</label><button class=\"primary\">Sign in</button></div><a href=\"#\">Forgot password?</a></div>"
}Write PLAIN semantic HTML and let the renderer style it. Bare elements
(h1/h2/h3, p, button, input, <input type="checkbox">, a, hr)
are auto-themed — no classes needed. Helper classes carry the rest:
.wf-card/.wf-box— a bordered, padded container (a panel, a list item)..wf-pill/.wf-chip— a rounded tag or filter; add.accent(<span class="wf-pill accent">) for the accent-filled variant..wf-muted— secondary/muted text (or use<small>).button.primaryor any element with[data-primary]— the accent-filled primary button.
No decorative shadows around mockups. Do not put box-shadow, filter: drop-shadow(...), Tailwind shadow-* classes, or other fake depth effects on a
wireframe frame, root container, .wf-card / .wf-box, or canvas artboard.
Mockups should read as flat, bordered surfaces; use spacing, borders, labels,
and annotations for separation. Only show a shadow when the real product UI
already has that shadow and it is essential to the change being reviewed.
Use renderer icons, not visible icon words. For icon-only buttons or leading
icons inside fields, chips, menu items, and toolbars, write an empty marker such
as <span data-icon="mail" aria-label="Email"></span> or
<i data-icon="lock"></i>. The renderer replaces it with a Tabler-style SVG and
the .wf-icon class sizes it to the surrounding text. Supported names and
aliases: mail/email, lock/password, search, plus/add, x/close,
check, chevronDown, chevronUp, chevronLeft, chevronRight, dots/more,
chevron/caret/dropdown (down chevron), user, settings, calendar,
bell, send, edit, arrowLeft, and arrowRight. Do not put visible words
like "email", "lock", "search", "chevron", or "more" where the product UI would
show an icon; use text only when it is a real label a user would read.
Use the --wf-* tokens for any custom color, never hex. The renderer flips
these on light/dark, so reading them is what keeps a mockup correct in both
themes. For any inline border, background, or text color, reference a token:
style="border:1.4px solid var(--wf-line)". The tokens are --wf-ink (text),
--wf-muted (secondary text), --wf-line (borders/dividers), --wf-paper
(page background), --wf-card (container surface), --wf-accent /
--wf-accent-fg / --wf-accent-soft (brand action), --wf-warn, --wf-ok,
and --wf-radius. Never hard-code a hex color and never set font-family — the
renderer owns the sketch/clean font.
Never use host/Tailwind theme classes in wireframe HTML. Classes such as
bg-white, bg-zinc-50, bg-slate-950, text-zinc-950,
text-slate-400, border-zinc-200, hover:bg-slate-800, shadow-xl,
or arbitrary color utilities like bg-[#fff] leak the host app's CSS into the
mockup and can make dark-mode canvas frames unreadable. Use bare semantic
elements, .wf-* helper classes, and --wf-* color tokens instead. Before
publishing, scan every wireframe class and style attribute: if a class sets
background, text, border, ring, fill, stroke, gradient, placeholder, decoration,
or shadow color, rewrite it to renderer tokens or remove it. Layout-only classes
are still discouraged; inline flex/grid styles are safer and easier to review.
Keep Rough.js sparse. The renderer sketches the outer frame, standard
.wf-* primitives, controls, and inline border dividers by default. Do not add
data-rough to broad root wrappers, dialog shells, page panels, grid cells, or
nested containers unless that single container is the visual point. Use
data-rough only for a deliberate one-off shape. If a mockup starts looking
like stacked/overlapping sketch lines, remove rough targets from parent
containers and let backgrounds plus spacing separate the surfaces.
Use literal CSS lengths for spacing. The --wf-* tokens are for colors and
renderer-owned visual styling, not layout spacing. Do not use guessed spacing
tokens such as var(--wf-space-4), Tailwind spacing classes, or theme spacing
variables inside wireframe HTML; if a token is unavailable in the Plan renderer,
padding collapses and content hugs the border. Use explicit CSS lengths for
layout: padding:16px, gap:12px, margin-top:18px, minmax(0,1fr).
Lay out with inline style flex/grid. You write the real layout —
display:flex; flex-direction:column; gap:10px; padding:16px and so on — and the
renderer never repositions anything. Compose the actual product: reproduce the
current screen, then show the modification. Real labels, real counts, real dates,
real button text grounded in the screen you read; not lorem or gray bars.
Surface presets — match the real footprint, never default to desktop+mobile.
Pick the surface that matches what the user will actually see:
browser: a web page that needs a browser chrome frame around it.desktop: a full desktop app page or app shell.mobile: a phone screen, only when the work is genuinely mobile.popover: a small floating menu, dropdown, or inline popover.panel: a side panel, inspector, or sidebar widget.
A sidebar popover renders as a small surface, not a desktop page and a phone
frame. Do not emit desktop + mobile variants unless responsive behavior
actually changes the layout. For a component or widget, show one broader
app-context frame only when placement affects understanding, then the focused
component states.
Model the actual component shell for small surfaces. A rendered UI change
belongs in a wireframe; reserve diagram for architecture, dependency, state,
or data-flow relationships. Popovers, dropdown menus, command palettes, and
context menus use surface: "popover" unless the surrounding page placement is
the point of the change. Dialogs, sheets, inspectors, sidebars, and long
property panels use the matching panel / desktop surface as appropriate.
Show the real chrome: trigger or anchor when it matters, title/header row,
top-right actions, separators, fields, options, selected states, body content,
and footer actions that are visible in the workflow.
Modify, don't redesign. When the task changes an existing screen, reproduce the current screen's real layout and footprint FIRST, then change only the delta and call it out with a single annotation. Do not restack the page into a new layout. For net-new surfaces, compose from the real app shell. Inspect the actual app components before drawing an existing product: sidebar density, toolbar actions, overflow menus, property panels, and framework chrome should match the product unless the plan intentionally changes them.
Keep product screens pure. A product wireframe shows the app state a user would actually see. Do not embed file contracts, architecture arrows, repo pills, mode explanations, or implementation callouts inside the screen just to explain the plan. Put those in canvas annotations, a separate diagram, or the document body. Secondary UI such as properties, history, sync, export, or agent controls should appear where the real product would put them: an overflow popover, sheet, panel, or separate framework sidebar state, not a generic permanent right inspector unless that inspector is the actual design.
Classify mockup scope before implementation. Before turning a plan mockup into source code, decide whether each artboard represents the whole page/app shell, a route body inside an existing shell, or a component/sub-surface. If an artboard includes navigation, sidebars, auth banners, or a signup/login form, map those pieces to the real shared shell/auth components instead of nesting the entire mockup inside the current page. When a mockup references the product's standard signup/login page, find and reuse that existing implementation; do not approximate it from the wireframe.
Zoom in on sub-surfaces, don't redraw the page. For a small sub-surface (a
popover, menu, dialog, toast), show the full screen once, then add a small
separate artboard whose html contains ONLY that sub-surface — do not re-draw
the whole page around it, and do not scale a duplicate up. Pick the matching
surface (e.g. popover) so the footprint is right; never widen a popover to
page width.
Loading / skeleton states. Set data.skeleton: true on the wireframe and
fill the html with neutral, textless placeholder geometry — boxes and bars
built as <div>s with background:var(--wf-line) and explicit heights/widths,
no labels or copy. The renderer drops borders, sketch, and color into the
skeleton register automatically. Never escape to a custom-html document block
to fake a loader.
Editing an existing mockup. In hosted mode, to change one element, text, or
color in an existing html mockup, do not regenerate the frame — call
update-visual-plan with
contentPatches: [{ op: "patch-wireframe-html", blockId, edits: [{ find, replace }] }]. Each find is a unique snippet of the current html (read it
first with get-visual-plan); set all: true on an edit to replace every
occurrence. The result is re-sanitized. In local-files privacy mode, do not call
hosted Plan tools; edit the local MDX source directly and rerun the local
check/serve or verify command for <plan-dir>.
Choose the outer frame deliberately. Wireframe and diagram data accept
frame: "auto" | "show" | "hide" in block data (<Screen frame="hide"> in
MDX wireframes, <Diagram frame="hide"> for MDX diagrams). Leave it unset or
auto when the host context should decide: Plan and recap surfaces default to a
drawn outer frame; docs surfaces default to no outer frame. Use show for
standalone product screens, before/after recap comparisons, screenshot-like
artifacts, and visuals that need containment from surrounding prose. Use hide
when a docs page, tab, column, card, canvas artboard, or the visual's own
internal chrome already supplies the boundary. Do not use hide to compensate
for cramped content; fix the layout instead.
Inner padding and borders still matter. Always wrap HTML wireframe content
in a root container with real inner padding before drawing cards, fields, pills,
labels, or controls. Use at least 14-16px of padding, box-sizing: border-box,
height: 100%, and gap between child rows on the root node itself so the
first row never sits flush against the screen edge. Do not rely on padding on a
nested page section as the first visible inset; the outermost element must
create the breathing room. Keep text away from borders: every container, field,
button, menu item, and annotation needs enough padding and line-height to read
cleanly in the rendered Plan view.
Center page-like content inside broad surfaces. For browser or desktop
screens, let the outer root provide the full-width frame and padding, then keep
the page body in a centered wrapper such as
width:100%;max-width:720px;margin-inline:auto. Full-width app bars may span
the root, but onboarding, auth, settings, and other page-like content should
not hug the left border unless the real product does.
For feature-cloud or abundance visuals, optimize the composition over line-by-line reading. Some marketing/product sections need to feel like a large surface area of capability rather than a precise app workflow. In those cases, use one padded root with a short headline and a dense, aesthetic cloud of short feature labels, chips, rings, or columns. Vary scale and opacity with tokens, cluster by meaning, and let many labels be glanceable rather than individually essential. Do not force dozens of features into equal cards with long wrapped sentences; that usually creates a messy unreadable mockup.
Lay out children safely so they never collide. Use HTML flex/grid with
gap, min-width: 0, and sensible overflow. Avoid negative margins, absolute
positioning, or fixed child widths that can collide when the renderer switches
between light/dark, sketch/clean, or different zoom levels.
Do not wrap intentionally single-line labels. For toolbars, tab rails,
breadcrumbs, chip/filter rows, branch and file names, file chips, and code
filenames — any deliberately single-line row — do not let long text wrap. Put
white-space: nowrap on the row (and overflow: hidden; text-overflow: ellipsis
on the individual labels that can grow), so the wireframe demonstrates the actual
layout behavior instead of producing ugly stacked or vertical text. Use
horizontally scrollable or clipped rails for overflow.
Fill the frame; keep labels short. Each artboard is a fixed-size surface — compose enough realistic HTML to fill it top to bottom with even vertical rhythm; never leave a large empty band. On desktop/app-shell sidebars, let the nav stack flex to fill (flex:1) and add any persistent bottom action/status after it so the rail reads complete in taller frames. On mobile especially, flow real rows down the whole screen (status bar, header, then list/detail content) rather than a header floating above a gap. Keep every label short enough to sit on one line within its column — shorten the copy rather than relying on the frame to absorb it (long labels wrap or clip).
Persistent chrome bars span the full frame width. Top bars, app headers,
toolbars, and bottom tab/nav bars are full-width chrome, not centered content.
Lay each one out as a single flex row that fills the frame
(style="display:flex;align-items:center;width:100%") and push trailing actions
to the right edge with a flex spacer (<div style="flex:1"></div>) between the
leading group and the trailing group — never center a bar inside a narrow,
centered block, and never let it collapse to the width of its contents. In a
Before/After pair the bar stays full-width in BOTH states even when one state has
fewer controls; the spacer absorbs the difference so the remaining controls hold
their edge alignment instead of sliding to the center.
Pin bottom bars to the bottom of the frame. For mobile tab bars, footers, and
any persistent bottom action row, make the frame itself a flex column at
height:100% (style="display:flex;flex-direction:column;height:100%"), give the
scrolling body flex:1 so it absorbs the slack, and place the bar as the LAST
child of the frame (or set margin-top:auto on it). The bar then sits flush at
the bottom of the surface instead of floating directly under the content with an
empty band beneath it.
Before / after must be comparable. When showing a state change, preserve the
unchanged controls in both states so the reviewer can see exactly what moved or
appeared; do not show an added control as a generic box floating elsewhere in
the surface. Place the new/changed affordance where the implementation puts it —
for example, a new Edit with AI action in a popover header belongs in the
top-right header slot, aligned with the title, not in the body or footer. Use
the same frame size, scale, outer padding, border radius, and visual density on
both sides unless the change itself alters those properties, and let the frame
height fit the content rather than leaving a tall empty lower half.
Name the states with the column header, never inside the frame. For
document-body wireframes (recaps), put the two
states in a columns block and set each column's label to Before and
After — the renderer draws that label as an h4 heading above each frame. Do
NOT bake a Before/After pill, title, or heading into the wireframe html: a
label placed inside reads as part of the product UI, lands in a random corner,
and clutters the comparison. The column header is the one and only place the
state name belongs. On a canvas, place the two state artboards as neighbors with
frame labels — never encode Before/After inside the html.
Let the surface choose side-by-side vs. stacked. For document-body
wireframes (recaps), the columns renderer lays
narrow surfaces (mobile, popover, panel) out side by side, and
automatically stacks wide surfaces (desktop, browser) vertically at full
document width so a large frame is never crushed into a half-width column and
cropped. Author both wireframes with the real surface and the matching
Before/After column labels; do not hand-stack the pair into separate
top-level wireframes or duplicate the state name as body content.
Good example — a contacts list, surface browser. A small, real screen
composed from the helper classes and tokens, layout in inline flex, no fonts or
hex colors:
<div
style="display:flex;flex-direction:column;gap:12px;padding:16px;height:100%"
>
<div style="display:flex;align-items:center;justify-content:space-between">
<h1>Contacts</h1>
<button class="primary">New contact</button>
</div>
<div style="display:flex;gap:6px">
<span class="wf-pill accent">All 128</span>
<span class="wf-pill">Favorites</span>
<span class="wf-pill">Archived</span>
</div>
<div
class="wf-card"
style="display:flex;flex-direction:column;gap:0;padding:0"
>
<div
style="display:flex;align-items:center;gap:10px;padding:10px 12px;border-bottom:1.4px solid var(--wf-line)"
>
<div
style="width:32px;height:32px;border-radius:999px;background:var(--wf-accent-soft)"
></div>
<div style="flex:1">
<strong>Jane Cooper</strong><br /><small>[email protected]</small>
</div>
<span class="wf-pill">Lead</span>
</div>
<div style="display:flex;align-items:center;gap:10px;padding:10px 12px">
<div
style="width:32px;height:32px;border-radius:999px;background:var(--wf-accent-soft)"
></div>
<div style="flex:1">
<strong>Marcus Lee</strong><br /><small>[email protected]</small>
</div>
<span class="wf-pill">Customer</span>
</div>
</div>
</div><!-- SHARED-CORE:wireframe-quality END -->
Requirements and compatibility
Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta
“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.
Needs: Needs Node.js
Security
What our scanner noticed· Low risk
- Instructions that use the network
A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.
Attribution and licence
- Published by
- Builder.io
- Publisher
- Builder.io (Official)
- Source
- BuilderIO/skills · skills/visual-plan · commit f4f10b8
- Licence
- MIT License (redistribution allowed)
- LICENSE (added by AutoGineer from LICENSE)
- ATTRIBUTION.md (written by AutoGineer)
- Synced
AutoGineer is not affiliated with or endorsed by Builder.io or Builder.io.
Download ZIP
The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download visual-plan.zip