add-to-roadmap
Use when you want to append a new task to a specific phase or section of the project ROADMAP.md. Accepts a fuzzy phase-or-section name and task text, locates the correct section via case-insensitive substring match, formats the new item to match the existing schema, and inserts it at the bottom of that section's checkbox list. Always shows a unified diff and requires operator confirmation before writing.
- License 许可
- MIT
- 最近更新
- 2026-09-10
- Stars
- ★ 3
- Forks
- 1
01 前言 Front Matter
- name
- add-to-roadmap
- description
- Use when you want to append a new task to a specific phase or section of the project ROADMAP.md. Accepts a fuzzy phase-or-section name and task text, locates the correct section via case-insensitive substring match, formats the new item to match the existing schema, and inserts it at the bottom of that section's checkbox list. Always shows a unified diff and requires operator confirmation before writing.
- argument-hint
- <phase-or-section> :: <task-text>
- user-invocable
- true
03 SKILL.md 正文
/add-to-roadmap
Add a new task item to a named phase or section in ROADMAP.md.
Arguments: $ARGUMENTS
Parse $ARGUMENTS by splitting on the first occurrence of :: (space,
double-colon, space). Left side (trimmed) → <phase-or-section>. Right side
(trimmed) → <task-text>. If :: is absent, stop immediately with:
"Malformed arguments: expected
<phase-or-section> :: <task-text>— the::separator is missing."
Locating ROADMAP.md
Start at CWD and walk up the directory tree, checking each directory for a file
named exactly ROADMAP.md. Stop walking at the git repository root:
REPO_ROOT=$(git rev-parse --show-toplevel) || exit 1
If git rev-parse fails (not a git repository), stop with:
"Not a git repository. /add-to-roadmap requires a git repo at CWD."
Walking up: check $CWD/ROADMAP.md, then $CWD/../ROADMAP.md, and so on,
stopping at $REPO_ROOT inclusive. If ROADMAP.md is not found in any of those
directories, stop with:
"ROADMAP.md not found anywhere between CWD and the repository root (
$REPO_ROOT). Create one or move to a subdirectory of a repo that has one."
Address-space resolution
Parsing headers
Scan every line of ROADMAP.md. Collect all addressable headers:
## Phase N — ...lines → Phase headers (level 2).### ...lines → Subsection headers (level 3).
Build an ordered list of (header_text, start_line) tuples. header_text is
the full text after ## or ### (without the # prefix or trailing
whitespace).
Fuzzy contains-match
Normalize the operator-supplied <phase-or-section> by lowercasing it. For each
header in the collected list, lowercase header_text and check whether the
normalized input is a substring of the normalized header text. This match is
case-insensitive.
Example: input "phase 2" matches ## Phase 2 — Skill hardening because
"phase 2" is contained in "phase 2 — skill hardening".
Example: input "measurement" matches ### Measurement & perception because
"measurement" is contained in "measurement & perception".
Match outcomes
Zero matches: Stop with:
"No headers matched
<phase-or-section>. Available headers:<bulleted list of all header_text values>."
Multiple matches (disambiguation): Stop with:
"Ambiguous:
<phase-or-section>matched more than one header. Please narrow the input:
<header_text_1>(line N)<header_text_2>(line N) ..."
List every matching header so the operator can refine the input.
Exactly one match: Proceed to insertion.
Nested-section name collision precedence
A Phase-2 header might contain the same substring as one of its child Subsection
headers — for example, if a Phase is named
## Phase 5 — Skill catalog expansion and a subsection under it is
### Skill-testing & operator-mode skills, then the input "skill" matches
both. This is treated as an ambiguous match (multiple matches) regardless of
nesting depth — there is no automatic promotion of Phase headers over Subsection
headers or vice versa. The operator must supply a more specific input to resolve
it.
Item formatting
Schema (from ROADMAP.md)
New items follow the checkbox format observed in the existing roadmap:
- [ ] **<bold-name>** — <description>
The separator between the bold name and description is an em dash (—), not
a hyphen or en dash. A single space precedes and follows the em dash.
Deriving <bold-name> and <description>
Split <task-text> on the first — (space, em dash, space) if present:
- Left side →
<bold-name>(strip backtick-wrapped skill names if relevant). - Right side →
<description>.
If no em dash is found in <task-text>, use the entire text as <bold-name>
and leave <description> empty, yielding - [ ] **<task-text>**.
Multi-line wrap
If the formatted item line exceeds 80 characters, wrap at a word boundary
and continue subsequent lines with a 6-space continuation indent (six space
characters). The leading - [ ] prefix is 6 characters, so continuation lines
align visually with the text start.
Example (wrapping a long description):
- [ ] **`/my-skill`** — a long description that needs to wrap at the 80-char
column so the continuation is indented six spaces to align with the
text start.
Backtick-wrapped names such as `/skill-name` or `tool.py` should be
preserved as-is inside the bold span.
Insertion
Finding the bottom of the section
After resolving the target header at start_line, scan forward line-by-line to
find the end of that section's checkbox list. The section ends at the first line
that matches any of:
- Another
##-level header (same or higher level). - End of file.
The "bottom of the section's checkbox list" is the last line that begins with
- [ ] or - [x] before the section boundary. Insert the new item on the line
immediately following that last checkbox line.
If the section contains no checkbox lines at all, insert the new item immediately after any blank line following the header (or directly after the header if there are no blank lines), creating the first checkbox entry.
Confirmation before writing
Before modifying the file, compute a unified diff between the current content and the proposed new content:
--- ROADMAP.md (original)
+++ ROADMAP.md (modified)
@@ ...
Show the diff to the operator and require explicit confirmation before writing. If the operator declines, abort with no changes made.
After confirmation, write the modified file.
Examples
Phase match
/add-to-roadmap "Phase 2 :: **`/audit-skill`** — spot-check every SKILL.md for missing argument-hint fields"
Matches ## Phase 2 — Skill hardening. Inserts the formatted item at the bottom
of the Phase 2 checkbox list.
Subsection match
/add-to-roadmap "Measurement :: **`/latency`** — help Claude reason about latency budgets"
Matches ### Measurement & perception (because "measurement" is a substring
of "measurement & perception", case-insensitively). Inserts at the bottom of
that subsection's checkbox list.
Ambiguous match
/add-to-roadmap "skill :: **`/foo`** — example"
If both ## Phase 1 — Plugin packaging and
### Skill-testing & operator-mode skills contain the substring "skill", the
skill stops with a disambiguation listing showing both headers and their line
numbers.
Malformed args
/add-to-roadmap "Phase 2 — missing the double-colon separator"
Stops immediately: " :: " separator is missing.
Error reference
| Scenario | Error message |
|---|---|
| Not a git repo | "Not a git repository..." |
| ROADMAP.md not found | "ROADMAP.md not found anywhere..." |
Missing :: separator |
"Malformed arguments: expected ... :: ..." |
| Zero matches | "No headers matched <input>. Available:..." |
| Multiple matches | "Ambiguous: <input> matched more than one..." |
04 同仓库更多 Skills
visual-aid
Use when the user asks for a quick visual aid, visual explainer, concept card, one-pager, poster, cheat sheet, infographic, visual summary, summary card, or mini explainer page — especially from input like a block of text, attached images, an attached song (lyrics/audio), a web link, a CSV/dataset, a math formula, a code snippet to walk through, a tutorial's steps, a timeline, or an A-vs-B comparison. Triggers include "make me a quick visual aid", "turn this into a one-pager / cheat sheet / explainer", "summarize this visually", "give me a visual of", "explain this on a single page", "make a concept card for", "whip up a page about", "build a mini page that shows", "something I can paste into a doc explaining X", or any request to render a topic/text/link/image-set/song/data into a standalone page. Prefer this skill over frontend-design when the ask is an explanatory single-file page (not a production UI), over playground when the output is static information display (not an interactive configurator), and over a Markdown/code answer when the user explicitly wants a *page* (HTML). Produces a single self-contained HTML file that opens on double-click without a server.
tesseract
Use when you've been poking at the same file, concept, or problem across many sessions and want to step outside time to see its whole arc — or when you want to leave a note for next-session-you. Triggers: 'I've been going in circles on X', 'what have I learned about X', 'what did past-me say about X', 'I keep rediscovering this'.
tdd
Invoke test-driven development as an explicit one-at-a-time micro-cycle — one test, one piece of functionality, refactor, then repeat for the next behavior
tdd-cat
TDD workflow with subagent-driven-development — /tdd composed with /cat, plus the A/B TDD execution-mode axis (split-phase vs micro-cycle) asked as a third question in /cat's combined pre-dispatch question
task-list
TaskCreate / TaskUpdate / render the current TaskList in response to `/task-list` (with or without flags). The skill body executes immediately on the syntax — no permission-seeking, no echoing the list back as plain text.
sync
Sync files between two local directories, repos, or git worktrees. Five modes (plan/interactive/push/pull/mirror), .gitignore-aware, Claude-workflow allowlist via --claude, dropbox-restore-style per-directory prompts.