@itz4blitz/agentful 0.2.1 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/agents/orchestrator.md +121 -610
- package/.claude/commands/agentful-generate.md +206 -0
- package/.claude/skills/conversation/SKILL.md +152 -975
- package/bin/cli.js +108 -583
- package/bin/hooks/health-check.sh +16 -16
- package/lib/index.js +6 -36
- package/lib/init.js +162 -0
- package/package.json +1 -2
- package/version.json +1 -1
- package/.claude/commands/agentful-agents.md +0 -668
- package/.claude/commands/agentful-skills.md +0 -635
- package/.claude/product/CHANGES.md +0 -276
- package/lib/agent-generator.js +0 -778
- package/lib/domain-detector.js +0 -468
- package/lib/domain-structure-generator.js +0 -770
- package/lib/project-analyzer.js +0 -701
- package/lib/tech-stack-detector.js +0 -1091
- package/lib/template-engine.js +0 -240
- package/templates/agents/domain-agent.template.md +0 -208
- package/templates/agents/tech-agent.template.md +0 -124
package/lib/template-engine.js
DELETED
|
@@ -1,240 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Template Engine
|
|
3
|
-
*
|
|
4
|
-
* Simple template engine for variable interpolation in agent templates.
|
|
5
|
-
* Supports nested objects, arrays, and conditional rendering.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
class TemplateEngine {
|
|
9
|
-
/**
|
|
10
|
-
* Render template with data
|
|
11
|
-
*/
|
|
12
|
-
static render(template, data) {
|
|
13
|
-
let content = template;
|
|
14
|
-
|
|
15
|
-
// Handle arrays and objects with special formatting FIRST
|
|
16
|
-
// This allows formatComplexTypes to format arrays before conditionals/loops process them
|
|
17
|
-
content = this.formatComplexTypes(content, data);
|
|
18
|
-
|
|
19
|
-
// Handle conditionals and loops (after complex types are formatted)
|
|
20
|
-
content = this.processConditionals(content, data);
|
|
21
|
-
content = this.processLoops(content, data);
|
|
22
|
-
|
|
23
|
-
// Replace simple variables: {{variable}}
|
|
24
|
-
content = this.replaceVariables(content, data);
|
|
25
|
-
|
|
26
|
-
// Add timestamp if needed
|
|
27
|
-
if (content.includes('{{generated_at}}')) {
|
|
28
|
-
content = content.replace(/\{\{generated_at\}\}/g, new Date().toISOString());
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
return content;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
/**
|
|
35
|
-
* Process {{#if variable}}...{{else}}...{{/if}} conditionals
|
|
36
|
-
*/
|
|
37
|
-
static processConditionals(content, data) {
|
|
38
|
-
// Match {{#if variable}}...{{else}}...{{/if}} or {{#if variable}}...{{/if}}
|
|
39
|
-
const ifRegex = /\{\{#if\s+(\w+(?:\.\w+)*)\s*\}\}([\s\S]*?)(?:\{\{else\}\}([\s\S]*?))?\{\{\/if\}\}/g;
|
|
40
|
-
|
|
41
|
-
return content.replace(ifRegex, (match, variable, trueBlock, falseBlock) => {
|
|
42
|
-
const value = this.getNestedValue(data, variable);
|
|
43
|
-
const isTruthy = this.isTruthy(value);
|
|
44
|
-
|
|
45
|
-
if (isTruthy) {
|
|
46
|
-
return trueBlock || '';
|
|
47
|
-
} else {
|
|
48
|
-
return falseBlock || '';
|
|
49
|
-
}
|
|
50
|
-
});
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
/**
|
|
54
|
-
* Process {{#each array}}...{{/each}} loops
|
|
55
|
-
*/
|
|
56
|
-
static processLoops(content, data) {
|
|
57
|
-
// Match {{#each variable}}...{{/each}}
|
|
58
|
-
const eachRegex = /\{\{#each\s+(\w+(?:\.\w+)*)\s*\}\}([\s\S]*?)\{\{\/each\}\}/g;
|
|
59
|
-
|
|
60
|
-
return content.replace(eachRegex, (match, variable, block) => {
|
|
61
|
-
const array = this.getNestedValue(data, variable);
|
|
62
|
-
|
|
63
|
-
if (!Array.isArray(array) || array.length === 0) {
|
|
64
|
-
return '';
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
return array.map(item => {
|
|
68
|
-
let itemContent = block;
|
|
69
|
-
|
|
70
|
-
// Handle {{this}} for primitive values
|
|
71
|
-
if (typeof item !== 'object') {
|
|
72
|
-
itemContent = itemContent.replace(/\{\{this\}\}/g, String(item));
|
|
73
|
-
} else {
|
|
74
|
-
// Handle {{this.property}} for objects
|
|
75
|
-
itemContent = itemContent.replace(/\{\{this\.(\w+)\}\}/g, (m, prop) => {
|
|
76
|
-
const value = item[prop];
|
|
77
|
-
return value !== undefined ? String(value) : '';
|
|
78
|
-
});
|
|
79
|
-
|
|
80
|
-
// Handle {{this}} for objects
|
|
81
|
-
// Smart default: if object has 'code' or 'name' property, use that; otherwise stringify
|
|
82
|
-
itemContent = itemContent.replace(/\{\{this\}\}/g, () => {
|
|
83
|
-
if (item.code !== undefined) return String(item.code);
|
|
84
|
-
if (item.name !== undefined) return String(item.name);
|
|
85
|
-
return JSON.stringify(item);
|
|
86
|
-
});
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
return itemContent;
|
|
90
|
-
}).join('');
|
|
91
|
-
});
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
/**
|
|
95
|
-
* Get nested value from object using dot notation
|
|
96
|
-
*/
|
|
97
|
-
static getNestedValue(obj, path) {
|
|
98
|
-
return path.split('.').reduce((current, prop) => {
|
|
99
|
-
return current?.[prop];
|
|
100
|
-
}, obj);
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
/**
|
|
104
|
-
* Check if value is truthy (for conditionals)
|
|
105
|
-
*/
|
|
106
|
-
static isTruthy(value) {
|
|
107
|
-
if (value === null || value === undefined) return false;
|
|
108
|
-
if (typeof value === 'boolean') return value;
|
|
109
|
-
if (typeof value === 'number') return value !== 0;
|
|
110
|
-
if (typeof value === 'string') return value.length > 0;
|
|
111
|
-
if (Array.isArray(value)) return value.length > 0;
|
|
112
|
-
if (typeof value === 'object') return Object.keys(value).length > 0;
|
|
113
|
-
return true;
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
/**
|
|
117
|
-
* Replace simple variables
|
|
118
|
-
*/
|
|
119
|
-
static replaceVariables(content, data) {
|
|
120
|
-
for (const [key, value] of Object.entries(data)) {
|
|
121
|
-
const placeholder = new RegExp(`\\{\\{${key}\\}\\}`, 'g');
|
|
122
|
-
content = content.replace(placeholder, this.formatValue(value));
|
|
123
|
-
}
|
|
124
|
-
return content;
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
/**
|
|
128
|
-
* Format complex types (arrays, objects)
|
|
129
|
-
*/
|
|
130
|
-
static formatComplexTypes(content, data) {
|
|
131
|
-
// Handle code_samples first (before generic samples check)
|
|
132
|
-
if (data.codeSamples && Array.isArray(data.codeSamples)) {
|
|
133
|
-
const placeholder = new RegExp('\\{\\{code_samples\\}\\}', 'g');
|
|
134
|
-
const formatted = this.formatSamples(data.codeSamples);
|
|
135
|
-
content = content.replace(placeholder, formatted);
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
// Handle samples array
|
|
139
|
-
if (data.samples && Array.isArray(data.samples)) {
|
|
140
|
-
const placeholder = new RegExp('\\{\\{samples\\}\\}', 'g');
|
|
141
|
-
const formatted = this.formatSamples(data.samples);
|
|
142
|
-
content = content.replace(placeholder, formatted);
|
|
143
|
-
}
|
|
144
|
-
// Handle patterns array - format as bullet points
|
|
145
|
-
if (data.patterns && Array.isArray(data.patterns)) {
|
|
146
|
-
const placeholder = new RegExp('\\{\\{patterns\\}\\}', 'g');
|
|
147
|
-
const formatted = data.patterns
|
|
148
|
-
.map(p => {
|
|
149
|
-
if (typeof p === 'string') return `- ${p}`;
|
|
150
|
-
if (p.keyword && p.context) {
|
|
151
|
-
return `- **${p.keyword}**: Found in codebase`;
|
|
152
|
-
}
|
|
153
|
-
return JSON.stringify(p);
|
|
154
|
-
})
|
|
155
|
-
.join('\n');
|
|
156
|
-
content = content.replace(placeholder, formatted);
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
// Handle conventions array
|
|
160
|
-
if (data.conventions && Array.isArray(data.conventions)) {
|
|
161
|
-
const placeholder = new RegExp('\\{\\{conventions\\}\\}', 'g');
|
|
162
|
-
const formatted = data.conventions
|
|
163
|
-
.filter(c => c && c.trim())
|
|
164
|
-
.map(c => `- ${c}`)
|
|
165
|
-
.join('\n');
|
|
166
|
-
content = content.replace(placeholder, formatted || 'No specific conventions detected');
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
// Handle features array
|
|
170
|
-
if (data.features && Array.isArray(data.features)) {
|
|
171
|
-
const placeholder = new RegExp('\\{\\{features\\}\\}', 'g');
|
|
172
|
-
const formatted = data.features
|
|
173
|
-
.map(f => `- **${f.name}**: ${f.description || 'No description'}`)
|
|
174
|
-
.join('\n');
|
|
175
|
-
content = content.replace(placeholder, formatted || 'No features detected');
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
// Handle endpoints array
|
|
179
|
-
if (data.endpoints && Array.isArray(data.endpoints)) {
|
|
180
|
-
const placeholder = new RegExp('\\{\\{endpoints\\}\\}', 'g');
|
|
181
|
-
const formatted = data.endpoints
|
|
182
|
-
.map(e => `- \`${e.code || e}\``)
|
|
183
|
-
.join('\n');
|
|
184
|
-
content = content.replace(placeholder, formatted || 'No endpoints detected');
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
// Handle models array
|
|
188
|
-
if (data.models && Array.isArray(data.models)) {
|
|
189
|
-
const placeholder = new RegExp('\\{\\{models\\}\\}', 'g');
|
|
190
|
-
const formatted = data.models
|
|
191
|
-
.map(m => `- \`${m.code || m}\``)
|
|
192
|
-
.join('\n');
|
|
193
|
-
content = content.replace(placeholder, formatted || 'No models detected');
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
return content;
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
/**
|
|
200
|
-
* Format code samples for display
|
|
201
|
-
*/
|
|
202
|
-
static formatSamples(samples) {
|
|
203
|
-
if (!samples || samples.length === 0) {
|
|
204
|
-
return 'No code samples available yet.';
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
return samples
|
|
208
|
-
.slice(0, 5) // Limit to 5 samples
|
|
209
|
-
.map(sample => {
|
|
210
|
-
if (typeof sample === 'string') return sample;
|
|
211
|
-
|
|
212
|
-
const path = sample.path || 'unknown';
|
|
213
|
-
const content = sample.content || '';
|
|
214
|
-
|
|
215
|
-
return `#### ${path}\n\`\`\`\n${content.substring(0, 800)}${content.length > 800 ? '\n...' : ''}\n\`\`\``;
|
|
216
|
-
})
|
|
217
|
-
.join('\n\n');
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
/**
|
|
221
|
-
* Format value for template
|
|
222
|
-
*/
|
|
223
|
-
static formatValue(value) {
|
|
224
|
-
if (value === null || value === undefined) {
|
|
225
|
-
return '';
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
if (Array.isArray(value)) {
|
|
229
|
-
return value.join(', ');
|
|
230
|
-
}
|
|
231
|
-
|
|
232
|
-
if (typeof value === 'object') {
|
|
233
|
-
return JSON.stringify(value, null, 2);
|
|
234
|
-
}
|
|
235
|
-
|
|
236
|
-
return String(value);
|
|
237
|
-
}
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
export default TemplateEngine;
|
|
@@ -1,208 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: {{domain}}-agent
|
|
3
|
-
description: Specialized agent for {{domain}} domain with context-aware knowledge of codebase patterns, conventions, and existing implementations.
|
|
4
|
-
model: sonnet
|
|
5
|
-
tools: Read, Write, Edit, Glob, Grep, Bash
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
# {{domain}} Agent
|
|
9
|
-
|
|
10
|
-
You are the **{{domain}}** domain specialist. You have deep knowledge of this project's {{domain}} implementation, patterns, and conventions.
|
|
11
|
-
|
|
12
|
-
## Domain Context
|
|
13
|
-
|
|
14
|
-
**Confidence**: {{confidence}}%
|
|
15
|
-
**Language**: {{language}}
|
|
16
|
-
**Detected Features**: {{features}}
|
|
17
|
-
|
|
18
|
-
## Your Scope
|
|
19
|
-
|
|
20
|
-
You work exclusively on **{{domain}}**-related functionality:
|
|
21
|
-
{{#if features}}
|
|
22
|
-
{{#each features}}
|
|
23
|
-
- **{{this.name}}** - {{this.description}}
|
|
24
|
-
{{/each}}
|
|
25
|
-
{{else}}
|
|
26
|
-
- All {{domain}} domain features and business logic
|
|
27
|
-
- {{domain}}-specific APIs and endpoints
|
|
28
|
-
- {{domain}} data models and schemas
|
|
29
|
-
- {{domain}} services and repositories
|
|
30
|
-
{{/if}}
|
|
31
|
-
|
|
32
|
-
## Codebase Knowledge
|
|
33
|
-
|
|
34
|
-
This project uses:
|
|
35
|
-
- **Language**: {{language}}
|
|
36
|
-
- **Framework**: {{framework}}
|
|
37
|
-
- **Confidence**: {{confidence}}%
|
|
38
|
-
|
|
39
|
-
### Project Conventions
|
|
40
|
-
|
|
41
|
-
{{conventions}}
|
|
42
|
-
|
|
43
|
-
### Code Samples from This Project
|
|
44
|
-
|
|
45
|
-
{{code_samples}}
|
|
46
|
-
|
|
47
|
-
### Detected Patterns
|
|
48
|
-
|
|
49
|
-
{{patterns}}
|
|
50
|
-
|
|
51
|
-
## Implementation Guidelines
|
|
52
|
-
|
|
53
|
-
### 1. Follow Existing Patterns
|
|
54
|
-
|
|
55
|
-
Before implementing anything, study the existing code samples above. Match:
|
|
56
|
-
- Naming conventions (camelCase, PascalCase, etc.)
|
|
57
|
-
- File structure and organization
|
|
58
|
-
- Import/export patterns
|
|
59
|
-
- Error handling style
|
|
60
|
-
- Code formatting and spacing
|
|
61
|
-
|
|
62
|
-
### 2. Stay Within Domain
|
|
63
|
-
|
|
64
|
-
**DO**:
|
|
65
|
-
- Implement {{domain}} features
|
|
66
|
-
- Modify {{domain}} services, repositories, controllers
|
|
67
|
-
- Update {{domain}} data models
|
|
68
|
-
- Add {{domain}} API endpoints
|
|
69
|
-
- Fix bugs in {{domain}} code
|
|
70
|
-
|
|
71
|
-
**DON'T**:
|
|
72
|
-
- Modify other domains (delegate to those agents)
|
|
73
|
-
- Change frontend UI components (delegate to @frontend)
|
|
74
|
-
- Modify infrastructure (delegate to @backend)
|
|
75
|
-
- Break existing {{domain}} contracts
|
|
76
|
-
|
|
77
|
-
### 3. Maintain Consistency
|
|
78
|
-
|
|
79
|
-
Always use the project's existing patterns:
|
|
80
|
-
{{#if patterns}}
|
|
81
|
-
{{#each patterns}}
|
|
82
|
-
- {{this}}
|
|
83
|
-
{{/each}}
|
|
84
|
-
{{/if}}
|
|
85
|
-
|
|
86
|
-
## Common Tasks
|
|
87
|
-
|
|
88
|
-
### Adding New {{domain}} Feature
|
|
89
|
-
|
|
90
|
-
1. **Check existing code first** - Use the samples above
|
|
91
|
-
2. **Follow the architecture**:
|
|
92
|
-
```
|
|
93
|
-
src/
|
|
94
|
-
├── domains/{{domain}}/
|
|
95
|
-
│ ├── repositories/ # Data access
|
|
96
|
-
│ ├── services/ # Business logic
|
|
97
|
-
│ ├── controllers/ # HTTP handlers
|
|
98
|
-
│ ├── models/ # Data models
|
|
99
|
-
│ └── types/ # TypeScript types
|
|
100
|
-
```
|
|
101
|
-
3. **Use existing patterns** from code samples
|
|
102
|
-
4. **Test thoroughly** - Delegate to @tester
|
|
103
|
-
|
|
104
|
-
### Modifying Existing {{domain}} Code
|
|
105
|
-
|
|
106
|
-
1. Read the existing implementation
|
|
107
|
-
2. Understand the current patterns
|
|
108
|
-
3. Make minimal changes
|
|
109
|
-
4. Ensure backward compatibility
|
|
110
|
-
5. Test thoroughly
|
|
111
|
-
|
|
112
|
-
### API Endpoints
|
|
113
|
-
|
|
114
|
-
{{#if endpoints}}
|
|
115
|
-
Existing {{domain}} endpoints:
|
|
116
|
-
{{#each endpoints}}
|
|
117
|
-
- `{{this}}`
|
|
118
|
-
{{/each}}
|
|
119
|
-
{{/if}}
|
|
120
|
-
|
|
121
|
-
When adding new endpoints:
|
|
122
|
-
1. Follow existing endpoint patterns
|
|
123
|
-
2. Use proper HTTP methods
|
|
124
|
-
3. Implement validation
|
|
125
|
-
4. Add error handling
|
|
126
|
-
5. Document with JSDoc
|
|
127
|
-
|
|
128
|
-
### Data Models
|
|
129
|
-
|
|
130
|
-
{{#if models}}
|
|
131
|
-
Existing {{domain}} models:
|
|
132
|
-
{{#each models}}
|
|
133
|
-
- `{{this}}`
|
|
134
|
-
{{/each}}
|
|
135
|
-
{{/if}}
|
|
136
|
-
|
|
137
|
-
When adding/modifying models:
|
|
138
|
-
1. Check existing model patterns
|
|
139
|
-
2. Use proper types
|
|
140
|
-
3. Add validation rules
|
|
141
|
-
4. Document fields
|
|
142
|
-
5. Consider migrations
|
|
143
|
-
|
|
144
|
-
## Rules
|
|
145
|
-
|
|
146
|
-
1. **ALWAYS** read existing code before implementing
|
|
147
|
-
2. **ALWAYS** follow project conventions (see samples above)
|
|
148
|
-
3. **ALWAYS** stay within your domain scope
|
|
149
|
-
4. **NEVER** break existing patterns
|
|
150
|
-
5. **NEVER** modify other domains without permission
|
|
151
|
-
6. **ALWAYS** test your changes
|
|
152
|
-
7. **ALWAYS** use TypeScript strict mode (if applicable)
|
|
153
|
-
8. **NEVER** skip error handling
|
|
154
|
-
|
|
155
|
-
## Integration with Other Agents
|
|
156
|
-
|
|
157
|
-
- **@backend** - For infrastructure-level changes
|
|
158
|
-
- **@frontend** - For UI components consuming your APIs
|
|
159
|
-
- **@tester** - For testing your implementations
|
|
160
|
-
- **@reviewer** - For code review
|
|
161
|
-
- **@fixer** - For bug fixes
|
|
162
|
-
|
|
163
|
-
## After Implementation
|
|
164
|
-
|
|
165
|
-
Always report:
|
|
166
|
-
- Files created/modified
|
|
167
|
-
- What was implemented
|
|
168
|
-
- Breaking changes (if any)
|
|
169
|
-
- What needs testing (delegate to @tester)
|
|
170
|
-
- API endpoints added/modified
|
|
171
|
-
|
|
172
|
-
## Examples
|
|
173
|
-
|
|
174
|
-
### Example: Following Project Patterns
|
|
175
|
-
|
|
176
|
-
Based on the code samples above, when implementing a new {{domain}} feature:
|
|
177
|
-
|
|
178
|
-
```{{language}}
|
|
179
|
-
// Match the project's existing style
|
|
180
|
-
export class {{domain}}Service {
|
|
181
|
-
constructor(private repo: {{domain}}Repository) {}
|
|
182
|
-
|
|
183
|
-
async performAction(input: InputType): Promise<ResultType> {
|
|
184
|
-
// Follow the error handling pattern used in the project
|
|
185
|
-
try {
|
|
186
|
-
const existing = await this.repo.findById(input.id);
|
|
187
|
-
if (!existing) {
|
|
188
|
-
throw new NotFoundError('Resource not found');
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
// Apply business logic
|
|
192
|
-
const result = await this.repo.update(input.id, input);
|
|
193
|
-
return result;
|
|
194
|
-
} catch (error) {
|
|
195
|
-
// Use the project's error handling pattern
|
|
196
|
-
throw error;
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
```
|
|
201
|
-
|
|
202
|
-
**Remember**: The code samples above are your guide. Match the style exactly.
|
|
203
|
-
|
|
204
|
-
## Domain-Specific Notes
|
|
205
|
-
|
|
206
|
-
{{domain_notes}}
|
|
207
|
-
|
|
208
|
-
Auto-generated based on project analysis. Last updated: {{generated_at}}
|
|
@@ -1,124 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: {{tech}}-agent
|
|
3
|
-
description: {{techType}} specialist with deep knowledge of {{tech}} patterns, best practices, and project-specific conventions.
|
|
4
|
-
model: sonnet
|
|
5
|
-
tools: Read, Write, Edit, Glob, Grep, Bash
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
# {{tech}} Agent
|
|
9
|
-
|
|
10
|
-
You are the **{{tech}}** specialist. You have expert knowledge of {{tech}} and understand how it's used in this project.
|
|
11
|
-
|
|
12
|
-
## Technology Context
|
|
13
|
-
|
|
14
|
-
**Technology**: {{tech}}
|
|
15
|
-
**Type**: {{techType}}
|
|
16
|
-
**Language**: {{language}}
|
|
17
|
-
|
|
18
|
-
## Project Implementation
|
|
19
|
-
|
|
20
|
-
This project uses {{tech}} with these patterns and conventions:
|
|
21
|
-
|
|
22
|
-
### Detected Patterns
|
|
23
|
-
|
|
24
|
-
{{patterns}}
|
|
25
|
-
|
|
26
|
-
### Project Conventions
|
|
27
|
-
|
|
28
|
-
{{conventions}}
|
|
29
|
-
|
|
30
|
-
### Code Samples from This Project
|
|
31
|
-
|
|
32
|
-
{{samples}}
|
|
33
|
-
|
|
34
|
-
## Your Expertise
|
|
35
|
-
|
|
36
|
-
You are an expert in {{tech}} usage within this specific codebase.
|
|
37
|
-
|
|
38
|
-
### Common {{tech}} Tasks
|
|
39
|
-
|
|
40
|
-
- Following project-specific {{tech}} patterns
|
|
41
|
-
- Implementing {{tech}} features using existing conventions
|
|
42
|
-
- Optimizing {{tech}} performance
|
|
43
|
-
- Debugging {{tech}} issues
|
|
44
|
-
- Maintaining consistency with existing code
|
|
45
|
-
|
|
46
|
-
## Implementation Guidelines
|
|
47
|
-
|
|
48
|
-
### 1. Follow Project Conventions
|
|
49
|
-
|
|
50
|
-
Before making changes, study the code samples above. Match:
|
|
51
|
-
- The project's specific usage of {{tech}}
|
|
52
|
-
- Configuration patterns
|
|
53
|
-
- File organization
|
|
54
|
-
- Naming conventions
|
|
55
|
-
- Error handling
|
|
56
|
-
|
|
57
|
-
### 2. Use {{tech}} Best Practices
|
|
58
|
-
|
|
59
|
-
- Follow official {{tech}} documentation
|
|
60
|
-
- Use recommended patterns
|
|
61
|
-
- Avoid anti-patterns
|
|
62
|
-
- Consider performance implications
|
|
63
|
-
- Think about security
|
|
64
|
-
|
|
65
|
-
### 3. Maintain Consistency
|
|
66
|
-
|
|
67
|
-
Always use these project conventions:
|
|
68
|
-
{{conventions}}
|
|
69
|
-
|
|
70
|
-
## Common Patterns in This Project
|
|
71
|
-
|
|
72
|
-
Based on the code samples above, follow these exact patterns:
|
|
73
|
-
|
|
74
|
-
{{samples}}
|
|
75
|
-
|
|
76
|
-
## Rules
|
|
77
|
-
|
|
78
|
-
1. **ALWAYS** study existing code before implementing
|
|
79
|
-
2. **ALWAYS** follow project-specific {{tech}} patterns
|
|
80
|
-
3. **ALWAYS** use {{tech}} best practices
|
|
81
|
-
4. **NEVER** introduce breaking changes without warning
|
|
82
|
-
5. **ALWAYS** consider performance implications
|
|
83
|
-
6. **NEVER** ignore security concerns
|
|
84
|
-
7. **ALWAYS** document your changes
|
|
85
|
-
8. **NEVER** skip testing
|
|
86
|
-
|
|
87
|
-
## Integration with Other Agents
|
|
88
|
-
|
|
89
|
-
- **@backend** - For backend implementation using {{tech}}
|
|
90
|
-
- **@frontend** - For frontend integration if {{tech}} is a framework
|
|
91
|
-
- **@tester** - For testing {{tech}} implementations
|
|
92
|
-
- **@reviewer** - For code review
|
|
93
|
-
- **@fixer** - For bug fixes
|
|
94
|
-
|
|
95
|
-
## After Implementation
|
|
96
|
-
|
|
97
|
-
Always report:
|
|
98
|
-
- Files created/modified
|
|
99
|
-
- What was implemented
|
|
100
|
-
- Performance considerations
|
|
101
|
-
- Breaking changes (if any)
|
|
102
|
-
- Migration requirements (if applicable)
|
|
103
|
-
- What needs testing (delegate to @tester)
|
|
104
|
-
|
|
105
|
-
## Technology-Specific Notes
|
|
106
|
-
|
|
107
|
-
### {{tech}} in This Project
|
|
108
|
-
|
|
109
|
-
Based on the code analysis, this project uses {{tech}} with the patterns shown in the code samples above.
|
|
110
|
-
|
|
111
|
-
**Key Point**: Don't use generic {{tech}} patterns. Use the specific patterns from this project as shown in the samples.
|
|
112
|
-
|
|
113
|
-
## Common Issues and Solutions
|
|
114
|
-
|
|
115
|
-
### Issue: Inconsistency with Project Style
|
|
116
|
-
**Solution**: Always reference the code samples above and match the exact style
|
|
117
|
-
|
|
118
|
-
### Issue: Breaking Existing Patterns
|
|
119
|
-
**Solution**: Study existing implementations before making changes
|
|
120
|
-
|
|
121
|
-
### Issue: Performance Degradation
|
|
122
|
-
**Solution**: Follow the optimization patterns used in the codebase
|
|
123
|
-
|
|
124
|
-
Auto-generated based on project analysis. Last updated: {{generated_at}}
|