Init
π Prompt-engineering and project-roadmap plugin that crafts professional xml prompts and picks, surveys, and tracks your next tasks.
npx -y skills add V-Songbird/foreman --skill initAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
2 things to look at
- 29 days oldThe repository was created 29 days ago. New is not bad, but a brand new repository carrying a familiar-sounding name is the shape a typosquat arrives in, and there has been no time for anyone else to find a problem with it.
- 19 stars19 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
What its author says it does
Copied from the file, not written here
Bootstraps a project's ROADMAP.jsonl and .foreman/config.json. Asks what the project is and its near-term goals, asks whether the roadmap should accept Claude-suggested entries after commits, whether other plugins already own persona/tone, and whether finished work needs the user's confirmation before it's marked done, drafts an initial set of roadmap tasks, gets approval, then writes and commits both files.
SKILL.md
10.0 KB, as published. Nobody here has run it
foreman:init β bootstrap a project roadmap
Creates ROADMAP.jsonl and .foreman/config.json at the project root. Both
are committed to git β they're a shared project artifact, not personal
state. All reads/writes go through
${CLAUDE_PLUGIN_ROOT}/scripts/roadmap.js (see "Write phase" below) β it
enforces the write invariants (id computation, parse-before/after-write)
mechanically, so you don't have to. Skim
${CLAUDE_PLUGIN_ROOT}/roadmap-schema.md if you need field semantics
beyond what's obvious from the names (why/what/depends_on/touches).
If args were provided, treat them as the project description seed and skip asking for it in Call 1.
Pre-check
If ROADMAP.jsonl already exists at the project root, ask before doing
anything else:
Q1 β "ROADMAP.jsonl already exists. What do you want to do?"
Options: Overwrite it (start fresh β discards done entries and their accumulated notes), Keep it, just add to it, Cancel
- Overwrite β continue to Call 1, the draft phase replaces the file.
- Keep, add to it β skip straight to the draft phase, append new entries
instead of replacing, don't touch
.foreman/config.jsonif it already exists (ask the Call 2/Call 2b questions only if the config file is missing). - Cancel β stop here.
Call 1 β project and goals (batch 2)
Q1 β "What is this project?"
Options: I'll describe it (nudge the user to use Other and give a short
description β what it does, what stack, new or existing codebase)
Q2 β "What are the near-term goals for the roadmap?"
Options: I'll describe them (nudge toward Other β 2-5 concrete things
they want to get done soon)
Call 2 β the policy toggles (batch 4, these are the key decisions)
Q1 β "Should the roadmap accept Claude-suggested entries after commits?" Options:
Yes β ask me about opportunities found after each commitβ after everygit commit, Foreman's hook will prompt Claude to scan for confirmed bugs/opportunities/ideas from that work and ask what to do with each one.No β the roadmap only grows from what I add myselfβ the commit hook stays completely silent; nothing gets suggested, ever, until re-run.
Record the answer β it becomes .foreman/config.json's discoverySuggestions
field verbatim.
Q2 β "Do other plugins already own the persona or the voice in your sessions? (for example: razor owns persona, hush owns voice)" (multiSelect: true β a project may run one without the other) Options:
A persona plugin (e.g. razor)β crafted prompts open with domain framing instead of a "You are a [role]" sentence. Selecting this sets"usePersona": false.A voice plugin (e.g. hush)β crafted prompts skip the tone block. Selecting this adds"tone"toomitSections.
Neither selected means the template's defaults apply unchanged:
"usePersona": true, "omitSections": []. Both selected is the full trio
shape: "usePersona": false, "omitSections": ["tone"]. Leave
output_format alone either way β its default already defers to the
session's style, and it is the guard against raw XML tags echoing into
chat.
This is a declaration, not detection β Foreman never inspects which plugins the project runs; the user states the shape they want here.
Q3 β "When a commit looks like it finishes a task, should Foreman close it out right away?" Options:
Yes β mark it done as soon as the commit landsβ becomes"requireVerification": false.No β ask me to confirm it's verified firstβ the commit and its touched files are still recorded immediately, but the task stays in progress until you confirm the work actually holds up. Becomes"requireVerification": true.
Q4 β "When a tracked task completes but its roadmap entry is still open, what should Foreman do?" Options:
Nothingβ becomes"taskCloseGate": "off".Block completion until I close itβ the task stays incomplete until the roadmap entry is closed. Becomes"taskCloseGate": "block".
Call 2b β Fable access and decision notes (batch 2)
Q1 β "Can this project run Fable 5? (Max plan or API β other plans
can't)"
Options: Yes, No
Record the answer β it becomes .foreman/config.json's fableEnabled
field verbatim (Yes β true, No β false, the default). When true,
Fable becomes a selectable option alongside Haiku/Sonnet/Opus in
craft-prompt and foreman:roadmap's executing-model question; when
false, that question offers only the three models everyone can run.
Q2 β "When a task settles a real choice, should Foreman keep a short 'why we picked this' note and show it to later tasks that build on it?" Options:
No β don't keep decision notesβ (default) Foreman never asks for or surfaces these. Becomes"decisionLog": {"enabled": false}.Yes β keep themβ when a task decides between real alternatives, the handoff writes a short note (what was chosen and why) underdocs/foreman/, and future tasks that depend on it get pointed at that note before they start. Becomes"decisionLog": {"enabled": true}.
Default is No β a project that never wants written decision records can
decline without knowing what an ADR is. Record the answer as
.foreman/config.json's decisionLog field.
Draft phase (no AskUserQuestion)
From the Call 1 answers, draft 3β8 initial ROADMAP.jsonl lines following
the schema exactly:
source: "user"for every entry (nothing Claude-suggested exists yet β these came from the user's own stated goals).status: "planned",depends_onfilled in only where one task is obviously sequential to another (don't invent dependencies that aren't there).touchesas a best-guess area hint per task, or[]if genuinely unknown (a brand-new project has no files to point at yet β that's fine).- ids
"001"through"00N"(or continuing past the existing max, if appending to an existing file per the pre-check).
Present the draft as readable text, one task per line β title plus why
β not a raw JSON dump. The user should be able to skim it in a few seconds.
Call 3 β approval
Q1 β "Draft roadmap ready above. Proceed?"
Options: Looks good, write it, Let me adjust it first
If adjust: gather free-text revisions (add/remove/reword tasks), re-present the updated draft, ask again. Repeat until approved.
Write phase
- If the pre-check chose Overwrite: snapshot the existing file into git
before clearing it, so the discarded history is recoverable β
Bash:git commit -m "chore: snapshot roadmap before foreman re-init" -- ROADMAP.jsonl. Use that pathspec form, nevergit add+ commit: this branch runs in an established project where unrelated staged work is likely, and a broadgit addwould sweep it into a commit titled "snapshot roadmap". A non-zero exit is fine and expected (no repo, nothing to commit, a rejecting pre-commit hook) β but say which happened in the report-back, because it is the difference between "your old roadmap is in git" and "it is gone". Then clear the file βBash:> ROADMAP.jsonl(or delete it).roadmap.js addalways appends, so a fresh file means ids start at001again. - For each drafted task, call
addwith its fields as JSON over stdin:
The script computes the id, setsecho '{"title":"...","why":"...","what":"...","source":"user","depends_on":[],"touches":[]}' \ | node ${CLAUDE_PLUGIN_ROOT}/scripts/roadmap.js addstatus:"planned", stampscreated_at/updated_at, and validates the file after every write β no manual parsing, no hand-computed ids. A drafted task may onlydepends_ona task drafted above it: entries are written in this order, andaddrejects an id that doesn't exist yet. If any call returnswarnings, mention them once at the end rather than per entry. - Write
.foreman/config.jsonβ{"discoverySuggestions": <bool>, "usePersona": <bool>, "omitSections": [...], "requireVerification": <bool>, "taskCloseGate": "<off|block>", "fableEnabled": <bool>, "decisionLog": {"enabled": <bool>}}from the Call 2/Call 2b answers (skip this file write if the pre-check "keep, add to it" branch found an existing config already). If the file already exists,Readit first and set those seven keys on the parsed object β any other key present must survive untouched. This applies whenever the file exists, not only on the Overwrite branch: the pre-check only fires whenROADMAP.jsonlexists, so a project with a config but no roadmap is never asked anything and would otherwise have its config replaced silently. Today the keys at risk arecustomSections,targetModel, andcheckpointsβ init writes none of them β but the rule is "everything else survives", not a list, so the next key is covered without another edit. If the file exists but won't parse, write the six keys alone and say so in the report-back. - Stage and commit just these two files:
git add ROADMAP.jsonl .foreman/config.json && git commit -m "chore: init foreman roadmap"(Only the files this skill wrote β never a broadergit add.)
Report back: task count, discovery-suggestions on/off, Fable access
on/off, and point the user at /foreman:roadmap to pick up the first
task.