Capture positive evolutions from epic execution. Detects new components, fields, patterns, and capabilities added during implementation. Updates design registries and agent knowledge...
Capture positive evolutions from completed epics - the new components, fields, patterns, and capabilities that were added during implementation. This complements /retro (which captures failures) by documenting what was successfully created.
Key Principle: Only propose updates for truly new additions. If an epic used existing patterns and components, no updates are needed.
/run-tasks Step 10 (epic completion)/evolve <epic-id> directly| Invocation | Description |
|---|---|
/evolve <epic-id> |
Analyze a specific completed epic |
/evolve <epic-id> --dry-run |
Preview without modifying files |
/run-tasks Step 10 |
Automatically called before epic close |
Get the epic's git history to understand what changed:
# Get epic branch or commit range
EPIC_ID="$1"
# Find commits associated with this epic (from commit messages)
COMMITS=$(git log --oneline --grep="$EPIC_ID" --format="%H")
# Or if on epic branch
git log main..HEAD --oneline
Get the combined diff of all changes:
# Files changed in epic
git diff main...HEAD --name-only
# Full diff for analysis
git diff main...HEAD --unified=3
Read current documented patterns to compare against:
# Design system registries
COMPONENTS_REGISTRY=".design/Components.md"
FIELDS_REGISTRY=".design/Fields.md"
PATTERNS_REGISTRY=".design/Patterns.md"
# Extract known components (look for ## headers or component names)
KNOWN_COMPONENTS=$(grep -E "^### " "$COMPONENTS_REGISTRY" | sed 's/### //')
# Extract known fields
KNOWN_FIELDS=$(grep -E "^\| \`" "$FIELDS_REGISTRY" | sed 's/| `//' | cut -d'`' -f1)
# Extract known patterns
KNOWN_PATTERNS=$(grep -E "^### " "$PATTERNS_REGISTRY" | sed 's/### //')
Analyze the diff for new exports and definitions:
# Find new component exports in renderer
git diff main...HEAD -- "src/renderer/**/*.tsx" | \
grep -E "^\\+export (const|function) [A-Z]" | \
sed 's/+export //' | \
awk '{print $2}' | \
cut -d'(' -f1
Look for:
src/renderer/components/export const ComponentName or export function ComponentName# Find new interface/type definitions
git diff main...HEAD -- "src/shared/types/**/*.ts" | \
grep -E "^\\+export (interface|type) " | \
sed 's/+export //'
# Find new enum values
git diff main...HEAD -- "src/shared/types/**/*.ts" | \
grep -E "^\\+ [A-Z_]+ = "
Look for:
Analyze code structure for repeated patterns:
useXxx)# Find new hooks
git diff main...HEAD -- "src/renderer/**/*.ts" | \
grep -E "^\\+export function use[A-Z]"
# Find new utilities
git diff main...HEAD -- "src/*/lib/**/*.ts" | \
grep -E "^\\+export (const|function)"
Remove items already in registries:
function filterNew(detected: string[], known: string[]): string[] {
return detected.filter(item =>
!known.some(k => k.toLowerCase() === item.toLowerCase())
);
}
const newComponents = filterNew(detectedComponents, knownComponents);
const newFields = filterNew(detectedFields, knownFields);
const newPatterns = filterNew(detectedPatterns, knownPatterns);
If new items found, present for approval:
## Evolution Report: <epic-id>
### Summary
- **Epic**: <title>
- **New Components**: <count>
- **New Fields/Types**: <count>
- **New Patterns**: <count>
---
### New Components
#### TaskStatusBadge
- **File**: `src/renderer/components/common/TaskStatusBadge.tsx`
- **Props**: `{ status: TaskStatus, size?: 'sm' | 'md' }`
- **Usage**: Display task status with color coding
**Suggested addition to `.design/Components.md`:**
```markdown
### TaskStatusBadge
Status indicator for beads tasks.
**Usage:**
\`\`\`tsx
<TaskStatusBadge status="in_progress" size="sm" />
\`\`\`
**Variants:** Uses status colors from Colors.md
src/shared/types/beads.tsP0 | P1 | P2 | P3 | P4Suggested addition to .design/Fields.md:
| Field | Type | Values | Description |
|---|---|---|---|
priority |
TaskPriority |
P0-P4 | Task urgency (P0=critical) |
src/renderer/lib/hooks/useBeadsQuery.tsSuggested addition to .design/Patterns.md:
### useBeadsQuery
Custom hook for fetching beads data with caching.
\`\`\`tsx
const { data, loading, error, refetch } = useBeadsQuery('bd list --json');
\`\`\`
Approval Required
Apply these evolution updates?
### Step 6: Apply Approved Updates
For each approved item, append to the appropriate registry:
#### Components Registry
```bash
cat >> .design/Components.md << 'EOF'
---
### <ComponentName>
<description>
**Usage:**
```tsx
<example code>
Added: Epic
#### Fields Registry
```bash
# Append to table in .design/Fields.md
# Insert before the closing of the table
cat >> .design/Patterns.md << 'EOF'
---
### <PatternName>
<description>
**Example:**
```tsx
<example code>
Added: Epic
### Step 7: Update Agent Knowledge (Optional)
If new capabilities were discovered, offer to update agent prompts:
```markdown
### Agent Knowledge Updates
The following agents may benefit from knowing about new patterns:
#### typescript-agent.md
**Suggested Addition:**
```diff
+ ### TaskStatusBadge
+ Use TaskStatusBadge from components/common for status display.
+ Don't create custom status badges.
Apply agent updates?
### Step 8: Archive Evolution
Create evolution record:
```bash
mkdir -p .claude/evolutions
cat > .claude/evolutions/<epic-id>.md << 'EOF'
# Evolution: <epic-id>
**Date**: <date>
**Epic**: <title>
## Additions
### Components
- TaskStatusBadge
### Fields
- priority (TaskPriority enum)
### Patterns
- useBeadsQuery hook
## Registry Updates
- .design/Components.md: +1 component
- .design/Fields.md: +1 field
- .design/Patterns.md: +1 pattern
EOF
When epic used only existing patterns:
## Evolution Report: <epic-id>
**No new additions detected.**
This epic successfully reused existing:
- Components: Button, Card, Badge
- Fields: status, created_at, user_id
- Patterns: useBeadsQuery, IPC handler
No registry updates needed.
When --dry-run specified:
---
**DRY RUN: No files modified**
To apply these updates, run:
`/evolve <epic-id>` (without --dry-run)
If detected item name conflicts with existing (but different implementation):
**Warning: Name Conflict**
Detected `StatusBadge` but `.design/Components.md` already has a StatusBadge.
Options:
1. This is the same component (skip)
2. This is different - rename to `TaskStatusBadge`
3. This replaces the old one (update existing entry)
# Component Patterns
> UI component registry for the project
---
## Core Components
### Button
<existing documentation>
### Card
<existing documentation>
---
## Feature Components
### TaskStatusBadge
**Added**: Epic bd-x1y2, 2024-01-15
Status indicator for beads tasks.
...
# Field Registry
> Data field definitions, types, and allowed values
---
## Core Fields
| Field | Type | Values | Description |
|-------|------|--------|-------------|
| `id` | `string` | UUID | Unique identifier |
| `created_at` | `datetime` | ISO 8601 | Creation timestamp |
| `status` | `enum` | open, closed, blocked | Current state |
---
## Feature Fields
| Field | Type | Values | Description | Added |
|-------|------|--------|-------------|-------|
| `priority` | `TaskPriority` | P0-P4 | Task urgency | bd-x1y2 |
# Pattern Library
> Reusable code patterns and conventions
---
## Data Fetching
### useBeadsQuery
**Added**: Epic bd-x1y2
Custom hook for beads data with caching.
```tsx
const { data, loading, refetch } = useBeadsQuery('bd list --json');
...
---
## Integration with /run-tasks
At Step 10 (epic completion), before closing:
```markdown
All tasks complete for "<epic-title>".
**Checking for evolutions...**
Found 2 new additions:
- Component: TaskStatusBadge
- Pattern: useBeadsQuery
Options:
1. Close epic (skip evolution capture)
2. Review and capture evolutions (recommended)
3. Run retrospective + evolution capture
If user selects 2 or 3, invoke /evolve <epic-id>.
The discovery skill should reference registries:
## Step 3: Establish Patterns
Before designing new components, check existing registries:
**Available Components** (from .design/Components.md):
- Button, Card, Badge, Input, Select, Dialog...
**Available Fields** (from .design/Fields.md):
- id, created_at, updated_at, status, priority...
**Available Patterns** (from .design/Patterns.md):
- useBeadsQuery, IPC handler, Zustand store...
Spec should reference existing patterns where applicable.
Target: ~1500 tokens for evolution check
| Component | Budget |
|---|---|
| Git diff analysis | ~300 |
| Registry comparison | ~200 |
| Generate report | ~500 |
| Apply updates | ~300 |
| Archive | ~200 |
Skip entirely if no new additions detected (~100 tokens).
# project.yaml
workflow:
evolution:
enabled: true
auto_prompt: true # Prompt at epic close
registries:
components: ".design/Components.md"
fields: ".design/Fields.md"
patterns: ".design/Patterns.md"
detect:
components: true
fields: true
patterns: true
agent_capabilities: false # Optional
This skill may create or modify:
| Path | Action | Approval |
|---|---|---|
.design/Components.md |
Append | Required |
.design/Fields.md |
Append | Required |
.design/Patterns.md |
Append | Required |
.claude/agents/*.md |
Append | Required |
.claude/evolutions/<epic-id>.md |
Create | Automatic |
User: /evolve bd-abc1
Claude:
## Evolution Report: bd-abc1
Analyzing epic "Add user profile page"...
**Detected patterns used:**
- Components: Card, Button, Input, Avatar
- Fields: user_id, email, created_at
- Patterns: useBeadsQuery, Zustand store
**Comparison with registries:**
- All components already documented
- All fields already in registry
- All patterns already captured
**No new additions detected.**
This epic successfully followed existing patterns. No registry updates needed.
User: /evolve bd-xyz9
Claude:
## Evolution Report: bd-xyz9
Analyzing epic "Task dependency visualization"...
### New Additions Detected
#### Components (2 new)
1. **DependencyGraph** - `src/renderer/components/board/DependencyGraph.tsx`
- Interactive graph showing task dependencies
- Uses react-flow for rendering
2. **DependencyEdge** - `src/renderer/components/board/DependencyEdge.tsx`
- Custom edge component for dependency arrows
#### Fields (1 new)
1. **blocked_by** - `string[]` - Array of task IDs that block this task
#### Patterns (1 new)
1. **useGraphLayout** - Custom hook for auto-layout of dependency graphs
---
**Apply these updates?**
1. Apply all (4 additions)
2. Apply selectively
3. Skip all
User: 1
Claude:
Applying evolution updates...
- Updated: .design/Components.md (+2 components)
- Updated: .design/Fields.md (+1 field)
- Updated: .design/Patterns.md (+1 pattern)
- Created: .claude/evolutions/bd-xyz9.md
Evolution capture complete.