@kodus/cli 0.0.12 → 0.1.5

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 (131) hide show
  1. package/README.md +380 -0
  2. package/dist/cli.d.ts +4 -0
  3. package/dist/cli.d.ts.map +1 -0
  4. package/dist/cli.js +23 -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 +80 -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 +59 -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/pr.d.ts +3 -0
  35. package/dist/commands/pr.d.ts.map +1 -0
  36. package/dist/commands/pr.js +75 -0
  37. package/dist/commands/pr.js.map +1 -0
  38. package/dist/commands/review.d.ts +3 -0
  39. package/dist/commands/review.d.ts.map +1 -0
  40. package/dist/commands/review.js +164 -0
  41. package/dist/commands/review.js.map +1 -0
  42. package/dist/commands/upgrade.d.ts +3 -0
  43. package/dist/commands/upgrade.d.ts.map +1 -0
  44. package/dist/commands/upgrade.js +35 -0
  45. package/dist/commands/upgrade.js.map +1 -0
  46. package/dist/constants.d.ts +3 -0
  47. package/dist/constants.d.ts.map +1 -0
  48. package/dist/constants.js +3 -0
  49. package/dist/constants.js.map +1 -0
  50. package/dist/formatters/json.d.ts +7 -0
  51. package/dist/formatters/json.d.ts.map +1 -0
  52. package/dist/formatters/json.js +7 -0
  53. package/dist/formatters/json.js.map +1 -0
  54. package/dist/formatters/markdown.d.ts +7 -0
  55. package/dist/formatters/markdown.d.ts.map +1 -0
  56. package/dist/formatters/markdown.js +93 -0
  57. package/dist/formatters/markdown.js.map +1 -0
  58. package/dist/formatters/prompt.d.ts +12 -0
  59. package/dist/formatters/prompt.d.ts.map +1 -0
  60. package/dist/formatters/prompt.js +90 -0
  61. package/dist/formatters/prompt.js.map +1 -0
  62. package/dist/formatters/terminal.d.ts +7 -0
  63. package/dist/formatters/terminal.d.ts.map +1 -0
  64. package/dist/formatters/terminal.js +127 -0
  65. package/dist/formatters/terminal.js.map +1 -0
  66. package/dist/index.d.ts +3 -0
  67. package/dist/index.d.ts.map +1 -0
  68. package/dist/index.js +9 -0
  69. package/dist/index.js.map +1 -0
  70. package/dist/services/api/api.interface.d.ts +42 -0
  71. package/dist/services/api/api.interface.d.ts.map +1 -0
  72. package/dist/services/api/api.interface.js +2 -0
  73. package/dist/services/api/api.interface.js.map +1 -0
  74. package/dist/services/api/api.real.d.ts +7 -0
  75. package/dist/services/api/api.real.d.ts.map +1 -0
  76. package/dist/services/api/api.real.js +252 -0
  77. package/dist/services/api/api.real.js.map +1 -0
  78. package/dist/services/api/index.d.ts +4 -0
  79. package/dist/services/api/index.d.ts.map +1 -0
  80. package/dist/services/api/index.js +3 -0
  81. package/dist/services/api/index.js.map +1 -0
  82. package/dist/services/auth.service.d.ts +19 -0
  83. package/dist/services/auth.service.d.ts.map +1 -0
  84. package/dist/services/auth.service.js +90 -0
  85. package/dist/services/auth.service.js.map +1 -0
  86. package/dist/services/context.service.d.ts +22 -0
  87. package/dist/services/context.service.d.ts.map +1 -0
  88. package/dist/services/context.service.js +104 -0
  89. package/dist/services/context.service.js.map +1 -0
  90. package/dist/services/fix.service.d.ts +31 -0
  91. package/dist/services/fix.service.d.ts.map +1 -0
  92. package/dist/services/fix.service.js +120 -0
  93. package/dist/services/fix.service.js.map +1 -0
  94. package/dist/services/git.service.d.ts +32 -0
  95. package/dist/services/git.service.d.ts.map +1 -0
  96. package/dist/services/git.service.js +261 -0
  97. package/dist/services/git.service.js.map +1 -0
  98. package/dist/services/review.service.d.ts +28 -0
  99. package/dist/services/review.service.d.ts.map +1 -0
  100. package/dist/services/review.service.js +111 -0
  101. package/dist/services/review.service.js.map +1 -0
  102. package/dist/types/index.d.ts +161 -0
  103. package/dist/types/index.d.ts.map +1 -0
  104. package/dist/types/index.js +15 -0
  105. package/dist/types/index.js.map +1 -0
  106. package/dist/ui/interactive.d.ts +26 -0
  107. package/dist/ui/interactive.d.ts.map +1 -0
  108. package/dist/ui/interactive.js +371 -0
  109. package/dist/ui/interactive.js.map +1 -0
  110. package/dist/utils/config.d.ts +10 -0
  111. package/dist/utils/config.d.ts.map +1 -0
  112. package/dist/utils/config.js +54 -0
  113. package/dist/utils/config.js.map +1 -0
  114. package/dist/utils/credentials.d.ts +6 -0
  115. package/dist/utils/credentials.d.ts.map +1 -0
  116. package/dist/utils/credentials.js +54 -0
  117. package/dist/utils/credentials.js.map +1 -0
  118. package/dist/utils/rate-limit.d.ts +5 -0
  119. package/dist/utils/rate-limit.d.ts.map +1 -0
  120. package/dist/utils/rate-limit.js +47 -0
  121. package/dist/utils/rate-limit.js.map +1 -0
  122. package/package.json +41 -33
  123. package/index.js +0 -15
  124. package/license.md +0 -21
  125. package/readme.md +0 -128
  126. package/scripts/setup-db.sh +0 -77
  127. package/src/commands/install.js +0 -357
  128. package/src/config/default.js +0 -66
  129. package/src/utils/helpers.js +0 -128
  130. package/templates/.env.example +0 -142
  131. package/templates/docker-compose.yml +0 -139
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../src/commands/auth/status.ts"],"names":[],"mappings":"AAMA,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAgGlD"}
@@ -0,0 +1,91 @@
1
+ import chalk from 'chalk';
2
+ import ora from 'ora';
3
+ import { authService } from '../../services/auth.service.js';
4
+ import { loadConfig } from '../../utils/config.js';
5
+ import { checkTrialStatus } from '../../utils/rate-limit.js';
6
+ export async function statusAction() {
7
+ const spinner = ora();
8
+ try {
9
+ const isAuthenticated = await authService.isAuthenticated();
10
+ if (isAuthenticated) {
11
+ const credentials = await authService.getCredentials();
12
+ const teamConfig = await loadConfig();
13
+ const hasTeamKey = !!teamConfig?.teamKey;
14
+ const hasUserEmail = !!credentials?.user?.email;
15
+ if (!hasUserEmail && hasTeamKey) {
16
+ console.log(chalk.bold('\nAuthentication Status\n'));
17
+ console.log(`${chalk.dim('Mode:')} ${chalk.green('Team Key')}`);
18
+ console.log(`${chalk.dim('Organization:')} ${teamConfig?.organizationName ?? '(unknown)'}`);
19
+ console.log(`${chalk.dim('Team:')} ${teamConfig?.teamName ?? '(unknown)'}`);
20
+ console.log(`${chalk.dim('Token:')} ${chalk.green('Configured')}`);
21
+ if (process.env.KODUS_VERBOSE) {
22
+ console.log(chalk.dim('\nDebug - team config:'));
23
+ console.log(chalk.dim(JSON.stringify(teamConfig, null, 2)));
24
+ }
25
+ return;
26
+ }
27
+ if (!credentials) {
28
+ console.log(chalk.yellow('\nNo credentials found.'));
29
+ return;
30
+ }
31
+ console.log(chalk.bold('\nAuthentication Status\n'));
32
+ console.log(`${chalk.dim('Mode:')} ${chalk.green('Logged In')}`);
33
+ console.log(`${chalk.dim('Email:')} ${credentials.user?.email ?? '(unknown)'}`);
34
+ const expiresAt = new Date(credentials.expiresAt);
35
+ const timeUntilExpiry = expiresAt.getTime() - Date.now();
36
+ const hoursUntilExpiry = Math.floor(timeUntilExpiry / (1000 * 60 * 60));
37
+ if (timeUntilExpiry > 0) {
38
+ if (hoursUntilExpiry < 1) {
39
+ console.log(`${chalk.dim('Token:')} ${chalk.yellow('Expires in < 1 hour')}`);
40
+ }
41
+ else if (hoursUntilExpiry < 24) {
42
+ console.log(`${chalk.dim('Token:')} ${chalk.yellow(`Expires in ${hoursUntilExpiry} hours`)}`);
43
+ }
44
+ else {
45
+ console.log(`${chalk.dim('Token:')} ${chalk.green('Valid')}`);
46
+ }
47
+ }
48
+ else {
49
+ console.log(`${chalk.dim('Token:')} ${chalk.red('Expired')}`);
50
+ console.log(chalk.yellow('\nYour session has expired. Run `kodus auth login` to refresh.'));
51
+ return;
52
+ }
53
+ if (credentials.user?.orgs && credentials.user.orgs.length > 0) {
54
+ console.log(`${chalk.dim('Organizations:')}`);
55
+ credentials.user.orgs.forEach((org) => {
56
+ console.log(` ${chalk.dim('•')} ${org}`);
57
+ });
58
+ }
59
+ if (process.env.KODUS_VERBOSE) {
60
+ console.log(chalk.dim('\nDebug - stored credentials:'));
61
+ console.log(chalk.dim(JSON.stringify(credentials, null, 2)));
62
+ if (teamConfig) {
63
+ console.log(chalk.dim('\nDebug - team config:'));
64
+ console.log(chalk.dim(JSON.stringify(teamConfig, null, 2)));
65
+ }
66
+ }
67
+ }
68
+ else {
69
+ spinner.start(chalk.blue('Checking trial status...'));
70
+ const trialStatus = await checkTrialStatus();
71
+ spinner.stop();
72
+ console.log(chalk.bold('\nAuthentication Status\n'));
73
+ console.log(`${chalk.dim('Mode:')} ${chalk.yellow('Trial')}`);
74
+ console.log(`${chalk.dim('Reviews today:')} ${trialStatus.reviewsUsed}/${trialStatus.reviewsLimit}`);
75
+ console.log(`${chalk.dim('Files limit:')} ${trialStatus.filesLimit} per review`);
76
+ console.log(`${chalk.dim('Resets at:')} ${new Date(trialStatus.resetsAt).toLocaleString()}`);
77
+ if (trialStatus.isLimited) {
78
+ console.log(chalk.yellow('\n⚡ Daily limit reached!'));
79
+ }
80
+ console.log(chalk.dim('\nSign up to remove limits: ') + chalk.cyan('kodus auth signup'));
81
+ }
82
+ }
83
+ catch (error) {
84
+ spinner.fail(chalk.red('Failed to get status'));
85
+ if (error instanceof Error) {
86
+ console.error(chalk.red(error.message));
87
+ }
88
+ process.exit(1);
89
+ }
90
+ }
91
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/commands/auth/status.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export declare function teamKeyAction(options: {
2
+ key?: string;
3
+ }): Promise<void>;
4
+ export declare function teamStatusAction(): Promise<void>;
5
+ //# sourceMappingURL=team-key.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"team-key.d.ts","sourceRoot":"","sources":["../../../src/commands/auth/team-key.ts"],"names":[],"mappings":"AAIA,wBAAsB,aAAa,CAAC,OAAO,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAkD5E;AAED,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CAatD"}
@@ -0,0 +1,59 @@
1
+ import chalk from 'chalk';
2
+ import { loadConfig, saveConfig } from '../../utils/config.js';
3
+ import { API_URL } from '../../constants.js';
4
+ export async function teamKeyAction(options) {
5
+ if (!options.key) {
6
+ console.error(chalk.red('Error: --key is required'));
7
+ console.log('\nGet your team key from: https://app.kodus.io/settings/cli');
8
+ process.exit(1);
9
+ }
10
+ if (!options.key.startsWith('kodus_')) {
11
+ console.error(chalk.red('Error: Invalid key format. Key should start with "kodus_"'));
12
+ process.exit(1);
13
+ }
14
+ try {
15
+ const response = await fetch(`${API_URL}/cli/validate-key`, {
16
+ headers: { 'X-Team-Key': options.key }
17
+ });
18
+ if (!response.ok) {
19
+ const error = await response.json();
20
+ throw new Error(error.message || 'Invalid team key');
21
+ }
22
+ const rawData = await response.json().catch(() => ({}));
23
+ const payload = rawData && typeof rawData === 'object' && 'data' in rawData ? rawData.data : rawData;
24
+ const teamName = payload?.team?.name ?? payload?.teamName;
25
+ const organizationName = payload?.organization?.name ?? payload?.organizationName ?? payload?.org?.name;
26
+ if (!teamName || !organizationName) {
27
+ throw new Error('Invalid response from server. Missing organization or team info.');
28
+ }
29
+ await saveConfig({
30
+ teamKey: options.key,
31
+ teamName,
32
+ organizationName,
33
+ });
34
+ console.log(chalk.green('✓ Authenticated successfully!'));
35
+ console.log(chalk.cyan(` Organization: ${organizationName}`));
36
+ console.log(chalk.cyan(` Team: ${teamName}`));
37
+ }
38
+ catch (error) {
39
+ console.error(chalk.red('✗ Authentication failed:'), error instanceof Error ? error.message : 'Unknown error');
40
+ console.log('\nMake sure:');
41
+ console.log(' 1. Your key is correct');
42
+ console.log(' 2. The key has not been revoked');
43
+ console.log(' 3. You have internet connection');
44
+ process.exit(1);
45
+ }
46
+ }
47
+ export async function teamStatusAction() {
48
+ const config = await loadConfig();
49
+ if (!config) {
50
+ console.log(chalk.yellow('Not authenticated with team key'));
51
+ console.log('\nRun: kodus auth team-key --key <your-key>');
52
+ console.log('Get your key from: https://app.kodus.io/settings/cli');
53
+ return;
54
+ }
55
+ console.log(chalk.green('✓ Authenticated'));
56
+ console.log(chalk.cyan(` Organization: ${config.organizationName}`));
57
+ console.log(chalk.cyan(` Team: ${config.teamName}`));
58
+ }
59
+ //# sourceMappingURL=team-key.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"team-key.js","sourceRoot":"","sources":["../../../src/commands/auth/team-key.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAE7C,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAAyB;IAC3D,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;QACjB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC,CAAC;QACrD,OAAO,CAAC,GAAG,CAAC,6DAA6D,CAAC,CAAC;QAC3E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACtC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,2DAA2D,CAAC,CAAC,CAAC;QACtF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,mBAAmB,EAAE;YAC1D,OAAO,EAAE,EAAE,YAAY,EAAE,OAAO,CAAC,GAAG,EAAE;SACvC,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,EAA0B,CAAC;YAC5D,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,OAAO,IAAI,kBAAkB,CAAC,CAAC;QACvD,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAU,CAAA,CAAC,CAAC;QAC/D,MAAM,OAAO,GAAG,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,MAAM,IAAI,OAAO,CAAC,CAAC,CAAE,OAAe,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;QAE9G,MAAM,QAAQ,GAAG,OAAO,EAAE,IAAI,EAAE,IAAI,IAAI,OAAO,EAAE,QAAQ,CAAC;QAC1D,MAAM,gBAAgB,GAAG,OAAO,EAAE,YAAY,EAAE,IAAI,IAAI,OAAO,EAAE,gBAAgB,IAAI,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC;QAExG,IAAI,CAAC,QAAQ,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CAAC,kEAAkE,CAAC,CAAC;QACtF,CAAC;QAED,MAAM,UAAU,CAAC;YACf,OAAO,EAAE,OAAO,CAAC,GAAG;YACpB,QAAQ;YACR,gBAAgB;SACjB,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC,CAAC;QAC1D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,mBAAmB,gBAAgB,EAAE,CAAC,CAAC,CAAC;QAC/D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,QAAQ,EAAE,CAAC,CAAC,CAAC;IAEjD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,0BAA0B,CAAC,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC;QAC/G,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QAC5B,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;QACxC,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;QACjD,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;QACjD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB;IACpC,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAElC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,iCAAiC,CAAC,CAAC,CAAC;QAC7D,OAAO,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAC;QAC3D,OAAO,CAAC,GAAG,CAAC,sDAAsD,CAAC,CAAC;QACpE,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,CAAC;IAC5C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,mBAAmB,MAAM,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC;IACtE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;AACxD,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function tokenAction(): Promise<void>;
2
+ //# sourceMappingURL=token.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token.d.ts","sourceRoot":"","sources":["../../../src/commands/auth/token.ts"],"names":[],"mappings":"AAIA,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAgCjD"}
@@ -0,0 +1,31 @@
1
+ import chalk from 'chalk';
2
+ import ora from 'ora';
3
+ import { authService } from '../../services/auth.service.js';
4
+ export async function tokenAction() {
5
+ const spinner = ora();
6
+ try {
7
+ const isAuthenticated = await authService.isAuthenticated();
8
+ if (!isAuthenticated) {
9
+ console.log(chalk.yellow('\nYou need to be logged in to generate a token.'));
10
+ console.log(chalk.dim('Run `kodus auth login` first.'));
11
+ return;
12
+ }
13
+ spinner.start(chalk.blue('Generating token...'));
14
+ const token = await authService.generateCIToken();
15
+ spinner.succeed(chalk.green('Token generated!'));
16
+ console.log(chalk.bold('\nCI/CD Token\n'));
17
+ console.log(chalk.dim('Use this token in your CI/CD pipelines:'));
18
+ console.log(chalk.cyan(`\n${token}\n`));
19
+ console.log(chalk.dim('Set as environment variable:'));
20
+ console.log(chalk.dim(' export KODUS_TOKEN=<token>'));
21
+ console.log(chalk.yellow('\n⚠️ Keep this token secret! It provides access to your account.'));
22
+ }
23
+ catch (error) {
24
+ spinner.fail(chalk.red('Failed to generate token'));
25
+ if (error instanceof Error) {
26
+ console.error(chalk.red(error.message));
27
+ }
28
+ process.exit(1);
29
+ }
30
+ }
31
+ //# sourceMappingURL=token.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token.js","sourceRoot":"","sources":["../../../src/commands/auth/token.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAE7D,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC;IAEtB,IAAI,CAAC;QACH,MAAM,eAAe,GAAG,MAAM,WAAW,CAAC,eAAe,EAAE,CAAC;QAE5D,IAAI,CAAC,eAAe,EAAE,CAAC;YACrB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,iDAAiD,CAAC,CAAC,CAAC;YAC7E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC,CAAC;YACxD,OAAO;QACT,CAAC;QAED,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC;QAEjD,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC,eAAe,EAAE,CAAC;QAElD,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC,CAAC;QAEjD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC;QAC3C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC,CAAC;QAClE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC;QACxC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC,CAAC;QACvD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC,CAAC;QACvD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,mEAAmE,CAAC,CAAC,CAAC;IAEjG,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC,CAAC;QACpD,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC3B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QAC1C,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const prCommand: Command;
3
+ //# sourceMappingURL=pr.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pr.d.ts","sourceRoot":"","sources":["../../src/commands/pr.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAWpC,eAAO,MAAM,SAAS,SACiB,CAAC"}
@@ -0,0 +1,75 @@
1
+ import { Command } from 'commander';
2
+ import chalk from 'chalk';
3
+ import ora from 'ora';
4
+ import fs from 'fs/promises';
5
+ import { reviewService } from '../services/review.service.js';
6
+ import { terminalFormatter } from '../formatters/terminal.js';
7
+ import { jsonFormatter } from '../formatters/json.js';
8
+ import { markdownFormatter } from '../formatters/markdown.js';
9
+ import { promptFormatter } from '../formatters/prompt.js';
10
+ export const prCommand = new Command('pr')
11
+ .description('Pull request commands');
12
+ prCommand
13
+ .command('suggestions')
14
+ .description('Fetch suggestions for a pull request')
15
+ .option('--pr-url <url>', 'Pull request URL')
16
+ .option('--pr-number <number>', 'Pull request number')
17
+ .option('--repo-id <id>', 'Repository ID for the pull request')
18
+ .option('--severity <list>', 'Comma-separated severities to include')
19
+ .option('--category <list>', 'Comma-separated categories to include')
20
+ .action(async (options, cmd) => {
21
+ const globalOpts = cmd.optsWithGlobals();
22
+ const spinner = ora();
23
+ try {
24
+ const prNumber = options.prNumber !== undefined ? Number(options.prNumber) : undefined;
25
+ if (options.prNumber !== undefined && Number.isNaN(prNumber)) {
26
+ throw new Error('Invalid --pr-number value');
27
+ }
28
+ if (!options.prUrl && !(prNumber && options.repoId)) {
29
+ console.error(chalk.red('Provide --pr-url or both --pr-number and --repo-id.'));
30
+ process.exit(1);
31
+ }
32
+ const shouldRequestMarkdown = globalOpts.format === 'prompt' || globalOpts.format === 'markdown';
33
+ spinner.start(chalk.cyan('Fetching pull request suggestions...'));
34
+ const { result, markdown } = await reviewService.getPullRequestSuggestions({
35
+ prUrl: options.prUrl,
36
+ prNumber,
37
+ repositoryId: options.repoId,
38
+ format: shouldRequestMarkdown ? 'markdown' : undefined,
39
+ severity: options.severity,
40
+ category: options.category,
41
+ });
42
+ spinner.succeed(chalk.green('Suggestions fetched'));
43
+ const output = markdown && shouldRequestMarkdown
44
+ ? markdown
45
+ : formatOutput(result, globalOpts.format);
46
+ if (globalOpts.output) {
47
+ await fs.writeFile(globalOpts.output, output, 'utf-8');
48
+ console.log(chalk.green(`\nOutput saved to ${globalOpts.output}`));
49
+ }
50
+ else {
51
+ console.log(output);
52
+ }
53
+ }
54
+ catch (error) {
55
+ spinner.fail(chalk.red('Failed to fetch pull request suggestions'));
56
+ if (error instanceof Error) {
57
+ console.error(chalk.red(error.message));
58
+ }
59
+ process.exit(1);
60
+ }
61
+ });
62
+ function formatOutput(result, format) {
63
+ switch (format) {
64
+ case 'json':
65
+ return jsonFormatter.format(result);
66
+ case 'markdown':
67
+ return markdownFormatter.format(result);
68
+ case 'prompt':
69
+ return promptFormatter.format(result);
70
+ case 'terminal':
71
+ default:
72
+ return terminalFormatter.format(result);
73
+ }
74
+ }
75
+ //# sourceMappingURL=pr.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pr.js","sourceRoot":"","sources":["../../src/commands/pr.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const reviewCommand: Command;
3
+ //# sourceMappingURL=review.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review.d.ts","sourceRoot":"","sources":["../../src/commands/review.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAiBpC,eAAO,MAAM,aAAa,SA6ItB,CAAC"}
@@ -0,0 +1,164 @@
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 { terminalFormatter } from '../formatters/terminal.js';
9
+ import { jsonFormatter } from '../formatters/json.js';
10
+ import { markdownFormatter } from '../formatters/markdown.js';
11
+ import { promptFormatter } from '../formatters/prompt.js';
12
+ import { interactiveUI } from '../ui/interactive.js';
13
+ import { showTrialLimitPrompt, checkTrialStatus } from '../utils/rate-limit.js';
14
+ import fs from 'fs/promises';
15
+ export const reviewCommand = new Command('review')
16
+ .description('Analyze modified files for code review')
17
+ .argument('[files...]', 'Specific files to analyze')
18
+ .option('-s, --staged', 'Analyze only staged files')
19
+ .option('-c, --commit <sha>', 'Analyze diff from a specific commit')
20
+ .option('-b, --branch <name>', 'Compare current branch against specified branch (e.g., main)')
21
+ .option('--rules-only', 'Review using only configured rules (no general suggestions)')
22
+ .option('--fast', 'Fast mode: quicker analysis with lighter checks')
23
+ .option('-i, --interactive', 'Interactive mode: navigate and apply fixes')
24
+ .option('--fix', 'Automatically apply all fixable issues')
25
+ .option('--prompt-only', 'Output optimized for AI agents (minimal, structured)')
26
+ .option('--context <file>', 'Custom context file to include in review')
27
+ .action(async (files, options, cmd) => {
28
+ const globalOpts = cmd.optsWithGlobals();
29
+ const spinner = ora();
30
+ try {
31
+ const isAuthenticated = await authService.isAuthenticated();
32
+ // Override format if --prompt-only is set
33
+ if (options.promptOnly) {
34
+ globalOpts.format = 'prompt';
35
+ }
36
+ if (!globalOpts.quiet) {
37
+ spinner.start(chalk.cyan('Checking authentication...'));
38
+ }
39
+ let result;
40
+ if (isAuthenticated) {
41
+ if (!globalOpts.quiet) {
42
+ spinner.text = chalk.cyan('Getting file changes...');
43
+ }
44
+ let diff = await getDiff(files, options);
45
+ if (!diff) {
46
+ spinner.fail(chalk.yellow('No changes to review'));
47
+ return;
48
+ }
49
+ // Enrich with project context
50
+ if (!globalOpts.quiet) {
51
+ spinner.text = chalk.cyan('Reading project context...');
52
+ }
53
+ diff = await contextService.enrichDiffWithContext(diff, options.context);
54
+ if (!globalOpts.quiet) {
55
+ spinner.text = chalk.cyan('Analyzing code...');
56
+ }
57
+ result = await reviewService.analyze(diff, options.rulesOnly, options.fast, {
58
+ files: files && files.length > 0 ? files : undefined,
59
+ staged: options.staged,
60
+ commit: options.commit,
61
+ branch: options.branch,
62
+ });
63
+ const modeLabel = options.fast ? ' (fast mode)' : '';
64
+ spinner.succeed(chalk.green(`Review complete!${modeLabel}`));
65
+ }
66
+ else {
67
+ if (!globalOpts.quiet) {
68
+ spinner.text = chalk.cyan('Running in trial mode...');
69
+ }
70
+ const trialStatus = await checkTrialStatus();
71
+ if (trialStatus.isLimited) {
72
+ spinner.stop();
73
+ showTrialLimitPrompt(trialStatus);
74
+ return;
75
+ }
76
+ if (!globalOpts.quiet) {
77
+ spinner.text = chalk.cyan('Getting file changes...');
78
+ }
79
+ let diff = await getDiff(files, options);
80
+ if (!diff) {
81
+ spinner.fail(chalk.yellow('No changes to review'));
82
+ return;
83
+ }
84
+ // Enrich with project context
85
+ if (!globalOpts.quiet) {
86
+ spinner.text = chalk.cyan('Reading project context...');
87
+ }
88
+ diff = await contextService.enrichDiffWithContext(diff, options.context);
89
+ if (!globalOpts.quiet) {
90
+ spinner.text = chalk.cyan('Analyzing code (trial mode)...');
91
+ }
92
+ result = await reviewService.trialAnalyze(diff);
93
+ spinner.succeed(chalk.green(`Review complete! (Trial: ${result.trialInfo.reviewsUsed}/${result.trialInfo.reviewsLimit} reviews today)`));
94
+ }
95
+ // Handle fix mode
96
+ if (options.fix) {
97
+ await interactiveUI.runQuickFix(result);
98
+ return;
99
+ }
100
+ // Handle interactive mode (now default if no output format specified)
101
+ const shouldUseInteractive = options.interactive || (!globalOpts.output && globalOpts.format === 'terminal');
102
+ if (shouldUseInteractive) {
103
+ await interactiveUI.run(result);
104
+ return;
105
+ }
106
+ // Regular output (only when --format or --output is specified)
107
+ const output = formatOutput(result, globalOpts.format);
108
+ if (globalOpts.output) {
109
+ await fs.writeFile(globalOpts.output, output, 'utf-8');
110
+ console.log(chalk.green(`\nOutput saved to ${globalOpts.output}`));
111
+ }
112
+ else if (globalOpts.format === 'terminal') {
113
+ console.log(output);
114
+ }
115
+ else {
116
+ console.log(output);
117
+ }
118
+ }
119
+ catch (error) {
120
+ spinner.fail(chalk.red('Review failed'));
121
+ if (error instanceof Error) {
122
+ console.error(chalk.red(error.message));
123
+ if (globalOpts.verbose) {
124
+ console.error(error.stack);
125
+ }
126
+ }
127
+ else {
128
+ console.error(chalk.red('An unexpected error occurred'));
129
+ if (globalOpts.verbose) {
130
+ console.error(error);
131
+ }
132
+ }
133
+ process.exit(1);
134
+ }
135
+ });
136
+ async function getDiff(files, options) {
137
+ if (files && files.length > 0) {
138
+ return gitService.getDiffForFiles(files);
139
+ }
140
+ if (options.branch) {
141
+ return gitService.getDiffForBranch(options.branch);
142
+ }
143
+ if (options.commit) {
144
+ return gitService.getDiffForCommit(options.commit);
145
+ }
146
+ if (options.staged) {
147
+ return gitService.getStagedDiff();
148
+ }
149
+ return gitService.getWorkingTreeDiff();
150
+ }
151
+ function formatOutput(result, format) {
152
+ switch (format) {
153
+ case 'json':
154
+ return jsonFormatter.format(result);
155
+ case 'markdown':
156
+ return markdownFormatter.format(result);
157
+ case 'prompt':
158
+ return promptFormatter.format(result);
159
+ case 'terminal':
160
+ default:
161
+ return terminalFormatter.format(result);
162
+ }
163
+ }
164
+ //# 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 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"}