didev 1.0.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/README.md +378 -0
- package/dist/agents/analyst.d.ts +21 -0
- package/dist/agents/analyst.d.ts.map +1 -0
- package/dist/agents/analyst.js +69 -0
- package/dist/agents/analyst.js.map +1 -0
- package/dist/agents/architect.d.ts +21 -0
- package/dist/agents/architect.d.ts.map +1 -0
- package/dist/agents/architect.js +85 -0
- package/dist/agents/architect.js.map +1 -0
- package/dist/agents/base-agent.d.ts +56 -0
- package/dist/agents/base-agent.d.ts.map +1 -0
- package/dist/agents/base-agent.js +263 -0
- package/dist/agents/base-agent.js.map +1 -0
- package/dist/agents/developer.d.ts +21 -0
- package/dist/agents/developer.d.ts.map +1 -0
- package/dist/agents/developer.js +87 -0
- package/dist/agents/developer.js.map +1 -0
- package/dist/agents/orchestrator.d.ts +23 -0
- package/dist/agents/orchestrator.d.ts.map +1 -0
- package/dist/agents/orchestrator.js +287 -0
- package/dist/agents/orchestrator.js.map +1 -0
- package/dist/agents/reviewer.d.ts +15 -0
- package/dist/agents/reviewer.d.ts.map +1 -0
- package/dist/agents/reviewer.js +65 -0
- package/dist/agents/reviewer.js.map +1 -0
- package/dist/agents/tester.d.ts +15 -0
- package/dist/agents/tester.d.ts.map +1 -0
- package/dist/agents/tester.js +64 -0
- package/dist/agents/tester.js.map +1 -0
- package/dist/bmad/method.d.ts +6 -0
- package/dist/bmad/method.d.ts.map +1 -0
- package/dist/bmad/method.js +221 -0
- package/dist/bmad/method.js.map +1 -0
- package/dist/cli/commands/agent.d.ts +10 -0
- package/dist/cli/commands/agent.d.ts.map +1 -0
- package/dist/cli/commands/agent.js +28 -0
- package/dist/cli/commands/agent.js.map +1 -0
- package/dist/cli/commands/chat.d.ts +6 -0
- package/dist/cli/commands/chat.d.ts.map +1 -0
- package/dist/cli/commands/chat.js +556 -0
- package/dist/cli/commands/chat.js.map +1 -0
- package/dist/cli/commands/config.d.ts +3 -0
- package/dist/cli/commands/config.d.ts.map +1 -0
- package/dist/cli/commands/config.js +65 -0
- package/dist/cli/commands/config.js.map +1 -0
- package/dist/cli/commands/init.d.ts +8 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +204 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/mcp.d.ts +5 -0
- package/dist/cli/commands/mcp.d.ts.map +1 -0
- package/dist/cli/commands/mcp.js +836 -0
- package/dist/cli/commands/mcp.js.map +1 -0
- package/dist/cli/commands/refactor.d.ts +8 -0
- package/dist/cli/commands/refactor.d.ts.map +1 -0
- package/dist/cli/commands/refactor.js +161 -0
- package/dist/cli/commands/refactor.js.map +1 -0
- package/dist/cli/commands/review.d.ts +9 -0
- package/dist/cli/commands/review.d.ts.map +1 -0
- package/dist/cli/commands/review.js +138 -0
- package/dist/cli/commands/review.js.map +1 -0
- package/dist/core/api.d.ts +73 -0
- package/dist/core/api.d.ts.map +1 -0
- package/dist/core/api.js +206 -0
- package/dist/core/api.js.map +1 -0
- package/dist/core/config.d.ts +42 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +180 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/context.d.ts +33 -0
- package/dist/core/context.d.ts.map +1 -0
- package/dist/core/context.js +235 -0
- package/dist/core/context.js.map +1 -0
- package/dist/core/file-manager.d.ts +20 -0
- package/dist/core/file-manager.d.ts.map +1 -0
- package/dist/core/file-manager.js +133 -0
- package/dist/core/file-manager.js.map +1 -0
- package/dist/core/mcp.d.ts +31 -0
- package/dist/core/mcp.d.ts.map +1 -0
- package/dist/core/mcp.js +112 -0
- package/dist/core/mcp.js.map +1 -0
- package/dist/core/session.d.ts +16 -0
- package/dist/core/session.d.ts.map +1 -0
- package/dist/core/session.js +60 -0
- package/dist/core/session.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +237 -0
- package/dist/index.js.map +1 -0
- package/dist/utils/banner.d.ts +2 -0
- package/dist/utils/banner.d.ts.map +1 -0
- package/dist/utils/banner.js +50 -0
- package/dist/utils/banner.js.map +1 -0
- package/dist/utils/git.d.ts +9 -0
- package/dist/utils/git.d.ts.map +1 -0
- package/dist/utils/git.js +49 -0
- package/dist/utils/git.js.map +1 -0
- package/dist/utils/logger.d.ts +42 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +98 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/resilience.d.ts +17 -0
- package/dist/utils/resilience.d.ts.map +1 -0
- package/dist/utils/resilience.js +41 -0
- package/dist/utils/resilience.js.map +1 -0
- package/dist/utils/token-counter.d.ts +7 -0
- package/dist/utils/token-counter.d.ts.map +1 -0
- package/dist/utils/token-counter.js +20 -0
- package/dist/utils/token-counter.js.map +1 -0
- package/package.json +62 -0
- package/scripts/postinstall.mjs +54 -0
- package/scripts/setup-path.sh +42 -0
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import boxen from 'boxen';
|
|
3
|
+
import inquirer from 'inquirer';
|
|
4
|
+
import { logger } from '../utils/logger.js';
|
|
5
|
+
import { collectProjectContext } from '../core/context.js';
|
|
6
|
+
import { loadConfig, getApiKey } from '../core/config.js';
|
|
7
|
+
import { initClient } from '../core/api.js';
|
|
8
|
+
import { AnalystAgent, FrontendAnalystAgent, BackendAnalystAgent } from './analyst.js';
|
|
9
|
+
import { ArchitectAgent, FrontendArchitectAgent, BackendArchitectAgent } from './architect.js';
|
|
10
|
+
import { DeveloperAgent, FrontendDeveloperAgent, BackendDeveloperAgent } from './developer.js';
|
|
11
|
+
import { ReviewerAgent, SecurityAuditorAgent } from './reviewer.js';
|
|
12
|
+
import { TesterAgent } from './tester.js';
|
|
13
|
+
import { initMcp } from '../core/mcp.js';
|
|
14
|
+
import { readProjectFile, writeProjectFile, renderDiff } from '../core/file-manager.js';
|
|
15
|
+
function buildPipeline(family, projectCtx, mode) {
|
|
16
|
+
const resolvedFamily = family === 'auto'
|
|
17
|
+
? (projectCtx.type === 'frontend' ? 'frontend'
|
|
18
|
+
: projectCtx.type === 'backend' ? 'backend'
|
|
19
|
+
: 'fullstack')
|
|
20
|
+
: family;
|
|
21
|
+
if (mode === 'developer-only') {
|
|
22
|
+
if (resolvedFamily === 'frontend')
|
|
23
|
+
return [new FrontendDeveloperAgent()];
|
|
24
|
+
if (resolvedFamily === 'backend')
|
|
25
|
+
return [new BackendDeveloperAgent()];
|
|
26
|
+
return [new DeveloperAgent()];
|
|
27
|
+
}
|
|
28
|
+
if (mode === 'light') {
|
|
29
|
+
if (resolvedFamily === 'frontend') {
|
|
30
|
+
return [new FrontendAnalystAgent(), new FrontendDeveloperAgent(), new ReviewerAgent()];
|
|
31
|
+
}
|
|
32
|
+
if (resolvedFamily === 'backend') {
|
|
33
|
+
return [new BackendAnalystAgent(), new BackendDeveloperAgent(), new ReviewerAgent()];
|
|
34
|
+
}
|
|
35
|
+
return [new AnalystAgent(), new DeveloperAgent(), new ReviewerAgent()];
|
|
36
|
+
}
|
|
37
|
+
// Full pipeline — review-phase agents run in parallel (they only read, not depend on each other)
|
|
38
|
+
if (resolvedFamily === 'frontend') {
|
|
39
|
+
return [
|
|
40
|
+
new FrontendAnalystAgent(),
|
|
41
|
+
new FrontendArchitectAgent(),
|
|
42
|
+
new FrontendDeveloperAgent(),
|
|
43
|
+
[new ReviewerAgent(), new TesterAgent()],
|
|
44
|
+
];
|
|
45
|
+
}
|
|
46
|
+
if (resolvedFamily === 'backend') {
|
|
47
|
+
return [
|
|
48
|
+
new BackendAnalystAgent(),
|
|
49
|
+
new BackendArchitectAgent(),
|
|
50
|
+
new BackendDeveloperAgent(),
|
|
51
|
+
[new SecurityAuditorAgent(), new ReviewerAgent(), new TesterAgent()],
|
|
52
|
+
];
|
|
53
|
+
}
|
|
54
|
+
// Fullstack
|
|
55
|
+
return [
|
|
56
|
+
new AnalystAgent(),
|
|
57
|
+
new ArchitectAgent(),
|
|
58
|
+
new DeveloperAgent(),
|
|
59
|
+
[new ReviewerAgent(), new TesterAgent()],
|
|
60
|
+
];
|
|
61
|
+
}
|
|
62
|
+
function pipelineAgents(steps) {
|
|
63
|
+
return steps.flatMap(s => Array.isArray(s) ? s : [s]);
|
|
64
|
+
}
|
|
65
|
+
function filterPipeline(steps, skip) {
|
|
66
|
+
return steps
|
|
67
|
+
.map(step => {
|
|
68
|
+
if (Array.isArray(step)) {
|
|
69
|
+
const filtered = step.filter(a => !skip.includes(a.name));
|
|
70
|
+
return filtered.length > 0 ? filtered : null;
|
|
71
|
+
}
|
|
72
|
+
return skip.includes(step.name) ? null : step;
|
|
73
|
+
})
|
|
74
|
+
.filter((s) => s !== null);
|
|
75
|
+
}
|
|
76
|
+
function formatPipelineLabel(steps) {
|
|
77
|
+
return steps
|
|
78
|
+
.map(step => Array.isArray(step)
|
|
79
|
+
? step.map(a => `${a.emoji} ${a.name}`).join(' + ')
|
|
80
|
+
: `${step.emoji} ${step.name}`)
|
|
81
|
+
.join(' → ');
|
|
82
|
+
}
|
|
83
|
+
export async function runOrchestration(options) {
|
|
84
|
+
const start = Date.now();
|
|
85
|
+
const rootDir = options.rootDir ?? process.cwd();
|
|
86
|
+
const config = await loadConfig(rootDir);
|
|
87
|
+
const apiKey = await getApiKey(config);
|
|
88
|
+
if (!apiKey) {
|
|
89
|
+
logger.error('DEEPSEEK_API_KEY not set. Run: didev config set DEEPSEEK_API_KEY=sk-xxx');
|
|
90
|
+
process.exit(1);
|
|
91
|
+
}
|
|
92
|
+
const client = initClient({
|
|
93
|
+
apiKey,
|
|
94
|
+
baseUrl: config.api.baseUrl,
|
|
95
|
+
model: options.model ?? config.api.model,
|
|
96
|
+
maxTokens: config.api.maxTokens,
|
|
97
|
+
temperature: config.api.temperature,
|
|
98
|
+
});
|
|
99
|
+
const model = options.model ?? config.api.model;
|
|
100
|
+
const projectCtx = await collectProjectContext(rootDir);
|
|
101
|
+
// Connect MCP servers before agents start — shared via singleton McpManager
|
|
102
|
+
const mcp = await initMcp(config.mcp?.servers ?? []);
|
|
103
|
+
if (mcp.tools.length > 0) {
|
|
104
|
+
logger.success(`MCP: ${mcp.tools.length} tool(s) available to agents`);
|
|
105
|
+
}
|
|
106
|
+
const mode = options.mode ?? config.agents.family ?? 'full';
|
|
107
|
+
const family = options.family ?? 'auto';
|
|
108
|
+
const pipeline = buildPipeline(family, projectCtx, mode);
|
|
109
|
+
const filteredPipeline = options.skipAgents
|
|
110
|
+
? filterPipeline(pipeline, options.skipAgents)
|
|
111
|
+
: pipeline;
|
|
112
|
+
// Display orchestration plan
|
|
113
|
+
logger.newline();
|
|
114
|
+
console.log(boxen(chalk.bold.cyan('🚀 didev agent') + '\n\n' +
|
|
115
|
+
chalk.white(`Task: ${options.task}`) + '\n\n' +
|
|
116
|
+
chalk.gray(`Pipeline: ${formatPipelineLabel(filteredPipeline)}`), { padding: 1, borderColor: 'cyan', borderStyle: 'double' }));
|
|
117
|
+
logger.newline();
|
|
118
|
+
const agentResults = [];
|
|
119
|
+
const allFileChanges = new Map();
|
|
120
|
+
// confirmWrites defaults to true — always ask before touching the filesystem
|
|
121
|
+
const confirmWrites = options.confirmWrites !== false;
|
|
122
|
+
const agentOptions = {
|
|
123
|
+
client,
|
|
124
|
+
model,
|
|
125
|
+
projectContext: projectCtx,
|
|
126
|
+
rootDir,
|
|
127
|
+
task: options.task,
|
|
128
|
+
dryRun: confirmWrites,
|
|
129
|
+
};
|
|
130
|
+
function trackFileChanges(fileChanges) {
|
|
131
|
+
for (const fc of fileChanges) {
|
|
132
|
+
allFileChanges.set(fc.path, allFileChanges.has(fc.path) ? 'modified' : 'created');
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
// Collect all pending writes across all agents (dry-run mode)
|
|
136
|
+
const allPendingWrites = new Map();
|
|
137
|
+
for (const step of filteredPipeline) {
|
|
138
|
+
const snapshot = agentResults.length > 0 ? [...agentResults] : undefined;
|
|
139
|
+
if (Array.isArray(step)) {
|
|
140
|
+
// Parallel stage — all agents get the same snapshot of previous results
|
|
141
|
+
const settled = await Promise.allSettled(step.map(agent => agent.run({ ...agentOptions, previousResults: snapshot })));
|
|
142
|
+
for (const outcome of settled) {
|
|
143
|
+
if (outcome.status === 'fulfilled') {
|
|
144
|
+
agentResults.push(outcome.value);
|
|
145
|
+
trackFileChanges(outcome.value.fileChanges);
|
|
146
|
+
// Collect pending writes from dry-run agents
|
|
147
|
+
for (const [path, entry] of outcome.value.pendingWrites) {
|
|
148
|
+
allPendingWrites.set(path, entry);
|
|
149
|
+
}
|
|
150
|
+
logger.dim(` Готово за ${(outcome.value.duration / 1000).toFixed(1)}s`);
|
|
151
|
+
}
|
|
152
|
+
else {
|
|
153
|
+
logger.error(`Агент завершился с ошибкой: ${outcome.reason.message}`);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
logger.newline();
|
|
157
|
+
}
|
|
158
|
+
else {
|
|
159
|
+
// Sequential step
|
|
160
|
+
try {
|
|
161
|
+
const result = await step.run({ ...agentOptions, previousResults: snapshot });
|
|
162
|
+
agentResults.push(result);
|
|
163
|
+
trackFileChanges(result.fileChanges);
|
|
164
|
+
for (const [path, entry] of result.pendingWrites) {
|
|
165
|
+
allPendingWrites.set(path, entry);
|
|
166
|
+
}
|
|
167
|
+
logger.dim(` Готово за ${(result.duration / 1000).toFixed(1)}s`);
|
|
168
|
+
logger.newline();
|
|
169
|
+
}
|
|
170
|
+
catch (e) {
|
|
171
|
+
logger.error(`Агент ${step.name} завершился с ошибкой: ${e.message}`);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
// ── Preview & confirm file writes ────────────────────────────────────────
|
|
176
|
+
if (confirmWrites && allPendingWrites.size > 0) {
|
|
177
|
+
await confirmAndApplyWrites(allPendingWrites, rootDir, allFileChanges);
|
|
178
|
+
}
|
|
179
|
+
const filesCreated = [...allFileChanges.entries()].filter(([, v]) => v === 'created').map(([k]) => k);
|
|
180
|
+
const filesModified = [...allFileChanges.entries()].filter(([, v]) => v === 'modified').map(([k]) => k);
|
|
181
|
+
const summary = buildSummary(options.task, agentResults, filesCreated, filesModified);
|
|
182
|
+
// Display final summary
|
|
183
|
+
displayFinalSummary(options.task, agentResults, filesCreated, filesModified, Date.now() - start);
|
|
184
|
+
return {
|
|
185
|
+
task: options.task,
|
|
186
|
+
agentResults,
|
|
187
|
+
totalDuration: Date.now() - start,
|
|
188
|
+
filesCreated,
|
|
189
|
+
filesModified,
|
|
190
|
+
summary,
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
async function confirmAndApplyWrites(pendingWrites, rootDir, allFileChanges) {
|
|
194
|
+
logger.newline();
|
|
195
|
+
const lines = [
|
|
196
|
+
chalk.bold.yellow('📝 Агенты подготовили изменения'),
|
|
197
|
+
'',
|
|
198
|
+
chalk.gray(`Файлов к записи: ${pendingWrites.size}`),
|
|
199
|
+
'',
|
|
200
|
+
];
|
|
201
|
+
for (const [path, { description }] of pendingWrites) {
|
|
202
|
+
const exists = await readProjectFile(path, rootDir).then(() => true).catch(() => false);
|
|
203
|
+
const tag = exists ? chalk.yellow('~') : chalk.green('+');
|
|
204
|
+
const label = exists ? 'изменение' : 'новый файл';
|
|
205
|
+
lines.push(` ${tag} ${chalk.white(path)} ${chalk.gray(description ?? label)}`);
|
|
206
|
+
}
|
|
207
|
+
console.log(boxen(lines.join('\n'), { padding: 1, borderColor: 'yellow', borderStyle: 'round' }));
|
|
208
|
+
logger.newline();
|
|
209
|
+
// Show full diffs per file
|
|
210
|
+
const { showDiffs } = await inquirer.prompt([{
|
|
211
|
+
type: 'confirm',
|
|
212
|
+
name: 'showDiffs',
|
|
213
|
+
message: 'Показать diff изменений перед применением?',
|
|
214
|
+
default: true,
|
|
215
|
+
}]);
|
|
216
|
+
if (showDiffs) {
|
|
217
|
+
for (const [path, { content }] of pendingWrites) {
|
|
218
|
+
const original = await readProjectFile(path, rootDir).catch(() => '');
|
|
219
|
+
logger.newline();
|
|
220
|
+
logger.bold(`── ${path} ──`);
|
|
221
|
+
console.log(renderDiff(path, original, content));
|
|
222
|
+
}
|
|
223
|
+
logger.newline();
|
|
224
|
+
}
|
|
225
|
+
const { apply } = await inquirer.prompt([{
|
|
226
|
+
type: 'confirm',
|
|
227
|
+
name: 'apply',
|
|
228
|
+
message: `Применить ${pendingWrites.size} файл(ов)?`,
|
|
229
|
+
default: true,
|
|
230
|
+
}]);
|
|
231
|
+
if (apply) {
|
|
232
|
+
for (const [path, { content }] of pendingWrites) {
|
|
233
|
+
const existed = await readProjectFile(path, rootDir).then(() => true).catch(() => false);
|
|
234
|
+
await writeProjectFile(path, content, rootDir);
|
|
235
|
+
allFileChanges.set(path, existed ? 'modified' : 'created');
|
|
236
|
+
logger.success(`Записан: ${path}`);
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
else {
|
|
240
|
+
logger.info('Изменения отклонены — файлы не тронуты');
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
function buildSummary(task, results, filesCreated, filesModified) {
|
|
244
|
+
const lines = [`# Task: ${task}`, ''];
|
|
245
|
+
for (const r of results) {
|
|
246
|
+
lines.push(`## ${r.emoji ?? ''} ${r.agentName}`);
|
|
247
|
+
lines.push(r.output.slice(0, 10_000));
|
|
248
|
+
lines.push('');
|
|
249
|
+
}
|
|
250
|
+
if (filesCreated.length > 0) {
|
|
251
|
+
lines.push(`## Files Created\n${filesCreated.map(f => `- ${f}`).join('\n')}`);
|
|
252
|
+
}
|
|
253
|
+
if (filesModified.length > 0) {
|
|
254
|
+
lines.push(`\n## Files Modified\n${filesModified.map(f => `- ${f}`).join('\n')}`);
|
|
255
|
+
}
|
|
256
|
+
return lines.join('\n');
|
|
257
|
+
}
|
|
258
|
+
function displayFinalSummary(task, results, filesCreated, filesModified, durationMs) {
|
|
259
|
+
logger.newline();
|
|
260
|
+
const lines = [
|
|
261
|
+
chalk.bold.green('✅ Task Complete'),
|
|
262
|
+
'',
|
|
263
|
+
chalk.gray(`Task: ${task}`),
|
|
264
|
+
'',
|
|
265
|
+
];
|
|
266
|
+
for (const r of results) {
|
|
267
|
+
lines.push(` ${chalk.green('✓')} ${r.emoji ?? ''} ${chalk.bold(r.agentName)} — ${chalk.gray((r.duration / 1000).toFixed(1) + 's')}`);
|
|
268
|
+
}
|
|
269
|
+
if (filesCreated.length > 0) {
|
|
270
|
+
lines.push('');
|
|
271
|
+
lines.push(chalk.bold('Files created:'));
|
|
272
|
+
filesCreated.forEach(f => lines.push(` ${chalk.green('+')} ${f}`));
|
|
273
|
+
}
|
|
274
|
+
if (filesModified.length > 0) {
|
|
275
|
+
lines.push('');
|
|
276
|
+
lines.push(chalk.bold('Files modified:'));
|
|
277
|
+
filesModified.forEach(f => lines.push(` ${chalk.yellow('~')} ${f}`));
|
|
278
|
+
}
|
|
279
|
+
lines.push('');
|
|
280
|
+
lines.push(chalk.gray(`Total time: ${(durationMs / 1000).toFixed(1)}s`));
|
|
281
|
+
console.log(boxen(lines.join('\n'), {
|
|
282
|
+
padding: 1,
|
|
283
|
+
borderColor: 'green',
|
|
284
|
+
borderStyle: 'round',
|
|
285
|
+
}));
|
|
286
|
+
}
|
|
287
|
+
//# sourceMappingURL=orchestrator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../../src/agents/orchestrator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { BaseAgent } from './base-agent.js';
|
|
2
|
+
import type { ProjectContext } from '../core/context.js';
|
|
3
|
+
export declare class ReviewerAgent extends BaseAgent {
|
|
4
|
+
readonly name = "Reviewer";
|
|
5
|
+
readonly role = "Code Review & Quality";
|
|
6
|
+
readonly emoji = "\uD83D\uDD0D";
|
|
7
|
+
protected buildSystemPrompt(ctx: ProjectContext): string;
|
|
8
|
+
}
|
|
9
|
+
export declare class SecurityAuditorAgent extends BaseAgent {
|
|
10
|
+
readonly name = "Security Auditor";
|
|
11
|
+
readonly role = "Security Analysis";
|
|
12
|
+
readonly emoji = "\uD83D\uDD12";
|
|
13
|
+
protected buildSystemPrompt(ctx: ProjectContext): string;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=reviewer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reviewer.d.ts","sourceRoot":"","sources":["../../src/agents/reviewer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAGzD,qBAAa,aAAc,SAAQ,SAAS;IAC1C,QAAQ,CAAC,IAAI,cAAc;IAC3B,QAAQ,CAAC,IAAI,2BAA2B;IACxC,QAAQ,CAAC,KAAK,kBAAQ;IAEtB,SAAS,CAAC,iBAAiB,CAAC,GAAG,EAAE,cAAc,GAAG,MAAM;CA8BzD;AAED,qBAAa,oBAAqB,SAAQ,SAAS;IACjD,QAAQ,CAAC,IAAI,sBAAsB;IACnC,QAAQ,CAAC,IAAI,uBAAuB;IACpC,QAAQ,CAAC,KAAK,kBAAQ;IAEtB,SAAS,CAAC,iBAAiB,CAAC,GAAG,EAAE,cAAc,GAAG,MAAM;CAsBzD"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { BaseAgent } from './base-agent.js';
|
|
2
|
+
import { contextToSystemPrompt } from '../core/context.js';
|
|
3
|
+
export class ReviewerAgent extends BaseAgent {
|
|
4
|
+
name = 'Reviewer';
|
|
5
|
+
role = 'Code Review & Quality';
|
|
6
|
+
emoji = '🔍';
|
|
7
|
+
buildSystemPrompt(ctx) {
|
|
8
|
+
return `You are a senior Code Reviewer with expertise in ${ctx.language} and ${ctx.framework}.
|
|
9
|
+
|
|
10
|
+
${contextToSystemPrompt(ctx)}
|
|
11
|
+
|
|
12
|
+
Your responsibilities:
|
|
13
|
+
1. Review all files created/modified by the developer
|
|
14
|
+
2. Check for code quality issues
|
|
15
|
+
3. Identify security vulnerabilities
|
|
16
|
+
4. Spot performance problems
|
|
17
|
+
5. Ensure proper error handling
|
|
18
|
+
6. Check test coverage needs
|
|
19
|
+
7. Verify TypeScript types are correct
|
|
20
|
+
|
|
21
|
+
Review categories:
|
|
22
|
+
- **Code Quality**: Readability, naming, DRY, SOLID
|
|
23
|
+
- **Security**: Input validation, XSS, SQL injection, auth checks
|
|
24
|
+
- **Performance**: Unnecessary re-renders, N+1 queries, memory leaks
|
|
25
|
+
- **Error Handling**: Uncaught exceptions, missing validation
|
|
26
|
+
- **Types**: Missing types, unsafe casts
|
|
27
|
+
- **Architecture**: Coupling, cohesion, separation of concerns
|
|
28
|
+
|
|
29
|
+
Output:
|
|
30
|
+
- Summary verdict (✅ Ready / ⚠️ Minor issues / ❌ Critical issues)
|
|
31
|
+
- List of issues by severity (critical/warning/suggestion)
|
|
32
|
+
- If you find critical issues, use write_file to fix them
|
|
33
|
+
- List of fixes applied
|
|
34
|
+
|
|
35
|
+
Be thorough but fair. Focus on real bugs, not style preferences.`;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
export class SecurityAuditorAgent extends BaseAgent {
|
|
39
|
+
name = 'Security Auditor';
|
|
40
|
+
role = 'Security Analysis';
|
|
41
|
+
emoji = '🔒';
|
|
42
|
+
buildSystemPrompt(ctx) {
|
|
43
|
+
return `You are a Security Engineer performing a security audit.
|
|
44
|
+
|
|
45
|
+
${contextToSystemPrompt(ctx)}
|
|
46
|
+
|
|
47
|
+
Focus areas:
|
|
48
|
+
- Injection vulnerabilities (SQL, NoSQL, Command, XSS)
|
|
49
|
+
- Authentication and authorization flaws
|
|
50
|
+
- Sensitive data exposure (keys, tokens in code/logs)
|
|
51
|
+
- Missing input validation
|
|
52
|
+
- Insecure dependencies
|
|
53
|
+
- CSRF vulnerabilities
|
|
54
|
+
- Rate limiting absence
|
|
55
|
+
- Cryptography issues
|
|
56
|
+
|
|
57
|
+
Output format:
|
|
58
|
+
- Severity: CRITICAL / HIGH / MEDIUM / LOW / INFO
|
|
59
|
+
- CVE/OWASP reference if applicable
|
|
60
|
+
- Code snippet showing the issue
|
|
61
|
+
- Recommended fix
|
|
62
|
+
- Apply fixes via write_file for critical/high issues`;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=reviewer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reviewer.js","sourceRoot":"","sources":["../../src/agents/reviewer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAE3D,MAAM,OAAO,aAAc,SAAQ,SAAS;IACjC,IAAI,GAAG,UAAU,CAAC;IAClB,IAAI,GAAG,uBAAuB,CAAC;IAC/B,KAAK,GAAG,IAAI,CAAC;IAEZ,iBAAiB,CAAC,GAAmB;QAC7C,OAAO,oDAAoD,GAAG,CAAC,QAAQ,QAAQ,GAAG,CAAC,SAAS;;EAE9F,qBAAqB,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;iEAyBqC,CAAC;IAChE,CAAC;CACF;AAED,MAAM,OAAO,oBAAqB,SAAQ,SAAS;IACxC,IAAI,GAAG,kBAAkB,CAAC;IAC1B,IAAI,GAAG,mBAAmB,CAAC;IAC3B,KAAK,GAAG,IAAI,CAAC;IAEZ,iBAAiB,CAAC,GAAmB;QAC7C,OAAO;;EAET,qBAAqB,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;sDAiB0B,CAAC;IACrD,CAAC;CACF"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { BaseAgent } from './base-agent.js';
|
|
2
|
+
import type { ProjectContext } from '../core/context.js';
|
|
3
|
+
export declare class TesterAgent extends BaseAgent {
|
|
4
|
+
readonly name = "Tester";
|
|
5
|
+
readonly role = "Test Writing";
|
|
6
|
+
readonly emoji = "\uD83E\uDDEA";
|
|
7
|
+
protected buildSystemPrompt(ctx: ProjectContext): string;
|
|
8
|
+
}
|
|
9
|
+
export declare class PerformanceAuditorAgent extends BaseAgent {
|
|
10
|
+
readonly name = "Performance Auditor";
|
|
11
|
+
readonly role = "Performance Analysis";
|
|
12
|
+
readonly emoji = "\u26A1";
|
|
13
|
+
protected buildSystemPrompt(ctx: ProjectContext): string;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=tester.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tester.d.ts","sourceRoot":"","sources":["../../src/agents/tester.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAGzD,qBAAa,WAAY,SAAQ,SAAS;IACxC,QAAQ,CAAC,IAAI,YAAY;IACzB,QAAQ,CAAC,IAAI,kBAAkB;IAC/B,QAAQ,CAAC,KAAK,kBAAQ;IAEtB,SAAS,CAAC,iBAAiB,CAAC,GAAG,EAAE,cAAc,GAAG,MAAM;CAiCzD;AAED,qBAAa,uBAAwB,SAAQ,SAAS;IACpD,QAAQ,CAAC,IAAI,yBAAyB;IACtC,QAAQ,CAAC,IAAI,0BAA0B;IACvC,QAAQ,CAAC,KAAK,YAAO;IAErB,SAAS,CAAC,iBAAiB,CAAC,GAAG,EAAE,cAAc,GAAG,MAAM;CAmBzD"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { BaseAgent } from './base-agent.js';
|
|
2
|
+
import { contextToSystemPrompt } from '../core/context.js';
|
|
3
|
+
export class TesterAgent extends BaseAgent {
|
|
4
|
+
name = 'Tester';
|
|
5
|
+
role = 'Test Writing';
|
|
6
|
+
emoji = '🧪';
|
|
7
|
+
buildSystemPrompt(ctx) {
|
|
8
|
+
const testFramework = ctx.dependencies.dev.includes('vitest') ? 'Vitest'
|
|
9
|
+
: ctx.dependencies.dev.includes('jest') ? 'Jest'
|
|
10
|
+
: ctx.dependencies.dev.includes('mocha') ? 'Mocha'
|
|
11
|
+
: 'the project\'s test framework';
|
|
12
|
+
return `You are an expert Test Engineer writing ${testFramework} tests for a ${ctx.language} ${ctx.type} project.
|
|
13
|
+
|
|
14
|
+
${contextToSystemPrompt(ctx)}
|
|
15
|
+
|
|
16
|
+
Your responsibilities:
|
|
17
|
+
1. Write unit tests for all new functions and components
|
|
18
|
+
2. Write integration tests for API endpoints
|
|
19
|
+
3. Write component tests for UI components
|
|
20
|
+
4. Aim for >80% code coverage
|
|
21
|
+
5. Test happy paths AND error cases
|
|
22
|
+
6. Test edge cases and boundary conditions
|
|
23
|
+
|
|
24
|
+
Testing strategy:
|
|
25
|
+
- Unit tests: Pure functions, utilities, hooks
|
|
26
|
+
- Component tests: UI behavior, user interactions, states
|
|
27
|
+
- Integration tests: API routes, database queries
|
|
28
|
+
|
|
29
|
+
Rules:
|
|
30
|
+
- Use write_file to create test files alongside implementation files
|
|
31
|
+
- Mock external dependencies (API calls, databases)
|
|
32
|
+
- Test file naming: *.test.ts or *.spec.ts
|
|
33
|
+
- Use describe/it blocks for clear structure
|
|
34
|
+
- Add meaningful test descriptions
|
|
35
|
+
- Read the implementation files before writing tests
|
|
36
|
+
|
|
37
|
+
Write tests that actually VALIDATE the implementation, not just check it runs.`;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
export class PerformanceAuditorAgent extends BaseAgent {
|
|
41
|
+
name = 'Performance Auditor';
|
|
42
|
+
role = 'Performance Analysis';
|
|
43
|
+
emoji = '⚡';
|
|
44
|
+
buildSystemPrompt(ctx) {
|
|
45
|
+
return `You are a Performance Engineer analyzing a ${ctx.type} ${ctx.framework} application.
|
|
46
|
+
|
|
47
|
+
${contextToSystemPrompt(ctx)}
|
|
48
|
+
|
|
49
|
+
Analysis areas:
|
|
50
|
+
- Bundle size and code splitting opportunities
|
|
51
|
+
- Re-render causes (React memo, useMemo, useCallback)
|
|
52
|
+
- Data fetching efficiency (N+1 queries, over-fetching)
|
|
53
|
+
- Memory leaks (event listeners, subscriptions)
|
|
54
|
+
- Database query optimization
|
|
55
|
+
- Caching opportunities
|
|
56
|
+
- Lazy loading candidates
|
|
57
|
+
|
|
58
|
+
Output:
|
|
59
|
+
- Performance issues found (severity: high/medium/low)
|
|
60
|
+
- Specific recommendations with code examples
|
|
61
|
+
- Apply critical optimizations via write_file`;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=tester.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tester.js","sourceRoot":"","sources":["../../src/agents/tester.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAE3D,MAAM,OAAO,WAAY,SAAQ,SAAS;IAC/B,IAAI,GAAG,QAAQ,CAAC;IAChB,IAAI,GAAG,cAAc,CAAC;IACtB,KAAK,GAAG,IAAI,CAAC;IAEZ,iBAAiB,CAAC,GAAmB;QAC7C,MAAM,aAAa,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ;YACtE,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM;gBAChD,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO;oBAClD,CAAC,CAAC,+BAA+B,CAAC;QAEpC,OAAO,2CAA2C,aAAa,gBAAgB,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,IAAI;;EAEzG,qBAAqB,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;+EAuBmD,CAAC;IAC9E,CAAC;CACF;AAED,MAAM,OAAO,uBAAwB,SAAQ,SAAS;IAC3C,IAAI,GAAG,qBAAqB,CAAC;IAC7B,IAAI,GAAG,sBAAsB,CAAC;IAC9B,KAAK,GAAG,GAAG,CAAC;IAEX,iBAAiB,CAAC,GAAmB;QAC7C,OAAO,8CAA8C,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,SAAS;;EAEhF,qBAAqB,CAAC,GAAG,CAAC;;;;;;;;;;;;;;8CAckB,CAAC;IAC7C,CAAC;CACF"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export declare function runBmadInit(rootDir?: string): Promise<void>;
|
|
2
|
+
export declare function runBmadEpic(rootDir?: string): Promise<void>;
|
|
3
|
+
export declare function runBmadStory(rootDir?: string): Promise<void>;
|
|
4
|
+
export declare function runBmadImplement(storyId?: string, rootDir?: string): Promise<void>;
|
|
5
|
+
export declare function runBmadReview(rootDir?: string): Promise<void>;
|
|
6
|
+
//# sourceMappingURL=method.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"method.d.ts","sourceRoot":"","sources":["../../src/bmad/method.ts"],"names":[],"mappings":"AAqDA,wBAAsB,WAAW,CAAC,OAAO,SAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAoBxE;AAED,wBAAsB,WAAW,CAAC,OAAO,SAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAoDxE;AAED,wBAAsB,YAAY,CAAC,OAAO,SAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAwFzE;AAED,wBAAsB,gBAAgB,CACpC,OAAO,CAAC,EAAE,MAAM,EAChB,OAAO,SAAgB,GACtB,OAAO,CAAC,IAAI,CAAC,CAsCf;AAED,wBAAsB,aAAa,CAAC,OAAO,SAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAG1E"}
|