ai-sdlc 0.2.0 → 0.2.1-alpha.1
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/dist/agents/implementation.d.ts.map +1 -1
- package/dist/agents/implementation.js +64 -0
- 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 +33 -1
- package/dist/agents/planning.js.map +1 -1
- package/dist/agents/review.d.ts +10 -0
- package/dist/agents/review.d.ts.map +1 -1
- package/dist/agents/review.js +138 -25
- package/dist/agents/review.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/cli/commands.d.ts.map +1 -1
- package/dist/cli/commands.js +22 -3
- package/dist/cli/commands.js.map +1 -1
- package/dist/cli/runner.d.ts.map +1 -1
- package/dist/cli/runner.js +4 -8
- package/dist/cli/runner.js.map +1 -1
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +4 -2
- package/dist/core/config.js.map +1 -1
- package/dist/core/index.d.ts +2 -0
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +2 -0
- package/dist/core/index.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/story.d.ts +11 -1
- package/dist/core/story.d.ts.map +1 -1
- package/dist/core/story.js +33 -1
- 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/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 +183 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js.map +1 -1
- package/package.json +2 -1
|
@@ -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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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../../src/cli/commands.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,KAAK,EAAU,UAAU,EAA0H,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAoBvM;;GAEG;AACH,wBAAsB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAyB1C;AAED;;GAEG;AACH,wBAAsB,MAAM,CAAC,OAAO,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAmF1E;AA2DD;;GAEG;AACH,wBAAsB,GAAG,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAyGpF;AAsFD;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,EAC/B,cAAc,EAAE;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,EACpC,WAAW,EAAE,KAAK,GAAG,IAAI,GACxB,OAAO,CAKT;AAuDD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAsB,sBAAsB,CAC1C,WAAW,EAAE,KAAK,EAClB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,GAC3B,OAAO,CAAC,eAAe,CAAC,CA8H1B;AAED;;GAEG;AACH,wBAAsB,GAAG,CAAC,OAAO,EAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../../src/cli/commands.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/commands.js
CHANGED
|
@@ -4,7 +4,7 @@ import path from 'path';
|
|
|
4
4
|
import * as readline from 'readline';
|
|
5
5
|
import { getSdlcRoot, loadConfig, initConfig, validateWorktreeBasePath, DEFAULT_WORKTREE_CONFIG } from '../core/config.js';
|
|
6
6
|
import { initializeKanban, kanbanExists, assessState, getBoardStats, findStoryBySlug, findStoriesByStatus } from '../core/kanban.js';
|
|
7
|
-
import { createStory, parseStory, resetRPIVCycle, isAtMaxRetries, unblockStory, getStory, findStoryById, updateStoryField, writeStory, sanitizeStoryId } from '../core/story.js';
|
|
7
|
+
import { createStory, parseStory, resetRPIVCycle, isAtMaxRetries, unblockStory, getStory, findStoryById, updateStoryField, writeStory, sanitizeStoryId, autoCompleteStoryAfterReview } from '../core/story.js';
|
|
8
8
|
import { GitWorktreeService } from '../core/worktree.js';
|
|
9
9
|
import { ReviewDecision } from '../types/index.js';
|
|
10
10
|
import { getThemedChalk } from '../core/theme.js';
|
|
@@ -912,11 +912,15 @@ export async function run(options) {
|
|
|
912
912
|
}
|
|
913
913
|
// Validate git state before processing actions that modify git
|
|
914
914
|
// Skip protected branch check if worktree mode is active (worktree is on feature branch)
|
|
915
|
-
//
|
|
915
|
+
// Skip clean check entirely when worktree was just created:
|
|
916
|
+
// - The worktree starts from a clean base branch
|
|
917
|
+
// - npm install may modify package-lock.json
|
|
918
|
+
// - Story file was just updated with worktree_path
|
|
919
|
+
// - There's no prior user work to protect in a fresh worktree
|
|
916
920
|
if (!options.force && requiresGitValidation(actionsToProcess)) {
|
|
917
921
|
const workingDir = path.dirname(sdlcRoot);
|
|
918
922
|
const gitValidationOptions = worktreeCreated
|
|
919
|
-
? { skipBranchCheck: true,
|
|
923
|
+
? { skipBranchCheck: true, skipCleanCheck: true }
|
|
920
924
|
: {};
|
|
921
925
|
const gitValidation = validateGitState(workingDir, gitValidationOptions);
|
|
922
926
|
if (!gitValidation.valid) {
|
|
@@ -1230,6 +1234,21 @@ async function executeAction(action, sdlcRoot) {
|
|
|
1230
1234
|
}
|
|
1231
1235
|
},
|
|
1232
1236
|
});
|
|
1237
|
+
// Auto-complete story if review was approved
|
|
1238
|
+
if (result && result.success) {
|
|
1239
|
+
const reviewResult = result;
|
|
1240
|
+
let story = parseStory(action.storyPath);
|
|
1241
|
+
story = await autoCompleteStoryAfterReview(story, config, reviewResult);
|
|
1242
|
+
// Log auto-completion if it occurred
|
|
1243
|
+
if (reviewResult.decision === ReviewDecision.APPROVED && config.reviewConfig.autoCompleteOnApproval) {
|
|
1244
|
+
spinner.text = c.success('Review approved - auto-completing story');
|
|
1245
|
+
storyLogger?.log('INFO', `Story auto-completed after review approval: "${story.frontmatter.title}"`);
|
|
1246
|
+
// Handle worktree cleanup if story has a worktree
|
|
1247
|
+
if (story.frontmatter.worktree_path) {
|
|
1248
|
+
await handleWorktreeCleanup(story, config, c);
|
|
1249
|
+
}
|
|
1250
|
+
}
|
|
1251
|
+
}
|
|
1233
1252
|
break;
|
|
1234
1253
|
case 'rework':
|
|
1235
1254
|
const { runReworkAgent } = await import('../agents/rework.js');
|