maistro 1.0.390

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 (111) hide show
  1. package/LICENSE +15 -0
  2. package/README.md +107 -0
  3. package/dist/app.d.ts +247 -0
  4. package/dist/app.d.ts.map +1 -0
  5. package/dist/app.js +4971 -0
  6. package/dist/app.js.map +1 -0
  7. package/dist/buildInfo.d.ts +5 -0
  8. package/dist/buildInfo.d.ts.map +1 -0
  9. package/dist/buildInfo.js +2 -0
  10. package/dist/buildInfo.js.map +1 -0
  11. package/dist/caffeinate.d.ts +72 -0
  12. package/dist/caffeinate.d.ts.map +1 -0
  13. package/dist/caffeinate.js +258 -0
  14. package/dist/caffeinate.js.map +1 -0
  15. package/dist/claudePath.d.ts +10 -0
  16. package/dist/claudePath.d.ts.map +1 -0
  17. package/dist/claudePath.js +34 -0
  18. package/dist/claudePath.js.map +1 -0
  19. package/dist/clipboard.d.ts +44 -0
  20. package/dist/clipboard.d.ts.map +1 -0
  21. package/dist/clipboard.js +442 -0
  22. package/dist/clipboard.js.map +1 -0
  23. package/dist/config.d.ts +211 -0
  24. package/dist/config.d.ts.map +1 -0
  25. package/dist/config.js +933 -0
  26. package/dist/config.js.map +1 -0
  27. package/dist/constants.d.ts +50 -0
  28. package/dist/constants.d.ts.map +1 -0
  29. package/dist/constants.js +81 -0
  30. package/dist/constants.js.map +1 -0
  31. package/dist/contextBuilder.d.ts +38 -0
  32. package/dist/contextBuilder.d.ts.map +1 -0
  33. package/dist/contextBuilder.js +113 -0
  34. package/dist/contextBuilder.js.map +1 -0
  35. package/dist/dependencyDetector.d.ts +57 -0
  36. package/dist/dependencyDetector.d.ts.map +1 -0
  37. package/dist/dependencyDetector.js +505 -0
  38. package/dist/dependencyDetector.js.map +1 -0
  39. package/dist/executor.d.ts +83 -0
  40. package/dist/executor.d.ts.map +1 -0
  41. package/dist/executor.js +583 -0
  42. package/dist/executor.js.map +1 -0
  43. package/dist/git.d.ts +85 -0
  44. package/dist/git.d.ts.map +1 -0
  45. package/dist/git.js +283 -0
  46. package/dist/git.js.map +1 -0
  47. package/dist/imageManager.d.ts +161 -0
  48. package/dist/imageManager.d.ts.map +1 -0
  49. package/dist/imageManager.js +674 -0
  50. package/dist/imageManager.js.map +1 -0
  51. package/dist/index.d.ts +3 -0
  52. package/dist/index.d.ts.map +1 -0
  53. package/dist/index.js +437 -0
  54. package/dist/index.js.map +1 -0
  55. package/dist/input-visual-test.d.ts +9 -0
  56. package/dist/input-visual-test.d.ts.map +1 -0
  57. package/dist/input-visual-test.js +108 -0
  58. package/dist/input-visual-test.js.map +1 -0
  59. package/dist/inputBox.d.ts +228 -0
  60. package/dist/inputBox.d.ts.map +1 -0
  61. package/dist/inputBox.js +966 -0
  62. package/dist/inputBox.js.map +1 -0
  63. package/dist/logger.d.ts +136 -0
  64. package/dist/logger.d.ts.map +1 -0
  65. package/dist/logger.js +347 -0
  66. package/dist/logger.js.map +1 -0
  67. package/dist/orchestrator.d.ts +149 -0
  68. package/dist/orchestrator.d.ts.map +1 -0
  69. package/dist/orchestrator.js +821 -0
  70. package/dist/orchestrator.js.map +1 -0
  71. package/dist/planner.d.ts +86 -0
  72. package/dist/planner.d.ts.map +1 -0
  73. package/dist/planner.js +830 -0
  74. package/dist/planner.js.map +1 -0
  75. package/dist/pty-test-runner.d.ts +87 -0
  76. package/dist/pty-test-runner.d.ts.map +1 -0
  77. package/dist/pty-test-runner.js +721 -0
  78. package/dist/pty-test-runner.js.map +1 -0
  79. package/dist/screen.d.ts +44 -0
  80. package/dist/screen.d.ts.map +1 -0
  81. package/dist/screen.js +152 -0
  82. package/dist/screen.js.map +1 -0
  83. package/dist/taskQueue.d.ts +70 -0
  84. package/dist/taskQueue.d.ts.map +1 -0
  85. package/dist/taskQueue.js +282 -0
  86. package/dist/taskQueue.js.map +1 -0
  87. package/dist/tui-test-harness.d.ts +216 -0
  88. package/dist/tui-test-harness.d.ts.map +1 -0
  89. package/dist/tui-test-harness.js +527 -0
  90. package/dist/tui-test-harness.js.map +1 -0
  91. package/dist/types.d.ts +257 -0
  92. package/dist/types.d.ts.map +1 -0
  93. package/dist/types.js +46 -0
  94. package/dist/types.js.map +1 -0
  95. package/dist/ui-visual-test.d.ts +15 -0
  96. package/dist/ui-visual-test.d.ts.map +1 -0
  97. package/dist/ui-visual-test.js +141 -0
  98. package/dist/ui-visual-test.js.map +1 -0
  99. package/dist/ui.d.ts +272 -0
  100. package/dist/ui.d.ts.map +1 -0
  101. package/dist/ui.js +1531 -0
  102. package/dist/ui.js.map +1 -0
  103. package/dist/validator.d.ts +53 -0
  104. package/dist/validator.d.ts.map +1 -0
  105. package/dist/validator.js +491 -0
  106. package/dist/validator.js.map +1 -0
  107. package/dist/versionCheck.d.ts +63 -0
  108. package/dist/versionCheck.d.ts.map +1 -0
  109. package/dist/versionCheck.js +261 -0
  110. package/dist/versionCheck.js.map +1 -0
  111. package/package.json +62 -0
@@ -0,0 +1,583 @@
1
+ import { execa } from 'execa';
2
+ import { formatContext } from './contextBuilder.js';
3
+ import { getLogger } from './logger.js';
4
+ import { getImageAbsolutePath } from './imageManager.js';
5
+ import { getClaudePath } from './claudePath.js';
6
+ /**
7
+ * Truncate a string with "..." in the middle if it exceeds maxLength.
8
+ */
9
+ export function truncateMiddle(str, maxLength) {
10
+ if (str.length <= maxLength)
11
+ return str;
12
+ const ellipsis = '...';
13
+ const charsToShow = maxLength - ellipsis.length;
14
+ const frontChars = Math.ceil(charsToShow / 2);
15
+ const backChars = Math.floor(charsToShow / 2);
16
+ return str.slice(0, frontChars) + ellipsis + str.slice(-backChars);
17
+ }
18
+ /**
19
+ * Format tool input arguments for display.
20
+ * Single arg: show value only. Multiple args: show full JSON.
21
+ * @deprecated Use formatToolCall instead for better tool-specific formatting
22
+ */
23
+ export function formatToolArgs(input) {
24
+ if (!input)
25
+ return '';
26
+ const keys = Object.keys(input);
27
+ if (keys.length === 0)
28
+ return '';
29
+ if (keys.length === 1)
30
+ return String(input[keys[0]]);
31
+ return JSON.stringify(input);
32
+ }
33
+ /**
34
+ * Convert kebab-case or snake_case to Title Case
35
+ */
36
+ function toTitleCase(str) {
37
+ return str
38
+ .replace(/[-_]/g, ' ')
39
+ .replace(/\b\w/g, c => c.toUpperCase());
40
+ }
41
+ /**
42
+ * Format a tool call for display with tool-specific formatting.
43
+ *
44
+ * Examples:
45
+ * - Bash: 'Run tests "Bash(npm test)"'
46
+ * - Read: 'Read(/src/app.ts) Lines 10-59'
47
+ * - Edit: 'Edit(/src/app.ts)'
48
+ * - TodoWrite: 'TodoWrite(3 items)'
49
+ * - mcp__chrome-devtools__list_pages: 'MCP Chrome Devtools: List Pages'
50
+ */
51
+ export function formatToolCall(toolName, input) {
52
+ // Handle MCP tools: mcp__server-name__tool_name
53
+ if (toolName.startsWith('mcp__')) {
54
+ const parts = toolName.slice(5).split('__');
55
+ if (parts.length >= 2) {
56
+ const serverName = toTitleCase(parts[0]);
57
+ const mcpToolName = toTitleCase(parts.slice(1).join(' '));
58
+ // Format args for MCP tools
59
+ let argsStr = '';
60
+ if (input && typeof input === 'object') {
61
+ if (Array.isArray(input)) {
62
+ argsStr = input.length > 0 ? ` (${input.length} items)` : '';
63
+ }
64
+ else {
65
+ const keys = Object.keys(input);
66
+ if (keys.length === 1) {
67
+ const val = String(input[keys[0]]);
68
+ if (val.length <= 50)
69
+ argsStr = ` ${val}`;
70
+ }
71
+ else if (keys.length > 1) {
72
+ const truncatedJson = truncateMiddle(JSON.stringify(input), 80);
73
+ argsStr = ` ${truncatedJson}`;
74
+ }
75
+ }
76
+ }
77
+ return `MCP ${serverName}: ${mcpToolName}${argsStr}`;
78
+ }
79
+ }
80
+ // Handle empty/undefined input
81
+ if (!input) {
82
+ return toolName;
83
+ }
84
+ // Handle array input (e.g., TodoWrite)
85
+ if (Array.isArray(input)) {
86
+ return `${toolName}(${input.length} items)`;
87
+ }
88
+ // Tool-specific formatters
89
+ switch (toolName) {
90
+ case 'Bash': {
91
+ const command = input.command;
92
+ const description = input.description;
93
+ if (command) {
94
+ const truncatedCmd = truncateMiddle(command, 80);
95
+ if (description) {
96
+ const truncatedDesc = truncateMiddle(description, 60);
97
+ return `${truncatedDesc} "Bash(${truncatedCmd})"`;
98
+ }
99
+ return `Bash(${truncatedCmd})`;
100
+ }
101
+ return 'Bash';
102
+ }
103
+ case 'Read': {
104
+ const filePath = (input.file_path ?? input.path);
105
+ if (!filePath)
106
+ return 'Read';
107
+ const truncatedPath = truncateMiddle(filePath, 80);
108
+ const offset = input.offset;
109
+ const limit = input.limit;
110
+ if (offset !== undefined && limit !== undefined) {
111
+ return `Read(${truncatedPath}) Lines ${offset}-${offset + limit - 1}`;
112
+ }
113
+ return `Read(${truncatedPath})`;
114
+ }
115
+ case 'Edit': {
116
+ const filePath = (input.file_path ?? input.path);
117
+ if (!filePath)
118
+ return 'Edit';
119
+ return `Edit(${truncateMiddle(filePath, 100)})`;
120
+ }
121
+ case 'Write': {
122
+ const filePath = (input.file_path ?? input.path);
123
+ if (!filePath)
124
+ return 'Write';
125
+ return `Write(${truncateMiddle(filePath, 100)})`;
126
+ }
127
+ case 'Glob': {
128
+ const pattern = input.pattern;
129
+ if (!pattern)
130
+ return 'Glob';
131
+ return `Glob(${truncateMiddle(pattern, 100)})`;
132
+ }
133
+ case 'Grep': {
134
+ const pattern = input.pattern;
135
+ if (!pattern)
136
+ return 'Grep';
137
+ return `Grep(${truncateMiddle(pattern, 100)})`;
138
+ }
139
+ case 'WebFetch': {
140
+ const url = input.url;
141
+ if (!url)
142
+ return 'WebFetch';
143
+ return `WebFetch(${truncateMiddle(url, 100)})`;
144
+ }
145
+ case 'WebSearch': {
146
+ const query = input.query;
147
+ if (!query)
148
+ return 'WebSearch';
149
+ return `WebSearch("${truncateMiddle(query, 80)}")`;
150
+ }
151
+ case 'Task': {
152
+ const description = input.description;
153
+ const subagentType = input.subagent_type;
154
+ if (description && subagentType) {
155
+ return `Task(${subagentType}: ${truncateMiddle(description, 60)})`;
156
+ }
157
+ if (description) {
158
+ return `Task(${truncateMiddle(description, 80)})`;
159
+ }
160
+ return 'Task';
161
+ }
162
+ case 'TodoWrite': {
163
+ // TodoWrite takes an object with 'todos' array
164
+ const todos = input.todos;
165
+ if (Array.isArray(todos)) {
166
+ return `TodoWrite(${todos.length} items)`;
167
+ }
168
+ return 'TodoWrite';
169
+ }
170
+ default: {
171
+ // Generic fallback: show first meaningful arg or truncated JSON
172
+ const keys = Object.keys(input);
173
+ if (keys.length === 0)
174
+ return toolName;
175
+ if (keys.length === 1) {
176
+ const value = String(input[keys[0]]);
177
+ return `${toolName}(${truncateMiddle(value, 100)})`;
178
+ }
179
+ return `${toolName}(${truncateMiddle(JSON.stringify(input), 100)})`;
180
+ }
181
+ }
182
+ }
183
+ const DEFAULT_TIMEOUT = 10 * 60 * 1000; // 10 minutes
184
+ /**
185
+ * Run Claude Code CLI with the given prompt and options.
186
+ * Handles streaming output, abort polling, and error handling.
187
+ */
188
+ async function runClaudeCode(options) {
189
+ const { prompt, cwd, timeout, env, onOutput, shouldAbort, taskId } = options;
190
+ // Create a clean environment for Claude Code CLI
191
+ // IMPORTANT: Exclude ANTHROPIC_API_KEY to prevent conflict with Claude's subscription auth
192
+ const { ANTHROPIC_API_KEY: _excluded, ...cleanEnv } = process.env;
193
+ const execaOptions = {
194
+ cwd,
195
+ timeout,
196
+ reject: false,
197
+ stdin: 'ignore',
198
+ stdout: 'pipe',
199
+ stderr: 'pipe',
200
+ buffer: false,
201
+ env: {
202
+ ...cleanEnv,
203
+ ...env,
204
+ },
205
+ };
206
+ const logger = getLogger();
207
+ try {
208
+ const subprocess = execa(getClaudePath(), ['--print', '--verbose', '--dangerously-skip-permissions', '--chrome', '--output-format', 'stream-json', '-p', prompt], execaOptions);
209
+ let stdout = '';
210
+ let stderr = '';
211
+ let lineBuffer = '';
212
+ const extractedErrors = []; // Collect API errors from JSON output
213
+ // Stream stdout - parse JSON lines for realtime output
214
+ if (subprocess.stdout) {
215
+ subprocess.stdout.on('data', (chunk) => {
216
+ const text = chunk.toString();
217
+ stdout += text;
218
+ // Always process lines for error extraction (even without onOutput callback)
219
+ lineBuffer += text;
220
+ const lines = lineBuffer.split('\n');
221
+ lineBuffer = lines.pop() || '';
222
+ for (const line of lines) {
223
+ if (!line.trim())
224
+ continue;
225
+ try {
226
+ const json = JSON.parse(line);
227
+ if (json.type === 'assistant' && json.message?.content) {
228
+ for (const block of json.message.content) {
229
+ if (block.type === 'text' && block.text) {
230
+ for (const textLine of block.text.split('\n')) {
231
+ if (textLine.trim()) {
232
+ onOutput?.(textLine);
233
+ // Capture API errors from output
234
+ if (textLine.includes('API Error:') || textLine.includes('rate limit') || textLine.includes('concurrency') ||
235
+ textLine.includes('OAuth token has expired') || textLine.includes('authentication_error')) {
236
+ extractedErrors.push(textLine.trim());
237
+ }
238
+ }
239
+ }
240
+ }
241
+ else if (block.type === 'tool_use') {
242
+ onOutput?.(`🔧 ${formatToolCall(block.name, block.input)}`);
243
+ }
244
+ }
245
+ }
246
+ else if (json.type === 'result' && json.result) {
247
+ onOutput?.(`✓ ${json.result.slice(0, 100)}`);
248
+ }
249
+ else if (json.type === 'error' && json.error) {
250
+ // Capture explicit error messages from JSON
251
+ const errorMsg = typeof json.error === 'string' ? json.error : JSON.stringify(json.error);
252
+ extractedErrors.push(errorMsg);
253
+ onOutput?.(`Error: ${errorMsg}`);
254
+ }
255
+ }
256
+ catch {
257
+ // Non-JSON output - check for API errors and token expiration
258
+ if (line.includes('API Error:') || line.includes('rate limit') || line.includes('concurrency') ||
259
+ line.includes('OAuth token has expired') || line.includes('authentication_error')) {
260
+ extractedErrors.push(line.trim());
261
+ }
262
+ onOutput?.(line);
263
+ }
264
+ }
265
+ });
266
+ }
267
+ if (subprocess.stderr) {
268
+ subprocess.stderr.on('data', (chunk) => {
269
+ stderr += chunk.toString();
270
+ });
271
+ }
272
+ let wasAborted = false;
273
+ let abortInterval = null;
274
+ if (shouldAbort) {
275
+ abortInterval = setInterval(() => {
276
+ if (shouldAbort()) {
277
+ wasAborted = true;
278
+ if (taskId) {
279
+ logger?.info('Aborting Claude Code execution (user requested)', { taskId });
280
+ }
281
+ subprocess.kill('SIGTERM');
282
+ setTimeout(() => {
283
+ if (!subprocess.killed) {
284
+ subprocess.kill('SIGKILL');
285
+ }
286
+ }, 1000);
287
+ }
288
+ }, 250);
289
+ }
290
+ const result = await subprocess;
291
+ if (abortInterval) {
292
+ clearInterval(abortInterval);
293
+ }
294
+ // Process any remaining content in the line buffer
295
+ if (lineBuffer.trim()) {
296
+ // Check for API errors and token expiration in remaining buffer
297
+ if (lineBuffer.includes('API Error:') || lineBuffer.includes('rate limit') || lineBuffer.includes('concurrency') ||
298
+ lineBuffer.includes('OAuth token has expired') || lineBuffer.includes('authentication_error')) {
299
+ extractedErrors.push(lineBuffer.trim());
300
+ }
301
+ onOutput?.(lineBuffer);
302
+ }
303
+ if (wasAborted) {
304
+ if (taskId) {
305
+ logger?.info('Claude Code execution was aborted', { taskId });
306
+ }
307
+ return {
308
+ success: false,
309
+ output: stdout,
310
+ error: 'Execution aborted by user',
311
+ exitCode: -2,
312
+ };
313
+ }
314
+ let errorMessage;
315
+ if (result.exitCode !== 0) {
316
+ // Priority for error message:
317
+ // 1. Extracted API/runtime errors from output (most specific)
318
+ // 2. stderr output
319
+ // 3. Cleaned execa message (without the full command which contains prompt)
320
+ // 4. Generic exit code message
321
+ if (extractedErrors.length > 0) {
322
+ // Use the most recent/relevant extracted error
323
+ errorMessage = extractedErrors[extractedErrors.length - 1];
324
+ }
325
+ else if (stderr) {
326
+ errorMessage = stderr;
327
+ }
328
+ else {
329
+ // Clean execa's message - it often includes the full command with prompt
330
+ // Extract just the error portion, not the command
331
+ const execaMessage = result.message
332
+ || result.shortMessage
333
+ || '';
334
+ // execa format: "Command failed with exit code X: /path/to/cmd args..."
335
+ // We want to keep just "Command failed with exit code X" or extract actual error
336
+ const cleanedMessage = execaMessage
337
+ .replace(/:\s*\/[^\s]+\s+--.*$/s, '') // Remove command path and arguments
338
+ .replace(/:\s*claude\s+--.*$/s, '') // Remove "claude --..." pattern
339
+ .trim();
340
+ errorMessage = cleanedMessage || `Process exited with code ${result.exitCode}`;
341
+ }
342
+ }
343
+ return {
344
+ success: result.exitCode === 0,
345
+ output: stdout,
346
+ error: errorMessage,
347
+ exitCode: result.exitCode ?? -1,
348
+ };
349
+ }
350
+ catch (error) {
351
+ const errorMessage = error instanceof Error ? error.message : String(error);
352
+ if (taskId) {
353
+ logger?.error('Claude Code execution exception', { taskId, error: errorMessage });
354
+ }
355
+ return {
356
+ success: false,
357
+ output: '',
358
+ error: errorMessage,
359
+ exitCode: -1,
360
+ };
361
+ }
362
+ }
363
+ /**
364
+ * Build the prompt for Claude Code with full project context
365
+ */
366
+ export function buildPrompt(task, context, projectContext, imageMetadata, projectPath) {
367
+ const parts = [];
368
+ // Project overview (if provided)
369
+ if (projectContext) {
370
+ parts.push('# Project Overview');
371
+ parts.push('');
372
+ parts.push(`**Project:** ${projectContext.projectName}`);
373
+ parts.push(`**Goal:** ${projectContext.goal}`);
374
+ parts.push(`**Progress:** Task ${projectContext.currentTaskIndex + 1} of ${projectContext.totalTasks}`);
375
+ parts.push('');
376
+ // Show completed tasks (brief summary)
377
+ if (projectContext.completedTasks.length > 0) {
378
+ parts.push('## Completed Tasks');
379
+ projectContext.completedTasks.forEach((t, i) => {
380
+ parts.push(`${i + 1}. ✓ ${t.title}`);
381
+ });
382
+ parts.push('');
383
+ }
384
+ // Show upcoming tasks (brief summary)
385
+ if (projectContext.pendingTasks.length > 0) {
386
+ parts.push('## Upcoming Tasks');
387
+ projectContext.pendingTasks.slice(0, 3).forEach((t, i) => {
388
+ parts.push(`${i + 1}. ${t.title}`);
389
+ });
390
+ if (projectContext.pendingTasks.length > 3) {
391
+ parts.push(` ... and ${projectContext.pendingTasks.length - 3} more`);
392
+ }
393
+ parts.push('');
394
+ }
395
+ parts.push('---');
396
+ parts.push('');
397
+ }
398
+ // Current task
399
+ parts.push(`# Current Task: ${task.title}`);
400
+ parts.push('');
401
+ parts.push('## Description');
402
+ parts.push(task.description);
403
+ parts.push('');
404
+ // Relevant files (paths only - Claude Code can read them)
405
+ if (context.files.length > 0) {
406
+ parts.push('## Relevant Files');
407
+ parts.push('');
408
+ parts.push('The following files are relevant to this task. Use the Read tool to examine them as needed:');
409
+ parts.push('');
410
+ parts.push(formatContext(context));
411
+ parts.push('');
412
+ }
413
+ // Reference images (if task has image references)
414
+ if (task.imageRefs && task.imageRefs.length > 0 && imageMetadata && projectPath) {
415
+ const referencedImages = task.imageRefs
416
+ .map(ref => {
417
+ const img = imageMetadata[ref];
418
+ if (!img)
419
+ return null;
420
+ // Compute absolute path for the image
421
+ const absolutePath = getImageAbsolutePath(projectPath, img.storagePath);
422
+ return { ...img, absolutePath };
423
+ })
424
+ .filter((img) => img !== null);
425
+ if (referencedImages.length > 0) {
426
+ parts.push('## Reference Images');
427
+ parts.push('');
428
+ parts.push('This task includes reference images. Use the Read tool to view them:');
429
+ parts.push('');
430
+ for (const img of referencedImages) {
431
+ parts.push(`- **${img.id}**: \`${img.absolutePath}\``);
432
+ if (img.description) {
433
+ parts.push(` Description: ${img.description}`);
434
+ }
435
+ }
436
+ parts.push('');
437
+ parts.push('**Important:** Review these images before implementing to ensure your work matches the visual requirements.');
438
+ parts.push('');
439
+ }
440
+ }
441
+ // Validation
442
+ if (task.testCommand) {
443
+ parts.push('## Validation');
444
+ parts.push(`After completing the task, run: \`${task.testCommand}\``);
445
+ parts.push('');
446
+ }
447
+ // Instructions
448
+ parts.push('## Instructions');
449
+ parts.push('1. Implement the changes described above');
450
+ parts.push('2. Make minimal, focused changes');
451
+ parts.push('3. Do not modify unrelated code');
452
+ parts.push('4. Ensure your changes align with the overall project goal');
453
+ if (task.testCommand) {
454
+ parts.push(`5. Verify your changes with: ${task.testCommand}`);
455
+ }
456
+ return parts.join('\n');
457
+ }
458
+ /**
459
+ * Execute a task using Claude Code CLI
460
+ */
461
+ export async function executeTask(task, context, options, projectContext, imageMetadata) {
462
+ const prompt = buildPrompt(task, context, projectContext, imageMetadata, options.cwd);
463
+ const logger = getLogger();
464
+ logger?.info('Executing Claude Code', {
465
+ taskId: task.id,
466
+ claudePath: getClaudePath(),
467
+ cwd: options.cwd,
468
+ promptLength: prompt.length,
469
+ });
470
+ // Log the full prompt to task log for visibility
471
+ logger?.taskPrompt(task.id, prompt);
472
+ const result = await runClaudeCode({
473
+ prompt,
474
+ cwd: options.cwd,
475
+ timeout: options.timeout ?? DEFAULT_TIMEOUT,
476
+ env: options.env,
477
+ onOutput: options.onOutput,
478
+ shouldAbort: options.shouldAbort,
479
+ taskId: task.id,
480
+ });
481
+ logger?.execution(task.id, `claude --print --dangerously-skip-permissions -p "..."`, result.exitCode, result.error);
482
+ if (result.exitCode !== 0 && result.error) {
483
+ logger?.error('Claude Code stderr', { taskId: task.id, stderr: result.error.slice(0, 500) });
484
+ }
485
+ return result;
486
+ }
487
+ /**
488
+ * Execute a task with retry feedback
489
+ */
490
+ export async function executeTaskWithFeedback(task, context, previousError, options, projectContext, imageMetadata) {
491
+ const basePrompt = buildPrompt(task, context, projectContext, imageMetadata, options.cwd);
492
+ // Build feedback section based on failure type
493
+ const feedbackParts = [
494
+ basePrompt,
495
+ '',
496
+ '## Previous Attempt Failed',
497
+ ];
498
+ if (task.failureType === 'acceptance') {
499
+ feedbackParts.push('The previous implementation was completed but **failed validation**. The code changes did not satisfy the acceptance criteria.', '', '### Validation Feedback', '```', previousError, '```', '', '### Instructions for This Retry', '1. Review the validation feedback above carefully', '2. Identify exactly what acceptance criteria were not met', '3. Make the **specific fixes** listed in the feedback', '4. Do NOT rewrite the entire implementation - only fix what failed', '5. Ensure your changes satisfy ALL acceptance criteria');
500
+ }
501
+ else {
502
+ feedbackParts.push('The previous attempt to complete this task failed during execution:', '', '```', previousError, '```', '', 'Please try again, addressing the error above.');
503
+ }
504
+ return runClaudeCode({
505
+ prompt: feedbackParts.join('\n'),
506
+ cwd: options.cwd,
507
+ timeout: options.timeout ?? DEFAULT_TIMEOUT,
508
+ env: options.env,
509
+ onOutput: options.onOutput,
510
+ shouldAbort: options.shouldAbort,
511
+ taskId: task.id,
512
+ });
513
+ }
514
+ /**
515
+ * Check if Claude Code CLI is available
516
+ */
517
+ export async function isClaudeCodeAvailable() {
518
+ try {
519
+ const result = await execa(getClaudePath(), ['--version'], { reject: false });
520
+ return result.exitCode === 0;
521
+ }
522
+ catch {
523
+ return false;
524
+ }
525
+ }
526
+ /**
527
+ * Get Claude Code version
528
+ */
529
+ export async function getClaudeCodeVersion() {
530
+ try {
531
+ const result = await execa(getClaudePath(), ['--version'], { reject: false });
532
+ if (result.exitCode === 0) {
533
+ const stdout = typeof result.stdout === 'string' ? result.stdout : '';
534
+ return stdout.trim();
535
+ }
536
+ return null;
537
+ }
538
+ catch {
539
+ return null;
540
+ }
541
+ }
542
+ /**
543
+ * Run Claude Code's /init command to create CLAUDE.md
544
+ * This command analyzes the project and creates a CLAUDE.md with project context
545
+ */
546
+ export async function runClaudeInit(options) {
547
+ const timeout = options.timeout ?? 120000; // 2 minutes default
548
+ // Create a clean environment for Claude Code CLI
549
+ const { ANTHROPIC_API_KEY: _excluded, ...cleanEnv } = process.env;
550
+ try {
551
+ const result = await execa(getClaudePath(), ['--print', '--dangerously-skip-permissions', '-p', '/init'], {
552
+ cwd: options.cwd,
553
+ timeout,
554
+ reject: false,
555
+ stdin: 'ignore',
556
+ env: cleanEnv,
557
+ });
558
+ const stdout = typeof result.stdout === 'string' ? result.stdout : '';
559
+ const stderr = typeof result.stderr === 'string' ? result.stderr : '';
560
+ if (result.exitCode !== 0) {
561
+ return {
562
+ success: false,
563
+ output: stdout,
564
+ error: stderr || `Claude /init exited with code ${result.exitCode}`,
565
+ exitCode: result.exitCode ?? -1,
566
+ };
567
+ }
568
+ return {
569
+ success: true,
570
+ output: stdout,
571
+ exitCode: 0,
572
+ };
573
+ }
574
+ catch (error) {
575
+ return {
576
+ success: false,
577
+ output: '',
578
+ error: error instanceof Error ? error.message : String(error),
579
+ exitCode: -1,
580
+ };
581
+ }
582
+ }
583
+ //# sourceMappingURL=executor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executor.js","sourceRoot":"","sources":["../src/executor.ts"],"names":[],"mappings":"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"}