@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,266 @@
1
+ import { Command } from 'commander';
2
+ import chalk from 'chalk';
3
+ import { loadConfig, getConfigPath } from '../config/loader.js';
4
+ import { spinner, success, error, info, warning, header, keyValue, newline, setJsonMode } from '../output/reporters.js';
5
+ import { loadDiscoveredPlugins, registry } from '../plugins/index.js';
6
+ import { formatComponentTable, formatTokenTable } from '../output/formatters.js';
7
+ export function createScanCommand() {
8
+ const cmd = new Command('scan')
9
+ .description('Scan sources for components and tokens')
10
+ .option('-s, --source <sources...>', 'Specific sources to scan (react, vue, svelte, angular, tokens, etc.)')
11
+ .option('--json', 'Output as JSON')
12
+ .option('-v, --verbose', 'Verbose output')
13
+ .action(async (options) => {
14
+ // Set JSON mode before creating spinner to redirect spinner to stderr
15
+ if (options.json) {
16
+ setJsonMode(true);
17
+ }
18
+ const spin = spinner('Loading configuration...');
19
+ try {
20
+ // Load config
21
+ const { config, configPath } = await loadConfig();
22
+ spin.text = 'Loading plugins...';
23
+ // Load discovered plugins from package.json
24
+ const plugins = await loadDiscoveredPlugins({ projectRoot: process.cwd() });
25
+ if (plugins.length > 0 && options.verbose) {
26
+ spin.stop();
27
+ console.log(chalk.dim(`Loaded ${plugins.length} plugin(s): ${plugins.map(p => p.metadata.name).join(', ')}`));
28
+ spin.start();
29
+ }
30
+ spin.text = 'Scanning sources...';
31
+ if (options.verbose && configPath) {
32
+ spin.stop();
33
+ info(`Using config: ${configPath}`);
34
+ spin.start();
35
+ }
36
+ // Determine which sources to scan
37
+ const sourcesToScan = options.source || [];
38
+ if (sourcesToScan.length === 0) {
39
+ // JS Frameworks
40
+ if (config.sources.react?.enabled)
41
+ sourcesToScan.push('react');
42
+ if (config.sources.vue?.enabled)
43
+ sourcesToScan.push('vue');
44
+ if (config.sources.svelte?.enabled)
45
+ sourcesToScan.push('svelte');
46
+ if (config.sources.angular?.enabled)
47
+ sourcesToScan.push('angular');
48
+ if (config.sources.webcomponent?.enabled)
49
+ sourcesToScan.push('webcomponent');
50
+ // Templates
51
+ if (config.sources.templates?.enabled)
52
+ sourcesToScan.push('templates');
53
+ // Design tools
54
+ if (config.sources.figma?.enabled)
55
+ sourcesToScan.push('figma');
56
+ if (config.sources.storybook?.enabled)
57
+ sourcesToScan.push('storybook');
58
+ if (config.sources.tokens?.enabled)
59
+ sourcesToScan.push('tokens');
60
+ }
61
+ if (sourcesToScan.length === 0) {
62
+ spin.stop();
63
+ // Check if config file even exists
64
+ const configExists = getConfigPath() !== null;
65
+ if (!configExists) {
66
+ error('No configuration found');
67
+ console.log('');
68
+ info('Run ' + chalk.cyan('buoy init') + ' to set up your project');
69
+ console.log('');
70
+ info('This will auto-detect components, tokens, and more.');
71
+ }
72
+ else {
73
+ warning('No sources to scan');
74
+ console.log('');
75
+ info('Your config file has no sources enabled.');
76
+ console.log('');
77
+ info('This can happen if:');
78
+ info(' • Auto-detection found no components');
79
+ info(' • No token files (CSS variables, JSON tokens) were found');
80
+ info(' • This is not a frontend project');
81
+ console.log('');
82
+ info('To fix:');
83
+ info(' 1. Run ' + chalk.cyan('buoy bootstrap') + ' to extract tokens from existing code');
84
+ info(' 2. Run ' + chalk.cyan('buoy build') + ' to generate a design system with AI');
85
+ info(' 3. Or add paths manually to your config');
86
+ }
87
+ return;
88
+ }
89
+ // Import scanners dynamically
90
+ const { ReactComponentScanner, VueComponentScanner, SvelteComponentScanner, AngularComponentScanner, WebComponentScanner, TemplateScanner, TokenScanner, } = await import('@buoy-design/scanners/git');
91
+ const results = {
92
+ components: [],
93
+ tokens: [],
94
+ errors: [],
95
+ };
96
+ // Scan each source
97
+ for (const source of sourcesToScan) {
98
+ spin.text = `Scanning ${source}...`;
99
+ try {
100
+ // Check if a plugin can handle this source type
101
+ const plugin = registry.getByDetection(source);
102
+ if (plugin && plugin.scan) {
103
+ // Use plugin scanner
104
+ if (options.verbose) {
105
+ spin.stop();
106
+ console.log(chalk.dim(` Using plugin "${plugin.metadata.name}" for ${source}`));
107
+ spin.start();
108
+ }
109
+ const sourceConfig = config.sources[source];
110
+ const pluginResult = await plugin.scan({
111
+ projectRoot: process.cwd(),
112
+ config: sourceConfig || {},
113
+ include: sourceConfig?.include,
114
+ exclude: sourceConfig?.exclude,
115
+ });
116
+ results.components.push(...pluginResult.components);
117
+ results.tokens.push(...pluginResult.tokens);
118
+ if (pluginResult.errors.length > 0) {
119
+ results.errors.push(...pluginResult.errors.map(e => `[${source}] ${e.file || ''}: ${e.message}`));
120
+ }
121
+ }
122
+ else {
123
+ // Fall back to bundled scanners
124
+ // React
125
+ if (source === 'react' && config.sources.react) {
126
+ const scanner = new ReactComponentScanner({
127
+ projectRoot: process.cwd(),
128
+ include: config.sources.react.include,
129
+ exclude: config.sources.react.exclude,
130
+ designSystemPackage: config.sources.react.designSystemPackage,
131
+ });
132
+ const scanResult = await scanner.scan();
133
+ results.components.push(...scanResult.items);
134
+ if (scanResult.errors.length > 0) {
135
+ results.errors.push(...scanResult.errors.map(e => `[${source}] ${e.file || ''}: ${e.message}`));
136
+ }
137
+ }
138
+ // Vue
139
+ if (source === 'vue' && config.sources.vue) {
140
+ const scanner = new VueComponentScanner({
141
+ projectRoot: process.cwd(),
142
+ include: config.sources.vue.include,
143
+ exclude: config.sources.vue.exclude,
144
+ });
145
+ const scanResult = await scanner.scan();
146
+ results.components.push(...scanResult.items);
147
+ if (scanResult.errors.length > 0) {
148
+ results.errors.push(...scanResult.errors.map(e => `[${source}] ${e.file || ''}: ${e.message}`));
149
+ }
150
+ }
151
+ // Svelte
152
+ if (source === 'svelte' && config.sources.svelte) {
153
+ const scanner = new SvelteComponentScanner({
154
+ projectRoot: process.cwd(),
155
+ include: config.sources.svelte.include,
156
+ exclude: config.sources.svelte.exclude,
157
+ });
158
+ const scanResult = await scanner.scan();
159
+ results.components.push(...scanResult.items);
160
+ if (scanResult.errors.length > 0) {
161
+ results.errors.push(...scanResult.errors.map(e => `[${source}] ${e.file || ''}: ${e.message}`));
162
+ }
163
+ }
164
+ // Angular
165
+ if (source === 'angular' && config.sources.angular) {
166
+ const scanner = new AngularComponentScanner({
167
+ projectRoot: process.cwd(),
168
+ include: config.sources.angular.include,
169
+ exclude: config.sources.angular.exclude,
170
+ });
171
+ const scanResult = await scanner.scan();
172
+ results.components.push(...scanResult.items);
173
+ if (scanResult.errors.length > 0) {
174
+ results.errors.push(...scanResult.errors.map(e => `[${source}] ${e.file || ''}: ${e.message}`));
175
+ }
176
+ }
177
+ // Web Components (Lit, Stencil)
178
+ if (source === 'webcomponent' && config.sources.webcomponent) {
179
+ const scanner = new WebComponentScanner({
180
+ projectRoot: process.cwd(),
181
+ include: config.sources.webcomponent.include,
182
+ exclude: config.sources.webcomponent.exclude,
183
+ framework: config.sources.webcomponent.framework,
184
+ });
185
+ const scanResult = await scanner.scan();
186
+ results.components.push(...scanResult.items);
187
+ if (scanResult.errors.length > 0) {
188
+ results.errors.push(...scanResult.errors.map(e => `[${source}] ${e.file || ''}: ${e.message}`));
189
+ }
190
+ }
191
+ // Templates (Blade, ERB, Twig, etc.)
192
+ if (source === 'templates' && config.sources.templates) {
193
+ const scanner = new TemplateScanner({
194
+ projectRoot: process.cwd(),
195
+ include: config.sources.templates.include,
196
+ exclude: config.sources.templates.exclude,
197
+ templateType: config.sources.templates.type,
198
+ });
199
+ const scanResult = await scanner.scan();
200
+ results.components.push(...scanResult.items);
201
+ if (scanResult.errors.length > 0) {
202
+ results.errors.push(...scanResult.errors.map(e => `[${source}] ${e.file || ''}: ${e.message}`));
203
+ }
204
+ }
205
+ // Tokens
206
+ if (source === 'tokens' && config.sources.tokens) {
207
+ const scanner = new TokenScanner({
208
+ projectRoot: process.cwd(),
209
+ files: config.sources.tokens.files,
210
+ cssVariablePrefix: config.sources.tokens.cssVariablePrefix,
211
+ });
212
+ const scanResult = await scanner.scan();
213
+ results.tokens.push(...scanResult.items);
214
+ if (scanResult.errors.length > 0) {
215
+ results.errors.push(...scanResult.errors.map(e => `[${source}] ${e.file || ''}: ${e.message}`));
216
+ }
217
+ }
218
+ // TODO: Add figma, storybook scanners
219
+ }
220
+ }
221
+ catch (err) {
222
+ const message = err instanceof Error ? err.message : String(err);
223
+ results.errors.push(`[${source}] ${message}`);
224
+ }
225
+ }
226
+ spin.stop();
227
+ // Output results
228
+ if (options.json) {
229
+ console.log(JSON.stringify(results, null, 2));
230
+ return;
231
+ }
232
+ header('Scan Results');
233
+ newline();
234
+ keyValue('Components found', String(results.components.length));
235
+ keyValue('Tokens found', String(results.tokens.length));
236
+ keyValue('Errors', String(results.errors.length));
237
+ newline();
238
+ if (results.components.length > 0) {
239
+ header('Components');
240
+ console.log(formatComponentTable(results.components));
241
+ newline();
242
+ }
243
+ if (results.tokens.length > 0) {
244
+ header('Tokens');
245
+ console.log(formatTokenTable(results.tokens));
246
+ newline();
247
+ }
248
+ if (results.errors.length > 0) {
249
+ header('Errors');
250
+ for (const err of results.errors) {
251
+ error(err);
252
+ }
253
+ newline();
254
+ }
255
+ success('Scan complete');
256
+ }
257
+ catch (err) {
258
+ spin.stop();
259
+ const message = err instanceof Error ? err.message : String(err);
260
+ error(`Scan failed: ${message}`);
261
+ process.exit(1);
262
+ }
263
+ });
264
+ return cmd;
265
+ }
266
+ //# sourceMappingURL=scan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan.js","sourceRoot":"","sources":["../../src/commands/scan.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACxH,OAAO,EAAE,qBAAqB,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AACtE,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAEjF,MAAM,UAAU,iBAAiB;IAC/B,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC;SAC5B,WAAW,CAAC,wCAAwC,CAAC;SACrD,MAAM,CAAC,2BAA2B,EAAE,sEAAsE,CAAC;SAC3G,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,eAAe,EAAE,gBAAgB,CAAC;SACzC,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACxB,sEAAsE;QACtE,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,WAAW,CAAC,IAAI,CAAC,CAAC;QACpB,CAAC;QACD,MAAM,IAAI,GAAG,OAAO,CAAC,0BAA0B,CAAC,CAAC;QAEjD,IAAI,CAAC;YACH,cAAc;YACd,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,UAAU,EAAE,CAAC;YAClD,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;YAEjC,4CAA4C;YAC5C,MAAM,OAAO,GAAG,MAAM,qBAAqB,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YAE5E,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;gBAC1C,IAAI,CAAC,IAAI,EAAE,CAAC;gBACZ,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,OAAO,CAAC,MAAM,eAAe,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC9G,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,CAAC;YAED,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;YAElC,IAAI,OAAO,CAAC,OAAO,IAAI,UAAU,EAAE,CAAC;gBAClC,IAAI,CAAC,IAAI,EAAE,CAAC;gBACZ,IAAI,CAAC,iBAAiB,UAAU,EAAE,CAAC,CAAC;gBACpC,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,CAAC;YAED,kCAAkC;YAClC,MAAM,aAAa,GAAa,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC;YACrD,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC/B,gBAAgB;gBAChB,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO;oBAAE,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBAC/D,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO;oBAAE,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAC3D,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO;oBAAE,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACjE,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO;oBAAE,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBACnE,IAAI,MAAM,CAAC,OAAO,CAAC,YAAY,EAAE,OAAO;oBAAE,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;gBAC7E,YAAY;gBACZ,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO;oBAAE,aAAa,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;gBACvE,eAAe;gBACf,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO;oBAAE,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBAC/D,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO;oBAAE,aAAa,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;gBACvE,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO;oBAAE,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACnE,CAAC;YAED,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC/B,IAAI,CAAC,IAAI,EAAE,CAAC;gBAEZ,mCAAmC;gBACnC,MAAM,YAAY,GAAG,aAAa,EAAE,KAAK,IAAI,CAAC;gBAE9C,IAAI,CAAC,YAAY,EAAE,CAAC;oBAClB,KAAK,CAAC,wBAAwB,CAAC,CAAC;oBAChC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;oBAChB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,yBAAyB,CAAC,CAAC;oBACnE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;oBAChB,IAAI,CAAC,qDAAqD,CAAC,CAAC;gBAC9D,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,oBAAoB,CAAC,CAAC;oBAC9B,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;oBAChB,IAAI,CAAC,0CAA0C,CAAC,CAAC;oBACjD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;oBAChB,IAAI,CAAC,qBAAqB,CAAC,CAAC;oBAC5B,IAAI,CAAC,wCAAwC,CAAC,CAAC;oBAC/C,IAAI,CAAC,4DAA4D,CAAC,CAAC;oBACnE,IAAI,CAAC,oCAAoC,CAAC,CAAC;oBAC3C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;oBAChB,IAAI,CAAC,SAAS,CAAC,CAAC;oBAChB,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,uCAAuC,CAAC,CAAC;oBAC3F,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,sCAAsC,CAAC,CAAC;oBACtF,IAAI,CAAC,2CAA2C,CAAC,CAAC;gBACpD,CAAC;gBACD,OAAO;YACT,CAAC;YAED,8BAA8B;YAC9B,MAAM,EACJ,qBAAqB,EACrB,mBAAmB,EACnB,sBAAsB,EACtB,uBAAuB,EACvB,mBAAmB,EACnB,eAAe,EACf,YAAY,GACb,GAAG,MAAM,MAAM,CAAC,2BAA2B,CAAC,CAAC;YAE9C,MAAM,OAAO,GAIT;gBACF,UAAU,EAAE,EAAE;gBACd,MAAM,EAAE,EAAE;gBACV,MAAM,EAAE,EAAE;aACX,CAAC;YAEF,mBAAmB;YACnB,KAAK,MAAM,MAAM,IAAI,aAAa,EAAE,CAAC;gBACnC,IAAI,CAAC,IAAI,GAAG,YAAY,MAAM,KAAK,CAAC;gBAEpC,IAAI,CAAC;oBACH,gDAAgD;oBAChD,MAAM,MAAM,GAAG,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;oBAE/C,IAAI,MAAM,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;wBAC1B,qBAAqB;wBACrB,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;4BACpB,IAAI,CAAC,IAAI,EAAE,CAAC;4BACZ,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,mBAAmB,MAAM,CAAC,QAAQ,CAAC,IAAI,SAAS,MAAM,EAAE,CAAC,CAAC,CAAC;4BACjF,IAAI,CAAC,KAAK,EAAE,CAAC;wBACf,CAAC;wBAED,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC,MAAqC,CAAC,CAAC;wBAC3E,MAAM,YAAY,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC;4BACrC,WAAW,EAAE,OAAO,CAAC,GAAG,EAAE;4BAC1B,MAAM,EAAG,YAAwC,IAAI,EAAE;4BACvD,OAAO,EAAG,YAAuC,EAAE,OAAO;4BAC1D,OAAO,EAAG,YAAuC,EAAE,OAAO;yBAC3D,CAAC,CAAC;wBAEH,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC;wBACpD,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;wBAE5C,IAAI,YAAY,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;4BACnC,OAAO,CAAC,MAAM,CAAC,IAAI,CACjB,GAAG,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,MAAM,KAAK,CAAC,CAAC,IAAI,IAAI,EAAE,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAC7E,CAAC;wBACJ,CAAC;oBACH,CAAC;yBAAM,CAAC;wBACN,gCAAgC;wBAEhC,QAAQ;wBACR,IAAI,MAAM,KAAK,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;4BAC/C,MAAM,OAAO,GAAG,IAAI,qBAAqB,CAAC;gCACxC,WAAW,EAAE,OAAO,CAAC,GAAG,EAAE;gCAC1B,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO;gCACrC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO;gCACrC,mBAAmB,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,mBAAmB;6BAC9D,CAAC,CAAC;4BAEH,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;4BACxC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;4BAE7C,IAAI,UAAU,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gCACjC,OAAO,CAAC,MAAM,CAAC,IAAI,CACjB,GAAG,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,MAAM,KAAK,CAAC,CAAC,IAAI,IAAI,EAAE,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAC3E,CAAC;4BACJ,CAAC;wBACH,CAAC;wBAED,MAAM;wBACN,IAAI,MAAM,KAAK,KAAK,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;4BAC3C,MAAM,OAAO,GAAG,IAAI,mBAAmB,CAAC;gCACtC,WAAW,EAAE,OAAO,CAAC,GAAG,EAAE;gCAC1B,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO;gCACnC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO;6BACpC,CAAC,CAAC;4BAEH,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;4BACxC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;4BAE7C,IAAI,UAAU,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gCACjC,OAAO,CAAC,MAAM,CAAC,IAAI,CACjB,GAAG,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,MAAM,KAAK,CAAC,CAAC,IAAI,IAAI,EAAE,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAC3E,CAAC;4BACJ,CAAC;wBACH,CAAC;wBAED,SAAS;wBACT,IAAI,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;4BACjD,MAAM,OAAO,GAAG,IAAI,sBAAsB,CAAC;gCACzC,WAAW,EAAE,OAAO,CAAC,GAAG,EAAE;gCAC1B,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO;gCACtC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO;6BACvC,CAAC,CAAC;4BAEH,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;4BACxC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;4BAE7C,IAAI,UAAU,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gCACjC,OAAO,CAAC,MAAM,CAAC,IAAI,CACjB,GAAG,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,MAAM,KAAK,CAAC,CAAC,IAAI,IAAI,EAAE,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAC3E,CAAC;4BACJ,CAAC;wBACH,CAAC;wBAED,UAAU;wBACV,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;4BACnD,MAAM,OAAO,GAAG,IAAI,uBAAuB,CAAC;gCAC1C,WAAW,EAAE,OAAO,CAAC,GAAG,EAAE;gCAC1B,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO;gCACvC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO;6BACxC,CAAC,CAAC;4BAEH,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;4BACxC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;4BAE7C,IAAI,UAAU,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gCACjC,OAAO,CAAC,MAAM,CAAC,IAAI,CACjB,GAAG,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,MAAM,KAAK,CAAC,CAAC,IAAI,IAAI,EAAE,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAC3E,CAAC;4BACJ,CAAC;wBACH,CAAC;wBAED,gCAAgC;wBAChC,IAAI,MAAM,KAAK,cAAc,IAAI,MAAM,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC;4BAC7D,MAAM,OAAO,GAAG,IAAI,mBAAmB,CAAC;gCACtC,WAAW,EAAE,OAAO,CAAC,GAAG,EAAE;gCAC1B,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,OAAO;gCAC5C,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,OAAO;gCAC5C,SAAS,EAAE,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,SAAS;6BACjD,CAAC,CAAC;4BAEH,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;4BACxC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;4BAE7C,IAAI,UAAU,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gCACjC,OAAO,CAAC,MAAM,CAAC,IAAI,CACjB,GAAG,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,MAAM,KAAK,CAAC,CAAC,IAAI,IAAI,EAAE,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAC3E,CAAC;4BACJ,CAAC;wBACH,CAAC;wBAED,qCAAqC;wBACrC,IAAI,MAAM,KAAK,WAAW,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;4BACvD,MAAM,OAAO,GAAG,IAAI,eAAe,CAAC;gCAClC,WAAW,EAAE,OAAO,CAAC,GAAG,EAAE;gCAC1B,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO;gCACzC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO;gCACzC,YAAY,EAAE,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI;6BAC5C,CAAC,CAAC;4BAEH,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;4BACxC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;4BAE7C,IAAI,UAAU,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gCACjC,OAAO,CAAC,MAAM,CAAC,IAAI,CACjB,GAAG,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,MAAM,KAAK,CAAC,CAAC,IAAI,IAAI,EAAE,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAC3E,CAAC;4BACJ,CAAC;wBACH,CAAC;wBAED,SAAS;wBACT,IAAI,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;4BACjD,MAAM,OAAO,GAAG,IAAI,YAAY,CAAC;gCAC/B,WAAW,EAAE,OAAO,CAAC,GAAG,EAAE;gCAC1B,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK;gCAClC,iBAAiB,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,iBAAiB;6BAC3D,CAAC,CAAC;4BAEH,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;4BACxC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;4BAEzC,IAAI,UAAU,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gCACjC,OAAO,CAAC,MAAM,CAAC,IAAI,CACjB,GAAG,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,MAAM,KAAK,CAAC,CAAC,IAAI,IAAI,EAAE,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAC3E,CAAC;4BACJ,CAAC;wBACH,CAAC;wBAED,sCAAsC;oBACxC,CAAC;gBACH,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;oBACjE,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC,CAAC;gBAChD,CAAC;YACH,CAAC;YAED,IAAI,CAAC,IAAI,EAAE,CAAC;YAEZ,iBAAiB;YACjB,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;gBACjB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;gBAC9C,OAAO;YACT,CAAC;YAED,MAAM,CAAC,cAAc,CAAC,CAAC;YACvB,OAAO,EAAE,CAAC;YAEV,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;YAChE,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;YACxD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;YAClD,OAAO,EAAE,CAAC;YAEV,IAAI,OAAO,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAClC,MAAM,CAAC,YAAY,CAAC,CAAC;gBACrB,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;gBACtD,OAAO,EAAE,CAAC;YACZ,CAAC;YAED,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC9B,MAAM,CAAC,QAAQ,CAAC,CAAC;gBACjB,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;gBAC9C,OAAO,EAAE,CAAC;YACZ,CAAC;YAED,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC9B,MAAM,CAAC,QAAQ,CAAC,CAAC;gBACjB,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;oBACjC,KAAK,CAAC,GAAG,CAAC,CAAC;gBACb,CAAC;gBACD,OAAO,EAAE,CAAC;YACZ,CAAC;YAED,OAAO,CAAC,eAAe,CAAC,CAAC;QAC3B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,IAAI,EAAE,CAAC;YACZ,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACjE,KAAK,CAAC,gBAAgB,OAAO,EAAE,CAAC,CAAC;YACjC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function createStatusCommand(): Command;
3
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAepC,wBAAgB,mBAAmB,IAAI,OAAO,CA8O7C"}
@@ -0,0 +1,205 @@
1
+ import { Command } from 'commander';
2
+ import chalk from 'chalk';
3
+ import { loadConfig, getConfigPath } from '../config/loader.js';
4
+ import { spinner, success, error, info, coverageGrid, setJsonMode, } from '../output/reporters.js';
5
+ import { ProjectDetector } from '../detect/project-detector.js';
6
+ export function createStatusCommand() {
7
+ const cmd = new Command('status')
8
+ .description('Show design system coverage at a glance')
9
+ .option('--json', 'Output as JSON')
10
+ .option('-v, --verbose', 'Verbose output')
11
+ .action(async (options) => {
12
+ // Set JSON mode before creating spinner to redirect spinner to stderr
13
+ if (options.json) {
14
+ setJsonMode(true);
15
+ }
16
+ const spin = spinner('Analyzing design system coverage...');
17
+ try {
18
+ // Check if config exists
19
+ const configExists = getConfigPath() !== null;
20
+ if (!configExists) {
21
+ spin.stop();
22
+ error('No configuration found');
23
+ console.log('');
24
+ info('Run buoy init to set up your project');
25
+ return;
26
+ }
27
+ const { config } = await loadConfig();
28
+ // Import required modules
29
+ const { ReactComponentScanner, VueComponentScanner, SvelteComponentScanner, AngularComponentScanner, WebComponentScanner, TemplateScanner, } = await import('@buoy-design/scanners/git');
30
+ const { SemanticDiffEngine } = await import('@buoy-design/core/analysis');
31
+ const components = [];
32
+ spin.text = 'Scanning components...';
33
+ // React
34
+ if (config.sources.react?.enabled) {
35
+ const scanner = new ReactComponentScanner({
36
+ projectRoot: process.cwd(),
37
+ include: config.sources.react.include,
38
+ exclude: config.sources.react.exclude,
39
+ designSystemPackage: config.sources.react.designSystemPackage,
40
+ });
41
+ const result = await scanner.scan();
42
+ components.push(...result.items);
43
+ }
44
+ // Vue
45
+ if (config.sources.vue?.enabled) {
46
+ const scanner = new VueComponentScanner({
47
+ projectRoot: process.cwd(),
48
+ include: config.sources.vue.include,
49
+ exclude: config.sources.vue.exclude,
50
+ });
51
+ const result = await scanner.scan();
52
+ components.push(...result.items);
53
+ }
54
+ // Svelte
55
+ if (config.sources.svelte?.enabled) {
56
+ const scanner = new SvelteComponentScanner({
57
+ projectRoot: process.cwd(),
58
+ include: config.sources.svelte.include,
59
+ exclude: config.sources.svelte.exclude,
60
+ });
61
+ const result = await scanner.scan();
62
+ components.push(...result.items);
63
+ }
64
+ // Angular
65
+ if (config.sources.angular?.enabled) {
66
+ const scanner = new AngularComponentScanner({
67
+ projectRoot: process.cwd(),
68
+ include: config.sources.angular.include,
69
+ exclude: config.sources.angular.exclude,
70
+ });
71
+ const result = await scanner.scan();
72
+ components.push(...result.items);
73
+ }
74
+ // Web Components
75
+ if (config.sources.webcomponent?.enabled) {
76
+ const scanner = new WebComponentScanner({
77
+ projectRoot: process.cwd(),
78
+ include: config.sources.webcomponent.include,
79
+ exclude: config.sources.webcomponent.exclude,
80
+ framework: config.sources.webcomponent.framework,
81
+ });
82
+ const result = await scanner.scan();
83
+ components.push(...result.items);
84
+ }
85
+ // Templates
86
+ if (config.sources.templates?.enabled) {
87
+ const scanner = new TemplateScanner({
88
+ projectRoot: process.cwd(),
89
+ include: config.sources.templates.include,
90
+ exclude: config.sources.templates.exclude,
91
+ templateType: config.sources.templates.type,
92
+ });
93
+ const result = await scanner.scan();
94
+ components.push(...result.items);
95
+ }
96
+ // Detect frameworks for sprawl check
97
+ spin.text = 'Detecting frameworks...';
98
+ const detector = new ProjectDetector(process.cwd());
99
+ const projectInfo = await detector.detect();
100
+ // Run drift analysis
101
+ spin.text = 'Analyzing drift...';
102
+ const engine = new SemanticDiffEngine();
103
+ const diffResult = engine.analyzeComponents(components, {
104
+ checkDeprecated: true,
105
+ checkNaming: true,
106
+ checkDocumentation: true,
107
+ });
108
+ const drifts = [...diffResult.drifts];
109
+ // Check for framework sprawl
110
+ const sprawlSignal = engine.checkFrameworkSprawl(projectInfo.frameworks.map(f => ({ name: f.name, version: f.version })));
111
+ if (sprawlSignal) {
112
+ drifts.push(sprawlSignal);
113
+ }
114
+ // Calculate coverage stats
115
+ const driftingComponentIds = new Set(drifts.map(d => d.source.entityId));
116
+ const stats = {
117
+ aligned: components.filter(c => !driftingComponentIds.has(c.id)).length,
118
+ drifting: driftingComponentIds.size,
119
+ untracked: 0, // For future: components not yet analyzed
120
+ total: components.length,
121
+ };
122
+ spin.stop();
123
+ // Group components by status
124
+ const alignedComponents = components.filter(c => !driftingComponentIds.has(c.id));
125
+ const driftingComponentsList = components.filter(c => driftingComponentIds.has(c.id));
126
+ // Output
127
+ if (options.json) {
128
+ console.log(JSON.stringify({
129
+ stats,
130
+ alignedPercent: stats.total > 0 ? Math.round((stats.aligned / stats.total) * 100) : 0,
131
+ frameworks: projectInfo.frameworks.map(f => ({ name: f.name, version: f.version })),
132
+ frameworkSprawl: sprawlSignal !== null,
133
+ components: {
134
+ aligned: alignedComponents.map(c => ({ id: c.id, name: c.name, path: 'path' in c.source ? c.source.path : undefined })),
135
+ drifting: driftingComponentsList.map(c => ({ id: c.id, name: c.name, path: 'path' in c.source ? c.source.path : undefined })),
136
+ },
137
+ }, null, 2));
138
+ return;
139
+ }
140
+ if (stats.total === 0) {
141
+ info('No components found to analyze.');
142
+ console.log('');
143
+ info('Options:');
144
+ info(' • Run ' + chalk.cyan('buoy bootstrap') + ' to extract tokens from existing code');
145
+ info(' • Run ' + chalk.cyan('buoy build') + ' to generate a design system with AI');
146
+ info(' • Check your config has component paths configured');
147
+ return;
148
+ }
149
+ // Display framework sprawl warning if detected
150
+ if (sprawlSignal) {
151
+ console.log('');
152
+ console.log(chalk.yellow.bold('⚠️ Framework Sprawl Detected'));
153
+ console.log(chalk.dim(' Multiple UI frameworks in use:'));
154
+ projectInfo.frameworks.forEach(f => {
155
+ const version = f.version !== 'unknown' ? chalk.dim(` (${f.version})`) : '';
156
+ console.log(` • ${chalk.cyan(f.name)}${version}`);
157
+ });
158
+ console.log('');
159
+ }
160
+ // Display the coverage grid
161
+ coverageGrid(stats);
162
+ // Display component lists
163
+ console.log('');
164
+ if (driftingComponentsList.length > 0) {
165
+ console.log('\x1b[33m⛀ Drifting:\x1b[0m');
166
+ driftingComponentsList.forEach(c => {
167
+ console.log(` ${c.name}`);
168
+ });
169
+ console.log('');
170
+ }
171
+ if (alignedComponents.length > 0) {
172
+ console.log('\x1b[32m⛁ Aligned:\x1b[0m');
173
+ alignedComponents.forEach(c => {
174
+ console.log(` ${c.name}`);
175
+ });
176
+ console.log('');
177
+ }
178
+ // Summary message
179
+ const alignedPct = Math.round((stats.aligned / stats.total) * 100);
180
+ if (alignedPct === 100) {
181
+ success('Perfect alignment! No drift detected.');
182
+ }
183
+ else if (alignedPct >= 80) {
184
+ success('Good alignment. Minor drift to review.');
185
+ }
186
+ else if (alignedPct >= 50) {
187
+ info('Moderate alignment. Consider reviewing drifting components.');
188
+ }
189
+ else {
190
+ error('Low alignment. Run buoy drift check for details.');
191
+ }
192
+ }
193
+ catch (err) {
194
+ spin.stop();
195
+ const message = err instanceof Error ? err.message : String(err);
196
+ error(`Status check failed: ${message}`);
197
+ if (options.verbose) {
198
+ console.error(err);
199
+ }
200
+ process.exit(1);
201
+ }
202
+ });
203
+ return cmd;
204
+ }
205
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export * from './schema.js';
2
+ export * from './loader.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC"}
@@ -0,0 +1,3 @@
1
+ export * from './schema.js';
2
+ export * from './loader.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { BuoyConfig } from './schema.js';
2
+ export interface LoadConfigResult {
3
+ config: BuoyConfig;
4
+ configPath: string | null;
5
+ }
6
+ export declare function loadConfig(cwd?: string): Promise<LoadConfigResult>;
7
+ export declare function getConfigPath(cwd?: string): string | null;
8
+ //# sourceMappingURL=loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAoB,MAAM,aAAa,CAAC;AAU3D,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,UAAU,CAAC;IACnB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,wBAAsB,UAAU,CAAC,GAAG,GAAE,MAAsB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAkDvF;AAED,wBAAgB,aAAa,CAAC,GAAG,GAAE,MAAsB,GAAG,MAAM,GAAG,IAAI,CAQxE"}
@@ -0,0 +1,67 @@
1
+ import { existsSync } from 'fs';
2
+ import { resolve, basename } from 'path';
3
+ import { pathToFileURL } from 'url';
4
+ import { BuoyConfigSchema } from './schema.js';
5
+ const CONFIG_FILES = [
6
+ 'buoy.config.mjs',
7
+ 'buoy.config.js',
8
+ 'buoy.config.ts', // Requires tsx or similar runtime
9
+ '.buoyrc.json',
10
+ '.buoyrc',
11
+ ];
12
+ export async function loadConfig(cwd = process.cwd()) {
13
+ // Find config file
14
+ let configPath = null;
15
+ for (const filename of CONFIG_FILES) {
16
+ const fullPath = resolve(cwd, filename);
17
+ if (existsSync(fullPath)) {
18
+ configPath = fullPath;
19
+ break;
20
+ }
21
+ }
22
+ if (!configPath) {
23
+ // Return default config if no file found
24
+ return {
25
+ config: BuoyConfigSchema.parse({
26
+ project: { name: basename(cwd) },
27
+ }),
28
+ configPath: null,
29
+ };
30
+ }
31
+ // Load config based on extension
32
+ const ext = configPath.split('.').pop();
33
+ try {
34
+ if (ext === 'json' || configPath.endsWith('.buoyrc')) {
35
+ const { readFileSync } = await import('fs');
36
+ const content = readFileSync(configPath, 'utf-8');
37
+ const raw = JSON.parse(content);
38
+ return {
39
+ config: BuoyConfigSchema.parse(raw),
40
+ configPath,
41
+ };
42
+ }
43
+ // For JS/TS files, we need to import them
44
+ // Note: TypeScript files need tsx or similar runtime
45
+ const fileUrl = pathToFileURL(configPath).href;
46
+ const mod = await import(fileUrl);
47
+ const raw = mod.default || mod;
48
+ return {
49
+ config: BuoyConfigSchema.parse(raw),
50
+ configPath,
51
+ };
52
+ }
53
+ catch (error) {
54
+ const message = error instanceof Error ? error.message : String(error);
55
+ throw new Error(`Failed to load config from ${configPath}: ${message}`);
56
+ }
57
+ }
58
+ export function getConfigPath(cwd = process.cwd()) {
59
+ for (const filename of CONFIG_FILES) {
60
+ const fullPath = resolve(cwd, filename);
61
+ if (existsSync(fullPath)) {
62
+ return fullPath;
63
+ }
64
+ }
65
+ return null;
66
+ }
67
+ //# sourceMappingURL=loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAc,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE3D,MAAM,YAAY,GAAG;IACnB,iBAAiB;IACjB,gBAAgB;IAChB,gBAAgB,EAAG,kCAAkC;IACrD,cAAc;IACd,SAAS;CACV,CAAC;AAOF,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,MAAc,OAAO,CAAC,GAAG,EAAE;IAC1D,mBAAmB;IACnB,IAAI,UAAU,GAAkB,IAAI,CAAC;IAErC,KAAK,MAAM,QAAQ,IAAI,YAAY,EAAE,CAAC;QACpC,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QACxC,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YACzB,UAAU,GAAG,QAAQ,CAAC;YACtB,MAAM;QACR,CAAC;IACH,CAAC;IAED,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,yCAAyC;QACzC,OAAO;YACL,MAAM,EAAE,gBAAgB,CAAC,KAAK,CAAC;gBAC7B,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,CAAC,GAAG,CAAC,EAAE;aACjC,CAAC;YACF,UAAU,EAAE,IAAI;SACjB,CAAC;IACJ,CAAC;IAED,iCAAiC;IACjC,MAAM,GAAG,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;IAExC,IAAI,CAAC;QACH,IAAI,GAAG,KAAK,MAAM,IAAI,UAAU,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;YACrD,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;YAC5C,MAAM,OAAO,GAAG,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YAClD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAChC,OAAO;gBACL,MAAM,EAAE,gBAAgB,CAAC,KAAK,CAAC,GAAG,CAAC;gBACnC,UAAU;aACX,CAAC;QACJ,CAAC;QAED,0CAA0C;QAC1C,qDAAqD;QACrD,MAAM,OAAO,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC;QAC/C,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC;QAClC,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC;QAE/B,OAAO;YACL,MAAM,EAAE,gBAAgB,CAAC,KAAK,CAAC,GAAG,CAAC;YACnC,UAAU;SACX,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,MAAM,IAAI,KAAK,CAAC,8BAA8B,UAAU,KAAK,OAAO,EAAE,CAAC,CAAC;IAC1E,CAAC;AACH,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,MAAc,OAAO,CAAC,GAAG,EAAE;IACvD,KAAK,MAAM,QAAQ,IAAI,YAAY,EAAE,CAAC;QACpC,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QACxC,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YACzB,OAAO,QAAQ,CAAC;QAClB,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}