@buoy-design/cli 0.2.0 → 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (91) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +27 -15
  3. package/dist/bin.js +0 -0
  4. package/dist/commands/begin.js +40 -43
  5. package/dist/commands/begin.js.map +1 -1
  6. package/dist/commands/billing.js +4 -4
  7. package/dist/commands/billing.js.map +1 -1
  8. package/dist/commands/check.d.ts.map +1 -1
  9. package/dist/commands/check.js +16 -7
  10. package/dist/commands/check.js.map +1 -1
  11. package/dist/commands/components-query.js +1 -1
  12. package/dist/commands/components-query.js.map +1 -1
  13. package/dist/commands/context.js +1 -1
  14. package/dist/commands/context.js.map +1 -1
  15. package/dist/commands/dock.d.ts.map +1 -1
  16. package/dist/commands/dock.js +163 -59
  17. package/dist/commands/dock.js.map +1 -1
  18. package/dist/commands/fix.d.ts +1 -1
  19. package/dist/commands/fix.d.ts.map +1 -1
  20. package/dist/commands/fix.js +76 -72
  21. package/dist/commands/fix.js.map +1 -1
  22. package/dist/commands/github.js +2 -2
  23. package/dist/commands/github.js.map +1 -1
  24. package/dist/commands/index.d.ts +5 -0
  25. package/dist/commands/index.d.ts.map +1 -1
  26. package/dist/commands/index.js +5 -0
  27. package/dist/commands/index.js.map +1 -1
  28. package/dist/commands/link.js +4 -4
  29. package/dist/commands/link.js.map +1 -1
  30. package/dist/commands/login.js +1 -1
  31. package/dist/commands/login.js.map +1 -1
  32. package/dist/commands/scan.d.ts.map +1 -1
  33. package/dist/commands/scan.js +3 -4
  34. package/dist/commands/scan.js.map +1 -1
  35. package/dist/commands/ship.js +3 -3
  36. package/dist/commands/ship.js.map +1 -1
  37. package/dist/commands/show.d.ts.map +1 -1
  38. package/dist/commands/show.js +61 -13
  39. package/dist/commands/show.js.map +1 -1
  40. package/dist/commands/sync.js +1 -1
  41. package/dist/commands/sync.js.map +1 -1
  42. package/dist/commands/tokens-lookup.js +1 -1
  43. package/dist/commands/tokens-lookup.js.map +1 -1
  44. package/dist/commands/tokens.d.ts.map +1 -1
  45. package/dist/commands/tokens.js +46 -3
  46. package/dist/commands/tokens.js.map +1 -1
  47. package/dist/commands/whoami.js +1 -1
  48. package/dist/commands/whoami.js.map +1 -1
  49. package/dist/hooks/index.js +1 -1
  50. package/dist/hooks/index.js.map +1 -1
  51. package/dist/index.d.ts.map +1 -1
  52. package/dist/index.js +14 -8
  53. package/dist/index.js.map +1 -1
  54. package/dist/insights/project-insights.js +1 -1
  55. package/dist/insights/project-insights.js.map +1 -1
  56. package/dist/output/reporters.d.ts +1 -1
  57. package/dist/output/reporters.d.ts.map +1 -1
  58. package/dist/output/reporters.js +42 -35
  59. package/dist/output/reporters.js.map +1 -1
  60. package/dist/services/ai-tools-detector.js +6 -6
  61. package/dist/services/ai-tools-detector.js.map +1 -1
  62. package/dist/services/drift-analysis.d.ts +4 -0
  63. package/dist/services/drift-analysis.d.ts.map +1 -1
  64. package/dist/services/drift-analysis.js +19 -3
  65. package/dist/services/drift-analysis.js.map +1 -1
  66. package/dist/wizard/ci-generator.d.ts +2 -4
  67. package/dist/wizard/ci-generator.d.ts.map +1 -1
  68. package/dist/wizard/ci-generator.js +14 -104
  69. package/dist/wizard/ci-generator.js.map +1 -1
  70. package/package.json +15 -15
  71. package/dist/commands/anchor.d.ts +0 -3
  72. package/dist/commands/anchor.d.ts.map +0 -1
  73. package/dist/commands/anchor.js +0 -487
  74. package/dist/commands/anchor.js.map +0 -1
  75. package/dist/commands/bot.d.ts +0 -9
  76. package/dist/commands/bot.d.ts.map +0 -1
  77. package/dist/commands/bot.js +0 -258
  78. package/dist/commands/bot.js.map +0 -1
  79. package/dist/commands/ci.d.ts +0 -24
  80. package/dist/commands/ci.d.ts.map +0 -1
  81. package/dist/commands/ci.js +0 -474
  82. package/dist/commands/ci.js.map +0 -1
  83. package/dist/commands/cloud.d.ts +0 -15
  84. package/dist/commands/cloud.d.ts.map +0 -1
  85. package/dist/commands/cloud.js +0 -36
  86. package/dist/commands/cloud.js.map +0 -1
  87. package/dist/commands/explain.d.ts.map +0 -1
  88. package/dist/commands/onboard.d.ts +0 -9
  89. package/dist/commands/onboard.d.ts.map +0 -1
  90. package/dist/commands/onboard.js +0 -314
  91. package/dist/commands/onboard.js.map +0 -1
@@ -1,314 +0,0 @@
1
- /**
2
- * buoy onboard - Onboard AI to your design system
3
- *
4
- * Creates skill files and updates CLAUDE.md so AI tools
5
- * understand and follow your design system.
6
- */
7
- import { Command } from 'commander';
8
- import chalk from 'chalk';
9
- import { existsSync, mkdirSync, writeFileSync, readFileSync, appendFileSync, copyFileSync, readdirSync } from 'fs';
10
- import { dirname, join, resolve } from 'path';
11
- import { homedir } from 'os';
12
- import { fileURLToPath } from 'url';
13
- import { loadConfig, getConfigPath } from '../config/loader.js';
14
- import { buildAutoConfig } from '../config/auto-detect.js';
15
- import { ScanOrchestrator } from '../scan/orchestrator.js';
16
- import { spinner, error as errorLog, setJsonMode } from '../output/reporters.js';
17
- import { SkillExportService } from '../services/skill-export.js';
18
- import { generateContext } from '../services/context-generator.js';
19
- import { setupClaudeHooks } from '../hooks/index.js';
20
- const __filename = fileURLToPath(import.meta.url);
21
- const __dirname = dirname(__filename);
22
- /**
23
- * Install Buoy's Claude commands to ~/.claude/commands/
24
- */
25
- function installClaudeCommands(dryRun = false) {
26
- const commandsDir = join(homedir(), '.claude', 'commands');
27
- const assetsDir = resolve(__dirname, '..', '..', 'assets', 'commands');
28
- const installed = [];
29
- const alreadyExisted = [];
30
- // Check if assets directory exists
31
- if (!existsSync(assetsDir)) {
32
- return { installed, alreadyExisted };
33
- }
34
- // Create commands directory if needed
35
- if (!dryRun && !existsSync(commandsDir)) {
36
- mkdirSync(commandsDir, { recursive: true });
37
- }
38
- // Copy each command file
39
- const commandFiles = readdirSync(assetsDir).filter(f => f.endsWith('.md'));
40
- for (const file of commandFiles) {
41
- const srcPath = join(assetsDir, file);
42
- const destPath = join(commandsDir, file);
43
- if (existsSync(destPath)) {
44
- alreadyExisted.push(file.replace('.md', ''));
45
- }
46
- else {
47
- if (!dryRun) {
48
- copyFileSync(srcPath, destPath);
49
- }
50
- installed.push(file.replace('.md', ''));
51
- }
52
- }
53
- return { installed, alreadyExisted };
54
- }
55
- export function createOnboardCommand() {
56
- return new Command('onboard')
57
- .description('Onboard AI to your design system')
58
- .option('--skill-only', 'Only create skill files, skip CLAUDE.md')
59
- .option('--context-only', 'Only update CLAUDE.md, skip skill files')
60
- .option('--claude-hooks', 'Setup Claude Code hooks for real-time drift feedback')
61
- .option('--no-commands', 'Skip installing Claude slash commands')
62
- .option('--dry-run', 'Show what would be created without writing files')
63
- .option('--json', 'Output result as JSON')
64
- .action(async (options) => {
65
- const cwd = process.cwd();
66
- if (options.json) {
67
- setJsonMode(true);
68
- }
69
- console.log('');
70
- console.log(chalk.cyan.bold('🛟 Onboarding AI to your design system...'));
71
- console.log('');
72
- const spin = spinner('Analyzing your codebase...');
73
- try {
74
- // Load or auto-detect config
75
- let config;
76
- let projectName = 'design-system';
77
- const configPath = getConfigPath();
78
- if (configPath) {
79
- const result = await loadConfig();
80
- config = result.config;
81
- projectName = config.project?.name || 'design-system';
82
- }
83
- else {
84
- const autoResult = await buildAutoConfig(cwd);
85
- config = autoResult.config;
86
- projectName = config.project?.name || 'design-system';
87
- }
88
- // Scan components and tokens
89
- spin.text = 'Scanning components and tokens...';
90
- const orchestrator = new ScanOrchestrator(config, cwd);
91
- const scanResult = await orchestrator.scan({
92
- onProgress: (msg) => {
93
- spin.text = msg;
94
- },
95
- });
96
- // Run drift analysis for anti-patterns
97
- spin.text = 'Identifying patterns and anti-patterns...';
98
- const { SemanticDiffEngine } = await import('@buoy-design/core/analysis');
99
- const engine = new SemanticDiffEngine();
100
- const diffResult = engine.analyzeComponents(scanResult.components, {
101
- checkDeprecated: true,
102
- checkNaming: true,
103
- checkDocumentation: true,
104
- });
105
- spin.stop();
106
- const results = {
107
- skillCreated: false,
108
- contextUpdated: false,
109
- claudeHooksCreated: false,
110
- commandsInstalled: [],
111
- commandsExisted: [],
112
- skillPath: '',
113
- claudeHooksPath: '',
114
- stats: {
115
- tokens: 0,
116
- components: 0,
117
- patterns: 0,
118
- },
119
- };
120
- // Create skill files (unless --context-only)
121
- if (!options.contextOnly) {
122
- const skillPath = resolve(cwd, '.claude/skills/design-system');
123
- if (options.dryRun) {
124
- console.log(chalk.dim(' Would create skill at: ' + skillPath));
125
- }
126
- else {
127
- const exportService = new SkillExportService(projectName);
128
- const skillResult = await exportService.export({
129
- tokens: scanResult.tokens,
130
- components: scanResult.components,
131
- drifts: diffResult.drifts,
132
- projectName,
133
- }, {
134
- sections: ['tokens', 'components', 'patterns', 'anti-patterns'],
135
- outputPath: skillPath,
136
- });
137
- // Write skill files
138
- for (const file of skillResult.files) {
139
- const dir = dirname(file.path);
140
- if (!existsSync(dir)) {
141
- mkdirSync(dir, { recursive: true });
142
- }
143
- writeFileSync(file.path, file.content);
144
- }
145
- results.skillCreated = true;
146
- results.skillPath = skillPath;
147
- results.stats.tokens = skillResult.stats.tokens.total;
148
- results.stats.components = skillResult.stats.components;
149
- results.stats.patterns = skillResult.stats.patterns.length;
150
- }
151
- }
152
- // Update CLAUDE.md (unless --skill-only)
153
- if (!options.skillOnly) {
154
- const claudeMdPath = join(cwd, 'CLAUDE.md');
155
- if (options.dryRun) {
156
- console.log(chalk.dim(' Would update: CLAUDE.md'));
157
- }
158
- else {
159
- // Generate context
160
- const contextResult = generateContext({
161
- tokens: scanResult.tokens,
162
- components: scanResult.components,
163
- drifts: diffResult.drifts,
164
- projectName,
165
- }, { detailLevel: 'standard' });
166
- const context = contextResult.content;
167
- // Check if CLAUDE.md exists and has design system section
168
- const designSystemHeader = '## Design System';
169
- let existingContent = '';
170
- let hasDesignSystemSection = false;
171
- if (existsSync(claudeMdPath)) {
172
- existingContent = readFileSync(claudeMdPath, 'utf-8');
173
- // Remove code blocks before checking for headers to avoid false positives
174
- const contentWithoutCodeBlocks = existingContent.replace(/```[\s\S]*?```/g, '');
175
- // Check for design system header at start of line (not inside code blocks)
176
- hasDesignSystemSection = /^##?\s*[Dd]esign\s*[Ss]ystem/m.test(contentWithoutCodeBlocks);
177
- }
178
- if (!hasDesignSystemSection) {
179
- // Append design system section
180
- const section = `\n${designSystemHeader}\n\n${context}\n`;
181
- if (existingContent) {
182
- appendFileSync(claudeMdPath, section);
183
- }
184
- else {
185
- writeFileSync(claudeMdPath, `# CLAUDE.md\n${section}`);
186
- }
187
- results.contextUpdated = true;
188
- }
189
- else {
190
- // Already has design system section - skip
191
- console.log(chalk.dim(' CLAUDE.md already has design system section'));
192
- }
193
- }
194
- }
195
- // Setup Claude Code hooks if --claude-hooks flag is provided
196
- if (options.claudeHooks) {
197
- if (options.dryRun) {
198
- console.log(chalk.dim(' Would create: .claude/settings.local.json'));
199
- console.log(chalk.dim(' Would create: .claude/buoy-context.md'));
200
- }
201
- else {
202
- // Generate condensed context file for session injection
203
- const exportService = new SkillExportService(projectName);
204
- const condensedContext = exportService.generateCondensedContext({
205
- tokens: scanResult.tokens,
206
- components: scanResult.components,
207
- drifts: diffResult.drifts,
208
- projectName,
209
- });
210
- const claudeDir = resolve(cwd, '.claude');
211
- if (!existsSync(claudeDir)) {
212
- mkdirSync(claudeDir, { recursive: true });
213
- }
214
- writeFileSync(resolve(claudeDir, 'buoy-context.md'), condensedContext);
215
- // Setup the hooks
216
- const claudeResult = setupClaudeHooks(cwd);
217
- if (claudeResult.success) {
218
- results.claudeHooksCreated = claudeResult.created;
219
- results.claudeHooksPath = claudeResult.filePath || '';
220
- // Track if hooks were already configured (for output)
221
- if (!claudeResult.created) {
222
- results.claudeHooksAlreadyConfigured = true;
223
- }
224
- }
225
- else {
226
- // Show error when hooks setup fails
227
- console.log(chalk.yellow(` ⚠ Could not setup Claude hooks: ${claudeResult.message}`));
228
- }
229
- }
230
- }
231
- // Install Claude slash commands (unless --no-commands)
232
- if (options.commands !== false) {
233
- if (options.dryRun) {
234
- const { installed } = installClaudeCommands(true);
235
- if (installed.length > 0) {
236
- console.log(chalk.dim(` Would install commands: ${installed.map(c => `/${c}`).join(', ')}`));
237
- }
238
- }
239
- else {
240
- const { installed, alreadyExisted } = installClaudeCommands(false);
241
- results.commandsInstalled = installed;
242
- results.commandsExisted = alreadyExisted;
243
- }
244
- }
245
- // Output results
246
- if (options.json) {
247
- console.log(JSON.stringify(results, null, 2));
248
- }
249
- else if (!options.dryRun) {
250
- // Celebration!
251
- console.log('');
252
- console.log(chalk.green.bold('━'.repeat(50)));
253
- console.log('');
254
- console.log(chalk.green.bold(' 🎉 AI is now part of the crew!'));
255
- console.log('');
256
- console.log(chalk.green.bold('━'.repeat(50)));
257
- console.log('');
258
- if (results.skillCreated) {
259
- console.log(` ${chalk.green('✓')} Created skill files`);
260
- console.log(chalk.dim(` ${results.skillPath}/`));
261
- }
262
- if (results.contextUpdated) {
263
- console.log(` ${chalk.green('✓')} Updated CLAUDE.md`);
264
- }
265
- if (results.claudeHooksCreated) {
266
- console.log(` ${chalk.green('✓')} Created Claude Code hooks`);
267
- console.log(chalk.dim(` ${results.claudeHooksPath}`));
268
- console.log(chalk.dim(` .claude/buoy-context.md (injected at session start)`));
269
- }
270
- else if (results.claudeHooksAlreadyConfigured) {
271
- console.log(` ${chalk.green('✓')} Claude Code hooks already configured`);
272
- console.log(chalk.dim(` Updated .claude/buoy-context.md`));
273
- }
274
- if (results.commandsInstalled.length > 0) {
275
- console.log(` ${chalk.green('✓')} Installed slash commands`);
276
- for (const cmd of results.commandsInstalled) {
277
- console.log(chalk.dim(` /${cmd}`));
278
- }
279
- }
280
- if (results.commandsExisted.length > 0) {
281
- console.log(` ${chalk.dim('○')} Commands already installed: ${results.commandsExisted.map(c => `/${c}`).join(', ')}`);
282
- }
283
- console.log('');
284
- console.log(chalk.dim(' Your AI assistant now knows:'));
285
- if (results.stats.tokens > 0) {
286
- console.log(` • ${results.stats.tokens} design tokens`);
287
- }
288
- if (results.stats.components > 0) {
289
- console.log(` • ${results.stats.components} component patterns`);
290
- }
291
- if (results.stats.patterns > 0) {
292
- console.log(` • ${results.stats.patterns} approved patterns`);
293
- }
294
- console.log('');
295
- console.log(chalk.dim(' Try asking:'));
296
- console.log(chalk.cyan(' "Build a button following our design system"'));
297
- console.log('');
298
- // Suggest Claude hooks if not set up
299
- if (!options.claudeHooks && !results.claudeHooksCreated) {
300
- console.log(chalk.dim(' Want real-time feedback in Claude Code?'));
301
- console.log(` Run: ${chalk.cyan('buoy onboard --claude-hooks')}`);
302
- console.log('');
303
- }
304
- }
305
- }
306
- catch (err) {
307
- spin.stop();
308
- const message = err instanceof Error ? err.message : String(err);
309
- errorLog(`Onboarding failed: ${message}`);
310
- process.exit(1);
311
- }
312
- });
313
- }
314
- //# sourceMappingURL=onboard.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"onboard.js","sourceRoot":"","sources":["../../src/commands/onboard.ts"],"names":[],"mappings":"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"}