@defai.digital/cli 13.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (138) hide show
  1. package/LICENSE +214 -0
  2. package/dist/bin.d.ts +3 -0
  3. package/dist/bin.d.ts.map +1 -0
  4. package/dist/bin.js +11 -0
  5. package/dist/bin.js.map +1 -0
  6. package/dist/bootstrap.d.ts +144 -0
  7. package/dist/bootstrap.d.ts.map +1 -0
  8. package/dist/bootstrap.js +315 -0
  9. package/dist/bootstrap.js.map +1 -0
  10. package/dist/cli.d.ts +14 -0
  11. package/dist/cli.d.ts.map +1 -0
  12. package/dist/cli.js +84 -0
  13. package/dist/cli.js.map +1 -0
  14. package/dist/commands/ability.d.ts +17 -0
  15. package/dist/commands/ability.d.ts.map +1 -0
  16. package/dist/commands/ability.js +286 -0
  17. package/dist/commands/ability.js.map +1 -0
  18. package/dist/commands/agent.d.ts +18 -0
  19. package/dist/commands/agent.d.ts.map +1 -0
  20. package/dist/commands/agent.js +361 -0
  21. package/dist/commands/agent.js.map +1 -0
  22. package/dist/commands/call.d.ts +15 -0
  23. package/dist/commands/call.d.ts.map +1 -0
  24. package/dist/commands/call.js +503 -0
  25. package/dist/commands/call.js.map +1 -0
  26. package/dist/commands/cleanup.d.ts +18 -0
  27. package/dist/commands/cleanup.d.ts.map +1 -0
  28. package/dist/commands/cleanup.js +300 -0
  29. package/dist/commands/cleanup.js.map +1 -0
  30. package/dist/commands/config.d.ts +16 -0
  31. package/dist/commands/config.d.ts.map +1 -0
  32. package/dist/commands/config.js +513 -0
  33. package/dist/commands/config.js.map +1 -0
  34. package/dist/commands/discuss.d.ts +16 -0
  35. package/dist/commands/discuss.d.ts.map +1 -0
  36. package/dist/commands/discuss.js +700 -0
  37. package/dist/commands/discuss.js.map +1 -0
  38. package/dist/commands/doctor.d.ts +48 -0
  39. package/dist/commands/doctor.d.ts.map +1 -0
  40. package/dist/commands/doctor.js +356 -0
  41. package/dist/commands/doctor.js.map +1 -0
  42. package/dist/commands/guard.d.ts +12 -0
  43. package/dist/commands/guard.d.ts.map +1 -0
  44. package/dist/commands/guard.js +225 -0
  45. package/dist/commands/guard.js.map +1 -0
  46. package/dist/commands/help.d.ts +11 -0
  47. package/dist/commands/help.d.ts.map +1 -0
  48. package/dist/commands/help.js +180 -0
  49. package/dist/commands/help.js.map +1 -0
  50. package/dist/commands/history.d.ts +19 -0
  51. package/dist/commands/history.d.ts.map +1 -0
  52. package/dist/commands/history.js +200 -0
  53. package/dist/commands/history.js.map +1 -0
  54. package/dist/commands/index.d.ts +23 -0
  55. package/dist/commands/index.d.ts.map +1 -0
  56. package/dist/commands/index.js +26 -0
  57. package/dist/commands/index.js.map +1 -0
  58. package/dist/commands/iterate.d.ts +16 -0
  59. package/dist/commands/iterate.d.ts.map +1 -0
  60. package/dist/commands/iterate.js +72 -0
  61. package/dist/commands/iterate.js.map +1 -0
  62. package/dist/commands/list.d.ts +6 -0
  63. package/dist/commands/list.d.ts.map +1 -0
  64. package/dist/commands/list.js +62 -0
  65. package/dist/commands/list.js.map +1 -0
  66. package/dist/commands/mcp.d.ts +16 -0
  67. package/dist/commands/mcp.d.ts.map +1 -0
  68. package/dist/commands/mcp.js +57 -0
  69. package/dist/commands/mcp.js.map +1 -0
  70. package/dist/commands/resume.d.ts +18 -0
  71. package/dist/commands/resume.d.ts.map +1 -0
  72. package/dist/commands/resume.js +208 -0
  73. package/dist/commands/resume.js.map +1 -0
  74. package/dist/commands/review.d.ts +13 -0
  75. package/dist/commands/review.d.ts.map +1 -0
  76. package/dist/commands/review.js +450 -0
  77. package/dist/commands/review.js.map +1 -0
  78. package/dist/commands/run.d.ts +6 -0
  79. package/dist/commands/run.d.ts.map +1 -0
  80. package/dist/commands/run.js +158 -0
  81. package/dist/commands/run.js.map +1 -0
  82. package/dist/commands/scaffold.d.ts +20 -0
  83. package/dist/commands/scaffold.d.ts.map +1 -0
  84. package/dist/commands/scaffold.js +924 -0
  85. package/dist/commands/scaffold.js.map +1 -0
  86. package/dist/commands/session.d.ts +20 -0
  87. package/dist/commands/session.d.ts.map +1 -0
  88. package/dist/commands/session.js +504 -0
  89. package/dist/commands/session.js.map +1 -0
  90. package/dist/commands/setup.d.ts +14 -0
  91. package/dist/commands/setup.d.ts.map +1 -0
  92. package/dist/commands/setup.js +762 -0
  93. package/dist/commands/setup.js.map +1 -0
  94. package/dist/commands/status.d.ts +17 -0
  95. package/dist/commands/status.d.ts.map +1 -0
  96. package/dist/commands/status.js +227 -0
  97. package/dist/commands/status.js.map +1 -0
  98. package/dist/commands/trace.d.ts +6 -0
  99. package/dist/commands/trace.d.ts.map +1 -0
  100. package/dist/commands/trace.js +204 -0
  101. package/dist/commands/trace.js.map +1 -0
  102. package/dist/commands/update.d.ts +24 -0
  103. package/dist/commands/update.d.ts.map +1 -0
  104. package/dist/commands/update.js +296 -0
  105. package/dist/commands/update.js.map +1 -0
  106. package/dist/index.d.ts +8 -0
  107. package/dist/index.d.ts.map +1 -0
  108. package/dist/index.js +13 -0
  109. package/dist/index.js.map +1 -0
  110. package/dist/parser.d.ts +14 -0
  111. package/dist/parser.d.ts.map +1 -0
  112. package/dist/parser.js +288 -0
  113. package/dist/parser.js.map +1 -0
  114. package/dist/types.d.ts +91 -0
  115. package/dist/types.d.ts.map +1 -0
  116. package/dist/types.js +29 -0
  117. package/dist/types.js.map +1 -0
  118. package/dist/utils/dangerous-op-guard.d.ts +33 -0
  119. package/dist/utils/dangerous-op-guard.d.ts.map +1 -0
  120. package/dist/utils/dangerous-op-guard.js +112 -0
  121. package/dist/utils/dangerous-op-guard.js.map +1 -0
  122. package/dist/utils/database.d.ts +85 -0
  123. package/dist/utils/database.d.ts.map +1 -0
  124. package/dist/utils/database.js +184 -0
  125. package/dist/utils/database.js.map +1 -0
  126. package/dist/utils/index.d.ts +7 -0
  127. package/dist/utils/index.d.ts.map +1 -0
  128. package/dist/utils/index.js +7 -0
  129. package/dist/utils/index.js.map +1 -0
  130. package/dist/utils/provider-factory.d.ts +31 -0
  131. package/dist/utils/provider-factory.d.ts.map +1 -0
  132. package/dist/utils/provider-factory.js +109 -0
  133. package/dist/utils/provider-factory.js.map +1 -0
  134. package/dist/utils/storage-instances.d.ts +19 -0
  135. package/dist/utils/storage-instances.d.ts.map +1 -0
  136. package/dist/utils/storage-instances.js +20 -0
  137. package/dist/utils/storage-instances.js.map +1 -0
  138. package/package.json +77 -0
@@ -0,0 +1,450 @@
1
+ /**
2
+ * Review Command
3
+ *
4
+ * AI-powered code review with focused analysis modes.
5
+ * Usage: ax review <paths...> [options]
6
+ * ax review help
7
+ */
8
+ import { createReviewService, } from '@defai.digital/review-domain';
9
+ import { ReviewFocusSchema, ReviewErrorCode, TIMEOUT_PROVIDER_DEFAULT, CONFIDENCE_DEFAULT_MIN, ANALYSIS_MAX_FILES_DEFAULT, } from '@defai.digital/contracts';
10
+ import { createAnalysisProviderRouter } from '../utils/provider-factory.js';
11
+ /**
12
+ * ANSI color codes for terminal output
13
+ */
14
+ const COLORS = {
15
+ reset: '\x1b[0m',
16
+ green: '\x1b[32m',
17
+ red: '\x1b[31m',
18
+ yellow: '\x1b[33m',
19
+ cyan: '\x1b[36m',
20
+ blue: '\x1b[34m',
21
+ magenta: '\x1b[35m',
22
+ bold: '\x1b[1m',
23
+ dim: '\x1b[2m',
24
+ };
25
+ /**
26
+ * Status icons
27
+ */
28
+ const ICONS = {
29
+ critical: `${COLORS.red}✖${COLORS.reset}`,
30
+ warning: `${COLORS.yellow}⚠${COLORS.reset}`,
31
+ suggestion: `${COLORS.blue}◉${COLORS.reset}`,
32
+ note: `${COLORS.dim}ℹ${COLORS.reset}`,
33
+ check: `${COLORS.green}✓${COLORS.reset}`,
34
+ file: `${COLORS.cyan}▸${COLORS.reset}`,
35
+ };
36
+ /**
37
+ * Parses review subcommand and options
38
+ */
39
+ function parseReviewArgs(args) {
40
+ const subcommand = args[0] ?? 'help';
41
+ const paths = [];
42
+ let focus = 'all';
43
+ let minConfidence = CONFIDENCE_DEFAULT_MIN;
44
+ let maxFiles = ANALYSIS_MAX_FILES_DEFAULT;
45
+ let maxLinesPerFile = 500;
46
+ let context;
47
+ let providerId;
48
+ let timeoutMs = TIMEOUT_PROVIDER_DEFAULT;
49
+ let outputFormat = 'markdown';
50
+ let dryRun = false;
51
+ for (let i = 1; i < args.length; i++) {
52
+ const arg = args[i];
53
+ if (arg === '--focus' && i + 1 < args.length) {
54
+ const focusArg = args[++i];
55
+ const parsed = ReviewFocusSchema.safeParse(focusArg);
56
+ if (parsed.success) {
57
+ focus = parsed.data;
58
+ }
59
+ }
60
+ else if (arg === '--min-confidence' && i + 1 < args.length) {
61
+ minConfidence = parseFloat(args[++i]);
62
+ }
63
+ else if (arg === '--max-files' && i + 1 < args.length) {
64
+ maxFiles = parseInt(args[++i], 10);
65
+ }
66
+ else if (arg === '--max-lines' && i + 1 < args.length) {
67
+ maxLinesPerFile = parseInt(args[++i], 10);
68
+ }
69
+ else if (arg === '--context' && i + 1 < args.length) {
70
+ context = args[++i];
71
+ }
72
+ else if (arg === '--provider' && i + 1 < args.length) {
73
+ providerId = args[++i];
74
+ }
75
+ else if (arg === '--timeout' && i + 1 < args.length) {
76
+ timeoutMs = parseInt(args[++i], 10) * 1000;
77
+ }
78
+ else if (arg === '--format' && i + 1 < args.length) {
79
+ const fmt = args[++i];
80
+ if (fmt === 'markdown' || fmt === 'json' || fmt === 'sarif') {
81
+ outputFormat = fmt;
82
+ }
83
+ }
84
+ else if (arg === '--dry-run') {
85
+ dryRun = true;
86
+ }
87
+ else if (arg !== undefined && !arg.startsWith('-')) {
88
+ // Positional arg is a path
89
+ paths.push(arg);
90
+ }
91
+ }
92
+ return {
93
+ subcommand,
94
+ paths,
95
+ focus,
96
+ minConfidence,
97
+ maxFiles,
98
+ maxLinesPerFile,
99
+ context,
100
+ providerId,
101
+ timeoutMs,
102
+ outputFormat,
103
+ dryRun,
104
+ };
105
+ }
106
+ /**
107
+ * Shows review help
108
+ */
109
+ function showReviewHelp() {
110
+ const helpText = `
111
+ ${COLORS.bold}AX Review - AI-Powered Code Review${COLORS.reset}
112
+
113
+ Usage:
114
+ ax review <paths...> [options]
115
+ ax review help
116
+
117
+ Options:
118
+ --focus <mode> Focus mode: security, architecture, performance,
119
+ maintainability, correctness, all (default: all)
120
+ --min-confidence <n> Minimum confidence threshold 0-1 (default: 0.7)
121
+ --max-files <n> Maximum files to analyze (default: 20)
122
+ --max-lines <n> Max lines per file (default: 500)
123
+ --context <text> Additional context for the review
124
+ --provider <id> Specific provider to use
125
+ --timeout <seconds> Review timeout (default: 120)
126
+ --format <fmt> Output format: markdown, json, sarif (default: markdown)
127
+ --dry-run Only show what would be analyzed
128
+
129
+ Focus Modes:
130
+ ${COLORS.red}security${COLORS.reset} OWASP Top 10, injection, auth issues
131
+ ${COLORS.magenta}architecture${COLORS.reset} SRP, coupling, dependency issues
132
+ ${COLORS.yellow}performance${COLORS.reset} N+1 queries, memory leaks, complexity
133
+ ${COLORS.cyan}maintainability${COLORS.reset} Code smells, duplication, naming
134
+ ${COLORS.blue}correctness${COLORS.reset} Logic errors, edge cases, null handling
135
+ ${COLORS.green}all${COLORS.reset} Comprehensive review (default)
136
+
137
+ Severity Levels:
138
+ ${ICONS.critical} critical Must fix - security vulnerability, data loss risk
139
+ ${ICONS.warning} warning Should fix - potential bug, bad practice
140
+ ${ICONS.suggestion} suggestion Could improve - enhancement opportunity
141
+ ${ICONS.note} note Informational - observation, documentation
142
+
143
+ Output Formats:
144
+ markdown Human-readable report (default)
145
+ json Structured JSON for processing
146
+ sarif SARIF 2.1.0 for CI integration
147
+
148
+ Examples:
149
+ ax review src/ # Review all code in src/
150
+ ax review src/ --focus security # Security-focused review
151
+ ax review src/api/ --focus performance # Performance review of API
152
+ ax review src/ --dry-run # Preview what would be analyzed
153
+ ax review src/ --format sarif > report.sarif # SARIF output for CI
154
+ ax review src/ --min-confidence 0.9 # Only high-confidence findings
155
+ `.trim();
156
+ return {
157
+ success: true,
158
+ message: helpText,
159
+ data: undefined,
160
+ exitCode: 0,
161
+ };
162
+ }
163
+ /**
164
+ * Creates a prompt executor that uses the provider router
165
+ */
166
+ function createPromptExecutor() {
167
+ const router = createAnalysisProviderRouter();
168
+ return {
169
+ async execute(prompt, options) {
170
+ // Get provider - either specific one or select best available
171
+ const provider = options.providerId
172
+ ? await router.getProvider(options.providerId)
173
+ : await router.selectProvider('review');
174
+ // Execute the prompt
175
+ const response = await provider.complete({
176
+ prompt,
177
+ maxTokens: 16000,
178
+ temperature: 0.3,
179
+ });
180
+ return {
181
+ content: response.content,
182
+ providerId: provider.id,
183
+ modelId: provider.id, // Provider adapters don't expose model ID separately
184
+ };
185
+ },
186
+ };
187
+ }
188
+ /**
189
+ * Formats review result for CLI text output
190
+ */
191
+ function formatReviewResultForCLI(result, verbose) {
192
+ const lines = [];
193
+ const { summary, comments, filesReviewed, linesAnalyzed, providerId, durationMs } = result;
194
+ // Header
195
+ lines.push('');
196
+ lines.push(`${COLORS.bold}Code Review Report${COLORS.reset}`);
197
+ lines.push(`${COLORS.dim}────────────────────────────────────────${COLORS.reset}`);
198
+ // Metadata
199
+ const focusMode = comments.length > 0 && comments[0] ? comments[0].focus : 'all';
200
+ lines.push(`Focus: ${COLORS.cyan}${focusMode}${COLORS.reset} | Files: ${filesReviewed.length} | Lines: ${linesAnalyzed.toLocaleString()}`);
201
+ lines.push(`Provider: ${providerId} | Duration: ${formatDuration(durationMs)}`);
202
+ lines.push('');
203
+ // Summary
204
+ lines.push(`${COLORS.bold}Summary${COLORS.reset}`);
205
+ const severityParts = [];
206
+ if (summary.bySeverity.critical > 0) {
207
+ severityParts.push(`${ICONS.critical} ${summary.bySeverity.critical} critical`);
208
+ }
209
+ if (summary.bySeverity.warning > 0) {
210
+ severityParts.push(`${ICONS.warning} ${summary.bySeverity.warning} warning`);
211
+ }
212
+ if (summary.bySeverity.suggestion > 0) {
213
+ severityParts.push(`${ICONS.suggestion} ${summary.bySeverity.suggestion} suggestion`);
214
+ }
215
+ if (summary.bySeverity.note > 0) {
216
+ severityParts.push(`${ICONS.note} ${summary.bySeverity.note} note`);
217
+ }
218
+ if (severityParts.length > 0) {
219
+ lines.push(severityParts.join(' | '));
220
+ }
221
+ else {
222
+ lines.push(`${ICONS.check} No issues found`);
223
+ }
224
+ // Health score
225
+ const healthColor = summary.healthScore >= 80 ? COLORS.green : summary.healthScore >= 50 ? COLORS.yellow : COLORS.red;
226
+ lines.push(`Health Score: ${healthColor}${summary.healthScore}/100${COLORS.reset}`);
227
+ lines.push(`${COLORS.dim}${summary.verdict}${COLORS.reset}`);
228
+ lines.push('');
229
+ if (comments.length === 0) {
230
+ return lines.join('\n');
231
+ }
232
+ // Group comments by severity
233
+ const critical = comments.filter((c) => c.severity === 'critical');
234
+ const warnings = comments.filter((c) => c.severity === 'warning');
235
+ const suggestions = comments.filter((c) => c.severity === 'suggestion');
236
+ const notes = comments.filter((c) => c.severity === 'note');
237
+ // Critical Issues
238
+ if (critical.length > 0) {
239
+ lines.push(`${COLORS.red}${COLORS.bold}Critical Issues${COLORS.reset}`);
240
+ lines.push(`${COLORS.dim}────────────────────────────────────────${COLORS.reset}`);
241
+ for (const comment of critical) {
242
+ lines.push(...formatCommentForCLI(comment, verbose, 'critical'));
243
+ }
244
+ }
245
+ // Warnings
246
+ if (warnings.length > 0) {
247
+ lines.push(`${COLORS.yellow}${COLORS.bold}Warnings${COLORS.reset}`);
248
+ lines.push(`${COLORS.dim}────────────────────────────────────────${COLORS.reset}`);
249
+ for (const comment of warnings) {
250
+ lines.push(...formatCommentForCLI(comment, verbose, 'warning'));
251
+ }
252
+ }
253
+ // Suggestions
254
+ if (suggestions.length > 0) {
255
+ lines.push(`${COLORS.blue}${COLORS.bold}Suggestions${COLORS.reset}`);
256
+ lines.push(`${COLORS.dim}────────────────────────────────────────${COLORS.reset}`);
257
+ for (const comment of suggestions) {
258
+ lines.push(...formatCommentForCLI(comment, verbose, 'suggestion'));
259
+ }
260
+ }
261
+ // Notes (only in verbose mode)
262
+ if (verbose && notes.length > 0) {
263
+ lines.push(`${COLORS.dim}${COLORS.bold}Notes${COLORS.reset}`);
264
+ lines.push(`${COLORS.dim}────────────────────────────────────────${COLORS.reset}`);
265
+ for (const comment of notes) {
266
+ lines.push(...formatCommentForCLI(comment, verbose, 'note'));
267
+ }
268
+ }
269
+ return lines.join('\n');
270
+ }
271
+ /**
272
+ * Formats a single comment for CLI output
273
+ */
274
+ function formatCommentForCLI(comment, verbose, severity) {
275
+ const lines = [];
276
+ const icon = ICONS[severity];
277
+ const location = comment.lineEnd
278
+ ? `${comment.file}:${comment.line}-${comment.lineEnd}`
279
+ : `${comment.file}:${comment.line}`;
280
+ lines.push(`${icon} ${COLORS.bold}${comment.title}${COLORS.reset}`);
281
+ lines.push(` ${ICONS.file} ${COLORS.cyan}${location}${COLORS.reset}`);
282
+ lines.push(` ${COLORS.dim}Category: ${comment.category} | Confidence: ${Math.round(comment.confidence * 100)}%${COLORS.reset}`);
283
+ if (verbose) {
284
+ lines.push('');
285
+ lines.push(` ${comment.body}`);
286
+ if (comment.rationale) {
287
+ lines.push(` ${COLORS.dim}Why: ${comment.rationale}${COLORS.reset}`);
288
+ }
289
+ if (comment.suggestion) {
290
+ lines.push(` ${COLORS.green}Suggestion: ${comment.suggestion}${COLORS.reset}`);
291
+ }
292
+ if (comment.suggestedCode) {
293
+ lines.push(` ${COLORS.dim}Suggested fix:${COLORS.reset}`);
294
+ lines.push(` ${COLORS.cyan}${comment.suggestedCode}${COLORS.reset}`);
295
+ }
296
+ }
297
+ lines.push('');
298
+ return lines;
299
+ }
300
+ /**
301
+ * Format duration in human-readable format
302
+ */
303
+ function formatDuration(ms) {
304
+ if (ms < 1000) {
305
+ return `${ms}ms`;
306
+ }
307
+ const seconds = Math.round(ms / 1000);
308
+ if (seconds < 60) {
309
+ return `${seconds}s`;
310
+ }
311
+ const minutes = Math.floor(seconds / 60);
312
+ const remainingSeconds = seconds % 60;
313
+ return `${minutes}m ${remainingSeconds}s`;
314
+ }
315
+ /**
316
+ * Runs code review
317
+ */
318
+ async function runReview(paths, options, args) {
319
+ if (paths.length === 0) {
320
+ return {
321
+ success: false,
322
+ message: 'Error: At least one path is required\n\nRun "ax review help" for usage.',
323
+ data: undefined,
324
+ exitCode: 1,
325
+ };
326
+ }
327
+ try {
328
+ const promptExecutor = createPromptExecutor();
329
+ const service = createReviewService({
330
+ defaultProvider: args.providerId ?? 'claude',
331
+ defaultTimeoutMs: args.timeoutMs,
332
+ providerFallbackOrder: ['claude', 'gemini', 'codex'],
333
+ }, promptExecutor);
334
+ // Handle dry run
335
+ if (args.dryRun) {
336
+ const dryRunResult = await service.dryRun({
337
+ requestId: crypto.randomUUID(),
338
+ paths,
339
+ focus: args.focus,
340
+ minConfidence: args.minConfidence,
341
+ maxFiles: args.maxFiles,
342
+ maxLinesPerFile: args.maxLinesPerFile,
343
+ context: args.context,
344
+ providerId: args.providerId,
345
+ timeoutMs: args.timeoutMs,
346
+ outputFormat: args.outputFormat,
347
+ dryRun: true,
348
+ });
349
+ const message = `
350
+ ${COLORS.bold}Dry Run - Would Analyze:${COLORS.reset}
351
+ Focus: ${COLORS.cyan}${args.focus}${COLORS.reset}
352
+ Files: ${dryRunResult.files.length}
353
+ Lines: ${dryRunResult.totalLines.toLocaleString()}
354
+ Estimated time: ${formatDuration(dryRunResult.estimatedDurationMs)}
355
+
356
+ ${COLORS.bold}Files:${COLORS.reset}
357
+ ${dryRunResult.files.map((f) => ` ${ICONS.file} ${f}`).join('\n')}
358
+ `.trim();
359
+ return {
360
+ success: true,
361
+ message,
362
+ data: dryRunResult,
363
+ exitCode: 0,
364
+ };
365
+ }
366
+ // Run actual review
367
+ const result = await service.review({
368
+ requestId: crypto.randomUUID(),
369
+ paths,
370
+ focus: args.focus,
371
+ minConfidence: args.minConfidence,
372
+ maxFiles: args.maxFiles,
373
+ maxLinesPerFile: args.maxLinesPerFile,
374
+ context: args.context,
375
+ providerId: args.providerId,
376
+ timeoutMs: args.timeoutMs,
377
+ outputFormat: args.outputFormat,
378
+ dryRun: false,
379
+ });
380
+ // Format output based on requested format
381
+ if (args.outputFormat === 'json' || options.format === 'json') {
382
+ return {
383
+ success: true,
384
+ message: undefined,
385
+ data: result,
386
+ exitCode: 0,
387
+ };
388
+ }
389
+ if (args.outputFormat === 'sarif') {
390
+ return {
391
+ success: true,
392
+ message: service.formatResult(result, 'sarif'),
393
+ data: result,
394
+ exitCode: 0,
395
+ };
396
+ }
397
+ if (args.outputFormat === 'markdown') {
398
+ return {
399
+ success: true,
400
+ message: service.formatResult(result, 'markdown'),
401
+ data: result,
402
+ exitCode: 0,
403
+ };
404
+ }
405
+ // Default: CLI formatted output
406
+ return {
407
+ success: true,
408
+ message: formatReviewResultForCLI(result, options.verbose),
409
+ data: result,
410
+ exitCode: 0,
411
+ };
412
+ }
413
+ catch (error) {
414
+ const message = error instanceof Error ? error.message : 'Unknown error during review';
415
+ const errorCode = error instanceof Error && 'code' in error ? error.code : 'UNKNOWN';
416
+ let userMessage = `${ICONS.critical} Review failed: ${message}`;
417
+ if (errorCode === ReviewErrorCode.TIMEOUT) {
418
+ userMessage += '\n\nTip: Try reducing --max-files or increasing --timeout';
419
+ }
420
+ else if (errorCode === ReviewErrorCode.NO_FILES_FOUND) {
421
+ userMessage += '\n\nTip: Check that the paths exist and contain source files';
422
+ }
423
+ else if (errorCode === ReviewErrorCode.PROVIDER_UNAVAILABLE) {
424
+ userMessage += '\n\nTip: Check that the provider CLI is installed and configured';
425
+ }
426
+ return {
427
+ success: false,
428
+ message: userMessage,
429
+ data: undefined,
430
+ exitCode: 1,
431
+ };
432
+ }
433
+ }
434
+ /**
435
+ * Review command handler
436
+ */
437
+ export async function reviewCommand(args, options) {
438
+ const parsed = parseReviewArgs(args);
439
+ // If first arg is a path (not "help"), treat it as a review command
440
+ if (parsed.subcommand !== 'help' && !parsed.subcommand.startsWith('-')) {
441
+ // Subcommand is actually a path
442
+ if (parsed.subcommand !== 'help') {
443
+ parsed.paths.unshift(parsed.subcommand);
444
+ }
445
+ return runReview(parsed.paths, options, parsed);
446
+ }
447
+ // Help command
448
+ return showReviewHelp();
449
+ }
450
+ //# sourceMappingURL=review.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review.js","sourceRoot":"","sources":["../../src/commands/review.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { CommandResult, CLIOptions } from '../types.js';
2
+ /**
3
+ * Handles the 'run' command - executes a workflow
4
+ */
5
+ export declare function runCommand(args: string[], options: CLIOptions): Promise<CommandResult>;
6
+ //# sourceMappingURL=run.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAc7D;;GAEG;AACH,wBAAsB,UAAU,CAC9B,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,EAAE,UAAU,GAClB,OAAO,CAAC,aAAa,CAAC,CAgIxB"}
@@ -0,0 +1,158 @@
1
+ import { createWorkflowRunner, createWorkflowLoader, findWorkflowDir, defaultStepExecutor, } from '@defai.digital/workflow-engine';
2
+ import { getStepExecutor } from '../bootstrap.js';
3
+ // Check if we're in test environment
4
+ const isTestEnv = process.env.VITEST === 'true' || process.env.NODE_ENV === 'test';
5
+ /**
6
+ * Handles the 'run' command - executes a workflow
7
+ */
8
+ export async function runCommand(args, options) {
9
+ const workflowId = args[0] ?? options.workflowId;
10
+ if (workflowId === undefined) {
11
+ return {
12
+ success: false,
13
+ message: 'Workflow ID is required. Usage: ax run <workflow-id>',
14
+ data: undefined,
15
+ exitCode: 1,
16
+ };
17
+ }
18
+ try {
19
+ // Find workflow directory
20
+ const workflowDir = options.workflowDir ?? findWorkflowDir(process.cwd());
21
+ if (!workflowDir) {
22
+ return {
23
+ success: false,
24
+ message: 'No workflow directory found. Create examples/workflows/ or use --workflow-dir.',
25
+ data: undefined,
26
+ exitCode: 1,
27
+ };
28
+ }
29
+ // Load workflow from file
30
+ const loader = createWorkflowLoader({ workflowsDir: workflowDir });
31
+ const workflow = await loader.load(workflowId);
32
+ if (!workflow) {
33
+ // Try to list available workflows for help
34
+ const available = await loader.loadAll();
35
+ const ids = available.map(w => w.workflowId).slice(0, 5).join(', ');
36
+ return {
37
+ success: false,
38
+ message: `Workflow "${workflowId}" not found.\n\nAvailable workflows: ${ids}${available.length > 5 ? '...' : ''}\nRun 'ax list' to see all workflows.`,
39
+ data: undefined,
40
+ exitCode: 1,
41
+ };
42
+ }
43
+ // Parse input JSON if provided
44
+ let input = {};
45
+ if (options.input) {
46
+ try {
47
+ input = JSON.parse(options.input);
48
+ }
49
+ catch {
50
+ return {
51
+ success: false,
52
+ message: 'Invalid JSON in --input parameter',
53
+ data: undefined,
54
+ exitCode: 1,
55
+ };
56
+ }
57
+ }
58
+ if (options.verbose) {
59
+ console.log(`Loading workflow: ${workflow.workflowId}`);
60
+ console.log(` Name: ${workflow.name ?? workflowId}`);
61
+ console.log(` Version: ${workflow.version}`);
62
+ console.log(` Steps: ${workflow.steps.length}`);
63
+ console.log('');
64
+ }
65
+ // Create workflow runner with step execution logging
66
+ const runner = createWorkflowRunner({
67
+ stepExecutor: createLoggingStepExecutor(options.verbose ?? false),
68
+ onStepStart: options.verbose
69
+ ? (step) => { console.log(` → Starting step: ${step.stepId} (${step.type})`); }
70
+ : undefined,
71
+ onStepComplete: options.verbose
72
+ ? (step, result) => { console.log(` ${result.success ? '✓' : '✗'} Completed: ${step.stepId} (${result.durationMs}ms)`); }
73
+ : undefined,
74
+ });
75
+ if (options.verbose) {
76
+ console.log('Executing workflow...\n');
77
+ }
78
+ // Execute workflow
79
+ const result = await runner.run(workflow, input);
80
+ // Format result message
81
+ const duration = (result.totalDurationMs / 1000).toFixed(2);
82
+ const stepSummary = result.stepResults.map(s => `${s.stepId}: ${s.success ? '✓' : '✗'}`).join(', ');
83
+ if (result.success) {
84
+ return {
85
+ success: true,
86
+ message: `Workflow "${workflowId}" completed successfully in ${duration}s\n\nSteps: ${stepSummary}`,
87
+ data: {
88
+ workflowId,
89
+ success: true,
90
+ durationMs: result.totalDurationMs,
91
+ output: result.output,
92
+ steps: result.stepResults.map((s) => ({
93
+ stepId: s.stepId,
94
+ success: s.success,
95
+ durationMs: s.durationMs,
96
+ })),
97
+ },
98
+ exitCode: 0,
99
+ };
100
+ }
101
+ else {
102
+ return {
103
+ success: false,
104
+ message: `Workflow "${workflowId}" failed: ${result.error?.message ?? 'Unknown error'}\n\nSteps: ${stepSummary}`,
105
+ data: {
106
+ workflowId,
107
+ success: false,
108
+ error: result.error,
109
+ steps: result.stepResults.map((s) => ({
110
+ stepId: s.stepId,
111
+ success: s.success,
112
+ error: s.error?.message,
113
+ })),
114
+ },
115
+ exitCode: 1,
116
+ };
117
+ }
118
+ }
119
+ catch (error) {
120
+ return {
121
+ success: false,
122
+ message: `Failed to run workflow: ${error instanceof Error ? error.message : 'Unknown error'}`,
123
+ data: undefined,
124
+ exitCode: 1,
125
+ };
126
+ }
127
+ }
128
+ /**
129
+ * Creates a step executor that logs progress
130
+ * Uses the production step executor for real LLM calls in production,
131
+ * or the default placeholder executor in test environments.
132
+ */
133
+ function createLoggingStepExecutor(verbose) {
134
+ // Use placeholder executor in test environment to avoid real LLM calls
135
+ const baseExecutor = isTestEnv
136
+ ? defaultStepExecutor
137
+ : getStepExecutor({
138
+ defaultProvider: 'claude',
139
+ defaultTimeout: 120000,
140
+ checkProviderHealth: false,
141
+ });
142
+ return async (step, context) => {
143
+ // Execute step (real LLM in prod, placeholder in tests)
144
+ const result = await baseExecutor(step, context);
145
+ // In verbose mode, show step details
146
+ if (verbose && result.output) {
147
+ const outputStr = JSON.stringify(result.output, null, 2);
148
+ if (outputStr.length < 500) {
149
+ console.log(` Output: ${outputStr.replace(/\n/g, '\n ')}`);
150
+ }
151
+ else {
152
+ console.log(` Output: (${outputStr.length} chars)`);
153
+ }
154
+ }
155
+ return result;
156
+ };
157
+ }
158
+ //# sourceMappingURL=run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"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"}