@buoy-design/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 (101) hide show
  1. package/dist/bin.d.ts +3 -0
  2. package/dist/bin.d.ts.map +1 -0
  3. package/dist/bin.js +5 -0
  4. package/dist/bin.js.map +1 -0
  5. package/dist/commands/__tests__/ci.test.d.ts +2 -0
  6. package/dist/commands/__tests__/ci.test.d.ts.map +1 -0
  7. package/dist/commands/__tests__/ci.test.js +33 -0
  8. package/dist/commands/__tests__/ci.test.js.map +1 -0
  9. package/dist/commands/bootstrap.d.ts +3 -0
  10. package/dist/commands/bootstrap.d.ts.map +1 -0
  11. package/dist/commands/bootstrap.js +458 -0
  12. package/dist/commands/bootstrap.js.map +1 -0
  13. package/dist/commands/build.d.ts +3 -0
  14. package/dist/commands/build.d.ts.map +1 -0
  15. package/dist/commands/build.js +314 -0
  16. package/dist/commands/build.js.map +1 -0
  17. package/dist/commands/ci.d.ts +24 -0
  18. package/dist/commands/ci.d.ts.map +1 -0
  19. package/dist/commands/ci.js +273 -0
  20. package/dist/commands/ci.js.map +1 -0
  21. package/dist/commands/ci.logic.d.ts +20 -0
  22. package/dist/commands/ci.logic.d.ts.map +1 -0
  23. package/dist/commands/ci.logic.js +28 -0
  24. package/dist/commands/ci.logic.js.map +1 -0
  25. package/dist/commands/drift.d.ts +3 -0
  26. package/dist/commands/drift.d.ts.map +1 -0
  27. package/dist/commands/drift.js +178 -0
  28. package/dist/commands/drift.js.map +1 -0
  29. package/dist/commands/index.d.ts +9 -0
  30. package/dist/commands/index.d.ts.map +1 -0
  31. package/dist/commands/index.js +9 -0
  32. package/dist/commands/index.js.map +1 -0
  33. package/dist/commands/init.d.ts +3 -0
  34. package/dist/commands/init.d.ts.map +1 -0
  35. package/dist/commands/init.js +490 -0
  36. package/dist/commands/init.js.map +1 -0
  37. package/dist/commands/plugins.d.ts +3 -0
  38. package/dist/commands/plugins.d.ts.map +1 -0
  39. package/dist/commands/plugins.js +72 -0
  40. package/dist/commands/plugins.js.map +1 -0
  41. package/dist/commands/scan.d.ts +3 -0
  42. package/dist/commands/scan.d.ts.map +1 -0
  43. package/dist/commands/scan.js +266 -0
  44. package/dist/commands/scan.js.map +1 -0
  45. package/dist/commands/status.d.ts +3 -0
  46. package/dist/commands/status.d.ts.map +1 -0
  47. package/dist/commands/status.js +205 -0
  48. package/dist/commands/status.js.map +1 -0
  49. package/dist/config/index.d.ts +3 -0
  50. package/dist/config/index.d.ts.map +1 -0
  51. package/dist/config/index.js +3 -0
  52. package/dist/config/index.js.map +1 -0
  53. package/dist/config/loader.d.ts +8 -0
  54. package/dist/config/loader.d.ts.map +1 -0
  55. package/dist/config/loader.js +67 -0
  56. package/dist/config/loader.js.map +1 -0
  57. package/dist/config/schema.d.ts +1040 -0
  58. package/dist/config/schema.d.ts.map +1 -0
  59. package/dist/config/schema.js +116 -0
  60. package/dist/config/schema.js.map +1 -0
  61. package/dist/detect/frameworks.d.ts +18 -0
  62. package/dist/detect/frameworks.d.ts.map +1 -0
  63. package/dist/detect/frameworks.js +168 -0
  64. package/dist/detect/frameworks.js.map +1 -0
  65. package/dist/detect/index.d.ts +3 -0
  66. package/dist/detect/index.d.ts.map +1 -0
  67. package/dist/detect/index.js +3 -0
  68. package/dist/detect/index.js.map +1 -0
  69. package/dist/detect/project-detector.d.ts +61 -0
  70. package/dist/detect/project-detector.d.ts.map +1 -0
  71. package/dist/detect/project-detector.js +849 -0
  72. package/dist/detect/project-detector.js.map +1 -0
  73. package/dist/index.d.ts +5 -0
  74. package/dist/index.d.ts.map +1 -0
  75. package/dist/index.js +22 -0
  76. package/dist/index.js.map +1 -0
  77. package/dist/output/formatters.d.ts +21 -0
  78. package/dist/output/formatters.d.ts.map +1 -0
  79. package/dist/output/formatters.js +421 -0
  80. package/dist/output/formatters.js.map +1 -0
  81. package/dist/output/index.d.ts +3 -0
  82. package/dist/output/index.d.ts.map +1 -0
  83. package/dist/output/index.js +3 -0
  84. package/dist/output/index.js.map +1 -0
  85. package/dist/output/reporters.d.ts +23 -0
  86. package/dist/output/reporters.d.ts.map +1 -0
  87. package/dist/output/reporters.js +147 -0
  88. package/dist/output/reporters.js.map +1 -0
  89. package/dist/plugins/index.d.ts +3 -0
  90. package/dist/plugins/index.d.ts.map +1 -0
  91. package/dist/plugins/index.js +3 -0
  92. package/dist/plugins/index.js.map +1 -0
  93. package/dist/plugins/loader.d.ts +11 -0
  94. package/dist/plugins/loader.d.ts.map +1 -0
  95. package/dist/plugins/loader.js +77 -0
  96. package/dist/plugins/loader.js.map +1 -0
  97. package/dist/plugins/registry.d.ts +15 -0
  98. package/dist/plugins/registry.d.ts.map +1 -0
  99. package/dist/plugins/registry.js +32 -0
  100. package/dist/plugins/registry.js.map +1 -0
  101. package/package.json +48 -0
@@ -0,0 +1,490 @@
1
+ import { Command } from 'commander';
2
+ import { writeFileSync, existsSync } from 'fs';
3
+ import { resolve } from 'path';
4
+ import chalk from 'chalk';
5
+ import ora from 'ora';
6
+ import { createInterface } from 'readline';
7
+ import { success, error, info, warning } from '../output/reporters.js';
8
+ import { ProjectDetector } from '../detect/index.js';
9
+ import { detectFrameworks, getPluginInstallCommand, PLUGIN_INFO } from '../detect/frameworks.js';
10
+ import { discoverPlugins } from '../plugins/index.js';
11
+ function generateConfig(project) {
12
+ const lines = [];
13
+ lines.push(`/** @type {import('@buoy-design/cli').BuoyConfig} */`);
14
+ lines.push(`export default {`);
15
+ lines.push(` project: {`);
16
+ lines.push(` name: '${project.name}',`);
17
+ lines.push(` },`);
18
+ lines.push(` sources: {`);
19
+ // Determine the correct source key based on framework
20
+ const getSourceKey = (frameworkName) => {
21
+ // React-based frameworks
22
+ if (['react', 'nextjs', 'remix', 'gatsby', 'react-native', 'expo', 'preact', 'solid'].includes(frameworkName)) {
23
+ return 'react';
24
+ }
25
+ // Vue-based frameworks
26
+ if (['vue', 'nuxt'].includes(frameworkName)) {
27
+ return 'vue';
28
+ }
29
+ // Svelte-based frameworks
30
+ if (['svelte', 'sveltekit'].includes(frameworkName)) {
31
+ return 'svelte';
32
+ }
33
+ // Angular
34
+ if (frameworkName === 'angular') {
35
+ return 'angular';
36
+ }
37
+ // Web Components
38
+ if (['lit', 'stencil'].includes(frameworkName)) {
39
+ return 'webcomponent';
40
+ }
41
+ // Astro is special - can use multiple frameworks
42
+ if (frameworkName === 'astro') {
43
+ return 'react'; // Default to React for Astro
44
+ }
45
+ return null;
46
+ };
47
+ // File extensions by framework
48
+ const getExtensions = (sourceKey, typescript) => {
49
+ switch (sourceKey) {
50
+ case 'vue':
51
+ return ['vue'];
52
+ case 'svelte':
53
+ return ['svelte'];
54
+ case 'angular':
55
+ return ['component.ts'];
56
+ case 'webcomponent':
57
+ return ['ts'];
58
+ default: // react
59
+ return typescript ? ['tsx', 'jsx'] : ['jsx', 'tsx'];
60
+ }
61
+ };
62
+ // JS Framework config (React, Vue, Svelte, Angular, Web Components)
63
+ // Handle multiple frameworks - generate config for each UI framework
64
+ const addedSourceKeys = new Set();
65
+ for (const framework of project.frameworks) {
66
+ const sourceKey = getSourceKey(framework.name);
67
+ if (sourceKey && !addedSourceKeys.has(sourceKey)) {
68
+ addedSourceKeys.add(sourceKey);
69
+ const extensions = getExtensions(sourceKey, framework.typescript);
70
+ const jsComponents = project.components.filter(c => c.type === 'jsx' || c.type === 'vue' || c.type === 'svelte' || !c.type);
71
+ let includePatterns;
72
+ if (jsComponents.length > 0) {
73
+ includePatterns = jsComponents.flatMap(c => extensions.map(ext => `${c.path}/**/*.${ext}`));
74
+ }
75
+ else {
76
+ includePatterns = extensions.map(ext => `src/**/*.${ext}`);
77
+ }
78
+ lines.push(` ${sourceKey}: {`);
79
+ lines.push(` enabled: true,`);
80
+ lines.push(` include: [${includePatterns.map((p) => `'${p}'`).join(', ')}],`);
81
+ lines.push(` exclude: ['**/*.test.*', '**/*.spec.*', '**/*.stories.*'],`);
82
+ if (project.designSystem) {
83
+ lines.push(` designSystemPackage: '${project.designSystem.package}',`);
84
+ }
85
+ if (sourceKey === 'webcomponent') {
86
+ const wcFramework = framework.name === 'lit' ? 'lit' : 'stencil';
87
+ lines.push(` framework: '${wcFramework}',`);
88
+ }
89
+ lines.push(` },`);
90
+ }
91
+ }
92
+ // Server-side / template-based framework config
93
+ const serverFrameworks = [
94
+ 'php', 'laravel', 'symfony',
95
+ 'rails',
96
+ 'django', 'flask', 'fastapi',
97
+ 'express', 'nestjs',
98
+ 'spring', 'aspnet',
99
+ 'go',
100
+ 'hugo', 'jekyll', 'eleventy',
101
+ ];
102
+ // Map framework to template type
103
+ const getTemplateType = (frameworkName, componentType) => {
104
+ if (componentType === 'blade')
105
+ return 'blade';
106
+ if (componentType === 'erb')
107
+ return 'erb';
108
+ if (componentType === 'twig')
109
+ return 'twig';
110
+ if (componentType === 'njk')
111
+ return 'njk';
112
+ // Framework-based defaults
113
+ if (frameworkName === 'laravel')
114
+ return 'blade';
115
+ if (frameworkName === 'rails')
116
+ return 'erb';
117
+ if (frameworkName === 'symfony')
118
+ return 'twig';
119
+ if (frameworkName === 'eleventy')
120
+ return 'njk';
121
+ return 'html';
122
+ };
123
+ // Check if any framework is a server-side framework
124
+ const serverFramework = project.frameworks.find(f => serverFrameworks.includes(f.name));
125
+ if (serverFramework) {
126
+ const templateComponents = project.components.filter(c => c.type === 'php' || c.type === 'blade' || c.type === 'erb' ||
127
+ c.type === 'twig' || c.type === 'html' || c.type === 'njk');
128
+ if (templateComponents.length > 0) {
129
+ // Use the first component's type to determine template type
130
+ const templateType = getTemplateType(serverFramework.name, templateComponents[0]?.type);
131
+ lines.push(` templates: {`);
132
+ lines.push(` enabled: true,`);
133
+ lines.push(` type: '${templateType}',`);
134
+ lines.push(` include: [`);
135
+ for (const comp of templateComponents) {
136
+ lines.push(` '${comp.pattern}',`);
137
+ }
138
+ lines.push(` ],`);
139
+ lines.push(` },`);
140
+ }
141
+ }
142
+ // Storybook config
143
+ if (project.storybook) {
144
+ lines.push(` storybook: {`);
145
+ lines.push(` enabled: true,`);
146
+ lines.push(` },`);
147
+ }
148
+ // Token files config
149
+ const tokenFiles = project.tokens.filter((t) => t.type !== 'tailwind');
150
+ const hasTailwind = project.tokens.some((t) => t.type === 'tailwind');
151
+ if (tokenFiles.length > 0 || hasTailwind) {
152
+ lines.push(` tokens: {`);
153
+ lines.push(` enabled: true,`);
154
+ if (tokenFiles.length > 0) {
155
+ lines.push(` files: [`);
156
+ for (const token of tokenFiles) {
157
+ lines.push(` '${token.path}',`);
158
+ }
159
+ lines.push(` ],`);
160
+ }
161
+ lines.push(` },`);
162
+ }
163
+ // Figma placeholder (always disabled by default)
164
+ lines.push(` figma: {`);
165
+ lines.push(` enabled: false,`);
166
+ lines.push(` // accessToken: process.env.FIGMA_ACCESS_TOKEN,`);
167
+ lines.push(` // fileKeys: [],`);
168
+ lines.push(` },`);
169
+ lines.push(` },`);
170
+ lines.push(` output: {`);
171
+ lines.push(` format: 'table',`);
172
+ lines.push(` colors: true,`);
173
+ lines.push(` },`);
174
+ lines.push(`};`);
175
+ lines.push(``);
176
+ return lines.join('\n');
177
+ }
178
+ function printDetectionResults(project) {
179
+ console.log('');
180
+ console.log(chalk.bold(' Detected:'));
181
+ const frameworkNames = {
182
+ // JS frameworks
183
+ 'react': 'React',
184
+ 'vue': 'Vue',
185
+ 'svelte': 'Svelte',
186
+ 'angular': 'Angular',
187
+ 'solid': 'Solid',
188
+ 'preact': 'Preact',
189
+ // Meta-frameworks
190
+ 'nextjs': 'Next.js',
191
+ 'nuxt': 'Nuxt',
192
+ 'astro': 'Astro',
193
+ 'remix': 'Remix',
194
+ 'sveltekit': 'SvelteKit',
195
+ 'gatsby': 'Gatsby',
196
+ // Mobile
197
+ 'react-native': 'React Native',
198
+ 'flutter': 'Flutter',
199
+ 'expo': 'Expo',
200
+ // Web Components
201
+ 'lit': 'Lit',
202
+ 'stencil': 'Stencil',
203
+ // Server-side
204
+ 'php': 'PHP',
205
+ 'laravel': 'Laravel',
206
+ 'symfony': 'Symfony',
207
+ 'rails': 'Ruby on Rails',
208
+ 'django': 'Django',
209
+ 'flask': 'Flask',
210
+ 'fastapi': 'FastAPI',
211
+ 'express': 'Express',
212
+ 'nestjs': 'NestJS',
213
+ 'spring': 'Spring Boot',
214
+ 'aspnet': 'ASP.NET',
215
+ 'go': 'Go',
216
+ // Static site generators
217
+ 'hugo': 'Hugo',
218
+ 'jekyll': 'Jekyll',
219
+ 'eleventy': 'Eleventy',
220
+ };
221
+ // Frameworks - show all detected
222
+ if (project.frameworks.length > 0) {
223
+ // Show warning if multiple UI frameworks detected (framework sprawl)
224
+ const uiFrameworks = ['react', 'vue', 'svelte', 'angular', 'solid', 'preact', 'lit', 'stencil',
225
+ 'nextjs', 'nuxt', 'astro', 'remix', 'sveltekit', 'gatsby', 'react-native', 'expo', 'flutter'];
226
+ const uiCount = project.frameworks.filter(f => uiFrameworks.includes(f.name)).length;
227
+ if (uiCount > 1) {
228
+ console.log(chalk.yellow(' ⚠ ') + chalk.yellow.bold('Multiple UI frameworks detected (framework sprawl)'));
229
+ }
230
+ for (const framework of project.frameworks) {
231
+ const ts = framework.typescript ? ' + TypeScript' : '';
232
+ const frameworkName = frameworkNames[framework.name] || capitalize(framework.name);
233
+ const meta = framework.meta ? chalk.dim(` (${framework.meta})`) : '';
234
+ const version = framework.version !== 'unknown' ? ` ${framework.version}` : '';
235
+ console.log(chalk.green(' ✓ ') +
236
+ chalk.bold(frameworkName) +
237
+ ts +
238
+ meta +
239
+ chalk.dim(version));
240
+ }
241
+ }
242
+ // Components
243
+ if (project.components.length > 0) {
244
+ for (const comp of project.components) {
245
+ const typeLabels = {
246
+ 'jsx': 'component files',
247
+ 'vue': 'Vue components',
248
+ 'svelte': 'Svelte components',
249
+ 'php': 'PHP templates',
250
+ 'blade': 'Blade templates',
251
+ 'erb': 'ERB templates',
252
+ 'twig': 'Twig templates',
253
+ 'html': 'HTML templates',
254
+ 'njk': 'Nunjucks templates',
255
+ };
256
+ const typeLabel = comp.type ? (typeLabels[comp.type] || 'template files') : 'component files';
257
+ console.log(chalk.green(' ✓ ') +
258
+ `${comp.fileCount} ${typeLabel} in ` +
259
+ chalk.cyan(comp.path));
260
+ }
261
+ }
262
+ // Tokens
263
+ if (project.tokens.length > 0) {
264
+ for (const token of project.tokens) {
265
+ const icon = token.type === 'tailwind' ? ' ✓ ' : ' ✓ ';
266
+ console.log(chalk.green(icon) + `${token.name}: ` + chalk.cyan(token.path));
267
+ }
268
+ }
269
+ // Storybook
270
+ if (project.storybook) {
271
+ const version = project.storybook.version ? ` (${project.storybook.version})` : '';
272
+ console.log(chalk.green(' ✓ ') + `Storybook` + chalk.dim(version));
273
+ }
274
+ // Design system
275
+ if (project.designSystem) {
276
+ console.log(chalk.green(' ✓ ') +
277
+ `Design system: ` +
278
+ chalk.cyan(project.designSystem.package));
279
+ }
280
+ // Monorepo
281
+ if (project.monorepo) {
282
+ console.log(chalk.green(' ✓ ') +
283
+ capitalize(project.monorepo.type) +
284
+ ` monorepo (${project.monorepo.packages.length} packages)`);
285
+ }
286
+ // Nothing found
287
+ if (project.frameworks.length === 0 &&
288
+ project.components.length === 0 &&
289
+ project.tokens.length === 0 &&
290
+ !project.storybook) {
291
+ console.log(chalk.yellow(' ⚠ ') + 'No sources auto-detected');
292
+ console.log(chalk.dim(' You can manually configure sources in buoy.config.mjs'));
293
+ }
294
+ console.log('');
295
+ }
296
+ function capitalize(s) {
297
+ return s.charAt(0).toUpperCase() + s.slice(1);
298
+ }
299
+ async function promptConfirm(message, defaultValue = true) {
300
+ const rl = createInterface({
301
+ input: process.stdin,
302
+ output: process.stdout,
303
+ });
304
+ const suffix = defaultValue ? '[Y/n]' : '[y/N]';
305
+ return new Promise((resolve) => {
306
+ rl.question(`${message} ${suffix} `, (answer) => {
307
+ rl.close();
308
+ const trimmed = answer.trim().toLowerCase();
309
+ if (trimmed === '') {
310
+ resolve(defaultValue);
311
+ }
312
+ else {
313
+ resolve(trimmed === 'y' || trimmed === 'yes');
314
+ }
315
+ });
316
+ });
317
+ }
318
+ export function createInitCommand() {
319
+ const cmd = new Command('init')
320
+ .description('Initialize Buoy configuration in the current project')
321
+ .option('-f, --force', 'Overwrite existing configuration')
322
+ .option('-n, --name <name>', 'Project name')
323
+ .option('--skip-detect', 'Skip auto-detection and create minimal config')
324
+ .option('-y, --yes', 'Auto-install recommended plugins without prompting')
325
+ .option('--no-install', 'Skip plugin installation prompts')
326
+ .action(async (options) => {
327
+ const cwd = process.cwd();
328
+ const configPath = resolve(cwd, 'buoy.config.mjs');
329
+ // Check if config already exists
330
+ if (existsSync(configPath) && !options.force) {
331
+ warning(`Configuration already exists at ${configPath}`);
332
+ info('Use --force to overwrite');
333
+ return;
334
+ }
335
+ let project;
336
+ if (options.skipDetect) {
337
+ // Minimal detection - just get the project name
338
+ const detector = new ProjectDetector(cwd);
339
+ project = {
340
+ name: options.name || (await detector.detect()).name,
341
+ root: cwd,
342
+ frameworks: [],
343
+ primaryFramework: null,
344
+ components: [],
345
+ tokens: [],
346
+ storybook: null,
347
+ designSystem: null,
348
+ monorepo: null,
349
+ };
350
+ }
351
+ else {
352
+ // Run auto-detection
353
+ const spinner = ora('Scanning project...').start();
354
+ try {
355
+ const detector = new ProjectDetector(cwd);
356
+ project = await detector.detect();
357
+ if (options.name) {
358
+ project.name = options.name;
359
+ }
360
+ spinner.stop();
361
+ printDetectionResults(project);
362
+ }
363
+ catch (err) {
364
+ spinner.fail('Detection failed');
365
+ const message = err instanceof Error ? err.message : String(err);
366
+ error(message);
367
+ process.exit(1);
368
+ }
369
+ }
370
+ // Suggest plugins based on lightweight framework detection
371
+ const detectedFrameworks = await detectFrameworks(cwd);
372
+ const installedPlugins = await discoverPlugins();
373
+ if (detectedFrameworks.length > 0) {
374
+ console.log(chalk.bold(' Suggested Plugins'));
375
+ console.log('');
376
+ for (const fw of detectedFrameworks) {
377
+ const installed = installedPlugins.some((p) => p.includes(fw.plugin));
378
+ const pluginInfo = PLUGIN_INFO[fw.plugin];
379
+ const pluginName = pluginInfo?.name || `@buoy-design/plugin-${fw.plugin}`;
380
+ // Plugin header with status
381
+ const statusText = installed
382
+ ? chalk.green('installed ✓')
383
+ : chalk.yellow('not installed');
384
+ console.log(` ${chalk.dim('┌')} ${chalk.cyan.bold(pluginName)}${' '.repeat(Math.max(1, 50 - pluginName.length))}${statusText}`);
385
+ console.log(` ${chalk.dim('│')}`);
386
+ // What was detected
387
+ const detectsLabel = pluginInfo?.detects || capitalize(fw.name);
388
+ if (fw.matchedFiles && fw.matchedFiles.length > 0) {
389
+ console.log(` ${chalk.dim('│')} ${chalk.white('Detected:')} ${detectsLabel}`);
390
+ const filesToShow = fw.matchedFiles.slice(0, 3);
391
+ for (const file of filesToShow) {
392
+ console.log(` ${chalk.dim('│')} ${chalk.dim('•')} ${chalk.cyan(file)}`);
393
+ }
394
+ if (fw.matchedFiles.length > 3) {
395
+ console.log(` ${chalk.dim('│')} ${chalk.dim(` ...and ${fw.matchedFiles.length - 3} more`)}`);
396
+ }
397
+ }
398
+ else {
399
+ // Package-based detection
400
+ console.log(` ${chalk.dim('│')} ${chalk.white('Detected:')} ${detectsLabel} ${chalk.dim(`(${fw.evidence.toLowerCase()})`)}`);
401
+ }
402
+ console.log(` ${chalk.dim('│')}`);
403
+ // What the plugin does
404
+ if (pluginInfo?.description) {
405
+ console.log(` ${chalk.dim('│')} ${chalk.white('What it does:')}`);
406
+ // Word wrap description at ~60 chars
407
+ const words = pluginInfo.description.split(' ');
408
+ let line = '';
409
+ for (const word of words) {
410
+ if (line.length + word.length > 55) {
411
+ console.log(` ${chalk.dim('│')} ${chalk.dim(line.trim())}`);
412
+ line = word + ' ';
413
+ }
414
+ else {
415
+ line += word + ' ';
416
+ }
417
+ }
418
+ if (line.trim()) {
419
+ console.log(` ${chalk.dim('│')} ${chalk.dim(line.trim())}`);
420
+ }
421
+ }
422
+ // Footer with install command or ready status
423
+ console.log(` ${chalk.dim('│')}`);
424
+ if (installed) {
425
+ console.log(` ${chalk.dim('└─')} ${chalk.green('Ready to use')}`);
426
+ }
427
+ else {
428
+ console.log(` ${chalk.dim('└─')} ${chalk.dim(getPluginInstallCommand([fw.plugin]))}`);
429
+ }
430
+ console.log('');
431
+ }
432
+ const missingPlugins = detectedFrameworks
433
+ .map((fw) => fw.plugin)
434
+ .filter((plugin, index, self) => self.indexOf(plugin) === index) // unique
435
+ .filter((plugin) => !installedPlugins.some((p) => p.includes(plugin)));
436
+ if (missingPlugins.length > 0) {
437
+ console.log(chalk.dim(' ' + '─'.repeat(65)));
438
+ console.log('');
439
+ console.log(chalk.bold(' Install all missing plugins:'));
440
+ console.log(` ${chalk.cyan(getPluginInstallCommand(missingPlugins))}`);
441
+ console.log('');
442
+ // Determine if we should install plugins
443
+ let shouldInstall = false;
444
+ if (options.yes) {
445
+ shouldInstall = true;
446
+ }
447
+ else if (options.install !== false) {
448
+ // Only prompt if --no-install was not passed and stdin is a TTY
449
+ if (process.stdin.isTTY) {
450
+ shouldInstall = await promptConfirm('Install recommended plugins now?', true);
451
+ }
452
+ }
453
+ if (shouldInstall) {
454
+ const { execSync } = await import('node:child_process');
455
+ console.log('');
456
+ console.log('Installing plugins...');
457
+ try {
458
+ execSync(getPluginInstallCommand(missingPlugins), { stdio: 'inherit' });
459
+ success('Plugins installed successfully');
460
+ }
461
+ catch {
462
+ warning('Plugin installation failed. You can install manually with the command above.');
463
+ }
464
+ }
465
+ }
466
+ console.log('');
467
+ }
468
+ // Generate and write config
469
+ const content = generateConfig(project);
470
+ try {
471
+ writeFileSync(configPath, content, 'utf-8');
472
+ success(`Created buoy.config.mjs`);
473
+ console.log('');
474
+ info('Next steps:');
475
+ info(' 1. Run ' + chalk.cyan('buoy scan') + ' to scan your codebase');
476
+ info(' 2. Run ' + chalk.cyan('buoy drift check') + ' to detect drift');
477
+ if (!project.storybook) {
478
+ console.log('');
479
+ info(chalk.dim('Optional: Connect Figma by adding your API key to the config'));
480
+ }
481
+ }
482
+ catch (err) {
483
+ const message = err instanceof Error ? err.message : String(err);
484
+ error(`Failed to create configuration: ${message}`);
485
+ process.exit(1);
486
+ }
487
+ });
488
+ return cmd;
489
+ }
490
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function createPluginsCommand(): Command;
3
+ //# sourceMappingURL=plugins.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugins.d.ts","sourceRoot":"","sources":["../../src/commands/plugins.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,wBAAgB,oBAAoB,IAAI,OAAO,CAyE9C"}
@@ -0,0 +1,72 @@
1
+ import { Command } from 'commander';
2
+ import chalk from 'chalk';
3
+ import { discoverPlugins, loadDiscoveredPlugins } from '../plugins/index.js';
4
+ import { detectFrameworks, getPluginInstallCommand } from '../detect/frameworks.js';
5
+ export function createPluginsCommand() {
6
+ const cmd = new Command('plugins')
7
+ .description('Manage Buoy plugins');
8
+ cmd
9
+ .command('list')
10
+ .description('List installed plugins')
11
+ .action(async () => {
12
+ try {
13
+ const plugins = await loadDiscoveredPlugins();
14
+ if (plugins.length === 0) {
15
+ console.log(chalk.yellow('No plugins installed.'));
16
+ console.log('\nRun `buoy init` to detect your project and get plugin recommendations.');
17
+ return;
18
+ }
19
+ console.log(chalk.bold('Installed plugins:\n'));
20
+ for (const plugin of plugins) {
21
+ console.log(` ${chalk.cyan(plugin.metadata.name)} ${chalk.dim(`v${plugin.metadata.version}`)}`);
22
+ if (plugin.metadata.description) {
23
+ console.log(` ${chalk.dim(plugin.metadata.description)}`);
24
+ }
25
+ if (plugin.metadata.detects?.length) {
26
+ console.log(` Detects: ${plugin.metadata.detects.join(', ')}`);
27
+ }
28
+ console.log();
29
+ }
30
+ }
31
+ catch (err) {
32
+ console.error(chalk.red(`Failed to load plugins: ${err instanceof Error ? err.message : String(err)}`));
33
+ process.exit(1);
34
+ }
35
+ });
36
+ cmd
37
+ .command('suggest')
38
+ .description('Suggest plugins based on detected frameworks')
39
+ .action(async () => {
40
+ try {
41
+ const detected = await detectFrameworks(process.cwd());
42
+ const installed = await discoverPlugins();
43
+ if (detected.length === 0) {
44
+ console.log(chalk.yellow('No frameworks detected.'));
45
+ return;
46
+ }
47
+ console.log(chalk.bold('Detected frameworks:\n'));
48
+ for (const fw of detected) {
49
+ const isInstalled = installed.some((p) => p.includes(fw.plugin));
50
+ const status = isInstalled
51
+ ? chalk.green('(installed)')
52
+ : chalk.yellow('(not installed)');
53
+ console.log(` ${fw.name} ${chalk.dim(`(${fw.confidence})`)} ${status}`);
54
+ console.log(` ${chalk.dim(fw.evidence)}`);
55
+ }
56
+ const missing = detected
57
+ .map((fw) => fw.plugin)
58
+ .filter((p, i, arr) => arr.indexOf(p) === i) // dedupe
59
+ .filter((plugin) => !installed.some((p) => p.includes(plugin)));
60
+ if (missing.length > 0) {
61
+ console.log('\n' + chalk.bold('Install missing plugins:'));
62
+ console.log(` ${chalk.cyan(getPluginInstallCommand(missing))}`);
63
+ }
64
+ }
65
+ catch (err) {
66
+ console.error(chalk.red(`Failed to detect frameworks: ${err instanceof Error ? err.message : String(err)}`));
67
+ process.exit(1);
68
+ }
69
+ });
70
+ return cmd;
71
+ }
72
+ //# sourceMappingURL=plugins.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugins.js","sourceRoot":"","sources":["../../src/commands/plugins.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function createScanCommand(): Command;
3
+ //# sourceMappingURL=scan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../../src/commands/scan.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,wBAAgB,iBAAiB,IAAI,OAAO,CAiU3C"}