vigthoria-cli 1.1.0 → 1.4.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 (49) hide show
  1. package/README.md +85 -2
  2. package/SECURITY_HARDENING.md +253 -0
  3. package/dist/commands/chat.d.ts +2 -2
  4. package/dist/commands/chat.js +4 -4
  5. package/dist/commands/chat.js.map +1 -1
  6. package/dist/commands/deploy.d.ts +80 -0
  7. package/dist/commands/deploy.d.ts.map +1 -0
  8. package/dist/commands/deploy.js +514 -0
  9. package/dist/commands/deploy.js.map +1 -0
  10. package/dist/commands/generate.d.ts +3 -0
  11. package/dist/commands/generate.d.ts.map +1 -1
  12. package/dist/commands/generate.js +45 -4
  13. package/dist/commands/generate.js.map +1 -1
  14. package/dist/commands/hub.d.ts +40 -0
  15. package/dist/commands/hub.d.ts.map +1 -0
  16. package/dist/commands/hub.js +289 -0
  17. package/dist/commands/hub.js.map +1 -0
  18. package/dist/commands/repo.d.ts +80 -0
  19. package/dist/commands/repo.d.ts.map +1 -0
  20. package/dist/commands/repo.js +607 -0
  21. package/dist/commands/repo.js.map +1 -0
  22. package/dist/index.d.ts +1 -0
  23. package/dist/index.d.ts.map +1 -1
  24. package/dist/index.js +267 -10
  25. package/dist/index.js.map +1 -1
  26. package/dist/utils/api.d.ts +15 -0
  27. package/dist/utils/api.d.ts.map +1 -1
  28. package/dist/utils/api.js +62 -33
  29. package/dist/utils/api.js.map +1 -1
  30. package/dist/utils/config.js +1 -1
  31. package/dist/utils/config.js.map +1 -1
  32. package/dist/utils/session.d.ts +1 -1
  33. package/dist/utils/session.js +1 -1
  34. package/dist/utils/tools.d.ts +18 -3
  35. package/dist/utils/tools.d.ts.map +1 -1
  36. package/dist/utils/tools.js +326 -20
  37. package/dist/utils/tools.js.map +1 -1
  38. package/install.sh +1 -1
  39. package/package.json +6 -3
  40. package/src/commands/chat.ts +4 -4
  41. package/src/commands/deploy.ts +609 -0
  42. package/src/commands/generate.ts +49 -4
  43. package/src/commands/hub.ts +382 -0
  44. package/src/commands/repo.ts +729 -0
  45. package/src/index.ts +297 -10
  46. package/src/utils/api.ts +78 -34
  47. package/src/utils/config.ts +1 -1
  48. package/src/utils/session.ts +1 -1
  49. package/src/utils/tools.ts +348 -21
@@ -0,0 +1,514 @@
1
+ "use strict";
2
+ /**
3
+ * Vigthoria CLI - Deploy Commands
4
+ *
5
+ * Deploy and host projects on Vigthoria infrastructure
6
+ *
7
+ * Usage:
8
+ * vig deploy - Interactive deploy wizard
9
+ * vig deploy --subdomain <name> - Deploy to name.vigthoria.io
10
+ * vig deploy --domain <domain> - Deploy to custom domain
11
+ * vig deploy status - Show deployment status
12
+ * vig deploy list - List all deployments
13
+ * vig deploy remove <domain> - Remove a deployment
14
+ */
15
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
16
+ if (k2 === undefined) k2 = k;
17
+ var desc = Object.getOwnPropertyDescriptor(m, k);
18
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
19
+ desc = { enumerable: true, get: function() { return m[k]; } };
20
+ }
21
+ Object.defineProperty(o, k2, desc);
22
+ }) : (function(o, m, k, k2) {
23
+ if (k2 === undefined) k2 = k;
24
+ o[k2] = m[k];
25
+ }));
26
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
27
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
28
+ }) : function(o, v) {
29
+ o["default"] = v;
30
+ });
31
+ var __importStar = (this && this.__importStar) || (function () {
32
+ var ownKeys = function(o) {
33
+ ownKeys = Object.getOwnPropertyNames || function (o) {
34
+ var ar = [];
35
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
36
+ return ar;
37
+ };
38
+ return ownKeys(o);
39
+ };
40
+ return function (mod) {
41
+ if (mod && mod.__esModule) return mod;
42
+ var result = {};
43
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
44
+ __setModuleDefault(result, mod);
45
+ return result;
46
+ };
47
+ })();
48
+ var __importDefault = (this && this.__importDefault) || function (mod) {
49
+ return (mod && mod.__esModule) ? mod : { "default": mod };
50
+ };
51
+ Object.defineProperty(exports, "__esModule", { value: true });
52
+ exports.DeployCommand = void 0;
53
+ const chalk_1 = __importDefault(require("chalk"));
54
+ const fs = __importStar(require("fs"));
55
+ const path = __importStar(require("path"));
56
+ const ora_1 = __importDefault(require("ora"));
57
+ const inquirer_1 = __importDefault(require("inquirer"));
58
+ class DeployCommand {
59
+ config;
60
+ logger;
61
+ apiBase;
62
+ constructor(config, logger) {
63
+ this.config = config;
64
+ this.logger = logger;
65
+ this.apiBase = this.config.get('apiUrl') || 'https://coder.vigthoria.io';
66
+ }
67
+ getAuthHeaders() {
68
+ const token = this.config.get('authToken');
69
+ return {
70
+ 'Authorization': `Bearer ${token}`,
71
+ 'Content-Type': 'application/json'
72
+ };
73
+ }
74
+ isAuthenticated() {
75
+ return !!this.config.get('authToken');
76
+ }
77
+ requireAuth() {
78
+ if (!this.isAuthenticated()) {
79
+ console.log(chalk_1.default.red('\n❌ Authentication required'));
80
+ console.log(chalk_1.default.gray(' Run `vig login` to authenticate first.\n'));
81
+ process.exit(1);
82
+ }
83
+ }
84
+ /**
85
+ * Interactive deploy wizard
86
+ */
87
+ async deploy(options = {}) {
88
+ this.requireAuth();
89
+ console.log(chalk_1.default.cyan('\n🚀 Vigthoria Deploy - Host Your Project\n'));
90
+ // If subdomain or domain specified, deploy directly
91
+ if (options.subdomain) {
92
+ await this.deployToSubdomain(options.subdomain, options.project);
93
+ return;
94
+ }
95
+ if (options.domain) {
96
+ await this.deployToCustomDomain(options.domain, options.project);
97
+ return;
98
+ }
99
+ // Interactive wizard
100
+ const { deployType } = await inquirer_1.default.prompt([{
101
+ type: 'list',
102
+ name: 'deployType',
103
+ message: 'How would you like to deploy?',
104
+ choices: [
105
+ { name: '🆓 Preview URL (Free) - coder.vigthoria.io/preview/...', value: 'preview' },
106
+ { name: '🌐 Vigthoria Subdomain (€4.99/mo) - yourapp.vigthoria.io', value: 'subdomain' },
107
+ { name: '🔗 Custom Domain (€9.99/mo) - yourdomain.com', value: 'custom' },
108
+ { name: '📊 View Hosting Plans', value: 'plans' }
109
+ ]
110
+ }]);
111
+ switch (deployType) {
112
+ case 'preview':
113
+ await this.deployToPreview(options.project);
114
+ break;
115
+ case 'subdomain':
116
+ await this.promptSubdomainDeploy(options.project);
117
+ break;
118
+ case 'custom':
119
+ await this.promptCustomDomainDeploy(options.project);
120
+ break;
121
+ case 'plans':
122
+ await this.showPlans();
123
+ break;
124
+ }
125
+ }
126
+ /**
127
+ * Deploy to preview URL (free)
128
+ */
129
+ async deployToPreview(projectPath) {
130
+ const spinner = (0, ora_1.default)('Deploying to preview...').start();
131
+ try {
132
+ const projectDir = projectPath || process.cwd();
133
+ const projectInfo = this.detectProjectInfo(projectDir);
134
+ const response = await fetch(`${this.apiBase}/api/hosting/deploy/preview`, {
135
+ method: 'POST',
136
+ headers: this.getAuthHeaders(),
137
+ body: JSON.stringify({
138
+ projectName: projectInfo.name,
139
+ projectPath: projectDir
140
+ })
141
+ });
142
+ if (!response.ok) {
143
+ const error = await response.json();
144
+ throw new Error(error.error || 'Failed to deploy');
145
+ }
146
+ const data = await response.json();
147
+ spinner.succeed(chalk_1.default.green('Deployed to preview!'));
148
+ console.log(chalk_1.default.cyan('\n🔗 Preview URL:'));
149
+ console.log(chalk_1.default.white(` ${data.url}`));
150
+ console.log(chalk_1.default.gray('\n Note: Preview URLs may expire after 7 days of inactivity.'));
151
+ console.log(chalk_1.default.gray(' Upgrade to a subdomain for permanent hosting.\n'));
152
+ }
153
+ catch (error) {
154
+ spinner.fail('Deploy failed');
155
+ const errMsg = error instanceof Error ? error.message : 'Unknown error';
156
+ console.log(chalk_1.default.red(`\n❌ Error: ${errMsg}\n`));
157
+ }
158
+ }
159
+ /**
160
+ * Deploy to Vigthoria subdomain
161
+ */
162
+ async deployToSubdomain(subdomain, projectPath) {
163
+ const spinner = (0, ora_1.default)(`Deploying to ${subdomain}.vigthoria.io...`).start();
164
+ try {
165
+ // Validate subdomain format
166
+ if (!/^[a-z0-9][a-z0-9-]*[a-z0-9]$/.test(subdomain) || subdomain.length < 3) {
167
+ throw new Error('Subdomain must be 3+ chars, lowercase alphanumeric with hyphens');
168
+ }
169
+ const projectDir = projectPath || process.cwd();
170
+ const projectInfo = this.detectProjectInfo(projectDir);
171
+ const response = await fetch(`${this.apiBase}/api/hosting/deploy/subdomain`, {
172
+ method: 'POST',
173
+ headers: this.getAuthHeaders(),
174
+ body: JSON.stringify({
175
+ subdomain,
176
+ projectName: projectInfo.name,
177
+ projectPath: projectDir
178
+ })
179
+ });
180
+ const data = await response.json();
181
+ if (!response.ok || !data.success) {
182
+ if (data.requiresSubscription) {
183
+ spinner.stop();
184
+ console.log(chalk_1.default.yellow('\n⚠️ Subdomain hosting requires a subscription (€4.99/mo)'));
185
+ const { proceed } = await inquirer_1.default.prompt([{
186
+ type: 'confirm',
187
+ name: 'proceed',
188
+ message: 'Would you like to subscribe now?',
189
+ default: true
190
+ }]);
191
+ if (proceed && data.checkoutUrl) {
192
+ console.log(chalk_1.default.cyan(`\n🔗 Opening checkout: ${data.checkoutUrl}`));
193
+ console.log(chalk_1.default.gray('Please open this URL in your browser to subscribe.\n'));
194
+ }
195
+ return;
196
+ }
197
+ throw new Error(data.error || 'Failed to deploy');
198
+ }
199
+ spinner.succeed(chalk_1.default.green(`Deployed to ${subdomain}.vigthoria.io!`));
200
+ console.log(chalk_1.default.cyan('\n🌐 Your Site is Live:'));
201
+ console.log(chalk_1.default.bold.white(` https://${subdomain}.vigthoria.io`));
202
+ console.log(chalk_1.default.gray('\n ✓ SSL certificate auto-configured'));
203
+ console.log(chalk_1.default.gray(' ✓ Global CDN enabled'));
204
+ console.log(chalk_1.default.gray(' ✓ Unlimited traffic included\n'));
205
+ }
206
+ catch (error) {
207
+ spinner.fail('Deploy failed');
208
+ const errMsg = error instanceof Error ? error.message : 'Unknown error';
209
+ console.log(chalk_1.default.red(`\n❌ Error: ${errMsg}\n`));
210
+ }
211
+ }
212
+ /**
213
+ * Deploy to custom domain
214
+ */
215
+ async deployToCustomDomain(domain, projectPath) {
216
+ const spinner = (0, ora_1.default)(`Setting up ${domain}...`).start();
217
+ try {
218
+ const projectDir = projectPath || process.cwd();
219
+ const projectInfo = this.detectProjectInfo(projectDir);
220
+ const response = await fetch(`${this.apiBase}/api/hosting/deploy/custom`, {
221
+ method: 'POST',
222
+ headers: this.getAuthHeaders(),
223
+ body: JSON.stringify({
224
+ domain,
225
+ projectName: projectInfo.name,
226
+ projectPath: projectDir
227
+ })
228
+ });
229
+ const data = await response.json();
230
+ if (!response.ok || !data.success) {
231
+ if (data.requiresSubscription) {
232
+ spinner.stop();
233
+ console.log(chalk_1.default.yellow('\n⚠️ Custom domain hosting requires a subscription (€9.99/mo)'));
234
+ const { proceed } = await inquirer_1.default.prompt([{
235
+ type: 'confirm',
236
+ name: 'proceed',
237
+ message: 'Would you like to subscribe now?',
238
+ default: true
239
+ }]);
240
+ if (proceed && data.checkoutUrl) {
241
+ console.log(chalk_1.default.cyan(`\n🔗 Checkout URL: ${data.checkoutUrl}`));
242
+ console.log(chalk_1.default.gray('Please open this URL in your browser to subscribe.\n'));
243
+ }
244
+ return;
245
+ }
246
+ throw new Error(data.error || 'Failed to deploy');
247
+ }
248
+ spinner.succeed(chalk_1.default.green('Domain registered!'));
249
+ if (data.dnsRecords) {
250
+ console.log(chalk_1.default.cyan('\n📝 Configure your DNS records:'));
251
+ console.log(chalk_1.default.gray('─'.repeat(60)));
252
+ for (const record of data.dnsRecords) {
253
+ console.log(chalk_1.default.white(` Type: ${record.type.padEnd(6)} Name: ${record.name.padEnd(20)} Value: ${record.value}`));
254
+ }
255
+ console.log(chalk_1.default.gray('─'.repeat(60)));
256
+ console.log(chalk_1.default.yellow('\n⏳ After adding DNS records, run:'));
257
+ console.log(chalk_1.default.white(` vig deploy verify ${domain}\n`));
258
+ }
259
+ }
260
+ catch (error) {
261
+ spinner.fail('Deploy failed');
262
+ const errMsg = error instanceof Error ? error.message : 'Unknown error';
263
+ console.log(chalk_1.default.red(`\n❌ Error: ${errMsg}\n`));
264
+ }
265
+ }
266
+ /**
267
+ * Interactive subdomain prompt
268
+ */
269
+ async promptSubdomainDeploy(projectPath) {
270
+ const { subdomain } = await inquirer_1.default.prompt([{
271
+ type: 'input',
272
+ name: 'subdomain',
273
+ message: 'Enter your desired subdomain:',
274
+ suffix: chalk_1.default.gray('.vigthoria.io'),
275
+ validate: (input) => {
276
+ if (!/^[a-z0-9][a-z0-9-]*[a-z0-9]$/.test(input) || input.length < 3) {
277
+ return 'Subdomain must be 3+ chars, lowercase alphanumeric with hyphens';
278
+ }
279
+ return true;
280
+ }
281
+ }]);
282
+ await this.deployToSubdomain(subdomain, projectPath);
283
+ }
284
+ /**
285
+ * Interactive custom domain prompt
286
+ */
287
+ async promptCustomDomainDeploy(projectPath) {
288
+ const { domain } = await inquirer_1.default.prompt([{
289
+ type: 'input',
290
+ name: 'domain',
291
+ message: 'Enter your domain:',
292
+ suffix: chalk_1.default.gray(' (e.g., myapp.com)'),
293
+ validate: (input) => {
294
+ if (!/^[a-z0-9][a-z0-9.-]+\.[a-z]{2,}$/i.test(input)) {
295
+ return 'Please enter a valid domain name';
296
+ }
297
+ return true;
298
+ }
299
+ }]);
300
+ await this.deployToCustomDomain(domain, projectPath);
301
+ }
302
+ /**
303
+ * Show hosting plans
304
+ */
305
+ async showPlans() {
306
+ const spinner = (0, ora_1.default)('Fetching hosting plans...').start();
307
+ try {
308
+ const response = await fetch(`${this.apiBase}/api/hosting/plans`, {
309
+ headers: this.getAuthHeaders()
310
+ });
311
+ if (!response.ok) {
312
+ throw new Error('Failed to fetch plans');
313
+ }
314
+ const data = await response.json();
315
+ spinner.stop();
316
+ console.log(chalk_1.default.cyan('\n📊 Vigthoria Hosting Plans\n'));
317
+ console.log(chalk_1.default.gray('═'.repeat(70)));
318
+ for (const plan of data.plans) {
319
+ const price = plan.price_monthly === 0
320
+ ? chalk_1.default.green('FREE')
321
+ : chalk_1.default.yellow(`€${plan.price_monthly.toFixed(2)}/mo`);
322
+ console.log(chalk_1.default.bold.white(`\n ${plan.display_name} - ${price}`));
323
+ console.log(chalk_1.default.gray(' ' + '─'.repeat(50)));
324
+ const features = [];
325
+ if (plan.subdomain_allowed)
326
+ features.push('✓ Vigthoria subdomain');
327
+ if (plan.custom_domain_allowed)
328
+ features.push('✓ Custom domain');
329
+ features.push(`✓ ${plan.max_projects === -1 ? 'Unlimited' : plan.max_projects} project(s)`);
330
+ features.push(`✓ ${plan.storage_mb >= 1024 ? (plan.storage_mb / 1024) + 'GB' : plan.storage_mb + 'MB'} storage`);
331
+ features.forEach(f => console.log(chalk_1.default.gray(` ${f}`)));
332
+ }
333
+ console.log(chalk_1.default.gray('\n' + '═'.repeat(70)));
334
+ console.log(chalk_1.default.cyan('\n Subscribe: vig deploy --subdomain myapp\n'));
335
+ }
336
+ catch (error) {
337
+ spinner.fail('Failed to fetch plans');
338
+ const errMsg = error instanceof Error ? error.message : 'Unknown error';
339
+ console.log(chalk_1.default.red(`\n❌ Error: ${errMsg}\n`));
340
+ }
341
+ }
342
+ /**
343
+ * List all deployments
344
+ */
345
+ async list() {
346
+ this.requireAuth();
347
+ const spinner = (0, ora_1.default)('Fetching deployments...').start();
348
+ try {
349
+ const response = await fetch(`${this.apiBase}/api/hosting/domains`, {
350
+ headers: this.getAuthHeaders()
351
+ });
352
+ if (!response.ok) {
353
+ throw new Error('Failed to fetch deployments');
354
+ }
355
+ const data = await response.json();
356
+ spinner.stop();
357
+ if (data.domains.length === 0) {
358
+ console.log(chalk_1.default.yellow('\n📦 No deployments yet.\n'));
359
+ console.log(chalk_1.default.gray(' Run `vig deploy` to deploy your first project.\n'));
360
+ return;
361
+ }
362
+ console.log(chalk_1.default.cyan(`\n🌐 Your Deployments (${data.domains.length})\n`));
363
+ for (const domain of data.domains) {
364
+ const statusIcon = domain.is_active ? '🟢' : '🔴';
365
+ const sslIcon = domain.ssl_status === 'active' ? '🔒' : '⚠️';
366
+ const url = domain.domain_type === 'subdomain'
367
+ ? `${domain.subdomain}.vigthoria.io`
368
+ : domain.domain_type === 'custom'
369
+ ? domain.custom_domain
370
+ : domain.url;
371
+ console.log(chalk_1.default.white(` ${statusIcon} ${url}`));
372
+ console.log(chalk_1.default.gray(` Project: ${domain.project_name} | SSL: ${sslIcon} ${domain.ssl_status} | Tier: ${domain.hosting_tier}`));
373
+ console.log();
374
+ }
375
+ }
376
+ catch (error) {
377
+ spinner.fail('List failed');
378
+ const errMsg = error instanceof Error ? error.message : 'Unknown error';
379
+ console.log(chalk_1.default.red(`\n❌ Error: ${errMsg}\n`));
380
+ }
381
+ }
382
+ /**
383
+ * Check deployment status
384
+ */
385
+ async status(domain) {
386
+ this.requireAuth();
387
+ const spinner = (0, ora_1.default)('Checking status...').start();
388
+ try {
389
+ const endpoint = domain
390
+ ? `${this.apiBase}/api/hosting/domain/${encodeURIComponent(domain)}/status`
391
+ : `${this.apiBase}/api/hosting/status`;
392
+ const response = await fetch(endpoint, {
393
+ headers: this.getAuthHeaders()
394
+ });
395
+ if (!response.ok) {
396
+ throw new Error('Failed to fetch status');
397
+ }
398
+ const data = await response.json();
399
+ spinner.stop();
400
+ console.log(chalk_1.default.cyan('\n📊 Deployment Status\n'));
401
+ console.log(JSON.stringify(data, null, 2));
402
+ }
403
+ catch (error) {
404
+ spinner.fail('Status check failed');
405
+ const errMsg = error instanceof Error ? error.message : 'Unknown error';
406
+ console.log(chalk_1.default.red(`\n❌ Error: ${errMsg}\n`));
407
+ }
408
+ }
409
+ /**
410
+ * Verify DNS for custom domain
411
+ */
412
+ async verify(domain) {
413
+ this.requireAuth();
414
+ const spinner = (0, ora_1.default)(`Verifying DNS for ${domain}...`).start();
415
+ try {
416
+ const response = await fetch(`${this.apiBase}/api/hosting/domain/verify`, {
417
+ method: 'POST',
418
+ headers: this.getAuthHeaders(),
419
+ body: JSON.stringify({ domain })
420
+ });
421
+ const data = await response.json();
422
+ if (!response.ok || !data.success) {
423
+ throw new Error(data.error || 'Verification failed');
424
+ }
425
+ if (data.verified) {
426
+ spinner.succeed(chalk_1.default.green('Domain verified!'));
427
+ console.log(chalk_1.default.cyan(`\n🎉 Your site is now live at: https://${domain}`));
428
+ console.log(chalk_1.default.gray(` SSL Status: ${data.sslStatus || 'Provisioning...'}\n`));
429
+ }
430
+ else {
431
+ spinner.warn(chalk_1.default.yellow('DNS not propagated yet'));
432
+ console.log(chalk_1.default.gray('\n DNS changes can take up to 48 hours to propagate.'));
433
+ console.log(chalk_1.default.gray(' Try again later with: vig deploy verify ' + domain + '\n'));
434
+ }
435
+ }
436
+ catch (error) {
437
+ spinner.fail('Verification failed');
438
+ const errMsg = error instanceof Error ? error.message : 'Unknown error';
439
+ console.log(chalk_1.default.red(`\n❌ Error: ${errMsg}\n`));
440
+ }
441
+ }
442
+ /**
443
+ * Remove a deployment
444
+ */
445
+ async remove(domain) {
446
+ this.requireAuth();
447
+ const { confirm } = await inquirer_1.default.prompt([{
448
+ type: 'confirm',
449
+ name: 'confirm',
450
+ message: chalk_1.default.red(`Are you sure you want to remove ${domain}?`),
451
+ default: false
452
+ }]);
453
+ if (!confirm) {
454
+ console.log(chalk_1.default.yellow('\n⚠️ Removal cancelled.\n'));
455
+ return;
456
+ }
457
+ const spinner = (0, ora_1.default)(`Removing ${domain}...`).start();
458
+ try {
459
+ const response = await fetch(`${this.apiBase}/api/hosting/domain/${encodeURIComponent(domain)}`, {
460
+ method: 'DELETE',
461
+ headers: this.getAuthHeaders()
462
+ });
463
+ if (!response.ok) {
464
+ const error = await response.json();
465
+ throw new Error(error.error || 'Failed to remove');
466
+ }
467
+ spinner.succeed(chalk_1.default.green('Domain removed'));
468
+ console.log(chalk_1.default.gray('\n Your project files are still in your repository.\n'));
469
+ }
470
+ catch (error) {
471
+ spinner.fail('Remove failed');
472
+ const errMsg = error instanceof Error ? error.message : 'Unknown error';
473
+ console.log(chalk_1.default.red(`\n❌ Error: ${errMsg}\n`));
474
+ }
475
+ }
476
+ /**
477
+ * Detect project info from directory
478
+ */
479
+ detectProjectInfo(projectPath) {
480
+ const packageJsonPath = path.join(projectPath, 'package.json');
481
+ let name = path.basename(projectPath);
482
+ const techStack = [];
483
+ if (fs.existsSync(packageJsonPath)) {
484
+ try {
485
+ const pkg = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'));
486
+ name = pkg.name || name;
487
+ const deps = { ...pkg.dependencies, ...pkg.devDependencies };
488
+ if (deps.react)
489
+ techStack.push('React');
490
+ if (deps.vue)
491
+ techStack.push('Vue');
492
+ if (deps.next)
493
+ techStack.push('Next.js');
494
+ if (deps.express)
495
+ techStack.push('Express');
496
+ if (deps.typescript)
497
+ techStack.push('TypeScript');
498
+ }
499
+ catch (e) {
500
+ // Ignore parse errors
501
+ }
502
+ }
503
+ // Check for other frameworks
504
+ if (fs.existsSync(path.join(projectPath, 'requirements.txt'))) {
505
+ techStack.push('Python');
506
+ }
507
+ if (fs.existsSync(path.join(projectPath, 'index.html'))) {
508
+ techStack.push('Static HTML');
509
+ }
510
+ return { name, techStack };
511
+ }
512
+ }
513
+ exports.DeployCommand = DeployCommand;
514
+ //# sourceMappingURL=deploy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploy.js","sourceRoot":"","sources":["../../src/commands/deploy.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;GAYG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,kDAA0B;AAC1B,uCAAyB;AACzB,2CAA6B;AAG7B,8CAAsB;AACtB,wDAAgC;AAkChC,MAAa,aAAa;IACd,MAAM,CAAS;IACf,MAAM,CAAS;IACf,OAAO,CAAS;IAExB,YAAY,MAAc,EAAE,MAAc;QACtC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,4BAA4B,CAAC;IAC7E,CAAC;IAEO,cAAc;QAClB,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAC3C,OAAO;YACH,eAAe,EAAE,UAAU,KAAK,EAAE;YAClC,cAAc,EAAE,kBAAkB;SACrC,CAAC;IACN,CAAC;IAEO,eAAe;QACnB,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAC1C,CAAC;IAEO,WAAW;QACf,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,CAAC;YAC1B,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC,CAAC;YACtD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC,CAAC;YACvE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,CAAC;IACL,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CAAC,UAAyB,EAAE;QACpC,IAAI,CAAC,WAAW,EAAE,CAAC;QAEnB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC,CAAC;QAEvE,oDAAoD;QACpD,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;YACpB,MAAM,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;YACjE,OAAO;QACX,CAAC;QAED,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACjB,MAAM,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;YACjE,OAAO;QACX,CAAC;QAED,qBAAqB;QACrB,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,kBAAQ,CAAC,MAAM,CAAC,CAAC;gBAC1C,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,YAAY;gBAClB,OAAO,EAAE,+BAA+B;gBACxC,OAAO,EAAE;oBACL,EAAE,IAAI,EAAE,wDAAwD,EAAE,KAAK,EAAE,SAAS,EAAE;oBACpF,EAAE,IAAI,EAAE,0DAA0D,EAAE,KAAK,EAAE,WAAW,EAAE;oBACxF,EAAE,IAAI,EAAE,8CAA8C,EAAE,KAAK,EAAE,QAAQ,EAAE;oBACzE,EAAE,IAAI,EAAE,uBAAuB,EAAE,KAAK,EAAE,OAAO,EAAE;iBACpD;aACJ,CAAC,CAAC,CAAC;QAEJ,QAAQ,UAAU,EAAE,CAAC;YACjB,KAAK,SAAS;gBACV,MAAM,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;gBAC5C,MAAM;YACV,KAAK,WAAW;gBACZ,MAAM,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;gBAClD,MAAM;YACV,KAAK,QAAQ;gBACT,MAAM,IAAI,CAAC,wBAAwB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;gBACrD,MAAM;YACV,KAAK,OAAO;gBACR,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;gBACvB,MAAM;QACd,CAAC;IACL,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,eAAe,CAAC,WAAoB;QACtC,MAAM,OAAO,GAAG,IAAA,aAAG,EAAC,yBAAyB,CAAC,CAAC,KAAK,EAAE,CAAC;QAEvD,IAAI,CAAC;YACD,MAAM,UAAU,GAAG,WAAW,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;YAChD,MAAM,WAAW,GAAG,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;YAEvD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,6BAA6B,EAAE;gBACvE,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,IAAI,CAAC,cAAc,EAAE;gBAC9B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oBACjB,WAAW,EAAE,WAAW,CAAC,IAAI;oBAC7B,WAAW,EAAE,UAAU;iBAC1B,CAAC;aACL,CAAC,CAAC;YAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACf,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAwB,CAAC;gBAC1D,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,IAAI,kBAAkB,CAAC,CAAC;YACvD,CAAC;YAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAwD,CAAC;YAEzF,OAAO,CAAC,OAAO,CAAC,eAAK,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC,CAAC;YAErD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC;YAC7C,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YAC3C,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,gEAAgE,CAAC,CAAC,CAAC;YAC1F,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,oDAAoD,CAAC,CAAC,CAAC;QAElF,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;YAC9B,MAAM,MAAM,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;YACxE,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,cAAc,MAAM,IAAI,CAAC,CAAC,CAAC;QACrD,CAAC;IACL,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,iBAAiB,CAAC,SAAiB,EAAE,WAAoB;QAC3D,MAAM,OAAO,GAAG,IAAA,aAAG,EAAC,gBAAgB,SAAS,kBAAkB,CAAC,CAAC,KAAK,EAAE,CAAC;QAEzE,IAAI,CAAC;YACD,4BAA4B;YAC5B,IAAI,CAAC,8BAA8B,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC1E,MAAM,IAAI,KAAK,CAAC,iEAAiE,CAAC,CAAC;YACvF,CAAC;YAED,MAAM,UAAU,GAAG,WAAW,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;YAChD,MAAM,WAAW,GAAG,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;YAEvD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,+BAA+B,EAAE;gBACzE,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,IAAI,CAAC,cAAc,EAAE;gBAC9B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oBACjB,SAAS;oBACT,WAAW,EAAE,WAAW,CAAC,IAAI;oBAC7B,WAAW,EAAE,UAAU;iBAC1B,CAAC;aACL,CAAC,CAAC;YAEH,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAM/B,CAAC;YAEF,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;gBAChC,IAAI,IAAI,CAAC,oBAAoB,EAAE,CAAC;oBAC5B,OAAO,CAAC,IAAI,EAAE,CAAC;oBACf,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,4DAA4D,CAAC,CAAC,CAAC;oBAExF,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,kBAAQ,CAAC,MAAM,CAAC,CAAC;4BACvC,IAAI,EAAE,SAAS;4BACf,IAAI,EAAE,SAAS;4BACf,OAAO,EAAE,kCAAkC;4BAC3C,OAAO,EAAE,IAAI;yBAChB,CAAC,CAAC,CAAC;oBAEJ,IAAI,OAAO,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;wBAC9B,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,0BAA0B,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;wBACtE,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,sDAAsD,CAAC,CAAC,CAAC;oBACpF,CAAC;oBACD,OAAO;gBACX,CAAC;gBACD,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,kBAAkB,CAAC,CAAC;YACtD,CAAC;YAED,OAAO,CAAC,OAAO,CAAC,eAAK,CAAC,KAAK,CAAC,eAAe,SAAS,gBAAgB,CAAC,CAAC,CAAC;YAEvE,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC,CAAC;YACnD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,SAAS,eAAe,CAAC,CAAC,CAAC;YACtE,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC,CAAC;YAClE,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC,CAAC;YACnD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC,CAAC;QAEjE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;YAC9B,MAAM,MAAM,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;YACxE,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,cAAc,MAAM,IAAI,CAAC,CAAC,CAAC;QACrD,CAAC;IACL,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,oBAAoB,CAAC,MAAc,EAAE,WAAoB;QAC3D,MAAM,OAAO,GAAG,IAAA,aAAG,EAAC,cAAc,MAAM,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC;QAEvD,IAAI,CAAC;YACD,MAAM,UAAU,GAAG,WAAW,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;YAChD,MAAM,WAAW,GAAG,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;YAEvD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,4BAA4B,EAAE;gBACtE,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,IAAI,CAAC,cAAc,EAAE;gBAC9B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oBACjB,MAAM;oBACN,WAAW,EAAE,WAAW,CAAC,IAAI;oBAC7B,WAAW,EAAE,UAAU;iBAC1B,CAAC;aACL,CAAC,CAAC;YAEH,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAQ/B,CAAC;YAEF,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;gBAChC,IAAI,IAAI,CAAC,oBAAoB,EAAE,CAAC;oBAC5B,OAAO,CAAC,IAAI,EAAE,CAAC;oBACf,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,gEAAgE,CAAC,CAAC,CAAC;oBAE5F,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,kBAAQ,CAAC,MAAM,CAAC,CAAC;4BACvC,IAAI,EAAE,SAAS;4BACf,IAAI,EAAE,SAAS;4BACf,OAAO,EAAE,kCAAkC;4BAC3C,OAAO,EAAE,IAAI;yBAChB,CAAC,CAAC,CAAC;oBAEJ,IAAI,OAAO,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;wBAC9B,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,sBAAsB,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;wBAClE,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,sDAAsD,CAAC,CAAC,CAAC;oBACpF,CAAC;oBACD,OAAO;gBACX,CAAC;gBACD,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,kBAAkB,CAAC,CAAC;YACtD,CAAC;YAED,OAAO,CAAC,OAAO,CAAC,eAAK,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC,CAAC;YAEnD,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;gBAClB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC,CAAC;gBAC5D,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;gBAExC,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;oBACnC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,YAAY,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,WAAW,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;gBACzH,CAAC;gBAED,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;gBACxC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,oCAAoC,CAAC,CAAC,CAAC;gBAChE,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,wBAAwB,MAAM,IAAI,CAAC,CAAC,CAAC;YACjE,CAAC;QAEL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;YAC9B,MAAM,MAAM,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;YACxE,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,cAAc,MAAM,IAAI,CAAC,CAAC,CAAC;QACrD,CAAC;IACL,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,qBAAqB,CAAC,WAAoB;QAC5C,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,kBAAQ,CAAC,MAAM,CAAC,CAAC;gBACzC,IAAI,EAAE,OAAO;gBACb,IAAI,EAAE,WAAW;gBACjB,OAAO,EAAE,+BAA+B;gBACxC,MAAM,EAAE,eAAK,CAAC,IAAI,CAAC,eAAe,CAAC;gBACnC,QAAQ,EAAE,CAAC,KAAa,EAAE,EAAE;oBACxB,IAAI,CAAC,8BAA8B,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBAClE,OAAO,iEAAiE,CAAC;oBAC7E,CAAC;oBACD,OAAO,IAAI,CAAC;gBAChB,CAAC;aACJ,CAAC,CAAC,CAAC;QAEJ,MAAM,IAAI,CAAC,iBAAiB,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IACzD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,wBAAwB,CAAC,WAAoB;QAC/C,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,kBAAQ,CAAC,MAAM,CAAC,CAAC;gBACtC,IAAI,EAAE,OAAO;gBACb,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,oBAAoB;gBAC7B,MAAM,EAAE,eAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC;gBACxC,QAAQ,EAAE,CAAC,KAAa,EAAE,EAAE;oBACxB,IAAI,CAAC,mCAAmC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;wBACnD,OAAO,kCAAkC,CAAC;oBAC9C,CAAC;oBACD,OAAO,IAAI,CAAC;gBAChB,CAAC;aACJ,CAAC,CAAC,CAAC;QAEJ,MAAM,IAAI,CAAC,oBAAoB,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACzD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,SAAS;QACX,MAAM,OAAO,GAAG,IAAA,aAAG,EAAC,2BAA2B,CAAC,CAAC,KAAK,EAAE,CAAC;QAEzD,IAAI,CAAC;YACD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,oBAAoB,EAAE;gBAC9D,OAAO,EAAE,IAAI,CAAC,cAAc,EAAE;aACjC,CAAC,CAAC;YAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACf,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;YAC7C,CAAC;YAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAgD,CAAC;YAEjF,OAAO,CAAC,IAAI,EAAE,CAAC;YAEf,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC,CAAC;YAC1D,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YAExC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;gBAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,KAAK,CAAC;oBAClC,CAAC,CAAC,eAAK,CAAC,KAAK,CAAC,MAAM,CAAC;oBACrB,CAAC,CAAC,eAAK,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;gBAE3D,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC,YAAY,MAAM,KAAK,EAAE,CAAC,CAAC,CAAC;gBACrE,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;gBAE/C,MAAM,QAAQ,GAAG,EAAE,CAAC;gBACpB,IAAI,IAAI,CAAC,iBAAiB;oBAAE,QAAQ,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;gBACnE,IAAI,IAAI,CAAC,qBAAqB;oBAAE,QAAQ,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;gBACjE,QAAQ,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,aAAa,CAAC,CAAC;gBAC5F,QAAQ,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,GAAG,IAAI,UAAU,CAAC,CAAC;gBAEjH,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YAC/D,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YAC/C,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC,CAAC;QAE7E,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;YACtC,MAAM,MAAM,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;YACxE,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,cAAc,MAAM,IAAI,CAAC,CAAC,CAAC;QACrD,CAAC;IACL,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,IAAI;QACN,IAAI,CAAC,WAAW,EAAE,CAAC;QAEnB,MAAM,OAAO,GAAG,IAAA,aAAG,EAAC,yBAAyB,CAAC,CAAC,KAAK,EAAE,CAAC;QAEvD,IAAI,CAAC;YACD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,sBAAsB,EAAE;gBAChE,OAAO,EAAE,IAAI,CAAC,cAAc,EAAE;aACjC,CAAC,CAAC;YAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACf,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;YACnD,CAAC;YAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAqD,CAAC;YAEtF,OAAO,CAAC,IAAI,EAAE,CAAC;YAEf,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC5B,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,4BAA4B,CAAC,CAAC,CAAC;gBACxD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC,CAAC;gBAC/E,OAAO;YACX,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,0BAA0B,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC;YAE5E,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;gBAChC,MAAM,UAAU,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;gBAClD,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;gBAE7D,MAAM,GAAG,GAAG,MAAM,CAAC,WAAW,KAAK,WAAW;oBAC1C,CAAC,CAAC,GAAG,MAAM,CAAC,SAAS,eAAe;oBACpC,CAAC,CAAC,MAAM,CAAC,WAAW,KAAK,QAAQ;wBAC7B,CAAC,CAAC,MAAM,CAAC,aAAa;wBACtB,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;gBAErB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,KAAK,UAAU,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC;gBACnD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,iBAAiB,MAAM,CAAC,YAAY,WAAW,OAAO,IAAI,MAAM,CAAC,UAAU,YAAY,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;gBACtI,OAAO,CAAC,GAAG,EAAE,CAAC;YAClB,CAAC;QAEL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAC5B,MAAM,MAAM,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;YACxE,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,cAAc,MAAM,IAAI,CAAC,CAAC,CAAC;QACrD,CAAC;IACL,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CAAC,MAAe;QACxB,IAAI,CAAC,WAAW,EAAE,CAAC;QAEnB,MAAM,OAAO,GAAG,IAAA,aAAG,EAAC,oBAAoB,CAAC,CAAC,KAAK,EAAE,CAAC;QAElD,IAAI,CAAC;YACD,MAAM,QAAQ,GAAG,MAAM;gBACnB,CAAC,CAAC,GAAG,IAAI,CAAC,OAAO,uBAAuB,kBAAkB,CAAC,MAAM,CAAC,SAAS;gBAC3E,CAAC,CAAC,GAAG,IAAI,CAAC,OAAO,qBAAqB,CAAC;YAE3C,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,QAAQ,EAAE;gBACnC,OAAO,EAAE,IAAI,CAAC,cAAc,EAAE;aACjC,CAAC,CAAC;YAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACf,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;YAC9C,CAAC;YAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YAEnC,OAAO,CAAC,IAAI,EAAE,CAAC;YAEf,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC,CAAC;YACpD,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAE/C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;YACpC,MAAM,MAAM,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;YACxE,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,cAAc,MAAM,IAAI,CAAC,CAAC,CAAC;QACrD,CAAC;IACL,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CAAC,MAAc;QACvB,IAAI,CAAC,WAAW,EAAE,CAAC;QAEnB,MAAM,OAAO,GAAG,IAAA,aAAG,EAAC,qBAAqB,MAAM,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC;QAE9D,IAAI,CAAC;YACD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,4BAA4B,EAAE;gBACtE,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,IAAI,CAAC,cAAc,EAAE;gBAC9B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;aACnC,CAAC,CAAC;YAEH,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAK/B,CAAC;YAEF,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;gBAChC,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,qBAAqB,CAAC,CAAC;YACzD,CAAC;YAED,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAChB,OAAO,CAAC,OAAO,CAAC,eAAK,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC,CAAC;gBACjD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,0CAA0C,MAAM,EAAE,CAAC,CAAC,CAAC;gBAC5E,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,kBAAkB,IAAI,CAAC,SAAS,IAAI,iBAAiB,IAAI,CAAC,CAAC,CAAC;YACvF,CAAC;iBAAM,CAAC;gBACJ,OAAO,CAAC,IAAI,CAAC,eAAK,CAAC,MAAM,CAAC,wBAAwB,CAAC,CAAC,CAAC;gBACrD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,wDAAwD,CAAC,CAAC,CAAC;gBAClF,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,6CAA6C,GAAG,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC;YAC3F,CAAC;QAEL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;YACpC,MAAM,MAAM,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;YACxE,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,cAAc,MAAM,IAAI,CAAC,CAAC,CAAC;QACrD,CAAC;IACL,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CAAC,MAAc;QACvB,IAAI,CAAC,WAAW,EAAE,CAAC;QAEnB,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,kBAAQ,CAAC,MAAM,CAAC,CAAC;gBACvC,IAAI,EAAE,SAAS;gBACf,IAAI,EAAE,SAAS;gBACf,OAAO,EAAE,eAAK,CAAC,GAAG,CAAC,mCAAmC,MAAM,GAAG,CAAC;gBAChE,OAAO,EAAE,KAAK;aACjB,CAAC,CAAC,CAAC;QAEJ,IAAI,CAAC,OAAO,EAAE,CAAC;YACX,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,2BAA2B,CAAC,CAAC,CAAC;YACvD,OAAO;QACX,CAAC;QAED,MAAM,OAAO,GAAG,IAAA,aAAG,EAAC,YAAY,MAAM,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC;QAErD,IAAI,CAAC;YACD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,uBAAuB,kBAAkB,CAAC,MAAM,CAAC,EAAE,EAAE;gBAC7F,MAAM,EAAE,QAAQ;gBAChB,OAAO,EAAE,IAAI,CAAC,cAAc,EAAE;aACjC,CAAC,CAAC;YAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACf,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAwB,CAAC;gBAC1D,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,IAAI,kBAAkB,CAAC,CAAC;YACvD,CAAC;YAED,OAAO,CAAC,OAAO,CAAC,eAAK,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC;YAC/C,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,yDAAyD,CAAC,CAAC,CAAC;QAEvF,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;YAC9B,MAAM,MAAM,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;YACxE,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,cAAc,MAAM,IAAI,CAAC,CAAC,CAAC;QACrD,CAAC;IACL,CAAC;IAED;;OAEG;IACK,iBAAiB,CAAC,WAAmB;QACzC,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;QAC/D,IAAI,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;QACtC,MAAM,SAAS,GAAa,EAAE,CAAC;QAE/B,IAAI,EAAE,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;YACjC,IAAI,CAAC;gBACD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC,CAAC;gBACjE,IAAI,GAAG,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC;gBAExB,MAAM,IAAI,GAAG,EAAE,GAAG,GAAG,CAAC,YAAY,EAAE,GAAG,GAAG,CAAC,eAAe,EAAE,CAAC;gBAC7D,IAAI,IAAI,CAAC,KAAK;oBAAE,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACxC,IAAI,IAAI,CAAC,GAAG;oBAAE,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACpC,IAAI,IAAI,CAAC,IAAI;oBAAE,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBACzC,IAAI,IAAI,CAAC,OAAO;oBAAE,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBAC5C,IAAI,IAAI,CAAC,UAAU;oBAAE,SAAS,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YACtD,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACT,sBAAsB;YAC1B,CAAC;QACL,CAAC;QAED,6BAA6B;QAC7B,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,kBAAkB,CAAC,CAAC,EAAE,CAAC;YAC5D,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC7B,CAAC;QACD,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC,EAAE,CAAC;YACtD,SAAS,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAClC,CAAC;QAED,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;IAC/B,CAAC;CACJ;AA1iBD,sCA0iBC"}
@@ -1,5 +1,7 @@
1
1
  /**
2
2
  * Generate Command - Generate code from description
3
+ *
4
+ * Now with Senior Developer Mode (--pro) for impressive, production-ready output
3
5
  */
4
6
  import { Config } from '../utils/config.js';
5
7
  import { Logger } from '../utils/logger.js';
@@ -7,6 +9,7 @@ interface GenerateOptions {
7
9
  language: string;
8
10
  output?: string;
9
11
  model: string;
12
+ pro?: boolean;
10
13
  }
11
14
  export declare class GenerateCommand {
12
15
  private config;
@@ -1 +1 @@
1
- {"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../src/commands/generate.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAI5C,UAAU,eAAe;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,GAAG,CAAY;IACvB,OAAO,CAAC,SAAS,CAAY;gBAEjB,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IAOpC,GAAG,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IA0CvE,OAAO,CAAC,aAAa;IAWrB,OAAO,CAAC,aAAa;YA+BP,UAAU;YAQV,eAAe;IAwC7B,OAAO,CAAC,eAAe;CAaxB"}
1
+ {"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../src/commands/generate.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAI5C,UAAU,eAAe;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,GAAG,CAAY;IACvB,OAAO,CAAC,SAAS,CAAY;gBAEjB,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IAOpC,GAAG,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAoFvE,OAAO,CAAC,aAAa;IAWrB,OAAO,CAAC,aAAa;YA+BP,UAAU;YAQV,eAAe;IAwC7B,OAAO,CAAC,eAAe;CAaxB"}
@@ -1,6 +1,8 @@
1
1
  "use strict";
2
2
  /**
3
3
  * Generate Command - Generate code from description
4
+ *
5
+ * Now with Senior Developer Mode (--pro) for impressive, production-ready output
4
6
  */
5
7
  var __importDefault = (this && this.__importDefault) || function (mod) {
6
8
  return (mod && mod.__esModule) ? mod : { "default": mod };
@@ -29,17 +31,56 @@ class GenerateCommand {
29
31
  this.logger.error('Not authenticated. Run: vigthoria login');
30
32
  return;
31
33
  }
32
- this.logger.section('Code Generation');
34
+ // Determine mode
35
+ const proMode = options.pro === true;
36
+ this.logger.section(proMode ? '🚀 Senior Developer Mode' : 'Code Generation');
33
37
  console.log(chalk_1.default.gray(`Language: ${options.language}`));
34
38
  console.log(chalk_1.default.gray(`Description: ${description}`));
39
+ if (proMode) {
40
+ console.log(chalk_1.default.cyan('Pro Mode: Planning → Generating → Quality Check'));
41
+ }
35
42
  console.log();
36
43
  const spinner = (0, ora_1.default)({
37
- text: 'Generating code...',
44
+ text: proMode ? 'Phase 1: Planning project structure...' : 'Generating code...',
38
45
  spinner: 'dots',
39
46
  }).start();
40
47
  try {
41
- const code = await this.api.generateCode(description, options.language, options.model);
42
- spinner.stop();
48
+ let code;
49
+ let quality = null;
50
+ if (proMode) {
51
+ // Senior Developer Mode - uses planning and quality checks
52
+ spinner.text = 'Phase 1: Planning project structure...';
53
+ const result = await this.api.generateProject(description, options.language, options.model);
54
+ spinner.text = 'Phase 2: Generating impressive code...';
55
+ code = result.code;
56
+ quality = result.quality;
57
+ spinner.stop();
58
+ // Show quality report
59
+ if (quality) {
60
+ console.log();
61
+ this.logger.section('Quality Report');
62
+ console.log(chalk_1.default.gray(`Lines of code: ${quality.lineCount}`));
63
+ console.log(chalk_1.default.gray(`Quality score: ${quality.score}/5`));
64
+ console.log();
65
+ console.log(chalk_1.default.gray('Visual Checks:'));
66
+ console.log(` ${quality.checks?.hasAnimations ? chalk_1.default.green('✓') : chalk_1.default.red('✗')} CSS Animations (@keyframes)`);
67
+ console.log(` ${quality.checks?.hasNeonEffects ? chalk_1.default.green('✓') : chalk_1.default.red('✗')} Neon/Glow Effects`);
68
+ console.log(` ${quality.checks?.hasResponsive ? chalk_1.default.green('✓') : chalk_1.default.red('✗')} Responsive Design (@media)`);
69
+ console.log(` ${quality.checks?.hasFontAwesome ? chalk_1.default.green('✓') : chalk_1.default.red('✗')} Font Awesome Icons`);
70
+ console.log(` ${quality.checks?.hasGoogleFonts ? chalk_1.default.green('✓') : chalk_1.default.red('✗')} Google Fonts`);
71
+ console.log();
72
+ console.log(chalk_1.default.gray('Structure Checks:'));
73
+ console.log(` ${quality.checks?.hasEmbeddedCSS ? chalk_1.default.green('✓') : chalk_1.default.red('✗')} Embedded CSS (<style> tag)`);
74
+ console.log(` ${quality.checks?.hasEmbeddedJS ? chalk_1.default.green('✓') : chalk_1.default.red('✗')} Embedded JavaScript (<script> tag)`);
75
+ console.log(` ${quality.checks?.singleFile ? chalk_1.default.green('✓') : chalk_1.default.red('✗')} Single-file (no external CSS/JS)`);
76
+ console.log();
77
+ }
78
+ }
79
+ else {
80
+ // Standard mode
81
+ code = await this.api.generateCode(description, options.language, options.model);
82
+ spinner.stop();
83
+ }
43
84
  // Display generated code
44
85
  this.logger.section('Generated Code');
45
86
  console.log(chalk_1.default.gray('─'.repeat(60)));