ai-sdlc 0.2.0-alpha.6 → 0.2.0-alpha.61
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 +65 -1057
- package/dist/agents/implementation.d.ts +36 -1
- package/dist/agents/implementation.d.ts.map +1 -1
- package/dist/agents/implementation.js +259 -30
- package/dist/agents/implementation.js.map +1 -1
- package/dist/agents/index.d.ts +2 -0
- package/dist/agents/index.d.ts.map +1 -1
- package/dist/agents/index.js +2 -0
- package/dist/agents/index.js.map +1 -1
- package/dist/agents/orchestrator.d.ts +61 -0
- package/dist/agents/orchestrator.d.ts.map +1 -0
- package/dist/agents/orchestrator.js +443 -0
- package/dist/agents/orchestrator.js.map +1 -0
- package/dist/agents/planning.d.ts +1 -1
- package/dist/agents/planning.d.ts.map +1 -1
- package/dist/agents/planning.js +55 -4
- package/dist/agents/planning.js.map +1 -1
- package/dist/agents/refinement.d.ts.map +1 -1
- package/dist/agents/refinement.js +22 -3
- package/dist/agents/refinement.js.map +1 -1
- package/dist/agents/research.d.ts +85 -1
- package/dist/agents/research.d.ts.map +1 -1
- package/dist/agents/research.js +506 -16
- package/dist/agents/research.js.map +1 -1
- package/dist/agents/review.d.ts +116 -2
- package/dist/agents/review.d.ts.map +1 -1
- package/dist/agents/review.js +847 -93
- package/dist/agents/review.js.map +1 -1
- package/dist/agents/rework.d.ts.map +1 -1
- package/dist/agents/rework.js +25 -4
- package/dist/agents/rework.js.map +1 -1
- package/dist/agents/single-task.d.ts +41 -0
- package/dist/agents/single-task.d.ts.map +1 -0
- package/dist/agents/single-task.js +357 -0
- package/dist/agents/single-task.js.map +1 -0
- package/dist/agents/state-assessor.d.ts +3 -3
- package/dist/agents/state-assessor.d.ts.map +1 -1
- package/dist/agents/state-assessor.js +6 -6
- package/dist/agents/state-assessor.js.map +1 -1
- package/dist/agents/test-pattern-detector.d.ts +49 -0
- package/dist/agents/test-pattern-detector.d.ts.map +1 -0
- package/dist/agents/test-pattern-detector.js +273 -0
- package/dist/agents/test-pattern-detector.js.map +1 -0
- package/dist/agents/verification.d.ts +11 -0
- package/dist/agents/verification.d.ts.map +1 -1
- package/dist/agents/verification.js +99 -12
- package/dist/agents/verification.js.map +1 -1
- package/dist/cli/batch-processor.d.ts +64 -0
- package/dist/cli/batch-processor.d.ts.map +1 -0
- package/dist/cli/batch-processor.js +85 -0
- package/dist/cli/batch-processor.js.map +1 -0
- package/dist/cli/batch-validator.d.ts +80 -0
- package/dist/cli/batch-validator.d.ts.map +1 -0
- package/dist/cli/batch-validator.js +121 -0
- package/dist/cli/batch-validator.js.map +1 -0
- package/dist/cli/commands/migrate.js +1 -1
- package/dist/cli/commands/migrate.js.map +1 -1
- package/dist/cli/commands.d.ts +67 -3
- package/dist/cli/commands.d.ts.map +1 -1
- package/dist/cli/commands.js +1765 -198
- package/dist/cli/commands.js.map +1 -1
- package/dist/cli/daemon.d.ts.map +1 -1
- package/dist/cli/daemon.js +25 -3
- package/dist/cli/daemon.js.map +1 -1
- package/dist/cli/runner.d.ts.map +1 -1
- package/dist/cli/runner.js +35 -12
- package/dist/cli/runner.js.map +1 -1
- package/dist/core/auth.d.ts +43 -0
- package/dist/core/auth.d.ts.map +1 -1
- package/dist/core/auth.js +105 -1
- package/dist/core/auth.js.map +1 -1
- package/dist/core/client.d.ts +25 -1
- package/dist/core/client.d.ts.map +1 -1
- package/dist/core/client.js +247 -7
- package/dist/core/client.js.map +1 -1
- package/dist/core/config.d.ts +32 -1
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +146 -3
- package/dist/core/config.js.map +1 -1
- package/dist/core/conflict-detector.d.ts +108 -0
- package/dist/core/conflict-detector.d.ts.map +1 -0
- package/dist/core/conflict-detector.js +413 -0
- package/dist/core/conflict-detector.js.map +1 -0
- package/dist/core/git-utils.d.ts +28 -0
- package/dist/core/git-utils.d.ts.map +1 -0
- package/dist/core/git-utils.js +146 -0
- package/dist/core/git-utils.js.map +1 -0
- package/dist/core/index.d.ts +19 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +19 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/kanban.d.ts +1 -1
- package/dist/core/kanban.d.ts.map +1 -1
- package/dist/core/kanban.js +3 -3
- package/dist/core/kanban.js.map +1 -1
- package/dist/core/llm-utils.d.ts +103 -0
- package/dist/core/llm-utils.d.ts.map +1 -0
- package/dist/core/llm-utils.js +368 -0
- package/dist/core/llm-utils.js.map +1 -0
- package/dist/core/logger.d.ts +92 -0
- package/dist/core/logger.d.ts.map +1 -0
- package/dist/core/logger.js +221 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/core/process-manager.d.ts +15 -0
- package/dist/core/process-manager.d.ts.map +1 -0
- package/dist/core/process-manager.js +132 -0
- package/dist/core/process-manager.js.map +1 -0
- package/dist/core/story-logger.d.ts +102 -0
- package/dist/core/story-logger.d.ts.map +1 -0
- package/dist/core/story-logger.js +265 -0
- package/dist/core/story-logger.js.map +1 -0
- package/dist/core/story.d.ts +113 -20
- package/dist/core/story.d.ts.map +1 -1
- package/dist/core/story.js +328 -40
- package/dist/core/story.js.map +1 -1
- package/dist/core/task-parser.d.ts +59 -0
- package/dist/core/task-parser.d.ts.map +1 -0
- package/dist/core/task-parser.js +235 -0
- package/dist/core/task-parser.js.map +1 -0
- package/dist/core/task-progress.d.ts +92 -0
- package/dist/core/task-progress.d.ts.map +1 -0
- package/dist/core/task-progress.js +280 -0
- package/dist/core/task-progress.js.map +1 -0
- package/dist/core/workflow-state.d.ts +45 -6
- package/dist/core/workflow-state.d.ts.map +1 -1
- package/dist/core/workflow-state.js +201 -12
- package/dist/core/workflow-state.js.map +1 -1
- package/dist/core/worktree.d.ts +186 -0
- package/dist/core/worktree.d.ts.map +1 -0
- package/dist/core/worktree.js +554 -0
- package/dist/core/worktree.js.map +1 -0
- package/dist/index.js +146 -5
- package/dist/index.js.map +1 -1
- package/dist/services/error-classifier.d.ts +119 -0
- package/dist/services/error-classifier.d.ts.map +1 -0
- package/dist/services/error-classifier.js +182 -0
- package/dist/services/error-classifier.js.map +1 -0
- package/dist/types/index.d.ts +381 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +1 -0
- package/dist/types/index.js.map +1 -1
- package/package.json +5 -2
- package/templates/story.md +5 -0
|
@@ -0,0 +1,357 @@
|
|
|
1
|
+
import { spawnSync } from 'child_process';
|
|
2
|
+
import { createHash } from 'crypto';
|
|
3
|
+
import { runAgentQuery } from '../core/client.js';
|
|
4
|
+
import { getLogger } from '../core/logger.js';
|
|
5
|
+
/**
|
|
6
|
+
* System prompt for single-task implementation agent
|
|
7
|
+
* Focused instructions without full story context
|
|
8
|
+
*/
|
|
9
|
+
export const TASK_AGENT_SYSTEM_PROMPT = `You are a senior software engineer executing a single implementation task.
|
|
10
|
+
|
|
11
|
+
Your job is to:
|
|
12
|
+
1. Read and understand the task description
|
|
13
|
+
2. Review the existing code in the target files
|
|
14
|
+
3. Make the necessary changes to satisfy the task requirements
|
|
15
|
+
4. Follow the project conventions strictly
|
|
16
|
+
5. Write clean, maintainable code that follows existing patterns
|
|
17
|
+
|
|
18
|
+
CRITICAL RULES:
|
|
19
|
+
- Modify ONLY the files listed in the task context
|
|
20
|
+
- If you need a file that's not provided, state this clearly in your output
|
|
21
|
+
- Do NOT create new files unless explicitly listed in the task
|
|
22
|
+
- Follow the acceptance criteria relevant to this task
|
|
23
|
+
- Ensure your changes are focused and minimal (do what's needed, nothing more)
|
|
24
|
+
|
|
25
|
+
When complete, provide a brief summary of:
|
|
26
|
+
- What you changed
|
|
27
|
+
- Which files you modified
|
|
28
|
+
- Any issues or missing dependencies encountered`;
|
|
29
|
+
/**
|
|
30
|
+
* Build minimal context prompt for a single task
|
|
31
|
+
*/
|
|
32
|
+
export function buildTaskPrompt(context) {
|
|
33
|
+
const { task, acceptanceCriteria, existingFiles, projectPatterns } = context;
|
|
34
|
+
let prompt = `# Implementation Task\n\n`;
|
|
35
|
+
prompt += `**Task ID:** ${task.id}\n`;
|
|
36
|
+
prompt += `**Description:** ${task.description}\n\n`;
|
|
37
|
+
// Add existing files
|
|
38
|
+
if (existingFiles.length > 0) {
|
|
39
|
+
prompt += `## Target Files\n\n`;
|
|
40
|
+
for (const file of existingFiles) {
|
|
41
|
+
prompt += `### ${file.path}\n\n`;
|
|
42
|
+
prompt += `\`\`\`\n${file.content}\n\`\`\`\n\n`;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
prompt += `## Target Files\n\nNo existing files provided. You may need to create new files as specified in the task.\n\n`;
|
|
47
|
+
}
|
|
48
|
+
// Add relevant acceptance criteria
|
|
49
|
+
if (acceptanceCriteria.length > 0) {
|
|
50
|
+
prompt += `## Acceptance Criteria\n\n`;
|
|
51
|
+
for (const ac of acceptanceCriteria) {
|
|
52
|
+
prompt += `- ${ac}\n`;
|
|
53
|
+
}
|
|
54
|
+
prompt += `\n`;
|
|
55
|
+
}
|
|
56
|
+
// Add project conventions (enforce max length)
|
|
57
|
+
if (projectPatterns) {
|
|
58
|
+
const MAX_PATTERN_LENGTH = 2000; // ~500 tokens
|
|
59
|
+
let patterns = projectPatterns;
|
|
60
|
+
if (patterns.length > MAX_PATTERN_LENGTH) {
|
|
61
|
+
console.warn(`projectPatterns truncated from ${patterns.length} to ${MAX_PATTERN_LENGTH} characters`);
|
|
62
|
+
patterns = patterns.substring(0, MAX_PATTERN_LENGTH) + '\n\n[... truncated for length]';
|
|
63
|
+
}
|
|
64
|
+
prompt += `## Project Conventions\n\n${patterns}\n\n`;
|
|
65
|
+
}
|
|
66
|
+
prompt += `## Instructions\n\n`;
|
|
67
|
+
prompt += `1. Implement the task by modifying the files listed above\n`;
|
|
68
|
+
prompt += `2. Follow the project conventions strictly\n`;
|
|
69
|
+
prompt += `3. Ensure your changes satisfy the relevant acceptance criteria\n`;
|
|
70
|
+
prompt += `4. Report if you need additional files not provided\n\n`;
|
|
71
|
+
prompt += `Proceed with the implementation.`;
|
|
72
|
+
return prompt;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Detect if agent modified files outside the declared scope
|
|
76
|
+
*/
|
|
77
|
+
export function detectScopeViolation(declaredFiles, actualFiles) {
|
|
78
|
+
const violations = actualFiles.filter((f) => !declaredFiles.includes(f));
|
|
79
|
+
return violations.length > 0 ? violations : undefined;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Get current git diff hash to detect changes
|
|
83
|
+
*/
|
|
84
|
+
function getCurrentDiffHash(workingDir) {
|
|
85
|
+
const result = spawnSync('git', ['diff', 'HEAD'], {
|
|
86
|
+
cwd: workingDir,
|
|
87
|
+
encoding: 'utf8',
|
|
88
|
+
maxBuffer: 50 * 1024 * 1024,
|
|
89
|
+
});
|
|
90
|
+
if (result.error) {
|
|
91
|
+
throw new Error(`Failed to get git diff: ${result.error.message}`);
|
|
92
|
+
}
|
|
93
|
+
const diff = result.stdout || '';
|
|
94
|
+
return createHash('sha256').update(diff).digest('hex');
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Get list of files changed in working directory
|
|
98
|
+
*/
|
|
99
|
+
function getChangedFiles(workingDir) {
|
|
100
|
+
const result = spawnSync('git', ['diff', '--name-only', 'HEAD'], {
|
|
101
|
+
cwd: workingDir,
|
|
102
|
+
encoding: 'utf8',
|
|
103
|
+
});
|
|
104
|
+
if (result.error) {
|
|
105
|
+
throw new Error(`Failed to get changed files: ${result.error.message}`);
|
|
106
|
+
}
|
|
107
|
+
const files = (result.stdout || '')
|
|
108
|
+
.split('\n')
|
|
109
|
+
.map((f) => f.trim())
|
|
110
|
+
.filter((f) => f.length > 0);
|
|
111
|
+
return files;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Validate file paths to prevent command injection
|
|
115
|
+
* Throws an error if any path contains suspicious characters or patterns
|
|
116
|
+
*/
|
|
117
|
+
export function validateFilePaths(paths) {
|
|
118
|
+
// Shell metacharacters that could be used for injection
|
|
119
|
+
const dangerousChars = /[;|&`$()<>]/;
|
|
120
|
+
for (const path of paths) {
|
|
121
|
+
// Check for shell metacharacters
|
|
122
|
+
if (dangerousChars.test(path)) {
|
|
123
|
+
throw new Error(`Invalid file path "${path}": contains shell metacharacters that could be used for command injection`);
|
|
124
|
+
}
|
|
125
|
+
// Check for directory traversal attempts
|
|
126
|
+
if (path.includes('..')) {
|
|
127
|
+
throw new Error(`Invalid file path "${path}": directory traversal is not allowed`);
|
|
128
|
+
}
|
|
129
|
+
// Ensure path starts with expected directories (basic sanity check)
|
|
130
|
+
// Allow: src/, tests/, dist/, .ai-sdlc/, or relative paths starting with ./
|
|
131
|
+
const validPrefixes = ['src/', 'tests/', 'dist/', '.ai-sdlc/', './', ''];
|
|
132
|
+
const hasValidPrefix = validPrefixes.some((prefix) => path.startsWith(prefix) || path === prefix.slice(0, -1));
|
|
133
|
+
if (!hasValidPrefix && !path.match(/^[a-zA-Z0-9_.-]+$/)) {
|
|
134
|
+
throw new Error(`Invalid file path "${path}": must start with an expected directory (src/, tests/, etc.) or be a simple filename`);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Detect test files related to changed modules
|
|
140
|
+
* Checks for co-located .test.ts files
|
|
141
|
+
*/
|
|
142
|
+
function detectTestFiles(filesChanged) {
|
|
143
|
+
const testFiles = new Set();
|
|
144
|
+
for (const file of filesChanged) {
|
|
145
|
+
// Check for co-located test files (e.g., foo.ts -> foo.test.ts)
|
|
146
|
+
if (file.endsWith('.ts') || file.endsWith('.tsx')) {
|
|
147
|
+
const testFile = file.replace(/\.(ts|tsx)$/, '.test.$1');
|
|
148
|
+
testFiles.add(testFile);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
return Array.from(testFiles);
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Verify changes using TypeScript, ESLint, and tests
|
|
155
|
+
*/
|
|
156
|
+
export async function verifyChanges(filesChanged, workingDir) {
|
|
157
|
+
const errors = [];
|
|
158
|
+
let testsRun = false;
|
|
159
|
+
if (filesChanged.length === 0) {
|
|
160
|
+
return { passed: true, errors: [], testsRun: false };
|
|
161
|
+
}
|
|
162
|
+
// Validate file paths to prevent command injection
|
|
163
|
+
try {
|
|
164
|
+
validateFilePaths(filesChanged);
|
|
165
|
+
}
|
|
166
|
+
catch (error) {
|
|
167
|
+
errors.push(`Path validation failed: ${error.message}`);
|
|
168
|
+
return { passed: false, errors, testsRun: false };
|
|
169
|
+
}
|
|
170
|
+
// Run TypeScript type checking
|
|
171
|
+
// NOTE: TypeScript doesn't support true per-file checking - it always checks the whole project
|
|
172
|
+
// to ensure type safety across module boundaries. This is a TypeScript limitation.
|
|
173
|
+
const tscResult = spawnSync('npx', ['tsc', '--noEmit'], {
|
|
174
|
+
cwd: workingDir,
|
|
175
|
+
encoding: 'utf8',
|
|
176
|
+
});
|
|
177
|
+
if (tscResult.status !== 0) {
|
|
178
|
+
const stderr = tscResult.stderr || tscResult.stdout || '';
|
|
179
|
+
if (stderr.trim()) {
|
|
180
|
+
errors.push(`TypeScript errors (whole project checked):\n${stderr}`);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
// Run ESLint on changed files
|
|
184
|
+
const tsFiles = filesChanged.filter((f) => f.endsWith('.ts') || f.endsWith('.tsx'));
|
|
185
|
+
if (tsFiles.length > 0) {
|
|
186
|
+
const eslintResult = spawnSync('npx', ['eslint', ...tsFiles], {
|
|
187
|
+
cwd: workingDir,
|
|
188
|
+
encoding: 'utf8',
|
|
189
|
+
});
|
|
190
|
+
if (eslintResult.status !== 0) {
|
|
191
|
+
const stderr = eslintResult.stderr || eslintResult.stdout || '';
|
|
192
|
+
if (stderr.trim()) {
|
|
193
|
+
errors.push(`ESLint errors:\n${stderr}`);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
// Run tests for changed modules
|
|
198
|
+
const testFiles = detectTestFiles(filesChanged);
|
|
199
|
+
if (testFiles.length > 0) {
|
|
200
|
+
// Check if test files actually exist before running
|
|
201
|
+
const testResult = spawnSync('npm', ['test', '--', ...testFiles], {
|
|
202
|
+
cwd: workingDir,
|
|
203
|
+
encoding: 'utf8',
|
|
204
|
+
});
|
|
205
|
+
testsRun = true;
|
|
206
|
+
if (testResult.status !== 0) {
|
|
207
|
+
const stderr = testResult.stderr || testResult.stdout || '';
|
|
208
|
+
if (stderr.trim()) {
|
|
209
|
+
errors.push(`Test failures:\n${stderr}`);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
else {
|
|
214
|
+
errors.push('No tests detected for changed files');
|
|
215
|
+
}
|
|
216
|
+
return {
|
|
217
|
+
passed: errors.length === 0,
|
|
218
|
+
errors,
|
|
219
|
+
testsRun,
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Detect missing dependencies or files mentioned in agent output
|
|
224
|
+
* Scans for phrases indicating the agent needs additional files
|
|
225
|
+
*/
|
|
226
|
+
export function detectMissingDependencies(agentOutput) {
|
|
227
|
+
const missingFiles = [];
|
|
228
|
+
const lines = agentOutput.split('\n');
|
|
229
|
+
// Keywords that indicate missing dependencies
|
|
230
|
+
const keywords = ['need', 'missing file', 'not provided', 'required file', 'cannot find'];
|
|
231
|
+
for (const line of lines) {
|
|
232
|
+
const lowerLine = line.toLowerCase();
|
|
233
|
+
// Check if line contains any missing dependency keywords
|
|
234
|
+
if (keywords.some((keyword) => lowerLine.includes(keyword))) {
|
|
235
|
+
// Try to extract file paths from the line
|
|
236
|
+
// Match common path patterns: src/foo.ts, ./foo.ts, foo.ts, etc.
|
|
237
|
+
// Note: Order extensions from longest to shortest to avoid partial matches (json before js, tsx before ts)
|
|
238
|
+
const pathMatches = line.match(/[\w/./-]+\.(json|tsx|jsx|ts|js)/g);
|
|
239
|
+
if (pathMatches) {
|
|
240
|
+
missingFiles.push(...pathMatches);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
return missingFiles.length > 0 ? missingFiles : undefined;
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Parse agent output and construct structured result
|
|
248
|
+
*/
|
|
249
|
+
export async function parseTaskResult(agentOutput, task, workingDir) {
|
|
250
|
+
const logger = getLogger();
|
|
251
|
+
try {
|
|
252
|
+
// Get files actually changed
|
|
253
|
+
const filesChanged = getChangedFiles(workingDir);
|
|
254
|
+
// Detect scope violations
|
|
255
|
+
const declaredFiles = task.files || [];
|
|
256
|
+
const scopeViolation = detectScopeViolation(declaredFiles, filesChanged);
|
|
257
|
+
// Detect missing dependencies from agent output
|
|
258
|
+
const missingDependencies = detectMissingDependencies(agentOutput);
|
|
259
|
+
// Run verification on changed files
|
|
260
|
+
const verification = await verifyChanges(filesChanged, workingDir);
|
|
261
|
+
// Determine overall success
|
|
262
|
+
const success = verification.passed && filesChanged.length > 0;
|
|
263
|
+
const result = {
|
|
264
|
+
success,
|
|
265
|
+
task,
|
|
266
|
+
filesChanged,
|
|
267
|
+
verificationPassed: verification.passed,
|
|
268
|
+
agentOutput,
|
|
269
|
+
scopeViolation,
|
|
270
|
+
missingDependencies,
|
|
271
|
+
};
|
|
272
|
+
if (!verification.passed) {
|
|
273
|
+
result.error = verification.errors.join('\n\n');
|
|
274
|
+
}
|
|
275
|
+
else if (filesChanged.length === 0) {
|
|
276
|
+
result.error = 'No files were modified';
|
|
277
|
+
result.success = false;
|
|
278
|
+
}
|
|
279
|
+
logger.debug('single-task', 'Task result parsed', {
|
|
280
|
+
taskId: task.id,
|
|
281
|
+
success,
|
|
282
|
+
filesChanged: filesChanged.length,
|
|
283
|
+
verificationPassed: verification.passed,
|
|
284
|
+
hasScopeViolation: !!scopeViolation,
|
|
285
|
+
hasMissingDependencies: !!missingDependencies,
|
|
286
|
+
});
|
|
287
|
+
return result;
|
|
288
|
+
}
|
|
289
|
+
catch (error) {
|
|
290
|
+
// Git operation failed - this is an environment issue
|
|
291
|
+
logger.error('single-task', 'Git operation failed during result parsing', {
|
|
292
|
+
error: error.message,
|
|
293
|
+
});
|
|
294
|
+
return {
|
|
295
|
+
success: false,
|
|
296
|
+
task,
|
|
297
|
+
filesChanged: [],
|
|
298
|
+
verificationPassed: false,
|
|
299
|
+
agentOutput,
|
|
300
|
+
error: `Git operation failed: ${error.message}`,
|
|
301
|
+
};
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
/**
|
|
305
|
+
* Execute a single implementation task with minimal context
|
|
306
|
+
*/
|
|
307
|
+
export async function runSingleTaskAgent(context, options) {
|
|
308
|
+
const logger = getLogger();
|
|
309
|
+
const { task, workingDirectory } = context;
|
|
310
|
+
logger.info('single-task', `Starting task ${task.id}: ${task.description}`);
|
|
311
|
+
// Build focused prompt
|
|
312
|
+
const prompt = buildTaskPrompt(context);
|
|
313
|
+
// Handle dry run
|
|
314
|
+
if (options?.dryRun) {
|
|
315
|
+
logger.info('single-task', 'DRY RUN MODE - Prompt generated but not executed');
|
|
316
|
+
logger.debug('single-task', 'Generated prompt', { prompt });
|
|
317
|
+
return {
|
|
318
|
+
success: false,
|
|
319
|
+
task,
|
|
320
|
+
filesChanged: [],
|
|
321
|
+
verificationPassed: false,
|
|
322
|
+
error: 'Dry run - no execution performed',
|
|
323
|
+
agentOutput: prompt,
|
|
324
|
+
};
|
|
325
|
+
}
|
|
326
|
+
try {
|
|
327
|
+
// Execute agent query
|
|
328
|
+
const agentOutput = await runAgentQuery({
|
|
329
|
+
prompt,
|
|
330
|
+
systemPrompt: TASK_AGENT_SYSTEM_PROMPT,
|
|
331
|
+
workingDirectory,
|
|
332
|
+
timeout: options?.timeout,
|
|
333
|
+
onProgress: options?.onProgress,
|
|
334
|
+
});
|
|
335
|
+
// Parse and return structured result
|
|
336
|
+
const result = await parseTaskResult(agentOutput, task, workingDirectory);
|
|
337
|
+
if (result.success) {
|
|
338
|
+
logger.info('single-task', `Task ${task.id} completed successfully`);
|
|
339
|
+
}
|
|
340
|
+
else {
|
|
341
|
+
logger.warn('single-task', `Task ${task.id} failed`, { error: result.error });
|
|
342
|
+
}
|
|
343
|
+
return result;
|
|
344
|
+
}
|
|
345
|
+
catch (error) {
|
|
346
|
+
logger.error('single-task', `Task ${task.id} execution failed`, { error: error.message });
|
|
347
|
+
return {
|
|
348
|
+
success: false,
|
|
349
|
+
task,
|
|
350
|
+
filesChanged: [],
|
|
351
|
+
verificationPassed: false,
|
|
352
|
+
error: error.message || 'Unknown error during task execution',
|
|
353
|
+
agentOutput: undefined,
|
|
354
|
+
};
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
//# sourceMappingURL=single-task.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"single-task.js","sourceRoot":"","sources":["../../src/agents/single-task.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,13 +9,13 @@ import { StateAssessment, Action } from '../types/index.js';
|
|
|
9
9
|
* In the future, this could use an LLM to make smarter decisions about
|
|
10
10
|
* prioritization and workflow optimization.
|
|
11
11
|
*/
|
|
12
|
-
export declare function runStateAssessor(sdlcRoot: string): StateAssessment
|
|
12
|
+
export declare function runStateAssessor(sdlcRoot: string): Promise<StateAssessment>;
|
|
13
13
|
/**
|
|
14
14
|
* Get the next recommended action
|
|
15
15
|
*/
|
|
16
|
-
export declare function getNextAction(sdlcRoot: string): Action | null
|
|
16
|
+
export declare function getNextAction(sdlcRoot: string): Promise<Action | null>;
|
|
17
17
|
/**
|
|
18
18
|
* Check if there's any work to be done
|
|
19
19
|
*/
|
|
20
|
-
export declare function hasWork(sdlcRoot: string): boolean
|
|
20
|
+
export declare function hasWork(sdlcRoot: string): Promise<boolean>;
|
|
21
21
|
//# sourceMappingURL=state-assessor.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state-assessor.d.ts","sourceRoot":"","sources":["../../src/agents/state-assessor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAG5D;;;;;;;;;GASG;AACH,
|
|
1
|
+
{"version":3,"file":"state-assessor.d.ts","sourceRoot":"","sources":["../../src/agents/state-assessor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAG5D;;;;;;;;;GASG;AACH,wBAAsB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAEjF;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAG5E;AAED;;GAEG;AACH,wBAAsB,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAGhE"}
|
|
@@ -9,21 +9,21 @@ import { assessState } from '../core/kanban.js';
|
|
|
9
9
|
* In the future, this could use an LLM to make smarter decisions about
|
|
10
10
|
* prioritization and workflow optimization.
|
|
11
11
|
*/
|
|
12
|
-
export function runStateAssessor(sdlcRoot) {
|
|
13
|
-
return assessState(sdlcRoot);
|
|
12
|
+
export async function runStateAssessor(sdlcRoot) {
|
|
13
|
+
return await assessState(sdlcRoot);
|
|
14
14
|
}
|
|
15
15
|
/**
|
|
16
16
|
* Get the next recommended action
|
|
17
17
|
*/
|
|
18
|
-
export function getNextAction(sdlcRoot) {
|
|
19
|
-
const assessment = assessState(sdlcRoot);
|
|
18
|
+
export async function getNextAction(sdlcRoot) {
|
|
19
|
+
const assessment = await assessState(sdlcRoot);
|
|
20
20
|
return assessment.recommendedActions[0] || null;
|
|
21
21
|
}
|
|
22
22
|
/**
|
|
23
23
|
* Check if there's any work to be done
|
|
24
24
|
*/
|
|
25
|
-
export function hasWork(sdlcRoot) {
|
|
26
|
-
const assessment = assessState(sdlcRoot);
|
|
25
|
+
export async function hasWork(sdlcRoot) {
|
|
26
|
+
const assessment = await assessState(sdlcRoot);
|
|
27
27
|
return assessment.recommendedActions.length > 0;
|
|
28
28
|
}
|
|
29
29
|
//# sourceMappingURL=state-assessor.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state-assessor.js","sourceRoot":"","sources":["../../src/agents/state-assessor.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD;;;;;;;;;GASG;AACH,MAAM,UAAU,gBAAgB,CAAC,QAAgB;
|
|
1
|
+
{"version":3,"file":"state-assessor.js","sourceRoot":"","sources":["../../src/agents/state-assessor.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,QAAgB;IACrD,OAAO,MAAM,WAAW,CAAC,QAAQ,CAAC,CAAC;AACrC,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,QAAgB;IAClD,MAAM,UAAU,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,CAAC;IAC/C,OAAO,UAAU,CAAC,kBAAkB,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;AAClD,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,QAAgB;IAC5C,MAAM,UAAU,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,CAAC;IAC/C,OAAO,UAAU,CAAC,kBAAkB,CAAC,MAAM,GAAG,CAAC,CAAC;AAClD,CAAC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { ReviewIssue } from '../types/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Extract function names from file content using regex patterns
|
|
4
|
+
* Supports: function declarations, arrow functions, const functions
|
|
5
|
+
*
|
|
6
|
+
* @param fileContent - Source code to analyze
|
|
7
|
+
* @returns Array of function names found in the file
|
|
8
|
+
*/
|
|
9
|
+
export declare function extractFunctionNames(fileContent: string): string[];
|
|
10
|
+
/**
|
|
11
|
+
* Check if a function name matches legitimate test utility patterns
|
|
12
|
+
* Returns true if the function is a legitimate test helper (should NOT be flagged)
|
|
13
|
+
*
|
|
14
|
+
* Legitimate patterns:
|
|
15
|
+
* - Factory functions: create*, make*, build*, mock*, stub*, fake*
|
|
16
|
+
* - Setup/teardown: setup*, teardown*, before*, after*, cleanup*
|
|
17
|
+
* - Assertion helpers: assert*, expect*, verify*, check*, should*
|
|
18
|
+
* - Test data builders: with*, given*, having*
|
|
19
|
+
*
|
|
20
|
+
* @param functionName - Name of the function to check
|
|
21
|
+
* @returns true if legitimate test utility, false if potential anti-pattern
|
|
22
|
+
*/
|
|
23
|
+
export declare function isLegitimateTestUtility(functionName: string): boolean;
|
|
24
|
+
/**
|
|
25
|
+
* Find the corresponding production file for a test file
|
|
26
|
+
* Handles both colocated tests and centralized test directories
|
|
27
|
+
*
|
|
28
|
+
* @param testFilePath - Absolute path to test file
|
|
29
|
+
* @returns Absolute path to production file, or null if not found
|
|
30
|
+
*/
|
|
31
|
+
export declare function findProductionFile(testFilePath: string): string | null;
|
|
32
|
+
/**
|
|
33
|
+
* Analyze a single test file for duplication patterns
|
|
34
|
+
*
|
|
35
|
+
* @param testFilePath - Absolute path to test file
|
|
36
|
+
* @param testFileContent - Content of the test file
|
|
37
|
+
* @param productionFileContent - Content of the corresponding production file
|
|
38
|
+
* @returns Array of ReviewIssue objects for detected anti-patterns
|
|
39
|
+
*/
|
|
40
|
+
export declare function analyzeTestFile(testFilePath: string, testFileContent: string, productionFileContent: string): ReviewIssue[];
|
|
41
|
+
/**
|
|
42
|
+
* Detect test duplication patterns across all test files in working directory
|
|
43
|
+
* Main entry point for the detection system
|
|
44
|
+
*
|
|
45
|
+
* @param workingDir - Project root directory
|
|
46
|
+
* @returns Array of ReviewIssue objects for all detected anti-patterns
|
|
47
|
+
*/
|
|
48
|
+
export declare function detectTestDuplicationPatterns(workingDir: string): Promise<ReviewIssue[]>;
|
|
49
|
+
//# sourceMappingURL=test-pattern-detector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-pattern-detector.d.ts","sourceRoot":"","sources":["../../src/agents/test-pattern-detector.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,CAuBlE;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,uBAAuB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAiCrE;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAgCtE;AAyBD;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAC7B,YAAY,EAAE,MAAM,EACpB,eAAe,EAAE,MAAM,EACvB,qBAAqB,EAAE,MAAM,GAC5B,WAAW,EAAE,CAqCf;AA8DD;;;;;;GAMG;AACH,wBAAsB,6BAA6B,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAiD9F"}
|