ai-sdlc 0.2.0-alpha.5 → 0.2.0-alpha.50

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.
Files changed (130) hide show
  1. package/README.md +53 -1058
  2. package/dist/agents/implementation.d.ts +6 -0
  3. package/dist/agents/implementation.d.ts.map +1 -1
  4. package/dist/agents/implementation.js +151 -13
  5. package/dist/agents/implementation.js.map +1 -1
  6. package/dist/agents/index.d.ts +2 -0
  7. package/dist/agents/index.d.ts.map +1 -1
  8. package/dist/agents/index.js +2 -0
  9. package/dist/agents/index.js.map +1 -1
  10. package/dist/agents/orchestrator.d.ts +61 -0
  11. package/dist/agents/orchestrator.d.ts.map +1 -0
  12. package/dist/agents/orchestrator.js +443 -0
  13. package/dist/agents/orchestrator.js.map +1 -0
  14. package/dist/agents/planning.d.ts +1 -1
  15. package/dist/agents/planning.d.ts.map +1 -1
  16. package/dist/agents/planning.js +55 -4
  17. package/dist/agents/planning.js.map +1 -1
  18. package/dist/agents/refinement.d.ts.map +1 -1
  19. package/dist/agents/refinement.js +22 -3
  20. package/dist/agents/refinement.js.map +1 -1
  21. package/dist/agents/research.d.ts +85 -1
  22. package/dist/agents/research.d.ts.map +1 -1
  23. package/dist/agents/research.js +506 -16
  24. package/dist/agents/research.js.map +1 -1
  25. package/dist/agents/review.d.ts +77 -2
  26. package/dist/agents/review.d.ts.map +1 -1
  27. package/dist/agents/review.js +615 -93
  28. package/dist/agents/review.js.map +1 -1
  29. package/dist/agents/rework.d.ts.map +1 -1
  30. package/dist/agents/rework.js +22 -3
  31. package/dist/agents/rework.js.map +1 -1
  32. package/dist/agents/single-task.d.ts +41 -0
  33. package/dist/agents/single-task.d.ts.map +1 -0
  34. package/dist/agents/single-task.js +357 -0
  35. package/dist/agents/single-task.js.map +1 -0
  36. package/dist/agents/state-assessor.d.ts +3 -3
  37. package/dist/agents/state-assessor.d.ts.map +1 -1
  38. package/dist/agents/state-assessor.js +6 -6
  39. package/dist/agents/state-assessor.js.map +1 -1
  40. package/dist/agents/test-pattern-detector.d.ts +49 -0
  41. package/dist/agents/test-pattern-detector.d.ts.map +1 -0
  42. package/dist/agents/test-pattern-detector.js +273 -0
  43. package/dist/agents/test-pattern-detector.js.map +1 -0
  44. package/dist/agents/verification.d.ts +11 -0
  45. package/dist/agents/verification.d.ts.map +1 -1
  46. package/dist/agents/verification.js +97 -12
  47. package/dist/agents/verification.js.map +1 -1
  48. package/dist/cli/commands/migrate.js +1 -1
  49. package/dist/cli/commands/migrate.js.map +1 -1
  50. package/dist/cli/commands.d.ts +65 -3
  51. package/dist/cli/commands.d.ts.map +1 -1
  52. package/dist/cli/commands.js +1108 -204
  53. package/dist/cli/commands.js.map +1 -1
  54. package/dist/cli/daemon.d.ts.map +1 -1
  55. package/dist/cli/daemon.js +20 -3
  56. package/dist/cli/daemon.js.map +1 -1
  57. package/dist/cli/runner.d.ts.map +1 -1
  58. package/dist/cli/runner.js +19 -11
  59. package/dist/cli/runner.js.map +1 -1
  60. package/dist/core/auth.d.ts +43 -0
  61. package/dist/core/auth.d.ts.map +1 -1
  62. package/dist/core/auth.js +105 -1
  63. package/dist/core/auth.js.map +1 -1
  64. package/dist/core/client.d.ts +6 -0
  65. package/dist/core/client.d.ts.map +1 -1
  66. package/dist/core/client.js +57 -3
  67. package/dist/core/client.js.map +1 -1
  68. package/dist/core/config.d.ts +24 -1
  69. package/dist/core/config.d.ts.map +1 -1
  70. package/dist/core/config.js +100 -3
  71. package/dist/core/config.js.map +1 -1
  72. package/dist/core/conflict-detector.d.ts +108 -0
  73. package/dist/core/conflict-detector.d.ts.map +1 -0
  74. package/dist/core/conflict-detector.js +413 -0
  75. package/dist/core/conflict-detector.js.map +1 -0
  76. package/dist/core/git-utils.d.ts +28 -0
  77. package/dist/core/git-utils.d.ts.map +1 -0
  78. package/dist/core/git-utils.js +146 -0
  79. package/dist/core/git-utils.js.map +1 -0
  80. package/dist/core/index.d.ts +19 -0
  81. package/dist/core/index.d.ts.map +1 -0
  82. package/dist/core/index.js +19 -0
  83. package/dist/core/index.js.map +1 -0
  84. package/dist/core/kanban.d.ts +1 -1
  85. package/dist/core/kanban.d.ts.map +1 -1
  86. package/dist/core/kanban.js +7 -6
  87. package/dist/core/kanban.js.map +1 -1
  88. package/dist/core/llm-utils.d.ts +103 -0
  89. package/dist/core/llm-utils.d.ts.map +1 -0
  90. package/dist/core/llm-utils.js +368 -0
  91. package/dist/core/llm-utils.js.map +1 -0
  92. package/dist/core/logger.d.ts +92 -0
  93. package/dist/core/logger.d.ts.map +1 -0
  94. package/dist/core/logger.js +221 -0
  95. package/dist/core/logger.js.map +1 -0
  96. package/dist/core/story-logger.d.ts +102 -0
  97. package/dist/core/story-logger.d.ts.map +1 -0
  98. package/dist/core/story-logger.js +265 -0
  99. package/dist/core/story-logger.js.map +1 -0
  100. package/dist/core/story.d.ts +89 -20
  101. package/dist/core/story.d.ts.map +1 -1
  102. package/dist/core/story.js +297 -52
  103. package/dist/core/story.js.map +1 -1
  104. package/dist/core/task-parser.d.ts +59 -0
  105. package/dist/core/task-parser.d.ts.map +1 -0
  106. package/dist/core/task-parser.js +235 -0
  107. package/dist/core/task-parser.js.map +1 -0
  108. package/dist/core/task-progress.d.ts +92 -0
  109. package/dist/core/task-progress.d.ts.map +1 -0
  110. package/dist/core/task-progress.js +280 -0
  111. package/dist/core/task-progress.js.map +1 -0
  112. package/dist/core/workflow-state.d.ts +45 -6
  113. package/dist/core/workflow-state.d.ts.map +1 -1
  114. package/dist/core/workflow-state.js +201 -12
  115. package/dist/core/workflow-state.js.map +1 -1
  116. package/dist/core/worktree.d.ts +77 -0
  117. package/dist/core/worktree.d.ts.map +1 -0
  118. package/dist/core/worktree.js +246 -0
  119. package/dist/core/worktree.js.map +1 -0
  120. package/dist/index.js +135 -5
  121. package/dist/index.js.map +1 -1
  122. package/dist/services/error-classifier.d.ts +119 -0
  123. package/dist/services/error-classifier.d.ts.map +1 -0
  124. package/dist/services/error-classifier.js +182 -0
  125. package/dist/services/error-classifier.js.map +1 -0
  126. package/dist/types/index.d.ts +336 -1
  127. package/dist/types/index.d.ts.map +1 -1
  128. package/dist/types/index.js +1 -0
  129. package/dist/types/index.js.map +1 -1
  130. package/package.json +4 -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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"}
@@ -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,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,eAAe,CAElE;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAG7D;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAGjD"}
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;IAC/C,OAAO,WAAW,CAAC,QAAQ,CAAC,CAAC;AAC/B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,QAAgB;IAC5C,MAAM,UAAU,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;IACzC,OAAO,UAAU,CAAC,kBAAkB,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;AAClD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,OAAO,CAAC,QAAgB;IACtC,MAAM,UAAU,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;IACzC,OAAO,UAAU,CAAC,kBAAkB,CAAC,MAAM,GAAG,CAAC,CAAC;AAClD,CAAC"}
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"}