@kairoaisec/cli 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 (96) hide show
  1. package/CHANGELOG.md +47 -0
  2. package/LICENSE +21 -0
  3. package/README.md +161 -0
  4. package/dist/api/client.d.ts +128 -0
  5. package/dist/api/client.d.ts.map +1 -0
  6. package/dist/api/client.js +153 -0
  7. package/dist/api/client.js.map +1 -0
  8. package/dist/api/index.d.ts +7 -0
  9. package/dist/api/index.d.ts.map +1 -0
  10. package/dist/api/index.js +42 -0
  11. package/dist/api/index.js.map +1 -0
  12. package/dist/cli.d.ts +5 -0
  13. package/dist/cli.d.ts.map +1 -0
  14. package/dist/cli.js +72 -0
  15. package/dist/cli.js.map +1 -0
  16. package/dist/commands/auth/index.d.ts +3 -0
  17. package/dist/commands/auth/index.d.ts.map +1 -0
  18. package/dist/commands/auth/index.js +13 -0
  19. package/dist/commands/auth/index.js.map +1 -0
  20. package/dist/commands/auth/login.d.ts +3 -0
  21. package/dist/commands/auth/login.d.ts.map +1 -0
  22. package/dist/commands/auth/login.js +174 -0
  23. package/dist/commands/auth/login.js.map +1 -0
  24. package/dist/commands/auth/logout.d.ts +3 -0
  25. package/dist/commands/auth/logout.d.ts.map +1 -0
  26. package/dist/commands/auth/logout.js +56 -0
  27. package/dist/commands/auth/logout.js.map +1 -0
  28. package/dist/commands/auth/whoami.d.ts +3 -0
  29. package/dist/commands/auth/whoami.d.ts.map +1 -0
  30. package/dist/commands/auth/whoami.js +110 -0
  31. package/dist/commands/auth/whoami.js.map +1 -0
  32. package/dist/commands/config.d.ts +3 -0
  33. package/dist/commands/config.d.ts.map +1 -0
  34. package/dist/commands/config.js +102 -0
  35. package/dist/commands/config.js.map +1 -0
  36. package/dist/commands/project/create.d.ts +3 -0
  37. package/dist/commands/project/create.d.ts.map +1 -0
  38. package/dist/commands/project/create.js +146 -0
  39. package/dist/commands/project/create.js.map +1 -0
  40. package/dist/commands/project/index.d.ts +3 -0
  41. package/dist/commands/project/index.d.ts.map +1 -0
  42. package/dist/commands/project/index.js +14 -0
  43. package/dist/commands/project/index.js.map +1 -0
  44. package/dist/commands/project/list.d.ts +3 -0
  45. package/dist/commands/project/list.d.ts.map +1 -0
  46. package/dist/commands/project/list.js +116 -0
  47. package/dist/commands/project/list.js.map +1 -0
  48. package/dist/commands/project/select.d.ts +3 -0
  49. package/dist/commands/project/select.d.ts.map +1 -0
  50. package/dist/commands/project/select.js +147 -0
  51. package/dist/commands/project/select.js.map +1 -0
  52. package/dist/commands/scan.d.ts +3 -0
  53. package/dist/commands/scan.d.ts.map +1 -0
  54. package/dist/commands/scan.js +401 -0
  55. package/dist/commands/scan.js.map +1 -0
  56. package/dist/config/index.d.ts +44 -0
  57. package/dist/config/index.d.ts.map +1 -0
  58. package/dist/config/index.js +237 -0
  59. package/dist/config/index.js.map +1 -0
  60. package/dist/index.d.ts +6 -0
  61. package/dist/index.d.ts.map +1 -0
  62. package/dist/index.js +33 -0
  63. package/dist/index.js.map +1 -0
  64. package/dist/lib/file-discovery.d.ts +17 -0
  65. package/dist/lib/file-discovery.d.ts.map +1 -0
  66. package/dist/lib/file-discovery.js +218 -0
  67. package/dist/lib/file-discovery.js.map +1 -0
  68. package/dist/lib/patterns.d.ts +18 -0
  69. package/dist/lib/patterns.d.ts.map +1 -0
  70. package/dist/lib/patterns.js +187 -0
  71. package/dist/lib/patterns.js.map +1 -0
  72. package/dist/lib/sarif.d.ts +61 -0
  73. package/dist/lib/sarif.d.ts.map +1 -0
  74. package/dist/lib/sarif.js +169 -0
  75. package/dist/lib/sarif.js.map +1 -0
  76. package/dist/lib/scanner.d.ts +43 -0
  77. package/dist/lib/scanner.d.ts.map +1 -0
  78. package/dist/lib/scanner.js +163 -0
  79. package/dist/lib/scanner.js.map +1 -0
  80. package/dist/lib/slither.d.ts +112 -0
  81. package/dist/lib/slither.d.ts.map +1 -0
  82. package/dist/lib/slither.js +463 -0
  83. package/dist/lib/slither.js.map +1 -0
  84. package/dist/utils/logger.d.ts +14 -0
  85. package/dist/utils/logger.d.ts.map +1 -0
  86. package/dist/utils/logger.js +44 -0
  87. package/dist/utils/logger.js.map +1 -0
  88. package/dist/utils/spinner.d.ts +15 -0
  89. package/dist/utils/spinner.d.ts.map +1 -0
  90. package/dist/utils/spinner.js +55 -0
  91. package/dist/utils/spinner.js.map +1 -0
  92. package/dist/utils/validation.d.ts +12 -0
  93. package/dist/utils/validation.d.ts.map +1 -0
  94. package/dist/utils/validation.js +79 -0
  95. package/dist/utils/validation.js.map +1 -0
  96. package/package.json +62 -0
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const authCommand: Command;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/auth/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,eAAO,MAAM,WAAW,SAII,CAAC"}
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.authCommand = void 0;
4
+ const commander_1 = require("commander");
5
+ const login_1 = require("./login");
6
+ const logout_1 = require("./logout");
7
+ const whoami_1 = require("./whoami");
8
+ exports.authCommand = new commander_1.Command('auth')
9
+ .description('Authentication commands')
10
+ .addCommand(login_1.loginCommand)
11
+ .addCommand(logout_1.logoutCommand)
12
+ .addCommand(whoami_1.whoamiCommand);
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/auth/index.ts"],"names":[],"mappings":";;;AAAA,yCAAoC;AACpC,mCAAuC;AACvC,qCAAyC;AACzC,qCAAyC;AAE5B,QAAA,WAAW,GAAG,IAAI,mBAAO,CAAC,MAAM,CAAC;KAC3C,WAAW,CAAC,yBAAyB,CAAC;KACtC,UAAU,CAAC,oBAAY,CAAC;KACxB,UAAU,CAAC,sBAAa,CAAC;KACzB,UAAU,CAAC,sBAAa,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const loginCommand: Command;
3
+ //# sourceMappingURL=login.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../../src/commands/auth/login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAiGpC,eAAO,MAAM,YAAY,SA0BrB,CAAC"}
@@ -0,0 +1,174 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.loginCommand = void 0;
7
+ const commander_1 = require("commander");
8
+ const spinner_1 = require("../../utils/spinner");
9
+ const logger_1 = require("../../utils/logger");
10
+ const config_1 = require("../../config");
11
+ const api_1 = require("../../api");
12
+ const open_1 = __importDefault(require("open"));
13
+ const http_1 = require("http");
14
+ const url_1 = require("url");
15
+ const startAuthServer = () => {
16
+ return new Promise((resolve, reject) => {
17
+ const server = (0, http_1.createServer)((req, res) => {
18
+ const url = new url_1.URL(req.url || '', 'http://localhost:3000');
19
+ if (url.pathname === '/auth/callback') {
20
+ const token = url.searchParams.get('token');
21
+ const userId = url.searchParams.get('user_id');
22
+ const email = url.searchParams.get('email');
23
+ const name = url.searchParams.get('name');
24
+ if (token && userId && email) {
25
+ res.writeHead(200, { 'Content-Type': 'text/html' });
26
+ res.end(`
27
+ <html>
28
+ <body style="font-family: -apple-system, BlinkMacSystemFont, sans-serif; text-align: center; padding: 50px;">
29
+ <h1 style="color: #10b981;">✓ Authentication Successful</h1>
30
+ <p>You can close this window and return to your terminal.</p>
31
+ <script>
32
+ setTimeout(() => window.close(), 3000);
33
+ </script>
34
+ </body>
35
+ </html>
36
+ `);
37
+ resolve({
38
+ token,
39
+ user: { id: userId, email, name: name || undefined },
40
+ });
41
+ server.close();
42
+ }
43
+ else {
44
+ res.writeHead(400, { 'Content-Type': 'text/html' });
45
+ res.end(`
46
+ <html>
47
+ <body style="font-family: -apple-system, BlinkMacSystemFont, sans-serif; text-align: center; padding: 50px;">
48
+ <h1 style="color: #ef4444;">✗ Authentication Failed</h1>
49
+ <p>Missing required authentication data. Please try again.</p>
50
+ </body>
51
+ </html>
52
+ `);
53
+ reject(new Error('Missing authentication data'));
54
+ }
55
+ }
56
+ else if (url.pathname === '/auth/error') {
57
+ const error = url.searchParams.get('error') || 'Unknown error occurred';
58
+ res.writeHead(400, { 'Content-Type': 'text/html' });
59
+ res.end(`
60
+ <html>
61
+ <body style="font-family: -apple-system, BlinkMacSystemFont, sans-serif; text-align: center; padding: 50px;">
62
+ <h1 style="color: #ef4444;">✗ Authentication Failed</h1>
63
+ <p>${error}</p>
64
+ </body>
65
+ </html>
66
+ `);
67
+ reject(new Error(error));
68
+ }
69
+ else {
70
+ res.writeHead(404);
71
+ res.end('Not found');
72
+ }
73
+ });
74
+ server.listen(3000, 'localhost', () => {
75
+ logger_1.Logger.debug('Auth server started on http://localhost:3000');
76
+ });
77
+ server.on('error', (err) => {
78
+ reject(new Error(`Failed to start auth server: ${err.message}`));
79
+ });
80
+ // Timeout after 5 minutes
81
+ setTimeout(() => {
82
+ server.close();
83
+ reject(new Error('Authentication timed out'));
84
+ }, 5 * 60 * 1000);
85
+ });
86
+ };
87
+ exports.loginCommand = new commander_1.Command('login')
88
+ .description('Login to your Kairo account')
89
+ .option('--api-key <key>', 'Login with an API key instead of OAuth')
90
+ .option('--no-browser', "Don't automatically open browser")
91
+ .option('--port <port>', 'Local server port for OAuth callback', '3000')
92
+ .action(async (options) => {
93
+ try {
94
+ // Check if already logged in
95
+ if (await config_1.configManager.isAuthenticated()) {
96
+ const email = config_1.configManager.get('email');
97
+ logger_1.Logger.info(`Already logged in as ${logger_1.Logger.highlight(email || 'unknown user')}`);
98
+ logger_1.Logger.info('Use ' + logger_1.Logger.highlight('kairo auth logout') + ' to logout first');
99
+ return;
100
+ }
101
+ if (options.apiKey) {
102
+ // Direct API key login
103
+ await loginWithApiKey(options.apiKey);
104
+ }
105
+ else {
106
+ // OAuth browser flow
107
+ await loginWithOAuth(options);
108
+ }
109
+ }
110
+ catch (error) {
111
+ logger_1.Logger.error('Login failed:', error instanceof Error ? error.message : String(error));
112
+ process.exit(1);
113
+ }
114
+ });
115
+ async function loginWithApiKey(apiKey) {
116
+ const spinner = (0, spinner_1.createSpinner)('Validating API key...').start();
117
+ try {
118
+ // Test the API key by making a request
119
+ const client = (0, api_1.getApiClient)();
120
+ await config_1.configManager.setApiKey(apiKey);
121
+ // Try to fetch user info or make a test request
122
+ await client.listApiKeys();
123
+ spinner.succeed('API key validated successfully');
124
+ await config_1.configManager.setAuthToken(apiKey);
125
+ config_1.configManager.set('lastLogin', new Date().toISOString());
126
+ logger_1.Logger.success('Logged in successfully with API key');
127
+ logger_1.Logger.info('Use ' + logger_1.Logger.highlight('kairo whoami') + ' to view your account info');
128
+ }
129
+ catch (error) {
130
+ spinner.fail('API key validation failed');
131
+ throw error;
132
+ }
133
+ }
134
+ async function loginWithOAuth(options) {
135
+ const spinner = (0, spinner_1.createSpinner)('Starting authentication...').start();
136
+ try {
137
+ const apiUrl = config_1.configManager.get('apiUrl') || 'https://kairoaisec.com';
138
+ const callbackUrl = `http://localhost:${options.port}/auth/callback`;
139
+ const authUrl = `${apiUrl}/auth/cli/login?callback=${encodeURIComponent(callbackUrl)}`;
140
+ spinner.updateText('Waiting for authentication...');
141
+ // Start local server to receive callback
142
+ const serverPromise = startAuthServer();
143
+ if (options.browser !== false) {
144
+ logger_1.Logger.info('Opening browser for authentication...');
145
+ logger_1.Logger.info("If browser doesn't open automatically, visit:");
146
+ logger_1.Logger.log(logger_1.Logger.highlight(authUrl));
147
+ try {
148
+ await (0, open_1.default)(authUrl);
149
+ }
150
+ catch (err) {
151
+ logger_1.Logger.warn('Failed to open browser automatically');
152
+ }
153
+ }
154
+ else {
155
+ logger_1.Logger.info('Please visit the following URL to authenticate:');
156
+ logger_1.Logger.log(logger_1.Logger.highlight(authUrl));
157
+ }
158
+ // Wait for authentication response
159
+ const authResponse = await serverPromise;
160
+ spinner.succeed('Authentication successful');
161
+ // Store credentials
162
+ await config_1.configManager.setAuthToken(authResponse.token);
163
+ config_1.configManager.set('userId', authResponse.user.id);
164
+ config_1.configManager.set('email', authResponse.user.email);
165
+ config_1.configManager.set('lastLogin', new Date().toISOString());
166
+ logger_1.Logger.success(`Welcome, ${logger_1.Logger.highlight(authResponse.user.name || authResponse.user.email)}!`);
167
+ logger_1.Logger.info('Use ' + logger_1.Logger.highlight('kairo whoami') + ' to view your account info');
168
+ }
169
+ catch (error) {
170
+ spinner.fail('Authentication failed');
171
+ throw error;
172
+ }
173
+ }
174
+ //# sourceMappingURL=login.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../../../src/commands/auth/login.ts"],"names":[],"mappings":";;;;;;AAAA,yCAAoC;AACpC,iDAAoD;AACpD,+CAA4C;AAC5C,yCAA6C;AAC7C,mCAAyC;AACzC,gDAAwB;AACxB,+BAAoC;AACpC,6BAA0B;AAW1B,MAAM,eAAe,GAAG,GAA0B,EAAE;IAClD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,MAAM,GAAG,IAAA,mBAAY,EAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;YACvC,MAAM,GAAG,GAAG,IAAI,SAAG,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE,EAAE,uBAAuB,CAAC,CAAC;YAE5D,IAAI,GAAG,CAAC,QAAQ,KAAK,gBAAgB,EAAE,CAAC;gBACtC,MAAM,KAAK,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBAC5C,MAAM,MAAM,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;gBAC/C,MAAM,KAAK,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBAC5C,MAAM,IAAI,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;gBAE1C,IAAI,KAAK,IAAI,MAAM,IAAI,KAAK,EAAE,CAAC;oBAC7B,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC,CAAC;oBACpD,GAAG,CAAC,GAAG,CAAC;;;;;;;;;;WAUP,CAAC,CAAC;oBAEH,OAAO,CAAC;wBACN,KAAK;wBACL,IAAI,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,IAAI,SAAS,EAAE;qBACrD,CAAC,CAAC;oBACH,MAAM,CAAC,KAAK,EAAE,CAAC;gBACjB,CAAC;qBAAM,CAAC;oBACN,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC,CAAC;oBACpD,GAAG,CAAC,GAAG,CAAC;;;;;;;WAOP,CAAC,CAAC;oBACH,MAAM,CAAC,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC,CAAC;gBACnD,CAAC;YACH,CAAC;iBAAM,IAAI,GAAG,CAAC,QAAQ,KAAK,aAAa,EAAE,CAAC;gBAC1C,MAAM,KAAK,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,wBAAwB,CAAC;gBACxE,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC,CAAC;gBACpD,GAAG,CAAC,GAAG,CAAC;;;;mBAIG,KAAK;;;SAGf,CAAC,CAAC;gBACH,MAAM,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;YAC3B,CAAC;iBAAM,CAAC;gBACN,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;gBACnB,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;YACvB,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE;YACpC,eAAM,CAAC,KAAK,CAAC,8CAA8C,CAAC,CAAC;QAC/D,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACzB,MAAM,CAAC,IAAI,KAAK,CAAC,gCAAgC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACnE,CAAC,CAAC,CAAC;QAEH,0BAA0B;QAC1B,UAAU,CACR,GAAG,EAAE;YACH,MAAM,CAAC,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC,CAAC;QAChD,CAAC,EACD,CAAC,GAAG,EAAE,GAAG,IAAI,CACd,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAEW,QAAA,YAAY,GAAG,IAAI,mBAAO,CAAC,OAAO,CAAC;KAC7C,WAAW,CAAC,6BAA6B,CAAC;KAC1C,MAAM,CAAC,iBAAiB,EAAE,wCAAwC,CAAC;KACnE,MAAM,CAAC,cAAc,EAAE,kCAAkC,CAAC;KAC1D,MAAM,CAAC,eAAe,EAAE,sCAAsC,EAAE,MAAM,CAAC;KACvE,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,IAAI,CAAC;QACH,6BAA6B;QAC7B,IAAI,MAAM,sBAAa,CAAC,eAAe,EAAE,EAAE,CAAC;YAC1C,MAAM,KAAK,GAAG,sBAAa,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACzC,eAAM,CAAC,IAAI,CAAC,wBAAwB,eAAM,CAAC,SAAS,CAAC,KAAK,IAAI,cAAc,CAAC,EAAE,CAAC,CAAC;YACjF,eAAM,CAAC,IAAI,CAAC,MAAM,GAAG,eAAM,CAAC,SAAS,CAAC,mBAAmB,CAAC,GAAG,kBAAkB,CAAC,CAAC;YACjF,OAAO;QACT,CAAC;QAED,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnB,uBAAuB;YACvB,MAAM,eAAe,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACxC,CAAC;aAAM,CAAC;YACN,qBAAqB;YACrB,MAAM,cAAc,CAAC,OAAO,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,eAAM,CAAC,KAAK,CAAC,eAAe,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QACtF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,KAAK,UAAU,eAAe,CAAC,MAAc;IAC3C,MAAM,OAAO,GAAG,IAAA,uBAAa,EAAC,uBAAuB,CAAC,CAAC,KAAK,EAAE,CAAC;IAE/D,IAAI,CAAC;QACH,uCAAuC;QACvC,MAAM,MAAM,GAAG,IAAA,kBAAY,GAAE,CAAC;QAC9B,MAAM,sBAAa,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAEtC,gDAAgD;QAChD,MAAM,MAAM,CAAC,WAAW,EAAE,CAAC;QAE3B,OAAO,CAAC,OAAO,CAAC,gCAAgC,CAAC,CAAC;QAElD,MAAM,sBAAa,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QACzC,sBAAa,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;QAEzD,eAAM,CAAC,OAAO,CAAC,qCAAqC,CAAC,CAAC;QACtD,eAAM,CAAC,IAAI,CAAC,MAAM,GAAG,eAAM,CAAC,SAAS,CAAC,cAAc,CAAC,GAAG,4BAA4B,CAAC,CAAC;IACxF,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;QAC1C,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,OAAY;IACxC,MAAM,OAAO,GAAG,IAAA,uBAAa,EAAC,4BAA4B,CAAC,CAAC,KAAK,EAAE,CAAC;IAEpE,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,sBAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,wBAAwB,CAAC;QACvE,MAAM,WAAW,GAAG,oBAAoB,OAAO,CAAC,IAAI,gBAAgB,CAAC;QACrE,MAAM,OAAO,GAAG,GAAG,MAAM,4BAA4B,kBAAkB,CAAC,WAAW,CAAC,EAAE,CAAC;QAEvF,OAAO,CAAC,UAAU,CAAC,+BAA+B,CAAC,CAAC;QAEpD,yCAAyC;QACzC,MAAM,aAAa,GAAG,eAAe,EAAE,CAAC;QAExC,IAAI,OAAO,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;YAC9B,eAAM,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC;YACrD,eAAM,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC;YAC7D,eAAM,CAAC,GAAG,CAAC,eAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;YAEtC,IAAI,CAAC;gBACH,MAAM,IAAA,cAAI,EAAC,OAAO,CAAC,CAAC;YACtB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,eAAM,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;YACtD,CAAC;QACH,CAAC;aAAM,CAAC;YACN,eAAM,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC;YAC/D,eAAM,CAAC,GAAG,CAAC,eAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;QACxC,CAAC;QAED,mCAAmC;QACnC,MAAM,YAAY,GAAG,MAAM,aAAa,CAAC;QAEzC,OAAO,CAAC,OAAO,CAAC,2BAA2B,CAAC,CAAC;QAE7C,oBAAoB;QACpB,MAAM,sBAAa,CAAC,YAAY,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;QACrD,sBAAa,CAAC,GAAG,CAAC,QAAQ,EAAE,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAClD,sBAAa,CAAC,GAAG,CAAC,OAAO,EAAE,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACpD,sBAAa,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;QAEzD,eAAM,CAAC,OAAO,CACZ,YAAY,eAAM,CAAC,SAAS,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,IAAI,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CACnF,CAAC;QACF,eAAM,CAAC,IAAI,CAAC,MAAM,GAAG,eAAM,CAAC,SAAS,CAAC,cAAc,CAAC,GAAG,4BAA4B,CAAC,CAAC;IACxF,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QACtC,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const logoutCommand: Command;
3
+ //# sourceMappingURL=logout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logout.d.ts","sourceRoot":"","sources":["../../../src/commands/auth/logout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,eAAO,MAAM,aAAa,SAmDtB,CAAC"}
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.logoutCommand = void 0;
7
+ const commander_1 = require("commander");
8
+ const logger_1 = require("../../utils/logger");
9
+ const config_1 = require("../../config");
10
+ const api_1 = require("../../api");
11
+ const inquirer_1 = __importDefault(require("inquirer"));
12
+ exports.logoutCommand = new commander_1.Command('logout')
13
+ .description('Logout from your Kairo account')
14
+ .option('-f, --force', 'Skip confirmation prompt')
15
+ .action(async (options) => {
16
+ try {
17
+ // Check if user is logged in
18
+ if (!(await config_1.configManager.isAuthenticated())) {
19
+ logger_1.Logger.info('You are not currently logged in');
20
+ return;
21
+ }
22
+ const email = config_1.configManager.get('email');
23
+ const userId = config_1.configManager.get('userId');
24
+ // Confirmation prompt unless forced
25
+ if (!options.force) {
26
+ const answers = await inquirer_1.default.prompt([
27
+ {
28
+ type: 'confirm',
29
+ name: 'confirm',
30
+ message: `Are you sure you want to logout from ${email || 'your account'}?`,
31
+ default: false,
32
+ },
33
+ ]);
34
+ if (!answers.confirm) {
35
+ logger_1.Logger.info('Logout cancelled');
36
+ return;
37
+ }
38
+ }
39
+ // Clear all stored credentials and configuration
40
+ await config_1.configManager.clearAuthToken();
41
+ await config_1.configManager.clearApiKey();
42
+ config_1.configManager.clear();
43
+ // Reset API client instance
44
+ (0, api_1.resetApiClient)();
45
+ logger_1.Logger.success('Logged out successfully');
46
+ if (email) {
47
+ logger_1.Logger.info(`${logger_1.Logger.highlight(email)} has been logged out`);
48
+ }
49
+ logger_1.Logger.info('Use ' + logger_1.Logger.highlight('kairo auth login') + ' to login again');
50
+ }
51
+ catch (error) {
52
+ logger_1.Logger.error('Logout failed:', error instanceof Error ? error.message : String(error));
53
+ process.exit(1);
54
+ }
55
+ });
56
+ //# sourceMappingURL=logout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logout.js","sourceRoot":"","sources":["../../../src/commands/auth/logout.ts"],"names":[],"mappings":";;;;;;AAAA,yCAAoC;AACpC,+CAA4C;AAC5C,yCAA6C;AAC7C,mCAA2C;AAC3C,wDAAgC;AAEnB,QAAA,aAAa,GAAG,IAAI,mBAAO,CAAC,QAAQ,CAAC;KAC/C,WAAW,CAAC,gCAAgC,CAAC;KAC7C,MAAM,CAAC,aAAa,EAAE,0BAA0B,CAAC;KACjD,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,IAAI,CAAC;QACH,6BAA6B;QAC7B,IAAI,CAAC,CAAC,MAAM,sBAAa,CAAC,eAAe,EAAE,CAAC,EAAE,CAAC;YAC7C,eAAM,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;YAC/C,OAAO;QACT,CAAC;QAED,MAAM,KAAK,GAAG,sBAAa,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACzC,MAAM,MAAM,GAAG,sBAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAE3C,oCAAoC;QACpC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YACnB,MAAM,OAAO,GAAG,MAAM,kBAAQ,CAAC,MAAM,CAAC;gBACpC;oBACE,IAAI,EAAE,SAAS;oBACf,IAAI,EAAE,SAAS;oBACf,OAAO,EAAE,wCAAwC,KAAK,IAAI,cAAc,GAAG;oBAC3E,OAAO,EAAE,KAAK;iBACf;aACF,CAAC,CAAC;YAEH,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;gBACrB,eAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;gBAChC,OAAO;YACT,CAAC;QACH,CAAC;QAED,iDAAiD;QACjD,MAAM,sBAAa,CAAC,cAAc,EAAE,CAAC;QACrC,MAAM,sBAAa,CAAC,WAAW,EAAE,CAAC;QAClC,sBAAa,CAAC,KAAK,EAAE,CAAC;QAEtB,4BAA4B;QAC5B,IAAA,oBAAc,GAAE,CAAC;QAEjB,eAAM,CAAC,OAAO,CAAC,yBAAyB,CAAC,CAAC;QAE1C,IAAI,KAAK,EAAE,CAAC;YACV,eAAM,CAAC,IAAI,CAAC,GAAG,eAAM,CAAC,SAAS,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;QAChE,CAAC;QAED,eAAM,CAAC,IAAI,CAAC,MAAM,GAAG,eAAM,CAAC,SAAS,CAAC,kBAAkB,CAAC,GAAG,iBAAiB,CAAC,CAAC;IAEjF,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,eAAM,CAAC,KAAK,CAAC,gBAAgB,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QACvF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const whoamiCommand: Command;
3
+ //# sourceMappingURL=whoami.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"whoami.d.ts","sourceRoot":"","sources":["../../../src/commands/auth/whoami.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,eAAO,MAAM,aAAa,SA0EtB,CAAC"}
@@ -0,0 +1,110 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.whoamiCommand = void 0;
4
+ const commander_1 = require("commander");
5
+ const logger_1 = require("../../utils/logger");
6
+ const config_1 = require("../../config");
7
+ const api_1 = require("../../api");
8
+ const spinner_1 = require("../../utils/spinner");
9
+ exports.whoamiCommand = new commander_1.Command('whoami')
10
+ .description('Display current user information')
11
+ .option('--json', 'Output as JSON')
12
+ .action(async (options) => {
13
+ try {
14
+ // Check if user is logged in
15
+ if (!(await config_1.configManager.isAuthenticated())) {
16
+ if (options.json) {
17
+ console.log(JSON.stringify({ authenticated: false }, null, 2));
18
+ }
19
+ else {
20
+ logger_1.Logger.info('You are not currently logged in');
21
+ logger_1.Logger.info('Use ' + logger_1.Logger.highlight('kairo auth login') + ' to get started');
22
+ }
23
+ return;
24
+ }
25
+ const spinner = (0, spinner_1.createSpinner)('Fetching user information...').start();
26
+ try {
27
+ // Gather user information
28
+ const email = config_1.configManager.get('email');
29
+ const userId = config_1.configManager.get('userId');
30
+ const lastLogin = config_1.configManager.get('lastLogin');
31
+ const currentProject = config_1.configManager.getCurrentProject();
32
+ const apiUrl = config_1.configManager.get('apiUrl');
33
+ // Test API connection
34
+ let apiConnected = false;
35
+ let apiKeyInfo = null;
36
+ try {
37
+ const client = (0, api_1.getApiClient)();
38
+ const result = await client.listApiKeys();
39
+ apiConnected = true;
40
+ apiKeyInfo = {
41
+ total_keys: result.api_keys.length,
42
+ active_keys: result.api_keys.filter(k => !k.expires_at || new Date(k.expires_at) > new Date()).length
43
+ };
44
+ }
45
+ catch (error) {
46
+ logger_1.Logger.debug('API connection test failed:', error);
47
+ apiConnected = false;
48
+ }
49
+ spinner.succeed('User information retrieved');
50
+ const userInfo = {
51
+ authenticated: true,
52
+ email: email || 'Unknown',
53
+ user_id: userId || 'Unknown',
54
+ last_login: lastLogin || 'Unknown',
55
+ current_project: currentProject ? {
56
+ id: currentProject.id,
57
+ name: currentProject.name
58
+ } : null,
59
+ api_url: apiUrl || 'https://kairoaisec.com',
60
+ api_connected: apiConnected,
61
+ api_keys: apiKeyInfo,
62
+ config_path: config_1.configManager.getConfigPath()
63
+ };
64
+ if (options.json) {
65
+ console.log(JSON.stringify(userInfo, null, 2));
66
+ }
67
+ else {
68
+ displayUserInfo(userInfo);
69
+ }
70
+ }
71
+ catch (error) {
72
+ spinner.fail('Failed to fetch user information');
73
+ throw error;
74
+ }
75
+ }
76
+ catch (error) {
77
+ logger_1.Logger.error('Failed to get user info:', error instanceof Error ? error.message : String(error));
78
+ process.exit(1);
79
+ }
80
+ });
81
+ function displayUserInfo(info) {
82
+ logger_1.Logger.log('');
83
+ logger_1.Logger.log(logger_1.Logger.bold('🔐 Authentication Status'));
84
+ logger_1.Logger.log(` Status: ${logger_1.Logger.highlight('Authenticated')}`);
85
+ logger_1.Logger.log(` Email: ${logger_1.Logger.highlight(info.email)}`);
86
+ logger_1.Logger.log(` User ID: ${logger_1.Logger.dim(info.user_id)}`);
87
+ logger_1.Logger.log(` Last Login: ${info.last_login !== 'Unknown' ? new Date(info.last_login).toLocaleString() : 'Unknown'}`);
88
+ logger_1.Logger.log('');
89
+ logger_1.Logger.log(logger_1.Logger.bold('🌐 API Connection'));
90
+ logger_1.Logger.log(` API URL: ${info.api_url}`);
91
+ logger_1.Logger.log(` Status: ${info.api_connected ? logger_1.Logger.highlight('Connected') : logger_1.Logger.dim('Disconnected')}`);
92
+ if (info.api_keys) {
93
+ logger_1.Logger.log(` API Keys: ${info.api_keys.active_keys}/${info.api_keys.total_keys} active`);
94
+ }
95
+ logger_1.Logger.log('');
96
+ logger_1.Logger.log(logger_1.Logger.bold('📁 Current Project'));
97
+ if (info.current_project) {
98
+ logger_1.Logger.log(` Name: ${logger_1.Logger.highlight(info.current_project.name)}`);
99
+ logger_1.Logger.log(` ID: ${logger_1.Logger.dim(info.current_project.id)}`);
100
+ }
101
+ else {
102
+ logger_1.Logger.log(` None selected`);
103
+ logger_1.Logger.log(` Use ${logger_1.Logger.highlight('kairo project select')} to choose a project`);
104
+ }
105
+ logger_1.Logger.log('');
106
+ logger_1.Logger.log(logger_1.Logger.bold('⚙️ Configuration'));
107
+ logger_1.Logger.log(` Config Path: ${logger_1.Logger.dim(info.config_path)}`);
108
+ logger_1.Logger.log('');
109
+ }
110
+ //# sourceMappingURL=whoami.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"whoami.js","sourceRoot":"","sources":["../../../src/commands/auth/whoami.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const configCommand: Command;
3
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,eAAO,MAAM,aAAa,SA4EvB,CAAC"}
@@ -0,0 +1,102 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.configCommand = void 0;
7
+ const commander_1 = require("commander");
8
+ const logger_1 = require("../utils/logger");
9
+ const config_1 = require("../config");
10
+ const inquirer_1 = __importDefault(require("inquirer"));
11
+ exports.configCommand = new commander_1.Command('config')
12
+ .description('Manage CLI configuration')
13
+ .addCommand(new commander_1.Command('get')
14
+ .argument('[key]', 'Configuration key to retrieve')
15
+ .description('Get configuration value')
16
+ .option('--json', 'Output as JSON')
17
+ .action(async (key, options) => {
18
+ if (key) {
19
+ const value = config_1.configManager.get(key);
20
+ if (options.json) {
21
+ console.log(JSON.stringify({ [key]: value }, null, 2));
22
+ }
23
+ else {
24
+ logger_1.Logger.log(`${key}: ${value || 'not set'}`);
25
+ }
26
+ }
27
+ else {
28
+ const config = config_1.configManager.getAll();
29
+ if (options.json) {
30
+ console.log(JSON.stringify(config, null, 2));
31
+ }
32
+ else {
33
+ displayConfig(config);
34
+ }
35
+ }
36
+ }))
37
+ .addCommand(new commander_1.Command('set')
38
+ .argument('<key>', 'Configuration key')
39
+ .argument('<value>', 'Configuration value')
40
+ .description('Set configuration value')
41
+ .action(async (key, value) => {
42
+ try {
43
+ config_1.configManager.set(key, value);
44
+ logger_1.Logger.success(`Set ${key} = ${value}`);
45
+ }
46
+ catch (error) {
47
+ logger_1.Logger.error('Failed to set configuration:', error instanceof Error ? error.message : String(error));
48
+ process.exit(1);
49
+ }
50
+ }))
51
+ .addCommand(new commander_1.Command('reset')
52
+ .description('Reset all configuration to defaults')
53
+ .option('-f, --force', 'Skip confirmation prompt')
54
+ .action(async (options) => {
55
+ if (!options.force) {
56
+ const answers = await inquirer_1.default.prompt([
57
+ {
58
+ type: 'confirm',
59
+ name: 'confirm',
60
+ message: 'This will reset all configuration and logout. Are you sure?',
61
+ default: false,
62
+ },
63
+ ]);
64
+ if (!answers.confirm) {
65
+ logger_1.Logger.info('Reset cancelled');
66
+ return;
67
+ }
68
+ }
69
+ await config_1.configManager.clearAuthToken();
70
+ await config_1.configManager.clearApiKey();
71
+ config_1.configManager.clear();
72
+ logger_1.Logger.success('Configuration reset to defaults');
73
+ logger_1.Logger.info('You will need to login again');
74
+ }))
75
+ .addCommand(new commander_1.Command('path').description('Show configuration file path').action(() => {
76
+ logger_1.Logger.log(config_1.configManager.getConfigPath());
77
+ }));
78
+ function displayConfig(config) {
79
+ logger_1.Logger.log('');
80
+ logger_1.Logger.log(logger_1.Logger.bold('⚙️ Configuration'));
81
+ logger_1.Logger.log('');
82
+ const sensitiveKeys = ['authToken', 'apiKey'];
83
+ const entries = Object.entries(config);
84
+ if (entries.length === 0) {
85
+ logger_1.Logger.log(' No configuration set');
86
+ }
87
+ else {
88
+ for (const [key, value] of entries) {
89
+ const displayValue = sensitiveKeys.includes(key) && value ? '[hidden]' : value || 'not set';
90
+ logger_1.Logger.log(` ${key}: ${logger_1.Logger.dim(String(displayValue))}`);
91
+ }
92
+ }
93
+ logger_1.Logger.log('');
94
+ logger_1.Logger.log(`Config file: ${logger_1.Logger.dim(config_1.configManager.getConfigPath())}`);
95
+ logger_1.Logger.log('');
96
+ logger_1.Logger.log(logger_1.Logger.bold('Commands:'));
97
+ logger_1.Logger.log(` View value: ${logger_1.Logger.highlight('kairo config get <key>')}`);
98
+ logger_1.Logger.log(` Set value: ${logger_1.Logger.highlight('kairo config set <key> <value>')}`);
99
+ logger_1.Logger.log(` Reset config: ${logger_1.Logger.highlight('kairo config reset')}`);
100
+ logger_1.Logger.log('');
101
+ }
102
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":";;;;;;AAAA,yCAAoC;AACpC,4CAAyC;AACzC,sCAA0C;AAC1C,wDAAgC;AAEnB,QAAA,aAAa,GAAG,IAAI,mBAAO,CAAC,QAAQ,CAAC;KAC/C,WAAW,CAAC,0BAA0B,CAAC;KACvC,UAAU,CACT,IAAI,mBAAO,CAAC,KAAK,CAAC;KACf,QAAQ,CAAC,OAAO,EAAE,+BAA+B,CAAC;KAClD,WAAW,CAAC,yBAAyB,CAAC;KACtC,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;KAClC,MAAM,CAAC,KAAK,EAAE,GAAW,EAAE,OAA2B,EAAE,EAAE;IACzD,IAAI,GAAG,EAAE,CAAC;QACR,MAAM,KAAK,GAAG,sBAAa,CAAC,GAAG,CAAC,GAAU,CAAC,CAAC;QAC5C,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACzD,CAAC;aAAM,CAAC;YACN,eAAM,CAAC,GAAG,CAAC,GAAG,GAAG,KAAK,KAAK,IAAI,SAAS,EAAE,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;SAAM,CAAC;QACN,MAAM,MAAM,GAAG,sBAAa,CAAC,MAAM,EAAE,CAAC;QACtC,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC/C,CAAC;aAAM,CAAC;YACN,aAAa,CAAC,MAAM,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;AACH,CAAC,CAAC,CACL;KACA,UAAU,CACT,IAAI,mBAAO,CAAC,KAAK,CAAC;KACf,QAAQ,CAAC,OAAO,EAAE,mBAAmB,CAAC;KACtC,QAAQ,CAAC,SAAS,EAAE,qBAAqB,CAAC;KAC1C,WAAW,CAAC,yBAAyB,CAAC;KACtC,MAAM,CAAC,KAAK,EAAE,GAAW,EAAE,KAAa,EAAE,EAAE;IAC3C,IAAI,CAAC;QACH,sBAAa,CAAC,GAAG,CAAC,GAAU,EAAE,KAAK,CAAC,CAAC;QACrC,eAAM,CAAC,OAAO,CAAC,OAAO,GAAG,MAAM,KAAK,EAAE,CAAC,CAAC;IAC1C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,eAAM,CAAC,KAAK,CACV,8BAA8B,EAC9B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CACvD,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CACL;KACA,UAAU,CACT,IAAI,mBAAO,CAAC,OAAO,CAAC;KACjB,WAAW,CAAC,qCAAqC,CAAC;KAClD,MAAM,CAAC,aAAa,EAAE,0BAA0B,CAAC;KACjD,MAAM,CAAC,KAAK,EAAE,OAA4B,EAAE,EAAE;IAC7C,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACnB,MAAM,OAAO,GAAG,MAAM,kBAAQ,CAAC,MAAM,CAAC;YACpC;gBACE,IAAI,EAAE,SAAS;gBACf,IAAI,EAAE,SAAS;gBACf,OAAO,EAAE,6DAA6D;gBACtE,OAAO,EAAE,KAAK;aACf;SACF,CAAC,CAAC;QAEH,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YACrB,eAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;YAC/B,OAAO;QACT,CAAC;IACH,CAAC;IAED,MAAM,sBAAa,CAAC,cAAc,EAAE,CAAC;IACrC,MAAM,sBAAa,CAAC,WAAW,EAAE,CAAC;IAClC,sBAAa,CAAC,KAAK,EAAE,CAAC;IAEtB,eAAM,CAAC,OAAO,CAAC,iCAAiC,CAAC,CAAC;IAClD,eAAM,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;AAC9C,CAAC,CAAC,CACL;KACA,UAAU,CACT,IAAI,mBAAO,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,8BAA8B,CAAC,CAAC,MAAM,CAAC,GAAG,EAAE;IAC1E,eAAM,CAAC,GAAG,CAAC,sBAAa,CAAC,aAAa,EAAE,CAAC,CAAC;AAC5C,CAAC,CAAC,CACH,CAAC;AAEJ,SAAS,aAAa,CAAC,MAAW;IAChC,eAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACf,eAAM,CAAC,GAAG,CAAC,eAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC;IAC7C,eAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEf,MAAM,aAAa,GAAG,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;IAC9C,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAEvC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,eAAM,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;IACvC,CAAC;SAAM,CAAC;QACN,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,OAAO,EAAE,CAAC;YACnC,MAAM,YAAY,GAAG,aAAa,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,IAAI,SAAS,CAAC;YAC5F,eAAM,CAAC,GAAG,CAAC,KAAK,GAAG,KAAK,eAAM,CAAC,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC;IAED,eAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACf,eAAM,CAAC,GAAG,CAAC,gBAAgB,eAAM,CAAC,GAAG,CAAC,sBAAa,CAAC,aAAa,EAAE,CAAC,EAAE,CAAC,CAAC;IACxE,eAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACf,eAAM,CAAC,GAAG,CAAC,eAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;IACrC,eAAM,CAAC,GAAG,CAAC,oBAAoB,eAAM,CAAC,SAAS,CAAC,wBAAwB,CAAC,EAAE,CAAC,CAAC;IAC7E,eAAM,CAAC,GAAG,CAAC,oBAAoB,eAAM,CAAC,SAAS,CAAC,gCAAgC,CAAC,EAAE,CAAC,CAAC;IACrF,eAAM,CAAC,GAAG,CAAC,oBAAoB,eAAM,CAAC,SAAS,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAC;IACzE,eAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AACjB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const createCommand: Command;
3
+ //# sourceMappingURL=create.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../../src/commands/project/create.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,eAAO,MAAM,aAAa,SAgIvB,CAAC"}