Story workflow
The daily loop from the terminal — see progress, pick up a story, run its criteria, mark it done, stop it or add a new one.
These are the commands you use most. You pick up a story, prove its acceptance criteria pass, and mark it done. All of them need a connected checkout (see intentdocs init).
Note: Changing a story (starting it, finishing it, stopping it, adding one) needs edit rights on the project. The server also refuses these changes when the map owner's trial has ended without an upgrade.
intentdocs status
Shows progress for the connected story map.
intentdocs statusNo arguments or options. Prints the map title, a progress bar with the percentage done, counts for done, in progress and todo, the done count for each activity, and the five most recent events from the project's activity feed.
Checkout app
████████░░░░░░░░░░░░ 40%
✅ Done: 12
🔨 In progress: 2
⬜ Todo: 16
── Total: 30
Sign up: 4/5 (80%)
Checkout: 6/15 (40%)intentdocs stories
Lists stories, grouped by activity or as a kanban board.
intentdocs stories [options]| Option | Default | Meaning |
|---|---|---|
-f, --filter <filter> | none | A status (todo, in-progress, in_progress, wip, done), or text matched against story titles and activity names |
-s, --status <status> | none | An exact status: todo, in-progress, in_progress, wip or done |
-k, --kanban | off | Show three columns, todo, in progress and done, sized to your terminal |
intentdocs stories --status wip
intentdocs stories --filter checkout --kanbanEach line shows a status icon, the title (first 70 characters) and the story's key, or the first eight characters of its ID when it has no key.
Behaviour to know:
- When you pass both,
--statuswins and--filteris ignored. - An unknown
--statusvalue exits1. An unknown--filtervalue is treated as search text. - Text search ignores case.
intentdocs next
Shows the next story to build. It does not change anything.
intentdocs next [options]| Option | Default | Meaning |
|---|---|---|
-o, --open | off | Open the story's spec page in your browser |
--skip-wip | off | Show the next todo story even when stories are in progress |
--story-id <id> | none | Show this story instead of choosing one. Takes a key, ID or ID prefix. |
intentdocs next
intentdocs next --story-id PB-42 --openHow it chooses:
- With
--story-id, it shows that story. - Otherwise, if any story is in progress and you did not pass
--skip-wip, it lists those stories and stops. Finish them first. - Otherwise, it takes the todo stories that are in the build order and whose dependencies are all done, and sorts them by build step, then release, then priority (
must,should,could), then effort (S,M,L,XL). It shows the first. - When no todo story qualifies, it tells you why: stories are unsequenced, blocked by unfinished dependencies, or everything is done.
It prints the title, activity, priority, effort, release, build step, the acceptance criteria, the full ID, the spec URL, whether an implementation plan is ready, and the implement command to run next.
Note:
nextnever offers a story that is not in the build order. Sequence it on the Plan view first, or name it with--story-id. When you name an unsequenced story,nexttells you that starting it adds it to the end of the build order.
intentdocs implement
Marks a story in progress and writes its context file.
intentdocs implement <id> [--stub]| Argument | Meaning |
|---|---|
id | The story's key, ID or ID prefix |
| Option | Default | Meaning |
|---|---|---|
--stub | off | Suggest a verification command for each criterion that does not have one. Runs on the key saved with intentdocs keys set, or your plan. |
intentdocs implement PB-42
intentdocs implement PB-42 --stubWhat it does, in order:
- If the story is done, it says so and stops.
- If the story is already in progress, it says so, prints the
donecommand, and stops. It does not rewrite the context file. - If the story has unfinished dependencies, it lists them and stops.
- If the story is sized
XL, it suggests breaking it down and asks you to confirm. Without a terminal to answer, it skips the story. - If the story has no acceptance criteria, it warns you and continues.
- It sets the story to in progress and clears any earlier stop signal. A story that is not yet in the build order is added to the end. If the server refuses, it prints the server's reason and
Not picked up, writes nothing, and exits1. - It writes
.intent/stories/<id>.mdwith the story, its criteria and checks, its implementation plan when one is ready, and sections for your approach, notes, decisions and relevant files. If the file already exists, what you wrote in those four sections is kept.
With --stub, it asks IntentDocs to suggest a command that would verify each criterion without an executable command. The suggestions run on the Anthropic key saved with intentdocs keys set, or on your plan, like complexity and research. It prints the suggestions and writes them to .intent/stories/<id>.checks.md. It does not change the criteria; copy the commands you want into each criterion on the web, then run them with intentdocs check.
When the server can't run the suggestions (no paid plan and no saved key), the CLI uses ANTHROPIC_API_KEY from your environment if it is set, and calls the Anthropic API directly. Otherwise, or when the request fails, it prints a warning and skips this step. The story is still picked up.
Note: Some projects require a person to mark a story ready for dev, or to approve its plan, before it is built. The server then refuses to move the story to in progress, and
implementprints its reason and exits1.
intentdocs check
Runs a story's executable acceptance criteria on your machine and prints pass or fail for each.
intentdocs check [idPrefix] [--report]| Argument | Meaning |
|---|---|
idPrefix | The story's key, ID or ID prefix. Optional; defaults to the one story in progress. |
| Option | Default | Meaning |
|---|---|---|
--report | off | Send the results to the story map, recorded as reported by a person |
intentdocs check
intentdocs check PB-42 --reportA criterion runs when its verification method is executable and it has a command. The command runs in your shell from the current directory, with a 30-second timeout. Exit code 0 is a pass; anything else is a fail. Every other criterion prints as manual and is skipped.
Checking: Password reset
────────────────────────────────────────
✅ [must][executable] Reset link works once
❌ [must][executable] Expired links are rejected
exit 1
⬜ [should][founder] The email reads clearly — manualEach line shows the criterion's priority (must, or should when none is set) and its method (executable, self-check, visual or founder). A failure prints the first line of the command's output.
Behaviour to know:
- With no
idPrefix, it exits1when no story or more than one story is in progress. - It exits
1when any criterion fails, with or without--report. --reportsends only the criteria it ran, with up to 1,000 characters of output each. Manual criteria are not reported.- Run it from the directory the commands expect, usually the repository root.
intentdocs show
Prints a story's full spec and refreshes its context file.
intentdocs show <id>| Argument | Meaning |
|---|---|
id | The story's key, ID or ID prefix |
intentdocs show PB-42Prints the status, title, activity, type, priority, effort, release, full ID and spec URL; the user story as "as a", "I want" and "so that"; the acceptance criteria; design references; notes; and evidence. It then refreshes .intent/stories/<id>.md from the live story, keeping what you wrote under Approach, Implementation notes, Decisions and Relevant files. Exits 1 when no story matches.
intentdocs done
Marks a story done.
intentdocs done <id> [--screenshot <path>] [--pr <url>]| Argument | Meaning |
|---|---|
id | The story's key, ID or ID prefix |
| Option | Default | Meaning |
|---|---|---|
--screenshot <path> | none | Attach this image to the story. .png, .jpg, .jpeg or .webp, up to 5 MB. |
--pr <url> | none | Link the story's pull request. |
intentdocs done PB-42
intentdocs done PB-42 --screenshot ./checkout.png
intentdocs done PB-42 --pr https://github.com/acme/app/pull/128What it does, in order:
- Checks the criteria. It prints each criterion with its priority and last result. A
mustcriterion blocks when its last result is notpass, including when it was never reported. Cancelled criteria andshouldcriteria never block. When something blocks, it lists the criteria and asksMark done anyway?. Answeryto override, or anything else to stop without changes. - Collects your notes. It reads the Implementation notes and Relevant files sections from
.intent/stories/<id>.md, if the file exists, and attaches them to the story. - Attaches a screenshot. It uses
--screenshotwhen you give one. Otherwise, when the project has an app URL, it captures that page with Playwright from your project's own dependencies (npm i -D playwright). A missing, oversized or failed screenshot is skipped and never blocks. - Marks the story done, then reads it back to confirm the server saved it. With
--pr, the pull request is linked to the story in the same update. When GitHub is connected, IntentDocs adds the "Spec → Code via intentdocs.com" footer to the PR body; when it is not, the CLI prints the footer line for you to add. - Reports releases. When this was the last open story in a release, it prints that the release is ready to close. A person closes it on Validate › Release; the CLI does not.
- Offers to log a decision or lesson learned, linked to the story.
Behaviour to know:
- With no terminal to answer (piped input, CI, an agent), the override is never granted and the decision prompt is skipped. A blocked story then exits
1with a message, rather than looking like success. Report the criteria first, withintentdocs check --reportor thereport_criteriaMCP tool. - The server applies the same
mustcheck, so a request that skips the CLI's prompt is still refused. - It exits
1when the server does not confirm the story is done. - A story that is already done prints
Already doneand exits0. --prneeds a full URL. Anything else exits1before the story is touched. The MCP toolscomplete_storyandlink_prlink a PR the same way. See Tools and resources.
intentdocs stop
Stops an in-progress story and tells any agent working on it to stop.
intentdocs stop <id>| Argument | Meaning |
|---|---|
id | The story's key, ID or ID prefix |
intentdocs stop PB-42Sets the story back to todo and records when it was stopped. The local MCP server then refuses every tool call that names the story, except list_stories and get_status, and tells the agent to stop work. Running intentdocs implement on the story again clears the stop.
If the story is not in progress, stop says so and changes nothing.
intentdocs add
Creates a story.
intentdocs add <title> [options]| Argument | Meaning |
|---|---|
title | The story's title. Quote it if it has spaces. |
| Option | Default | Meaning |
|---|---|---|
-a, --activity <activity> | the map's first activity | The activity to add the story under |
-p, --priority <priority> | should | must, should or could |
-e, --effort <effort> | M | S, M, L or XL |
intentdocs add "Password reset"
intentdocs add "Password reset" --activity Account --priority must --effort LPrints the new story's title, activity and the first eight characters of its ID.
Behaviour to know:
- The activity name matches regardless of case. A name that matches no activity creates a new activity.
- The story starts as todo in release 1, with no acceptance criteria and no place in the build order.
nextdoes not offer it until it is sequenced on the Plan view. You can still start it withintentdocs implement.