# Documentation
> How to drive Radial from the terminal, from your agent, and from your own code.
Radial is an issue tracker with a real command line, a remote MCP server and a
REST API. Nothing in the product calls a model on your behalf; the agent is
yours, and these pages are about pointing it at your issues.
## Start here
**[Agent skills](/docs/skills)**: eleven `rd-*` skills that teach Claude Code
and Codex the whole loop: plan a change into a parent and a few children, file
the tree, build it child by child leaving notes on each issue, and open a pull
request that does not auto-close the siblings. Install them in about a minute.
**[Install and update](/docs/skills/install)**: where the files go for each
client, global versus per-repo, and what to do when a skill does not show up in
the picker.
**[Extending a skill](/docs/skills/extending)**: add your team's rules to a
built-in without forking it, so you keep getting updates and we never overwrite
your conventions.
## The rest of the developer surface
The CLI reference, the MCP tool list and the REST API all live on
[developers](/developers) for now. The command you probably want first:
```bash
npm install -g radial.build && radial auth
```
Every page here is also markdown. Add `.md` to any docs URL, or read
[llms.txt](/llms.txt) for the index and [llms-full.txt](/llms-full.txt) for the
whole corpus in one request.
---
# Agent skills
> Eleven rd-* skills that teach Claude Code and Codex how to plan, file, build and ship work in Radial.
A skill is a folder with a `SKILL.md` in it. Your agent reads the description,
decides the skill applies, and follows the procedure inside. That is the whole
mechanism: no plugin, no runtime, no code executing on your machine that you
cannot read in a text editor.
The `rd-*` pack is eleven of them, covering the loop from "we should probably do
X" to an open pull request, plus four you run on their own to keep a backlog
honest. They are [MIT and public](https://github.com/BrainGridAI/radial/tree/main/skills):
read them, fork them, send a pull request.
## Install in 60 seconds
```bash
radial skills install
```
That writes the pack into `~/.claude/skills` and `~/.agents/skills`. Restart
your agent, then type `/rd-setup` in Claude Code or `$rd-setup` in Codex.
Working in one repo rather than everywhere?
```bash
radial skills install --project
```
Full detail, including the other two installers and what to do when nothing
shows up: [Install and update](/docs/skills/install).
## The workflow, in order
| Skill | What it does |
| --- | --- |
| `rd-setup` | CLI, sign-in, team, `.radial/config.json`, the agent instructions, the pack |
| `rd-plan` | An idea becomes one parent and two to four children with acceptance criteria |
| `rd-prototype` | One clickable HTML file, attached to the issue with a Preview URL |
| `rd-issues` | Files the tree, wires the `blocked-by` edges, reads every issue back |
| `rd-build` | Works the tree child by child: in progress, build, gate, notes, in review |
| `rd-verify` | Resolves and runs this repo's gate, then reads the summary line |
| `rd-pr` | Branch, base sync, commit, pull request with sibling ids scrubbed |
They chain, but nothing forces you through all seven. `/rd-plan` on its own is
useful. So is `/rd-verify`.
## Hygiene, any time
| Skill | What it does |
| --- | --- |
| `rd-triage` | Ranks open parents Now, Next, Later, Icebox from real signal |
| `rd-cleanup` | Open children under done parents, closed or promoted on evidence |
| `rd-changelog` | Completed issues become Feature, Improvement and Fix entries |
| `rd-retro` | Scores one finished build against the workflow, with evidence |
## Three things worth knowing before you start
### The description is the interface
Your agent picks a skill by reading its `description` frontmatter and nothing
else. That is why each one names Radial, the issue tracker, and the client it
runs in, and why you invoke a skill by describing your situation rather than by
memorising its name.
### They read and write through the `radial` CLI
Which means they respect your session, your scope and your team. A read-scoped
key stops `/rd-issues` at the first create with a clear message, rather than
half-filing a tree.
### A tree ends in review, never done
`/rd-build` moves each child to in review and stops. Closing is a human
decision, and a workflow that closes its own work hides the moment someone
should look at it.
## Change them without forking them
Every skill has named extension points. You write a small wrapper that adds your
rules at those points and keep receiving updates to the skill itself:
```bash
radial skills extend rd-build --name team-build
```
See [Extending a skill](/docs/skills/extending).
## Where the files live
| Path | What it is | Commit it? |
| --- | --- | --- |
| `.radial/config.json` | The team key for this repo | yes |
| `.radial/skills//` | Your wrappers | yes |
| `.radial/changelog.md` | What `rd-changelog` writes | yes |
| `.radial/plans/` | Plan bodies, scaffolding for `rd-issues` | no |
| `.radial/prototypes/` | Prototype HTML before it is attached | no |
`radial skills update` picks up new versions; `radial skills list` shows what
you have against what is published.
---
# Install and update
> Where the rd-* skills go for Claude Code and Codex, global versus per-repo, and what to do when one does not show up.
Both clients load skills from a directory. Installing is copying files into it.
The CLI does that, verifies each file against a published hash, and records what
it wrote so it can update or remove exactly those files later.
## Claude Code
```bash
npm install -g radial.build
```
Homebrew works too: `brew install BrainGridAI/radial/radial`.
```bash
radial skills install --agent claude
```
Files land in `~/.claude/skills/rd-*`. Leave off `--agent` to install for every
client the CLI can see on this machine.
Both clients read the skills directory at startup, so a running session will not
see a skill that appeared underneath it.
Type `/rd-` and the eleven names should complete. `radial skills list` shows the
same thing from the terminal, with an arrow beside anything out of date.
## Codex
```bash
radial skills install --agent codex
```
Files land in `~/.agents/skills/rd-*`. If this machine's Codex reads
`$CODEX_HOME/skills` instead (older builds default that to `~/.codex/skills`),
the installer detects it and writes there, recording the directory it chose in
the lock so `update` and `remove` go to the same place.
Type `$rd-setup`. `radial skills list` shows the same set from the terminal.
## Global or per-repo
Global is the default and is usually right: the skills are generic, and you want
them wherever you work.
`--project` writes into `.claude/skills` and `.agents/skills` under the current
directory instead, and locks to `.radial/skills.json` beside them. Use it when
you want the pack committed with the repo so a teammate gets it by cloning, and
when the repo has wrappers: `--project` copies those alongside, so
`/team-build` is invocable directly.
```bash
radial skills install --project
```
## The team key
Every skill needs to know which Radial team to file into. It resolves in this
order, and stops at the first answer:
1. `.radial/config.json` → `{ "team": "RAD" }`
2. A `radial team` line in `CLAUDE.md` or `AGENTS.md`
3. `radial team list`, and exactly one team means use it, and write it down
4. Ask you once, then write it down
`/rd-setup` does all of this, including creating the team if you do not have
one.
## Updating and removing
```bash
radial skills update # only what changed is rewritten
radial skills list # installed vs published
radial skills remove rd-retro # only the files the lock recorded
```
`update` reports one line per skill: `installed`, `updated` or `current`. It
deletes files a new version dropped, so a renamed reference file cannot linger
and get read as current. `remove` deletes only paths the lock recorded and tells
you about anything else it found in the folder rather than taking it with it.
## Other installers
The pack is a public repo with a plain `skills/` directory, so the generic
installers work with no extra hosting:
```bash
npx skills add BrainGridAI/radial
codex -- '$skill-installer --repo BrainGridAI/radial --path skills/rd-plan'
```
Both copy the same files. The CLI is the recommended door only because it ships
as a binary, verifies hashes, keeps a lock and can update and remove.
## When it does not work
| What you see | Why |
| --- | --- |
| The skill is not in the picker | The client was already running. Restart it. |
| `radial: command not found` | The CLI is not on PATH. `npm install -g radial.build`, or use the Homebrew formula. |
| Codex does not see skills that Claude Code does | Your Codex reads a different directory. `radial skills list --json` shows the directory the installer chose; compare it against `$CODEX_HOME`. |
| One skill says `failed` and the rest install | Its bytes did not match the published hash. That is the guard working: re-run, and if it persists, open an issue rather than forcing it. |
| `Refusing to fetch over plain http` | `RADIAL_SKILLS_URL` points at an `http://` origin. Use `https://`, or pass `--insecure` if it is your own mirror on a trusted network. |
| A directory is "skipped, symlink" | Your skills directory is a symlink. The installer will not write through one; point `--agent` elsewhere or replace the link. |
| Two machines disagree about what is installed | The lock is per home directory (or per repo with `--project`). Run `radial skills update` on the other one. |
| A wrapper is refused as "reserved" | `rd-*` names belong to the pack, so an update never fights your wrapper for a name. Rename it. |
`radial skills install --dry-run` prints exactly what it would write and touches
nothing. Useful the first time, and in a script.
---
# From an idea to a pull request
> The seven workflow skills walked end to end on one real feature, with the commands and the tree they produced.
This is one real run, not an illustration. The feature is the skills pack you
are reading about: it was planned, prototyped, filed, built, verified and
shipped with these seven skills, against team `RAD` in a live workspace. The
excerpts below are trimmed for length; nothing is invented.
## The seven steps
```bash
/rd-setup
```
Leaves `.radial/config.json` with your team key, a Radial block in `CLAUDE.md`
and `AGENTS.md`, and the pack installed. Re-running it changes nothing and says
so.
```bash
/rd-plan "let users install our agent skills with one command, and document it"
```
Reads the repo, searches Radial for anything that already covers it, and writes
one parent plus a handful of children to `.radial/plans/.md`. Creates
nothing. What comes back in chat is a breakdown table and the open decisions.
This run had two, about where the pack should be sourced and how extensions
should be shaped, and both changed the plan.
```bash
/rd-prototype
```
One self-contained HTML file with every screen and state, attached to the
parent. A reviewer clicks a Preview URL and says no in five minutes rather than
after the build.
```bash
/rd-issues --start
```
Parent, children, the `blocked-by` edges, then a read-back of every issue. This
run produced six children under one parent with eight dependency edges: two
more than `rd-plan`'s usual two-to-four, because the tree spans two
repositories and each repo's half has to merge on its own.
```bash
/rd-build
```
Per child: in progress, build from the plan, check every acceptance line, run
the gate, drive that child's browse checks against the running app, post
implementation notes, move to in review.
```bash
/rd-verify
```
Called per child by `rd-build` and again before the pull request. Runs each
command once to a log and quotes what it found.
```bash
/rd-pr
```
Branch named from the parent, base synced, commits, and a body whose sibling
issue ids are rewritten so the merge cannot close work nobody reviewed.
## The tree it produced
```text
$ radial show RAD-374 --team RAD
RAD-374 Radial agent skills: open-source rd-* pack with extension hooks,
radial skills CLI, and docs
Status In Review
Labels claude, Feature
Sub-issues 6
RAD-375 skill format, hook convention, manifest, guards, README
RAD-376 workflow skills: setup, plan, prototype, issues, build, verify, pr
RAD-377 hygiene skills: triage, cleanup, changelog, retro
RAD-378 radial skills install|update|list|remove|extend + label flags
RAD-379 /docs surface, agent twins, install + extending pages
RAD-380 per-skill reference, walkthrough, issue body, conventions
```
Each child carries its own body with a goal, a file list and acceptance
criteria, each has an implementation-notes comment from the build, and the
whole tree ends in review. A human merges and closes.
## What you actually type
Only two of the seven take an argument. The rest read the state they need:
| Step | The whole command |
| --- | --- |
| Plan | `/rd-plan ""` |
| File | `/rd-issues` or `/rd-issues --start` |
| Everything else | the skill name on its own |
Nothing forces you through all seven. `/rd-plan` on its own is useful, and so
is `/rd-verify`. The chain is a default, not a contract.
---
# rd-setup
> Get a repo and a machine ready for Radial. CLI, sign-in, team, config, agent instructions, and the skill pack.
`rd-setup` takes a repo from nothing to ready: the `radial` CLI on PATH, a
signed-in session, a chosen team, and the conventions written down where both
your agent and your teammates can see them. Every step is idempotent, so
running it on a repo that is already set up is the cheapest way to check.
> Set this repo and this machine up for Radial, the keyboard-first issue
> tracker, so the rest of the rd-* skills work in Claude Code and Codex.
## When to use it
First time in a repo, on a new machine, or when another skill stops because it
cannot resolve the team key. Not for filing or planning work: those are
`/rd-issues` and `/rd-plan`.
## What it asks you
As little as it can. If `radial team list` returns exactly one team it uses it
without asking. If it returns several it shows you the table and asks which one
this repo files into. If it returns none it asks for a name and a key. It asks
once more before adding the MCP server config, because MCP is optional: the
skills drive the CLI, and MCP only pays off for a hosted agent with no shell.
## What it writes
`.radial/config.json` with your team key, and `.radial/.gitignore` so plans and
prototypes stay out of git while wrappers and config stay in. A short Radial
block in `CLAUDE.md` and `AGENTS.md` naming the team and the two CLI rules that
bite. Then the skill pack, into your agent directories. It touches no issue in
Radial.
## Extension points
## A worked wrapper
```markdown
---
name: acme-setup
description: Acme's setup rules on top of rd-setup — SSO, the shared project, the on-call note.
extends: rd-setup
---
Read rd-setup first, then apply the sections below at their hooks.
## extra-checks
- Acme uses SSO. If `radial whoami` reports a credential from `RADIAL_KEY`,
stop and say: personal keys are for CI only, sign in with `radial auth`.
- Refuse to continue on a scope below `write`; name the scope you saw.
## extra-config
- Write `"project": "Platform"` into `.radial/config.json` alongside the team.
- Add the on-call rota link to the Radial block in `CLAUDE.md`.
## after-setup
- Open a first issue titled "Set up in Radial" and close it, so the team
shows up in the activity feed.
```
## What it never does
It never writes to `.env` or any secret file: a credential goes through
`radial auth` or `RADIAL_KEY`. It never creates a team without asking, and
never picks between several for you. It never rewrites an existing Radial block
in your `CLAUDE.md` beyond adding a line that is missing; your wording stays.
---
# rd-plan
> Turn an idea into one parent and two to four children with acceptance criteria, written to a file so you can argue with it before it becomes a tree.
`rd-plan` turns "we should probably do X" into a reviewable plan: one parent, a
small number of children that each merge on their own, and acceptance criteria
written as things you can observe. It writes one markdown file and creates
nothing in Radial, which is the point: a plan is cheap to argue with and a
filed tree is not.
> Turn an idea into a plan for Radial, the keyboard-first issue tracker: one
> parent issue plus two to four children, each with a goal, a file list and
> acceptance criteria anyone can check.
## When to use it
Before any change big enough that you would otherwise open five tabs and start
guessing. Not for a one-line fix: `radial create` and move on.
## What it asks you
Only what it cannot read out of the repo, and all at once. It opens the code
the idea touches before decomposing anything, so its questions are about
decisions rather than facts: which of two approaches you want, whether an
existing surface should change, what is deliberately out of scope. A plan that
names no real file is a guess, and it will tell you which files it read.
## What it writes
One file, `.radial/plans/.md`, holding the parent body and every child
body in full. Nothing else. In chat you get a breakdown table, the out-of-scope
list, and any open decision written as a default and an alternative.
The reads it does first are what keep it honest: `radial workspace show --json`
for the real status, label and priority names, and `radial search` per
candidate title so it does not file a second tree for work that already exists.
## The shape it produces
```text
P Parent: the goal, the scope, the decisions
├── C1 merges alone
├── C2 merges alone blocked-by C1
├── C3 merges alone blocked-by C1
└── C4 merges alone blocked-by C2, C3
```
One child is one merge. If a child cannot merge on its own without breaking the
default branch, it is not a child, and it gets folded into its neighbour.
## Extension points
## A worked wrapper
```markdown
---
name: payments-plan
description: Payments team rules on top of rd-plan, the questions we always forget and the bar we hold.
extends: rd-plan
---
Read rd-plan first, then apply the sections below at their hooks.
## extra-questions
- Does this touch money movement? If yes, ask which ledger accounts change and
whether a reversal path exists.
- Ask which regulator-facing report this shows up in, or state that none does.
## extra-sections
- Every child body gets a `**Rollback:**` section naming the exact revert path.
## extra-checks
- No child may name a file under `src/ledger/` without also naming a test file.
## plan-bar
- Every child needs at least three acceptance criteria, one of which is an
observable failure case.
## after-plan
- Post the breakdown table to #payments-eng before filing anything.
```
## What it never does
It never creates, updates or closes an issue. It never writes an acceptance
criterion that asserts an implementation detail, because a test bound to the
mechanism you chose becomes the bug's bodyguard after the rewrite. It never
puts the full bodies in chat, and it never invents a status, label or priority
name. It reads them from your workspace.
---
# rd-prototype
> Build one self-contained clickable HTML file from a plan or an issue, and attach it so reviewers click a Preview URL instead of reading a description.
`rd-prototype` builds one HTML file showing every screen and state a plan
names, opens it locally, and attaches it to the Radial parent so the Preview
URL can be shared. It is throwaway by design: real copy, fake data, no
dependencies, nothing that survives into production.
> Build one self-contained clickable HTML prototype from a plan or from a
> Radial issue, then attach it to the issue so reviewers click a Preview URL
> instead of reading a wireframe description.
## When to use it
A change with a visible surface, before anyone writes the real component. Also
on an existing issue, when a reviewer says they cannot picture it. Skip it for a
change with no screen, and say why rather than skipping silently.
## What it asks you
Almost nothing up front, and one thing at the end: a reaction. It reads the
plan or the issue for `**UX:**` lines and browse checks, then reads your repo
for the visual language it should copy: the theme file, the type scale, the
spacing rhythm, one shipped screen to take the chrome from. If the repo has no
visual language yet it picks one deliberately and tells you which.
## What it writes
`.radial/prototypes/.html`, one file. When the tree exists it attaches it
to the parent and adds a `**Prototype:**` line with the Preview URL to the
parent body, deleting the previous attachment first so the newest file is
unambiguous. When the tree does not exist yet it leaves the file for
`/rd-issues` to attach. It changes no status, assignee or label.
## The constraints, and why
The file has no external URL in it: no CDN, no web font, no image host. A
prototype that needs the network renders blank in a reviewer's sandbox, which
is exactly where Preview URLs are opened. Every screen the plan names is
reachable from an index at the top, because a reviewer who has to guess how to
reach screen four will review screens one to three. Every state is shown
(empty, loading, error, denied) because states are where designs actually fail,
and real copy is used, because placeholder text hides the hardest layout
problem, which is always the long string.
## Extension points
## A worked wrapper
```markdown
---
name: design-system-prototype
description: Our design-system rules on top of rd-prototype.
extends: rd-prototype
---
Read rd-prototype first, then apply the sections below at their hooks.
## extra-craft
- Copy the tokens from `src/styles/tokens.css` verbatim into the `