A spec-driven development workflow using native GitHub Copilot standards (.github/agents/, prompts, copilot-instructions.md). Inspired by OpenSpec but implemented purely with Copilot's native extension points.
# 0. Initialize project context (first time only)
/specs-project-init
# 1. First time? Take the guided tour
/specs-onboard
# 2. Explore an idea
/specs-explore I want to add user authentication
# 3. Create a new change
/specs-new user-authentication
# 4. Generate all artifacts quickly
/specs-ff
# 5. Implement the tasks
/specs-apply
# 6. Verify the implementation
/specs-verify
# 7. Archive when complete
/specs-archiveRun the setup wizard to install the workflow:
npx specskillsOptions:
--yesor-yto use defaults without prompts--dry-runto preview without making changes
specs/
├── config.yaml # Project configuration (optional)
├── .github/
│ ├── agents/ # Agent definitions
│ │ └── specs.agent.md
│ ├── copilot-instructions.md # Repo-level Copilot instructions
│ └── prompts/ # Slash commands
│ ├── explore.prompt.md
│ ├── new.prompt.md
│ ├── status.prompt.md
│ ├── continue.prompt.md
│ ├── ff.prompt.md
│ ├── apply.prompt.md
│ ├── verify.prompt.md
│ ├── sync.prompt.md
│ ├── archive.prompt.md
│ ├── bulk-archive.prompt.md
│ ├── validate.prompt.md
│ ├── project-init.prompt.md
│ └── onboard.prompt.md
├── schemas/ # Workflow schemas
│ ├── spec-driven.yaml # Default: proposal→specs→design→tasks
│ └── tdd.yaml # Alternative: TDD workflow
├── templates/ # Artifact templates
│ ├── proposal.md
│ ├── spec.md
│ ├── design.md
│ └── tasks.md
├── specs/ # Source of truth - current capabilities (capability specs)
└── changes/ # Active changes
└── archive/ # Completed changes
All commands use / prefix (native Copilot slash commands):
| Command | Purpose | When to Use |
|---|---|---|
/specs-explore |
Think through ideas without creating files | Early ideation |
/specs-new <name> |
Create a new change workspace | Starting work |
/specs-status |
Check current change status | Any time |
/specs-continue |
Generate the next ready artifact | Step-by-step |
/specs-ff |
Fast-forward all artifacts | Quick setup |
/specs-apply |
Implement tasks from tasks.md | Building |
/specs-verify |
Verify implementation matches specs | Quality check |
/specs-sync |
Merge specs to main specs/ | Before archiving |
/specs-archive |
Complete and archive change | When done |
/specs-bulk-archive |
Archive multiple completed changes | Batch cleanup |
/specs-validate |
Validate specs/changes format | Before commit |
/specs-project-init |
Generate/update PROJECT.md | Project setup |
/specs-onboard |
Guided tutorial for first-time users | Learning |
Or use natural language with @specs agent:
@specs Create a new change for user authentication
@specs What's the status?
@specs Continue to the next step
The spec-driven workflow follows this artifact dependency graph:
proposal → specs → design → tasks → apply → verify → archive
↓ ↓ ↓ ↓
(why) (what) (how) (steps)
- Proposal - Define why we're making this change
- Specs - Specify what capabilities are added/modified/removed
- Design - Document how to implement technically
- Tasks - Create implementation checklist
- Apply - Execute the tasks
- Verify - Confirm implementation matches specs
- Sync - Merge specs to main specs/ folder
- Archive - Complete the change
Each change lives in specs/changes/{name}/:
changes/user-authentication/
├── .change.json # State file tracking artifacts
├── proposal.md # Why/What/Impact
├── specs/ # Capability specifications
│ ├── capability-1/
│ │ └── spec.md
│ └── capability-2/
│ └── spec.md
├── design.md # Technical architecture
└── tasks.md # Implementation checklist
Main specs live at the repo root under specs/, one capability per folder:
specs/
├── user-authentication/
│ └── spec.md
├── payment-processing/
│ └── spec.md
└── changes/
Change-local specs follow the same pattern under the change workspace:
specs/changes/{name}/specs/
├── user-authentication/
│ └── spec.md
└── payment-processing/
└── spec.md
When modifying existing capabilities, use this format:
## ADDED Requirements
### Requirement: New Feature
Description of what is being added.
## MODIFIED Requirements
### Requirement: Existing Feature
Updated description of the requirement.
## REMOVED Requirements
### Requirement: Old Feature
**Reason:** Why this is being removed
**Migration:** How to migrate
## RENAMED Requirements
- **FROM:** `Old Requirement Name`
- **TO:** `New Requirement Name`
**Reason:** Why the renameEach artifact has one of three statuses:
- blocked - Dependencies not complete, cannot be created yet
- ready - All dependencies done, safe to create
- done - Artifact created and complete
Status flows: blocked → ready → done
Project-wide settings can be customized in specs/config.yaml:
schema: spec-driven
context: |
Project-specific context for all artifacts
rules:
specs:
- Include error scenarios for all requirements
tasks:
- Break tasks into 15-60 minute chunks
defaults:
archiveOnComplete: true
syncBeforeArchive: trueAdditional conventions are defined in .github/copilot-instructions.md.
Define custom workflows in specs/schemas/:
Default: spec-driven
artifacts:
- id: proposal
requires: []
- id: specs
requires: [proposal]
- id: design
requires: [proposal]
- id: tasks
requires: [specs, design]Use RFC-style keywords:
- SHALL - Mandatory requirement
- MUST - Absolute requirement
- SHOULD - Recommendation
Example:
### Requirement: User Login
The system SHALL authenticate users via OAuth 2.0.
**Acceptance Criteria:**
- Users can log in with Google, GitHub, or email
- Session expires after 24 hours of inactivity
- Failed attempts are rate-limitedUse Given/When/Then format:
#### Scenario: Successful Login
**Given** a registered user with valid credentials
**When** they submit the login form
**Then** they are authenticated and redirected to dashboard
**And** a session is created- Always check status before continuing (
/specs-status) - Complete one artifact at a time unless using fast-forward
- Review specs before implementing tasks
- Verify implementation matches specs before archiving
- Archive promptly when changes are complete
- Keep specs focused - one capability per file
- Use checkboxes consistently in task lists
| Feature | OpenSpec | Specs (Native Copilot) |
|---|---|---|
| CLI Tool | Required (@fission-ai/openspec) | Not needed |
| AI Tools | 20+ adapters | Native Copilot only |
| Validation | Zod schemas | Copilot-enforced conventions |
| Commands | /opsx: |
/specs- |
| Agents | Tool-specific | .github/agents/*.agent.md standard |
| Extensibility | Custom schemas via CLI | YAML schema files |
- Copy
openspec/specs/→specs/ - Copy
openspec/changes/→specs/changes/ - Convert
.openspec.yaml→.change.json - Update to use
/specs-*commands instead of/opsx:
This is a native GitHub Copilot implementation using:
.github/agents/*.agent.mdfor agent definitions.github/prompts/*.prompt.mdfor slash commands.github/copilot-instructions.mdfor repo context- YAML schemas for workflow definitions
MIT