| name | openspec |
| description | Manages spec-driven development with OpenSpec. Use when creating change proposals, planning features, implementing from specs, or archiving completed changes. Triggers on "proposal", "change", or "spec" with "create", "plan", "make", or "help". |
OpenSpec Skill
Spec-driven development workflow using the openspec CLI.
Quick Checklist
- Search existing work:
openspec spec list --long, openspec list
- Decide scope: new capability vs modify existing
- Pick unique
change-id: kebab-case, verb-led (add-, update-, remove-, refactor-)
- Scaffold:
proposal.md, tasks.md, design.md (if needed), delta specs per capability
- Write deltas:
## ADDED|MODIFIED|REMOVED|RENAMED Requirements; ≥1 #### Scenario: per requirement
- Validate:
openspec validate [change-id] --strict
- Request approval before implementation
Three-Stage Workflow
Stage 1: Creating Changes
Create proposal for:
- New features/functionality
- Breaking changes (API, schema)
- Architecture changes
- Performance optimizations
- Security pattern updates
Skip proposal for:
- Bug fixes (restore intended behavior)
- Typos, formatting, comments
- Non-breaking dependency updates
- Configuration changes
- Tests for existing behavior
Workflow:
- Review
openspec/project.md, openspec list, openspec list --specs
- Choose verb-led
change-id, scaffold under openspec/changes/<id>/
- Draft spec deltas with
## ADDED|MODIFIED|REMOVED Requirements
- Run
openspec validate <id> --strict
Stage 2: Implementing Changes
- Read proposal.md
- Read design.md (if exists)
- Read tasks.md
- Implement tasks sequentially
- Confirm all tasks complete
- Update checklist to
- [x]
- Do not start until proposal approved
Stage 3: Archiving Changes
After deployment:
- Move
changes/[name]/ → changes/archive/YYYY-MM-DD-[name]/
- Update
specs/ if capabilities changed
- Use
openspec archive <change-id> --skip-specs --yes for tooling-only changes
- Run
openspec validate --strict
Before Any Task
Context Checklist:
Before Creating Specs:
- Check if capability already exists
- Prefer modifying existing specs over duplicates
- Use
openspec show [spec] to review current state
- Ask 1–2 clarifying questions if ambiguous
CLI Commands
openspec list
openspec list --specs
openspec show [item]
openspec validate [item]
openspec archive <change-id> [--yes|-y]
openspec init [path]
openspec update [path]
openspec show [change] --json --deltas-only
openspec validate [change] --strict
Flags: --json, --type change|spec, --strict, --no-interactive, --skip-specs, --yes/-y
Directory Structure
openspec/
├── project.md # Project conventions
├── specs/ # Current truth - what IS built
│ └── [capability]/
│ ├── spec.md # Requirements and scenarios
│ └── design.md # Technical patterns
├── changes/ # Proposals - what SHOULD change
│ ├── [change-name]/
│ │ ├── proposal.md # Why, what, impact
│ │ ├── tasks.md # Implementation checklist
│ │ ├── design.md # Technical decisions (optional)
│ │ └── specs/ # Delta changes
│ │ └── [capability]/
│ │ └── spec.md # ADDED/MODIFIED/REMOVED
│ └── archive/ # Completed changes
Creating Change Proposals
Decision Tree
New request?
├─ Bug fix restoring spec behavior? → Fix directly
├─ Typo/format/comment? → Fix directly
├─ New feature/capability? → Create proposal
├─ Breaking change? → Create proposal
├─ Architecture change? → Create proposal
└─ Unclear? → Create proposal (safer)
proposal.md Template
# Change: [Brief description]
## Why
[1-2 sentences on problem/opportunity]
## What Changes
- [Bullet list]
- [Mark breaking changes with **BREAKING**]
## Impact
- Affected specs: [list capabilities]
- Affected code: [key files/systems]
Spec Delta Template
## ADDED Requirements
### Requirement: New Feature
The system SHALL provide...
#### Scenario: Success case
- **WHEN** user performs action
- **THEN** expected result
## MODIFIED Requirements
### Requirement: Existing Feature
[Complete modified requirement]
## REMOVED Requirements
### Requirement: Old Feature
**Reason**: [Why removing]
**Migration**: [How to handle]
tasks.md Template
## 1. Implementation
- [ ] 1.1 Create database schema
- [ ] 1.2 Implement API endpoint
- [ ] 1.3 Add frontend component
- [ ] 1.4 Write tests
design.md (When Needed)
Create if any apply:
- Cross-cutting change or new architectural pattern
- New external dependency or significant data model changes
- Security, performance, or migration complexity
- Ambiguity benefiting from technical decisions
## Context
[Background, constraints, stakeholders]
## Goals / Non-Goals
- Goals: [...]
- Non-Goals: [...]
## Decisions
- Decision: [What and why]
- Alternatives considered: [Options + rationale]
## Risks / Trade-offs
- [Risk] → Mitigation
## Migration Plan
[Steps, rollback]
## Open Questions
- [...]
Spec File Format
Critical: Scenario Formatting
CORRECT (use #### headers):
#### Scenario: User login success
- **WHEN** valid credentials provided
- **THEN** return JWT token
WRONG:
- **Scenario: User login** ❌
**Scenario**: User login ❌
### Scenario: User login ❌
Every requirement MUST have at least one scenario.
Requirement Wording
Use SHALL/MUST for normative requirements.
Delta Operations
## ADDED Requirements - New capabilities
## MODIFIED Requirements - Changed behavior
## REMOVED Requirements - Deprecated features
## RENAMED Requirements - Name changes
ADDED vs MODIFIED
- ADDED: New capability that stands alone
- MODIFIED: Changes behavior of existing requirement. Always paste full updated requirement (header + scenarios)
- RENAMED: Only name changes. If also changing behavior, use RENAMED + MODIFIED
Common pitfall: Using MODIFIED without including previous text causes loss of detail at archive time.
Authoring MODIFIED correctly:
- Locate existing requirement in
openspec/specs/<capability>/spec.md
- Copy entire requirement block
- Paste under
## MODIFIED Requirements and edit
- Ensure header matches exactly, keep ≥1 scenario
Troubleshooting
"Change must have at least one delta"
- Check
changes/[name]/specs/ exists with .md files
- Verify files have
## ADDED Requirements etc.
"Requirement must have at least one scenario"
- Use
#### Scenario: format (4 hashtags)
- Don't use bullets or bold for scenario headers
Silent scenario parsing failures
- Exact format:
#### Scenario: Name
- Debug:
openspec show [change] --json --deltas-only
Happy Path Script
openspec spec list --long
openspec list
CHANGE=add-two-factor-auth
mkdir -p openspec/changes/$CHANGE/{specs/auth}
printf "## Why\n...\n\n## What Changes\n- ...\n\n## Impact\n- ...\n" > openspec/changes/$CHANGE/proposal.md
printf "## 1. Implementation\n- [ ] 1.1 ...\n" > openspec/changes/$CHANGE/tasks.md
cat > openspec/changes/$CHANGE/specs/auth/spec.md << 'EOF'
Users MUST provide a second factor during login.
- **WHEN** valid credentials are provided
- **THEN** an OTP challenge is required
EOF
openspec validate $CHANGE --strict
Best Practices
Naming
Capabilities: verb-noun (user-auth, payment-capture), single purpose, split if needs "AND"
Change IDs: kebab-case, verb-led (add-, update-, remove-, refactor-), unique
Simplicity First
- Default to <100 lines of new code
- Single-file implementations until proven insufficient
- Avoid frameworks without clear justification
Clear References
- Use
file.ts:42 for code locations
- Reference specs as
specs/auth/spec.md
Quick Reference
Stage Indicators:
changes/ - Proposed, not yet built
specs/ - Built and deployed
archive/ - Completed changes
File Purposes:
proposal.md - Why and what
tasks.md - Implementation steps
design.md - Technical decisions
spec.md - Requirements and behavior
CLI Essentials:
openspec list
openspec show [item]
openspec validate --strict
openspec archive <change-id> --yes
Specs are truth. Changes are proposals. Keep them in sync.