| name | robo-implement |
| description | Robo Architect-aware implementation loop. Inherits speckit-implement; constrains file placement to the layout dictated by plan.md, ticks tasks.md checkboxes as work completes, registers scaffolded files in the graph via MCP, and never writes marker comments into developer source code. |
| extends | speckit-implement |
| requires-speckit | >=0.8.13, <0.9.0 |
| user-invocable | true |
Override 0 โ RequirementChange mode (CHG-NNN)
If the first argument starts with CHG-, switch entirely to RequirementChange implementation mode. Skip all spec/plan/tasks.md logic. Instead:
-
Fetch change data from the Robo Architect backend:
curl -s http://localhost:8000/api/requirement-changes/<change_id>
- Verify
status == "APPROVED". If not, report status and stop.
- Extract
originalPrompt and effects[].
-
Display summary of what will be implemented:
[<change_id>] <title>
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
์๋ณธ ์๊ตฌ์ฌํญ: <originalPrompt>
์ํฅ ๋
ธ๋ (<N>๊ฐ):
HIGH Aggregate Mileage โ <reason>
MEDIUM BoundedContext MembershipManagement โ <reason>
...
-
Implement each affected node in impactLevel order (HIGH โ MEDIUM โ LOW):
- UserStory/Feature: ๊ด๋ จ ์๊ตฌ์ฌํญ ๋ฌธ์๋ ์ธ์์กฐ๊ฑด(acceptanceCriteria) ํ
์คํธ์ ๋ณ๊ฒฝ ๋ฐ์
- Aggregate: ๋๋ฉ์ธ ๋ชจ๋ธ ํ์ผ์ ๊ฒ์ยท์์ (์์ฑยท๊ท์นยท๋ฉ์๋)
- BoundedContext: ์๋น์ค ๊ฒฝ๊ณยท์ธํฐํ์ด์คยท์ด๋ฒคํธ ๊ณ์ฝ ์
๋ฐ์ดํธ
- Command/Event: ์คํค๋งยทํธ๋ค๋ฌ ์
๋ฐ์ดํธ
๊ฐ ํ์คํฌ๋ง๋ค ์งํ ์ํฉ์ ๋ช
ํํ ์ถ๋ ฅํ์ธ์:
[1/N] ๐ฆ Aggregate: Mileage โ ์ฐจ๋ฑ ์ ๋ฆฝ ๋น์จ ๋ก์ง ์ถ๊ฐ
โ searching for Mileage implementation files...
โ editing src/mileage/Mileage.ts
โ ์๋ฃ
-
Mark IMPLEMENTED after all nodes are processed:
curl -s -X POST http://localhost:8000/api/requirement-changes/<change_id>/approve \
-H "Content-Type: application/json" \
-d '{"comment": "robo-implement ์๋ฃ"}'
์ค์ ๋ก๋ implement ์๋ํฌ์ธํธ ๋์ ์ํ ์ ํ:
curl -s -X POST http://localhost:8000/api/requirement-changes/<change_id>/implement \
-H "Content-Type: application/json" \
-d '{"includePriorChangeIds": []}' --no-buffer &
sleep 2 && kill $!
-
์ต์ข
๋ณด๊ณ :
โ
<change_id> ๊ตฌํ ์๋ฃ
๊ตฌํ๋ ๋
ธ๋: N๊ฐ
๋ณ๊ฒฝ๋ ํ์ผ: <๋ชฉ๋ก>
CHG-NNN ๋ชจ๋์์๋ plan.md, tasks.md, robo-project.json์ ์ฝ์ง ์์ต๋๋ค.
Override 0b โ Proposal sandbox mode (PRO-NNN)
If the first argument starts with PRO-, switch entirely to Proposal implementation mode. ์ด ๋ชจ๋๋ ๊ฒฉ๋ฆฌ๋ Git Worktree ์๋๋ฐ์ค(<projectRoot>/.sandbox/proposal/<PRO-NNN>) ์์์ ์คํ๋๋ค. specs/, plan.md, robo-project.json, MCP(register_implementation_files) ๋ก์ง์ ์ ๋ถ ๊ฑด๋๋ด๋ค. ๋์ :
-
์ปจํ
์คํธ + ์ฒดํฌ๋ฆฌ์คํธ ์ฝ๊ธฐ โ ์ํฌํธ๋ฆฌ ๋ฃจํธ(ํ์ฌ ๋๋ ํฐ๋ฆฌ)์์:
PROPOSAL_<PRO-NNN>.md โ ์๋ณธ ์๊ตฌ์ฌํญ + Strategic Diff(Epic/Feature/UserStory) + Tactical Diff(Aggregate/Command/Event/VO) + ๊ตฌํ ์ง์นจ.
PROPOSAL_<PRO-NNN>_TASKS.md โ speckit ํ์ ์์
์ฒดํฌ๋ฆฌ์คํธ(## Phase N: ์น์
๋ณ - [ ] T001 ...).
๋ ์ค ํ๋๋ผ๋ ์์ผ๋ฉด ๊ทธ ์ฌ์ค์ ๋ณด๊ณ ํ๊ณ ๋ฉ์ถ๋ค.
-
์์ฝ ์ถ๋ ฅ โ ์ ๋ชฉ / ์๋ณธ ์๊ตฌ์ฌํญ / ์ด ์์
์์ ๋ฏธ์๋ฃ ์.
-
๋ฏธ์ฒดํฌ ํญ๋ชฉ์ ์์์๋ถํฐ ์์๋๋ก ๊ตฌํ (PROPOSAL_<PRO-NNN>_TASKS.md์ - [ ] ๊ฐ๊ฐ):
-
์ ์ฝ:
- ์ด ์ํฌํธ๋ฆฌ๋ Proposal ์ ์ฉ ์๋๋ฐ์ค๋ค. ์์/๋ฉ์ธ ํ๋ก์ ํธ๋ ์ ๋ ์์ ํ์ง ๋ง์ธ์.
PROPOSAL_*.md๋ ์งํ ์ถ์ ยท์ปจํ
์คํธ ํ์ผ์ด๋ฏ๋ก ์ง์ ์ปค๋ฐํ์ง ์๋๋ค(์ด๋ฏธ .git/info/exclude๋ก ์ ์ธ๋จ).
-
์ต์ข
๋ณด๊ณ โ ์๋ฃ/์ด ์์
์์ ๋ณ๊ฒฝ๋ ํ์ผ ๋ชฉ๋ก.
PRO-NNN ๋ชจ๋์์๋ plan.md, specs/, robo-project.json, MCP๋ฅผ ์ฌ์ฉํ์ง ์์ต๋๋ค.
Inheritance
This skill inherits the workflow of /speckit-implement. Read
.claude/skills/speckit-implement/SKILL.md first for the default
outline, then apply the Overrides below verbatim on top.
If the installed speckit version is outside requires-speckit, warn
the developer in your first reply and ask for confirmation.
Overrides
Override 1 โ locate the feature directory and project id
- Find the most recent
specs/<NNN>-<slug>/ containing both
plan.md and tasks.md. If either is missing, stop and tell the
developer to run /robo-plan and /robo-tasks first.
- Read
<workspace>/.claude/robo-project.json for projectId. Fail
clearly if it's missing โ the install step writes it; absence means
the workspace wasn't set up via setup-project.
Override 2 โ work tasks in order, scaffold with real design data
Before processing tasks, call MCP get_bc_design(bcId=<BC id>)
once to fetch the live design slice. The response gives every
Aggregate / Command / Event / ReadModel its full properties[]
list (name + type + isKey + isForeignKey + isRequired) and its
existing implementationFiles[]. Build an in-memory map
{elementId โ {kind, name, properties, files}} from this โ it's the
source of truth for what each scaffold should contain.
For each unticked checkbox in tasks.md (in order from top to
bottom):
-
Parse the task line: extract the task description and the
<!-- @robo elementId="..." kind="..." --> marker (if any).
-
Look up the file path for this element in plan.md's "File
Layout" section. Use that exact path โ do not invent paths.
-
Look up the element in the map you built from get_bc_design.
Its properties[] is what populates the scaffold. Do not emit
an empty constructor(public readonly id: string) stub โ
every property the graph already has must appear in the scaffold
so the file mirrors the canonical design.
-
Create the file with real scaffolding driven by the design:
-
For a core BC's Aggregate at entities/<Name>.ts: emit a
TypeScript class with one constructor parameter per
properties[] entry. Mark isKey: true ones as
public readonly, others as public. Map graph types to TS
types with the same naming style the existing scaffolds use
(String โ string, UUID โ string, Object โ
object, List<Object> โ object[], Boolean โ
boolean, Date / DateTime โ Date, Long/Int โ number,
anything else โ keep as-is). Include the // TODO: invariants
placeholder above the constructor.
Example shape for an aggregate the graph reports with 3
properties (id [isKey], email, status):
export class MemberAccount {
constructor(
public readonly id: string,
public email: string,
public status: string,
) {}
}
-
For a Command at usecases/<Name>.ts: emit a class whose
handle(...) method takes one parameter per property in the
command's properties[]. If the graph reports zero properties,
emit handle() with no params (NOT an arbitrary id stub).
-
For an Event at events/<Name>.ts (when emitted): emit a
readonly class โ every property is public readonly.
-
For a ReadModel at readmodels/<Name>.ts: same as Aggregate
but every property readonly.
-
For a Repository at
frameworks_and_drivers/<Name>Repository.ts: emit an interface
IXxxRepository with findById(id: <id-type>) and
save(entity: <Name>) signatures, then a stub class implementing
it. Pull the id type from the matching aggregate's id-typed
property in the design map.
-
Match the architectural layer of the file to the layer's purpose.
-
After the file is created, call MCP
register_implementation_files:
register_implementation_files(
projectId = <from .claude/robo-project.json>,
elementId = <from the @robo marker>,
files = [{"path": "<predicted path>", "role": "primary"}],
mode = "merge"
)
Choose the role based on the layer:
entities/ โ "primary"
usecases/ โ "primary"
interface_adapters/ โ "interface-adapter"
frameworks_and_drivers/ โ "infrastructure"
- test files โ
"test"
-
Atomically rewrite the checkbox line in tasks.md from - [ ] to
- [x] (write-temp-then-rename so a concurrent reader never sees
a half-written file). Preserve the @robo marker exactly.
If get_bc_design returns zero properties for an element, the
graph is genuinely empty for that element. In that case (and only
that case) it is OK to scaffold constructor(public readonly id: string) as a placeholder, but you MUST surface a warning to the
developer that the element has no design-side properties and they
may want to add them in Robo Architect before continuing.
Override 3 โ never write marker comments into source
Under no circumstances write // @robo:aggregate=... or any analogous
annotation into the developer's source files. /robo-sync uses full
AST extraction instead (research R7). Marker comments are explicitly
rejected as invasive and formatter-fragile.
Override 4 โ stop on the first blocking task
If a task cannot complete (e.g., ambiguous invariant, missing
information), leave the checkbox unticked and append a short reason
comment on the line below:
- [ ] T003 Implement OrderInvariant <!-- @robo elementId="..." kind="Aggregate" -->
<!-- blocked: invariant declaration is empty in the design -->
Then stop and report to the developer. Do not continue to the next
task โ blocked items often cascade, and ticking later ones would lie
about the implementation state.
What this skill does NOT do
- Does NOT regenerate
plan.md or tasks.md.
- Does NOT write tests unless an explicit task asks for one.
- Does NOT push design changes back to the graph โ that's
/robo-sync.
- Does NOT scaffold full method bodies. Minimal stubs only; the
developer fills in business logic.