@kodus/cli 0.0.11 → 0.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 (150) hide show
  1. package/README.md +387 -0
  2. package/dist/cli.d.ts +4 -0
  3. package/dist/cli.d.ts.map +1 -0
  4. package/dist/cli.js +26 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/commands/auth/index.d.ts +3 -0
  7. package/dist/commands/auth/index.d.ts.map +1 -0
  8. package/dist/commands/auth/index.js +36 -0
  9. package/dist/commands/auth/index.js.map +1 -0
  10. package/dist/commands/auth/login.d.ts +7 -0
  11. package/dist/commands/auth/login.d.ts.map +1 -0
  12. package/dist/commands/auth/login.js +97 -0
  13. package/dist/commands/auth/login.js.map +1 -0
  14. package/dist/commands/auth/logout.d.ts +2 -0
  15. package/dist/commands/auth/logout.d.ts.map +1 -0
  16. package/dist/commands/auth/logout.js +24 -0
  17. package/dist/commands/auth/logout.js.map +1 -0
  18. package/dist/commands/auth/signup.d.ts +2 -0
  19. package/dist/commands/auth/signup.d.ts.map +1 -0
  20. package/dist/commands/auth/signup.js +74 -0
  21. package/dist/commands/auth/signup.js.map +1 -0
  22. package/dist/commands/auth/status.d.ts +2 -0
  23. package/dist/commands/auth/status.d.ts.map +1 -0
  24. package/dist/commands/auth/status.js +91 -0
  25. package/dist/commands/auth/status.js.map +1 -0
  26. package/dist/commands/auth/team-key.d.ts +5 -0
  27. package/dist/commands/auth/team-key.d.ts.map +1 -0
  28. package/dist/commands/auth/team-key.js +59 -0
  29. package/dist/commands/auth/team-key.js.map +1 -0
  30. package/dist/commands/auth/token.d.ts +2 -0
  31. package/dist/commands/auth/token.d.ts.map +1 -0
  32. package/dist/commands/auth/token.js +31 -0
  33. package/dist/commands/auth/token.js.map +1 -0
  34. package/dist/commands/config.d.ts +3 -0
  35. package/dist/commands/config.d.ts.map +1 -0
  36. package/dist/commands/config.js +47 -0
  37. package/dist/commands/config.js.map +1 -0
  38. package/dist/commands/pr.d.ts +3 -0
  39. package/dist/commands/pr.d.ts.map +1 -0
  40. package/dist/commands/pr.js +75 -0
  41. package/dist/commands/pr.js.map +1 -0
  42. package/dist/commands/review.d.ts +3 -0
  43. package/dist/commands/review.d.ts.map +1 -0
  44. package/dist/commands/review.js +245 -0
  45. package/dist/commands/review.js.map +1 -0
  46. package/dist/commands/telemetry.d.ts +3 -0
  47. package/dist/commands/telemetry.d.ts.map +1 -0
  48. package/dist/commands/telemetry.js +76 -0
  49. package/dist/commands/telemetry.js.map +1 -0
  50. package/dist/commands/upgrade.d.ts +3 -0
  51. package/dist/commands/upgrade.d.ts.map +1 -0
  52. package/dist/commands/upgrade.js +35 -0
  53. package/dist/commands/upgrade.js.map +1 -0
  54. package/dist/constants.d.ts +3 -0
  55. package/dist/constants.d.ts.map +1 -0
  56. package/dist/constants.js +3 -0
  57. package/dist/constants.js.map +1 -0
  58. package/dist/formatters/json.d.ts +7 -0
  59. package/dist/formatters/json.d.ts.map +1 -0
  60. package/dist/formatters/json.js +7 -0
  61. package/dist/formatters/json.js.map +1 -0
  62. package/dist/formatters/markdown.d.ts +7 -0
  63. package/dist/formatters/markdown.d.ts.map +1 -0
  64. package/dist/formatters/markdown.js +93 -0
  65. package/dist/formatters/markdown.js.map +1 -0
  66. package/dist/formatters/prompt.d.ts +12 -0
  67. package/dist/formatters/prompt.d.ts.map +1 -0
  68. package/dist/formatters/prompt.js +90 -0
  69. package/dist/formatters/prompt.js.map +1 -0
  70. package/dist/formatters/terminal.d.ts +7 -0
  71. package/dist/formatters/terminal.d.ts.map +1 -0
  72. package/dist/formatters/terminal.js +127 -0
  73. package/dist/formatters/terminal.js.map +1 -0
  74. package/dist/index.d.ts +3 -0
  75. package/dist/index.d.ts.map +1 -0
  76. package/dist/index.js +4 -0
  77. package/dist/index.js.map +1 -0
  78. package/dist/services/api/api.interface.d.ts +46 -0
  79. package/dist/services/api/api.interface.d.ts.map +1 -0
  80. package/dist/services/api/api.interface.js +2 -0
  81. package/dist/services/api/api.interface.js.map +1 -0
  82. package/dist/services/api/api.mock.d.ts +8 -0
  83. package/dist/services/api/api.mock.d.ts.map +1 -0
  84. package/dist/services/api/api.mock.js +249 -0
  85. package/dist/services/api/api.mock.js.map +1 -0
  86. package/dist/services/api/api.real.d.ts +8 -0
  87. package/dist/services/api/api.real.d.ts.map +1 -0
  88. package/dist/services/api/api.real.js +253 -0
  89. package/dist/services/api/api.real.js.map +1 -0
  90. package/dist/services/api/index.d.ts +4 -0
  91. package/dist/services/api/index.d.ts.map +1 -0
  92. package/dist/services/api/index.js +9 -0
  93. package/dist/services/api/index.js.map +1 -0
  94. package/dist/services/auth.service.d.ts +19 -0
  95. package/dist/services/auth.service.d.ts.map +1 -0
  96. package/dist/services/auth.service.js +90 -0
  97. package/dist/services/auth.service.js.map +1 -0
  98. package/dist/services/context.service.d.ts +22 -0
  99. package/dist/services/context.service.d.ts.map +1 -0
  100. package/dist/services/context.service.js +104 -0
  101. package/dist/services/context.service.js.map +1 -0
  102. package/dist/services/fix.service.d.ts +31 -0
  103. package/dist/services/fix.service.d.ts.map +1 -0
  104. package/dist/services/fix.service.js +120 -0
  105. package/dist/services/fix.service.js.map +1 -0
  106. package/dist/services/git.service.d.ts +32 -0
  107. package/dist/services/git.service.d.ts.map +1 -0
  108. package/dist/services/git.service.js +261 -0
  109. package/dist/services/git.service.js.map +1 -0
  110. package/dist/services/review.service.d.ts +26 -0
  111. package/dist/services/review.service.d.ts.map +1 -0
  112. package/dist/services/review.service.js +82 -0
  113. package/dist/services/review.service.js.map +1 -0
  114. package/dist/services/telemetry.service.d.ts +73 -0
  115. package/dist/services/telemetry.service.d.ts.map +1 -0
  116. package/dist/services/telemetry.service.js +229 -0
  117. package/dist/services/telemetry.service.js.map +1 -0
  118. package/dist/types/index.d.ts +143 -0
  119. package/dist/types/index.d.ts.map +1 -0
  120. package/dist/types/index.js +15 -0
  121. package/dist/types/index.js.map +1 -0
  122. package/dist/ui/interactive.d.ts +26 -0
  123. package/dist/ui/interactive.d.ts.map +1 -0
  124. package/dist/ui/interactive.js +365 -0
  125. package/dist/ui/interactive.js.map +1 -0
  126. package/dist/utils/config.d.ts +10 -0
  127. package/dist/utils/config.d.ts.map +1 -0
  128. package/dist/utils/config.js +54 -0
  129. package/dist/utils/config.js.map +1 -0
  130. package/dist/utils/credentials.d.ts +6 -0
  131. package/dist/utils/credentials.d.ts.map +1 -0
  132. package/dist/utils/credentials.js +54 -0
  133. package/dist/utils/credentials.js.map +1 -0
  134. package/dist/utils/rate-limit.d.ts +5 -0
  135. package/dist/utils/rate-limit.d.ts.map +1 -0
  136. package/dist/utils/rate-limit.js +47 -0
  137. package/dist/utils/rate-limit.js.map +1 -0
  138. package/dist/utils/review-loading.d.ts +19 -0
  139. package/dist/utils/review-loading.d.ts.map +1 -0
  140. package/dist/utils/review-loading.js +140 -0
  141. package/dist/utils/review-loading.js.map +1 -0
  142. package/package.json +39 -33
  143. package/index.js +0 -17
  144. package/license.md +0 -21
  145. package/readme.md +0 -128
  146. package/scripts/setup-db.sh +0 -77
  147. package/src/commands/install.js +0 -324
  148. package/src/config/default.js +0 -66
  149. package/src/utils/helpers.js +0 -118
  150. package/templates/docker-compose.yml +0 -139
@@ -0,0 +1,245 @@
1
+ import { Command } from 'commander';
2
+ import ora from 'ora';
3
+ import chalk from 'chalk';
4
+ import { gitService } from '../services/git.service.js';
5
+ import { reviewService } from '../services/review.service.js';
6
+ import { authService } from '../services/auth.service.js';
7
+ import { contextService } from '../services/context.service.js';
8
+ import { telemetryService } from '../services/telemetry.service.js';
9
+ import { terminalFormatter } from '../formatters/terminal.js';
10
+ import { jsonFormatter } from '../formatters/json.js';
11
+ import { markdownFormatter } from '../formatters/markdown.js';
12
+ import { promptFormatter } from '../formatters/prompt.js';
13
+ import { interactiveUI } from '../ui/interactive.js';
14
+ import { showTrialLimitPrompt, checkTrialStatus } from '../utils/rate-limit.js';
15
+ import { getDiffMetrics, startReviewLoadingMessages } from '../utils/review-loading.js';
16
+ import fs from 'fs/promises';
17
+ export const reviewCommand = new Command('review')
18
+ .description('Analyze modified files for code review')
19
+ .argument('[files...]', 'Specific files to analyze')
20
+ .option('-s, --staged', 'Analyze only staged files')
21
+ .option('-c, --commit <sha>', 'Analyze diff from a specific commit')
22
+ .option('-b, --branch <name>', 'Compare current branch against specified branch (e.g., main)')
23
+ .option('--rules-only', 'Review using only configured rules (no general suggestions)')
24
+ .option('--fast', 'Fast mode: quicker analysis with lighter checks')
25
+ .option('-i, --interactive', 'Interactive mode: navigate and apply fixes')
26
+ .option('--fix', 'Automatically apply all fixable issues')
27
+ .option('--prompt-only', 'Output optimized for AI agents (minimal, structured)')
28
+ .option('--context <file>', 'Custom context file to include in review')
29
+ .action(async (files, options, cmd) => {
30
+ const globalOpts = cmd.optsWithGlobals();
31
+ const spinner = ora();
32
+ try {
33
+ const isAuthenticated = await authService.isAuthenticated();
34
+ const startTime = Date.now();
35
+ // Track review started
36
+ telemetryService.track('review_started', {
37
+ is_authenticated: isAuthenticated,
38
+ staged: options.staged || false,
39
+ has_commit: !!options.commit,
40
+ has_files: files && files.length > 0,
41
+ rules_only: options.rulesOnly || false,
42
+ fast: options.fast || false,
43
+ interactive: options.interactive || false,
44
+ fix: options.fix || false,
45
+ prompt_only: options.promptOnly || false,
46
+ has_context: !!options.context,
47
+ format: globalOpts.format,
48
+ });
49
+ // Override format if --prompt-only is set
50
+ if (options.promptOnly) {
51
+ globalOpts.format = 'prompt';
52
+ }
53
+ if (!globalOpts.quiet) {
54
+ spinner.start(chalk.cyan('Checking authentication...'));
55
+ }
56
+ let result;
57
+ if (isAuthenticated) {
58
+ let config;
59
+ try {
60
+ if (!globalOpts.quiet) {
61
+ spinner.text = chalk.cyan('Fetching configuration from platform...');
62
+ }
63
+ config = await reviewService.getConfig(globalOpts.org, globalOpts.repo);
64
+ }
65
+ catch (error) {
66
+ // Config endpoint não existe ou falhou - usar config padrão
67
+ config = {
68
+ language: 'en',
69
+ severity: 'warning',
70
+ rules: {
71
+ security: true,
72
+ performance: true,
73
+ style: true,
74
+ bestPractices: true,
75
+ },
76
+ ignore: [],
77
+ llmProvider: 'kodus',
78
+ };
79
+ }
80
+ if (!globalOpts.quiet) {
81
+ spinner.text = chalk.cyan('Getting file changes...');
82
+ }
83
+ let diff = await getDiff(files, options);
84
+ if (!diff) {
85
+ spinner.fail(chalk.yellow('No changes to review'));
86
+ return;
87
+ }
88
+ const diffMetrics = getDiffMetrics(diff);
89
+ // Enrich with project context
90
+ if (!globalOpts.quiet) {
91
+ spinner.text = chalk.cyan('Reading project context...');
92
+ }
93
+ diff = await contextService.enrichDiffWithContext(diff, options.context);
94
+ let stopLoadingMessages;
95
+ if (!globalOpts.quiet) {
96
+ stopLoadingMessages = startReviewLoadingMessages(spinner, diffMetrics, {
97
+ fast: options.fast,
98
+ rulesOnly: options.rulesOnly,
99
+ isTrial: false,
100
+ }, { initialMessage: 'Analyzing code...' });
101
+ }
102
+ try {
103
+ result = await reviewService.analyze(diff, config, options.rulesOnly, options.fast, {
104
+ files: files && files.length > 0 ? files : undefined,
105
+ staged: options.staged,
106
+ commit: options.commit,
107
+ branch: options.branch,
108
+ });
109
+ }
110
+ finally {
111
+ stopLoadingMessages?.();
112
+ }
113
+ const modeLabel = options.fast ? ' (fast mode)' : '';
114
+ spinner.succeed(chalk.green(`Review complete!${modeLabel}`));
115
+ }
116
+ else {
117
+ if (!globalOpts.quiet) {
118
+ spinner.text = chalk.cyan('Running in trial mode...');
119
+ }
120
+ const trialStatus = await checkTrialStatus();
121
+ if (trialStatus.isLimited) {
122
+ spinner.stop();
123
+ showTrialLimitPrompt(trialStatus);
124
+ return;
125
+ }
126
+ if (!globalOpts.quiet) {
127
+ spinner.text = chalk.cyan('Getting file changes...');
128
+ }
129
+ let diff = await getDiff(files, options);
130
+ if (!diff) {
131
+ spinner.fail(chalk.yellow('No changes to review'));
132
+ return;
133
+ }
134
+ const diffMetrics = getDiffMetrics(diff);
135
+ // Enrich with project context
136
+ if (!globalOpts.quiet) {
137
+ spinner.text = chalk.cyan('Reading project context...');
138
+ }
139
+ diff = await contextService.enrichDiffWithContext(diff, options.context);
140
+ let stopLoadingMessages;
141
+ if (!globalOpts.quiet) {
142
+ stopLoadingMessages = startReviewLoadingMessages(spinner, diffMetrics, {
143
+ fast: options.fast,
144
+ rulesOnly: options.rulesOnly,
145
+ isTrial: true,
146
+ }, { initialMessage: 'Analyzing code (trial mode)...' });
147
+ }
148
+ try {
149
+ result = await reviewService.trialAnalyze(diff);
150
+ }
151
+ finally {
152
+ stopLoadingMessages?.();
153
+ }
154
+ spinner.succeed(chalk.green(`Review complete! (Trial: ${result.trialInfo.reviewsUsed}/${result.trialInfo.reviewsLimit} reviews today)`));
155
+ }
156
+ // Track review completed
157
+ const duration = Date.now() - startTime;
158
+ telemetryService.track('review_completed', {
159
+ is_authenticated: isAuthenticated,
160
+ files_analyzed: result.filesAnalyzed,
161
+ issues_found: result.issues.length,
162
+ critical_issues: result.issues.filter(i => i.severity === 'critical').length,
163
+ error_issues: result.issues.filter(i => i.severity === 'error').length,
164
+ warning_issues: result.issues.filter(i => i.severity === 'warning').length,
165
+ fixable_issues: result.issues.filter(i => i.fixable).length,
166
+ duration_ms: duration,
167
+ mode: options.interactive ? 'interactive' : options.fix ? 'fix' : 'normal',
168
+ format: globalOpts.format,
169
+ });
170
+ // Handle fix mode
171
+ if (options.fix) {
172
+ await interactiveUI.runQuickFix(result);
173
+ telemetryService.track('fix_mode_used');
174
+ return;
175
+ }
176
+ // Handle interactive mode (now default if no output format specified)
177
+ const shouldUseInteractive = options.interactive || (!globalOpts.output && globalOpts.format === 'terminal');
178
+ if (shouldUseInteractive) {
179
+ await interactiveUI.run(result);
180
+ telemetryService.track('interactive_mode_used');
181
+ return;
182
+ }
183
+ // Regular output (only when --format or --output is specified)
184
+ const output = formatOutput(result, globalOpts.format);
185
+ if (globalOpts.output) {
186
+ await fs.writeFile(globalOpts.output, output, 'utf-8');
187
+ console.log(chalk.green(`\nOutput saved to ${globalOpts.output}`));
188
+ }
189
+ else if (globalOpts.format === 'terminal') {
190
+ console.log(output);
191
+ }
192
+ else {
193
+ console.log(output);
194
+ }
195
+ }
196
+ catch (error) {
197
+ spinner.fail(chalk.red('Review failed'));
198
+ // Track review failed
199
+ telemetryService.track('review_failed', {
200
+ error: error instanceof Error ? error.message : 'Unknown error',
201
+ });
202
+ if (error instanceof Error) {
203
+ console.error(chalk.red(error.message));
204
+ if (globalOpts.verbose) {
205
+ console.error(error.stack);
206
+ }
207
+ }
208
+ else {
209
+ console.error(chalk.red('An unexpected error occurred'));
210
+ if (globalOpts.verbose) {
211
+ console.error(error);
212
+ }
213
+ }
214
+ process.exit(1);
215
+ }
216
+ });
217
+ async function getDiff(files, options) {
218
+ if (files && files.length > 0) {
219
+ return gitService.getDiffForFiles(files);
220
+ }
221
+ if (options.branch) {
222
+ return gitService.getDiffForBranch(options.branch);
223
+ }
224
+ if (options.commit) {
225
+ return gitService.getDiffForCommit(options.commit);
226
+ }
227
+ if (options.staged) {
228
+ return gitService.getStagedDiff();
229
+ }
230
+ return gitService.getWorkingTreeDiff();
231
+ }
232
+ function formatOutput(result, format) {
233
+ switch (format) {
234
+ case 'json':
235
+ return jsonFormatter.format(result);
236
+ case 'markdown':
237
+ return markdownFormatter.format(result);
238
+ case 'prompt':
239
+ return promptFormatter.format(result);
240
+ case 'terminal':
241
+ default:
242
+ return terminalFormatter.format(result);
243
+ }
244
+ }
245
+ //# 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,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const telemetryCommand: Command;
3
+ //# sourceMappingURL=telemetry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry.d.ts","sourceRoot":"","sources":["../../src/commands/telemetry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,eAAO,MAAM,gBAAgB,SA4E1B,CAAC"}
@@ -0,0 +1,76 @@
1
+ import { Command } from 'commander';
2
+ import chalk from 'chalk';
3
+ import { telemetryService } from '../services/telemetry.service.js';
4
+ export const telemetryCommand = new Command('telemetry')
5
+ .description('Manage telemetry settings')
6
+ .addCommand(new Command('enable')
7
+ .description('Enable anonymous telemetry')
8
+ .action(async () => {
9
+ try {
10
+ await telemetryService.enable();
11
+ console.log(chalk.green('✓ Telemetry enabled'));
12
+ console.log('');
13
+ console.log(chalk.dim('Anonymous usage data will be collected to improve Kodus.'));
14
+ console.log(chalk.dim('We never collect sensitive data (code, file names, tokens, etc).'));
15
+ console.log('');
16
+ }
17
+ catch (error) {
18
+ console.error(chalk.red('Failed to enable telemetry'));
19
+ if (error instanceof Error) {
20
+ console.error(chalk.red(error.message));
21
+ }
22
+ process.exit(1);
23
+ }
24
+ }))
25
+ .addCommand(new Command('disable')
26
+ .description('Disable telemetry (opt-out)')
27
+ .action(async () => {
28
+ try {
29
+ await telemetryService.disable();
30
+ console.log(chalk.green('✓ Telemetry disabled'));
31
+ console.log('');
32
+ console.log(chalk.dim('No anonymous usage data will be collected.'));
33
+ console.log('');
34
+ }
35
+ catch (error) {
36
+ console.error(chalk.red('Failed to disable telemetry'));
37
+ if (error instanceof Error) {
38
+ console.error(chalk.red(error.message));
39
+ }
40
+ process.exit(1);
41
+ }
42
+ }))
43
+ .addCommand(new Command('status')
44
+ .description('Check telemetry status')
45
+ .action(async () => {
46
+ try {
47
+ const enabled = await telemetryService.status();
48
+ console.log('');
49
+ console.log(chalk.bold('Telemetry Status'));
50
+ console.log(chalk.dim('─'.repeat(50)));
51
+ console.log('');
52
+ if (enabled) {
53
+ console.log(chalk.green('● Enabled'));
54
+ console.log('');
55
+ console.log(chalk.dim('Anonymous usage data is being collected.'));
56
+ console.log(chalk.dim('To opt-out, run: ') + chalk.cyan('kodus telemetry disable'));
57
+ }
58
+ else {
59
+ console.log(chalk.yellow('○ Disabled'));
60
+ console.log('');
61
+ console.log(chalk.dim('Telemetry is disabled. No data is being collected.'));
62
+ console.log(chalk.dim('To enable, run: ') + chalk.cyan('kodus telemetry enable'));
63
+ }
64
+ console.log('');
65
+ console.log(chalk.dim('Learn more: https://docs.kodus.io/telemetry'));
66
+ console.log('');
67
+ }
68
+ catch (error) {
69
+ console.error(chalk.red('Failed to check telemetry status'));
70
+ if (error instanceof Error) {
71
+ console.error(chalk.red(error.message));
72
+ }
73
+ process.exit(1);
74
+ }
75
+ }));
76
+ //# sourceMappingURL=telemetry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../../src/commands/telemetry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const upgradeCommand: Command;
3
+ //# sourceMappingURL=upgrade.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upgrade.d.ts","sourceRoot":"","sources":["../../src/commands/upgrade.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,eAAO,MAAM,cAAc,SAmBvB,CAAC"}
@@ -0,0 +1,35 @@
1
+ import { Command } from 'commander';
2
+ import chalk from 'chalk';
3
+ const UPGRADE_URL = 'https://kodus.io/pricing';
4
+ export const upgradeCommand = new Command('upgrade')
5
+ .description('Open the upgrade page in your browser')
6
+ .action(async () => {
7
+ console.log(chalk.blue('\nOpening upgrade page...'));
8
+ console.log(chalk.dim(`URL: ${UPGRADE_URL}\n`));
9
+ const open = await getOpenCommand();
10
+ if (open) {
11
+ const { execFile } = await import('child_process');
12
+ // Use execFile instead of exec to prevent command injection
13
+ execFile(open, [UPGRADE_URL], (error) => {
14
+ if (error) {
15
+ console.log(chalk.yellow(`Could not open browser. Please visit: ${UPGRADE_URL}`));
16
+ }
17
+ });
18
+ }
19
+ else {
20
+ console.log(chalk.yellow(`Please visit: ${UPGRADE_URL}`));
21
+ }
22
+ });
23
+ async function getOpenCommand() {
24
+ switch (process.platform) {
25
+ case 'darwin':
26
+ return 'open';
27
+ case 'win32':
28
+ return 'start';
29
+ case 'linux':
30
+ return 'xdg-open';
31
+ default:
32
+ return null;
33
+ }
34
+ }
35
+ //# sourceMappingURL=upgrade.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upgrade.js","sourceRoot":"","sources":["../../src/commands/upgrade.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,WAAW,GAAG,0BAA0B,CAAC;AAE/C,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,OAAO,CAAC,SAAS,CAAC;KACjD,WAAW,CAAC,uCAAuC,CAAC;KACpD,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC,CAAC;IACrD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,WAAW,IAAI,CAAC,CAAC,CAAC;IAEhD,MAAM,IAAI,GAAG,MAAM,cAAc,EAAE,CAAC;IAEpC,IAAI,IAAI,EAAE,CAAC;QACT,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,CAAC;QACnD,4DAA4D;QAC5D,QAAQ,CAAC,IAAI,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE;YACtC,IAAI,KAAK,EAAE,CAAC;gBACV,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,yCAAyC,WAAW,EAAE,CAAC,CAAC,CAAC;YACpF,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,iBAAiB,WAAW,EAAE,CAAC,CAAC,CAAC;IAC5D,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,KAAK,UAAU,cAAc;IAC3B,QAAQ,OAAO,CAAC,QAAQ,EAAE,CAAC;QACzB,KAAK,QAAQ;YACX,OAAO,MAAM,CAAC;QAChB,KAAK,OAAO;YACV,OAAO,OAAO,CAAC;QACjB,KAAK,OAAO;YACV,OAAO,UAAU,CAAC;QACpB;YACE,OAAO,IAAI,CAAC;IAChB,CAAC;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare const API_URL: string;
2
+ export declare const CLI_VERSION = "1.0.0";
3
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,OAAO,QAAsD,CAAC;AAC3E,eAAO,MAAM,WAAW,UAAU,CAAC"}
@@ -0,0 +1,3 @@
1
+ export const API_URL = process.env.KODUS_API_URL || 'https://api.kodus.io';
2
+ export const CLI_VERSION = '1.0.0';
3
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,sBAAsB,CAAC;AAC3E,MAAM,CAAC,MAAM,WAAW,GAAG,OAAO,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { ReviewResult } from '../types/index.js';
2
+ declare class JsonFormatter {
3
+ format(result: ReviewResult): string;
4
+ }
5
+ export declare const jsonFormatter: JsonFormatter;
6
+ export {};
7
+ //# sourceMappingURL=json.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json.d.ts","sourceRoot":"","sources":["../../src/formatters/json.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEtD,cAAM,aAAa;IACjB,MAAM,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM;CAGrC;AAED,eAAO,MAAM,aAAa,eAAsB,CAAC"}
@@ -0,0 +1,7 @@
1
+ class JsonFormatter {
2
+ format(result) {
3
+ return JSON.stringify(result, null, 2);
4
+ }
5
+ }
6
+ export const jsonFormatter = new JsonFormatter();
7
+ //# sourceMappingURL=json.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json.js","sourceRoot":"","sources":["../../src/formatters/json.ts"],"names":[],"mappings":"AAEA,MAAM,aAAa;IACjB,MAAM,CAAC,MAAoB;QACzB,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IACzC,CAAC;CACF;AAED,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,aAAa,EAAE,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { ReviewResult } from '../types/index.js';
2
+ declare class MarkdownFormatter {
3
+ format(result: ReviewResult): string;
4
+ }
5
+ export declare const markdownFormatter: MarkdownFormatter;
6
+ export {};
7
+ //# sourceMappingURL=markdown.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../../src/formatters/markdown.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAyB,MAAM,mBAAmB,CAAC;AAwC7E,cAAM,iBAAiB;IACrB,MAAM,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM;CAkErC;AAED,eAAO,MAAM,iBAAiB,mBAA0B,CAAC"}
@@ -0,0 +1,93 @@
1
+ function getSeverityEmoji(severity) {
2
+ switch (severity) {
3
+ case 'error':
4
+ return '🔴';
5
+ case 'warning':
6
+ return '🟡';
7
+ case 'info':
8
+ return '🔵';
9
+ default:
10
+ return '⚪';
11
+ }
12
+ }
13
+ function formatIssue(issue) {
14
+ const emoji = getSeverityEmoji(issue.severity);
15
+ const lines = [];
16
+ lines.push(`### ${emoji} ${issue.severity.toUpperCase()}: ${issue.file}:${issue.line}`);
17
+ lines.push('');
18
+ lines.push(issue.message);
19
+ lines.push('');
20
+ if (issue.suggestion) {
21
+ lines.push('**Suggestion:**');
22
+ lines.push('```');
23
+ lines.push(issue.suggestion);
24
+ lines.push('```');
25
+ lines.push('');
26
+ }
27
+ if (issue.ruleId) {
28
+ lines.push(`*Rule: \`${issue.ruleId}\`*`);
29
+ lines.push('');
30
+ }
31
+ return lines.join('\n');
32
+ }
33
+ class MarkdownFormatter {
34
+ format(result) {
35
+ const lines = [];
36
+ lines.push('# Code Review Report');
37
+ lines.push('');
38
+ lines.push('## Summary');
39
+ lines.push('');
40
+ lines.push(`- **Status:** ${result.summary}`);
41
+ lines.push(`- **Files analyzed:** ${result.filesAnalyzed}`);
42
+ lines.push(`- **Duration:** ${result.duration}ms`);
43
+ lines.push('');
44
+ const errorCount = result.issues.filter((i) => i.severity === 'error').length;
45
+ const warningCount = result.issues.filter((i) => i.severity === 'warning').length;
46
+ const infoCount = result.issues.filter((i) => i.severity === 'info').length;
47
+ lines.push('| Severity | Count |');
48
+ lines.push('|----------|-------|');
49
+ lines.push(`| 🔴 Errors | ${errorCount} |`);
50
+ lines.push(`| 🟡 Warnings | ${warningCount} |`);
51
+ lines.push(`| 🔵 Info | ${infoCount} |`);
52
+ lines.push('');
53
+ if (result.issues.length > 0) {
54
+ lines.push('## Issues');
55
+ lines.push('');
56
+ const errorIssues = result.issues.filter((i) => i.severity === 'error');
57
+ const warningIssues = result.issues.filter((i) => i.severity === 'warning');
58
+ const infoIssues = result.issues.filter((i) => i.severity === 'info');
59
+ if (errorIssues.length > 0) {
60
+ errorIssues.forEach((issue) => {
61
+ lines.push(formatIssue(issue));
62
+ lines.push('---');
63
+ lines.push('');
64
+ });
65
+ }
66
+ if (warningIssues.length > 0) {
67
+ warningIssues.forEach((issue) => {
68
+ lines.push(formatIssue(issue));
69
+ lines.push('---');
70
+ lines.push('');
71
+ });
72
+ }
73
+ if (infoIssues.length > 0) {
74
+ infoIssues.forEach((issue) => {
75
+ lines.push(formatIssue(issue));
76
+ lines.push('---');
77
+ lines.push('');
78
+ });
79
+ }
80
+ }
81
+ else {
82
+ lines.push('## ✅ No issues found!');
83
+ lines.push('');
84
+ lines.push('Your code looks good!');
85
+ }
86
+ lines.push('');
87
+ lines.push('---');
88
+ lines.push('*Generated by [Kodus CLI](https://kodus.io)*');
89
+ return lines.join('\n');
90
+ }
91
+ }
92
+ export const markdownFormatter = new MarkdownFormatter();
93
+ //# sourceMappingURL=markdown.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../src/formatters/markdown.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { ReviewResult } from '../types/index.js';
2
+ /**
3
+ * Prompt-only formatter - Optimized for AI agents
4
+ * Outputs minimal, structured text that's easy to parse
5
+ */
6
+ declare class PromptFormatter {
7
+ format(result: ReviewResult): string;
8
+ private formatIssue;
9
+ }
10
+ export declare const promptFormatter: PromptFormatter;
11
+ export {};
12
+ //# sourceMappingURL=prompt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../../src/formatters/prompt.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAe,MAAM,mBAAmB,CAAC;AAEnE;;;GAGG;AACH,cAAM,eAAe;IACnB,MAAM,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM;IAmDpC,OAAO,CAAC,WAAW;CAqDpB;AAED,eAAO,MAAM,eAAe,iBAAwB,CAAC"}