diff --git a/openspec/README.md b/openspec/README.md index 580f7fe9..be61a699 100644 --- a/openspec/README.md +++ b/openspec/README.md @@ -2,6 +2,16 @@ Instructions for AI coding assistants using OpenSpec for spec-driven development. +## TL;DR Quick Checklist + +- Search existing work: `openspec spec list --long`, `openspec list` (use `rg` only for full-text search) +- Decide scope: new capability vs modify existing capability +- Pick a unique `change-id`: kebab-case, verb-led (`add-`, `update-`, `remove-`, `refactor-`) +- Scaffold: `proposal.md`, `tasks.md`, `design.md` (only if needed), and delta specs per affected capability +- Write deltas: use `## ADDED|MODIFIED|REMOVED|RENAMED Requirements`; include at least one `#### Scenario:` per requirement +- Validate: `openspec validate [change-id] --strict` and fix issues +- Request approval: Do not start implementation until proposal is approved + ## Three-Stage Workflow ### Stage 1: Creating Changes @@ -12,6 +22,17 @@ Create proposal when you need to: - Optimize performance (changes behavior) - Update security patterns +Triggers (examples): +- "Help me create a change proposal" +- "Help me plan a change" +- "Help me create a proposal" +- "I want to create a spec proposal" +- "I want to create a spec" + +Loose matching guidance: +- Contains one of: `proposal`, `change`, `spec` +- With one of: `create`, `plan`, `make`, `start`, `help` + Skip proposal for: - Bug fixes (restore intended behavior) - Typos, formatting, comments @@ -25,6 +46,8 @@ Skip proposal for: 3. **Read tasks.md** - Get implementation checklist 4. **Implement tasks sequentially** - Complete in order 5. **Mark complete immediately** - Update `- [x]` after each task +6. **Validate strictly** - Run `openspec validate [change] --strict` and address issues +7. **Approval gate** - Do not start implementation until the proposal is reviewed and approved ### Stage 3: Archiving Changes After deployment, create separate PR to: @@ -45,6 +68,15 @@ After deployment, create separate PR to: - Always check if capability already exists - Prefer modifying existing specs over creating duplicates - Use `openspec show [spec]` to review current state +- If request is ambiguous, ask 1–2 clarifying questions before scaffolding + +### Search Guidance +- Enumerate specs: `openspec spec list --long` (or `--json` for scripts) +- Enumerate changes: `openspec list` (or `openspec change list --json` - deprecated but available) +- Show details: + - Spec: `openspec show --type spec` (use `--json` for filters) + - Change: `openspec show --json --deltas-only` +- Full-text search (use ripgrep): `rg -n "Requirement:|Scenario:" openspec/specs` ## Quick Start @@ -93,7 +125,7 @@ openspec/ │ ├── [change-name]/ │ │ ├── proposal.md # Why, what, impact │ │ ├── tasks.md # Implementation checklist -│ │ ├── design.md # Technical decisions (optional) +│ │ ├── design.md # Technical decisions (optional; see criteria) │ │ └── specs/ # Delta changes │ │ └── [capability]/ │ │ └── spec.md # ADDED/MODIFIED/REMOVED @@ -116,7 +148,7 @@ New request? ### Proposal Structure -1. **Create directory:** `changes/[descriptive-name]/` +1. **Create directory:** `changes/[change-id]/` (kebab-case, verb-led, unique) 2. **Write proposal.md:** ```markdown @@ -151,6 +183,7 @@ The system SHALL provide... **Reason**: [Why removing] **Migration**: [How to handle] ``` +If multiple capabilities are affected, create multiple delta files under `changes/[change-id]/specs//spec.md`—one per capability. 4. **Create tasks.md:** ```markdown @@ -161,6 +194,36 @@ The system SHALL provide... - [ ] 1.4 Write tests ``` +5. **Create design.md when needed:** +Create `design.md` if any of the following apply; otherwise omit it: +- Cross-cutting change (multiple services/modules) or a new architectural pattern +- New external dependency or significant data model changes +- Security, performance, or migration complexity +- Ambiguity that benefits from technical decisions before coding + +Minimal `design.md` skeleton: +```markdown +## 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 @@ -181,6 +244,9 @@ The system SHALL provide... Every requirement MUST have at least one scenario. +### Requirement Wording +- Use SHALL/MUST for normative requirements (avoid should/may unless intentionally non-normative) + ### Delta Operations - `## ADDED Requirements` - New capabilities @@ -190,6 +256,13 @@ Every requirement MUST have at least one scenario. Headers matched with `trim(header)` - whitespace ignored. +Example for RENAMED: +```markdown +## RENAMED Requirements +- FROM: `### Requirement: Login` +- TO: `### Requirement: User Authentication` +``` + ## Troubleshooting ### Common Errors @@ -219,6 +292,64 @@ openspec show [change] --json | jq '.deltas' openspec show [spec] --json -r 1 ``` +## Happy Path Script + +```bash +# 1) Explore current state +openspec spec list --long +openspec list +# Optional full-text search: +# rg -n "Requirement:|Scenario:" openspec/specs +# rg -n "^#|Requirement:" openspec/changes + +# 2) Choose change id and scaffold +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 + +# 3) Add deltas (example) +cat > openspec/changes/$CHANGE/specs/auth/spec.md << 'EOF' +## ADDED Requirements +### Requirement: Two-Factor Authentication +Users MUST provide a second factor during login. + +#### Scenario: OTP required +- **WHEN** valid credentials are provided +- **THEN** an OTP challenge is required +EOF + +# 4) Validate +openspec validate $CHANGE --strict +``` + +## Multi-Capability Example + +``` +openspec/changes/add-2fa-notify/ +├── proposal.md +├── tasks.md +└── specs/ + ├── auth/ + │ └── spec.md # ADDED: Two-Factor Authentication + └── notifications/ + └── spec.md # ADDED: OTP email notification +``` + +auth/spec.md +```markdown +## ADDED Requirements +### Requirement: Two-Factor Authentication +... +``` + +notifications/spec.md +```markdown +## ADDED Requirements +### Requirement: OTP Email Notification +... +``` + ## Best Practices ### Simplicity First @@ -244,6 +375,11 @@ Only add complexity with: - 10-minute understandability rule - Split if description needs "AND" +### Change ID Naming +- Use kebab-case, short and descriptive: `add-two-factor-auth` +- Prefer verb-led prefixes: `add-`, `update-`, `remove-`, `refactor-` +- Ensure uniqueness; if taken, append `-2`, `-3`, etc. + ## Tool Selection Guide | Task | Tool | Why | @@ -295,4 +431,4 @@ openspec validate --strict # Is it correct? openspec archive [change] # Mark complete ``` -Remember: Specs are truth. Changes are proposals. Keep them in sync. \ No newline at end of file +Remember: Specs are truth. Changes are proposals. Keep them in sync. diff --git a/src/core/templates/claude-template.ts b/src/core/templates/claude-template.ts index f5219bcf..b6a4af34 100644 --- a/src/core/templates/claude-template.ts +++ b/src/core/templates/claude-template.ts @@ -16,6 +16,8 @@ Skip proposal for: bug fixes, typos, non-breaking updates 3. Read tasks.md for implementation checklist 4. Complete tasks one by one 5. Mark each task complete immediately: \`- [x]\` +6. Validate strictly: \`openspec validate [change] --strict\` +7. Approval gate: Do not start implementation until the proposal is approved ### Stage 3: Archiving After deployment, use \`openspec archive [change]\` (add \`--skip-specs\` for tooling-only changes) @@ -49,11 +51,20 @@ openspec show [change] --json --deltas-only ## Creating Changes -1. **Directory:** \`changes/[descriptive-name]/\` +1. **Directory:** \`changes/[change-id]/\` + - Change ID naming: kebab-case, verb-led (\`add-\`, \`update-\`, \`remove-\`, \`refactor-\`), unique (append \`-2\`, \`-3\` if needed) 2. **Files:** - \`proposal.md\` - Why, what, impact - \`tasks.md\` - Implementation checklist - - \`specs/[capability]/spec.md\` - Delta changes (ADDED/MODIFIED/REMOVED) + - \`design.md\` - Only if needed (cross-cutting, new deps/data model, security/perf/migration complexity, or high ambiguity) + - \`specs/[capability]/spec.md\` - Delta changes (ADDED/MODIFIED/REMOVED). For multiple capabilities, include multiple files. +3. **If ambiguous:** ask 1–2 clarifying questions before scaffolding + +## Search Guidance +- Enumerate specs: \`openspec spec list --long\` (or \`--json\`) +- Enumerate changes: \`openspec list\` +- Show details: \`openspec show --type spec\`, \`openspec show --json --deltas-only\` +- Full-text search (use ripgrep): \`rg -n "Requirement:|Scenario:" openspec/specs\` ## Critical: Scenario Format @@ -92,4 +103,4 @@ Every requirement MUST have scenarios using \`#### Scenario:\` format. - Don't use bullets or bold **Debug:** \`openspec show [change] --json --deltas-only\` -`; \ No newline at end of file +`; diff --git a/src/core/templates/readme-template.ts b/src/core/templates/readme-template.ts index 0cd87b08..4e5cbd23 100644 --- a/src/core/templates/readme-template.ts +++ b/src/core/templates/readme-template.ts @@ -1,518 +1,435 @@ export const readmeTemplate = `# OpenSpec Instructions -This document provides instructions for AI coding assistants on how to use OpenSpec conventions for spec-driven development. Follow these rules precisely when working on OpenSpec-enabled projects. +Instructions for AI coding assistants using OpenSpec for spec-driven development. + +## TL;DR Quick Checklist + +- Search existing work: \`openspec spec list --long\`, \`openspec list\` (use \`rg\` only for full-text search) +- Decide scope: new capability vs modify existing capability +- Pick a unique \`change-id\`: kebab-case, verb-led (\`add-\`, \`update-\`, \`remove-\`, \`refactor-\`) +- Scaffold: \`proposal.md\`, \`tasks.md\`, \`design.md\` (only if needed), and delta specs per affected capability +- Write deltas: use \`## ADDED|MODIFIED|REMOVED|RENAMED Requirements\`; include at least one \`#### Scenario:\` per requirement +- Validate: \`openspec validate [change-id] --strict\` and fix issues +- Request approval: Do not start implementation until proposal is approved + +## Three-Stage Workflow + +### Stage 1: Creating Changes +Create proposal when you need to: +- Add features or functionality +- Make breaking changes (API, schema) +- Change architecture or patterns +- Optimize performance (changes behavior) +- Update security patterns + +Triggers (examples): +- "Help me create a change proposal" +- "Help me plan a change" +- "Help me create a proposal" +- "I want to create a spec proposal" +- "I want to create a spec" + +Loose matching guidance: +- Contains one of: \`proposal\`, \`change\`, \`spec\` +- With one of: \`create\`, \`plan\`, \`make\`, \`start\`, \`help\` + +Skip proposal for: +- Bug fixes (restore intended behavior) +- Typos, formatting, comments +- Dependency updates (non-breaking) +- Configuration changes +- Tests for existing behavior + +### Stage 2: Implementing Changes +1. **Read proposal.md** - Understand what's being built +2. **Read design.md** (if exists) - Review technical decisions +3. **Read tasks.md** - Get implementation checklist +4. **Implement tasks sequentially** - Complete in order +5. **Mark complete immediately** - Update \`- [x]\` after each task +6. **Validate strictly** - Run \`openspec validate [change] --strict\` and address issues +7. **Approval gate** - Do not start implementation until the proposal is reviewed and approved + +### Stage 3: Archiving Changes +After deployment, create separate PR to: +- Move \`changes/[name]/\` → \`changes/archive/YYYY-MM-DD-[name]/\` +- Update \`specs/\` if capabilities changed +- Use \`openspec archive [change] --skip-specs\` for tooling-only changes + +## Before Any Task + +**Context Checklist:** +- [ ] Read relevant specs in \`specs/[capability]/spec.md\` +- [ ] Check pending changes in \`changes/\` for conflicts +- [ ] Read \`openspec/project.md\` for conventions +- [ ] Run \`openspec list\` to see active changes +- [ ] Run \`openspec list --specs\` to see existing capabilities + +**Before Creating Specs:** +- Always check if capability already exists +- Prefer modifying existing specs over creating duplicates +- Use \`openspec show [spec]\` to review current state +- If request is ambiguous, ask 1–2 clarifying questions before scaffolding + +### Search Guidance +- Enumerate specs: \`openspec spec list --long\` (or \`--json\` for scripts) +- Enumerate changes: \`openspec list\` (or \`openspec change list --json\` - deprecated but available) +- Show details: + - Spec: \`openspec show --type spec\` (use \`--json\` for filters) + - Change: \`openspec show --json --deltas-only\` +- Full-text search (use ripgrep): \`rg -n "Requirement:|Scenario:" openspec/specs\` + +## Quick Start + +### CLI Commands -## Core Principle - -OpenSpec is an AI-native system for change-driven development where: -- **Specs** (\`specs/\`) reflect what IS currently built and deployed -- **Changes** (\`changes/\`) contain proposals for what SHOULD be changed -- **AI drives the process** - You generate proposals, humans review and approve -- **Specs are living documentation** - Always kept in sync with deployed code - -## Start Simple - -**Default to minimal implementations:** -- New features should be <100 lines of code initially -- Use the simplest solution that works -- Avoid premature optimization (no caching, parallelization, or complex patterns without proven need) -- Choose boring technology over cutting-edge solutions +\`\`\`bash +# Essential commands +openspec list # List active changes +openspec list --specs # List specifications +openspec show [item] # Display change or spec +openspec diff [change] # Show spec differences +openspec validate [item] # Validate changes or specs +openspec archive [change] # Archive after deployment + +# Project management +openspec init [path] # Initialize OpenSpec +openspec update [path] # Update instruction files + +# Interactive mode +openspec show # Prompts for selection +openspec validate # Bulk validation mode + +# Debugging +openspec show [change] --json --deltas-only +openspec validate [change] --strict +\`\`\` -**Complexity triggers** - Only add complexity when you have: -- **Performance data** showing current solution is too slow -- **Scale requirements** with specific numbers (>1000 users, >100MB data) -- **Multiple use cases** requiring the same abstraction -- **Regulatory compliance** mandating specific patterns -- **Security threats** that simple solutions cannot address +### Command Flags -When triggered, document the specific justification in your change proposal. +- \`--json\` - Machine-readable output +- \`--type change|spec\` - Disambiguate items +- \`--strict\` - Comprehensive validation +- \`--no-interactive\` - Disable prompts +- \`--skip-specs\` - Archive without spec updates ## Directory Structure \`\`\` openspec/ -├── project.md # Project-specific context (tech stack, conventions) -├── README.md # This file - OpenSpec instructions +├── project.md # Project conventions ├── specs/ # Current truth - what IS built -│ ├── [capability]/ # Single, focused capability -│ │ ├── spec.md # WHAT the capability does and WHY -│ │ └── design.md # HOW it's built (established patterns) -│ └── ... -├── changes/ # Proposed changes - what we're CHANGING +│ └── [capability]/ # Single focused capability +│ ├── spec.md # Requirements and scenarios +│ └── design.md # Technical patterns +├── changes/ # Proposals - what SHOULD change │ ├── [change-name]/ -│ │ ├── proposal.md # Why, what, impact (consolidated) +│ │ ├── proposal.md # Why, what, impact │ │ ├── tasks.md # Implementation checklist -│ │ ├── design.md # Technical decisions (optional, for complex changes) -│ │ └── specs/ # Delta changes to specs +│ │ ├── design.md # Technical decisions (optional; see criteria) +│ │ └── specs/ # Delta changes │ │ └── [capability]/ -│ │ └── spec.md # Delta format (ADDED/MODIFIED/REMOVED/RENAMED) -│ └── archive/ # Completed changes (dated) +│ │ └── spec.md # ADDED/MODIFIED/REMOVED +│ └── archive/ # Completed changes \`\`\` -### Capability Organization +## Creating Change Proposals -**Use capabilities, not features** - Each directory under \`specs/\` represents a single, focused responsibility: -- **Verb-noun naming**: \`user-auth\`, \`payment-capture\`, \`order-checkout\` -- **10-minute rule**: Each capability should be understandable in <10 minutes -- **Single purpose**: If it needs "AND" to describe it, split it +### Decision Tree -Examples: \`\`\` -✅ GOOD: user-auth, user-sessions, payment-capture, payment-refunds -❌ BAD: users, payments, core, misc +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) \`\`\` -## Key Behavioral Rules - -### 1. Always Start by Reading - -Before any task: -1. **Read relevant specs** in \`specs/[capability]/spec.md\` to understand current state -2. **Check pending changes** in \`changes/\` directory for potential conflicts -3. **Read project.md** for project-specific conventions - -### 2. When to Create Change Proposals +### Proposal Structure -**ALWAYS create a change proposal for:** -- New features or functionality -- Breaking changes (API changes, schema updates) -- Architecture changes or new patterns -- Performance optimizations that change behavior -- Security updates affecting auth/access patterns -- Any change requiring multiple steps or affecting multiple systems +1. **Create directory:** \`changes/[change-id]/\` (kebab-case, verb-led, unique) -**SKIP proposals for:** -- Bug fixes that restore intended behavior -- Typos, formatting, or comment updates -- Dependency updates (unless breaking) -- Configuration or environment variable changes -- Adding tests for existing behavior -- Documentation fixes - -**Complexity assessment:** -- If your solution requires >100 lines of new code, justify the complexity -- If adding dependencies, frameworks, or architectural patterns, document why simpler alternatives won't work -- Default to single-file implementations until proven insufficient +2. **Write proposal.md:** +\`\`\`markdown +## Why +[1-2 sentences on problem/opportunity] -### 3. Delta-Based Change Format +## What Changes +- [Bullet list of changes] +- [Mark breaking changes with **BREAKING**] -Changes use a delta format with clear sections: +## Impact +- Affected specs: [list capabilities] +- Affected code: [key files/systems] +\`\`\` +3. **Create spec deltas:** \`specs/[capability]/spec.md\` \`\`\`markdown ## ADDED Requirements ### Requirement: New Feature -[Complete requirement content in structured format] +The system SHALL provide... + +#### Scenario: Success case +- **WHEN** user performs action +- **THEN** expected result -## MODIFIED Requirements +## MODIFIED Requirements ### Requirement: Existing Feature -[Complete modified requirement (header must match current spec)] +[Complete modified requirement] ## REMOVED Requirements ### Requirement: Old Feature -**Reason for removal**: [Why removing] -**Migration path**: [How to handle existing usage] - -## RENAMED Requirements -- FROM: \`### Requirement: Old Name\` -- TO: \`### Requirement: New Name\` +**Reason**: [Why removing] +**Migration**: [How to handle] \`\`\` +If multiple capabilities are affected, create multiple delta files under \`changes/[change-id]/specs//spec.md\`—one per capability. -Key rules: -- Headers are matched using \`normalize(header) = trim(header)\` -- Include complete requirements (not diffs) -- Use standard symbols in CLI output: + (added), ~ (modified), - (removed), → (renamed) - -### 4. Creating a Change Proposal - -When a user requests a significant change: - -\`\`\`bash -# 1. Create the change directory -openspec/changes/[descriptive-name]/ - -# 2. Generate proposal.md with all context -## Why -[1-2 sentences on the problem/opportunity] - -## What Changes -[Bullet list of changes, including breaking changes] - -## Impact -- Affected specs: [list capabilities that will change] -- Affected code: [list key files/systems] - -# 3. Create delta specs for ALL affected capabilities -# - Store only the changes (not complete future state) -# - Use sections: ## ADDED, ## MODIFIED, ## REMOVED, ## RENAMED -# - Include complete requirements in their final form -# Example spec.md content: -# ## ADDED Requirements -# ### Requirement: Password Reset -# Users SHALL be able to reset passwords via email... -# -# ## MODIFIED Requirements -# ### Requirement: User Authentication -# [Complete modified requirement with new password reset hook] -specs/ -└── [capability]/ - └── spec.md # Contains delta sections - -# 4. Create tasks.md with implementation steps -## 1. [Task Group] -- [ ] 1.1 [Specific task] -- [ ] 1.2 [Specific task] - -# 5. For complex changes, add design.md -[Technical decisions and trade-offs] +4. **Create tasks.md:** +\`\`\`markdown +## 1. Implementation +- [ ] 1.1 Create database schema +- [ ] 1.2 Implement API endpoint +- [ ] 1.3 Add frontend component +- [ ] 1.4 Write tests \`\`\` -### 5. The Change Lifecycle - -1. **Propose** → Create change directory with delta-based documentation -2. **Review** → User reviews and approves the proposal -3. **Implement** → Follow the approved tasks.md (can be multiple PRs) -4. **Deploy** → User confirms deployment -5. **Update Specs** → Apply deltas to sync specs/ with new reality (IF the change affects system capabilities) -6. **Archive** → Move to \`changes/archive/YYYY-MM-DD-[name]/\` - -### 6. Implementing Changes - -When implementing an approved change: -1. Follow the tasks.md checklist exactly -2. **Mark completed tasks** in tasks.md as you finish them (e.g., \`- [x] 1.1 Task completed\`) -3. Ensure code matches the proposed behavior -4. Update any affected tests -5. **Keep change in \`changes/\` directory** - do NOT archive in implementation PR - -**Multiple Implementation PRs:** -- Changes can be implemented across multiple PRs -- Each PR should update tasks.md to mark what was completed -- Different developers can work on different task groups -- Example: PR #1 completes tasks 1.1-1.3, PR #2 completes tasks 2.1-2.4 - -### 7. Updating Specs and Archiving After Deployment - -**Create a separate PR after deployment** that: -1. Moves change to \`changes/archive/YYYY-MM-DD-[name]/\` -2. Updates relevant files in \`specs/\` to reflect new reality (if needed) -3. If design.md exists, incorporates proven patterns into \`specs/[capability]/design.md\` +5. **Create design.md when needed:** +Create \`design.md\` if any of the following apply; otherwise omit it: +- Cross-cutting change (multiple services/modules) or a new architectural pattern +- New external dependency or significant data model changes +- Security, performance, or migration complexity +- Ambiguity that benefits from technical decisions before coding -This ensures changes are only archived when truly complete and deployed. +Minimal \`design.md\` skeleton: +\`\`\`markdown +## Context +[Background, constraints, stakeholders] -### 8. Types of Changes That Don't Require Specs +## Goals / Non-Goals +- Goals: [...] +- Non-Goals: [...] -Some changes only affect development infrastructure and don't need specs: -- Initial project setup (package.json, tsconfig.json, etc.) -- Development tooling changes (linters, formatters, build tools) -- CI/CD configuration -- Development dependencies +## Decisions +- Decision: [What and why] +- Alternatives considered: [Options + rationale] -For these changes: -1. Implement → Deploy → Mark tasks complete → Archive -2. Skip the "Update Specs" step entirely +## Risks / Trade-offs +- [Risk] → Mitigation -### What Deserves a Spec? +## Migration Plan +[Steps, rollback] -Ask yourself: -- Is this a system capability that users or other systems interact with? -- Does it have ongoing behavior that needs documentation? -- Would a new developer need to understand this to work with the system? +## Open Questions +- [...] +\`\`\` -If NO to all → No spec needed (likely just tooling/infrastructure) +## Spec File Format -## Understanding Specs vs Code +### Critical: Scenario Formatting -### Specs Document WHAT and WHY +**CORRECT** (use #### headers): \`\`\`markdown -# Authentication Spec - -Users SHALL authenticate with email and password. - -WHEN credentials are valid THEN issue JWT token. -WHEN credentials are invalid THEN return generic error. - -WHY: Prevent user enumeration attacks. +#### Scenario: User login success +- **WHEN** valid credentials provided +- **THEN** return JWT token \`\`\` -### Code Documents HOW -\`\`\`javascript -// Implementation details -const user = await db.users.findOne({ email }); -const valid = await bcrypt.compare(password, user.hashedPassword); +**WRONG** (don't use bullets or bold): +\`\`\`markdown +- **Scenario: User login** ❌ +**Scenario**: User login ❌ +### Scenario: User login ❌ \`\`\` -**Key Distinction**: Specs capture intent, constraints, and decisions that aren't obvious from code. +Every requirement MUST have at least one scenario. -## Common Scenarios +### Requirement Wording +- Use SHALL/MUST for normative requirements (avoid should/may unless intentionally non-normative) -### New Feature Request -\`\`\` -User: "Add password reset functionality" - -You should: -1. Read specs/user-auth/spec.md -2. Check changes/ for pending auth changes -3. Create changes/add-password-reset/ with: - - proposal.md describing the change - - specs/user-auth/spec.md with: - ## ADDED Requirements - ### Requirement: Password Reset - [Complete requirement for password reset] - - ## MODIFIED Requirements - ### Requirement: User Authentication - [Updated to integrate with password reset] -4. Wait for approval before implementing -\`\`\` +### Delta Operations -### Bug Fix -\`\`\` -User: "Getting null pointer error when bio is empty" +- \`## ADDED Requirements\` - New capabilities +- \`## MODIFIED Requirements\` - Changed behavior +- \`## REMOVED Requirements\` - Deprecated features +- \`## RENAMED Requirements\` - Name changes -You should: -1. Check if spec says bios are optional -2. If yes → Fix directly (it's a bug) -3. If no → Create change proposal (it's a behavior change) -\`\`\` +Headers matched with \`trim(header)\` - whitespace ignored. -### Infrastructure Setup -\`\`\` -User: "Initialize TypeScript project" - -You should: -1. Create change proposal for TypeScript setup -2. Implement configuration files (PR #1) -3. Mark tasks complete in tasks.md -4. After deployment, create separate PR to archive - (no specs update needed - this is tooling, not a capability) +Example for RENAMED: +\`\`\`markdown +## RENAMED Requirements +- FROM: \`### Requirement: Login\` +- TO: \`### Requirement: User Authentication\` \`\`\` -## Summary Workflow +## Troubleshooting -1. **Receive request** → Determine if it needs a change proposal -2. **Read current state** → Check specs and pending changes -3. **Create proposal** → Generate complete change documentation -4. **Get approval** → User reviews the proposal -5. **Implement** → Follow approved tasks, mark completed items in tasks.md -6. **Deploy** → User deploys the implementation -7. **Archive PR** → Create separate PR to: - - Move change to archive - - Update specs if needed - - Mark change as complete +### Common Errors -## PR Workflow Examples +**"Change must have at least one delta"** +- Check \`changes/[name]/specs/\` exists with .md files +- Verify files have operation prefixes (## ADDED Requirements) -### Single Developer, Simple Change -\`\`\` -PR #1: Implementation -- Implement all tasks -- Update tasks.md marking items complete -- Get merged and deployed - -PR #2: Archive (after deployment) -- Move changes/feature-x/ → changes/archive/2025-01-15-feature-x/ -- Update specs if needed -\`\`\` +**"Requirement must have at least one scenario"** +- Check scenarios use \`#### Scenario:\` format (4 hashtags) +- Don't use bullet points or bold for scenario headers -### Multiple Developers, Complex Change -\`\`\` -PR #1: Alice implements auth components -- Complete tasks 1.1, 1.2, 1.3 -- Update tasks.md marking these complete +**Silent scenario parsing failures** +- Exact format required: \`#### Scenario: Name\` +- Debug with: \`openspec show [change] --json --deltas-only\` -PR #2: Bob implements UI components -- Complete tasks 2.1, 2.2 -- Update tasks.md marking these complete +### Validation Tips -PR #3: Alice fixes integration issues -- Complete remaining task 1.4 -- Update tasks.md +\`\`\`bash +# Always use strict mode for comprehensive checks +openspec validate [change] --strict -[Deploy all changes] +# Debug delta parsing +openspec show [change] --json | jq '.deltas' -PR #4: Archive -- Move to archive with deployment date -- Update specs to reflect new auth flow +# Check specific requirement +openspec show [spec] --json -r 1 \`\`\` -### Key Rules -- **Never archive in implementation PRs** - changes aren't done until deployed -- **Always update tasks.md** - shows accurate progress -- **One archive PR per change** - clear completion boundary -- **Archive PR includes spec updates** - keeps specs current - -## Capability Organization Best Practices - -### Naming Capabilities -- Use **verb-noun** patterns: \`user-auth\`, \`payment-capture\`, \`order-checkout\` -- Be specific: \`payment-capture\` not just \`payments\` -- Keep flat: Avoid nesting capabilities within capabilities -- Singular focus: If you need "AND" to describe it, split it - -### When to Split Capabilities -Split when you have: -- Multiple unrelated API endpoints -- Different user personas or actors -- Separate deployment considerations -- Independent evolution paths - -#### Capability Boundary Guidelines -- Would you import these separately? → Separate capabilities -- Different deployment cadence? → Separate capabilities -- Different teams own them? → Separate capabilities -- Shared data models are OK, shared business logic means combine - -Examples: -- user-auth (login/logout) vs user-sessions (token management) → SEPARATE -- payment-capture vs payment-refunds → SEPARATE (different workflows) -- user-profile vs user-settings → COMBINE (same data model, same owner) - -### Cross-Cutting Concerns -For system-wide policies (rate limiting, error handling, security), document them in: -- \`project.md\` for project-wide conventions -- Within relevant capability specs where they apply -- Or create a dedicated capability if complex enough (e.g., \`api-rate-limiting/\`) - -### Examples of Well-Organized Capabilities -\`\`\` -specs/ -├── user-auth/ # Login, logout, password reset -├── user-sessions/ # Token management, refresh -├── user-profile/ # Profile CRUD operations -├── payment-capture/ # Processing payments -├── payment-refunds/ # Handling refunds -└── order-checkout/ # Checkout workflow -\`\`\` +## Happy Path Script -For detailed guidance, see the [Capability Organization Guide](../docs/capability-organization.md). +\`\`\`bash +# 1) Explore current state +openspec spec list --long +openspec list +# Optional full-text search: +# rg -n "Requirement:|Scenario:" openspec/specs +# rg -n "^#|Requirement:" openspec/changes + +# 2) Choose change id and scaffold +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 + +# 3) Add deltas (example) +cat > openspec/changes/$CHANGE/specs/auth/spec.md << 'EOF' +## ADDED Requirements +### Requirement: Two-Factor Authentication +Users MUST provide a second factor during login. -## Common Scenarios and Clarifications +#### Scenario: OTP required +- **WHEN** valid credentials are provided +- **THEN** an OTP challenge is required +EOF -### Decision Ambiguity: Bug vs Behavior Change +# 4) Validate +openspec validate $CHANGE --strict +\`\`\` -When specs are missing or ambiguous: -- If NO spec exists → Treat current code behavior as implicit spec, require proposal -- If spec is VAGUE → Require proposal to clarify spec alongside fix -- If code and spec DISAGREE → Spec is truth, code is buggy (fix without proposal) -- If unsure → Default to creating a proposal (safer option) +## Multi-Capability Example -Example: \`\`\` -User: "The API returns 404 for missing users but should return 400" -AI: Is this a bug (spec says 400) or behavior change (spec says 404)? +openspec/changes/add-2fa-notify/ +├── proposal.md +├── tasks.md +└── specs/ + ├── auth/ + │ └── spec.md # ADDED: Two-Factor Authentication + └── notifications/ + └── spec.md # ADDED: OTP email notification \`\`\` -### When You Don't Know the Scope -It's OK to explore first! Tell the user you need to investigate, then create an informed proposal. - -### Exploration Phase (When Needed) - -BEFORE creating proposal, you may need exploration when: -- User request is vague or high-level -- Multiple implementation approaches exist -- Scope is unclear without seeing code - -Exploration checklist: -1. Tell user you need to explore first -2. Use Grep/Read to understand current state -3. Create initial proposal based on findings -4. Refine with user feedback +auth/spec.md +\`\`\`markdown +## ADDED Requirements +### Requirement: Two-Factor Authentication +... +\`\`\` -Example: +notifications/spec.md +\`\`\`markdown +## ADDED Requirements +### Requirement: OTP Email Notification +... \`\`\` -User: "Add caching to improve performance" -AI: "Let me explore the codebase to understand the current architecture and identify caching opportunities." -[After exploration] -AI: "Based on my analysis, I've identified three areas where caching would help. Here's my proposal..." + +## Best Practices + +### Simplicity First +- Default to <100 lines of new code +- Single-file implementations until proven insufficient +- Avoid frameworks without clear justification +- Choose boring, proven patterns + +### Complexity Triggers +Only add complexity with: +- Performance data showing current solution too slow +- Concrete scale requirements (>1000 users, >100MB data) +- Multiple proven use cases requiring abstraction + +### Clear References +- Use \`file.ts:42\` format for code locations +- Reference specs as \`specs/auth/spec.md\` +- Link related changes and PRs + +### Capability Naming +- Use verb-noun: \`user-auth\`, \`payment-capture\` +- Single purpose per capability +- 10-minute understandability rule +- Split if description needs "AND" + +### Change ID Naming +- Use kebab-case, short and descriptive: \`add-two-factor-auth\` +- Prefer verb-led prefixes: \`add-\`, \`update-\`, \`remove-\`, \`refactor-\` +- Ensure uniqueness; if taken, append \`-2\`, \`-3\`, etc. + +## Tool Selection Guide + +| Task | Tool | Why | +|------|------|-----| +| Find files by pattern | Glob | Fast pattern matching | +| Search code content | Grep | Optimized regex search | +| Read specific files | Read | Direct file access | +| Explore unknown scope | Task | Multi-step investigation | + +## Error Recovery + +### Change Conflicts +1. Run \`openspec list\` to see active changes +2. Check for overlapping specs +3. Coordinate with change owners +4. Consider combining proposals + +### Validation Failures +1. Run with \`--strict\` flag +2. Check JSON output for details +3. Verify spec file format +4. Ensure scenarios properly formatted + +### Missing Context +1. Read project.md first +2. Check related specs +3. Review recent archives +4. Ask for clarification + +## 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 +\`\`\`bash +openspec list # What's in progress? +openspec show [item] # View details +openspec diff [change] # What's changing? +openspec validate --strict # Is it correct? +openspec archive [change] # Mark complete \`\`\` -### When No Specs Exist -Treat current code as implicit spec. Your proposal should document current state AND proposed changes. - -### When in Doubt -Default to creating a proposal. It's easier to skip an unnecessary proposal than fix an undocumented change. - -### AI Workflow Adaptations - -Task tracking with OpenSpec: -- Track exploration tasks separately from implementation -- Document proposal creation steps as you go -- Keep implementation tasks separate until proposal approved - -Parallel operations encouraged: -- Read multiple specs simultaneously -- Check multiple pending changes at once -- Batch related searches for efficiency - -Progress communication: -- "Exploring codebase to understand scope..." -- "Creating proposal based on findings..." -- "Implementing approved changes..." - -### For AI Assistants -- **Bias toward simplicity** - Propose the minimal solution that works -- Use your exploration tools liberally before proposing -- Batch operations for efficiency -- Communicate your progress -- It's OK to revise proposals based on discoveries -- **Question complexity** - If your solution feels complex, simplify first - -## Edge Case Handling - -### Multi-Capability Changes -Create ONE proposal that: -- Lists all affected capabilities -- Shows changes per capability -- Has unified task list -- Gets approved as a whole - -### Outdated Specs -If specs clearly outdated: -1. Create proposal to update specs to match reality -2. Implement new feature in separate proposal -3. OR combine both in one proposal with clear sections - -### Emergency Hotfixes -For critical production issues: -1. Announce: "This is an emergency fix" -2. Implement fix immediately -3. Create retroactive proposal -4. Update specs after deployment -5. Tag with [EMERGENCY] in archive - -### Pure Refactoring -No proposal needed for: -- Code formatting/style -- Internal refactoring (same API) -- Performance optimization (same behavior) -- Adding types to untyped code - -Proposal REQUIRED for: -- API changes (even if compatible) -- Database schema changes -- Architecture changes -- New dependencies - -### Observability Additions -No proposal needed for: -- Adding log statements -- New metrics/traces -- Debugging additions -- Error tracking - -Proposal REQUIRED if: -- Changes log format/structure -- Adds new monitoring service -- Changes what's logged (privacy) - -## Remember - -- You are the process driver - automate documentation burden -- Specs must always reflect deployed reality -- Changes are proposed, not imposed -- Impact analysis prevents surprises -- Simplicity is the power - just markdown files, minimal solutions -- Start simple, add complexity only when justified - -By following these conventions, you enable true spec-driven development where documentation stays current, changes are traceable, and evolution is intentional. -`; \ No newline at end of file +Remember: Specs are truth. Changes are proposals. Keep them in sync. +`;