spec
Designs and develops specs following the spec-driven method. Asks clarifying questions before proposing structure, and builds the…
Implements an approved spec. Validates that the state means "Approved" (in any language), creates a git branch named after the spec, switches to it, and starts the implementation step by step with pauses to review diffs.
$ npx -y skills add klerith/fernando-skills --skill spec-impl --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/spec-implContext preview
The summary Claude sees to decide when to auto-load this skill.
Implements an approved spec. Validates that the state means "Approved" (in any language), creates a git branch named after the spec, switches to it, and starts the implementation step by step with pauses to review diffs.
name: spec-impl description: Implements an approved spec. Validates that the state means "Approved" (in any language), creates a git branch named after the spec, switches to it, and starts the implementation step by step with pauses to review diffs. disable-model-invocation: true argument-hint: <NN-spec-name> allowed-tools: Read, Glob, Grep, Edit, Write, AskUserQuestion, Bash(git status:*), Bash(git branch:*), Bash(git checkout:*), Bash(git log:*), Bash(git diff:*), Bash(git stash:*), Bash(cat:*), Bash(ls:*)
Current repository state: !`git status --short`
Current branch: !`git branch --show-current`
Specs available in this folder: !`ls specs/ 2>/dev/null || echo "The specs/ folder does not exist"`
Branch-creation config: !`cat specs/.spec-config.yml 2>/dev/null || echo "AutoCreateBranch: true (default, no config file)"`
---
Follow these four phases in strict order. **Do not advance to the next phase if the previous one did not complete correctly.**
---
The received argument is: `$ARGUMENTS`
If `$ARGUMENTS` is empty:
If `$ARGUMENTS` has a value:
---
Read the spec file you located in Phase 1 using the Read tool or `cat`.
In the file's contents, look for the line that contains the spec's state. The header label is typically `**Status:**` (English) or `**Estado:**` (Spanish), but it may use any language. Match by position (status line near the top of the spec) and by the surrounding state machine, not by the exact label.
**Absolute rule:** You can only continue if the state **means "Approved"** — regardless of the language used.
Treat any of the following (and their equivalents in other languages) as the **Approved** state and continue:
Anything else (Draft / Borrador, In review / En revisión, Implemented / Implementado, Obsolete / Obsoleto, or any unrecognized value) means **stop** and show the error message below.
| State category | Examples (any language) | Action | | ----------------------------------------- | ------------------------------------------------- | -------------------------------------------------------------------------- | | Approved | `Approved`, `Aprobado`, `Aprovado`, `Approuvé`, … | Continue to Phase 3. | | Draft | `Draft`, `Borrador`, … | Stop. Show the error message below. | | In review | `In review`, `En revisión`, … | Stop. Show the error message below. | | Implemented | `Implemented`, `Implementado`, … | Stop. Show the error message below. | | Obsolete | `Obsolete`, `Obsoleto`, … | Stop. Show the error message below. | | State line not found / unrecognized value | — | Stop. The file does not follow the expected format. Tell this to the user. |
If you are unsure whether a value means "approved", **do not assume**. Stop and ask the user to clarify or to update the spec to the canonical wording.
**Standard error message when the state does not mean Approved:**
❌ I cannot implement this spec.
Current state: [STATE FOUND]
I only work with specs whose state means "Approved" (e.g. `Approved`, `Aprobado`,
or the equivalent in another language).
To continue you have two options:
1. If the spec is ready to be implemented, open it and change the state
to "Approved" (or the equivalent term your team uses) manually.
That change is made by the human, not the agent.
2. If the spec still needs work, use /spec [name] to resume it.Do not offer alternatives, do not suggest "I can still start if you want". The block is intentional.
---
Once you have confirmed the state means `Approved`:
0. **Check the working tree first.** Look at the `git status --short` output in the session context above. If it is **not empty**, stop and show the pending changes, then ask:
⚠️ There are uncommitted changes in the working tree.
Switching branches would carry them over. What do you want to do?
1. Commit or stash them yourself, then re-run this command (recommended)
2. Continue anyway — the changes travel to the new branchWait for the answer. **Do not stash or commit on the user's behalf** unless they explicitly ask for it. If the working tree is clean, skip straight to step 1 without mentioning it.
1. Derive the branch name from the spec file's full name, without the extension. Format: `spec-NN-slug`. Examples:
2. Read the `AutoCreateBranch` flag from the **Branch-creation co
Spec-driven development skills for Claude Code, Cursor, Codex, and Antigravity. By Fernando Herrera.