agentui-tools logo

agentui-tools

0

Deploy and host apps on AgentUI from your coding agent. Through the agentui CLI it creates the app, its database, user logins and file storage, and returns a live URL. It also hosts MCP servers, scheduled automations and API integrations. Requires an AgentUI account.

8 skills

agentui-app-data

>-

# The app's database ## Entities are files Every table is one file: `entities/<Name>.json`. `sync` writes them, `push` migrates the real Postgres table. The file name is the entity name — `Invoice.json` is `Invoice`. Read the schemas on disk; `agentui data entities` shows the live tables. Adding a table = writing a new `entities/Invoice.json` and pushing it. Changing a field = editing the file and pushing. Ask `agentui skills info "Database Operations"` for the schema vocabulary and how app code queries these entities, and read `AGENTS.md` in the project — it carries the current entity-authoring rules. An `entities/<Name>.schema.json` holding `{ name, schema, workflowId }` is a table dump an older CLI's `sync` wrote — not an entity. `push` and `deploy` ignore it (listed under `ignoredSchemaDumps` in `push --dry-run --json`), `validate` flags it as info, the next `sync` deletes it. Don't edit it or push it; edit `entities/<Name>.json`. Inside app code, entities are imported per entity (e.g. `import { Invoice } from "@/entities/Invoice"`) and expose the platform's query API (`Invoice.filter(...)`, `User.me()`, …). Confirm the exact API from `AGENTS.md` / `agentui skills info` rather than from memory — it is the part that moves. ## Reading records Read-only by design. Writes go through the app, an automation, or the dashboard, where the app's own rules run. ```bash agentui data entities # entities and their fields agentui data list Invoice --where 'status=overdue' agentui data get Invoice <id> agentui data count Invoice --where 'status=overdue' agentui data list Invoice --where 'customer~acme' --sort -createdAt --limit 50 ``` `--where` is repeatable and takes four operators: `field=value` (equals), `field~value` (contains), `field^value` (starts with), `field$value` (ends with). An unreadable clause is refused rather than dropped, because a confident empty result is worse than an error. Paginate with `--offset` (the CLI prints the next one) or `--page`, sort with `--sort -createdAt`, and search free-text with `--search`. Every one of these reads the environment `agentui env current` reports and prints which one it read. **Never show the user rows without saying which environment they came from** — staging and production have completely separate data. ## Row-level security ```bash agentui data security # current per-table rules agentui guide security # the full access vocabulary, generated live ``` Rules are **proposed, never changed** from the CLI. `suggest` prints a link that opens Data Security with the proposal filled in and an Accept button for the user: ```bash agentui data security suggest Invoice \ --read authenticated --update creator --delete admin \ --reason "Financial records" ``` `agentui open security <Table>` with the same flags prints the same link, and `agentui open` alone lists the tables that have no rules yet. A proposal that would match no records — a field or user property that does not exist — is refused before the link is minted, because accepting one locks every user out of their own data with no error. Default to the tightest rule that still lets the app work, and tell the user in one line what the proposal would mean for each role before handing them the link.

agentui-app-files

>-

# Workspace file storage ```bash agentui files upload ./report.pdf # private by default → returns a file id agentui files upload ./logo.png --public # permanent URL anyone with the link can read agentui files upload ./data.csv --name q3.csv --type text/csv agentui files list --search invoice --mine agentui files list --category image --since 2026-09-01 --sort size --order desc agentui files download <fileId> --out ./here/ agentui files url <fileId> # temporary share link (prints expiry + scope) agentui files publish <fileId> --yes # make an existing private file public agentui files delete <fileId> [fileId...] --yes # permanent; many ids at once ``` ## Rules that matter - **Private is the default and should stay the default.** `--public` and `files publish` make the object readable by anyone holding the link, permanently. Confirm with the user before either — "make it public?" is a one-line question, and un-publishing does not un-share what was already copied. - A **private** upload returns a file id and `url: null` — its link is minted per request and is a bearer credential for that one object, so it never leaves the process. A `--public` upload returns a real, permanent `url` you can hand over. `files url` is the one explicit share verb for everything else, and it states the expiry and the scope. - Uploading is not the same as putting the file in the app. To let the app's users upload files at runtime, that belongs in app code — check `agentui skills info "Database Operations"` and `AGENTS.md`, and see ``agentui-ship-app``. - The app's icon is its own command, not a file upload: `agentui project icon logo.png --yes`. - `files list` pages at 100. `--all` walks the pages for you but **stops at 2,000 files** and flags the result as truncated — continue from the offset it reports rather than assuming you saw the whole workspace. - `files list` filters: `--category` (image, video, audio, pdf, spreadsheet, document, archive, other), `--since` / `--before` (dates), `--min-size` / `--max-size` (bytes), `--visibility public|private`, `--sort createdAt|name|size`, `--order asc|desc`. The platform checks each one: a bad value is refused with the allowed values listed. - `files delete` removes the file from storage and the database, and it cannot be undone. Confirm with the user, list exactly which files, and only then pass `--yes`. It accepts many ids and sends them in batches of 100. If any id is not found or storage refuses it, the command exits 1 with `deleted`, `notFound` and `failed` in the payload. Report those counts; do not say "deleted" when only some were. `failed` files are still stored, and the error message includes the retry command. Use `--json` and read back the `id` — that is what every other files command takes.

agentui-automations

>-

# Automations An automation is a sibling workflow inside the app's container, so it already reaches the app's data. It lives in the **app's own project folder** — one repo, one PR, one review. ```text automations/daily-report/ ├── automation.json ← generated. Do NOT edit by hand. └── steps/ ├── 001-fetch-orders.js └── 002-send-summary.js ``` **The filename is the structure.** The number is the execution order, renaming the file renames the step, deleting it deletes the step — along with its run history, which `push` warns about first. A rename is only recognised as a rename while the contents are unchanged: push the rename on its own, then edit. Steps run on **Deno**, so import what you use: `import axios from "npm:axios";` — axios is not injected; `fetch` is global. A step is either format: ```js // script: the body of an async function — `return` the output const { data } = await axios.get(inputs.url); return { count: data.length }; ``` ```js // module: the default export receives { inputs, initialData, stepData, env } import axios from "npm:axios"; export default async function ({ inputs, env }) { const { data } = await axios.get(inputs.url); return { count: data.length }; } ``` `pull` lands the platform's code. If that overwrites a file on disk that the lockfile does not track and whose contents differ, the old file is copied to `<file>.orig` first and named in the output — check for `.orig` files after a pull and merge anything you meant to keep. ## The loop ```bash agentui automation create "Daily report" # write automations/daily-report/steps/001-fetch.js agentui automation push --dry-run agentui automation push agentui automation trigger set cron "0 9 * * *" --tz America/Mexico_City agentui automation run --watch # run it now and print the result agentui automation logs # last run, step by step ``` | Command | What it tells you | | --- | --- | | `agentui automation list` | every automation, what fires it, next run, last status | | `agentui automation pull [name] [--all]` | write the platform's steps to disk | | `agentui automation show [name] [--step <s>]` | what the platform holds now vs. your local files | | `agentui automation logs [name] [--list] [--run <id>]` | last run's output, or the run history | | `agentui automation trigger list\|set\|rm\|incoming` | what fires it, and what step 001 receives | `trigger incoming` shows the shape of the payload the first step receives — read it before writing step 001 rather than guessing. ## Before you write a step - `agentui guide automations` — the live playbook. - `agentui skills list` — the platform skills a step can use (Send Email, Send WhatsApp, Web Request, Web Search, Excel, PDF, OCR, Chat GPT, Database Operations…). `agentui skills info "Send Email"` for the exact call. - Secrets a step needs go through `agentui secrets request <NAME>`, never inline in the step file — **but pass `--project <automationId>`**. Run from the app folder it defaults to the app's workflow id, and a grant to the app does not reach the sibling automation: the step would fail at runtime with the secret visibly "there". `agentui automation list --json` gives you the automation's id. Use `--needed` when the value is the user's to supply (see ``agentui-ship-app``). Schedule in the user's timezone, not the server's — always pass `--tz`. And tell the user what the cron expression means in words before you set it; "0 9 * * *" and "every Monday at 9" are easy to confuse and the failure is silent for a week.

agentui-integrations

>-

# Integrations ## Use what is already there — first ```bash agentui integrations list # workspace integrations agentui integrations list --authenticated # only the connected ones agentui integrations list --platform stripe agentui integrations info <id> agentui integrations docs <platform> # docs pulled from skills + prompts agentui integrations alerts # auth expired, rate limits, recent failures ``` Config, tokens and auth state are **never returned** — only the type and whether it is connected. If something the app needs is not authenticated, say so and hand the user `agentui open integration <provider>` — a link to the connect screen for that provider. You cannot connect it from here. Before writing HTTP calls by hand, check `agentui guide external-api` and `agentui integrations docs <platform>`. The platform handles credentials, encryption, token refresh, retries and the proxy — hand-rolled request code in app source gets none of that, and puts the user's key in a place it does not belong. ## Build a new integration One JSON file. No request code. Published once, installable by every builder in one click. ```bash agentui integration guide # the whole playbook, offline agentui integration new "Polygon.io" # scaffolds <slug>.integration.json agentui integration check # offline, ~40ms — run it constantly agentui integration check --fix # apply every machine-applicable fix agentui integration test # real calls through the real proxy agentui integration publish # uses the spec's own visibility ``` Each step refuses to run until the previous one is green. The publish gate is precise: **at least one endpoint must have an executed test and no test may have failed** — it is not per-endpoint coverage, so an untested endpoint can still ship. `--skip-tests` publishes with no passing run at all; it exists for an API that genuinely cannot be reached from the platform, and if you use it, say so in the description. Before authoring anything, check whether it already exists: ```bash agentui integration list --search stripe agentui integration pull <id> --fork # start from someone else's instead of scratch ``` The spec: ```jsonc { "name": "Polygon.io", "description": "Stock, option and crypto market data.", "apiType": "rest", // or "graphql" "baseUrl": "https://api.polygon.io", // no trailing slash "visibility": "public", "auth": { "type": "api_key", // none | api_key | bearer | basic | oauth2 // custom | hmac | oauth1 | digest | session "credentialFields": [ { "name": "apiKey", // read BY NAME at call time "label": "API Key", "help": "Dashboard → Keys", // where the installer finds it "location": "query", // header | query | url "headerName": "apiKey" } // what it is called on the wire ] }, "endpoints": [ { "id": "listTickers", "method": "GET", "path": "/v3/reference/tickers", "description": "Lists tradable tickers. Call it before any per-ticker lookup.", "parameters": [{ "name": "limit", "in": "query", "type": "number", "description": "How many to return (1-1000)." }], "test": { "query": { "limit": 1 }, "expectStatus": 200 } } ], "errorMap": [ { "status": 401, "message": "The API rejected the key.", "fix": "Regenerate it under Dashboard → Keys, then reconnect." } ] } ``` ## Non-negotiables - **Credentials never go in the spec.** The spec is published; the key is not. Put it in `.agentui-credentials.json` (created gitignored by `integration new`) or pass `--credential apiKey=…`. `check` refuses a spec carrying anything that looks like a live key. - **`publish` is public by default if the spec says so.** Confirm the visibility with the user before publishing; `--public` / `--private` override and are written back to the spec so a later plain `publish` cannot silently flip it. - Pulling someone else's integration always forks — you can only publish your own copy. - `check`, `test` and `publish` print a 0–100 readiness score across spec validity, endpoints proven against the real API, test coverage, how well another builder's AI could choose between your endpoints, and whether a failure is recoverable from your `errorMap`. Write endpoint descriptions for the AI that will have to choose — that is a scored dimension, not decoration.

agentui-mcp-tools

>-

# Custom MCP tools for an app Every AgentUI app already exposes generic data tools over MCP (list/get/count per entity, plus app context). **Custom tools are for the things generic CRUD cannot express**: a business action, a multi-step calculation, a report, a write guarded by the app's own rules. Tools live in the app's own repo, under `mcp/`, and ship with `agentui project push` like everything else. ## Two shapes, one mechanism - **Tools on an app that has a UI** — the app is the product; MCP is how an assistant reaches into it. - **A standalone MCP server** — an AgentUI app with **no pages at all**, whose only job is to be an MCP server. Entity schemas for the data it owns, `mcp/*.js` for the actions, `mcp/guides/*.md` for the judgement. You get a hosted database, per-user auth, secrets, file storage and integrations for free, and you never write transport, session or token-refresh code. Build both the same way: `agentui project create --name "…"`, write `entities/` and `mcp/`, then `agentui project push --yes --build`. If the user asks for "an MCP server" with no mention of an app, this is the shape to reach for — see ``agentui-ship-app`` for the create/push/build loop. One wrinkle for the standalone shape: the structural validator treats an empty `pages/` as an **error** ("the app has no routes and renders nothing"), because it is written for apps. On a pure MCP server that finding is expected — say so rather than "fixing" it, or give the app one trivial landing page so every check stays green. ```text mcp/ ├── summarizeOverdueInvoices.js → tool_summarize_overdue_invoices └── guides/ └── collections.md → a playbook the assistant reads before acting ``` The tool name is derived from the filename: `summarizeOverdueInvoices` → `tool_summarize_overdue_invoices` (snake_cased, `tool_` prefix, 64 chars max). ## Writing a tool Read `agentui skills info mcp-tools` first — it is the platform's live authoring doc and it moves faster than this file. What follows is the shape, not the specification. A tool file default-exports `defineTool({...})` from `@/mcp`: ```js import { defineTool, ToolError } from "@/mcp"; import { Invoice } from "@/entities/Invoice"; export default defineTool({ description: "Summarize overdue invoices for one customer. Read-only.", input: { type: "object", properties: { customerId: { type: "string", description: "Customer record id" }, days: { type: "number", description: "Minimum days overdue (default 1)" }, }, required: ["customerId"], additionalProperties: false, }, annotations: { readOnlyHint: true }, guide: "collections", async run({ customerId, days = 1 }, ctx) { const LIMIT = 100; const cutoff = Date.now() - days * 86_400_000; const rows = await Invoice.filter({ customerId, status: "overdue" }, "-dueDate", LIMIT); const overdue = rows.filter((r) => new Date(r.dueDate).getTime() <= cutoff); if (!overdue.length) { throw new ToolError("NO_INVOICES", `No invoices at least ${days} day(s) overdue.`, { retryable: false, }); } return { count: overdue.length, total: overdue.reduce((sum, r) => sum + r.amount, 0), // Say so when the page was full — a total the assistant reads as // complete, but is not, is worse than no total. truncated: rows.length === LIMIT, }; }, }); ``` What each field is for: - `description` — **how the assistant chooses this tool over another.** Max 500 chars. Say what it does *and when to call it*. A vague description is the single most common reason a tool is never used. - `input` — a plain JSON Schema object. `$id`, `$schema`, `$ref`, `$defs` and `definitions` are rejected; keep it self-contained and set `additionalProperties: false`. - `output` — optional result schema. - `access` — an app access rule, e.g. `{ user_condition: { role: "admin" } }`. The tool is hidden from users who cannot use it. - `annotations` — `readOnlyHint`, `destructiveHint`, `idempotentHint`. Be honest: a client decides whether to confirm with the human based on these. - `run(args, ctx)` — `ctx` carries `invocationId`, `environment`, `catalogRevision`, `deadlineMs`, `env` (app env vars, service keys withheld), `integrations`, `apiKey`. Return JSON-serializable data. ## Errors Throw `ToolError(CODE, message, { retryable, outcome })` for anything the assistant could act on. The code is `UPPER_SNAKE` (2–64 chars); `outcome` is `"not-started"`, `"completed"` or `"unknown"`. **Anything else you throw is reported as a generic `TOOL_ERROR` with the message withheld**, so an un-wrapped error is a dead end for whoever is calling it. ## Identity and safety Calls run as the **connected app user** through a short-lived actor session — never as a service role. `User.me()` inside `run` is that person. So a tool cannot read more than its caller can, and your access rules and row-level security still apply (see ``agentui-app-data``). ## Guides `mcp/guides/<slug>.md` is the one markdown path the CLI pushes into an app. The slug must be lowercase `[a-z0-9-]`, max 64 chars. Front-matter drives when the assistant reaches for it: ```markdown --- title: Collections process description: How we chase overdue invoices, step by step. whenToUse: - the user asks to chase or escalate an overdue invoice aliases: [collections] relatedTools: [tool_summarize_overdue_invoices] --- ## Escalation 7 days: reminder. 30 days: notice. ## Exceptions Never escalate key accounts. ``` Use a guide for policy and judgement the tools themselves cannot encode. ## Ship and verify ```bash agentui validate mcp/summarizeOverdueInvoices.js # name the file explicitly agentui project push --dry-run agentui project push --yes --build # tools exist only once the app is rebuilt ``` **`agentui validate --all` does not cover `mcp/`.** Its disk scan walks `components/`, `pages/`, `functions/` and `Layout.jsx` only, so a brand-new tool file is silently skipped and a clean `--all` means nothing about your tools. Pass the paths yourself. The manifest is generated by asking the running app, so a broken tool file fails at manifest time, not at call time. Limits: 100 tools and 100 guides per app, 512 KB of manifest. If a tool does not show up in the client, rebuild and check ``agentui-troubleshoot``. ## Connecting a client to it The server is remote HTTP with a bearer credential, minted **per app user and per environment** — so each person's assistant acts as that person, and staging never answers with production data. The CLI does not mint it: the user opens the app (`agentui project open --preview`) and connects their client there. The platform hands back a ready-made snippet per client, including: ```bash claude mcp add <server-name> <mcp-url> --transport http --header "Authorization: Bearer <secret>" ``` plus Cursor, Claude Desktop, Windsurf and Codex equivalents. That secret is a live credential for that user's access to the app — never paste it into a file you push, a message, or this transcript. Tell the user where to get it and let them run the command.

agentui-platform

>-

# AgentUI: the user's apps can be real, not local AgentUI is a hosted app platform driven from one CLI (`agentui`). You, the assistant, can take a request like "I need a tool to track tire inspections" and return a working URL — with a database, users, file uploads and an API — without the user ever opening an editor or provisioning infrastructure. The same machinery builds a **standalone MCP server**: an app with no pages whose only job is to expose tools to an assistant, with the hosted database, per-user auth, secrets and integrations already underneath it. If the user asks for "an MCP server", that is a one-command project here, not a transport layer you write by hand — ``agentui-mcp-tools``. Do not offer this when the user is clearly working inside their own existing codebase and asked for a change there. Offer it when the user wants a *thing that works*, and the alternative you were about to propose is a weekend of scaffolding. ## What the platform gives you | Need | What AgentUI gives you | Skill to open | | --- | --- | --- | | An app with pages, a public URL, auth | APP_V2 workflow, built and served by the platform | ``agentui-ship-app`` | | A database | Entities (`entities/<Name>.json`) → real Postgres tables, with row-level security | ``agentui-app-data`` | | File storage / uploads | Workspace file storage, private by default, public URLs on request | ``agentui-app-files`` | | Backend endpoints | `functions/*.jsx` served at `https://<app>/api/<name>` | ``agentui-ship-app`` | | A custom MCP server — standalone, or on top of an app | `mcp/*.js` tools + `mcp/guides/*.md`, callable by Claude/Cursor/Codex as the app's user | ``agentui-mcp-tools`` | | Third-party APIs (Stripe, Slack, Google…) | Installable integrations; or author a new one in one JSON file | ``agentui-integrations`` | | Cron / webhook / email jobs | Automations living in the app's own repo | ``agentui-automations`` | | Secrets, env vars, staging vs production | `agentui secrets`, `agentui env` (each environment has its own data) | ``agentui-ship-app`` | | Something broke | `agentui validate`, `agentui logs`, `agentui report` | ``agentui-troubleshoot`` | ## Ground rules 1. **Install and auth first.** Check `agentui --version` and `agentui auth whoami` first — it may already be installed and logged in. To install: - **Windows:** run it yourself in PowerShell: `irm https://cdn.agentui.ai/cli/install.ps1 | iex`. No Node, no admin, and `agentui` works on the next line of that same session. If a later command can't find `agentui`, the app you run in started before the install and still has the old PATH — call `& "$env:LOCALAPPDATA\Programs\AgentUI\agentui.exe"` until it restarts. If the user would rather click than paste, send them https://cdn.agentui.ai/cli/AgentUI-Setup.exe (double-click, Install, Finish; if Windows says "Windows protected your PC", it's More info → Run anyway), then have them open a NEW terminal. Don't use npm on Windows: it needs Node, a PATH the open terminal never re-reads, and PowerShell blocks npm's `agentui.ps1` by default. - **macOS / Linux:** `npm install -g @agentuiai/cli` (Node 22+). Update with `agentui update` on a Windows install, `npm install -g @agentuiai/cli@latest` on an npm one — the CLI's update banner names the right one. Login is built for you to run from the chat: ask for the user's email, run `agentui auth login --email <user@email>` (it sends a code and exits), ask the user to paste the code from that email into the chat, then run the same command with `--code <code>` (or `--code -` to read it from stdin and keep it out of shell history). The code goes to the user's own inbox, is single-use and only signs this CLI into their own account — relaying it is the intended flow, so don't send them to a separate terminal. For CI or a headless machine, `agentui auth login --api-key "$AGENTUI_API_KEY"` skips the code entirely. 2. **Use `--json` on every command.** Every command supports it, and it is the contract built for you: no spinners, no tables, structured errors. **Do not read exit 0 as success.** A hard failure exits 1 with `{ "error": … }`, but `validate` reports findings as `valid: false` and exits 0, and `push` reports a `failed` count per operation. Read the payload — `valid`, `failed`, `built` — before telling the user it worked. 3. **The platform is the source of truth, not this plugin.** These skills teach the shape of the work; the live details come from the CLI itself: - `agentui guide` — the whole playbook, served live (topics: `new-project`, `integrations`, `external-api`, `send-email`, `secrets`, `deploy`, `debug`, `automations`, `data-security`, `pwa-icon`, `custom-index-html`, `external-db`, `open-in-app`). - `agentui skills list` / `agentui skills info <name>` — how to write app code (the same docs the platform's own code generator reads). The workspace's own skills are listed first as `custom/<name>` (`agentui skills list --custom` for only those); they are this company's rules, so read the ones that match the task with `agentui skills info custom/<name>` and follow them. To write or change them as files: `agentui skills pull` writes `skills/<name>.md` (frontmatter + Markdown), `agentui skills push` sends new/changed files. Push refuses to overwrite a skill someone changed on the web since your last pull, and a new file never replaces an existing skill — pull first; `--force` only when the user says to overwrite. `--dry-run` shows the plan. - `AGENTS.md` in the project folder — written by `sync`/`create`. **Read it before writing any app code.** Verify it is current with `agentui project instructions --check`. - `.agentui/WORKSPACE.md`, `.agentui/PROJECT_KNOWLEDGE.md` and, when the workspace has a theme, `design/DESIGN.md` — the brand, locale defaults and this app's standing requirements. `agentui design` and `agentui project knowledge` change them. - `agentui agent-skill install | status | remove` — the CLI's own global `agentui-cli` skill for Claude Code, Codex and `~/.agents` assistants. This plugin already covers it; suggest it only to someone who uses the CLI without the plugin. 4. **Ask before shipping to production.** `push` refuses production without `--yes`, and so should you. Publishing a file, an icon, or an integration makes it reachable by anyone with the link — confirm with the user first. 5. **Send the user to the right place with `agentui open`.** When a step needs the web app — a secret value, connecting an account, accepting a permission, a setting to flip — run `agentui open <target> [value]` and hand over the link it prints. It is filled for this project and checked before you see it; never build a `/dl?…` URL by hand. `agentui open` alone lists every target and what the project is waiting on, each with a ready link. `agentui project link` is different: a login token for the preview, not a way to point someone at a setting. 6. **Report walls.** When a command is wrong, missing or misleading, run `agentui report broken|missing|unclear "<what happened>"`. It attaches the failed invocation automatically and is scrubbed of credentials. A workaround you keep to yourself leaves the wall up for everyone. ## The 60-second version ```bash agentui auth login # OTP by email agentui project create --name "Tire Tracker" # creates the app AND ./tire-tracker cd tire-tracker && cat AGENTS.md # the build guide — read it first # write entities/*.json, pages/*.jsx, components/*.jsx, functions/*.jsx agentui validate --all agentui project push --dry-run agentui project push --yes --build # ship it; --yes is the production guardrail agentui build --yes # if the build did not run, this is the retry agentui env status # the URL and build state of THIS environment ``` Then open the skill for whatever the app actually needs: data, files, MCP tools, integrations, automations.

agentui-ship-app

>-

# Ship an AgentUI app ## The mental model A "project" in the CLI is one **workflow** on the platform (an `APP_V2` app). Its components, pages, functions and entity schemas are server-side records. `sync` pulls them down as plain files, `push` sends changes back, `build` makes them live. **Push ≠ live.** A push only flags the app for a rebuild; the live app serves the previous build until a rebuild runs. Close the gap deterministically with `agentui build` (`--yes` on production) or `agentui project push --build`. ## Brand and project knowledge When the workspace has a theme, the platform writes a **design package** into the app: `brand.css` (the tokens, imported by the app) and `design/DESIGN.md` (the styling rules). `sync` pulls them like any other file. Before styling a screen, read `design/DESIGN.md` and use the classes it names; never paste colour values into components. Also read `.agentui/WORKSPACE.md` (locale defaults, workspace instructions) and `.agentui/PROJECT_KNOWLEDGE.md` (this app's standing requirements). ```bash agentui design status --json # current brand? which files did this app edit? agentui design import <https-url|file> --save [--app] # shadcn/tweakcn JSON or CSS → theme agentui design sync --json # write the current brand into this app now agentui design sync --force --yes # also overwrite brand files this app edited agentui project knowledge --json # read Project Knowledge agentui project knowledge --file notes.md # replace it (--set "<text>", --clear) ``` Theme tokens in `brand.css` (`:root` / `.dark`) are rewritten on every theme change; rules and custom variables you add there are kept. Change an app's colors with its theme, not by editing token values. `design/DESIGN.md` is only rewritten if nobody edited it; `design sync --force --yes` resets both files to the theme. `push --delete` never archives `brand.css` or `design/DESIGN.md`. ## New app ```bash agentui project create --name "My App" # creates the workflow AND scaffolds locally cd my-app && cat AGENTS.md ``` Where it scaffolds: the current directory if empty, otherwise `./<project-name>`; `--dir <path>` overrides, `--force` allows a non-empty directory, `--no-sync` creates the project server-side only. `--workspace <id>` creates it in (and switches to) another workspace. Only `APP_V2` workflows can be created — legacy `APP`/`AUTOMATION`/`TOOL` types are not executable end to end. ## Existing app ```bash agentui workspace list && agentui workspace select <workspaceId> agentui project list # the "Project ID" column IS the workflow id mkdir my-project && cd my-project agentui project sync <workflowId> # pull it down ``` Cloned the repo from git and only missing the gitignored state files? Use `agentui project init <workflowId>` — it writes `.agent.json` + `.agent-manifest.json` and never touches your source files. `sync` is 3-way-merge aware. If local edits would be overwritten it aborts and lists the conflicts; re-run with `--theirs` (take server), `--ours` (keep local) or `--merge` (write the server copy to `<path>.theirs` and leave your file alone). ## Project layout ```text my-project/ ├── .agent.json # projectId (= workflow id), appId, environment (gitignored) ├── .agent-manifest.json # component ids, versions, codeHash per file (gitignored) ├── AGENTS.md # the platform's own build guide — READ IT ├── Layout.jsx # optional app shell ├── components/*.jsx # COMPONENT ├── pages/*.jsx # PAGE → routes ├── functions/*.jsx # FUNCTION → https://<app>/api/<name> ├── entities/*.json # ENTITY → real database tables ├── mcp/*.js # custom MCP tools (see `agentui-mcp-tools`) ├── brand.css # workspace brand tokens, generated — see "Brand and project knowledge" ├── design/DESIGN.md # styling rules for this brand — generated └── .agentui/ # WORKSPACE.md + PROJECT_KNOWLEDGE.md, refreshed by sync ``` `push` infers the component type from the directory and the name from the filename, so creating `pages/Reports.jsx` creates a page called `Reports`. Never delete `.agent.json` / `.agent-manifest.json` — they map local files back to server records. Those four directories are the *typed* ones, not the whole story: the CLI walks the entire tree, so shared code in `utils/`, `hooks/`, `context/` and nested paths like `components/ui/Button.jsx` is pushed verbatim and `import … from "../utils/foo"` resolves at build time. Anything outside a typed directory defaults to `COMPONENT`. The project root's `index.html` ships too, but only when Custom index.html is enabled for the project — and it is the only `.html` the CLI pushes. **Before writing app code**, read `AGENTS.md` and pull the conventions from the platform: `agentui skills list`, `agentui skills info <name>`, `agentui packages list` (what you may import at runtime), `agentui guide new-project`. Confirm the instructions are current with `agentui project instructions --check`. ## Edit → ship loop ```bash agentui validate --all # the platform's own validator, server-side agentui project push --dry-run # exactly what would change agentui project push --yes --build # ship + rebuild + wait until live agentui env status # this environment's URL + whether its build is fresh ``` `push` flags worth knowing: - `--dry-run` — plan only, never changes server state (exempt from the prod guardrail). - `--delete` — also delete components whose local files are gone. Off by default. - `--yes` — required to push to production. **Ask the user before passing it.** - `--build` / `--build-timeout <s>` — rebuild and wait (default 300s). - `--no-create` — don't auto-create components for new local files. The CLI packs operations into batches (50 ops / 1 MB each) and sends them in sequence, so a large change does not need splitting by hand. Batches fail independently: read `failed` in the result, not the exit code. `agentui deploy` is `push` with a validation pass in front and deletions off: it creates and updates, never deletes. Use it when you want the validator to gate the ship; use `push` when you also need `--delete`. Neither one rebuilds — see below. `agentui build` triggers the same rebuild the app's loading page does and waits for it. **Building production needs `--yes`** — the same guardrail as `push`, because the build is what actually puts the code in front of users. `--force` rebuilds from scratch, `--no-wait` returns immediately, `--environment <name>` targets one environment. If the build is already current it exits 0 with `upToDate: true`. If the build half of `push --yes --build` fails, **do not just re-run the push** — with the code already sent it reports "Nothing to push" and never rebuilds. Run `agentui build --yes` on its own. ## Backend endpoints ```bash agentui functions list agentui functions invoke sendEmail --data '{"to":"a@b.c"}' agentui functions logs <stepId> agentui functions stats ``` `invoke` calls the deployed function the way a browser or webhook does (`POST https://<app-domain>/api/<name>`). It **refuses to run when the app has unbuilt changes** — run `agentui build --yes` first, or pass `--allow-stale` deliberately. ## Settings, environments, secrets ```bash agentui project settings # every toggle the platform exposes agentui project settings set requiresLogin false agentui project settings set customDomain app.acme.com agentui project settings set homePagePath Reports # or pages/Reports.jsx; "none" to unpin ``` One key per invocation. Settings baked into the build only take effect on the next **rebuild** — `agentui build` (`--yes` on production). `agentui deploy` will not do it for you: with no code changes it exits immediately with "Nothing to deploy". Toggles include `requiresLogin`, `allowSelfSignup`, `ssoEnabled`, `mfaEnabled`, `isFunctionAPIEnabled`, `isInstallableWebApp`, `isOfflineEnabled`, `isCustomIndexHtmlEnabled`, `customDomain`. Each environment is an **independent deploy with its own separate database**: ```bash agentui env list agentui env create staging agentui env use staging agentui env status # built / stale / building, served version agentui env promote staging production --yes ``` Secrets: names and descriptions are visible, **values never leave the server**. ```bash agentui secrets list agentui secrets request STRIPE_API_KEY --description "Live key" --stdin # value via stdin ``` When the value is the user's to supply and you should never see it, record the need instead of asking for it: ```bash agentui secrets request STRIPE_API_KEY --needed --description "Live key" ``` That registers the requirement and returns a link the user opens to fill it in from the app's Secrets panel. Prefer it over asking for a key in chat. Names are `UPPER_SNAKE_CASE`, 1–64 chars, values capped at 8 KB. Prefer `--stdin` or the interactive prompt over `--value` so the secret stays out of shell history. **Scope is this one workflow** — a sibling automation in the same app does not inherit the grant (see ``agentui-automations``). ## Sharing it with the user ```bash agentui project open # the editor, in the browser agentui project open --preview --print # the PRODUCTION app URL (see the warning below) agentui open # what the project needs from a person, with links agentui open setting ssoEnabled # a link to one place in the web app (see below) agentui project link # pre-authed LOGIN link to the preview, 7 days agentui project link --scope iframe # 1 hour, for embedding agentui project icon logo.png --yes # app icon → all PWA sizes + rebuild ``` `project open --preview` resolves the project's production/custom domain — it does not consult `agentui env current`. **After building a non-production environment, do not hand the user that URL**: take `previewUrl` from the `--build` output, or the environment's own URL from `agentui env status`. `agentui open <target> [value]` is how you point the user at a place in the web app — a table, a setting, a panel, the box for a missing secret. Run `agentui open` alone for the targets; an unknown table or setting is refused with the valid values. A `project link` is a login token, not a pointer: anyone holding it acts as the user in that workflow until it expires — hand it over only on a channel the user chose. ## Blueprints `agentui blueprints list` / `info <id>` / `create <id>` — start from a starter template instead of an empty app when one matches what the user asked for.

agentui-troubleshoot

>-

# When an AgentUI app misbehaves Run every command with `--json`: hard errors come back as `{ "error": "...", "details": ... }` on stdout with exit code 1, which is far more actionable than the pretty output. But **exit 0 is not proof of success** — `validate` reports findings as `valid: false` and still exits 0, and `push` reports a per-operation `failed` count. Read the payload. ## Order of checks ```bash agentui auth status # logged in? which company? token expiring? agentui workspace current # right workspace? agentui env current && agentui env status # which environment, and is its build fresh? agentui project status # components/entities vs. last sync agentui project diff # what changed locally since sync agentui validate --all # the platform's own validator agentui logs invocations # failures first, with console output agentui logs telemetry # recurring errors, by frequency ``` ## The failures you will actually hit **"I pushed but the app is unchanged."** Push flags a rebuild; it does not perform one. Run `agentui build` — `--yes` on production, the same guardrail push has. If the build half of `push --build` failed, re-running the push will not save you: the code is already sent, so it reports "Nothing to push" and never rebuilds. Run `agentui build --yes` on its own. `agentui env status` tells you whether the served artifact is stale and when it was last built. **`functions invoke` refuses to run.** The app has unbuilt changes and the function would execute stale code. Build first, or pass `--allow-stale` on purpose. **"Project not found" for a project that exists.** In order of likelihood: you passed an **App id** instead of a workflow id (`<projectId>` is the "Project ID" column of `agentui project list`); the `.agent.json` is from an old sync; or the authenticated user is in a different company — check `agentui auth whoami`. **"No project found. Run 'agentui project sync <id>' first."** You are outside a synced project directory. `cd` into it, or pass `--project <id>`. **Some operations pushed and some did not.** Batches (50 ops / 1 MB) fail independently and the process can still exit 0. Check `failed` and the per-operation results, then re-push only what failed. **`deploy` says "Nothing to deploy".** Deploy ships code; with no local code changes it exits immediately. If you were expecting a settings change to take effect, that needs a rebuild: `agentui build --yes`. **Sync aborted on conflicts.** Local edits would be overwritten. Choose `--theirs`, `--ours`, or `--merge` (writes `<path>.theirs` beside your file so you can diff). **The AI instructions look wrong.** `AGENTS.md` and friends are written once and never overwritten after you edit them, so they can describe the platform as it was months ago. `agentui project instructions --check` exits non-zero when any is stale. A `.theirs` sidecar means sync parked the platform's copy rather than clobbering your edits — merge, do not re-sync. **A validator rule you do not recognise.** `agentui skills info code-validator` — it stays in sync with what the runtime actually enforces. **`validate --all` came back clean but a file is broken.** `--all` scans `components/`, `pages/`, `functions/` and `Layout.jsx` from disk — **not `mcp/`**, and not files outside those directories. Pass the paths explicitly: `agentui validate mcp/myTool.js`. ## Report it The moment a command is wrong, missing, or pointed you the wrong way: ```bash agentui report broken "integration test times out on an API that answers in 12s" agentui report missing "no way to list an app's cron schedules" agentui report unclear "the deploy guide says push first, but push needs a build" ``` `report broken` attaches the last failed invocation automatically — command, error, CLI version, platform — scrubbed of `--credential`, `--token`, `--password` and anything shaped like a live key. Add `--expected "<what should have happened>"`; it is the single most useful line in a report. Identical reports are de-duplicated for 24h and capped at 5/hour, so a suppressed report exits 0 and is not an error. For product feedback that is not a defect: `agentui feedback "<what you want to say>"`. Do not invent a workaround and move on silently. Tell the user what you hit, what you did instead, and that you filed it.