plan turns a plain-words description of a screen into a starting point: the
page recipe to start from (or none, when no page fits), the block recipes and
components that fit, the scaffold
command that copies the starter into your app, and the rules every recipe
follows. It works offline, and the same words always give the same answer.
Run plan before you build a new screen, so you start from a recipe and the
components that fit instead of from a blank file. It is a first step: once you
know which recipe you want, scaffold --show and scaffold take over. For the
props of a component it lists, use the Pluma MCP server (get_component) or the
docs at pluma.customer.io.
Describe the screen in plain words. Components the starter recipe already uses
are marked with *. The plan ends with the next step,
next: pluma-cli scaffold <id> <dest-dir> --framework <react|ember>, and the
scaffold --show <id> command to look at the recipe first. Run it without an
idea to see the workflow: plan, then scaffold --show, then scaffold, then
look up each component's props with the Pluma MCP server (get_component, or
plan_ui for this same plan) or the docs.
| Flag | Description |
|---|---|
--json | Print the plan as JSON (see JSON output). |
-h, --help | Show help. |
The idea can be one quoted argument or several words; plan joins them.
When no page recipe matches strongly, the plan says so and suggests starting
from a Page and the closest blocks. When nothing matches at all, it lists no
blocks or components and prints no next: step.
--json prints one object:
| Key | Value |
|---|---|
version | The shape of the plan. Currently 1. |
idea | The idea as you passed it. |
terms | The words of the idea plan matched on, in order, with filler words dropped. |
starter | The page recipe to start from, or null when none matches strongly enough. |
blocks | Block recipes that fit, best first, up to three. |
components | Components that fit, best first. |
scaffold | The scaffold command for the starter, or for the top block when there is no starter; null when neither is. |
rules | The rules every recipe follows, as sentences. |
starter and each entry in blocks is a recipe:
| Key | Value |
|---|---|
id | The recipe id scaffold takes. |
type | page or block. |
title | The recipe's title. |
description | What the recipe is for and when to use it. |
components | The ids of the Pluma components it uses. |
score | How strongly it matched; higher is better. |
matches | The words that matched it (see below). |
Each entry in components has id, title, description, score and
matches, and inStarter: true when the starter recipe already uses the
component.
Each entry in matches has term (the word from the idea), tier (where it
matched: name, keyword, typo or description), and synonym when the
word matched through a synonym.
The plan_ui tool of the Pluma MCP server
returns the same plan for the same idea, for agents.
| CLI | plan_ui parameter |
|---|---|
"<idea>" | idea |
--json | None: the tool always returns the plan as JSON. |
plan takes no flag but --json and -h/--help, and reads any other
argument that starts with - as a mistake. It prints the message and the help,
and exits with status 2. Remove the flag, or put the whole idea in quotes if a
word of it starts with -.
plan with no idea, or with only --json, prints the help and the workflow
and exits with status 0. Pass the idea in quotes:
pluma-cli plan "a settings page for workspace preferences".
No page recipe matched the idea strongly enough to start from. Build the page
from a Page and the blocks the plan lists, if any. Rewording the idea with the
words a recipe uses (list, settings, detail, wizard, dashboard and so on) can
help; pluma-cli scaffold --list shows every recipe and its description.