@husar.ai/cli 0.4.0 → 0.4.2

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.
@@ -0,0 +1,450 @@
1
+ import { createServer } from 'node:http';
2
+ import { URL } from 'node:url';
3
+ import { randomBytes } from 'node:crypto';
4
+ import { saveCloudAuth, saveProjectAuth } from './config.js';
5
+ const DEFAULT_CALLBACK_PORT = 9876;
6
+ const CLOUD_AUTH_URL = process.env.HUSAR_AUTH_URL || 'https://husar.ai';
7
+ function escapeHtml(str) {
8
+ return str
9
+ .replace(/&/g, '&')
10
+ .replace(/</g, '&lt;')
11
+ .replace(/>/g, '&gt;')
12
+ .replace(/"/g, '&quot;')
13
+ .replace(/'/g, '&#039;');
14
+ }
15
+ function generateState() {
16
+ return randomBytes(32).toString('hex');
17
+ }
18
+ export async function startCloudLoginFlow(options) {
19
+ const port = options?.port ?? DEFAULT_CALLBACK_PORT;
20
+ const timeout = options?.timeout ?? 300000;
21
+ const expectedState = generateState();
22
+ return new Promise((resolve) => {
23
+ let resolved = false;
24
+ const server = createServer((req, res) => {
25
+ if (resolved) {
26
+ res.writeHead(200);
27
+ res.end('Already processed');
28
+ return;
29
+ }
30
+ const url = new URL(req.url ?? '/', `http://localhost:${port}`);
31
+ if (url.pathname === '/callback') {
32
+ const accessToken = url.searchParams.get('access_token');
33
+ const userEmail = url.searchParams.get('user_email');
34
+ const returnedState = url.searchParams.get('state');
35
+ const error = url.searchParams.get('error');
36
+ if (error) {
37
+ resolved = true;
38
+ res.writeHead(200, { 'Content-Type': 'text/html' });
39
+ res.end(getErrorHtml(error));
40
+ server.close();
41
+ resolve({ success: false, error });
42
+ return;
43
+ }
44
+ if (returnedState !== expectedState) {
45
+ resolved = true;
46
+ res.writeHead(400, { 'Content-Type': 'text/html' });
47
+ res.end(getErrorHtml('Invalid state parameter. This may be a CSRF attack.'));
48
+ server.close();
49
+ resolve({ success: false, error: 'State parameter mismatch - possible CSRF attack' });
50
+ return;
51
+ }
52
+ if (!accessToken) {
53
+ resolved = true;
54
+ res.writeHead(400, { 'Content-Type': 'text/html' });
55
+ res.end(getErrorHtml('Missing access token'));
56
+ server.close();
57
+ resolve({ success: false, error: 'Missing access token from cloud auth' });
58
+ return;
59
+ }
60
+ resolved = true;
61
+ const cloudAuth = {
62
+ email: userEmail ?? undefined,
63
+ accessToken,
64
+ };
65
+ res.writeHead(200, { 'Content-Type': 'text/html' });
66
+ res.end(getCloudSuccessHtml(userEmail ?? 'user'));
67
+ saveCloudAuth(cloudAuth)
68
+ .then(() => {
69
+ server.close();
70
+ resolve({
71
+ success: true,
72
+ email: userEmail ?? undefined,
73
+ accessToken,
74
+ });
75
+ })
76
+ .catch((err) => {
77
+ server.close();
78
+ resolve({ success: false, error: err.message });
79
+ });
80
+ }
81
+ else {
82
+ res.writeHead(404);
83
+ res.end('Not found');
84
+ }
85
+ });
86
+ server.listen(port, () => {
87
+ const authUrl = `${CLOUD_AUTH_URL}/en/app/cli-auth?callback_port=${port}&state=${expectedState}`;
88
+ console.log(`\n🔐 Opening browser for cloud authentication...`);
89
+ console.log(` If the browser doesn't open, visit: ${authUrl}\n`);
90
+ openBrowser(authUrl);
91
+ });
92
+ server.on('error', (err) => {
93
+ if (!resolved) {
94
+ resolved = true;
95
+ resolve({ success: false, error: `Server error: ${err.message}` });
96
+ }
97
+ });
98
+ setTimeout(() => {
99
+ if (!resolved) {
100
+ resolved = true;
101
+ server.close();
102
+ resolve({ success: false, error: 'Cloud login timed out. Please try again.' });
103
+ }
104
+ }, timeout);
105
+ });
106
+ }
107
+ export async function startPanelLoginFlow(panelHost, options) {
108
+ const port = options?.port ?? DEFAULT_CALLBACK_PORT;
109
+ const timeout = options?.timeout ?? 300000;
110
+ const normalizedHost = panelHost.endsWith('/') ? panelHost.slice(0, -1) : panelHost;
111
+ const expectedState = generateState();
112
+ return new Promise((resolve) => {
113
+ let resolved = false;
114
+ const server = createServer((req, res) => {
115
+ if (resolved) {
116
+ res.writeHead(200);
117
+ res.end('Already processed');
118
+ return;
119
+ }
120
+ const url = new URL(req.url ?? '/', `http://localhost:${port}`);
121
+ if (url.pathname === '/callback') {
122
+ const adminToken = url.searchParams.get('admin_token');
123
+ const host = url.searchParams.get('host');
124
+ const projectName = url.searchParams.get('project_name');
125
+ const returnedState = url.searchParams.get('state');
126
+ const error = url.searchParams.get('error');
127
+ if (error) {
128
+ resolved = true;
129
+ res.writeHead(200, { 'Content-Type': 'text/html' });
130
+ res.end(getErrorHtml(error));
131
+ server.close();
132
+ resolve({ success: false, error });
133
+ return;
134
+ }
135
+ if (returnedState !== expectedState) {
136
+ resolved = true;
137
+ res.writeHead(400, { 'Content-Type': 'text/html' });
138
+ res.end(getErrorHtml('Invalid state parameter. This may be a CSRF attack.'));
139
+ server.close();
140
+ resolve({ success: false, error: 'State parameter mismatch - possible CSRF attack' });
141
+ return;
142
+ }
143
+ if (!adminToken || !host || !projectName) {
144
+ resolved = true;
145
+ res.writeHead(400, { 'Content-Type': 'text/html' });
146
+ res.end(getErrorHtml('Missing required parameters'));
147
+ server.close();
148
+ resolve({ success: false, error: 'Missing admin_token, host, or project_name from panel' });
149
+ return;
150
+ }
151
+ resolved = true;
152
+ const project = {
153
+ projectName,
154
+ host,
155
+ adminToken,
156
+ };
157
+ res.writeHead(200, { 'Content-Type': 'text/html' });
158
+ res.end(getPanelSuccessHtml(projectName));
159
+ saveProjectAuth(project)
160
+ .then(() => {
161
+ server.close();
162
+ resolve({
163
+ success: true,
164
+ project,
165
+ });
166
+ })
167
+ .catch((err) => {
168
+ server.close();
169
+ resolve({ success: false, error: err.message });
170
+ });
171
+ }
172
+ else {
173
+ res.writeHead(404);
174
+ res.end('Not found');
175
+ }
176
+ });
177
+ server.listen(port, () => {
178
+ const authUrl = `${normalizedHost}/connect-device?callback_port=${port}&state=${expectedState}`;
179
+ console.log(`\n🔐 Opening browser for CMS authentication...`);
180
+ console.log(` You'll need your SUPERADMIN credentials (from the welcome email)`);
181
+ console.log(` If the browser doesn't open, visit: ${authUrl}\n`);
182
+ openBrowser(authUrl);
183
+ });
184
+ server.on('error', (err) => {
185
+ if (!resolved) {
186
+ resolved = true;
187
+ resolve({ success: false, error: `Server error: ${err.message}` });
188
+ }
189
+ });
190
+ setTimeout(() => {
191
+ if (!resolved) {
192
+ resolved = true;
193
+ server.close();
194
+ resolve({ success: false, error: 'Panel login timed out. Please try again.' });
195
+ }
196
+ }, timeout);
197
+ });
198
+ }
199
+ export async function startLoginFlow(options) {
200
+ const port = options?.port ?? DEFAULT_CALLBACK_PORT;
201
+ const timeout = options?.timeout ?? 300000;
202
+ return new Promise((resolve) => {
203
+ let resolved = false;
204
+ const server = createServer((req, res) => {
205
+ if (resolved) {
206
+ res.writeHead(200);
207
+ res.end('Already processed');
208
+ return;
209
+ }
210
+ const url = new URL(req.url ?? '/', `http://localhost:${port}`);
211
+ if (url.pathname === '/callback') {
212
+ const host = url.searchParams.get('host');
213
+ const adminToken = url.searchParams.get('admin_token');
214
+ const projectName = url.searchParams.get('project_name');
215
+ const userEmail = url.searchParams.get('user_email');
216
+ const error = url.searchParams.get('error');
217
+ if (error) {
218
+ resolved = true;
219
+ res.writeHead(200, { 'Content-Type': 'text/html' });
220
+ res.end(getErrorHtml(error));
221
+ server.close();
222
+ resolve({ success: false, error });
223
+ return;
224
+ }
225
+ if (!host || !adminToken || !projectName) {
226
+ resolved = true;
227
+ res.writeHead(400, { 'Content-Type': 'text/html' });
228
+ res.end(getErrorHtml('Missing required parameters'));
229
+ server.close();
230
+ resolve({ success: false, error: 'Missing required parameters' });
231
+ return;
232
+ }
233
+ resolved = true;
234
+ const project = {
235
+ projectName,
236
+ host,
237
+ adminToken,
238
+ };
239
+ res.writeHead(200, { 'Content-Type': 'text/html' });
240
+ res.end(getPanelSuccessHtml(projectName, userEmail ?? 'user'));
241
+ Promise.all([
242
+ userEmail ? saveCloudAuth({ email: userEmail, accessToken: adminToken }) : Promise.resolve(),
243
+ saveProjectAuth(project),
244
+ ])
245
+ .then(() => {
246
+ server.close();
247
+ resolve({
248
+ success: true,
249
+ email: userEmail ?? undefined,
250
+ project,
251
+ });
252
+ })
253
+ .catch((err) => {
254
+ server.close();
255
+ resolve({ success: false, error: err.message });
256
+ });
257
+ }
258
+ else {
259
+ res.writeHead(404);
260
+ res.end('Not found');
261
+ }
262
+ });
263
+ server.listen(port, () => {
264
+ const authUrl = `${CLOUD_AUTH_URL}/en/app/cli-auth?callback_port=${port}`;
265
+ console.log(`\n🔐 Opening browser for authentication...`);
266
+ console.log(` If the browser doesn't open, visit: ${authUrl}\n`);
267
+ openBrowser(authUrl);
268
+ });
269
+ server.on('error', (err) => {
270
+ if (!resolved) {
271
+ resolved = true;
272
+ resolve({ success: false, error: `Server error: ${err.message}` });
273
+ }
274
+ });
275
+ setTimeout(() => {
276
+ if (!resolved) {
277
+ resolved = true;
278
+ server.close();
279
+ resolve({ success: false, error: 'Login timed out. Please try again.' });
280
+ }
281
+ }, timeout);
282
+ });
283
+ }
284
+ function openBrowser(url) {
285
+ const { exec } = require('node:child_process');
286
+ const platform = process.platform;
287
+ let command;
288
+ if (platform === 'darwin') {
289
+ command = `open "${url}"`;
290
+ }
291
+ else if (platform === 'win32') {
292
+ command = `start "" "${url}"`;
293
+ }
294
+ else {
295
+ command = `xdg-open "${url}"`;
296
+ }
297
+ exec(command, (err) => {
298
+ if (err) {
299
+ console.error('Could not open browser automatically.');
300
+ }
301
+ });
302
+ }
303
+ function getCloudSuccessHtml(email) {
304
+ return `
305
+ <!DOCTYPE html>
306
+ <html>
307
+ <head>
308
+ <meta charset="utf-8">
309
+ <title>Husar CLI - Cloud Login Successful</title>
310
+ <style>
311
+ body {
312
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
313
+ background: linear-gradient(135deg, #1a1a2e 0%, #16213e 100%);
314
+ color: white;
315
+ min-height: 100vh;
316
+ display: flex;
317
+ align-items: center;
318
+ justify-content: center;
319
+ margin: 0;
320
+ }
321
+ .container {
322
+ text-align: center;
323
+ padding: 40px;
324
+ background: rgba(255,255,255,0.05);
325
+ border-radius: 16px;
326
+ border: 1px solid rgba(255,255,255,0.1);
327
+ }
328
+ .success-icon {
329
+ font-size: 64px;
330
+ margin-bottom: 20px;
331
+ }
332
+ h1 { margin: 0 0 10px; }
333
+ p { color: #a0a0a0; margin: 5px 0; }
334
+ .email { color: #60a5fa; font-weight: 600; }
335
+ .close-note {
336
+ margin-top: 30px;
337
+ font-size: 14px;
338
+ color: #666;
339
+ }
340
+ </style>
341
+ </head>
342
+ <body>
343
+ <div class="container">
344
+ <div class="success-icon">✅</div>
345
+ <h1>Cloud Login Successful!</h1>
346
+ <p>Logged in as <span class="email">${escapeHtml(email)}</span></p>
347
+ <p class="close-note">You can close this window and return to the terminal.</p>
348
+ </div>
349
+ </body>
350
+ </html>
351
+ `.trim();
352
+ }
353
+ function getPanelSuccessHtml(projectName, email) {
354
+ const emailLine = email ? `<p>Logged in as <strong>${escapeHtml(email)}</strong></p>` : '';
355
+ return `
356
+ <!DOCTYPE html>
357
+ <html>
358
+ <head>
359
+ <meta charset="utf-8">
360
+ <title>Husar CLI - CMS Connected</title>
361
+ <style>
362
+ body {
363
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
364
+ background: linear-gradient(135deg, #1a1a2e 0%, #16213e 100%);
365
+ color: white;
366
+ min-height: 100vh;
367
+ display: flex;
368
+ align-items: center;
369
+ justify-content: center;
370
+ margin: 0;
371
+ }
372
+ .container {
373
+ text-align: center;
374
+ padding: 40px;
375
+ background: rgba(255,255,255,0.05);
376
+ border-radius: 16px;
377
+ border: 1px solid rgba(255,255,255,0.1);
378
+ }
379
+ .success-icon {
380
+ font-size: 64px;
381
+ margin-bottom: 20px;
382
+ }
383
+ h1 { margin: 0 0 10px; }
384
+ p { color: #a0a0a0; margin: 5px 0; }
385
+ .project { color: #60a5fa; font-weight: 600; }
386
+ .close-note {
387
+ margin-top: 30px;
388
+ font-size: 14px;
389
+ color: #666;
390
+ }
391
+ </style>
392
+ </head>
393
+ <body>
394
+ <div class="container">
395
+ <div class="success-icon">✅</div>
396
+ <h1>CMS Connected!</h1>
397
+ ${emailLine}
398
+ <p>Connected to project <span class="project">${escapeHtml(projectName)}</span></p>
399
+ <p class="close-note">You can close this window and return to the terminal.</p>
400
+ </div>
401
+ </body>
402
+ </html>
403
+ `.trim();
404
+ }
405
+ function getErrorHtml(error) {
406
+ return `
407
+ <!DOCTYPE html>
408
+ <html>
409
+ <head>
410
+ <meta charset="utf-8">
411
+ <title>Husar CLI - Error</title>
412
+ <style>
413
+ body {
414
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
415
+ background: linear-gradient(135deg, #1a1a2e 0%, #16213e 100%);
416
+ color: white;
417
+ min-height: 100vh;
418
+ display: flex;
419
+ align-items: center;
420
+ justify-content: center;
421
+ margin: 0;
422
+ }
423
+ .container {
424
+ text-align: center;
425
+ padding: 40px;
426
+ background: rgba(255,255,255,0.05);
427
+ border-radius: 16px;
428
+ border: 1px solid rgba(239,68,68,0.3);
429
+ }
430
+ .error-icon {
431
+ font-size: 64px;
432
+ margin-bottom: 20px;
433
+ }
434
+ h1 { margin: 0 0 10px; color: #ef4444; }
435
+ p { color: #a0a0a0; margin: 5px 0; }
436
+ .error-msg { color: #fca5a5; }
437
+ </style>
438
+ </head>
439
+ <body>
440
+ <div class="container">
441
+ <div class="error-icon">❌</div>
442
+ <h1>Authorization Failed</h1>
443
+ <p class="error-msg">${escapeHtml(error)}</p>
444
+ <p>Please try again or contact support.</p>
445
+ </div>
446
+ </body>
447
+ </html>
448
+ `.trim();
449
+ }
450
+ //# sourceMappingURL=login.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/auth/login.ts"],"names":[],"mappings":"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"}
package/dist/cli.js CHANGED
@@ -4,6 +4,10 @@ import { ConfigMaker } from 'config-maker';
4
4
  import { parser } from './functions/parser.js';
5
5
  import { generateCms } from './functions/generate.js';
6
6
  import { startMcpServer } from './mcp.js';
7
+ import { getAdminToken } from "./types/config.js";
8
+ import { startLoginFlow } from './auth/login.js';
9
+ import { clearAuth, getCurrentUser, getConfigPath, isLoggedIn, readAuthConfig } from './auth/config.js';
10
+ import { runCreateCommand } from './functions/create.js';
7
11
  const config = new ConfigMaker('husar', { decoders: {} });
8
12
  const program = new Command();
9
13
  program.name('husar').description('HUSAR CLI for complete generation').version('0.0.5');
@@ -31,13 +35,14 @@ program
31
35
  if (!conf.host) {
32
36
  throw new Error('Host is not configured. Please run "husar generate" first.');
33
37
  }
34
- if (!conf.adminToken) {
35
- throw new Error('Admin token is not configured. Please set it in the config or use environment variable.');
38
+ const adminToken = getAdminToken(conf);
39
+ if (!adminToken) {
40
+ throw new Error('Admin token not configured. Set HUSAR_ADMIN_TOKEN env var, or adminTokenEnv in husar.json');
36
41
  }
37
42
  const result = await parser({
38
43
  inputFile,
39
44
  opts: { name, type: opts?.type },
40
- authentication: { HUSAR_MCP_HOST: conf.host, HUSAR_MCP_ADMIN_TOKEN: conf.adminToken },
45
+ authentication: { HUSAR_MCP_HOST: conf.host, HUSAR_MCP_ADMIN_TOKEN: adminToken },
41
46
  });
42
47
  console.log(result ? 'File parsed and upserted successfully.' : 'Failed to parse and upsert file.');
43
48
  });
@@ -48,5 +53,80 @@ program
48
53
  await startMcpServer();
49
54
  await new Promise(() => { });
50
55
  });
56
+ program
57
+ .command('login')
58
+ .description('Log in to Husar.ai via browser authentication')
59
+ .action(async () => {
60
+ const loggedIn = await isLoggedIn();
61
+ if (loggedIn) {
62
+ const user = await getCurrentUser();
63
+ console.log(`Already logged in as ${user?.email}`);
64
+ console.log('Run "husar logout" to switch accounts.');
65
+ return;
66
+ }
67
+ console.log('Starting Husar.ai authentication...');
68
+ const result = await startLoginFlow();
69
+ if (result.success) {
70
+ console.log(`\n✅ Successfully logged in as ${result.email}`);
71
+ if (result.project) {
72
+ console.log(` Connected to project: ${result.project.projectName}`);
73
+ console.log(` Host: ${result.project.host}`);
74
+ }
75
+ }
76
+ else {
77
+ console.error(`\n❌ Login failed: ${result.error}`);
78
+ process.exit(1);
79
+ }
80
+ });
81
+ program
82
+ .command('logout')
83
+ .description('Log out and clear stored credentials')
84
+ .action(async () => {
85
+ const loggedIn = await isLoggedIn();
86
+ if (!loggedIn) {
87
+ console.log('Not logged in.');
88
+ return;
89
+ }
90
+ const user = await getCurrentUser();
91
+ await clearAuth();
92
+ console.log(`✅ Logged out${user?.email ? ` (was: ${user.email})` : ''}`);
93
+ console.log(` Cleared credentials from ${getConfigPath()}`);
94
+ });
95
+ program
96
+ .command('whoami')
97
+ .description('Display current logged-in user and projects')
98
+ .action(async () => {
99
+ const loggedIn = await isLoggedIn();
100
+ if (!loggedIn) {
101
+ console.log('Not logged in. Run "husar login" to authenticate.');
102
+ return;
103
+ }
104
+ const user = await getCurrentUser();
105
+ const authConfig = await readAuthConfig();
106
+ console.log(`\n👤 Logged in as: ${user?.email}`);
107
+ if (authConfig.projects && Object.keys(authConfig.projects).length > 0) {
108
+ console.log('\n📦 Connected projects:');
109
+ for (const [name, project] of Object.entries(authConfig.projects)) {
110
+ console.log(` • ${name}`);
111
+ console.log(` Host: ${project.host}`);
112
+ }
113
+ }
114
+ else {
115
+ console.log('\nNo projects connected. Run "husar create" to set up a new project.');
116
+ }
117
+ console.log(`\n📁 Config: ${getConfigPath()}`);
118
+ });
119
+ program
120
+ .command('create [projectName]')
121
+ .description('Create a new project with Husar CMS integration')
122
+ .option('-f, --framework <framework>', 'Framework to use: nextjs or vite', 'nextjs')
123
+ .option('--skip-install', 'Skip package installation after scaffolding')
124
+ .action(async (projectName, opts) => {
125
+ await runCreateCommand({
126
+ projectName,
127
+ framework: opts.framework,
128
+ skipInstall: opts.skipInstall,
129
+ });
130
+ });
51
131
  program.parse(process.argv);
52
132
  //# sourceMappingURL=cli.js.map
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAG1C,MAAM,MAAM,GAAG,IAAI,WAAW,CAAkB,OAAO,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;AAE3E,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,WAAW,CAAC,mCAAmC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;AAExF,OAAO;KACJ,OAAO,CAAC,uBAAuB,CAAC;KAChC,WAAW,CAAC,0CAA0C,CAAC;KACvD,MAAM,CAAC,KAAK,EAAE,aAAqB,GAAG,EAAE,EAAE;IACzC,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,MAAM,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;IACzE,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,EAAE,CAAC;IAC1B,MAAM,OAAO,GAAG,IAAI,CAAC,uBAAuB,CAAC;IAC7C,MAAM,iBAAiB,GAAG,IAAI,CAAC,iCAAiC,CAAC;IACjE,MAAM,WAAW,CAAC;QAChB,UAAU,EAAE,UAAU;QACtB,IAAI;QACJ,uBAAuB,EAAE,OAAO;QAChC,iCAAiC,EAAE,iBAAiB;KACrD,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,yBAAyB,CAAC;KAClC,WAAW,CAAC,iEAAiE,CAAC;KAC9E,MAAM,CAAC,mBAAmB,EAAE,0BAA0B,EAAE,OAAO,CAAC;KAChE,MAAM,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE;IACtC,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,EAAE,CAAC;IAC1B,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;IAChF,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,yFAAyF,CAAC,CAAC;IAC7G,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC;QAC1B,SAAS;QACT,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE;QAChC,cAAc,EAAE,EAAE,cAAc,EAAE,IAAI,CAAC,IAAI,EAAE,qBAAqB,EAAE,IAAI,CAAC,UAAU,EAAE;KACtF,CAAC,CAAC;IACH,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,wCAAwC,CAAC,CAAC,CAAC,kCAAkC,CAAC,CAAC;AACtG,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,KAAK,CAAC;KACd,WAAW,CAAC,qCAAqC,CAAC;KAClD,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,cAAc,EAAE,CAAC;IAGvB,MAAM,IAAI,OAAO,CAAO,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;AACpC,CAAC,CAAC,CAAC;AAEL,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export interface CreateOptions {
2
+ projectName?: string;
3
+ framework: 'nextjs' | 'vite';
4
+ skipInstall?: boolean;
5
+ }
6
+ export declare function runCreateCommand(options: CreateOptions): Promise<void>;