Turn into app skill

Turn visible project context, a proven thread, skill, or workflow into a runnable Agent-Native app with simple buttons, visible agent steps, preview, and deployment handoff.

by BuilderIO·MIT license·★ 4,514 Stars on the repo·GitHub ↗

Use now

Files of Turn into app

BuilderIO/main1 file shown
SKILL.md
Show the full text484 lines

Turn Into App

Host execution boundary

Classify the runtime before choosing a build path. The presence of a Dispatch or Builder connector does not make a coding host an online host:

  • Local coding host - Codex Desktop/Code, Claude Code, Cursor, or any runtime with a terminal, filesystem, and target checkout. Build in that checkout: scaffold, edit, run, and verify the app locally. Do not call start-workspace-app-creation, create_workspace_app, or any Builder handoff for this path. The local implementation steps below are required.
  • Non-coding browser host - Claude Web, ChatGPT Web, or a Claude/ChatGPT Project in the browser when no target checkout or filesystem is available. Act as the source analyst and handoff orchestrator. Do not run npm, pnpm, npx, agent-native create, or add-app; do not edit files, create artifacts, or start a local dev server. After writing the bounded source brief, call the connected Dispatch action start-workspace-app-creation. Pass the brief and repeatable workflow in prompt, plus the inferred appId, description, template, selected resourceIds, and relevant source attachments when available. Pass supported attachments as message context; do not paste binary data into prompt, and do not assume an attachment becomes a file in the generated workspace. Reference resources by ID rather than pasting whole knowledge files into the prompt. Then report what Dispatch actually returned — the branch, the path, and the status it gave. This host cannot run or inspect the app, and the returned path can 404 until the branch merges and deploys, so the handoff ends at a pending or unverified status unless a status or verification action is available to call. This is the Builder handoff for browser hosts only.
  • If the host is ambiguous, inspect the environment. A real cwd, terminal, and target workspace mean local coding host. Do not infer browser mode from the availability of a Builder connector.
  • For the browser-only path, do not substitute the generic create_workspace_app MCP tool. That tool is a local workspace scaffolder, not the Builder handoff. Connect the Agent-Native Dispatch MCP connector only; Dispatch uses the authenticated Builder Projects API to reuse or provision the workspace project before starting the Builder Cloud Agent.
  • If the browser-only handoff action is unavailable or Dispatch is not authenticated, stop with the connector setup needed. Do not fall back to a host sandbox build or claim that the app exists.
  • Never invent a Builder branch URL. If Dispatch returns only an acknowledgement or a path without a URL, report the handoff as unverified rather than calling it a ready or verified Builder branch.

Default behavior

For a local coding host this is an end-to-end local build skill, not a request for an app proposal. For a non-coding browser host, the end-to-end result is a verified Builder handoff and the resulting workspace app, not code written in the browser host.

  • With no argument, choose the source in this order: visible project context, then the current thread. A fresh Claude or ChatGPT Project is a valid source on its first turn. Treat its visible project instructions, knowledge files, and supplied past runs as the source; a completed thread is not required. Treat the current turn as a request or configuration unless it contains a concrete repeatable workflow.
  • With a named skill or local workflow, read that source and package it immediately, even at the beginning of a thread. For example, /turn-into-app /some-skill means “turn /some-skill into an app.”
  • With an attachment or path, read the supplied artifact as the source.
  • Do not ask the user to restate context that is already in the thread.
  • When invoked from an Agent-Native app, use its visible project context first, then the current thread. If the current runtime has a target checkout, use the local implementation path; use a workspace/coding-agent handoff only when the runtime cannot edit files. Do not claim the app exists without an actual path and verification result.

Non-interactive by default

Once the source brief identifies a repeatable workflow, the run proceeds without asking. This applies to both hosts: a local build and a browser handoff are equally non-interactive.

Do not ask the user for visual, product, copy, layout, template, integration, or implementation choices that can be resolved from the source. Take the source's recommended option; otherwise choose the most direct conventional default and record the assumption for later review.

One source-integrity exception: for a spreadsheet, if candidate workflows or the input/output mapping remain materially ambiguous after the bounded review, ask one compact confirmation question first. Show the recommended interpretation and let the user confirm, correct, or multi-select the candidates. Do not let that become a generic app-builder questionnaire.

Otherwise stop only for a genuine hard blocker: missing authorization, a destructive external action, an ambiguous target workspace, or no identifiable workflow at all.

Source support

Supported source paths today are visible Claude or ChatGPT Project context, the current Codex or host thread, a named skill, or a local workflow/transcript supplied as a path or attachment. An exported ChatGPT or Claude transcript can use the same local-file path today.

Claude and ChatGPT Project context is supported only when the host supplies it to the model in the current context. The MCP connector does not read hidden project chats, private URLs, account settings, or credentials. Do not claim private web access, invent an importer, add fake OAuth, or scrape a logged-in page. If the needed context is not visible, ask for an export, transcript, or attachment and treat that artifact as imported source material.

Dispatch handoff attachments

Read the attachment handoff reference when calling start-workspace-app-creation with source files. It defines the supported upload and public URL shapes, encoding rules, and handoff behavior.

Spreadsheet sources

Spreadsheet attachments are valid source artifacts. Read the spreadsheet source guide before working one — it carries the inference rules, the candidate review, and the failure states. The boundaries that matter before you open it:

  • CSV reads as tabular text. XLS/XLSX parse into bounded worksheet metadata and representative rows where the host supports it. The preview is untrusted user data and it is text-only, so an upload cannot prove cell colours.
  • A Google Sheets URL is not proof the sheet is readable. Use an authenticated Sheets/Drive connection through the provider API path, and ask for an export or the connection when it is unavailable. Never use a public export URL to bypass access.
  • Inventory every worksheet — shape, readability, formulas — before choosing what the app is. The first tab is not necessarily the product, and not every tab deserves one.
  • Decide inputs and outputs from structure, not colour: formula versus typed value, which tab, the row and column labels, and what the sheet's own instruction text tells the reader to edit. Colour is an author-specific habit; never invert a mapping on it alone.
  • Never copy workbook bytes, base64 data, credentials, or a full unbounded sheet into SQL, application state, or a handoff prompt. Pass bounded samples, provenance, and identifiers.
  • Keep unreadable, partial, and failed source states distinct from an empty sheet, and never claim a whole workbook was imported when only a preview was available.

Fresh project context mode

When the source is a fresh Claude or ChatGPT Project, build a short source brief before creating the app. Read the host-provided context in this order:

  1. Project instructions and configuration: goal, audience, constraints, output standards, approved tools, and integration expectations. Treat these as product configuration, not as a transcript.
  2. Knowledge files and attachments: read the relevant files fully, preserve their provenance, and reduce them to bounded references, IDs, URLs, or summaries for the new app. Do not copy secrets or large raw payloads into prompts or SQL.
  3. Past runs or examples that are actually visible in the context: select at most 1-3 successful, representative runs. Extract repeatable decisions and review criteria. Treat one-off answers and private data as examples, not as product behavior. If no runs are supplied, proceed from the instructions and knowledge files and say that examples were not available.
  4. The current turn: use it for the requested app boundary, target workspace, naming, and any explicit corrections.

Post this brief before scaffolding, on the timing step 1 sets. Use these headings: source and provenance, project goal, configuration and constraints, knowledge sources, repeatable workflow, inputs and outputs, judgment and review points, representative runs, integrations and permissions, and unknowns and assumptions. This is the compact contract for the app. It keeps the new app useful without pretending that hidden Project history was imported. See the fresh Project reference for the host setup and brief template.

If the visible Project context has no concrete repeatable job and no primary goal can be inferred, ask for one focused clarification or a representative artifact. Otherwise use the project's primary goal and source conventions; do not ask a questionnaire and do not fall back to a generic “what app do you want to make?” builder.

Source selection guard

The generated app must implement the concrete workflow found in the source. It must not become a generic “what app do you want to make?” intake form.

  • In a delegated or forked task, read the actual referenced source thread and the latest explicit workflow direction in the current task. If they disagree, the latest concrete workflow direction wins.
  • Do not treat a thread that merely discusses building this skill as the product source unless the user explicitly asks to appify that meta-workflow.
  • If the source contains several workflows, choose the latest successful, repeatable job that motivated the request and name it in the handoff. If no concrete job can be identified, stop and report what is missing instead of inventing an app-builder UI.

UI contract for generated apps

Generated apps must follow the shared Agent-Native surface model:

  • Keep the domain workflow on a named route (/workflow, /automations, /block, or the source's equivalent). Preserve the scaffold's full-page chat route instead of replacing it with a domain form while leaving the layout configured as a chat page.
  • Use the right AgentSidebar for contextual AI. Every button-triggered sendToAgentChat handoff should open or focus that sidebar and keep the user on the current domain page.
  • Every AI-labeled button must actually call sendToAgentChat with bounded context and openSidebar: true. Label deterministic local actions as local, preview, or analyze instead of AI.
  • Never use sparkle, wand, magic, robot, or similar decorative AI icons. Use a message or neutral action icon, or no icon when the button label is enough.
  • Make the left navigation describe domain destinations. Chat is a separate destination, not the label for every app page.
  • For a spreadsheet-derived app with multiple confirmed candidates, make each candidate a separate named left-navigation destination. Keep the shared source provenance visible, but show that candidate's selected worksheets, ranges, inputs, outputs, historical context, and confirmation state on its destination.
  • Start with one primary action and one compact state. Put setup choices, advanced inputs, diagnostics, and long explanations behind progressive disclosure or later workflow steps.
  • Choose a named visual direction in DESIGN.md before styling and build to it. Preserve existing brand tokens; a new unbranded app picks its own product-fitting palette rather than inheriting a sibling app's accent.
  • Standalone apps that render AgentSidebar must use the shared AgentKit chat surface with one controller/transport. Do not add a legacy AssistantChat renderer or a second stream owner. Keep assistant-ui usage inside the shared composer integration; if linked dependencies need Vite aliases, resolve one @agent-native/agentkit context and verify a real AgentKit handoff in the browser.
  • Before handoff, inspect the first viewport and remove the text density, repeated cards, unrelated forms, and generic helper copy the user does not need until the next decision.

In a local code-agent runtime, read frontend-design for the visual direction contract, aesthetic guidelines, and named review passes behind these rules.

1. Extract the workflow

Read the full available source, then write the brief out before the first scaffold command. This is the user's one cheap chance to catch a misread — after this point a correction costs a rebuild. A few lines per item; it is a checkpoint, not a document.

State it and keep going. Do not wait for approval; see Non-interactive by default. A brief that appears only in the handoff does not count — by then it cannot change anything.

The brief covers:

  • the user and repeatable job;
  • inputs and outputs;
  • the 1-3 judgment-heavy agent moments;
  • the buttons, review points, and retry states a user needs;
  • data, permissions, integrations, and failure boundaries.

For a spreadsheet source, also include the workbook/file or spreadsheet ID, worksheet and range candidates, source snapshot/live semantics, formatting signals and their confidence, selected candidate destinations, and the exact confirmation or clarification still needed. A spreadsheet's inputs and outputs have two layers: the mapped source cells/ranges, and the generated app's user-facing results/actions. Name both so the Builder does not confuse an output cell with an app write or a historical value with an editable input.

Preserve useful judgment from the source, but do not turn a one-off answer, private data, or an unverified result into a product contract. If the source is not available or does not contain a repeatable job, say what is missing rather than claiming the app is complete.

2. Create a fresh app

Choose a short slug from the workflow and create a new directory. Never overwrite an existing app. If the user supplied a directory, use it; otherwise use apps/<slug> inside an existing Agent-Native workspace, or a new sibling directory when working outside one.

Say once, before the first command, what this run will need to execute — dependency install, scaffold, typecheck, doctor, and a dev server. A host that asks per command will ask many times; one stated expectation up front is what keeps that from reading as something going wrong.

For a new UI-bearing standalone app, use the current Agent-Native scaffold and then read the generated AGENTS.md:

npx @agent-native/core@latest create <app-directory> --template chat
cd <app-directory>
pnpm install

When working inside an existing Agent-Native workspace, create the app from the workspace root instead:

pnpm exec agent-native add-app <slug> --template=chat

Do not use create for an existing workspace; it scaffolds a new standalone workspace rather than adding an app to the current one.

Use a first-party template only when it materially fits the workflow. Keep the new app independent from the source thread's working tree unless the user explicitly asks to extend an existing app.

Read the generated DESIGN.md before building the first screen and fill in the visual direction as part of the app brief. Do not copy the previous app's palette just because its tokens are nearby.

When the scaffold does not complete

A scaffold or install step can fail, time out, or be denied when the host asks the user for permission. All three are the same situation: the app you were told to build does not exist yet. Retry once where a retry could plausibly help, then stop and report the blocker with the exact command, the failure, and what is already on disk.

Never work around it. Do not hand-build the app in another stack, do not edit a pinned dependency version to force an install through, and do not carry on against a half-created directory. An app that is not the real Agent-Native scaffold is a different product, not a smaller version of this one, and a handoff that reports success for it is worse than no app at all.

Do not choose a workaround yourself. Report the blocker and let the user choose. If they request one, name it in the handoff as a pending finding with what changed and why, so the next person does not inherit it silently.

3. Turn the workflow into buttons and agent work

Implement the smallest useful surface around the extracted brief. The app should make the repeated path obvious without hiding the agent's judgment:

  • Give each important repeated moment a clear button, such as “Analyze,” “Suggest options,” “Draft,” “Review,” or “Publish.” Use the source's actual vocabulary when it is clear.
  • Put deterministic reads, writes, approvals, provider fetches, and publishing in focused actions/ with defineAction. The UI and agent must call the same action surface.
  • If a workflow is framed as research, analysis, generation, recommendation, or synthesis, start it in the AgentSidebar and let the agent orchestrate those actions. Do not hide an AI-shaped multi-step workflow behind one opaque action just because the implementation is deterministic.
  • Use application state for the current screen, selected item, and focused object so the agent can see where the user is.
  • Use sendToAgentChat({ message, context, submit: true, openSidebar: true }) for intentional button-triggered agent work. Use submit: false when the user should review or edit the proposed prompt in the AgentSidebar first. Keep follow-up and revision prompts in that same thread; do not add a second freeform textbox beside the result.
  • Pass IDs, URLs, and bounded summaries in context. Do not paste large provider dumps into prompts, call an LLM directly from the browser, or invent fake progress.
  • Make agent results visible, editable, retryable, and attributable. Keep irreversible actions behind an explicit review or confirmation point.

Use the existing shadcn/ui primitives, Tabler icons, shared composer, and optimistic action patterns. Do not add a parallel CRUD API route for an action.

4. Keep onboarding shared

Use the framework's existing setup experience. The app should offer the normal “Use Builder.io” and “Add your own keys” paths for AI setup. Do not create a second credential form or hardcode a provider key.

In local-development instructions, add a brief note that a developer can set an environment variable such as ANTHROPIC_API_KEY or OPENAI_API_KEY before starting the app; after restart, the setup prompt is no longer shown when the key is available. Keep real secrets out of source, examples, and generated content.

Turn-into-app apps should commit an agent-native.json app configuration so a plain pnpm dev has the right first-run behavior without extra flags:

{
  "version": 1,
  "onboarding": {
    "firstRun": {
      "development": "connect",
      "production": "connect-and-integrations"
    }
  }
}

Either value keeps the shared Use Builder.io / Add your own keys choice visible; only "off" disables first-run onboarding entirely. Do not replace this with a local credential form or remove the shared onboarding.

When the onboarding default needs code rather than a static mode map, add an optional agent-native.config.ts with the same returned shape:

import { defineAgentNativeConfig } from "@agent-native/core/config";

export default defineAgentNativeConfig(({ isDev }) => ({
  version: 1,
  onboarding: {
    firstRun: isDev ? "connect" : "connect-and-integrations",
  },
}));

The Vite preset loads this file automatically on supported Node versions. The JSON file remains the portable, inspectable fallback. See the Agent-Native app configuration guide for precedence, supported modes, and the boundary between committed config and deployment secrets.

For an account-free local preview, create the ignored local .env file with AUTH_DISABLED=1 before starting the dev server. This is only for loopback development; never commit or deploy this setting. AI/provider connections still use the normal onboarding flow or the documented environment-variable keys.

5. Run it immediately

From the new app directory:

pnpm dev

For a fresh local test app, use the ignored .env with AUTH_DISABLED=1 so the domain UI opens without an account; the committed app config makes shared onboarding visible. Keep the process running so the user can try the app. Read the actual server output and report the real local URL. If the app needs installation or a setup step, complete it when possible and distinguish “not configured” from an unavailable credential store.

6. Verify, build, and deploy

Exercise the actual happy path, not only the source files:

  1. Load the reported URL and confirm the main route renders.
  2. Confirm the shared onboarding state or a configured local key.
  3. Click the primary workflow button and confirm the intended agent handoff. Also click every other AI-labeled button and confirm it opens the same contextual sidebar with the expected prompt or staged context.
  4. Confirm the result, action persistence, application state, and sync path.
  5. Check the dev output for browser/runtime errors, and capture input, result, and agent-sidebar states so the complete flow is reviewable.

Run the checks the generated app's own AGENTS.md names — typecheck and agent-native doctor — and fix what they report before building.

Then run the supported build. For a standalone app, use the generated app's documented build and hosting path. For an app inside a workspace, use the workspace deploy command, for example:

npx @agent-native/core@latest build
npx @agent-native/core@latest deploy --preset netlify

Use vercel or another supported preset when that is the configured target. Attempt deployment when the user requested it or the project already has the required provider configuration. If external authentication, a production secret, or a hosting decision is missing, finish local verification and report the exact remaining handoff without claiming a live deployment.

Label evidence separately: locally running, locally verified, build-ready, deployed, and live-verified are different states.

Handoff

End with the new app directory, local URL, visual direction, what the buttons do, account-free local-preview status, verification performed, deployment URL if it is real, and one precise pending step when something could not be completed. Keep the handoff short enough to use in a demo or recording.

Do not restate the brief here — step 1 already posted it. Report what changed from it instead: assumptions you added, anything the source turned out not to support, and choices made where the source was silent.

The handoff describes what exists, not what was intended. If the scaffold never completed, if a step was worked around, or if the app is not the real Agent-Native scaffold, that is the headline — not a caveat below one. A handoff cannot report the build as complete and list the framework the app is built on as a future improvement; if both would be true, the build is not complete.

1---
2name: turn-into-app
3description: >-
4 Turn visible project context, a proven thread, skill, or workflow into a
5 runnable Agent-Native app with simple buttons, visible agent steps, preview,
6 and deployment handoff. Use when a user invokes `/turn-into-app` or asks to
7 make a workflow into an app, including from
8 Claude or ChatGPT on the web, including when the source is a spreadsheet
9 link or upload.
10metadata:
11 visibility: exported
12---
13 
14# Turn Into App
15 
16## Host execution boundary
17 
18Classify the runtime before choosing a build path. The presence of a Dispatch
19or Builder connector does not make a coding host an online host:
20 
21- **Local coding host** - Codex Desktop/Code, Claude Code, Cursor, or any
22 runtime with a terminal, filesystem, and target checkout. Build in that
23 checkout: scaffold, edit, run, and verify the app locally. Do not call
24 `start-workspace-app-creation`, `create_workspace_app`, or any Builder
25 handoff for this path. The local implementation steps below are required.
26- **Non-coding browser host** - Claude Web, ChatGPT Web, or a
27 Claude/ChatGPT Project in the browser when no target checkout or filesystem
28 is available. Act as the source analyst and handoff orchestrator. Do not run
29 `npm`, `pnpm`, `npx`, `agent-native create`, or `add-app`; do not edit files,
30 create artifacts, or start a local dev server. After writing the bounded
31 source brief, call the connected Dispatch action
32 `start-workspace-app-creation`. Pass the brief and repeatable workflow in
33 `prompt`, plus the inferred `appId`, `description`, `template`, selected
34 `resourceIds`, and relevant source attachments when available. Pass supported
35 attachments as message context; do not paste binary data into `prompt`, and do
36 not assume an attachment becomes a file in the generated workspace. Reference
37 resources by ID rather than pasting whole knowledge files into the prompt. Then
38 report what Dispatch actually
39 returned — the branch, the path, and the status it gave. This host cannot run
40 or inspect the app, and the returned path can 404 until the branch merges and
41 deploys, so the handoff ends at a pending or unverified status unless a status
42 or verification action is available to call. This is the Builder handoff for
43 browser hosts only.
44- If the host is ambiguous, inspect the environment. A real cwd, terminal, and
45 target workspace mean local coding host. Do not infer browser mode from the
46 availability of a Builder connector.
47- For the browser-only path, do not substitute the generic
48 `create_workspace_app` MCP tool. That tool is a local workspace scaffolder,
49 not the Builder handoff. Connect the Agent-Native Dispatch MCP connector
50 only; Dispatch uses the authenticated Builder Projects API to reuse or
51 provision the workspace project before starting the Builder Cloud Agent.
52- If the browser-only handoff action is unavailable or Dispatch is not
53 authenticated, stop with the connector setup needed. Do not fall back to a
54 host sandbox build or claim that the app exists.
55- Never invent a Builder branch URL. If Dispatch returns only an acknowledgement
56 or a path without a URL, report the handoff as unverified rather than calling
57 it a ready or verified Builder branch.
58 
59## Default behavior
60 
61For a local coding host this is an end-to-end local build skill, not a request
62for an app proposal. For a non-coding browser host, the end-to-end result is a
63verified Builder handoff and the resulting workspace app, not code written in
64the browser host.
65 
66- With no argument, choose the source in this order: visible project context,
67 then the current thread. A fresh Claude or ChatGPT Project is a valid source
68 on its first turn. Treat its visible project instructions, knowledge files,
69 and supplied past runs as the source; a completed thread is not required.
70 Treat the current turn as a request or configuration unless it contains a
71 concrete repeatable workflow.
72- With a named skill or local workflow, read that source and package it
73 immediately, even at the beginning of a thread. For example,
74 `/turn-into-app /some-skill` means “turn `/some-skill` into an app.”
75- With an attachment or path, read the supplied artifact as the source.
76- Do not ask the user to restate context that is already in the thread.
77- When invoked from an Agent-Native app, use its visible project context first,
78 then the current thread. If the current runtime has a target checkout, use
79 the local implementation path; use a workspace/coding-agent handoff only
80 when the runtime cannot edit files. Do not claim the app exists without an
81 actual path and verification result.
82 
83## Non-interactive by default
84 
85Once the source brief identifies a repeatable workflow, the run proceeds without
86asking. This applies to both hosts: a local build and a browser handoff are
87equally non-interactive.
88 
89Do not ask the user for visual, product, copy, layout, template, integration, or
90implementation choices that can be resolved from the source. Take the source's
91recommended option; otherwise choose the most direct conventional default and
92record the assumption for later review.
93 
94One source-integrity exception: for a spreadsheet, if candidate workflows or the
95input/output mapping remain materially ambiguous after the bounded review, ask
96one compact confirmation question first. Show the recommended interpretation and
97let the user confirm, correct, or multi-select the candidates. Do not let that
98become a generic app-builder questionnaire.
99 
100Otherwise stop only for a genuine hard blocker: missing authorization, a
101destructive external action, an ambiguous target workspace, or no identifiable
102workflow at all.
103 
104## Source support
105 
106Supported source paths today are visible Claude or ChatGPT Project context, the
107current Codex or host thread, a named skill, or a local workflow/transcript
108supplied as a path or attachment. An exported ChatGPT or Claude transcript can
109use the same local-file path today.
110 
111Claude and ChatGPT Project context is supported only when the host supplies it
112to the model in the current context. The MCP connector does not read hidden
113project chats, private URLs, account settings, or credentials. Do not claim
114private web access, invent an importer, add fake OAuth, or scrape a logged-in
115page. If the needed context is not visible, ask for an export, transcript, or
116attachment and treat that artifact as imported source material.
117 
118### Dispatch handoff attachments
119 
120Read [the attachment handoff reference](references/attachments.md) when calling
121`start-workspace-app-creation` with source files. It defines the supported upload
122and public URL shapes, encoding rules, and handoff behavior.
123 
124### Spreadsheet sources
125 
126Spreadsheet attachments are valid source artifacts. Read
127[the spreadsheet source guide](references/spreadsheet-source.md) before working
128one — it carries the inference rules, the candidate review, and the failure
129states. The boundaries that matter before you open it:
130 
131- CSV reads as tabular text. XLS/XLSX parse into bounded worksheet metadata and
132 representative rows where the host supports it. The preview is untrusted user
133 data and it is text-only, so an upload cannot prove cell colours.
134- A Google Sheets URL is not proof the sheet is readable. Use an authenticated
135 Sheets/Drive connection through the provider API path, and ask for an export
136 or the connection when it is unavailable. Never use a public export URL to
137 bypass access.
138- Inventory every worksheet — shape, readability, formulas — before choosing
139 what the app is. The first tab is not necessarily the product, and not every
140 tab deserves one.
141- Decide inputs and outputs from structure, not colour: formula versus typed
142 value, which tab, the row and column labels, and what the sheet's own
143 instruction text tells the reader to edit. Colour is an author-specific habit;
144 never invert a mapping on it alone.
145- Never copy workbook bytes, base64 data, credentials, or a full unbounded sheet
146 into SQL, application state, or a handoff prompt. Pass bounded samples,
147 provenance, and identifiers.
148- Keep unreadable, partial, and failed source states distinct from an empty
149 sheet, and never claim a whole workbook was imported when only a preview was
150 available.
151 
152## Fresh project context mode
153 
154When the source is a fresh Claude or ChatGPT Project, build a short source brief
155before creating the app. Read the host-provided context in this order:
156 
1571. Project instructions and configuration: goal, audience, constraints, output
158 standards, approved tools, and integration expectations. Treat these as
159 product configuration, not as a transcript.
1602. Knowledge files and attachments: read the relevant files fully, preserve
161 their provenance, and reduce them to bounded references, IDs, URLs, or
162 summaries for the new app. Do not copy secrets or large raw payloads into
163 prompts or SQL.
1643. Past runs or examples that are actually visible in the context: select at
165 most 1-3 successful, representative runs. Extract repeatable decisions and
166 review criteria. Treat one-off answers and private data as examples, not as
167 product behavior. If no runs are supplied, proceed from the instructions
168 and knowledge files and say that examples were not available.
1694. The current turn: use it for the requested app boundary, target workspace,
170 naming, and any explicit corrections.
171 
172Post this brief before scaffolding, on the timing step 1 sets. Use these
173headings: source and provenance, project goal, configuration and constraints,
174knowledge sources, repeatable workflow, inputs and outputs, judgment and review
175points, representative runs, integrations and permissions, and unknowns and
176assumptions. This is the compact contract for the app. It keeps the new app
177useful without pretending that hidden Project history was imported. See
178[the fresh Project reference](references/fresh-project.md) for the host setup
179and brief template.
180 
181If the visible Project context has no concrete repeatable job and no primary
182goal can be inferred, ask for one focused clarification or a representative
183artifact. Otherwise use the project's primary goal and source conventions; do
184not ask a questionnaire and do not fall back to a generic “what app do you
185want to make?” builder.
186 
187## Source selection guard
188 
189The generated app must implement the concrete workflow found in the source. It
190must not become a generic “what app do you want to make?” intake form.
191 
192- In a delegated or forked task, read the actual referenced source thread and
193 the latest explicit workflow direction in the current task. If they disagree,
194 the latest concrete workflow direction wins.
195- Do not treat a thread that merely discusses building this skill as the product
196 source unless the user explicitly asks to appify that meta-workflow.
197- If the source contains several workflows, choose the latest successful,
198 repeatable job that motivated the request and name it in the handoff. If no
199 concrete job can be identified, stop and report what is missing instead of
200 inventing an app-builder UI.
201 
202## UI contract for generated apps
203 
204Generated apps must follow the shared Agent-Native surface model:
205 
206- Keep the domain workflow on a named route (`/workflow`, `/automations`,
207 `/block`, or the source's equivalent). Preserve the scaffold's full-page
208 chat route instead of replacing it with a domain form while leaving the
209 layout configured as a chat page.
210- Use the right `AgentSidebar` for contextual AI. Every button-triggered
211 `sendToAgentChat` handoff should open or focus that sidebar and keep the user
212 on the current domain page.
213- Every AI-labeled button must actually call `sendToAgentChat` with bounded
214 context and `openSidebar: true`. Label deterministic local actions as local,
215 preview, or analyze instead of AI.
216- Never use sparkle, wand, magic, robot, or similar decorative AI icons. Use a
217 message or neutral action icon, or no icon when the button label is enough.
218- Make the left navigation describe domain destinations. Chat is a separate
219 destination, not the label for every app page.
220- For a spreadsheet-derived app with multiple confirmed candidates, make each
221 candidate a separate named left-navigation destination. Keep the shared
222 source provenance visible, but show that candidate's selected worksheets,
223 ranges, inputs, outputs, historical context, and confirmation state on its
224 destination.
225- Start with one primary action and one compact state. Put setup choices,
226 advanced inputs, diagnostics, and long explanations behind progressive
227 disclosure or later workflow steps.
228- Choose a named visual direction in `DESIGN.md` before styling and build to it.
229 Preserve existing brand tokens; a new unbranded app picks its own
230 product-fitting palette rather than inheriting a sibling app's accent.
231- Standalone apps that render `AgentSidebar` must use the shared AgentKit chat
232 surface with one controller/transport. Do not add a legacy `AssistantChat`
233 renderer or a second stream owner. Keep assistant-ui usage inside the shared
234 composer integration; if linked dependencies need Vite aliases, resolve one
235 `@agent-native/agentkit` context and verify a real AgentKit handoff in the
236 browser.
237- Before handoff, inspect the first viewport and remove the text density,
238 repeated cards, unrelated forms, and generic helper copy the user does not
239 need until the next decision.
240 
241In a local code-agent runtime, read `frontend-design` for the visual direction
242contract, aesthetic guidelines, and named review passes behind these rules.
243 
244## 1. Extract the workflow
245 
246Read the full available source, then write the brief out before the first
247scaffold command. This is the user's one cheap chance to catch a misread —
248after this point a correction costs a rebuild. A few lines per item; it is a
249checkpoint, not a document.
250 
251State it and keep going. Do not wait for approval; see *Non-interactive by
252default*. A brief that appears only in the handoff does not count — by then it
253cannot change anything.
254 
255The brief covers:
256 
257- the user and repeatable job;
258- inputs and outputs;
259- the 1-3 judgment-heavy agent moments;
260- the buttons, review points, and retry states a user needs;
261- data, permissions, integrations, and failure boundaries.
262 
263For a spreadsheet source, also include the workbook/file or spreadsheet ID,
264worksheet and range candidates, source snapshot/live semantics, formatting
265signals and their confidence, selected candidate destinations, and the exact
266confirmation or clarification still needed. A spreadsheet's inputs and
267outputs have two layers: the mapped source cells/ranges, and the generated
268app's user-facing results/actions. Name both so the Builder does not confuse
269an output cell with an app write or a historical value with an editable input.
270 
271Preserve useful judgment from the source, but do not turn a one-off answer,
272private data, or an unverified result into a product contract. If the source is
273not available or does not contain a repeatable job, say what is missing rather
274than claiming the app is complete.
275 
276## 2. Create a fresh app
277 
278Choose a short slug from the workflow and create a new directory. Never
279overwrite an existing app. If the user supplied a directory, use it; otherwise
280use `apps/<slug>` inside an existing Agent-Native workspace, or a new sibling
281directory when working outside one.
282 
283Say once, before the first command, what this run will need to execute —
284dependency install, scaffold, typecheck, doctor, and a dev server. A host that
285asks per command will ask many times; one stated expectation up front is what
286keeps that from reading as something going wrong.
287 
288For a new UI-bearing standalone app, use the current Agent-Native scaffold and
289then read the generated `AGENTS.md`:
290 
291```bash
292npx @agent-native/core@latest create <app-directory> --template chat
293cd <app-directory>
294pnpm install
295```
296 
297When working inside an existing Agent-Native workspace, create the app from
298the workspace root instead:
299 
300```bash
301pnpm exec agent-native add-app <slug> --template=chat
302```
303 
304Do not use `create` for an existing workspace; it scaffolds a new standalone
305workspace rather than adding an app to the current one.
306 
307Use a first-party template only when it materially fits the workflow. Keep the
308new app independent from the source thread's working tree unless the user
309explicitly asks to extend an existing app.
310 
311Read the generated `DESIGN.md` before building the first screen and fill in the
312visual direction as part of the app brief. Do not copy the previous app's
313palette just because its tokens are nearby.
314 
315### When the scaffold does not complete
316 
317A scaffold or install step can fail, time out, or be denied when the host asks
318the user for permission. All three are the same situation: the app you were told
319to build does not exist yet. Retry once where a retry could plausibly help, then
320stop and report the blocker with the exact command, the failure, and what is
321already on disk.
322 
323Never work around it. Do not hand-build the app in another stack, do not edit a
324pinned dependency version to force an install through, and do not carry on
325against a half-created directory. An app that is not the real Agent-Native
326scaffold is a different product, not a smaller version of this one, and a
327handoff that reports success for it is worse than no app at all.
328 
329Do not choose a workaround yourself. Report the blocker and let the user choose.
330If they request one, name it in the handoff as a pending finding with what changed
331and why, so the next person does not inherit it silently.
332 
333## 3. Turn the workflow into buttons and agent work
334 
335Implement the smallest useful surface around the extracted brief. The app
336should make the repeated path obvious without hiding the agent's judgment:
337 
338- Give each important repeated moment a clear button, such as “Analyze,”
339 “Suggest options,” “Draft,” “Review,” or “Publish.” Use the source's actual
340 vocabulary when it is clear.
341- Put deterministic reads, writes, approvals, provider fetches, and publishing
342 in focused `actions/` with `defineAction`. The UI and agent must call the
343 same action surface.
344- If a workflow is framed as research, analysis, generation, recommendation,
345 or synthesis, start it in the AgentSidebar and let the agent orchestrate
346 those actions. Do not hide an AI-shaped multi-step workflow behind one
347 opaque action just because the implementation is deterministic.
348- Use application state for the current screen, selected item, and focused
349 object so the agent can see where the user is.
350- Use `sendToAgentChat({ message, context, submit: true, openSidebar: true })`
351 for intentional button-triggered agent work. Use `submit: false` when the
352 user should review or edit the proposed prompt in the AgentSidebar first.
353 Keep follow-up and revision prompts in that same thread; do not add a second
354 freeform textbox beside the result.
355- Pass IDs, URLs, and bounded summaries in context. Do not paste large provider
356 dumps into prompts, call an LLM directly from the browser, or invent fake
357 progress.
358- Make agent results visible, editable, retryable, and attributable. Keep
359 irreversible actions behind an explicit review or confirmation point.
360 
361Use the existing shadcn/ui primitives, Tabler icons, shared composer, and
362optimistic action patterns. Do not add a parallel CRUD API route for an action.
363 
364## 4. Keep onboarding shared
365 
366Use the framework's existing setup experience. The app should offer the normal
367“Use Builder.io” and “Add your own keys” paths for AI setup. Do not create a
368second credential form or hardcode a provider key.
369 
370In local-development instructions, add a brief note that a developer can set
371an environment variable such as `ANTHROPIC_API_KEY` or `OPENAI_API_KEY` before
372starting the app; after restart, the setup prompt is no longer shown when the
373key is available. Keep real secrets out of source, examples, and generated
374content.
375 
376Turn-into-app apps should commit an `agent-native.json` app configuration so a
377plain `pnpm dev` has the right first-run behavior without extra flags:
378 
379```json
380{
381 "version": 1,
382 "onboarding": {
383 "firstRun": {
384 "development": "connect",
385 "production": "connect-and-integrations"
386 }
387 }
388}
389```
390 
391Either value keeps the shared Use Builder.io / Add your own keys choice
392visible; only `"off"` disables first-run onboarding entirely. Do not replace
393this with a local credential form or remove the shared onboarding.
394 
395When the onboarding default needs code rather than a static mode map, add an
396optional `agent-native.config.ts` with the same returned shape:
397 
398```ts
399import { defineAgentNativeConfig } from "@agent-native/core/config";
400 
401export default defineAgentNativeConfig(({ isDev }) => ({
402 version: 1,
403 onboarding: {
404 firstRun: isDev ? "connect" : "connect-and-integrations",
405 },
406}));
407```
408 
409The Vite preset loads this file automatically on supported Node versions. The
410JSON file remains the portable, inspectable fallback. See the [Agent-Native
411app configuration guide](/docs/agent-native-config) for precedence, supported
412modes, and the boundary between committed config and deployment secrets.
413 
414For an account-free local preview, create the ignored local `.env` file with
415`AUTH_DISABLED=1` before starting the dev server. This is only for loopback
416development; never commit or deploy this setting. AI/provider connections still
417use the normal onboarding flow or the documented environment-variable keys.
418 
419## 5. Run it immediately
420 
421From the new app directory:
422 
423```bash
424pnpm dev
425```
426 
427For a fresh local test app, use the ignored `.env` with `AUTH_DISABLED=1` so the
428domain UI opens without an account; the committed app config makes shared
429onboarding visible. Keep the process running so the user can try the app. Read
430the actual server output and report the real local URL. If the app needs installation or a setup step,
431complete it when possible and distinguish “not configured” from an unavailable
432credential store.
433 
434## 6. Verify, build, and deploy
435 
436Exercise the actual happy path, not only the source files:
437 
4381. Load the reported URL and confirm the main route renders.
4392. Confirm the shared onboarding state or a configured local key.
4403. Click the primary workflow button and confirm the intended agent handoff.
441 Also click every other AI-labeled button and confirm it opens the same
442 contextual sidebar with the expected prompt or staged context.
4434. Confirm the result, action persistence, application state, and sync path.
4445. Check the dev output for browser/runtime errors, and capture input, result,
445 and agent-sidebar states so the complete flow is reviewable.
446 
447Run the checks the generated app's own `AGENTS.md` names — typecheck and
448`agent-native doctor` — and fix what they report before building.
449 
450Then run the supported build. For a standalone app, use the generated app's
451documented build and hosting path. For an app inside a workspace, use the
452workspace deploy command, for example:
453 
454```bash
455npx @agent-native/core@latest build
456npx @agent-native/core@latest deploy --preset netlify
457```
458 
459Use `vercel` or another supported preset when that is the configured target.
460Attempt deployment when the user requested it or the project already has the
461required provider configuration. If external authentication, a production
462secret, or a hosting decision is missing, finish local verification and report
463the exact remaining handoff without claiming a live deployment.
464 
465Label evidence separately: locally running, locally verified, build-ready,
466deployed, and live-verified are different states.
467 
468## Handoff
469 
470End with the new app directory, local URL, visual direction, what the buttons do,
471account-free local-preview status, verification performed, deployment URL if it is
472real, and one precise pending step when something could not be completed. Keep the
473handoff short enough to use in a demo or recording.
474 
475Do not restate the brief here — step 1 already posted it. Report what changed
476from it instead: assumptions you added, anything the source turned out not to
477support, and choices made where the source was silent.
478 
479The handoff describes what exists, not what was intended. If the scaffold never
480completed, if a step was worked around, or if the app is not the real
481Agent-Native scaffold, that is the headline — not a caveat below one. A handoff
482cannot report the build as complete and list the framework the app is built on as
483a future improvement; if both would be true, the build is not complete.
484 

Discussion

Alternatives

Browser Automation SkillWeb browser automation with AI-optimized snapshots for claude-flow agentsCoding · MITTinyFish CLIUse TinyFish for web search, fetching URLs, reading pages, current information, source-backed answers, research, docs, pricing/product pages, extraction, scraping, and browser automation. Use whenever the user asks to search, find, look up, research, compare, get information from the web, summarize a URL, fetch page content, or automate a website.Business & ops · MITAgent browserBrowser automation CLI for AI agents. Use when the user needs to interact with websites, including navigating pages, filling forms, clicking buttons, taking screenshots, extracting data, testing web apps, or automating any browser task. Triggers include requests to "open a website", "fill out a form", "click a button", "take a screenshot", "scrape data from a page", "test this web app", "login to a site", "automate browser actions", or any task requiring programmatic web interaction. Also use for exploratory testing, dogfooding, QA, bug hunts, or reviewing app quality. Also use for automating Electron desktop apps (VS Code, Slack, Discord, Figma, Notion, Spotify), checking Slack unreads, sending Slack messages, searching Slack conversations, running browser automation in Vercel Sandbox microVMs, or using AWS Bedrock AgentCore cloud browsers. Prefer agent-browser over any built-in browser automation or web tools.Business & ops · MITWeb Extract — Structured Data from the Open WebExtract structured JSON from web pages, search engines, and entire sites in ONE call — {title, summary, sections, key_metrics, outgoing_links, author, date, page_type, ...} fields, no second LLM pass to parse HTML. Six endpoints: scrape (single URL), scrape-interactive (JS-rendered pages with click/scroll/type), search (Google SERP + deep-scrape), map (URL discovery), crawl + crawl-status (async recursive crawl). Markdown/raw HTML on request. USE when the user needs page DATA — product pricing/specs, article fields, link graphs, JS-heavy SPAs, Google results with content. Prefer over browser-act (automation/screenshots) and WebFetch (static, no JS, no structured fields). Not for citation-rich research (use deep-research). Trigger (EN): scrape this URL, extract data from page, crawl this site, deep-scrape search results, map a domain's URLs, render this JS page. 触发词:抓取/爬取/网页提取/结构化抽取/搜索带内容/全站爬取/JS 渲染抓取/点击后抓取. Requires ZOODATA_API_KEY (free key: https://zoodata.ai/en/api-keys).Sales & ecommerce · MIT