aios-core
Version:
Synkra AIOS: AI-Orchestrated System for Full Stack Development - Core Framework
398 lines (316 loc) • 8.88 kB
Markdown
# Extract Patterns
## Purpose
Extract and document code patterns from the codebase. Analyzes code via AST and regex to detect common patterns used in the project, generating a `patterns.md` file that serves as a reference for agents (especially the Spec Writer) when creating new features.
## Task Definition (AIOS Task Format V1.0)
```yaml
task: extract-patterns()
agent: "@dev"
responsável: Dex (Developer)
responsavel_type: Agente
atomic_layer: Workflow
elicit: false
inputs:
- name: subcommand
type: enum
required: false
default: extract
options: [extract, json, save, merge]
description: Action to perform
- name: root
type: string
required: false
default: "."
description: Project root path
- name: output
type: string
required: false
description: Custom output file path
- name: category
type: string
required: false
description: Extract only specific category (e.g., "State Management")
- name: quiet
type: flag
required: false
default: false
description: Suppress console output
- name: help
type: flag
required: false
default: false
description: Show usage documentation
outputs:
- name: patterns_markdown
type: string
destino: File (.aios/patterns.md)
persistido: true
- name: patterns_json
type: object
destino: Console or File
persistido: false
- name: summary
type: object
destino: Console
persistido: false
```
## Pre-Conditions
```yaml
pre-conditions:
- [ ] Project root is a valid codebase
tipo: pre-condition
blocker: true
validação: Check package.json or .aios-core exists
error_message: "Could not find project root. Run from within a project directory."
- [ ] Code files exist
tipo: pre-condition
blocker: true
validação: At least one .ts/.tsx/.js/.jsx file exists
error_message: "No code files found to analyze."
```
## Implementation Steps
### Step 1: Check Help Flag
```javascript
if (args.help) {
displayHelp();
return;
}
```
### Step 2: Initialize Pattern Extractor
```javascript
const PatternExtractor = require('.aios-core/infrastructure/scripts/pattern-extractor');
const extractor = new PatternExtractor(args.root);
```
### Step 3: Detect Patterns
```javascript
const patterns = await extractor.detectPatterns();
```
### Step 4: Execute Subcommand
#### Extract (Default)
```javascript
if (args.subcommand === 'extract' || !args.subcommand) {
const markdown = extractor.generateMarkdown();
if (args.output) {
await fs.writeFile(args.output, markdown);
console.log(`Patterns saved to: ${args.output}`);
} else {
console.log(markdown);
}
}
```
#### JSON Output
```javascript
if (args.subcommand === 'json') {
const json = extractor.toJSON();
if (args.output) {
await fs.writeFile(args.output, JSON.stringify(json, null, 2));
console.log(`JSON saved to: ${args.output}`);
} else {
console.log(JSON.stringify(json, null, 2));
}
}
```
#### Save to Default Location
```javascript
if (args.subcommand === 'save') {
const savedPath = await extractor.savePatterns(args.output);
console.log(`Patterns saved to: ${savedPath}`);
}
```
#### Merge with Existing
```javascript
if (args.subcommand === 'merge') {
const mergedPath = await extractor.mergeWithExisting(args.output);
console.log(`Patterns merged and saved to: ${mergedPath}`);
}
```
## Help Text
```text
Usage: *extract-patterns [subcommand] [options]
Extract and document code patterns from the codebase.
Subcommands:
extract Extract patterns and output as markdown (default)
json Output patterns as JSON
save Save to .aios/patterns.md
merge Merge with existing patterns file
Options:
--root <path> Project root (default: current directory)
--output <path> Custom output file path
--category <name> Extract specific category only
--quiet Suppress console output
--help Show this help message
Pattern Categories:
- State Management (Zustand, Redux, Context)
- API Calls (SWR, fetch, React Query)
- Error Handling (try-catch, ErrorBoundary, toast)
- Components (memo, compound, conditional classes)
- Hooks (custom hooks, useEffect cleanup)
- Data Access (Prisma, fs.promises)
- Testing (Jest structure, mocks)
- Utilities (class-based, functional)
Examples:
*extract-patterns # Output to console
*extract-patterns save # Save to .aios/patterns.md
*extract-patterns json --output p.json # Save as JSON
*extract-patterns --category "State" # Only state patterns
*extract-patterns merge # Update existing file
Output File:
Default location: .aios/patterns.md
This file is referenced by the Spec Writer for consistent patterns.
```
## Output Formats
### Markdown Output (Default)
```markdown
# Project Patterns
> Auto-generated from codebase analysis
> Last updated: 2026-01-28T14:00:00Z
## Table of Contents
- [State Management](#state-management)
- [API Calls](#api-calls)
- [Error Handling](#error-handling)
...
## State Management
### Zustand Store with Persist
\`\`\`typescript
import { create } from 'zustand';
import { persist } from 'zustand/middleware';
interface ExampleState {
data: Data | null;
loading: boolean;
...
}
export const useExampleStore = create<ExampleState>()(
persist(
(set, get) => ({
...
}),
{ name: 'example-storage' }
)
);
\`\`\`
**When to use:** Any domain state that needs persistence across sessions.
**Files using this pattern:** authStore.ts, userStore.ts, settingsStore.ts
```
### JSON Output
```json
{
"generated": "2026-01-28T14:00:00Z",
"rootPath": "/path/to/project",
"totalPatterns": 12,
"categories": {
"State Management": [
{
"name": "Zustand Store with Persist",
"description": "...",
"whenToUse": "...",
"example": "...",
"filesUsing": ["store.ts"],
"confidence": 0.95
}
]
}
}
```
### Summary Output
```text
Scanning patterns in: /path/to/project
Patterns saved to: .aios/patterns.md
Total patterns detected: 12
State Management: 3
API Calls: 2
Error Handling: 2
Components: 2
Hooks: 1
Data Access: 1
Testing: 1
```
## Post-Conditions
```yaml
post-conditions:
- [ ] Patterns file created/updated
tipo: post-condition
blocker: false
validação: Check .aios/patterns.md exists and is valid markdown
- [ ] Summary displayed
tipo: post-condition
blocker: false
validação: Console shows pattern count summary
```
## Integration with Spec Writer
The generated `patterns.md` file is automatically referenced by the Spec Writer (Epic 3) when:
1. **Creating new stories** - Patterns inform implementation approach
2. **Reviewing code** - Ensures consistency with existing patterns
3. **Suggesting architecture** - Uses detected patterns as baseline
### Reference in Spec Writer
```yaml
# In spec-write.md task
references:
- path: .aios/patterns.md
purpose: Ensure new code follows existing patterns
usage: Include relevant patterns in implementation notes
```
## Error Handling
| Error | Cause | Resolution |
|-------|-------|------------|
| Project root not found | Invalid path | Use --root to specify correct path |
| No code files found | Empty project | Ensure project has .ts/.tsx/.js files |
| Permission denied | File access | Check directory permissions |
| Invalid category | Typo in category name | Use exact category name from help |
**Error Recovery Strategy:**
```javascript
try {
const patterns = await extractor.detectPatterns();
displaySummary(patterns);
} catch (error) {
console.error(`⚠️ Error extracting patterns: ${error.message}`);
console.log('Ensure you are in a valid project directory.');
}
```
## Performance
```yaml
duration_expected: 5-30s (depends on codebase size)
cost_estimated: $0.00 (local file operations only)
token_usage: 0
optimizations:
- File caching during scan
- Early termination for pattern detection
- Incremental updates with merge command
- Excluded directories: node_modules, .git, dist, build
```
## CLI Script
```bash
# Direct script execution
node .aios-core/infrastructure/scripts/pattern-extractor.js [command] [options]
# Via AIOS command
*extract-patterns [command] [options]
```
## Metadata
```yaml
story: "7.3"
epic: "Epic 7 - Memory Layer"
version: 1.0.0
created: 2026-01-29
author: "@dev (Dex)"
dependencies:
modules:
- .aios-core/infrastructure/scripts/pattern-extractor.js
tasks: []
referenced_by:
- spec-write.md
tags:
- memory-layer
- patterns
- code-analysis
- spec-writer
- documentation
```