astro
Astro 7 conventions for ONE sites — plugin wiring via one.config.ts, OneChat/OneTrack placement, Cloudflare SSR. Invoke when…
Write a workflow this site will actually run — the eight step kinds, the fenced graph block that makes it executable, and the trap where beautifully-written prose compiles to a workflow with zero steps.
$ npx -y skills add one-ie/one --skill workflow --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/workflowContext preview
The summary Claude sees to decide when to auto-load this skill.
Write a workflow this site will actually run — the eight step kinds, the fenced graph block that makes it executable, and the trap where beautifully-written prose compiles to a workflow with zero steps.
name: workflow description: Write a workflow this site will actually run — the eight step kinds, the fenced graph block that makes it executable, and the trap where beautifully-written prose compiles to a workflow with zero steps. model: openrouter/auto lifecycle: beta reads: - ai/context.md
A workflow is one `.md` in `ai/workflows/`. `one push` sends it as `workflow:create`, then applies its graph as a second call.
**This is the failure to check for first.** The compiler reads exactly one thing as the step graph: a fenced block whose language is `graph`, containing JSON. Everything else in the file — headings, tables, numbered steps, fenced blocks marked anything else — is documentation.
A file of well-structured prose describing five steps compiles to `workflow:create` with a name, a description, **and no steps at all**. It succeeds. It reports success. The workspace gets an empty workflow.
Check before you claim a workflow is built:
grep -c '```graph' ai/workflows/<name>.md # 0 means it does nothing one push --dry-run # shows what would actually land
---
id: order-fulfilment
label: Order → fulfilled
description: One sentence. This is what the workspace shows.
trigger: order:created
department: service
---
Prose for humans goes here. It is never executed.
```graph
{
"steps": [
{ "id": "pick", "kind": "agent", "name": "Pick and pack",
"config": { "actorId": "service", "instructions": "..." } },
{ "id": "ok", "kind": "human", "name": "Confirm shipped",
"config": { "assignee": "{{ owner }}" } }
],
"edges": [["pick", "ok"]]
}
`edges` takes either `["from", "to"]` or `{ "from": ..., "to": ..., "condition": ... }`.
A `config` object is stringified for you; a string is passed through.
**The frontmatter `trigger` seeds a trigger step** when the graph has none, and
wires it to the first step. So you write the trigger once, in frontmatter, and
the graph starts at the real work.
## The eight kinds
An unknown kind **throws at compile time** and names itself — that error is a
gift, not a problem to work around.
| Kind | Acts | Note |
|---|---|---|
| `trigger` | the world | usually seeded from frontmatter |
| `tool` | an integration — no judgment | |
| `skill` | a capability — scoped | one of `ai/skills/` |
| `agent` | an actor — open judgment | |
| `condition` | routes if/then | runs inline, emits no signal |
| `human` | a person approves | **suspends the run** |
| `delay` | time | runs inline, emits no signal |
| `sell` | a buyer pays | **suspends the run** |
`tool → skill → agent` is the autonomy ladder: reach for the least autonomous
one that can do the job. A step that needs no judgment should never be an
`agent`.
## Three rules worth holding
**Suspending is a design choice, not a cost.** `human` and `sell` stop the run
until someone acts. A workflow that never suspends has decided nobody needs to
approve anything — make sure that was deliberate.
**Name nobody.** An assignee, a signature, a business name belongs in a
`{{ placeholder }}`. A workflow with a person's name in it is that person's
workflow, not a template.
**A trigger must be a real surface.** `trigger:` names a source this site
actually emits. Inventing one produces a workflow that is valid, pushed, and
never fires.Make Your Ideas Real. Build Apps, Websites and AI Agents with Plain English with Astro, React, Shadcn and Cloudflare
Astro 7 conventions for ONE sites — plugin wiring via one.config.ts, OneChat/OneTrack placement, Cloudflare SSR. Invoke when…
React 19 conventions in ONE sites — client islands, @oneie/react hooks, no useEffect for ONE data. Invoke when editing .tsx…
Use the ONE backend (@oneie/sdk) from this frontend via the plugin-backend wrapper. Invoke when reading/writing ONE data in API…
shadcn/ui under the ONE 6-token design system — CSS var tokens only, no hex, add components via the CLI. Invoke when editing…
Give this workspace a resource type — products, lessons, tickets, whatever the business actually tracks — by writing one TOML…
Put words on this site — a blog post, a docs page, a product, or a live page from ONE's editor. Knows which of the four surfaces…