tp roadmap
ROADMAP.md is the plan: named epics in any order, each a list of
items, and every item an open issue on the release remote's forge
labelled roadmap (story 017,
ADR 0004). The forge is the
truth about what exists and what is done; the file is the grouped view
of it, and tp roadmap check keeps the two in step. tp check runs the
same lint whenever ROADMAP.md exists.
| Command | Does | Prints |
|---|---|---|
tp roadmap check |
lints the format, then every item against the forge | ROADMAP.md:LINE: finding per finding, exit 1; else the item count |
tp roadmap add TITLE... [--epic NAME] |
files an issue labelled roadmap (creating the label if the repo lacks it) and appends - #N TITLE to the epic, the last one by default |
#N url, then the epic it went under |
tp roadmap archive |
moves every item whose issue is closed out of the file: at code level 0 into CHANGELOG.md's [Unreleased] section, as a ### Roadmap list; at level 1 and up into a fragment each, changes/<n>.roadmap.md, which the batch release gathers into the version's ### Roadmap list (#142) |
one line per item moved, naming where it went |
Format
# Roadmap
## Release workflow
What the epic is about, in a sentence or two.
- #12 Custom step ordering
- #31 Deletes the merged story branch: once the tag is published,
the local branch goes too.
## Secrets
An epic is a ## heading with a name; its items are the - #N text
lines beneath it, the issue number first and free text after it, which
may run on over indented lines. The text need not match the issue's
title: the issue is the identity, the text is what the roadmap says
about it. Nothing is numbered, ticked or stamped.
A story that serves a roadmap item says so with a **Roadmap:** #N line
under its status; tp story issue carries it into the story's issue.
One roadmap item may inspire several stories, and it is done only when
they all are.
Lint
| Rule | Finding |
|---|---|
items are - #N text |
item has no issue, #N has no text |
items sit under a ## heading |
#N is outside any epic |
| nothing is numbered or ticked (story 009's format) | numbered item, numbered heading, ticked item |
| the issue exists on the forge | #N does not exist on the forge |
the issue is labelled roadmap |
#N is not labelled roadmap |
| the issue is open | #N is done — run: tp roadmap archive |
every open roadmap issue is in the file |
uncaptured: #N title, the first 5, then ... and N more uncaptured issues |
Without the forge (no token, offline) the format rules run and the
rest is reported as skipped. tp check shows the same findings, with
done and uncaptured items as warnings.
Done means closed
A roadmap item leaves the file when its issue is closed. tp roadmap archive does it on demand; tp release does it in the release commit,
so the item lands under the version that finished it, and offers to
close an open item whose stories have all shipped or ship in that
release. At code level 1 and up the [Unreleased] section may hold
nothing (the batch's CHANGELOG comes from fragments), so both write a
changes/<n>.roadmap.md fragment instead, committed with the story
that finished the item; the release renders the roadmap fragments as
the version's ### Roadmap list, after the Keep a Changelog sections,
and they bump nothing. See the
release workflow.
Migrating from numbered roadmaps
A roadmap in story 009's format fails the format lint. Migrate once, by
hand: ticked items go into the changelog under their stamped versions
as ### Roadmap lists, each open item becomes an issue with
tp roadmap add, and the epics keep their names and lose their
numbers.